<classpathentry exported="true" kind="lib" path="lib/plugin/commons-logging.jar"/>
<classpathentry exported="true" kind="lib" path="lib/spin.jar"/>
<classpathentry exported="true" kind="lib" path="lib/microba.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/looks-2.0.4.jar"/>
+ <classpathentry exported="true" kind="lib" path="lib/looks-2.2.0.jar"/>
<classpathentry exported="true" kind="lib" path="lib/PDFBox-0.7.3-dev-reduced.jar"/>
<classpathentry exported="true" kind="lib" path="lib/antlr.jar"/>
<classpathentry exported="true" kind="lib" path="lib/antlr-3.0b5.jar"/>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<project relativePaths="false" version="4">
- <component name="AntConfiguration">
- <defaultAnt bundledAnt="true" />
- <buildFile url="file://$PROJECT_DIR$/build.xml">
- <additionalClassPath />
- <antReference projectDefault="true" />
- <customJdkName value="" />
- <maximumHeapSize value="128" />
- <maximumStackSize value="32" />
- <properties />
- </buildFile>
- </component>
- <component name="BuildJarProjectSettings">
- <option name="BUILD_JARS_ON_MAKE" value="false" />
- </component>
- <component name="CodeStyleSettingsManager">
- <option name="PER_PROJECT_SETTINGS" />
- <option name="USE_PER_PROJECT_SETTINGS" value="false" />
- </component>
- <component name="CompilerConfiguration">
- <option name="DEFAULT_COMPILER" value="Javac" />
- <option name="DEPLOY_AFTER_MAKE" value="0" />
- <resourceExtensions>
- <entry name=".+\.(properties|xml|html|dtd|tld)" />
- <entry name=".+\.(gif|png|jpeg|jpg)" />
- </resourceExtensions>
- <wildcardResourcePatterns>
- <entry name="?*.properties" />
- <entry name="?*.xml" />
- <entry name="?*.gif" />
- <entry name="?*.png" />
- <entry name="?*.jpeg" />
- <entry name="?*.jpg" />
- <entry name="?*.html" />
- <entry name="?*.dtd" />
- <entry name="?*.tld" />
- <entry name="?*.ftl" />
- </wildcardResourcePatterns>
- </component>
- <component name="DependencyValidationManager">
- <option name="SKIP_IMPORT_STATEMENTS" value="false" />
- </component>
- <component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false" />
- <component name="InspectionProjectProfileManager">
- <option name="PROJECT_PROFILE" value="Project Default" />
- <option name="USE_PROJECT_LEVEL_SETTINGS" value="false" />
- <scopes />
- <profiles>
- <profile version="1.0" is_locked="false">
- <option name="myName" value="Project Default" />
- <option name="myLocal" value="false" />
- </profile>
- </profiles>
- <list size="0" />
- </component>
- <component name="JavadocGenerationManager">
- <option name="OUTPUT_DIRECTORY" />
- <option name="OPTION_SCOPE" value="protected" />
- <option name="OPTION_HIERARCHY" value="true" />
- <option name="OPTION_NAVIGATOR" value="true" />
- <option name="OPTION_INDEX" value="true" />
- <option name="OPTION_SEPARATE_INDEX" value="true" />
- <option name="OPTION_DOCUMENT_TAG_USE" value="false" />
- <option name="OPTION_DOCUMENT_TAG_AUTHOR" value="false" />
- <option name="OPTION_DOCUMENT_TAG_VERSION" value="false" />
- <option name="OPTION_DOCUMENT_TAG_DEPRECATED" value="true" />
- <option name="OPTION_DEPRECATED_LIST" value="true" />
- <option name="OTHER_OPTIONS" value="" />
- <option name="HEAP_SIZE" />
- <option name="LOCALE" />
- <option name="OPEN_IN_BROWSER" value="true" />
- </component>
- <component name="ProjectDetails">
- <option name="projectName" value="JabRef" />
- </component>
- <component name="ProjectFileVersion" converted="true" />
- <component name="ProjectModuleManager">
- <modules>
- <module fileurl="file://$PROJECT_DIR$/src/Jabref.iml" filepath="$PROJECT_DIR$/src/Jabref.iml" />
- </modules>
- </component>
- <component name="ProjectRootManager" version="2" languageLevel="JDK_1_5" assert-keyword="true" jdk-15="true" project-jdk-name="1.6" project-jdk-type="JavaSDK">
- <output url="file://$PROJECT_DIR$/out" />
- </component>
- <component name="SvnBranchConfigurationManager">
- <option name="myConfigurationMap">
- <map>
- <entry key="$PROJECT_DIR$">
- <value>
- <SvnBranchConfiguration>
- <option name="branchUrls">
- <list>
- <option value="https://jabref.svn.sourceforge.net/svnroot/jabref/branches" />
- <option value="https://jabref.svn.sourceforge.net/svnroot/jabref/tags" />
- </list>
- </option>
- <option name="trunkUrl" value="https://jabref.svn.sourceforge.net/svnroot/jabref/trunk" />
- </SvnBranchConfiguration>
- </value>
- </entry>
- </map>
- </option>
- <option name="myVersion" value="124" />
- </component>
- <component name="VcsDirectoryMappings">
- <mapping directory="" vcs="svn" />
- </component>
- <component name="masterDetails">
- <option name="states">
- <map>
- <entry key="Errors.UI">
- <value>
- <UIState>
- <option name="proportions">
- <SplitterProportionsDataImpl />
- </option>
- </UIState>
- </value>
- </entry>
- <entry key="ProjectJDKs.UI">
- <value>
- <UIState>
- <option name="proportions">
- <SplitterProportionsDataImpl>
- <option name="proportions">
- <list>
- <option value="0.2" />
- </list>
- </option>
- </SplitterProportionsDataImpl>
- </option>
- <option name="lastEditedConfigurable" value="1.6" />
- </UIState>
- </value>
- </entry>
- <entry key="ScopeChooserConfigurable.UI">
- <value>
- <UIState>
- <option name="proportions">
- <SplitterProportionsDataImpl />
- </option>
- </UIState>
- </value>
- </entry>
- </map>
- </option>
- <option name="myStates">
- <map>
- <entry key="Errors.UI">
- <value>
- <UIState>
- <option name="proportions">
- <SplitterProportionsDataImpl />
- </option>
- </UIState>
- </value>
- </entry>
- <entry key="ProjectJDKs.UI">
- <value>
- <UIState>
- <option name="proportions">
- <SplitterProportionsDataImpl>
- <option name="proportions">
- <list>
- <option value="0.2" />
- </list>
- </option>
- </SplitterProportionsDataImpl>
- </option>
- <option name="lastEditedConfigurable" value="1.6" />
- </UIState>
- </value>
- </entry>
- <entry key="ScopeChooserConfigurable.UI">
- <value>
- <UIState>
- <option name="proportions">
- <SplitterProportionsDataImpl />
- </option>
- </UIState>
- </value>
- </entry>
- </map>
- </option>
- </component>
-</project>
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<project relativePaths="false" version="4">
- <component name="ChangeListManager">
- <list default="true" readonly="true" name="Default" comment="">
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/src/txt/CHANGELOG" afterPath="$PROJECT_DIR$/src/txt/CHANGELOG" />
- <change type="MODIFICATION" beforePath="$PROJECT_DIR$/build.xml" afterPath="$PROJECT_DIR$/build.xml" />
- </list>
- <ignored path="JabRef.iws" />
- <ignored path=".idea/workspace.xml" />
- </component>
- <component name="ChangesViewManager" flattened_view="true" show_ignored="false" />
- <component name="Commander">
- <leftPanel />
- <rightPanel />
- <splitter proportion="0.5" />
- </component>
- <component name="CreatePatchCommitExecutor">
- <option name="PATCH_PATH" value="" />
- <option name="REVERSE_PATCH" value="false" />
- </component>
- <component name="DaemonCodeAnalyzer">
- <disable_hints />
- </component>
- <component name="DebuggerManager">
- <breakpoint_any>
- <breakpoint>
- <option name="NOTIFY_CAUGHT" value="true" />
- <option name="NOTIFY_UNCAUGHT" value="true" />
- <option name="ENABLED" value="false" />
- <option name="LOG_ENABLED" value="false" />
- <option name="LOG_EXPRESSION_ENABLED" value="false" />
- <option name="SUSPEND_POLICY" value="SuspendAll" />
- <option name="COUNT_FILTER_ENABLED" value="false" />
- <option name="COUNT_FILTER" value="0" />
- <option name="CONDITION_ENABLED" value="false" />
- <option name="CLASS_FILTERS_ENABLED" value="false" />
- <option name="INSTANCE_FILTERS_ENABLED" value="false" />
- <option name="CONDITION" value="" />
- <option name="LOG_MESSAGE" value="" />
- </breakpoint>
- <breakpoint>
- <option name="NOTIFY_CAUGHT" value="true" />
- <option name="NOTIFY_UNCAUGHT" value="true" />
- <option name="ENABLED" value="false" />
- <option name="LOG_ENABLED" value="false" />
- <option name="LOG_EXPRESSION_ENABLED" value="false" />
- <option name="SUSPEND_POLICY" value="SuspendAll" />
- <option name="COUNT_FILTER_ENABLED" value="false" />
- <option name="COUNT_FILTER" value="0" />
- <option name="CONDITION_ENABLED" value="false" />
- <option name="CLASS_FILTERS_ENABLED" value="false" />
- <option name="INSTANCE_FILTERS_ENABLED" value="false" />
- <option name="CONDITION" value="" />
- <option name="LOG_MESSAGE" value="" />
- </breakpoint>
- </breakpoint_any>
- <breakpoint_rules />
- <ui_properties />
- </component>
- <component name="FavoritesManager">
- <favorites_list name="JabRef" />
- </component>
- <component name="FileEditorManager">
- <leaf>
- <file leaf-file-name="PluginInstaller.java" pinned="false" current="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/src/java/net/sf/jabref/plugin/PluginInstaller.java">
- <provider selected="true" editor-type-id="text-editor">
- <state line="297" column="22" selection-start="12576" selection-end="12576" vertical-scroll-proportion="0.0">
- <folding />
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="RisImporter.java" pinned="false" current="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/src/java/net/sf/jabref/imports/RisImporter.java">
- <provider selected="true" editor-type-id="text-editor">
- <state line="158" column="39" selection-start="5957" selection-end="5957" vertical-scroll-proportion="0.0">
- <folding />
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="CHANGELOG" pinned="false" current="true" current-in-tab="true">
- <entry file="file://$PROJECT_DIR$/src/txt/CHANGELOG">
- <provider selected="true" editor-type-id="text-editor">
- <state line="27" column="13" selection-start="1676" selection-end="1676" vertical-scroll-proportion="0.6958763">
- <folding />
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="build.xml" pinned="false" current="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/build.xml">
- <provider selected="true" editor-type-id="text-editor">
- <state line="49" column="46" selection-start="2179" selection-end="2179" vertical-scroll-proportion="-12.954545">
- <folding />
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="SQLutil.java" pinned="false" current="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/src/java/net/sf/jabref/sql/SQLutil.java">
- <provider selected="true" editor-type-id="text-editor">
- <state line="1026" column="20" selection-start="36310" selection-end="36310" vertical-scroll-proportion="0.0">
- <folding />
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="JabRef.java" pinned="false" current="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/src/java/net/sf/jabref/JabRef.java">
- <provider selected="true" editor-type-id="text-editor">
- <state line="813" column="32" selection-start="34953" selection-end="34953" vertical-scroll-proportion="0.0">
- <folding />
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="JabRef_en.properties" pinned="false" current="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/src/resource/JabRef_en.properties">
- <provider selected="true" editor-type-id="text-editor">
- <state line="2114" column="0" selection-start="69411" selection-end="69411" vertical-scroll-proportion="0.0">
- <folding />
- </state>
- </provider>
- <provider editor-type-id="ResourceBundle">
- <state />
- </provider>
- </entry>
- </file>
- <file leaf-file-name="Autosave.html" pinned="false" current="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/src/help/Autosave.html">
- <provider selected="true" editor-type-id="text-editor">
- <state line="14" column="16" selection-start="770" selection-end="770" vertical-scroll-proportion="0.0">
- <folding />
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="Contents.html" pinned="false" current="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/src/help/Contents.html">
- <provider selected="true" editor-type-id="text-editor">
- <state line="29" column="49" selection-start="1140" selection-end="1140" vertical-scroll-proportion="0.0">
- <folding />
- </state>
- </provider>
- </entry>
- </file>
- <file leaf-file-name="BaseFrameHelp.html" pinned="false" current="false" current-in-tab="false">
- <entry file="file://$PROJECT_DIR$/src/help/BaseFrameHelp.html">
- <provider selected="true" editor-type-id="text-editor">
- <state line="0" column="0" selection-start="0" selection-end="4665" vertical-scroll-proportion="0.0">
- <folding />
- </state>
- </provider>
- </entry>
- </file>
- </leaf>
- </component>
- <component name="FindManager">
- <FindUsagesManager>
- <setting name="OPEN_NEW_TAB" value="false" />
- </FindUsagesManager>
- </component>
- <component name="ModuleEditorState">
- <option name="LAST_EDITED_MODULE_NAME" />
- <option name="LAST_EDITED_TAB_NAME" />
- </component>
- <component name="ProjectLevelVcsManager">
- <OptionsSetting value="true" id="Add" />
- <OptionsSetting value="true" id="Remove" />
- <OptionsSetting value="true" id="Checkout" />
- <OptionsSetting value="true" id="Update" />
- <OptionsSetting value="true" id="Status" />
- <OptionsSetting value="true" id="Edit" />
- <ConfirmationsSetting value="0" id="Add" />
- <ConfirmationsSetting value="0" id="Remove" />
- </component>
- <component name="ProjectPane">
- <subPane>
- <PATH>
- <PATH_ELEMENT>
- <option name="myItemId" value="JabRef" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- </PATH>
- <PATH>
- <PATH_ELEMENT>
- <option name="myItemId" value="JabRef" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="Jabref" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
- </PATH_ELEMENT>
- </PATH>
- <PATH>
- <PATH_ELEMENT>
- <option name="myItemId" value="JabRef" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="Jabref" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="src" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- </PATH>
- <PATH>
- <PATH_ELEMENT>
- <option name="myItemId" value="JabRef" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="Jabref" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="src" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="txt" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- </PATH>
- <PATH>
- <PATH_ELEMENT>
- <option name="myItemId" value="JabRef" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="Jabref" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewModuleNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="src" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- <PATH_ELEMENT>
- <option name="myItemId" value="help" />
- <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
- </PATH_ELEMENT>
- </PATH>
- </subPane>
- </component>
- <component name="ProjectReloadState">
- <option name="STATE" value="0" />
- </component>
- <component name="ProjectView">
- <navigator currentView="ProjectPane" proportions="0.5" version="1" splitterProportion="0.5">
- <flattenPackages />
- <showMembers />
- <showModules />
- <showLibraryContents />
- <hideEmptyPackages />
- <abbreviatePackageNames />
- <showStructure ProjectPane="false" />
- <autoscrollToSource />
- <autoscrollFromSource />
- <sortByType />
- </navigator>
- </component>
- <component name="PropertiesComponent">
- <property name="GoToFile.includeJavaFiles" value="false" />
- <property name="GoToClass.toSaveIncludeLibraries" value="false" />
- <property name="MemberChooser.sorted" value="false" />
- <property name="MemberChooser.showClasses" value="true" />
- <property name="GoToClass.includeLibraries" value="false" />
- <property name="MemberChooser.copyJavadoc" value="false" />
- </component>
- <component name="RestoreUpdateTree">
- <UpdateInfo date="6/18/09 6:26 PM" ActionInfo="_Update">
- <UpdatedFiles>
- <FILE-GROUP>
- <option name="myUpdateName" value="Updated from server" />
- <option name="myStatusName" value="Changed on server" />
- <option name="mySupportsDeletion" value="false" />
- <option name="myCanBeAbsent" value="false" />
- <option name="myId" value="CHANGED_ON_SERVER" />
- <FILE-GROUP>
- <option name="myUpdateName" value="Updated" />
- <option name="myStatusName" value="Changed" />
- <option name="mySupportsDeletion" value="false" />
- <option name="myCanBeAbsent" value="false" />
- <option name="myId" value="UPDATED" />
- <PATH vcs="svn" revision="3027">$PROJECT_DIR$/src/resource/JabRef_da.properties</PATH>
- </FILE-GROUP>
- <FILE-GROUP>
- <option name="myUpdateName" value="Created" />
- <option name="myStatusName" value="Created" />
- <option name="mySupportsDeletion" value="false" />
- <option name="myCanBeAbsent" value="false" />
- <option name="myId" value="CREATED" />
- </FILE-GROUP>
- <FILE-GROUP>
- <option name="myUpdateName" value="Deleted" />
- <option name="myStatusName" value="Deleted" />
- <option name="mySupportsDeletion" value="false" />
- <option name="myCanBeAbsent" value="true" />
- <option name="myId" value="REMOVED_FROM_REPOSITORY" />
- </FILE-GROUP>
- <FILE-GROUP>
- <option name="myUpdateName" value="Restored" />
- <option name="myStatusName" value="Will be restored" />
- <option name="mySupportsDeletion" value="false" />
- <option name="myCanBeAbsent" value="false" />
- <option name="myId" value="RESTORED" />
- </FILE-GROUP>
- </FILE-GROUP>
- <FILE-GROUP>
- <option name="myUpdateName" value="Modified" />
- <option name="myStatusName" value="Modified" />
- <option name="mySupportsDeletion" value="false" />
- <option name="myCanBeAbsent" value="false" />
- <option name="myId" value="MODIFIED" />
- </FILE-GROUP>
- <FILE-GROUP>
- <option name="myUpdateName" value="Skipped" />
- <option name="myStatusName" value="Skipped" />
- <option name="mySupportsDeletion" value="false" />
- <option name="myCanBeAbsent" value="false" />
- <option name="myId" value="SKIPPED" />
- </FILE-GROUP>
- <FILE-GROUP>
- <option name="myUpdateName" value="Merged with conflicts" />
- <option name="myStatusName" value="Will be merged with conflicts" />
- <option name="mySupportsDeletion" value="false" />
- <option name="myCanBeAbsent" value="false" />
- <option name="myId" value="MERGED_WITH_CONFLICTS" />
- </FILE-GROUP>
- <FILE-GROUP>
- <option name="myUpdateName" value="Merged" />
- <option name="myStatusName" value="Will be merged" />
- <option name="mySupportsDeletion" value="false" />
- <option name="myCanBeAbsent" value="false" />
- <option name="myId" value="MERGED" />
- </FILE-GROUP>
- <FILE-GROUP>
- <option name="myUpdateName" value="Not in repository" />
- <option name="myStatusName" value="Not in repository" />
- <option name="mySupportsDeletion" value="true" />
- <option name="myCanBeAbsent" value="false" />
- <option name="myId" value="UNKNOWN" />
- </FILE-GROUP>
- <FILE-GROUP>
- <option name="myUpdateName" value="Locally added" />
- <option name="myStatusName" value="Locally added" />
- <option name="mySupportsDeletion" value="false" />
- <option name="myCanBeAbsent" value="false" />
- <option name="myId" value="LOCALLY_ADDED" />
- </FILE-GROUP>
- <FILE-GROUP>
- <option name="myUpdateName" value="Locally removed" />
- <option name="myStatusName" value="Locally removed" />
- <option name="mySupportsDeletion" value="false" />
- <option name="myCanBeAbsent" value="false" />
- <option name="myId" value="LOCALLY_REMOVED" />
- </FILE-GROUP>
- <FILE-GROUP>
- <option name="myUpdateName" value="Switched" />
- <option name="myStatusName" value="Switched" />
- <option name="mySupportsDeletion" value="false" />
- <option name="myCanBeAbsent" value="false" />
- <option name="myId" value="SWITCHED" />
- </FILE-GROUP>
- </UpdatedFiles>
- </UpdateInfo>
- </component>
- <component name="RunManager">
- <configuration default="true" type="Remote" factoryName="Remote">
- <option name="USE_SOCKET_TRANSPORT" value="true" />
- <option name="SERVER_MODE" value="false" />
- <option name="SHMEM_ADDRESS" value="javadebug" />
- <option name="HOST" value="localhost" />
- <option name="PORT" value="5005" />
- </configuration>
- <configuration default="true" type="Applet" factoryName="Applet">
- <module name="" />
- <option name="MAIN_CLASS_NAME" />
- <option name="HTML_FILE_NAME" />
- <option name="HTML_USED" value="false" />
- <option name="WIDTH" value="400" />
- <option name="HEIGHT" value="300" />
- <option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy" />
- <option name="VM_PARAMETERS" />
- <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
- <option name="ALTERNATIVE_JRE_PATH" />
- </configuration>
- <configuration default="true" type="Application" factoryName="Application" enabled="false" merge="false" runner="emma">
- <option name="MAIN_CLASS_NAME" />
- <option name="VM_PARAMETERS" />
- <option name="PROGRAM_PARAMETERS" />
- <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
- <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
- <option name="ALTERNATIVE_JRE_PATH" />
- <option name="ENABLE_SWING_INSPECTOR" value="false" />
- <option name="ENV_VARIABLES" />
- <option name="PASS_PARENT_ENVS" value="true" />
- <module name="" />
- <envs />
- </configuration>
- <configuration default="true" type="JUnit" factoryName="JUnit" enabled="false" merge="false" runner="emma">
- <module name="" />
- <option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
- <option name="ALTERNATIVE_JRE_PATH" />
- <option name="PACKAGE_NAME" />
- <option name="MAIN_CLASS_NAME" />
- <option name="METHOD_NAME" />
- <option name="TEST_OBJECT" value="class" />
- <option name="VM_PARAMETERS" />
- <option name="PARAMETERS" />
- <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
- <option name="ENV_VARIABLES" />
- <option name="PASS_PARENT_ENVS" value="true" />
- <option name="ADDITIONAL_CLASS_PATH" />
- <option name="TEST_SEARCH_SCOPE">
- <value defaultName="moduleWithDependencies" />
- </option>
- <envs />
- </configuration>
- <list size="0" />
- <configuration name="<template>" type="WebApp" default="true" selected="false">
- <Host>localhost</Host>
- <Port>5050</Port>
- </configuration>
- </component>
- <component name="ShelveChangesManager" show_recycled="false" />
- <component name="StructureViewFactory">
- <option name="AUTOSCROLL_MODE" value="true" />
- <option name="AUTOSCROLL_FROM_SOURCE" value="false" />
- <option name="ACTIVE_ACTIONS" value="" />
- </component>
- <component name="SvnConfiguration">
- <option name="USER" value="" />
- <option name="PASSWORD" value="" />
- <option name="LAST_MERGED_REVISION" />
- <option name="UPDATE_RUN_STATUS" value="false" />
- <option name="MERGE_DRY_RUN" value="false" />
- <option name="MERGE_DIFF_USE_ANCESTRY" value="true" />
- <option name="UPDATE_LOCK_ON_DEMAND" value="false" />
- <configuration useDefault="true">/home/alver/.subversion</configuration>
- <myIsUseDefaultProxy>false</myIsUseDefaultProxy>
- </component>
- <component name="TodoView" selected-index="0">
- <todo-panel id="selected-file">
- <are-packages-shown value="false" />
- <are-modules-shown value="false" />
- <flatten-packages value="false" />
- <is-autoscroll-to-source value="true" />
- </todo-panel>
- <todo-panel id="all">
- <are-packages-shown value="true" />
- <are-modules-shown value="false" />
- <flatten-packages value="false" />
- <is-autoscroll-to-source value="true" />
- </todo-panel>
- <todo-panel id="default-changelist">
- <are-packages-shown value="false" />
- <are-modules-shown value="false" />
- <flatten-packages value="false" />
- <is-autoscroll-to-source value="false" />
- </todo-panel>
- </component>
- <component name="ToolWindowManager">
- <frame x="-5" y="25" width="1290" height="979" extended-state="6" />
- <editor active="true" />
- <layout>
- <window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.2180723" sideWeight="0.0" order="7" side_tool="false" />
- <window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" />
- <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.120227456" sideWeight="0.773494" order="1" side_tool="false" />
- <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32969698" sideWeight="0.5" order="1" side_tool="false" />
- <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="3" side_tool="false" />
- <window_info id="Dataflow to this" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" />
- <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.3253012" sideWeight="0.5" order="7" side_tool="false" />
- <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32650602" sideWeight="0.5" order="7" side_tool="false" />
- <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" />
- <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.24979524" sideWeight="0.66424245" order="1" side_tool="false" />
- <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" />
- <window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" />
- <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.25426483" sideWeight="0.773494" order="0" side_tool="false" />
- <window_info id="Dependency Viewer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" />
- <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" />
- <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="false" />
- <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" />
- <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" />
- <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="2" side_tool="false" />
- </layout>
- </component>
- <component name="VcsManagerConfiguration">
- <option name="OFFER_MOVE_TO_ANOTHER_CHANGELIST_ON_PARTIAL_COMMIT" value="true" />
- <option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="true" />
- <option name="PERFORM_UPDATE_IN_BACKGROUND" value="false" />
- <option name="PERFORM_COMMIT_IN_BACKGROUND" value="false" />
- <option name="PERFORM_EDIT_IN_BACKGROUND" value="true" />
- <option name="PERFORM_CHECKOUT_IN_BACKGROUND" value="true" />
- <option name="PERFORM_ADD_REMOVE_IN_BACKGROUND" value="true" />
- <option name="FORCE_NON_EMPTY_COMMENT" value="false" />
- <option name="LAST_COMMIT_MESSAGE" value="Added quoting of some special characters in SQL export." />
- <option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="false" />
- <option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="false" />
- <option name="REFORMAT_BEFORE_FILE_COMMIT" value="false" />
- <option name="FILE_HISTORY_DIALOG_COMMENTS_SPLITTER_PROPORTION" value="0.8" />
- <option name="FILE_HISTORY_DIALOG_SPLITTER_PROPORTION" value="0.5" />
- <option name="ACTIVE_VCS_NAME" />
- <option name="UPDATE_GROUP_BY_PACKAGES" value="false" />
- <option name="UPDATE_GROUP_BY_CHANGELIST" value="false" />
- <option name="SHOW_FILE_HISTORY_AS_TREE" value="false" />
- <option name="FILE_HISTORY_SPLITTER_PROPORTION" value="0.6" />
- <MESSAGE value="Added help file for autosave feature. Added help button for autosave in the Preferences dialog." />
- <MESSAGE value="Fixed bug in startup that could show warnings multiple times when loading from autosave files." />
- <MESSAGE value="Added support for conditional blocks with multiple fields in export layouts. Such blocks need all fields to be present in order to give output." />
- <MESSAGE value="Added documentation for multiple-field conditional blocks. Reorganized custom exports help file." />
- <MESSAGE value="Fixed bug in installing a plugin directly from remote URL." />
- <MESSAGE value="Changed RIS import so multiple abstract fields in an entry are concatenated." />
- <MESSAGE value="Added quoting of some special characters in SQL export." />
- </component>
- <component name="XDebuggerManager">
- <breakpoint-manager />
- </component>
- <component name="antWorkspaceConfiguration">
- <option name="IS_AUTOSCROLL_TO_SOURCE" value="false" />
- <option name="FILTER_TARGETS" value="false" />
- <buildFile url="file://$PROJECT_DIR$/build.xml">
- <antCommandLine value="" />
- <runInBackground value="true" />
- <targetFilters />
- <treeView value="true" />
- <verbose value="true" />
- <viewClosedWhenNoErrors value="false" />
- </buildFile>
- </component>
- <component name="editorHistoryManager">
- <entry file="file://$PROJECT_DIR$/src/help/CustomExports.html">
- <provider selected="true" editor-type-id="text-editor">
- <state line="191" column="33" selection-start="8328" selection-end="8328" vertical-scroll-proportion="0.0">
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/java/net/sf/jabref/external/PushToApplicationButton.java">
- <provider selected="true" editor-type-id="text-editor">
- <state line="92" column="30" selection-start="3703" selection-end="3703" vertical-scroll-proportion="0.0">
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/java/net/sf/jabref/export/layout/LayoutEntry.java">
- <provider selected="true" editor-type-id="text-editor">
- <state line="166" column="14" selection-start="5364" selection-end="5364" vertical-scroll-proportion="0.0">
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/txt/TODO">
- <provider selected="true" editor-type-id="text-editor">
- <state line="14" column="33" selection-start="466" selection-end="466" vertical-scroll-proportion="0.0">
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/java/net/sf/jabref/plugin/ManagePluginsDialog.java">
- <provider selected="true" editor-type-id="text-editor">
- <state line="231" column="12" selection-start="9064" selection-end="9064" vertical-scroll-proportion="0.0">
- <folding>
- <marker date="1245172555000" expanded="true" signature="8124:8157" placeholder="{...}" />
- </folding>
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/java/net/sf/jabref/net/URLDownload.java">
- <provider selected="true" editor-type-id="text-editor">
- <state line="55" column="16" selection-start="1397" selection-end="1397" vertical-scroll-proportion="0.0">
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/java/net/sf/jabref/plugin/PluginInstaller.java">
- <provider selected="true" editor-type-id="text-editor">
- <state line="297" column="22" selection-start="12576" selection-end="12576" vertical-scroll-proportion="0.0">
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/java/net/sf/jabref/imports/RisImporter.java">
- <provider selected="true" editor-type-id="text-editor">
- <state line="158" column="39" selection-start="5957" selection-end="5957" vertical-scroll-proportion="0.0">
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/java/net/sf/jabref/JabRef.java">
- <provider selected="true" editor-type-id="text-editor">
- <state line="813" column="32" selection-start="34953" selection-end="34953" vertical-scroll-proportion="0.0">
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/resource/JabRef_en.properties">
- <provider selected="true" editor-type-id="text-editor">
- <state line="2114" column="0" selection-start="69411" selection-end="69411" vertical-scroll-proportion="0.0">
- <folding />
- </state>
- </provider>
- <provider editor-type-id="ResourceBundle">
- <state />
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/help/Autosave.html">
- <provider selected="true" editor-type-id="text-editor">
- <state line="14" column="16" selection-start="770" selection-end="770" vertical-scroll-proportion="0.0">
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/help/Contents.html">
- <provider selected="true" editor-type-id="text-editor">
- <state line="29" column="49" selection-start="1140" selection-end="1140" vertical-scroll-proportion="0.0">
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/help/BaseFrameHelp.html">
- <provider selected="true" editor-type-id="text-editor">
- <state line="0" column="0" selection-start="0" selection-end="4665" vertical-scroll-proportion="-0.0">
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/java/net/sf/jabref/sql/SQLutil.java">
- <provider selected="true" editor-type-id="text-editor">
- <state line="1026" column="20" selection-start="36310" selection-end="36310" vertical-scroll-proportion="0.0">
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/build.xml">
- <provider selected="true" editor-type-id="text-editor">
- <state line="49" column="46" selection-start="2179" selection-end="2179" vertical-scroll-proportion="-12.954545">
- <folding />
- </state>
- </provider>
- </entry>
- <entry file="file://$PROJECT_DIR$/src/txt/CHANGELOG">
- <provider selected="true" editor-type-id="text-editor">
- <state line="27" column="13" selection-start="1676" selection-end="1676" vertical-scroll-proportion="0.6958763">
- <folding />
- </state>
- </provider>
- </entry>
- </component>
-</project>
-
#Build Number for ANT. Do not edit!
-#Mon Jun 22 19:37:12 CEST 2009
-build.number=67
+#Sun Nov 01 16:45:05 CET 2009
+build.number=40
Compiler: Ant
Authors: Joerg K. Wegner, wegnerj@informatik.uni-tuebingen.de
Morten O. Alver
- Version: $Revision: 2997 $
- $Date: 2009-05-11 17:55:23 +0200 (Mon, 11 May 2009) $
+ Version: $Revision: 3131 $
+ $Date: 2009-11-01 15:46:02 +0100 (Sun, 01 Nov 2009) $
$Author: mortenalver $
modified:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
<!-- some version information -->
- <property name="jabref.version" value="2.5" />
+ <property name="jabref.version" value="2.6b2" />
<property name="jabref.placeholder.version" value="@version@" />
<!-- used by replace task -->
<!-- Compiles project excluding tests -->
<target name="compile" depends="generate">
<mkdir dir="${build.classes}" />
- <javac debug="off" deprecation="on" destdir="${build.classes}" source="1.5" target="1.5">
+ <javac debug="on" deprecation="on" destdir="${build.classes}" source="1.5" target="1.5">
<src path="${java.dir}" />
<exclude name="tests/**" />
<exclude name="**/JabRefMain.java" />
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<module relativePaths="true" type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$">
- <sourceFolder url="file://$MODULE_DIR$/java" isTestSource="false" />
- </content>
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/plugin/velocity-dep-1.5.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/plugin/jpf-boot.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/plugin/JPFCodeGenerator.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/plugin/commons-logging.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/plugin/jpf.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/plugin/JPFCodeGenerator-rt.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/glazedlists-1.7.0_java15.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/langproper.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/PDFBox-0.7.3-dev-reduced.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/antlr-3.0b5.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/ccl.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/javancss.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/jaxen-core-1.0-fcs.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/microba.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/jdom-1.0b8.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/forms-1.1.0.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/saxpath-1.0-fcs.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/antlr.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/EndNote.zip!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/log4j-1.2.9.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/jalopy-1.0b10.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/jarbundler-1.4.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/substance-4.1.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/vizant.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/spin.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/mysql-connector-java-5.0.7-bin.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/jalopy-ant-0.6.1.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/sax-2.0.1.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/junit.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/log4j-1.2.6.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/oro-2.0.6.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/aelfred-1.2.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/jaxp-1.2.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/looks-2.2.0.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/JempBox-0.2.0.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- <orderEntry type="module-library">
- <library>
- <CLASSES>
- <root url="jar://$MODULE_DIR$/../lib/pmd-2.0.jar!/" />
- </CLASSES>
- <JAVADOC />
- <SOURCES />
- </library>
- </orderEntry>
- </component>
-</module>
-
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<module relativePaths="true" type="JAVA_MODULE" version="4">
+ <component name="NewModuleRootManager" inherit-compiler-output="true">
+ <exclude-output />
+ <content url="file://$MODULE_DIR$">
+ <sourceFolder url="file://$MODULE_DIR$/java" isTestSource="false" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../lib/plugin/velocity-dep-1.5.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../lib/plugin/jpf.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../lib/plugin/JPFCodeGenerator-rt.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../lib/plugin/commons-logging.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../lib/plugin/jpf-boot.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../lib/plugin/JPFCodeGenerator.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../lib/substance-4.1.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../lib/microba.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../lib/JempBox-0.2.0.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../lib/forms-1.1.0.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../lib/spin.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../lib/antlr.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../lib/glazedlists-1.7.0_java15.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../lib/PDFBox-0.7.3-dev-reduced.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../lib/antlr-3.0b5.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../lib/looks-2.2.0.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$MODULE_DIR$/../lib/mysql-connector-java-5.0.7-bin.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ </component>
+</module>
+
Joerg K. Wegner,
Michael Wrighton,
Egon Willighagen,
+ Wenbo Yang,
Jörg Zieren</p>
<h2>Contributions from:</h2>
keys.</li>
<li>The table is sorted according to a set of fields of
- your choosing. The default sort order is set up in
+ your choosing. The default sort order can be set up in
<strong>Preferences -> Entry table</strong>, but to
- quickly change the order, click the header of a column to
+ more quickly change the order, click the header of a column to
set it as the primary sort criterion, or reverse the
sorting if it is already set. Another click will deselect
the column as sorting criterion. Hold down <b>CONTROL</b>
and click a column to add, reverse or remove it as a
sub-criterion after the primary column. You can add an
- arbitrary number of sub-criteria.</li>
+ arbitrary number of sub-criteria, but only three levels
+ will be stored for the next time you start JabRef.</li>
<li>Adjust the width of each column by dragging the borders
between their headers.</li>
- <li>In the <strong>Preferences</strong> dialog, toggle
- whether the table should be resized to fit the window.
- Enable this to ensure visibility of the whole table, and
- disable it to make room for displaying more
- information.</li>
-
<li>
Color codes can be toggled in the
<strong>Preferences</strong> dialog, and they help you
types.</p>
<p>When a new entry is added, by default an
- <a href="EntryEditorHelp.html">editor dialog</a> for the entry
+ <a href="EntryEditorHelp.html">entry editor</a> for the entry
will be opened. This behaviour can be toggled in the
<strong>Preferences</strong> dialog.</p>
<h2>Editing an entry</h2>
<p>To open an
- <a href="EntryEditorHelp.html">editor dialog</a> for an
+ <a href="EntryEditorHelp.html">entry editor</a> for an
existing entry, simply double-click anywhere on the appropriate
- line will open the <a href="EntryEditorHelp.html">editor
- dialog</a> (or select the entry and press ENTER).</p>
+ line will open the <a href="EntryEditorHelp.html">entry editor</a>
+ (or select the entry and press ENTER).</p>
<h2>Referencing a <em>bibtex</em> string in a field</h2>
<code>\format[CurrentDate]{yyyy.MM.dd}</code> will give the
date only, e.g. 2005.11.30.</li>
+ <li><code>Default</code> : takes a single argument, which serves as a default value.
+ If the string to format is non-empty, it is output without changes. If it is empty,
+ the default value is output. For instance, <code>\format[Default(unknown)]{\year}</code>
+ will output the entry's year if set, and "unknown" if no year is set.</li>
+
<li><code>FileLink(filetype)</code> : if no argument is given, this formatter outputs
the first external file link encoded in the field. To work, the formatter must
be supplied with the contents of the "file" field.
<p>You can fully customize which fields should be regarded as
required and optional for each type of entry, and which fields
- appear in the General fields tab. See
+ appear in the General fields tabs. See
<a href="CustomEntriesHelp.html">Customizing entry types</a>
for more information about this.</p>
unknown to JabRef, these will be visible in the source
panel.</p>
- <p><strong>Tip:</strong> the <i>pdf</i> and <i>url</i> fields
- support Drag and Drop operations. You can drop there an url
- from your browser. either a link to a pdf file (that JabRef can
- download for you) or you can keep the link.</p>
-
<h2>Field consistency checking</h2>
<p>When the contents of a field
is changed, JabRef checks if the new contents are acceptable.
For field types that are used by <em>bibtex</em>, the contents
are checked with respect to the use of the '#' character. The
- hash symbol is <em>only</em> to be used in pairs, wrapping the
+ hash symbol is <em>only</em> to be used in pairs (except in escaped
+ form, '\#'), wrapping the
name of a <em>bibtex</em> string that is referenced. Note that
JabRef does not check if the referenced string actually exists
(this is not trivial, since the <em>bibtex</em> style you use
<h1>Revision history</h1>
+ <h3>Version 2.6beta 2</h3>
+ <ul>
+ <li>Added export formatter "Default" which takes a single argument. Outputs the string to format
+ unchanged if it is non-empty, otherwise outputs the argument.</li>
+ <li>Added option under Options -> Preferences -> General for disabling the strict enforcing of
+ correct BibTeX keys. Disabling this makes it possible to use e.g. umlaut characters in keys.</li>
+ <li>Modified launcher script for Windows installer to give higher heap size limit.</li>
+ <li>Improved autocompletion. All fields with autocompletion which have content selectors will now
+ autocomplete on content selector values. For the "journal" field, the autocompleter will now
+ additionally use entries from the current journal abbreviations list, and will also complete
+ on the entire field up to the cursor rather than just looking at the last word only.</li>
+ <li>Added support for postformatter in Layout. The postformatter will be run after
+ the formatters called from a layout.</li>
+ <li>Improved group autogeneration. Added option to generate groups based on author or editor
+ last names. Autogenerated groups are now alphabetized.</li>
+ <li>Modified Endnote export filter so "--" gets converted to "-" in the "pages" field.</li>
+ <li>Changed keyword groups so they will match on whole words only. E.g. a keyword group for the
+ keyword "can" will no longer match the keyword "scanner".</li>
+ <li>Improved entry type determination and author parsing for some varieties of CSA files.</li>
+ <li>Minor change to Harvard RTF export. Added space after "ed.", and added editor to output for
+ inbook entries.</li>
+ <li>Set limit to the number of displayed characters in group names in groups tree in order to
+ avoid group panel width problems.</li>
+ <li>Changed file link handling so all remote links classified as URL can be opened through
+ the browser. Setting a different file type manually makes JabRef call a remote link using
+ the handler application instead.</li>
+ <li>Modified Endnote/refer import filter to strip "doi:" from the %R field.</li>
+ <li>Modified HTML conversion so single newline is displayed in the preview (and HTML exports) as
+ <br>, while multiple newlines are displayed as <p>.
+ <li>Fixed bug: switching entry editor between entries of different type may result in switching
+ of entry editor tabs.</li>
+ <li>Fixed bug: adding external file link leads to relative path from root directory if file
+ directory is set to an empty string.</li>
+ <li>Fixed error message when a # in a BibTeX string prevents saving. No longer states that the
+ problem is in an entry, but specifies that it is in a string.</li>
+ <li>Fixed bug: ODS export doesn't resolve BibTeX strings.</li>
+ <li>Fixed bug: content selector for "editor" field uses "," instead of " and " as delimiter.</li>
+ <li>Fixed bug: editing source doesn't allow change of entry type.</li>
+ <li>RTFChars formatter now converts --- to \emdash and -- to \endash.</li>
+ </ul>
+
+ <h3>Version 2.6beta</h3>
+
+ <ul>
+ <li>Added pages information to several entry types in Endnote export.</li>
+ <li>Modified LastPage formatter so it returns the number when only the number of pages is given.</li>
+ <li>Modified search algorithms so LaTeX commands are removed before search. For instance, this
+ means that the value "test \textit{case}" now matches the search string "test case".</li>
+ <li>Changed default table font family to "SansSerif".</li>
+ <li>Can now create lock file while writing a bib file. The lock file is checked before
+ saving, and before scanning an externally changed file, in order to avoid reading an
+ unfinished file.</li>
+ <li>Added support for dragging a file link from the file column to another application.</li>
+ <li>Added toolbar button and shortcut (Alt-F) in entry editor for autosetting file links.</li>
+ <li>Improved ISI import filter so DOI information is included.</li>
+ <li>Fixed bug: metadata changes would not be detected as external changes to a database.</li>
+ <li>Fixed bug: when accepting external changes and not saving before new changes are
+ detected, the previously accepted changes would also be listed.</li>
+ <li>Fixed bug in Scifinder import where an empty Inventor field could overwrite the
+ author field.</li>
+ <li>Fixed bug in autocompleter. Current suggested completion would be added to the field
+ if the user closed the entry editor or mouse clicked on another field.</li>
+ <li>Fixed problem with exporting to some MySql versions. Patch by François Dorin.</li>
+ <li>Fixed bug in handling of LaTeX character sequences - now sequences with = as command
+ character (e.g. "\={A}") are recognized.</li>
+ <li>Fixed bug: gray out / hide setting in groups panel is overridden on startup
+ by search mode selection. Added separate prefs key for the groups setting.
+ Fix suggested by Igor L. Chernyavsky.</li>
+ <li>Fixed bug: cookie manager installed by Download button in file field editor throws
+ an exception when trying to fetch from Medline.</li>
+ <li>Fixed bug: temporary files don't get deleted on shutdown.</li>
+ <li>Disabled table column reordering in import inspection window, since a user reported
+ problems when using this.</li>
+ <li>Changed years from 2008 to 2009 in splash image.</li>
+ </ul>
+ <h3>Version 2.5 (June 22nd, 2009)</h3>
+ <ul>
+ <li>Modified export layout procedure so missing formatters can be reported in the error
+ output. Export now succeeds with warnings added where formatters are missing.</li>
+ <li>Conditional blocks (\begin{field}...\end{field}) in layout files can now be given a
+ semicolon-separated list of fields as argument. All fields must then be set for output
+ to be given.</li>
+ <li>Changed RIS import so multiple abstract fields in an entry are concatenated.</li>
+ <li>Added quoting of some special characters in SQL export, based on Kyle Crabtree's patch.</li>
+ <li>Fixed bug in MS Office 2007 XML export - editor names missing.</li>
+ <li>Fixed bug in plugin manager that prevented the "Download plugin" button from working.</li>
+ <li>Fixed bug in plugin manager routine that checks for installed versions of a plugin.</li>
+ <li>Fixed bug in startup that could show warnings multiple times when loading
+ from autosave files.</li>
+ </ul>
+ <h3>Version 2.5beta 2 (May 19th, 2009)</h3>
+ <ul>
+ <li>Plugin manager now handles plugin versions correctly based on the version number in their
+ plugin.xml file.</li>
+ <li>Added formatter "Number" that outputs a sequence number for the current entry in the current
+ export operation. This formatter can be used to produce a numbered list of entries.</li>
+ <li>Added autosave feature.</li>
+ <li>Fixed bug in file link handling in BibTeXML export.</li>
+ <li>Improved handling of patents in Scifinder import.</li>
+ </ul>
+
<h3>Version 2.5beta (April 21st, 2009)</h3>
<ul>
<li> Added simple plugin manager.</li>
<li> Added ~/.jabref/plugins as user-specific plugin directory.</li>
<li> Added \r marker to WrapFileLinks formatter that outputs file links without expanding relative links.</li>
- <li> Added [authorAlpha] key marker that formats authors according to the "alpha" BibTeX style. Patch submitted by Oliver Kopp.</li>
+ <li> Added [authorsAlpha] key marker that formats authors according to the "alpha" BibTeX style. Patch submitted by Oliver Kopp.</li>
<li> Table sort order set by clicking and Ctrl-clicking table columns is now immediately set as default sort order in preferences.</li>
<li> Changed LyX pipe setting so it works whether ".in" is included or omitted.</li>
<li> Modified ISI importer so the words "of", "and" and "the" will not be capitalized in the title, journal or publisher fields.</li>
<li>Fixed bug 2157664: Current edit is now treated as an undoable edit in itself.</li>
</ul>
-
<h3>Version 2.4.1 (October 8th, 2008)</h3>
<ul>
Joerg K. Wegner,
Michael Wrighton,
Egon Willighagen,
+ Wenbo Yang,
Jörg Zieren</p>
<h2>Bidrag fra:</h2>
Joerg K. Wegner,
Michael Wrighton,
Egon Willighagen,
+ Wenbo Yang,
Jörg Zieren</p>
<h2>Beiträge von:</h2>
Joerg K. Wegner,
Michael Wrighton,
Egon Willighagen,
+ Wenbo Yang,
Jörg Zieren</p>
<h2>Contributions de :</h2>
flèches du clavier.</li>
<li>Le tableau est trié selon une série de
- champs de votre choix. L'ordre de tri par défaut est
+ champs de votre choix. L'ordre de tri par défaut peut être
configuré dans <strong>Options ->
Préférences -> Table des
- entrées</strong> mais pour changer rapidement cet
+ entrées</strong> mais pour changer plus rapidement cet
ordre, cliquez l'entête d'une colonne pour la
définir comme critère de tri principal, ou
inverser l'ordre du tri s'il est déjà
enfoncée et cliquez sur un autre entête de
colonne pour l'ajouter, l'inverser ou l'enlever comme
critère de tri auxiliaire. Vous pouvez ajouter un
- nombre arbitraire de critères auxiliaires.</li>
+ nombre arbitraire de critères auxiliaires, mais uniquement
+ trois niveaux seront mémorisés pour
+ le démarrage suivant de JabRef.</li>
<li>Vous pouvez ajuster la largeur des colonnes en faisant
glisser les limites entre les entêtes.</li>
- <li>Dans la fenêtre de dialogue
- <strong>Préférences</strong>, choisissez si
- le tableau doit être redimensionné pour
- s'ajuster à la fenêtre. Sélectionnez
- cette option pour toujours voir l'ensemble du tableau, et
- désélectionnez là pour permettre
- l'affichage de plus d'informations.</li>
-
<li>
Les codes de couleurs vous aident à visualiser
l'état de votre base de données. Les
les types les plus courants.</p>
<p>Lorsqu'une nouvelle entrée est ajoutée, par
- défaut, une <a href="EntryEditorHelp.html">fenêtre
- d'édition</a> s'ouvre. Ce comportement peut être
+ défaut, l'<a href="EntryEditorHelp.html">éditeur
+ d'entrées</a> s'ouvre. Ce comportement peut être
modifié dans la fenêtre de dialogue
<strong>Préférences</strong>.</p>
<h2>Editer une entrée</h2>
- <p>Pour ouvrir la
- <a href="EntryEditorHelp.html">fenêtre
- d'édition</a> sur une entrée existante,
+ <p>Pour ouvrir l'<a href="EntryEditorHelp.html">éditeur
+ d'entrées</a> sur une entrée existante,
double-cliquez simplement sur la ligne correspondant à
l'entrée (ou appuyez sur ENTREE après avoir
- sélectionner l'entrée).</p>
+ sélectionné l'entrée).</p>
<h2>Référencer une chaîne <em>BibTeX</em>
dans un champ</h2>
date peut-être adapté. Par exemple,
<code>\format[CurrentDate]{yyyy.MM.dd}</code> renverra
uniquement la date, comme par exemple 2005.11.30.</li>
+
+ <li><code>Default</code> : prend un seul argument, qui sert comme
+ valeur par défaut. Si la chaîne à formatter
+ n'est pas vide, elle est renvoyée sans changement.
+ Si elle est vide, la valeur par défaut est renvoyée.
+ Par exemple,
+ <code>\format[Default(unknown)]{\year}</code>
+ renverra l'année de l'entrée si elle existe,
+ et "unknown" si l'année n'est pas précisée.</li>
<li><code>FileLink(TypeDeFichier)</code> : sans argument, ce formateur renvoie
le premier lien apparaissant dans le champ. Pour fonctionner, ce formateur doit
d'utiliser les quatre autres onglets, vous devez cocher cette
option.</p>
- <p><strong>Astuce :</strong> Si votre base contient des
- champs que JabRef ne connaît pas, ils seront visibles
- dans l'onglet <em>Source BibTeX</em>.</p>
-
<p><strong>Astuce :</strong> les champs <i>pdf</i> et
<i>url</i> supportent les opérations de
Glisser-Déplacer. Vous pouvez faire glisser une url
Pour les champs qui sont utilisés par <em>BibTeX</em>,
le contenu est vérifié par rapport à
l'utilisation du caractére '#'. Le symbole dièse
- doit <em>toujours</em> être utilisé par paires,
+ doit <em>toujours</em> être utilisé par paires
+ (excepté pour la forme d'échappement '\#'),
encadrant le nom d'une chaîne <em>BibTeX</em> existante.
Notez que JabRef ne vérifie pas si la chaîne
<em>BibTeX</em> est vraiment définie (ce n'est pas
<h1>Historique des révisions (en anglais)</h1>
+ <h3>Version 2.6beta</h3>
+
+ <ul>
+ <li>Added pages information to several entry types in Endnote export.</li>
+ <li>Modified LastPage formatter so it returns the number when only the number of pages is given.</li>
+ <li>Modified search algorithms so LaTeX commands are removed before search. For instance, this
+ means that the value "test \textit{case}" now matches the search string "test case".</li>
+ <li>Changed default table font family to "SansSerif".</li>
+ <li>Can now create lock file while writing a bib file. The lock file is checked before
+ saving, and before scanning an externally changed file, in order to avoid reading an
+ unfinished file.</li>
+ <li>Added support for dragging a file link from the file column to another application.</li>
+ <li>Added toolbar button and shortcut (Alt-F) in entry editor for autosetting file links.</li>
+ <li>Improved ISI import filter so DOI information is included.</li>
+ <li>Fixed bug: metadata changes would not be detected as external changes to a database.</li>
+ <li>Fixed bug: when accepting external changes and not saving before new changes are
+ detected, the previously accepted changes would also be listed.</li>
+ <li>Fixed bug in Scifinder import where an empty Inventor field could overwrite the
+ author field.</li>
+ <li>Fixed bug in autocompleter. Current suggested completion would be added to the field
+ if the user closed the entry editor or mouse clicked on another field.</li>
+ <li>Fixed problem with exporting to some MySql versions. Patch by François Dorin.</li>
+ <li>Fixed bug in handling of LaTeX character sequences - now sequences with = as command
+ character (e.g. "\={A}") are recognized.</li>
+ <li>Fixed bug: gray out / hide setting in groups panel is overridden on startup
+ by search mode selection. Added separate prefs key for the groups setting.
+ Fix suggested by Igor L. Chernyavsky.</li>
+ <li>Fixed bug: cookie manager installed by Download button in file field editor throws
+ an exception when trying to fetch from Medline.</li>
+ <li>Fixed bug: temporary files don't get deleted on shutdown.</li>
+ <li>Disabled table column reordering in import inspection window, since a user reported
+ problems when using this.</li>
+ <li>Changed years from 2008 to 2009 in splash image.</li>
+ </ul>
+ <h3>Version 2.5 (June 22nd, 2009)</h3>
+ <ul>
+ <li>Modified export layout procedure so missing formatters can be reported in the error
+ output. Export now succeeds with warnings added where formatters are missing.</li>
+ <li>Conditional blocks (\begin{field}...\end{field}) in layout files can now be given a
+ semicolon-separated list of fields as argument. All fields must then be set for output
+ to be given.</li>
+ <li>Changed RIS import so multiple abstract fields in an entry are concatenated.</li>
+ <li>Added quoting of some special characters in SQL export, based on Kyle Crabtree's patch.</li>
+ <li>Fixed bug in MS Office 2007 XML export - editor names missing.</li>
+ <li>Fixed bug in plugin manager that prevented the "Download plugin" button from working.</li>
+ <li>Fixed bug in plugin manager routine that checks for installed versions of a plugin.</li>
+ <li>Fixed bug in startup that could show warnings multiple times when loading
+ from autosave files.</li>
+ </ul>
+ <h3>Version 2.5beta 2 (May 19th, 2009)</h3>
+ <ul>
+ <li>Plugin manager now handles plugin versions correctly based on the version number in their
+ plugin.xml file.</li>
+ <li>Added formatter "Number" that outputs a sequence number for the current entry in the current
+ export operation. This formatter can be used to produce a numbered list of entries.</li>
+ <li>Added autosave feature.</li>
+ <li>Fixed bug in file link handling in BibTeXML export.</li>
+ <li>Improved handling of patents in Scifinder import.</li>
+ </ul>
<h3>Version 2.5beta (April 21st, 2009)</h3>
<li> Added simple plugin manager.</li>
<li> Added ~/.jabref/plugins as user-specific plugin directory.</li>
<li> Added \r marker to WrapFileLinks formatter that outputs file links without expanding relative links.</li>
- <li> Added [authorAlpha] key marker that formats authors according to the "alpha" BibTeX style. Patch submitted by Oliver Kopp.</li>
+ <li> Added [authorsAlpha] key marker that formats authors according to the "alpha" BibTeX style. Patch submitted by Oliver Kopp.</li>
<li> Table sort order set by clicking and Ctrl-clicking table columns is now immediately set as default sort order in preferences.</li>
<li> Changed LyX pipe setting so it works whether ".in" is included or omitted.</li>
<li> Modified ISI importer so the words "of", "and" and "the" will not be capitalized in the title, journal or publisher fields.</li>
<li>Fixed bug 2157664: Current edit is now treated as an undoable edit in itself.</li>
</ul>
-
<h3>Version 2.4.1 (October 8th, 2008)</h3>
<ul>
</body>
-</html>
+</html>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:export-ydpi="90.000000"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-filename="/home/alver/jabref-2.1b/src/images/splash-2.1beta.png"
+ sodipodi:docname="splash-2.1.svg"
+ sodipodi:docbase="/home/alver/jabref_newcvs/jabref/src/images"
+ inkscape:version="0.44"
+ sodipodi:version="0.32"
+ id="svg2138"
+ height="1052.3622047"
+ width="744.09448819">
+ <defs
+ id="defs2140">
+ <pattern
+ patternTransform="translate(316.0000,1046.362)"
+ id="pattern9054"
+ xlink:href="#pattern9048"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient5361"
+ inkscape:collect="always">
+ <stop
+ id="stop5363"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop5365"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <marker
+ style="overflow:visible;"
+ id="Arrow2Send"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow2Send">
+ <path
+ transform="scale(0.3) rotate(180) translate(-5,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ id="path3046"
+ sodipodi:nodetypes="cccc" />
+ </marker>
+ <linearGradient
+ gradientUnits="userSpaceOnUse"
+ y2="300.91277"
+ x2="491.20592"
+ y1="300.91277"
+ x1="445.01770"
+ id="linearGradient5367"
+ xlink:href="#linearGradient5361"
+ inkscape:collect="always" />
+ <pattern
+ id="pattern9048"
+ patternTransform="translate(231.0000,284.3622)"
+ height="428.00000"
+ width="572.00000"
+ patternUnits="userSpaceOnUse">
+ <image
+ transform="translate(-231.0000,-284.3622)"
+ style="opacity:1.0000000;stroke:#000000;stroke-width:5.0000000;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
+ inkscape:export-ydpi="90.000000"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-filename="/home/alver/Desktop/bilder/jabref/splash4.png"
+ y="284.36218"
+ x="231.00000"
+ xlink:href="behandlet.png"
+ sodipodi:absref="/home/alver/Desktop/bilder/jabref/behandlet.png"
+ width="572.00000"
+ height="428.00000"
+ id="image9050" />
+ </pattern>
+ </defs>
+ <sodipodi:namedview
+ inkscape:window-y="53"
+ inkscape:window-x="15"
+ inkscape:window-height="856"
+ inkscape:window-width="853"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="698.1925"
+ inkscape:cx="364.52617"
+ inkscape:zoom="1"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base" />
+ <metadata
+ id="metadata2143">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <rect
+ inkscape:export-ydpi="75.000000"
+ inkscape:export-xdpi="75.000000"
+ inkscape:export-filename="/home/alver/jabref-2.1rc/src/images/splash-2.1.png"
+ y="170.36218"
+ x="77.500000"
+ height="432.00000"
+ width="576.00000"
+ id="rect6833"
+ style="opacity:1.0000000;fill:#6b6b75;fill-opacity:1.0000000;stroke:none;stroke-width:5.0000000;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <image
+ id="image1821"
+ height="428"
+ width="572"
+ sodipodi:absref="/home/alver/jabref/src/images/splashBackground.png"
+ xlink:href="/home/alver/jabref/src/images/splashBackground.png"
+ x="79"
+ y="172.36218"
+ inkscape:export-filename="/home/alver/jabref-2.1rc/src/images/splash-2.1.png"
+ inkscape:export-xdpi="75"
+ inkscape:export-ydpi="75" />
+ <flowRoot
+ inkscape:export-ydpi="75.000000"
+ inkscape:export-xdpi="75.000000"
+ inkscape:export-filename="/home/alver/jabref-2.1rc/src/images/splash-2.1.png"
+ style="opacity:1.0000000;fill:#635578;fill-opacity:1.0000000;stroke:#b5b5c7;stroke-width:0.48137558;stroke-linejoin:bevel;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ transform="matrix(1.875133,0.000000,0.000000,2.542210,-129.6969,-372.8897)"
+ id="flowRoot2189"
+ xml:space="preserve">
+ <flowRegion
+ id="flowRegion2191">
+ <rect
+ style="fill:#635578;fill-opacity:1.0000000;stroke:#b5b5c7;stroke-opacity:1.0000000;stroke-width:0.48137557;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-linejoin:bevel"
+ y="199.10532"
+ x="128.49385"
+ height="127.49445"
+ width="283.51782"
+ id="rect2193" />
+ </flowRegion>
+ <flowPara
+ style="font-size:90.000000px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125.00000%;writing-mode:lr-tb;text-anchor:start;fill:#635578;fill-opacity:1.0000000;stroke:#b5b5c7;stroke-width:0.48137558;stroke-linejoin:bevel;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;font-family:AR PL KaitiM GB"
+ id="flowPara2201">JabRef</flowPara>
+ </flowRoot> <flowRoot
+ inkscape:export-ydpi="75.000000"
+ inkscape:export-xdpi="75.000000"
+ inkscape:export-filename="/home/alver/jabref-2.1b/src/images/splash-2.1beta.png"
+ style="font-size:34.96500015px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:104.16220427%;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#5cc757;stroke-width:0.64448702;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:0.64448701 0.64448701 ;stroke-dashoffset:0.45114091;stroke-opacity:1;font-family:FreeSans"
+ transform="matrix(2.869197,-1.415830e-2,2.234317e-2,3.356271,-832.1435,-652.0185)"
+ id="flowRoot2203"
+ xml:space="preserve">
+ <flowRegion
+ style="stroke:url(#linearGradient5367);stroke-width:0.64448702;stroke-miterlimit:4;stroke-dasharray:0.64448701 0.64448701 ;stroke-dashoffset:0.45114091"
+ id="flowRegion2205">
+ <rect
+ style="font-size:34.96500015px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:104.16220427%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#322b5b;stroke-width:0.64448702;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:0.64448701 0.64448701 ;stroke-dashoffset:0.45114091;stroke-opacity:1;font-family:FreeSans"
+ y="286.45224"
+ x="443.95346"
+ height="119.83134"
+ width="173.972"
+ id="rect2207" />
+ </flowRegion>
+ <flowPara
+ style="font-size:34.96500015px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:104.16220427%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#322b5b;stroke-width:0.64448702;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:0.64448701 0.64448701 ;stroke-dashoffset:0.45114091;stroke-opacity:1;font-family:FreeSans"
+ id="flowPara2211">2.1</flowPara>
+ </flowRoot> <flowRoot
+ inkscape:export-ydpi="75.000000"
+ inkscape:export-xdpi="75.000000"
+ inkscape:export-filename="/home/alver/jabref-2.1rc/src/images/splash-2.1.png"
+ transform="matrix(0.972246,0.000000,0.000000,1.325301,6.054966,-126.1181)"
+ style="font-size:11.9999996;font-style:oblique;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#797580;fill-opacity:1.0000000;font-family:Bitstream Vera Sans;text-anchor:middle;writing-mode:lr;text-align:center;line-height:100%"
+ id="flowRoot3076"
+ xml:space="preserve"><flowRegion
+ id="flowRegion3078">
+ <rect
+ style="fill:#797580;fill-opacity:1.0000000;font-family:Bitstream Vera Sans;font-weight:bold;font-style:oblique;font-stretch:normal;font-variant:normal;font-size:11.9999996;text-anchor:middle;text-align:center;writing-mode:lr;line-height:100%"
+ y="514.56494"
+ x="115.50008"
+ height="78.684433"
+ width="506.03476"
+ id="rect3080" />
+ </flowRegion><flowPara
+ id="flowPara1339">This program is distributed under the terms of the General Public License.</flowPara><flowPara
+ id="flowPara1341">Copyright (2003-2006) Morten O. Alver, Nizar Batada and all contributors.</flowPara></flowRoot> <text
+ inkscape:export-ydpi="75.000000"
+ inkscape:export-xdpi="75.000000"
+ inkscape:export-filename="/home/alver/jabref-2.1rc/src/images/splash-2.1.png"
+ transform="scale(0.853277,1.171952)"
+ sodipodi:linespacing="100%"
+ id="text1393"
+ y="315.20035"
+ x="163.38908"
+ style="font-size:183.29680;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#413b62;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Nimbus Roman No9 L;text-anchor:start;writing-mode:lr-tb"
+ xml:space="preserve"><tspan
+ y="315.20035"
+ x="163.38908"
+ id="tspan1395"
+ sodipodi:role="line">JabRef</tspan></text>
+ <text
+ inkscape:export-ydpi="75.000000"
+ inkscape:export-xdpi="75.000000"
+ inkscape:export-filename="/home/alver/jabref-2.1rc/src/images/splash-2.1.png"
+ transform="scale(0.853347,1.171856)"
+ sodipodi:linespacing="100%"
+ id="text2179"
+ y="397.84811"
+ x="149.99753"
+ style="font-size:44.00000436;font-style:italic;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#805b41;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Nimbus Roman No9 L;text-anchor:start;writing-mode:lr;text-align:start;line-height:100%"
+ xml:space="preserve"><tspan
+ y="397.84811"
+ x="149.99753"
+ id="tspan2181"
+ sodipodi:role="line">reference manager</tspan></text>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:export-ydpi="90.000000"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-filename="/home/alver/jabref_head/jabref/src/images/jabref_splash-2.2.png"
+ sodipodi:docname="splash-2.3.svg"
+ sodipodi:docbase="/home/alver/jabref/src/images"
+ inkscape:version="0.45.1"
+ sodipodi:version="0.32"
+ id="svg2138"
+ height="1052.3622047"
+ width="744.09448819"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs2140">
+ <linearGradient
+ id="linearGradient2974">
+ <stop
+ style="stop-color:#505b77;stop-opacity:1;"
+ offset="0"
+ id="stop2976" />
+ <stop
+ style="stop-color:#596a97;stop-opacity:1;"
+ offset="1"
+ id="stop2978" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2883">
+ <stop
+ style="stop-color:#c5c1c1;stop-opacity:1;"
+ offset="0"
+ id="stop2885" />
+ <stop
+ style="stop-color:white;stop-opacity:1;"
+ offset="1"
+ id="stop2887" />
+ </linearGradient>
+ <pattern
+ patternTransform="translate(316.0000,1046.362)"
+ id="pattern9054"
+ xlink:href="#pattern9048"
+ inkscape:collect="always" />
+ <marker
+ style="overflow:visible;"
+ id="Arrow2Send"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow2Send">
+ <path
+ transform="scale(0.3) rotate(180) translate(-5,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ id="path3046"
+ sodipodi:nodetypes="cccc" />
+ </marker>
+ <pattern
+ id="pattern9048"
+ patternTransform="translate(231.0000,284.3622)"
+ height="428.00000"
+ width="572.00000"
+ patternUnits="userSpaceOnUse">
+ <image
+ transform="translate(-231.0000,-284.3622)"
+ style="opacity:1.0000000;stroke:#000000;stroke-width:5.0000000;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
+ inkscape:export-ydpi="90.000000"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-filename="/home/alver/Desktop/bilder/jabref/splash4.png"
+ y="284.36218"
+ x="231.00000"
+ xlink:href="behandlet.png"
+ sodipodi:absref="/home/alver/Desktop/bilder/jabref/behandlet.png"
+ width="572.00000"
+ height="428.00000"
+ id="image9050" />
+ </pattern>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2883"
+ id="radialGradient2889"
+ cx="255.5"
+ cy="330.36218"
+ fx="255.5"
+ fy="330.36218"
+ r="135.88549"
+ gradientTransform="matrix(-0.799579,-5.606082e-2,6.979161e-2,-1.00875,436.7358,677.9388)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2883"
+ id="linearGradient2909"
+ x1="443.79153"
+ y1="351.89935"
+ x2="602.17139"
+ y2="351.89935"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2883"
+ id="radialGradient2796"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.799579,-5.606082e-2,6.979161e-2,-1.00875,436.7358,677.9388)"
+ cx="255.5"
+ cy="330.36218"
+ fx="255.5"
+ fy="330.36218"
+ r="135.88549" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2883"
+ id="radialGradient2798"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.799579,-5.606082e-2,6.979161e-2,-1.00875,436.7358,677.9388)"
+ cx="255.5"
+ cy="330.36218"
+ fx="255.5"
+ fy="330.36218"
+ r="135.88549" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:window-y="25"
+ inkscape:window-x="0"
+ inkscape:window-height="949"
+ inkscape:window-width="1280"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="677.8697"
+ inkscape:cx="414.10531"
+ inkscape:zoom="1"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base" />
+ <metadata
+ id="metadata2143">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <rect
+ inkscape:export-ydpi="75.000000"
+ inkscape:export-xdpi="75.000000"
+ inkscape:export-filename="/home/alver/jabref/src/images/splash.png"
+ y="170.36218"
+ x="77.500000"
+ height="432.00000"
+ width="576.00000"
+ id="rect6833"
+ style="opacity:1.0000000;fill:#6b6b75;fill-opacity:1.0000000;stroke:none;stroke-width:5.0000000;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <image
+ id="image1821"
+ height="428"
+ width="572"
+ sodipodi:absref="/home/alver/jabref/src/images/splashBackground.png"
+ xlink:href="splashBackground.png"
+ x="79"
+ y="172.36218"
+ inkscape:export-filename="/home/alver/jabref/src/images/splash.png"
+ inkscape:export-xdpi="75"
+ inkscape:export-ydpi="75" />
+ <flowRoot
+ inkscape:export-ydpi="75.000000"
+ inkscape:export-xdpi="75.000000"
+ inkscape:export-filename="/home/alver/jabref/src/images/splash.png"
+ style="opacity:1.0000000;fill:#635578;fill-opacity:1.0000000;stroke:#b5b5c7;stroke-width:0.48137558;stroke-linejoin:bevel;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ transform="matrix(1.875133,0.000000,0.000000,2.542210,-129.6969,-372.8897)"
+ id="flowRoot2189"
+ xml:space="preserve">
+ <flowRegion
+ id="flowRegion2191">
+ <rect
+ style="fill:#635578;fill-opacity:1.0000000;stroke:#b5b5c7;stroke-opacity:1.0000000;stroke-width:0.48137557;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-linejoin:bevel"
+ y="199.10532"
+ x="128.49385"
+ height="127.49445"
+ width="283.51782"
+ id="rect2193" />
+ </flowRegion>
+ <flowPara
+ style="font-size:90.000000px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125.00000%;writing-mode:lr-tb;text-anchor:start;fill:#635578;fill-opacity:1.0000000;stroke:#b5b5c7;stroke-width:0.48137558;stroke-linejoin:bevel;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;font-family:AR PL KaitiM GB"
+ id="flowPara2201">JabRef</flowPara>
+ </flowRoot> <flowRoot
+ inkscape:export-ydpi="75.000000"
+ inkscape:export-xdpi="75.000000"
+ inkscape:export-filename="/home/alver/jabref/src/images/splash.png"
+ transform="matrix(0.972246,0,0,1.325301,6.054966,-126.1181)"
+ style="font-size:12px;font-style:oblique;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#797580;fill-opacity:1;font-family:Bitstream Vera Sans"
+ id="flowRoot3076"
+ xml:space="preserve"><flowRegion
+ id="flowRegion3078">
+ <rect
+ style="font-size:12px;font-style:oblique;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#797580;fill-opacity:1;font-family:Bitstream Vera Sans"
+ y="514.56494"
+ x="115.50008"
+ height="78.684433"
+ width="506.03476"
+ id="rect3080" />
+ </flowRegion><flowPara
+ id="flowPara1339">This program is distributed under the terms of the General Public License.</flowPara><flowPara
+ id="flowPara1341">Copyright (2003-2007) Morten O. Alver, Nizar Batada and all contributors.</flowPara></flowRoot> <text
+ inkscape:export-ydpi="75.000000"
+ inkscape:export-xdpi="75.000000"
+ inkscape:export-filename="/home/alver/jabref/src/images/splash.png"
+ transform="scale(0.853347,1.171856)"
+ sodipodi:linespacing="100%"
+ id="text2179"
+ y="450.75409"
+ x="187.49605"
+ style="font-size:43.99980927px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#805b41;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:URW Palladio L"
+ xml:space="preserve"><tspan
+ y="450.75409"
+ x="187.49605"
+ id="tspan2181"
+ sodipodi:role="line">JabRef reference manager</tspan></text>
+ <g
+ id="g2867"
+ transform="matrix(1.14435,0,0,1.103688,-34.88143,-26.75429)"
+ style="fill:#3d3d5f;fill-opacity:1;stroke:url(#radialGradient2889);stroke-width:1.99301183;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:export-filename="/home/alver/jabref/src/images/splash.png"
+ inkscape:export-xdpi="75"
+ inkscape:export-ydpi="75">
+ <path
+ inkscape:export-ydpi="57.68"
+ inkscape:export-xdpi="57.68"
+ inkscape:export-filename="/home/alver/Documents/jabrefIkon.png"
+ sodipodi:nodetypes="cccscssc"
+ id="path3874"
+ d="M 157.96931,200.83693 C 195.68133,200.83693 226.84892,201.74266 226.84892,201.74266 C 226.84892,201.74266 264.67261,230.02095 245.09466,392.86816 C 239.45611,424.41127 211.69305,452.41514 177.77033,452.41514 C 143.84738,452.41514 124.35978,432.41027 124.35978,409.07782 C 159.37053,424.87768 185.33022,416.88114 194.38104,413.14131 C 198.72239,411.3483 214.85378,403.80956 214.58004,365.73926 C 213.94457,277.38853 222.57808,258.1971 157.96931,200.83693 z "
+ style="fill:#3d3d5f;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient2796);stroke-width:1.99301183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:export-ydpi="57.68"
+ inkscape:export-xdpi="57.68"
+ inkscape:export-filename="/home/alver/Documents/jabrefIkon.png"
+ sodipodi:nodetypes="ccccsc"
+ id="path3876"
+ d="M 255.00983,201.1495 C 346.39949,205.65848 415.05774,279.60734 324.95506,328.62763 C 299.6693,344.58746 362.3433,423.95718 386.64022,459.88743 C 324.57976,439.24633 270.32186,376.11089 274.24748,333.19936 C 276.87135,302.14849 327.63081,304.24915 329.72814,285.1414 C 331.82536,266.03489 296.3799,268.06417 255.00983,201.1495 z "
+ style="fill:#3d3d5f;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient2798);stroke-width:1.99301183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:57.1212616px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#727888;stroke-width:1.80000031;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Nimbus Sans L"
+ x="462.20135"
+ y="426.2529"
+ id="text2911"
+ sodipodi:linespacing="100%"
+ transform="scale(0.917932,1.089405)"
+ inkscape:export-filename="/home/alver/jabref/src/images/splash.png"
+ inkscape:export-xdpi="75"
+ inkscape:export-ydpi="75"><tspan
+ sodipodi:role="line"
+ id="tspan2913"
+ x="462.20135"
+ y="426.2529"
+ style="font-size:119.00263214px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#727888;stroke-width:1.80000031;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans">2.3</tspan></text>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:export-ydpi="90.000000"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-filename="/home/alver/jabref_head/jabref/src/images/jabref_splash-2.2.png"
+ sodipodi:docname="splash-2.4.svg"
+ sodipodi:docbase="/home/alver/jabref_trunk/src/images"
+ inkscape:version="0.46"
+ sodipodi:version="0.32"
+ id="svg2138"
+ height="1052.3622047"
+ width="744.09448819"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs2140">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective2595" />
+ <linearGradient
+ id="linearGradient2974">
+ <stop
+ style="stop-color:#505b77;stop-opacity:1;"
+ offset="0"
+ id="stop2976" />
+ <stop
+ style="stop-color:#596a97;stop-opacity:1;"
+ offset="1"
+ id="stop2978" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2883">
+ <stop
+ style="stop-color:#c5c1c1;stop-opacity:1;"
+ offset="0"
+ id="stop2885" />
+ <stop
+ style="stop-color:white;stop-opacity:1;"
+ offset="1"
+ id="stop2887" />
+ </linearGradient>
+ <pattern
+ patternTransform="translate(316.0000,1046.362)"
+ id="pattern9054"
+ xlink:href="#pattern9048"
+ inkscape:collect="always" />
+ <marker
+ style="overflow:visible;"
+ id="Arrow2Send"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow2Send">
+ <path
+ transform="scale(0.3) rotate(180) translate(-5,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ id="path3046"
+ sodipodi:nodetypes="cccc" />
+ </marker>
+ <pattern
+ id="pattern9048"
+ patternTransform="translate(231.0000,284.3622)"
+ height="428.00000"
+ width="572.00000"
+ patternUnits="userSpaceOnUse">
+ <image
+ transform="translate(-231.0000,-284.3622)"
+ style="opacity:1.0000000;stroke:#000000;stroke-width:5.0000000;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
+ inkscape:export-ydpi="90.000000"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-filename="/home/alver/Desktop/bilder/jabref/splash4.png"
+ y="284.36218"
+ x="231.00000"
+ xlink:href="behandlet.png"
+ sodipodi:absref="/home/alver/Desktop/bilder/jabref/behandlet.png"
+ width="572.00000"
+ height="428.00000"
+ id="image9050" />
+ </pattern>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2883"
+ id="radialGradient2889"
+ cx="255.5"
+ cy="330.36218"
+ fx="255.5"
+ fy="330.36218"
+ r="135.88549"
+ gradientTransform="matrix(-0.799579,-5.606082e-2,6.979161e-2,-1.00875,436.7358,677.9388)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2883"
+ id="linearGradient2909"
+ x1="443.79153"
+ y1="351.89935"
+ x2="602.17139"
+ y2="351.89935"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2883"
+ id="radialGradient2796"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.799579,-5.606082e-2,6.979161e-2,-1.00875,436.7358,677.9388)"
+ cx="255.5"
+ cy="330.36218"
+ fx="255.5"
+ fy="330.36218"
+ r="135.88549" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2883"
+ id="radialGradient2798"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.799579,-5.606082e-2,6.979161e-2,-1.00875,436.7358,677.9388)"
+ cx="255.5"
+ cy="330.36218"
+ fx="255.5"
+ fy="330.36218"
+ r="135.88549" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:window-y="25"
+ inkscape:window-x="0"
+ inkscape:window-height="949"
+ inkscape:window-width="1279"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="677.8697"
+ inkscape:cx="414.10531"
+ inkscape:zoom="1"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false" />
+ <metadata
+ id="metadata2143">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <rect
+ inkscape:export-ydpi="75.000000"
+ inkscape:export-xdpi="75.000000"
+ inkscape:export-filename="/home/alver/jabref_beta/src/images/splash.png"
+ y="170.36218"
+ x="77.500000"
+ height="432.00000"
+ width="576.00000"
+ id="rect6833"
+ style="opacity:1.0000000;fill:#6b6b75;fill-opacity:1.0000000;stroke:none;stroke-width:5.0000000;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <image
+ id="image1821"
+ height="428"
+ width="572"
+ sodipodi:absref="/home/alver/jabref/src/images/splashBackground.png"
+ xlink:href="splashBackground.png"
+ x="79"
+ y="172.36218"
+ inkscape:export-filename="/home/alver/jabref_beta/src/images/splash.png"
+ inkscape:export-xdpi="75"
+ inkscape:export-ydpi="75" />
+ <flowRoot
+ inkscape:export-ydpi="75.000000"
+ inkscape:export-xdpi="75.000000"
+ inkscape:export-filename="/home/alver/jabref_beta/src/images/splash.png"
+ style="opacity:1.0000000;fill:#635578;fill-opacity:1.0000000;stroke:#b5b5c7;stroke-width:0.48137558;stroke-linejoin:bevel;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ transform="matrix(1.875133,0.000000,0.000000,2.542210,-129.6969,-372.8897)"
+ id="flowRoot2189"
+ xml:space="preserve">
+ <flowRegion
+ id="flowRegion2191">
+ <rect
+ style="fill:#635578;fill-opacity:1.0000000;stroke:#b5b5c7;stroke-opacity:1.0000000;stroke-width:0.48137557;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-linejoin:bevel"
+ y="199.10532"
+ x="128.49385"
+ height="127.49445"
+ width="283.51782"
+ id="rect2193" />
+ </flowRegion>
+ <flowPara
+ style="font-size:90.000000px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125.00000%;writing-mode:lr-tb;text-anchor:start;fill:#635578;fill-opacity:1.0000000;stroke:#b5b5c7;stroke-width:0.48137558;stroke-linejoin:bevel;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;font-family:AR PL KaitiM GB"
+ id="flowPara2201">JabRef</flowPara>
+ </flowRoot> <flowRoot
+ inkscape:export-ydpi="75.000000"
+ inkscape:export-xdpi="75.000000"
+ inkscape:export-filename="/home/alver/jabref_beta/src/images/splash.png"
+ transform="matrix(0.972246,0,0,1.325301,6.054966,-126.1181)"
+ style="font-size:12px;font-style:oblique;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#797580;fill-opacity:1;font-family:Bitstream Vera Sans"
+ id="flowRoot3076"
+ xml:space="preserve"><flowRegion
+ id="flowRegion3078">
+ <rect
+ style="font-size:12px;font-style:oblique;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#797580;fill-opacity:1;font-family:Bitstream Vera Sans"
+ y="514.56494"
+ x="115.50008"
+ height="78.684433"
+ width="506.03476"
+ id="rect3080" />
+ </flowRegion><flowPara
+ id="flowPara1339">This program is distributed under the terms of the General Public License.</flowPara><flowPara
+ id="flowPara1341">Copyright (2003-2008) Morten O. Alver, Nizar Batada and all contributors.</flowPara></flowRoot> <text
+ inkscape:export-ydpi="75.000000"
+ inkscape:export-xdpi="75.000000"
+ inkscape:export-filename="/home/alver/jabref_beta/src/images/splash.png"
+ transform="scale(0.853347,1.171856)"
+ sodipodi:linespacing="100%"
+ id="text2179"
+ y="450.75409"
+ x="187.49605"
+ style="font-size:43.99980927px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#805b41;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:URW Palladio L"
+ xml:space="preserve"><tspan
+ y="450.75409"
+ x="187.49605"
+ id="tspan2181"
+ sodipodi:role="line">JabRef reference manager</tspan></text>
+ <g
+ id="g2867"
+ transform="matrix(1.14435,0,0,1.103688,-34.88143,-26.75429)"
+ style="fill:#3d3d5f;fill-opacity:1;stroke:url(#radialGradient2889);stroke-width:1.99301183;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:export-filename="/home/alver/jabref_beta/src/images/splash.png"
+ inkscape:export-xdpi="75"
+ inkscape:export-ydpi="75">
+ <path
+ inkscape:export-ydpi="57.68"
+ inkscape:export-xdpi="57.68"
+ inkscape:export-filename="/home/alver/Documents/jabrefIkon.png"
+ sodipodi:nodetypes="cccscssc"
+ id="path3874"
+ d="M 157.96931,200.83693 C 195.68133,200.83693 226.84892,201.74266 226.84892,201.74266 C 226.84892,201.74266 264.67261,230.02095 245.09466,392.86816 C 239.45611,424.41127 211.69305,452.41514 177.77033,452.41514 C 143.84738,452.41514 124.35978,432.41027 124.35978,409.07782 C 159.37053,424.87768 185.33022,416.88114 194.38104,413.14131 C 198.72239,411.3483 214.85378,403.80956 214.58004,365.73926 C 213.94457,277.38853 222.57808,258.1971 157.96931,200.83693 z "
+ style="fill:#3d3d5f;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient2796);stroke-width:1.99301183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:export-ydpi="57.68"
+ inkscape:export-xdpi="57.68"
+ inkscape:export-filename="/home/alver/Documents/jabrefIkon.png"
+ sodipodi:nodetypes="ccccsc"
+ id="path3876"
+ d="M 255.00983,201.1495 C 346.39949,205.65848 415.05774,279.60734 324.95506,328.62763 C 299.6693,344.58746 362.3433,423.95718 386.64022,459.88743 C 324.57976,439.24633 270.32186,376.11089 274.24748,333.19936 C 276.87135,302.14849 327.63081,304.24915 329.72814,285.1414 C 331.82536,266.03489 296.3799,268.06417 255.00983,201.1495 z "
+ style="fill:#3d3d5f;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient2798);stroke-width:1.99301183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:57.1212616px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#727888;stroke-width:1.80000031;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Nimbus Sans L"
+ x="462.20135"
+ y="426.2529"
+ id="text2911"
+ sodipodi:linespacing="100%"
+ transform="scale(0.917932,1.089405)"
+ inkscape:export-filename="/home/alver/jabref_beta/src/images/splash.png"
+ inkscape:export-xdpi="75"
+ inkscape:export-ydpi="75"><tspan
+ sodipodi:role="line"
+ id="tspan2913"
+ x="462.20135"
+ y="426.2529"
+ style="font-size:119.00263214px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#727888;stroke-width:1.80000031;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans">2.4</tspan></text>
+ </g>
+</svg>
</defs>
<sodipodi:namedview
inkscape:window-y="25"
- inkscape:window-x="0"
- inkscape:window-height="949"
+ inkscape:window-x="50"
+ inkscape:window-height="768"
inkscape:window-width="1280"
inkscape:current-layer="layer1"
inkscape:document-units="px"
id="rect3080" />
</flowRegion><flowPara
id="flowPara1339">This program is distributed under the terms of the General Public License.</flowPara><flowPara
- id="flowPara1341">Copyright (2003-2008) Morten O. Alver, Nizar Batada and all contributors.</flowPara></flowRoot> <text
+ id="flowPara1341">Copyright (2003-2009) Morten O. Alver, Nizar Batada and all contributors.</flowPara></flowRoot> <text
inkscape:export-ydpi="75.000000"
inkscape:export-xdpi="75.000000"
inkscape:export-filename="/home/alver/jabref_beta/src/images/splash.png"
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:export-ydpi="90.000000"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-filename="/home/alver/jabref_head/jabref/src/images/jabref_splash-2.2.png"
+ sodipodi:docname="splash-2.6beta.svg"
+ sodipodi:docbase="/home/alver/jabref_trunk/src/images"
+ inkscape:version="0.46"
+ sodipodi:version="0.32"
+ id="svg2138"
+ height="1052.3622047"
+ width="744.09448819"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape">
+ <defs
+ id="defs2140">
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective2595" />
+ <linearGradient
+ id="linearGradient2974">
+ <stop
+ style="stop-color:#505b77;stop-opacity:1;"
+ offset="0"
+ id="stop2976" />
+ <stop
+ style="stop-color:#596a97;stop-opacity:1;"
+ offset="1"
+ id="stop2978" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient2883">
+ <stop
+ style="stop-color:#c5c1c1;stop-opacity:1;"
+ offset="0"
+ id="stop2885" />
+ <stop
+ style="stop-color:white;stop-opacity:1;"
+ offset="1"
+ id="stop2887" />
+ </linearGradient>
+ <pattern
+ patternTransform="translate(316.0000,1046.362)"
+ id="pattern9054"
+ xlink:href="#pattern9048"
+ inkscape:collect="always" />
+ <marker
+ style="overflow:visible;"
+ id="Arrow2Send"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow2Send">
+ <path
+ transform="scale(0.3) rotate(180) translate(-5,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ id="path3046"
+ sodipodi:nodetypes="cccc" />
+ </marker>
+ <pattern
+ id="pattern9048"
+ patternTransform="translate(231.0000,284.3622)"
+ height="428.00000"
+ width="572.00000"
+ patternUnits="userSpaceOnUse">
+ <image
+ transform="translate(-231.0000,-284.3622)"
+ style="opacity:1.0000000;stroke:#000000;stroke-width:5.0000000;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
+ inkscape:export-ydpi="90.000000"
+ inkscape:export-xdpi="90.000000"
+ inkscape:export-filename="/home/alver/Desktop/bilder/jabref/splash4.png"
+ y="284.36218"
+ x="231.00000"
+ xlink:href="behandlet.png"
+ sodipodi:absref="/home/alver/Desktop/bilder/jabref/behandlet.png"
+ width="572.00000"
+ height="428.00000"
+ id="image9050" />
+ </pattern>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2883"
+ id="radialGradient2889"
+ cx="255.5"
+ cy="330.36218"
+ fx="255.5"
+ fy="330.36218"
+ r="135.88549"
+ gradientTransform="matrix(-0.799579,-5.606082e-2,6.979161e-2,-1.00875,436.7358,677.9388)"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2883"
+ id="linearGradient2909"
+ x1="443.79153"
+ y1="351.89935"
+ x2="602.17139"
+ y2="351.89935"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2883"
+ id="radialGradient2796"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.799579,-5.606082e-2,6.979161e-2,-1.00875,436.7358,677.9388)"
+ cx="255.5"
+ cy="330.36218"
+ fx="255.5"
+ fy="330.36218"
+ r="135.88549" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient2883"
+ id="radialGradient2798"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.799579,-5.606082e-2,6.979161e-2,-1.00875,436.7358,677.9388)"
+ cx="255.5"
+ cy="330.36218"
+ fx="255.5"
+ fy="330.36218"
+ r="135.88549" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:window-y="0"
+ inkscape:window-x="0"
+ inkscape:window-height="768"
+ inkscape:window-width="1272"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="px"
+ inkscape:cy="677.8697"
+ inkscape:cx="238.10531"
+ inkscape:zoom="1"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ showgrid="false" />
+ <metadata
+ id="metadata2143">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <rect
+ inkscape:export-ydpi="75.000000"
+ inkscape:export-xdpi="75.000000"
+ inkscape:export-filename="/home/alver/jabref_trunk/src/images/splash.png"
+ y="170.36218"
+ x="77.500000"
+ height="432.00000"
+ width="576.00000"
+ id="rect6833"
+ style="opacity:1.0000000;fill:#6b6b75;fill-opacity:1.0000000;stroke:none;stroke-width:5.0000000;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000" />
+ <image
+ id="image1821"
+ height="428"
+ width="572"
+ sodipodi:absref="/home/alver/jabref/src/images/splashBackground.png"
+ xlink:href="splashBackground.png"
+ x="79"
+ y="172.36218"
+ inkscape:export-filename="/home/alver/jabref_trunk/src/images/splash.png"
+ inkscape:export-xdpi="75"
+ inkscape:export-ydpi="75" />
+ <flowRoot
+ inkscape:export-ydpi="75.000000"
+ inkscape:export-xdpi="75.000000"
+ inkscape:export-filename="/home/alver/jabref_trunk/src/images/splash.png"
+ style="opacity:1.0000000;fill:#635578;fill-opacity:1.0000000;stroke:#b5b5c7;stroke-width:0.48137558;stroke-linejoin:bevel;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000"
+ transform="matrix(1.875133,0.000000,0.000000,2.542210,-129.6969,-372.8897)"
+ id="flowRoot2189"
+ xml:space="preserve">
+ <flowRegion
+ id="flowRegion2191">
+ <rect
+ style="fill:#635578;fill-opacity:1.0000000;stroke:#b5b5c7;stroke-opacity:1.0000000;stroke-width:0.48137557;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-linejoin:bevel"
+ y="199.10532"
+ x="128.49385"
+ height="127.49445"
+ width="283.51782"
+ id="rect2193" />
+ </flowRegion>
+ <flowPara
+ style="font-size:90.000000px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125.00000%;writing-mode:lr-tb;text-anchor:start;fill:#635578;fill-opacity:1.0000000;stroke:#b5b5c7;stroke-width:0.48137558;stroke-linejoin:bevel;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;font-family:AR PL KaitiM GB"
+ id="flowPara2201">JabRef</flowPara>
+ </flowRoot> <flowRoot
+ inkscape:export-ydpi="75.000000"
+ inkscape:export-xdpi="75.000000"
+ inkscape:export-filename="/home/alver/jabref_trunk/src/images/splash.png"
+ transform="matrix(0.972246,0,0,1.325301,6.054966,-126.1181)"
+ style="font-size:12px;font-style:oblique;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#797580;fill-opacity:1;font-family:Bitstream Vera Sans"
+ id="flowRoot3076"
+ xml:space="preserve"><flowRegion
+ id="flowRegion3078">
+ <rect
+ style="font-size:12px;font-style:oblique;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;writing-mode:lr-tb;text-anchor:middle;fill:#797580;fill-opacity:1;font-family:Bitstream Vera Sans"
+ y="514.56494"
+ x="115.50008"
+ height="78.684433"
+ width="506.03476"
+ id="rect3080" />
+ </flowRegion><flowPara
+ id="flowPara1339">This program is distributed under the terms of the General Public License.</flowPara><flowPara
+ id="flowPara1341">Copyright (2003-2009) Morten O. Alver, Nizar Batada and all contributors.</flowPara></flowRoot> <text
+ inkscape:export-ydpi="75.000000"
+ inkscape:export-xdpi="75.000000"
+ inkscape:export-filename="/home/alver/jabref_trunk/src/images/splash.png"
+ transform="scale(0.853347,1.171856)"
+ sodipodi:linespacing="100%"
+ id="text2179"
+ y="450.75409"
+ x="187.49605"
+ style="font-size:43.99980927px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#805b41;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:URW Palladio L"
+ xml:space="preserve"><tspan
+ y="450.75409"
+ x="187.49605"
+ id="tspan2181"
+ sodipodi:role="line">JabRef reference manager</tspan></text>
+ <g
+ id="g2867"
+ transform="matrix(1.14435,0,0,1.103688,-34.88143,-26.75429)"
+ style="fill:#3d3d5f;fill-opacity:1;stroke:url(#radialGradient2889);stroke-width:1.99301183;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ inkscape:export-filename="/home/alver/jabref_trunk/src/images/splash.png"
+ inkscape:export-xdpi="75"
+ inkscape:export-ydpi="75">
+ <path
+ inkscape:export-ydpi="57.68"
+ inkscape:export-xdpi="57.68"
+ inkscape:export-filename="/home/alver/Documents/jabrefIkon.png"
+ sodipodi:nodetypes="cccscssc"
+ id="path3874"
+ d="M 157.96931,200.83693 C 195.68133,200.83693 226.84892,201.74266 226.84892,201.74266 C 226.84892,201.74266 264.67261,230.02095 245.09466,392.86816 C 239.45611,424.41127 211.69305,452.41514 177.77033,452.41514 C 143.84738,452.41514 124.35978,432.41027 124.35978,409.07782 C 159.37053,424.87768 185.33022,416.88114 194.38104,413.14131 C 198.72239,411.3483 214.85378,403.80956 214.58004,365.73926 C 213.94457,277.38853 222.57808,258.1971 157.96931,200.83693 z "
+ style="fill:#3d3d5f;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient2796);stroke-width:1.99301183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ inkscape:export-ydpi="57.68"
+ inkscape:export-xdpi="57.68"
+ inkscape:export-filename="/home/alver/Documents/jabrefIkon.png"
+ sodipodi:nodetypes="ccccsc"
+ id="path3876"
+ d="M 255.00983,201.1495 C 346.39949,205.65848 415.05774,279.60734 324.95506,328.62763 C 299.6693,344.58746 362.3433,423.95718 386.64022,459.88743 C 324.57976,439.24633 270.32186,376.11089 274.24748,333.19936 C 276.87135,302.14849 327.63081,304.24915 329.72814,285.1414 C 331.82536,266.03489 296.3799,268.06417 255.00983,201.1495 z "
+ style="fill:#3d3d5f;fill-opacity:1;fill-rule:evenodd;stroke:url(#radialGradient2798);stroke-width:1.99301183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:57.1212616px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;opacity:1;fill:#ffffff;fill-opacity:1;stroke:#727888;stroke-width:1.80000031;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Nimbus Sans L"
+ x="462.20135"
+ y="426.2529"
+ id="text2911"
+ sodipodi:linespacing="100%"
+ transform="scale(0.917932,1.089405)"
+ inkscape:export-filename="/home/alver/jabref_trunk/src/images/splash.png"
+ inkscape:export-xdpi="75"
+ inkscape:export-ydpi="75"><tspan
+ sodipodi:role="line"
+ id="tspan2913"
+ x="462.20135"
+ y="426.2529"
+ style="font-size:119.00263214px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;stroke:#727888;stroke-width:1.80000031;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;font-family:Bitstream Vera Sans">2.6</tspan></text>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot2745"
+ style="font-size:56px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#f91616;fill-opacity:0.65789472;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold"
+ transform="matrix(0.9688007,-0.2478411,0.2478411,0.9688007,-87.20276,118.59483)"
+ inkscape:export-filename="/home/alver/jabref_trunk/src/images/splash.png"
+ inkscape:export-xdpi="75"
+ inkscape:export-ydpi="75"><flowRegion
+ id="flowRegion2747"><rect
+ id="rect2749"
+ width="164"
+ height="68"
+ x="482"
+ y="470.36218"
+ style="font-size:56px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#f91616;fill-opacity:0.65789472;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans Bold" /></flowRegion><flowPara
+ id="flowPara2751">beta</flowPara></flowRoot> </g>
+</svg>
for (BibtexEntry entry : database.getEntries()){
Util.updateCompletersForEntry(autoCompleters, entry);
}
+
+ addJournalListToAutoCompleter();
+ addContentSelectorValuesToAutoCompleters();
+ }
+
+ /**
+ * For all fields with both autocompletion and content selector, add content selector
+ * values to the autocompleter list:
+ */
+ public void addContentSelectorValuesToAutoCompleters() {
+ for (String field : autoCompleters.keySet()) {
+ AutoCompleter ac = autoCompleters.get(field);
+ if (metaData.getData(Globals.SELECTOR_META_PREFIX + field) != null) {
+ Vector<String> items = metaData.getData(Globals.SELECTOR_META_PREFIX + field);
+ if (items != null) {
+ Iterator<String> i = items.iterator();
+ while (i.hasNext())
+ ac.addWord(i.next());
+ }
+ }
+ }
+ }
+
+ /**
+ * If an autocompleter exists for the "journal" field, add all
+ * journal names in the journal abbreviation list to this autocompleter.
+ */
+ public void addJournalListToAutoCompleter() {
+ if (autoCompleters.containsKey("journal")) {
+ AutoCompleter ac = autoCompleters.get("journal");
+ Set<String> journals = Globals.journalAbbrev.getJournals().keySet();
+ for (String journal : journals)
+ ac.addWord(journal);
+ }
+
+
}
};
// Test: running scan automatically in background
+ if ((BasePanel.this.getFile() != null) &&
+ !Util.waitForFileLock(BasePanel.this.getFile(), 10)) {
+ // The file is locked even after the maximum wait. Do nothing.
+ System.err.println("File updated externally, but change scan failed because the file is locked.");
+ // Perturb the stored timestamp so successive checks are made:
+ Globals.fileUpdateMonitor.perturbTimestamp(getFileMonitorHandle());
+ return;
+ }
+
scanner.changeScan(BasePanel.this.getFile());
try {
scanner.join();
else {
panel.rebuildAllEntryEditors();
}
+ panel.addContentSelectorValuesToAutoCompleters();
+
}
/**
// The check if they have the same required fields:
String[] fields = one.getType().getRequiredFields();
- float req;
- if (fields == null)
- req = 1;
+ float req, reqWeight = 2;
+ if (fields == null) {
+ req = 0;
+ reqWeight = 0;
+ }
else
req = compareFieldSet(fields, one, two);
fields = one.getType().getOptionalFields();
if (fields != null) {
float opt = compareFieldSet(fields, one, two);
- return (2 * req + opt) / 3 >= Globals.duplicateThreshold;
+ return (reqWeight * req + opt) / (1 + reqWeight) >= Globals.duplicateThreshold;
} else {
return (req >= Globals.duplicateThreshold);
}
import net.sf.jabref.gui.date.DatePickerButton;
import net.sf.jabref.imports.BibtexParser;
import net.sf.jabref.labelPattern.LabelPatternUtil;
-import net.sf.jabref.undo.NamedCompound;
-import net.sf.jabref.undo.UndoableFieldChange;
-import net.sf.jabref.undo.UndoableKeyChange;
-import net.sf.jabref.undo.UndoableRemoveEntry;
+import net.sf.jabref.undo.*;
+import com.jgoodies.looks.Options;
+import com.jgoodies.looks.HeaderStyle;
/**
* GUI component that allows editing of the fields of a BibtexEntry (i.e. the
// The action which generates a bibtexkey for this entry.
public GenerateKeyAction generateKeyAction;
+ public AutoSetFileAction autoLink = new AutoSetFileAction();
+
public AbstractAction writeXmp;
SaveDatabaseAction saveDatabaseAction = new SaveDatabaseAction();
}
private void setupToolBar() {
+ JPanel leftPan = new JPanel();
+ leftPan.setLayout(new BorderLayout());
tlb = new JToolBar(JToolBar.VERTICAL);
+ //tlb.putClientProperty(Options.HEADER_STYLE_KEY, HeaderStyle.BOTH);
+ tlb.setBorder(null);
+ tlb.setRollover(true);
tlb.setMargin(new Insets(0, 0, 0, 2));
am.put("store", storeFieldAction);
im.put(prefs.getKey("Autogenerate BibTeX keys"), "generateKey");
am.put("generateKey", generateKeyAction);
+ im.put(prefs.getKey("Automatically link files"), "autoLink");
+ am.put("autoLink", autoLink);
im.put(prefs.getKey("Entry editor, previous entry"), "prev");
am.put("prev", prevEntryAction);
im.put(prefs.getKey("Entry editor, next entry"), "next");
tlb.setFloatable(false);
+ // Add actions (and thus buttons)
+ JButton closeBut = new JButton(closeAction);
+ closeBut.setText(null);
+ closeBut.setBorder(null);
+ leftPan.add(closeBut, BorderLayout.NORTH);
+
// Create type-label
typeLabel = new TypeLabel(entry.getType().getName());
-
- // Add actions (and thus buttons)
- tlb.add(closeAction);
+ leftPan.add(typeLabel, BorderLayout.CENTER);
- tlb.add(typeLabel);
+ //tlb.add(typeL);
tlb.addSeparator();
tlb.add(generateKeyAction);
+ tlb.add(autoLink);
tlb.add(writeXmp);
for (int i = 0; i < comps.length; i++)
((JComponent) comps[i]).setOpaque(false);
- add(tlb, BorderLayout.WEST);
+ leftPan.add(tlb, BorderLayout.SOUTH);
+ add(leftPan, BorderLayout.WEST);
}
/**
} else if (panel.metaData.getData(Globals.SELECTOR_META_PREFIX + ed.getFieldName()) != null) {
FieldContentSelector ws = new FieldContentSelector(frame, panel, frame, ed,
panel.metaData, storeFieldAction, false,
- (ed.getFieldName().equals("author") ? " and " : ", "));
+ ((ed.getFieldName().equals("author") || ed.getFieldName().equals("editor")) ? " and " : ", "));
contentSelectors.add(ws);
return ws;
// oldKey = entry.getCiteKey(),
newKey = nu.getCiteKey();
boolean anyChanged = false;
+ boolean changedType = false;
boolean duplicateWarning = false;
boolean emptyWarning = newKey == null || newKey.equals("");
}
}
+ // See if the user has changed the entry type:
+ if (nu.getType() != entry.getType()) {
+ compound.addEdit(new UndoableChangeType(entry,
+ entry.getType(), nu.getType()));
+ entry.setType(nu.getType());
+ anyChanged = true;
+ changedType = true;
+ }
compound.end();
if (!anyChanged)
}
lastSourceStringAccepted = source.getText();
- updateAllFields();
- lastSourceAccepted = true;
- updateSource = true;
-
+ if (!changedType) {
+ updateAllFields();
+ lastSourceAccepted = true;
+ updateSource = true;
+ }
+ else {
+ panel.updateEntryEditorIfShowing();
+ }
// TODO: does updating work properly after source stored?
// panel.tableModel.remap();
// panel.entryTable.repaint();
}
- private class TypeLabel extends JPanel {
- private String label;
+ private class TypeLabel extends JLabel {
public TypeLabel(String type) {
- label = type;
+ super(type+" ");
+ setUI(new VerticalLabelUI(false));
+ setForeground(GUIGlobals.validFieldColor);
+ setHorizontalAlignment(RIGHT);
+ setFont(GUIGlobals.typeNameFont);
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
boolean ctrlClick = prefs.getBoolean("ctrlClick");
});
}
- public void paint(Graphics g) {
+ public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
- g2.setColor(GUIGlobals.validFieldColor);
- g2.setFont(GUIGlobals.typeNameFont);
- FontMetrics fm = g2.getFontMetrics();
- int width = fm.stringWidth(label);
+ //g2.setColor(GUIGlobals.validFieldColor);
+ //g2.setFont(GUIGlobals.typeNameFont);
+ //FontMetrics fm = g2.getFontMetrics();
+ //int width = fm.stringWidth(label);
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- g2.rotate(-Math.PI / 2, 0, 0);
- g2.drawString(label, -width - 7, 28);
+ super.paintComponent(g2);
+ //g2.rotate(-Math.PI / 2, 0, 0);
+ //g2.drawString(label, -width - 7, 28);
}
}
}
+ class AutoSetFileAction extends AbstractAction {
+ public AutoSetFileAction() {
+ putValue(SMALL_ICON, GUIGlobals.getImage("autoGroup"));
+ putValue(SHORT_DESCRIPTION, Globals.lang("Automatically set file links for this entry")
+ +" (Alt-F)");
+ }
+
+ public void actionPerformed(ActionEvent event) {
+ JDialog diag = new JDialog(frame, true);
+ final FileListTableModel tableModel = new FileListTableModel();
+ tableModel.setContent(entry.getField(GUIGlobals.FILE_FIELD));
+ FileListEditor.autoSetLinks(entry, tableModel, panel.metaData(), new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ if (e.getID() > 0) {
+ entry.setField(GUIGlobals.FILE_FIELD, tableModel.getStringRepresentation());
+ frame.output(Globals.lang("Finished autosetting external links."));
+ }
+ else frame.output(Globals.lang("Finished autosetting external links.")
+ +" "+Globals.lang("No files found."));
+ }
+ }, diag);
+ }
+ }
}
* A single tab displayed in the EntryEditor holding several FieldEditors.
*
* @author $Author: mortenalver $
- * @version $Revision: 2864 $ ($Date: 2008-11-25 21:22:56 +0100 (Tue, 25 Nov 2008) $)
+ * @version $Revision: 3072 $ ($Date: 2009-09-03 21:07:51 +0200 (Thu, 03 Sep 2009) $)
*
*/
public class EntryEditorTab {
//ta.addUndoableEditListener(bPanel.undoListener);
JComponent ex = parent.getExtra(fields[i], ta);
- setupJTextComponent(ta.getTextComponent());
// Add autocompleter listener, if required for this field:
AutoCompleter autoComp = bPanel.getAutoCompleter(fields[i]);
+ AutoCompleteListener acl = null;
if (autoComp != null) {
- ta.getTextComponent().addKeyListener(new AutoCompleteListener(autoComp));
+ acl = new AutoCompleteListener(autoComp);
}
+ setupJTextComponent(ta.getTextComponent(), acl);
// Store the editor for later reference:
editors.put(fields[i], ta);
final FieldTextField tf = new FieldTextField(BibtexFields.KEY_FIELD, parent
.getEntry().getField(BibtexFields.KEY_FIELD), true);
//tf.addUndoableEditListener(bPanel.undoListener);
- setupJTextComponent(tf);
+ setupJTextComponent(tf, null);
editors.put("bibtexkey", tf);
/*
*
* @param component
*/
- public void setupJTextComponent(final JComponent component) {
-
- component.addFocusListener(fieldListener);
+ public void setupJTextComponent(final JComponent component, final AutoCompleteListener acl) {
+
+ // Here we add focus listeners to the component. The funny code is because we need
+ // to guarantee that the AutoCompleteListener - if used - is called before fieldListener
+ // on a focus lost event. The AutoCompleteListener is responsible for removing any
+ // current suggestion when focus is lost, and this must be done before fieldListener
+ // stores the current edit. Swing doesn't guarantee the order of execution of event
+ // listeners, so we handle this by only adding the AutoCompleteListener and telling
+ // it to call fieldListener afterwards. If no AutoCompleteListener is used, we
+ // add the fieldListener normally.
+ if (acl != null) {
+ component.addKeyListener(acl);
+ component.addFocusListener(acl);
+ acl.setNextFocusListener(fieldListener);
+ }
+ else
+ component.addFocusListener(fieldListener);
InputMap im = component.getInputMap(JComponent.WHEN_FOCUSED);
ActionMap am = component.getActionMap();
private JCheckBox
defSort, ctrlClick, useOwner, overwriteOwner,
- keyDuplicateWarningDialog, keyEmptyWarningDialog,
+ keyDuplicateWarningDialog, keyEmptyWarningDialog, enforceLegalKeys,
confirmDelete, allowEditing, memoryStick, useImportInspector,
useImportInspectorForSingle, inspectionWarnDupli, useTimeStamp, overwriteTimeStamp,
markImportedEntries, unmarkAllEntriesBeforeImporting;
+"the field set, overwrite."));
keyDuplicateWarningDialog = new JCheckBox(Globals.lang("Show warning dialog when a duplicate BibTeX key is entered"));
keyEmptyWarningDialog = new JCheckBox(Globals.lang("Show warning dialog when an empty BibTeX key is entered")); // JZTODO lyrics
+ enforceLegalKeys = new JCheckBox(Globals.lang("Enforce legal characters in BibTeX keys"));
confirmDelete = new JCheckBox(Globals.lang("Show confirmation dialog when deleting entries"));
useImportInspector = new JCheckBox(Globals.lang("Display imported entries in an inspection window before they are added."));
builder.nextLine();
builder.append(keyEmptyWarningDialog, 13);
builder.nextLine();
+ builder.append(enforceLegalKeys, 13);
+ builder.nextLine();
builder.append(memoryStick, 13);
// Create a new panel with its own FormLayout for the last items:
overwriteTimeStamp.setSelected(_prefs.getBoolean("overwriteTimeStamp"));
keyDuplicateWarningDialog.setSelected(_prefs.getBoolean("dialogWarningForDuplicateKey"));
keyEmptyWarningDialog.setSelected(_prefs.getBoolean("dialogWarningForEmptyKey"));
+ enforceLegalKeys.setSelected(_prefs.getBoolean("enforceLegalBibtexKey"));
memoryStick.setSelected(_prefs.getBoolean("memoryStickMode"));
confirmDelete.setSelected(_prefs.getBoolean("confirmDelete"));
defOwnerField.setText(_prefs.get("defaultOwner"));
_prefs.putBoolean("overwriteTimeStamp", overwriteTimeStamp.isSelected());
_prefs.putBoolean("dialogWarningForDuplicateKey", keyDuplicateWarningDialog.isSelected());
_prefs.putBoolean("dialogWarningForEmptyKey", keyEmptyWarningDialog.isSelected());
+ _prefs.putBoolean("enforceLegalBibtexKey", enforceLegalKeys.isSelected());
if (_prefs.getBoolean("memoryStickMode") && !memoryStick.isSelected()){
JOptionPane.showMessageDialog(null, Globals.lang("To disable the memory stick mode" +
" rename or remove the jabref.xml file in the same folder as JabRef."),
}
- public static String SPECIAL_COMMAND_CHARS = "\"`^~'c";
+ public static String SPECIAL_COMMAND_CHARS = "\"`^~'c=";
public static HashMap<String, String> HTML_CHARS = new HashMap<String, String>();
public static HashMap<String, String> HTMLCHARS = new HashMap<String, String>();
loaded.add(ParserResult.INVALID_FORMAT);
}
}
- else
+ else if (pr != ParserResult.FILE_LOCKED)
loaded.add(pr);
}
fetchCommand.split(":").length != 2) {
System.out.println(Globals.lang("Expected syntax for --fetch='<name of fetcher>:<query>'"));
System.out.println(Globals.lang("The following fetchers are available:"));
- for (EntryFetcherExtension e : JabRefPlugin.getInstance(PluginCore.getManager())
- .getEntryFetcherExtensions()) {
- System.out.println(" " + e.getId().replaceAll("Fetcher", "").toLowerCase());
- }
return null;
}
if (pr != null) {
- if (pr.isInvalid()) {
+ if (pr == ParserResult.INVALID_FORMAT) {
System.out.println(Globals.lang("Error opening file")+" '"+fileToOpen.getPath()+"'");
}
- loaded.add(pr);
+ else if (pr != ParserResult.FILE_LOCKED)
+ loaded.add(pr);
}
}
return postp;
}
}
+
+ if (!Util.waitForFileLock(file, 10)) {
+ System.out.println(Globals.lang("Error opening file")+" '"+name+"'. "+
+ "File is locked by another JabRef instance.");
+ return ParserResult.FILE_LOCKED;
+ }
+
String encoding = Globals.prefs.get("defaultEncoding");
ParserResult pr = OpenDatabaseAction.loadDatabase(file, encoding);
if (pr == null) {
//defaults.put("recentFiles", "/home/alver/Documents/bibk_dok/hovedbase.bib");
defaults.put("historySize", new Integer(8));
- defaults.put("fontFamily", "Times");
+ defaults.put("fontFamily", "SansSerif");
defaults.put("fontStyle", new Integer(java.awt.Font.PLAIN));
defaults.put("fontSize", new Integer(12));
defaults.put("overrideDefaultFonts", Boolean.FALSE);
defaults.put("warnBeforeOverwritingKey", Boolean.TRUE);
defaults.put("confirmDelete", Boolean.TRUE);
defaults.put("grayOutNonHits", Boolean.TRUE);
+ defaults.put("floatSearch", Boolean.TRUE);
defaults.put("showSearchInDialog", Boolean.FALSE);
defaults.put("searchAllBases", Boolean.FALSE);
defaults.put("defaultLabelPattern", "[auth][year]");
defaults.put("autolinkExactKeyOnly", Boolean.TRUE);
defaults.put("numericFields", "mittnum;author");
defaults.put("runAutomaticFileSearch", Boolean.FALSE);
-
+ defaults.put("useLockFiles", Boolean.TRUE);
defaults.put("autoSave", Boolean.TRUE);
defaults.put("autoSaveInterval", 5);
defaults.put("promptBeforeUsingAutosave", Boolean.TRUE);
defaults.put("deletePlugins", "");
+ defaults.put("enforceLegalBibtexKey", Boolean.TRUE);
+
//defaults.put("lastAutodetectedImport", "");
//defaults.put("autoRemoveExactDuplicates", Boolean.FALSE);
defKeyBinds.put("Increase table font size", "ctrl PLUS");
defKeyBinds.put("Decrease table font size", "ctrl MINUS");
+ defKeyBinds.put("Automatically link files", "alt F");
}
private String getNextUnit(Reader data) throws IOException {
* Displays an BibtexEntry using the given layout format.
*
* @author $Author: mortenalver $
- * @version $Revision: 2983 $ ($Date: 2007-08-01 20:23:38 +0200 (Mi, 01 Aug
+ * @version $Revision: 3047 $ ($Date: 2007-08-01 20:23:38 +0200 (Mi, 01 Aug
* 2007) $)
*
*/
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
-import net.sf.jabref.export.layout.format.RemoveBrackets;
+import net.sf.jabref.export.layout.format.RemoveLatexCommands;
public class RegExpRule implements SearchRule {
final boolean m_caseSensitiveSearch;
- static RemoveBrackets removeBrackets = new RemoveBrackets();
+ //static RemoveBrackets removeBrackets = new RemoveBrackets();
+ static RemoveLatexCommands removeBrackets = new RemoveLatexCommands();
public RegExpRule(boolean caseSensitive) {
m_caseSensitiveSearch = caseSensitive;
// Select the last used mode of search:
if (Globals.prefs.getBoolean("incrementS"))
increment.setSelected(true);
- else if (Globals.prefs.getBoolean("grayOutNonHits"))
+ else if (Globals.prefs.getBoolean("floatSearch"))
floatSearch.setSelected(true);
else if (Globals.prefs.getBoolean("showSearchInDialog"))
showResultsInDialog.setSelected(true);
Globals.prefs.putBoolean("searchAll", searchAll.isSelected());
Globals.prefs.putBoolean("incrementS", increment.isSelected());
Globals.prefs.putBoolean("selectS", select.isSelected());
- Globals.prefs.putBoolean("grayOutNonHits", floatSearch.isSelected());
+ Globals.prefs.putBoolean("floatSearch", floatSearch.isSelected());
Globals.prefs.putBoolean("caseSensitiveSearch",
caseSensitive.isSelected());
Globals.prefs.putBoolean("regExpSearch", regExpSearch.isSelected());
import java.util.Map;
-import net.sf.jabref.export.layout.format.RemoveBrackets;
+import net.sf.jabref.export.layout.format.RemoveLatexCommands;
public class SimpleSearchRule implements SearchRule {
final boolean m_caseSensitiveSearch;
- static RemoveBrackets removeBrackets = new RemoveBrackets();
+ //static RemoveBrackets removeBrackets = new RemoveBrackets();
+ static RemoveLatexCommands removeBrackets = new RemoveLatexCommands();
public SimpleSearchRule(boolean caseSensitive) {
m_caseSensitiveSearch = caseSensitive;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URLDecoder;
+import java.net.*;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.text.NumberFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTextArea;
+import javax.swing.*;
import javax.swing.undo.UndoableEdit;
import net.sf.jabref.export.layout.LayoutEntry;
import net.sf.jabref.export.layout.LayoutFormatter;
+import net.sf.jabref.export.SaveSession;
import net.sf.jabref.external.ExternalFileType;
import net.sf.jabref.external.ExternalFileTypeEntryEditor;
import net.sf.jabref.external.UnknownExternalFileType;
import net.sf.jabref.undo.NamedCompound;
import net.sf.jabref.undo.UndoableFieldChange;
import net.sf.jabref.labelPattern.LabelPatternUtil;
+import net.sf.jabref.net.URLDownload;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;
final static NumberFormat idFormat;
+ public static Pattern remoteLinkPattern = Pattern.compile("[a-z]+://.*");
+
static {
idFormat = NumberFormat.getInstance();
idFormat.setMinimumIntegerDigits(8);
public static String checkLegalKey(String key) {
if (key == null)
return null;
- StringBuffer newKey = new StringBuffer();
+ if (!Globals.prefs.getBoolean("enforceLegalBibtexKey")) {
+ // User doesn't want us to enforce legal characters. We must still look
+ // for whitespace and some characters such as commas, since these would
+ // interfere with parsing:
+ StringBuilder newKey = new StringBuilder();
+ for (int i = 0; i < key.length(); i++) {
+ char c = key.charAt(i);
+ if (!Character.isWhitespace(c) && (c != '{') && (c != '\\') && (c != '"')
+ && (c != '}') && (c != ','))
+ newKey.append(c);
+ }
+ return newKey.toString();
+
+ }
+ StringBuilder newKey = new StringBuilder();
for (int i = 0; i < key.length(); i++) {
char c = key.charAt(i);
if (!Character.isWhitespace(c) && (c != '#') && (c != '{') && (c != '\\') && (c != '"')
return out.toString();// .replaceAll("\n", "\n\t");
}
- public static HashSet<String> findDeliminatedWordsInField(BibtexDatabase db, String field,
+ public static TreeSet<String> findDeliminatedWordsInField(BibtexDatabase db, String field,
String deliminator) {
- HashSet<String> res = new HashSet<String>();
+ TreeSet<String> res = new TreeSet<String>();
for (String s : db.getKeySet()){
BibtexEntry be = db.getEntryById(s);
String fieldValue = o.toString().trim();
StringTokenizer tok = new StringTokenizer(fieldValue, deliminator);
while (tok.hasMoreTokens())
- res.add(tok.nextToken().trim());
+ res.add(nCase(tok.nextToken().trim()));
}
}
return res;
* a <code>String</code> value
* @return a <code>HashSet</code> value
*/
- public static HashSet<String> findAllWordsInField(BibtexDatabase db, String field, String remove) {
- HashSet<String> res = new HashSet<String>();
+ public static TreeSet<String> findAllWordsInField(BibtexDatabase db, String field, String remove) {
+ TreeSet<String> res = new TreeSet<String>();
StringTokenizer tok;
for (String s : db.getKeySet()){
BibtexEntry be = db.getEntryById(s);
if (o != null) {
tok = new StringTokenizer(o.toString(), remove, false);
while (tok.hasMoreTokens())
- res.add(tok.nextToken());
+ res.add(nCase(tok.nextToken().trim()));
}
}
return res;
}
+
+ /**
+ * Finds all authors' last names in all the given fields for the given database.
+ * @param db The database.
+ * @param fields The fields to look in.
+ * @return a set containing the names.
+ */
+ public static Set<String> findAuthorLastNames(BibtexDatabase db, List<String> fields) {
+ Set<String> res = new TreeSet<String>();
+ for (String s : db.getKeySet()){
+ BibtexEntry be = db.getEntryById(s);
+ for (String field : fields) {
+ String val = be.getField(field);
+ if ((val != null) && (val.length() > 0)) {
+ AuthorList al = AuthorList.getAuthorList(val);
+ for (int i=0; i<al.size(); i++) {
+ AuthorList.Author a = al.getAuthor(i);
+ String lastName = a.getLast();
+ if ((lastName != null) && (lastName.length() > 0))
+ res.add(lastName);
+ }
+ }
+
+ }
+ }
+
+ return res;
+ }
+
+
/**
* Takes a String array and returns a string with the array's elements
* delimited by a certain String.
* The file name.
* @return false if the link couldn't be resolved, true otherwise.
*/
- public static boolean openExternalFileAnyFormat(MetaData metaData, String link,
- ExternalFileType fileType) throws IOException {
+ public static boolean openExternalFileAnyFormat(final MetaData metaData, String link,
+ final ExternalFileType fileType) throws IOException {
- boolean httpLink = link.toLowerCase().startsWith("http");
+ boolean httpLink = false;
+ if (remoteLinkPattern.matcher(link.toLowerCase()).matches()) {
+ httpLink = true;
+ }
+ /*if (link.toLowerCase().startsWith("file://")) {
+ link = link.substring(7);
+ }
+ final String ln = link;
+ if (remoteLinkPattern.matcher(link.toLowerCase()).matches()) {
+ (new Thread(new Runnable() {
+ public void run() {
+ openRemoteExternalFile(metaData, ln, fileType);
+ }
+ })).start();
+
+ return true;
+ }*/
+
+ //boolean httpLink = link.toLowerCase().startsWith("http:")
+ // || link.toLowerCase().startsWith("ftp:");
+
+
// For other platforms we'll try to find the file type:
File file = new File(link);
}
+
+ public static void openRemoteExternalFile(final MetaData metaData,
+ final String link, final ExternalFileType fileType) {
+ File temp = null;
+ try {
+ temp = File.createTempFile("jabref-link", "."+fileType.getExtension());
+ temp.deleteOnExit();
+ System.out.println("Downloading to '"+temp.getPath()+"'");
+ URLDownload ud = new URLDownload(null, new URL(link), temp);
+ ud.download();
+ System.out.println("Done");
+ } catch (MalformedURLException ex) {
+ ex.printStackTrace();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ final String ln = temp.getPath();
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ try {
+ openExternalFileAnyFormat(metaData, ln, fileType);
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+ });
+ }
+
public static boolean openExternalFileUnknown(JabRefFrame frame, BibtexEntry entry, MetaData metaData,
String link, UnknownExternalFileType fileType) throws IOException {
// of execution will not continue until run() is finished.
clb.update(); // Runs the update() method on the EDT.
}
-
+
+ /**
+ * This method checks whether there is a lock file for the given file. If
+ * there is, it waits for 500 ms. This is repeated until the lock is gone
+ * or we have waited the maximum number of times.
+ *
+ * @param file The file to check the lock for.
+ * @param maxWaitCount The maximum number of times to wait.
+ * @return true if the lock file is gone, false if it is still there.
+ */
+ public static boolean waitForFileLock(File file, int maxWaitCount) {
+ // Check if the file is locked by another JabRef user:
+ int lockCheckCount = 0;
+ while (Util.hasLockFile(file)) {
+
+ System.out.println("File locked... waiting");
+ if (lockCheckCount++ == maxWaitCount) {
+ System.out.println("Giving up wait.");
+ return false;
+ }
+ try { Thread.sleep(500); } catch (InterruptedException ex) {}
+ }
+ return true;
+ }
+
+ /**
+ * Check whether a lock file exists for this file.
+ * @param file The file to check.
+ * @return true if a lock file exists, false otherwise.
+ */
+ public static boolean hasLockFile(File file) {
+ File lock = new File(file.getPath()+ SaveSession.LOCKFILE_SUFFIX);
+ return lock.exists();
+ }
+
+ /**
+ * Find the lock file's last modified time, if it has a lock file.
+ * @param file The file to check.
+ * @return the last modified time if lock file exists, -1 otherwise.
+ */
+ public static long getLockFileTimeStamp(File file) {
+ File lock = new File(file.getPath()+ SaveSession.LOCKFILE_SUFFIX);
+ return lock.exists() ? lock.lastModified() : -1;
+ }
+
+ /**
+ * Check if a lock file exists, and delete it if it does.
+ * @return true if the lock file existed, false otherwise.
+ * @throws IOException if something goes wrong.
+ */
+ public static boolean deleteLockFile(File file) {
+ File lock = new File(file.getPath()+SaveSession.LOCKFILE_SUFFIX);
+ if (!lock.exists()) {
+ return false;
+ }
+ lock.delete();
+ return true;
+ }
}
\ No newline at end of file
import net.sf.jabref.Globals;
import net.sf.jabref.BasePanel;
+import net.sf.jabref.BibtexDatabase;
+
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.JComponent;
import net.sf.jabref.undo.NamedCompound;
* Perform the change. This method is responsible for adding a proper undo edit to
* the NamedCompound, so the change can be undone.
* @param panel BasePanel The tab where the database lives.
+ * @param secondary BibtexDatabase The "tmp" database for which the change
+ * should also be made.
* @param undoEdit NamedCompound The compound to hold the undo edits.
*/
- abstract void makeChange(BasePanel panel, NamedCompound undoEdit);
+ abstract void makeChange(BasePanel panel, BibtexDatabase secondary, NamedCompound undoEdit);
}
import java.awt.event.ActionEvent;
import java.util.Enumeration;
import net.sf.jabref.BasePanel;
+import net.sf.jabref.BibtexDatabase;
import net.sf.jabref.undo.NamedCompound;
public class ChangeDisplayDialog extends JDialog implements TreeSelectionListener {
- DefaultMutableTreeNode root;
+ private BibtexDatabase secondary;
+ DefaultMutableTreeNode root;
JTree tree;
JPanel infoPanel = new JPanel(),
buttonPanel = new JPanel(),
JComponent infoShown = null;
private boolean okPressed = false;
- public ChangeDisplayDialog(JFrame owner, final BasePanel panel, final DefaultMutableTreeNode root) {
+ public ChangeDisplayDialog(JFrame owner, final BasePanel panel,
+ BibtexDatabase secondary, final DefaultMutableTreeNode root) {
super(owner, Globals.lang("External changes"), true);
- this.root = root;
+ this.secondary = secondary;
+
+ // Just to be sure, put in an empty secondary base if none is given:
+ if (secondary == null) {
+ this.secondary = new BibtexDatabase();
+ }
+ this.root = root;
tree = new JTree(root);
tree.addTreeSelectionListener(this);
JSplitPane pane = new JSplitPane();
for (; enumer.hasMoreElements();) {
Change c = (Change)enumer.nextElement();
if (c.isAcceptable() && c.isAccepted())
- c.makeChange(panel, ce);
+ c.makeChange(panel, ChangeDisplayDialog.this.secondary, ce);
}
ce.end();
panel.undoManager.addEdit(ce);
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.Vector;
+import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultMutableTreeNode;
import net.sf.jabref.*;
+import net.sf.jabref.export.FileActions;
+import net.sf.jabref.export.SaveException;
+import net.sf.jabref.export.SaveSession;
import net.sf.jabref.groups.GroupTreeNode;
import net.sf.jabref.imports.OpenDatabaseAction;
import net.sf.jabref.imports.ParserResult;
final double MATCH_THRESHOLD = 0.4;
final String[] sortBy = new String[] {"year", "author", "title" };
File f;
- BibtexDatabase inMem;
- MetaData mdInMem;
+ BibtexDatabase inMem, inTemp = null;
+ MetaData mdInMem, mdInTemp;
BasePanel panel;
JabRefFrame frame;
File tempFile = Globals.fileUpdateMonitor.getTempFile(panel.fileMonitorHandle());
ParserResult pr = OpenDatabaseAction.loadDatabase(tempFile,
Globals.prefs.get("defaultEncoding"));
- BibtexDatabase inTemp = pr.getDatabase();
- MetaData mdInTemp = new MetaData(pr.getMetaData(),inTemp);
+ inTemp = pr.getDatabase();
+ mdInTemp = new MetaData(pr.getMetaData(),inTemp);
// Parse the modified file.
pr = OpenDatabaseAction.loadDatabase(f, Globals.prefs.get("defaultEncoding"));
BibtexDatabase onDisk = pr.getDatabase();
EntrySorter sInMem = inMem.getSorter(comp);
// Start looking at changes.
-
+ scanMetaData(mdInMem, mdInTemp, mdOnDisk);
scanPreamble(inMem, inTemp, onDisk);
scanStrings(inMem, inTemp, onDisk);
}
}
+
public boolean changesFound() {
return changes.getChildCount() > 0;
}
if (changes.getChildCount() > 0) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
- ChangeDisplayDialog dial = new ChangeDisplayDialog(frame, panel, changes);
+ ChangeDisplayDialog dial = new ChangeDisplayDialog(frame, panel, inTemp, changes);
Util.placeDialog(dial, frame);
dial.setVisible(true); // dial.show(); -> deprecated since 1.5
fup.scanResultsResolved(dial.isOkPressed());
+ if (dial.isOkPressed()) {
+ // Overwrite the temp database:
+ storeTempDatabase();
+ }
}
});
}
}
+ private void storeTempDatabase() {
+ new Thread(new Runnable() {
+ public void run() {
+ System.out.println("Storing temp database");
+ try {
+ SaveSession ss = FileActions.saveDatabase(inTemp, mdInTemp,
+ Globals.fileUpdateMonitor.getTempFile(panel.fileMonitorHandle()), Globals.prefs,
+ false, false, panel.getEncoding(), true);
+ ss.commit();
+ System.out.println("done");
+ } catch (SaveException ex) {
+ System.out.println("Problem updating tmp file after accepting external changes");
+ }
+
+
+ }
+ }).start();
+ }
+
+ private void scanMetaData(MetaData inMem, MetaData inTemp, MetaData onDisk) {
+ MetaDataChange mdc = new MetaDataChange(inMem, inTemp);
+ ArrayList<String> handledOnDisk = new ArrayList<String>();
+ // Loop through the metadata entries of the "tmp" database, looking for
+ // matches
+ for (Iterator i = inTemp.iterator(); i.hasNext();) {
+ String key = (String)i.next();
+ // See if the key is missing in the disk database:
+ Vector<String> vod = onDisk.getData(key);
+ if (vod == null) {
+ mdc.insertMetaDataRemoval(key);
+ }
+ else {
+ // Both exist. Check if they are different:
+ Vector<String> vit = inTemp.getData(key);
+ if (!vod.equals(vit))
+ mdc.insertMetaDataChange(key, vod);
+ // Remember that we've handled this one:
+ handledOnDisk.add(key);
+ }
+ }
+
+ // See if there are unhandled keys in the disk database:
+ for (Iterator i = onDisk.iterator(); i.hasNext();) {
+ String key = (String)i.next();
+ if (!handledOnDisk.contains(key)) {
+ mdc.insertMetaDataAddition(key, onDisk.getData(key));
+ }
+ }
+
+ if (mdc.getChangeCount() > 0)
+ changes.add(mdc);
+ }
+
+
private void scanEntries(EntrySorter mem, EntrySorter tmp, EntrySorter disk) {
// Create pointers that are incremented as the entries of each base are used in
HashSet<String> used = new HashSet<String>(disk.getEntryCount());
HashSet<Integer> notMatched = new HashSet<Integer>(tmp.getEntryCount());
- // Loop through the entries of the "mem" database, looking for exact matches in the "disk" one.
+ // Loop through the entries of the "tmp" database, looking for exact matches in the "disk" one.
// We must finish scanning for exact matches before looking for near matches, to avoid an exact
// match being "stolen" from another entry.
mainLoop: for (piv1=0; piv1<tmp.getEntryCount(); piv1++) {
// But they have nonmatching contents, so we've found a change.
BibtexString mem = findString(inMem, tmp.getName(), usedInMem);
if (mem != null)
- changes.add(new StringChange(mem, tmp.getName(),
+ changes.add(new StringChange(mem, tmp, tmp.getName(),
mem.getContent(),
tmp.getContent(), disk.getContent()));
else
- changes.add(new StringChange(null, tmp.getName(), null, tmp.getContent(), disk.getContent()));
+ changes.add(new StringChange(null, tmp, tmp.getName(), null, tmp.getContent(), disk.getContent()));
}
used.add(diskId);
//if (j==piv2)
}
}
- changes.add(new StringNameChange(bsMem, bsMem.getName(),
+ changes.add(new StringNameChange(bsMem, tmp, bsMem.getName(),
tmp.getName(), disk.getName(),
tmp.getContent()));
i.remove();
BibtexString tmp = onTmp.getString(nmId);
BibtexString mem = findString(inMem, tmp.getName(), usedInMem);
if (mem != null) { // The removed string is not removed from the mem version.
- changes.add(new StringRemoveChange(tmp, mem));
+ changes.add(new StringRemoveChange(tmp, tmp, mem));
}
}
}
return;
if ((groupsTmp != null && groupsDisk == null)
|| (groupsTmp == null && groupsDisk != null)) {
- changes.add(new GroupChange(groupsDisk));
+ changes.add(new GroupChange(groupsDisk, groupsTmp));
return;
}
if (groupsTmp.equals(groupsDisk))
return;
- changes.add(new GroupChange(groupsDisk));
+ changes.add(new GroupChange(groupsDisk, groupsTmp));
return;
//
sp = new JScrollPane(pp);
}
- public void makeChange(BasePanel panel, NamedCompound undoEdit) {
+ public void makeChange(BasePanel panel, BibtexDatabase secondary, NamedCompound undoEdit) {
diskEntry.setId(Util.createNeutralId());
panel.database().insertEntry(diskEntry);
+ secondary.insertEntry(diskEntry);
undoEdit.addEdit(new UndoableInsertEntry(panel.database(), diskEntry, panel));
}
if ((tmp != null) && (disk != null)) {
if (!tmp.equals(disk)) {
// Modified externally.
- add(new FieldChange(field, memEntry, mem, tmp, disk));
+ add(new FieldChange(field, memEntry, tmpEntry, mem, tmp, disk));
}
} else if ((tmp == null) && (disk != null) && !disk.equals("")) {
// Added externally.
- add(new FieldChange(field, memEntry, mem, tmp, disk));
+ add(new FieldChange(field, memEntry, tmpEntry, mem, tmp, disk));
} else if ((disk == null) && (tmp != null) && !tmp.equals("")
&& (mem != null) && !mem.equals("")) {
// Deleted externally and not locally.
- add(new FieldChange(field, memEntry, mem, tmp, disk));
+ add(new FieldChange(field, memEntry, tmpEntry, mem, tmp, disk));
}
//Util.pr("Field: "+fld.next());
}
-public void makeChange(BasePanel panel, NamedCompound undoEdit) {
+public void makeChange(BasePanel panel, BibtexDatabase secondary, NamedCompound undoEdit) {
@SuppressWarnings("unchecked")
Enumeration<Change> e = children();
for (; e.hasMoreElements();) {
Change c = e.nextElement();
if (c.isAcceptable() && c.isAccepted())
- c.makeChange(panel, undoEdit);
+ c.makeChange(panel, secondary, undoEdit);
}
/*panel.database().removeEntry(memEntry.getId());
class FieldChange extends Change {
- BibtexEntry entry;
+ BibtexEntry entry, tmpEntry;
String field, inMem, onTmp, onDisk;
InfoPane tp = new InfoPane();
JScrollPane sp = new JScrollPane(tp);
- public FieldChange(String field, BibtexEntry memEntry, String inMem, String onTmp, String onDisk) {
+ public FieldChange(String field, BibtexEntry memEntry, BibtexEntry tmpEntry, String inMem, String onTmp, String onDisk) {
entry = memEntry;
+ this.tmpEntry = tmpEntry;
name = field;
this.field = field;
this.inMem = inMem;
if ((inMem != null) && !inMem.equals(""))
text.append("<H3>").append(Globals.lang("Current value")).append(":</H3>" + " ").append(inMem);
+ if ((onTmp != null) && !onTmp.equals(""))
+ text.append("<H3>").append(Globals.lang("Current tmp value")).append(":</H3>" + " ").append(onTmp);
else {
// No value in memory.
/*if ((onTmp != null) && !onTmp.equals(inMem))
tp.setText(text.toString());
}
- public void makeChange(BasePanel panel, NamedCompound undoEdit) {
+ public void makeChange(BasePanel panel, BibtexDatabase secondary, NamedCompound undoEdit) {
//System.out.println(field+" "+onDisk);
entry.setField(field, onDisk);
undoEdit.addEdit(new UndoableFieldChange(entry, field, inMem, onDisk));
+ tmpEntry.setField(field, onDisk);
}
JComponent description() {
sp = new JScrollPane(pp);
}
- public void makeChange(BasePanel panel, NamedCompound undoEdit) {
+ public void makeChange(BasePanel panel, BibtexDatabase secondary, NamedCompound undoEdit) {
panel.database().removeEntry(memEntry.getId());
undoEdit.addEdit(new UndoableRemoveEntry(panel.database(), memEntry, panel));
+ secondary.removeEntry(tmpEntry.getId());
}
JComponent description() {
}
}
+ /**
+ * Change the stored timestamp for the given file. If the timestamp equals
+ * the file's timestamp on disk, after this call the file will appear to
+ * have been modified. Used if a file has been modified, and the change
+ * scan fails, in order to ensure successive checks.
+ * @param handle the handle to the correct file.
+ */
+ public void perturbTimestamp(String handle) {
+ Object o = entries.get(handle);
+ if (o == null)
+ return;
+ ((Entry)o).timeStamp--;
+ }
+
/**
* Removes a listener from the monitor.
* @param handle String The handle for the listener to remove.
// Globals.prefs.get("tempDir")
//while ((f = File.createTempFile("jabref"+(tmpNum++), null)).exists());
try {
- f = File.createTempFile("jabref", null);
+ f = File.createTempFile("jabref", null);
+ f.deleteOnExit();
//System.out.println(f.getPath());
} catch (IOException ex) {
ex.printStackTrace();
import net.sf.jabref.BasePanel;
import net.sf.jabref.Globals;
+import net.sf.jabref.BibtexDatabase;
import net.sf.jabref.groups.AllEntriesGroup;
import net.sf.jabref.groups.GroupTreeNode;
import net.sf.jabref.groups.UndoableModifySubtree;
public class GroupChange extends Change {
private final GroupTreeNode m_changedGroups;
- public GroupChange(GroupTreeNode changedGroups) {
+ private GroupTreeNode tmpGroupRoot;
+
+ public GroupChange(GroupTreeNode changedGroups, GroupTreeNode tmpGroupRoot) {
super(changedGroups != null ?
"Modified groups tree"
: "Removed all groups"); // JZTODO lyrics
m_changedGroups = changedGroups;
+ this.tmpGroupRoot = tmpGroupRoot;
}
- public void makeChange(BasePanel panel, NamedCompound undoEdit) {
+ public void makeChange(BasePanel panel, BibtexDatabase secondary, NamedCompound undoEdit) {
final GroupTreeNode root = panel.getGroupSelector().getGroupTreeRoot();
final UndoableModifySubtree undo = new UndoableModifySubtree(
panel.getGroupSelector(), root, Globals.lang("Modified groups")); // JZTODO lyrics
}
panel.getGroupSelector().revalidateGroups();
undoEdit.addEdit(undo);
+
+ // Update tmp database:
+ GroupTreeNode copied = m_changedGroups.deepCopy();
+ tmpGroupRoot.removeAllChildren();
+ tmpGroupRoot.setGroup(copied.getGroup());
+ for (int i = 0; i < copied.getChildCount(); ++i)
+ tmpGroupRoot.add(((GroupTreeNode) copied.getChildAt(i)).deepCopy());
+ tmpGroupRoot.refreshGroupsForNewDatabase(secondary);
}
JComponent description() {
--- /dev/null
+package net.sf.jabref.collab;
+
+import net.sf.jabref.BasePanel;
+import net.sf.jabref.BibtexDatabase;
+import net.sf.jabref.MetaData;
+import net.sf.jabref.Globals;
+import net.sf.jabref.undo.NamedCompound;
+
+import javax.swing.*;
+import java.util.Vector;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/**
+ *
+ */
+public class MetaDataChange extends Change {
+
+ static final int
+ ADD = 1,
+ REMOVE = 2,
+ MODIFY = 3;
+
+ InfoPane tp = new InfoPane();
+ JScrollPane sp = new JScrollPane(tp);
+ private MetaData md;
+ private MetaData mdSecondary;
+ ArrayList<MetaDataChangeUnit> changes = new ArrayList<MetaDataChangeUnit>();
+
+ public MetaDataChange(MetaData md, MetaData mdSecondary) {
+ super(Globals.lang("Metadata change"));
+ this.md = md;
+ this.mdSecondary = mdSecondary;
+
+ tp.setText("<html>"+Globals.lang("Metadata change")+"</html>");
+ }
+
+ public int getChangeCount() {
+ return changes.size();
+ }
+
+ public void insertMetaDataAddition(String key, Vector<String> value) {
+ changes.add(new MetaDataChangeUnit(ADD, key, value));
+ }
+
+ public void insertMetaDataRemoval(String key) {
+ changes.add(new MetaDataChangeUnit(REMOVE, key, null));
+ }
+
+ public void insertMetaDataChange(String key, Vector<String> value) {
+ changes.add(new MetaDataChangeUnit(MODIFY, key, value));
+ }
+
+ JComponent description() {
+ StringBuilder sb = new StringBuilder("<html>"+Globals.lang("Changes have been made to the following metadata elements")+":<p>");
+ for (Iterator<MetaDataChangeUnit> iterator = changes.iterator(); iterator.hasNext();) {
+ MetaDataChangeUnit unit = iterator.next();
+ sb.append("<br> ");
+ sb.append(unit.key);
+ /*switch (unit.type) {
+ case ADD:
+ sb.append("<p>Added: "+unit.key);
+ break;
+ case REMOVE:
+ sb.append("<p>Removed: "+unit.key);
+ break;
+ case MODIFY:
+ sb.append("<p>Modified: "+unit.key);
+ break;
+ }*/
+ }
+ sb.append("</html>");
+ tp.setText(sb.toString());
+ return sp;
+ }
+
+ void makeChange(BasePanel panel, BibtexDatabase secondary, NamedCompound undoEdit) {
+ for (Iterator<MetaDataChangeUnit> iterator = changes.iterator(); iterator.hasNext();) {
+ MetaDataChangeUnit unit = iterator.next();
+ switch (unit.type) {
+ case ADD:
+ md.putData(unit.key, unit.value);
+ mdSecondary.putData(unit.key, unit.value);
+ break;
+ case REMOVE:
+ md.remove(unit.key);
+ mdSecondary.remove(unit.key);
+ break;
+ case MODIFY:
+ md.putData(unit.key, unit.value);
+ mdSecondary.putData(unit.key, unit.value);
+ break;
+ }
+ }
+ }
+
+ class MetaDataChangeUnit {
+ int type;
+ String key;
+ Vector<String> value;
+
+ public MetaDataChangeUnit(int type, String key, Vector<String> value) {
+ this.type = type;
+ this.key = key;
+ this.value = value;
+ }
+ }
+}
import net.sf.jabref.BasePanel;
import net.sf.jabref.Globals;
+import net.sf.jabref.BibtexDatabase;
import net.sf.jabref.undo.NamedCompound;
import net.sf.jabref.undo.UndoablePreambleChange;
tp.setText(text.toString());
}
- public void makeChange(BasePanel panel, NamedCompound undoEdit) {
+ public void makeChange(BasePanel panel, BibtexDatabase secondary, NamedCompound undoEdit) {
panel.database().setPreamble(disk);
undoEdit.addEdit(new UndoablePreambleChange(panel.database(), panel, mem, disk));
+ secondary.setPreamble(disk);
}
JComponent description() {
import javax.swing.JComponent;
import javax.swing.JScrollPane;
-import net.sf.jabref.BasePanel;
-import net.sf.jabref.BibtexString;
-import net.sf.jabref.Globals;
-import net.sf.jabref.KeyCollisionException;
+import net.sf.jabref.*;
import net.sf.jabref.undo.NamedCompound;
import net.sf.jabref.undo.UndoableInsertString;
}
- public void makeChange(BasePanel panel, NamedCompound undoEdit) {
+ public void makeChange(BasePanel panel, BibtexDatabase secondary, NamedCompound undoEdit) {
if (panel.database().hasStringLabel(string.getName())) {
// The name to change to is already in the database, so we can't comply.
} catch (KeyCollisionException ex) {
Globals.logger("Error: could not add string '"+string.getName()+"': "+ex.getMessage());
}
-
+ try {
+ secondary.addString(new BibtexString(Util.createNeutralId(), string.getName(),
+ string.getContent()));
+ } catch (KeyCollisionException ex) {
+ Globals.logger("Error: could not add string '"+string.getName()+"' to tmp database: "+ex.getMessage());
+ }
}
InfoPane tp = new InfoPane();
JScrollPane sp = new JScrollPane(tp);
+ private BibtexString tmpString;
- public StringChange(BibtexString string, String label, String mem, String tmp, String disk) {
- name = Globals.lang("Modified string")+": '"+label+"'";
+ public StringChange(BibtexString string, BibtexString tmpString, String label,
+ String mem, String tmp, String disk) {
+ this.tmpString = tmpString;
+ name = Globals.lang("Modified string")+": '"+label+"'";
this.string = string;
this.label = label;
this.mem = mem;
tp.setText(sb.toString());
}
- public void makeChange(BasePanel panel, NamedCompound undoEdit) {
+ public void makeChange(BasePanel panel, BibtexDatabase secondary, NamedCompound undoEdit) {
if (string != null) {
string.setContent(disk);
undoEdit.addEdit(new UndoableStringChange(panel, string, false, mem, disk));
+ // Update tmp databse:
+
} else {
// The string was removed or renamed locally. We guess that it was removed.
String newId = Util.createNeutralId();
Globals.logger("Error: could not add string '"+string.getName()+"': "+ex.getMessage());
}
}
+
+ // Update tmp database:
+ if (tmpString != null) {
+ tmpString.setContent(disk);
+ }
+ else {
+ BibtexString bs = new BibtexString(Util.createNeutralId(), label, disk);
+ secondary.addString(bs);
+ }
}
BibtexString string;
String mem, tmp, disk, content;
+ private BibtexString tmpString;
- public StringNameChange(BibtexString string, String mem, String tmp, String disk, String content) {
- name = Globals.lang("Renamed string")+": '"+tmp+"'";
+ public StringNameChange(BibtexString string, BibtexString tmpString,
+ String mem, String tmp, String disk, String content) {
+ this.tmpString = tmpString;
+ name = Globals.lang("Renamed string")+": '"+tmp+"'";
this.string = string;
this.content = content;
this.mem = mem;
}
- public void makeChange(BasePanel panel, NamedCompound undoEdit) {
+ public void makeChange(BasePanel panel, BibtexDatabase secondary, NamedCompound undoEdit) {
if (panel.database().hasStringLabel(disk)) {
// The name to change to is already in the database, so we can't comply.
Globals.logger("Error: could not add string '"+bs.getName()+"': "+ex.getMessage());
}
}
+
+ // Update tmp database:
+ if (tmpString != null) {
+ tmpString.setName(disk);
+ }
+ else {
+ String newId = Util.createNeutralId();
+ BibtexString bs = new BibtexString(newId, disk, content);
+ secondary.addString(bs);
+ }
}
import net.sf.jabref.BasePanel;
import net.sf.jabref.BibtexString;
import net.sf.jabref.Globals;
+import net.sf.jabref.BibtexDatabase;
import net.sf.jabref.undo.NamedCompound;
import net.sf.jabref.undo.UndoableRemoveString;
InfoPane tp = new InfoPane();
JScrollPane sp = new JScrollPane(tp);
+ private BibtexString tmpString;
- public StringRemoveChange(BibtexString string, BibtexString inMem) {
- name = Globals.lang("Removed string")+": '"+string.getName()+"'";
+ public StringRemoveChange(BibtexString string, BibtexString tmpString, BibtexString inMem) {
+ this.tmpString = tmpString;
+ name = Globals.lang("Removed string")+": '"+string.getName()+"'";
this.string = string;
this.inMem = inMem; // Holds the version in memory. Check if it has been modified...?
}
- public void makeChange(BasePanel panel, NamedCompound undoEdit) {
+ public void makeChange(BasePanel panel, BibtexDatabase secondary, NamedCompound undoEdit) {
try {
panel.database().removeString(inMem.getId());
Globals.logger("Error: could not add string '"+string.getName()+"': "+ex.getMessage());
}
+ // Update tmp database:
+ secondary.removeString(tmpString.getId());
}
}
fw.write("@STRING{" + bs.getName() + " = ");
- if (!bs.getContent().equals(""))
- fw.write((new LatexFieldFormatter()).format(bs.getContent(), Globals.BIBTEX_STRING));
+ if (!bs.getContent().equals("")) {
+ try {
+ String formatted = (new LatexFieldFormatter()).format(bs.getContent(), Globals.BIBTEX_STRING);
+ fw.write(formatted);
+ } catch (IllegalArgumentException ex) {
+ throw new IllegalArgumentException(
+ Globals.lang("The # character is not allowed in BibTeX strings unless escaped as in '\\#'.") + "\n" +
+ Globals.lang("Before saving, please edit any strings containing the # character."));
+ }
+
+ }
else
fw.write("{}");
*/
public class OpenDocumentRepresentation {
protected Collection<BibtexEntry> entries;
+ private BibtexDatabase database;
@SuppressWarnings("unchecked")
- public OpenDocumentRepresentation(BibtexDatabase bibtex, Set<String> keySet) {
+ public OpenDocumentRepresentation(BibtexDatabase database, Set<String> keySet) {
+ this.database = database;
// Make a list of comparators for sorting the entries:
List<FieldComparator> comparators = new ArrayList<FieldComparator>();
comparators.add(new FieldComparator("author"));
// Set up a list of all entries, if keySet==null, or the entries whose
// ids are in keySet, otherwise:
if (keySet == null)
- entryList.addAll(bibtex.getEntries());
+ entryList.addAll(database.getEntries());
else {
for (String key : keySet)
- entryList.add(bibtex.getEntryById(key));
+ entryList.add(database.getEntryById(key));
}
entries = new SortedList(entryList, new FieldComparatorStack(comparators));
}
protected String getField(BibtexEntry e, String field) {
- Object o = e.getField(field);
- return o == null ? "" : o.toString();
+ String s = BibtexDatabase.getResolvedField(field, e, database);
+ return s == null ? "" : s;
}
protected void addTableCell(Document doc, Element parent, String content) {
public class SaveDatabaseAction extends AbstractWorker {
private BasePanel panel;
private JabRefFrame frame;
- private boolean success = false, cancelled = false;
+ private boolean success = false, cancelled = false, fileLockedError = false;
public SaveDatabaseAction(BasePanel panel) {
public void init() throws Throwable {
success = false;
cancelled = false;
+ fileLockedError = false;
if (panel.getFile() == null)
saveAs();
else {
+ // Check for external modifications:
if (panel.isUpdatedExternally() || Globals.fileUpdateMonitor.hasBeenModified(panel.getFileMonitorHandle())) {
String[] opts = new String[]{Globals.lang("Review changes"), Globals.lang("Save"),
(new Thread(new Runnable() {
public void run() {
+
+ if (!Util.waitForFileLock(panel.getFile(), 10)) {
+ // TODO: GUI handling of the situation when the externally modified file keeps being locked.
+ System.err.println("File locked, this will be trouble.");
+ }
+
ChangeScanner scanner = new ChangeScanner(panel.frame(), panel);
scanner.changeScan(panel.getFile());
try {
frame.output(Globals.lang("Saved database") + " '"
+ panel.getFile().getPath() + "'.");
} else if (!cancelled) {
- frame.output(Globals.lang("Save failed"));
+ if (fileLockedError) {
+ // TODO: user should have the option to override the lock file.
+ frame.output(Globals.lang("Could not save, file locked by another JabRef instance."));
+ } else
+ frame.output(Globals.lang("Save failed"));
}
}
// lacking keys, before saving:
panel.autoGenerateKeysBeforeSaving();
- // Now save the database:
- success = saveDatabase(panel.getFile(), false, panel.getEncoding());
-
- //Util.pr("Testing resolve string... BasePanel line 237");
- //Util.pr("Resolve aq: "+database.resolveString("aq"));
- //Util.pr("Resolve text: "+database.resolveForStrings("A text which refers to the string #aq# and #billball#, hurra."));
-
- try {
- Globals.fileUpdateMonitor.updateTimeStamp(panel.getFileMonitorHandle());
- } catch (IllegalArgumentException ex) {
- // This means the file has not yet been registered, which is the case
- // when doing a "Save as". Maybe we should change the monitor so no
- // exception is cast.
+ if (!Util.waitForFileLock(panel.getFile(), 10)) {
+ success = false;
+ fileLockedError = true;
+ }
+ else {
+ // Now save the database:
+ success = saveDatabase(panel.getFile(), false, panel.getEncoding());
+
+ //Util.pr("Testing resolve string... BasePanel line 237");
+ //Util.pr("Resolve aq: "+database.resolveString("aq"));
+ //Util.pr("Resolve text: "+database.resolveForStrings("A text which refers to the string #aq# and #billball#, hurra."));
+
+ try {
+ Globals.fileUpdateMonitor.updateTimeStamp(panel.getFileMonitorHandle());
+ } catch (IllegalArgumentException ex) {
+ // This means the file has not yet been registered, which is the case
+ // when doing a "Save as". Maybe we should change the monitor so no
+ // exception is cast.
+ }
}
panel.setSaving(false);
if (success) {
panel.setUpdatedExternally(false);
}
} catch (SaveException ex2) {
+ if (ex2 == SaveException.FILE_LOCKED) {
+ success =false;
+ fileLockedError = true;
+ return;
+ }
ex2.printStackTrace();
}
}
Globals.lang("Save database"), JOptionPane.ERROR_MESSAGE);
throw new SaveException("rt");
} catch (SaveException ex) {
+ if (ex == SaveException.FILE_LOCKED) {
+ throw ex;
+ }
if (ex.specificEntry()) {
// Error occured during processing of
// be. Highlight it:
package net.sf.jabref.export;
import net.sf.jabref.BibtexEntry;
+import net.sf.jabref.Globals;
/**
{
//~ Instance fields ////////////////////////////////////////////////////////
+ public static final SaveException FILE_LOCKED = new SaveException
+ (Globals.lang("Could not save, file locked by another JabRef instance."));
+
private BibtexEntry entry;
private int status;
//~ Constructors ///////////////////////////////////////////////////////////
*/
public class SaveSession {
+ public static final String LOCKFILE_SUFFIX = ".lock";
+ // The age in ms of a lockfile before JabRef will offer to "steal" the locked file:
+ public static final long LOCKFILE_CRITICAL_AGE = 60000;
+
private static final String TEMP_PREFIX = "jabref";
private static final String TEMP_SUFFIX = "save.bib";
+
File file, tmp, backupFile;
String encoding;
- boolean backup;
+ boolean backup, useLockFile;
VerifyingWriter writer;
public SaveSession(File file, String encoding, boolean backup) throws IOException,
UnsupportedCharsetException {
this.file = file;
tmp = File.createTempFile(TEMP_PREFIX, TEMP_SUFFIX);
+ useLockFile = Globals.prefs.getBoolean("useLockFiles");
this.backup = backup;
this.encoding = encoding;
writer = new VerifyingWriter(new FileOutputStream(tmp), encoding);
}
}
try {
+ if (useLockFile) {
+ try {
+ if (createLockFile()) {
+ // Oops, the lock file already existed. Try to wait it out:
+ if (!Util.waitForFileLock(file, 10))
+ throw SaveException.FILE_LOCKED;
+
+ }
+ } catch (IOException ex) {
+ System.err.println("Error when creating lock file");
+ ex.printStackTrace();
+ }
+ }
+
Util.copyFile(tmp, file, true);
} catch (IOException ex2) {
// If something happens here, what can we do to correct the problem? The file is corrupted, but we still
// repeating the action will have a different result.
// On the other hand, our temporary file should still be clean, and won't be deleted.
throw new SaveException(Globals.lang("Save failed while committing changes")+": "+ex2.getMessage());
+ } finally {
+ if (useLockFile) {
+ try {
+ deleteLockFile();
+ } catch (IOException ex) {
+ System.err.println("Error when deleting lock file");
+ ex.printStackTrace();
+ }
+ }
}
tmp.delete();
tmp.delete();
}
+
+ /**
+ * Check if a lock file exists, and create it if it doesn't.
+ * @return true if the lock file already existed
+ * @throws IOException if something happens during creation.
+ */
+ private boolean createLockFile() throws IOException {
+ File lock = new File(file.getPath()+LOCKFILE_SUFFIX);
+ if (lock.exists()) {
+ return true;
+ }
+ FileOutputStream out = new FileOutputStream(lock);
+ out.write(0);
+ try {
+ out.close();
+ } catch (IOException ex) {
+ System.err.println("Error when creating lock file");
+ ex.printStackTrace();
+ }
+ lock.deleteOnExit();
+ return false;
+ }
+
+ /**
+ * Check if a lock file exists, and delete it if it does.
+ * @return true if the lock file existed, false otherwise.
+ * @throws IOException if something goes wrong.
+ */
+ private boolean deleteLockFile() throws IOException {
+ File lock = new File(file.getPath()+LOCKFILE_SUFFIX);
+ if (!lock.exists()) {
+ return false;
+ }
+ lock.delete();
+ return true;
+ }
+
public File getTemporaryFile() {
return tmp;
}
* Main class for formatting DOCUMENT ME!
*
* @author $author$
- * @version $Revision: 3018 $
+ * @version $Revision: 3092 $
*/
public class Layout
{
}
}
+ public void setPostFormatter(LayoutFormatter formatter) {
+ for (int i = 0; i < layoutEntries.length; i++) {
+ LayoutEntry layoutEntry = layoutEntries[i];
+ layoutEntry.setPostFormatter(formatter);
+ }
+ }
+
/**
* Returns the processed bibtex entry. If the database argument is
* null, no string references will be resolved. Otherwise all valid
* DOCUMENT ME!
*
* @author $author$
- * @version $Revision: 3018 $
+ * @version $Revision: 3092 $
*/
public class LayoutEntry {
// ~ Instance fields
private LayoutFormatter[] option;
+ // Formatter to be run after other formatters:
+ private LayoutFormatter postFormatter = null;
+
private String text;
private LayoutEntry[] layoutEntries;
}
+ public void setPostFormatter(LayoutFormatter formatter) {
+ this.postFormatter = formatter;
+ }
+
public String doLayout(BibtexEntry bibtex, BibtexDatabase database) {
switch (type) {
}
}
+ // If a post formatter has been set, call it:
+ if (postFormatter != null)
+ fieldEntry = postFormatter.format(fieldEntry);
+
return fieldEntry;
}
case LayoutHelper.IS_ENCODING_NAME: {
field = option[i].format(field);
}
}
+ // If a post formatter has been set, call it:
+ if (postFormatter != null)
+ field = postFormatter.format(field);
return field;
} else if (type == LayoutHelper.IS_ENCODING_NAME) {
--- /dev/null
+package net.sf.jabref.export.layout.format;
+
+import net.sf.jabref.export.layout.ParamLayoutFormatter;
+
+/**
+ * Layout formatter that puts in a default value (given as argument) if the field is empty.
+ * Empty means null or an empty string.
+ */
+public class Default implements ParamLayoutFormatter {
+
+ String defValue = "";
+
+ public void setArgument(String arg) {
+ this.defValue = arg;
+ }
+
+ public String format(String fieldText) {
+ return fieldText != null && (fieldText.length() > 0) ? fieldText : defValue;
+ }
+}
// HTML special characters without names (UNICODE Latin Extended-A),
// indicated by UNICODE number
- CHARS.put("=A", "Ā"); // "Amacr"
- CHARS.put("=a", "ā"); // "amacr"
- CHARS.put("uA", "Ă"); // "Abreve"
- CHARS.put("ua", "ă"); // "abreve"
- CHARS.put("kA", "Ą"); // "Aogon"
- CHARS.put("ka", "ą"); // "aogon"
- CHARS.put("'C", "Ć"); // "Cacute"
- CHARS.put("'c", "ć"); // "cacute"
- CHARS.put("^C", "Ĉ"); // "Ccirc"
- CHARS.put("^c", "ĉ"); // "ccirc"
- CHARS.put(".C", "Ċ"); // "Cdot"
- CHARS.put(".c", "ċ"); // "cdot"
- CHARS.put("vC", "Č"); // "Ccaron"
- CHARS.put("vc", "č"); // "ccaron"
- CHARS.put("vD", "Ď"); // "Dcaron"
+ CHARS.put("=A", "Ā"); // "Amacr"
+ CHARS.put("=a", "ā"); // "amacr"
+ CHARS.put("uA", "Ă"); // "Abreve"
+ CHARS.put("ua", "ă"); // "abreve"
+ CHARS.put("kA", "Ą"); // "Aogon"
+ CHARS.put("ka", "ą"); // "aogon"
+ CHARS.put("'C", "Ć"); // "Cacute"
+ CHARS.put("'c", "ć"); // "cacute"
+ CHARS.put("^C", "Ĉ"); // "Ccirc"
+ CHARS.put("^c", "ĉ"); // "ccirc"
+ CHARS.put(".C", "Ċ"); // "Cdot"
+ CHARS.put(".c", "ċ"); // "cdot"
+ CHARS.put("vC", "Č"); // "Ccaron"
+ CHARS.put("vc", "č"); // "ccaron"
+ CHARS.put("vD", "Ď"); // "Dcaron"
// Symbol #271 (d�) has no special Latex command
- CHARS.put("DJ", "Đ"); // "Dstrok"
- CHARS.put("dj", "đ"); // "dstrok"
- CHARS.put("=E", "Ē"); // "Emacr"
- CHARS.put("=e", "ē"); // "emacr"
- CHARS.put("uE", "Ĕ"); // "Ebreve"
- CHARS.put("ue", "ĕ"); // "ebreve"
- CHARS.put(".E", "Ė"); // "Edot"
- CHARS.put(".e", "ė"); // "edot"
- CHARS.put("kE", "Ę"); // "Eogon"
- CHARS.put("ke", "ę"); // "eogon"
- CHARS.put("vE", "Ě"); // "Ecaron"
- CHARS.put("ve", "ě"); // "ecaron"
- CHARS.put("^G", "Ĝ"); // "Gcirc"
- CHARS.put("^g", "ĝ"); // "gcirc"
- CHARS.put("uG", "Ğ"); // "Gbreve"
- CHARS.put("ug", "ğ"); // "gbreve"
- CHARS.put(".G", "Ġ"); // "Gdot"
- CHARS.put(".g", "ġ"); // "gdot"
- CHARS.put("cG", "Ģ"); // "Gcedil"
- CHARS.put("'g", "ģ"); // "gacute"
- CHARS.put("^H", "Ĥ"); // "Hcirc"
- CHARS.put("^h", "ĥ"); // "hcirc"
- CHARS.put("Hstrok", "Ħ"); // "Hstrok"
- CHARS.put("hstrok", "ħ"); // "hstrok"
- CHARS.put("~I", "Ĩ"); // "Itilde"
- CHARS.put("~i", "ĩ"); // "itilde"
- CHARS.put("=I", "Ī"); // "Imacr"
- CHARS.put("=i", "ī"); // "imacr"
- CHARS.put("uI", "Ĭ"); // "Ibreve"
- CHARS.put("ui", "ĭ"); // "ibreve"
- CHARS.put("kI", "Į"); // "Iogon"
- CHARS.put("ki", "į"); // "iogon"
- CHARS.put(".I", "İ"); // "Idot"
- CHARS.put("i", "ı"); // "inodot"
+ CHARS.put("DJ", "Đ"); // "Dstrok"
+ CHARS.put("dj", "đ"); // "dstrok"
+ CHARS.put("=E", "Ē"); // "Emacr"
+ CHARS.put("=e", "ē"); // "emacr"
+ CHARS.put("uE", "Ĕ"); // "Ebreve"
+ CHARS.put("ue", "ĕ"); // "ebreve"
+ CHARS.put(".E", "Ė"); // "Edot"
+ CHARS.put(".e", "ė"); // "edot"
+ CHARS.put("kE", "Ę"); // "Eogon"
+ CHARS.put("ke", "ę"); // "eogon"
+ CHARS.put("vE", "Ě"); // "Ecaron"
+ CHARS.put("ve", "ě"); // "ecaron"
+ CHARS.put("^G", "Ĝ"); // "Gcirc"
+ CHARS.put("^g", "ĝ"); // "gcirc"
+ CHARS.put("uG", "Ğ"); // "Gbreve"
+ CHARS.put("ug", "ğ"); // "gbreve"
+ CHARS.put(".G", "Ġ"); // "Gdot"
+ CHARS.put(".g", "ġ"); // "gdot"
+ CHARS.put("cG", "Ģ"); // "Gcedil"
+ CHARS.put("'g", "ģ"); // "gacute"
+ CHARS.put("^H", "Ĥ"); // "Hcirc"
+ CHARS.put("^h", "ĥ"); // "hcirc"
+ CHARS.put("Hstrok", "Ħ"); // "Hstrok"
+ CHARS.put("hstrok", "ħ"); // "hstrok"
+ CHARS.put("~I", "Ĩ"); // "Itilde"
+ CHARS.put("~i", "ĩ"); // "itilde"
+ CHARS.put("=I", "Ī"); // "Imacr"
+ CHARS.put("=i", "ī"); // "imacr"
+ CHARS.put("uI", "Ĭ"); // "Ibreve"
+ CHARS.put("ui", "ĭ"); // "ibreve"
+ CHARS.put("kI", "Į"); // "Iogon"
+ CHARS.put("ki", "į"); // "iogon"
+ CHARS.put(".I", "İ"); // "Idot"
+ CHARS.put("i", "ı"); // "inodot"
// Symbol #306 (IJ) has no special Latex command
// Symbol #307 (ij) has no special Latex command
- CHARS.put("^J", "Ĵ"); // "Jcirc"
- CHARS.put("^j", "ĵ"); // "jcirc"
- CHARS.put("cK", "Ķ"); // "Kcedil"
- CHARS.put("ck", "ķ"); // "kcedil"
+ CHARS.put("^J", "Ĵ"); // "Jcirc"
+ CHARS.put("^j", "ĵ"); // "jcirc"
+ CHARS.put("cK", "Ķ"); // "Kcedil"
+ CHARS.put("ck", "ķ"); // "kcedil"
// Symbol #312 (k) has no special Latex command
- CHARS.put("'L", "Ĺ"); // "Lacute"
- CHARS.put("'l", "ĺ"); // "lacute"
- CHARS.put("cL", "Ļ"); // "Lcedil"
- CHARS.put("cl", "ļ"); // "lcedil"
+ CHARS.put("'L", "Ĺ"); // "Lacute"
+ CHARS.put("'l", "ĺ"); // "lacute"
+ CHARS.put("cL", "Ļ"); // "Lcedil"
+ CHARS.put("cl", "ļ"); // "lcedil"
// Symbol #317 (L�) has no special Latex command
// Symbol #318 (l�) has no special Latex command
- CHARS.put("Lmidot", "Ŀ"); // "Lmidot"
- CHARS.put("lmidot", "ŀ"); // "lmidot"
- CHARS.put("L", "Ł"); // "Lstrok"
- CHARS.put("l", "ł"); // "lstrok"
- CHARS.put("'N", "Ń"); // "Nacute"
- CHARS.put("'n", "ń"); // "nacute"
- CHARS.put("cN", "Ņ"); // "Ncedil"
- CHARS.put("cn", "ņ"); // "ncedil"
- CHARS.put("vN", "Ň"); // "Ncaron"
- CHARS.put("vn", "ň"); // "ncaron"
+ CHARS.put("Lmidot", "Ŀ"); // "Lmidot"
+ CHARS.put("lmidot", "ŀ"); // "lmidot"
+ CHARS.put("L", "Ł"); // "Lstrok"
+ CHARS.put("l", "ł"); // "lstrok"
+ CHARS.put("'N", "Ń"); // "Nacute"
+ CHARS.put("'n", "ń"); // "nacute"
+ CHARS.put("cN", "Ņ"); // "Ncedil"
+ CHARS.put("cn", "ņ"); // "ncedil"
+ CHARS.put("vN", "Ň"); // "Ncaron"
+ CHARS.put("vn", "ň"); // "ncaron"
// Symbol #329 (�n) has no special Latex command
- CHARS.put("NG", "Ŋ"); // "ENG"
- CHARS.put("ng", "ŋ"); // "eng"
- CHARS.put("=O", "Ō"); // "Omacr"
- CHARS.put("=o", "ō"); // "omacr"
- CHARS.put("uO", "Ŏ"); // "Obreve"
- CHARS.put("uo", "ŏ"); // "obreve"
- CHARS.put("HO", "Ő"); // "Odblac"
- CHARS.put("Ho", "ő"); // "odblac"
- CHARS.put("OE", "Œ"); // "OElig"
- CHARS.put("oe", "œ"); // "oelig"
- CHARS.put("'R", "Ŕ"); // "Racute"
- CHARS.put("'r", "ŕ"); // "racute"
- CHARS.put("cR", "Ŗ"); // "Rcedil"
- CHARS.put("cr", "ŗ"); // "rcedil"
- CHARS.put("vR", "Ř"); // "Rcaron"
- CHARS.put("vr", "ř"); // "rcaron"
- CHARS.put("'S", "Ś"); // "Sacute"
- CHARS.put("'s", "ś"); // "sacute"
- CHARS.put("^S", "Ŝ"); // "Scirc"
- CHARS.put("^s", "ŝ"); // "scirc"
- CHARS.put("cS", "Ş"); // "Scedil"
- CHARS.put("cs", "ş"); // "scedil"
- CHARS.put("vS", "Š"); // "Scaron"
- CHARS.put("vs", "š"); // "scaron"
- CHARS.put("cT", "Ţ"); // "Tcedil"
- CHARS.put("ct", "ţ"); // "tcedil"
- CHARS.put("vT", "Ť"); // "Tcaron"
+ CHARS.put("NG", "Ŋ"); // "ENG"
+ CHARS.put("ng", "ŋ"); // "eng"
+ CHARS.put("=O", "Ō"); // "Omacr"
+ CHARS.put("=o", "ō"); // "omacr"
+ CHARS.put("uO", "Ŏ"); // "Obreve"
+ CHARS.put("uo", "ŏ"); // "obreve"
+ CHARS.put("HO", "Ő"); // "Odblac"
+ CHARS.put("Ho", "ő"); // "odblac"
+ CHARS.put("OE", "Œ"); // "OElig"
+ CHARS.put("oe", "œ"); // "oelig"
+ CHARS.put("'R", "Ŕ"); // "Racute"
+ CHARS.put("'r", "ŕ"); // "racute"
+ CHARS.put("cR", "Ŗ"); // "Rcedil"
+ CHARS.put("cr", "ŗ"); // "rcedil"
+ CHARS.put("vR", "Ř"); // "Rcaron"
+ CHARS.put("vr", "ř"); // "rcaron"
+ CHARS.put("'S", "Ś"); // "Sacute"
+ CHARS.put("'s", "ś"); // "sacute"
+ CHARS.put("^S", "Ŝ"); // "Scirc"
+ CHARS.put("^s", "ŝ"); // "scirc"
+ CHARS.put("cS", "Ş"); // "Scedil"
+ CHARS.put("cs", "ş"); // "scedil"
+ CHARS.put("vS", "Š"); // "Scaron"
+ CHARS.put("vs", "š"); // "scaron"
+ CHARS.put("cT", "Ţ"); // "Tcedil"
+ CHARS.put("ct", "ţ"); // "tcedil"
+ CHARS.put("vT", "Ť"); // "Tcaron"
// Symbol #357 (t�) has no special Latex command
- CHARS.put("Tstrok", "Ŧ"); // "Tstrok"
- CHARS.put("tstrok", "ŧ"); // "tstrok"
- CHARS.put("~U", "Ũ"); // "Utilde"
- CHARS.put("~u", "ũ"); // "utilde"
- CHARS.put("=U", "Ū"); // "Umacr"
- CHARS.put("=u", "ū"); // "umacr"
- CHARS.put("uU", "Ŭ"); // "Ubreve"
- CHARS.put("uu", "ŭ"); // "ubreve"
- CHARS.put("rU", "Ů"); // "Uring"
- CHARS.put("ru", "ů"); // "uring"
- CHARS.put("HU", "Ű"); // "Odblac"
- CHARS.put("Hu", "ű"); // "odblac"
- CHARS.put("kU", "Ų"); // "Uogon"
- CHARS.put("ku", "ų"); // "uogon"
- CHARS.put("^W", "Ŵ"); // "Wcirc"
- CHARS.put("^w", "ŵ"); // "wcirc"
- CHARS.put("^Y", "Ŷ"); // "Ycirc"
- CHARS.put("^y", "ŷ"); // "ycirc"
- CHARS.put("\"Y", "Ÿ"); // "Yuml"
- CHARS.put("'Z", "Ź"); // "Zacute"
- CHARS.put("'z", "ź"); // "zacute"
- CHARS.put(".Z", "Ż"); // "Zdot"
- CHARS.put(".z", "ż"); // "zdot"
- CHARS.put("vZ", "Ž"); // "Zcaron"
- CHARS.put("vz", "ž"); // "zcaron"
+ CHARS.put("Tstrok", "Ŧ"); // "Tstrok"
+ CHARS.put("tstrok", "ŧ"); // "tstrok"
+ CHARS.put("~U", "Ũ"); // "Utilde"
+ CHARS.put("~u", "ũ"); // "utilde"
+ CHARS.put("=U", "Ū"); // "Umacr"
+ CHARS.put("=u", "ū"); // "umacr"
+ CHARS.put("uU", "Ŭ"); // "Ubreve"
+ CHARS.put("uu", "ŭ"); // "ubreve"
+ CHARS.put("rU", "Ů"); // "Uring"
+ CHARS.put("ru", "ů"); // "uring"
+ CHARS.put("HU", "ů"); // "Odblac"
+ CHARS.put("Hu", "ű"); // "odblac"
+ CHARS.put("kU", "Ų"); // "Uogon"
+ CHARS.put("ku", "ų"); // "uogon"
+ CHARS.put("^W", "Ŵ"); // "Wcirc"
+ CHARS.put("^w", "ŵ"); // "wcirc"
+ CHARS.put("^Y", "Ŷ"); // "Ycirc"
+ CHARS.put("^y", "ŷ"); // "ycirc"
+ CHARS.put("\"Y", "Ÿ"); // "Yuml"
+ CHARS.put("'Z", "Ź"); // "Zacute"
+ CHARS.put("'z", "ź"); // "zacute"
+ CHARS.put(".Z", "Ż"); // "Zdot"
+ CHARS.put(".z", "ż"); // "zdot"
+ CHARS.put("vZ", "Ž"); // "Zcaron"
+ CHARS.put("vz", "ž"); // "zcaron"
// Symbol #383 (f) has no special Latex command
CHARS.put("%", "%"); // percent sign
}
/**
* This formatter escapes characters so they are suitable for HTML.
*
- * @version $Revision: 2568 $ ($Date: 2008-01-15 18:40:26 +0100 (Tue, 15 Jan 2008) $)
+ * @version $Revision: 3128 $ ($Date: 2009-11-01 11:38:08 +0100 (Sun, 01 Nov 2009) $)
*/
public class HTMLChars implements LayoutFormatter {
public String format(String field) {
int i;
- field = field.replaceAll("&|\\\\&", "&").replaceAll("[\\n]{1,}", "<p>");
+ field = field.replaceAll("&|\\\\&", "&").replaceAll("[\\n]{2,}", "<p>")
+ .replaceAll("\\n", "<br>");
StringBuffer sb = new StringBuffer();
StringBuffer currentCommand = null;
String[] pageParts = s.split("[\\-]+");
if (pageParts.length == 2)
return pageParts[1];
- else return "";
+ // If we didn't get two parts, it may be that only the number of pages is given.
+ // Return the first part:
+ else return pageParts[0];
+ //else return "";
}
}
\ No newline at end of file
*
* 3.) Replace emph and textit and textbf with their RTF replacements.
*
- * 4.) Take special care to save all unicode characters correctly.
+ * 4.) Take special care to save all unicode characters correctly.
+ *
+ * 5.) Replace --- by \emdash and -- by \endash.
*
* @author $Author: mortenalver $
- * @version $Revision: 2568 $ ($Date: 2008-01-15 18:40:26 +0100 (Tue, 15 Jan 2008) $)
+ * @version $Revision: 3094 $ ($Date: 2009-10-07 22:27:27 +0200 (Wed, 07 Oct 2009) $)
*
*/
public class RTFChars implements LayoutFormatter {
sb.append("\\u").append((long) c).append('?');
}
- return sb.toString();
+ return sb.toString().replaceAll("---", "{\\\\emdash}").replaceAll("--", "{\\\\endash}");
}
private IntAndString getPart(String text, int i) {
* must exist).
*
* @author $Author: mortenalver $
- * @version $Revision: 2973 $ ($Date: 2009-04-29 22:09:09 +0200 (Wed, 29 Apr 2009) $)
+ * @version $Revision: 3047 $ ($Date: 2009-08-21 18:32:56 +0200 (Fri, 21 Aug 2009) $)
*/
public class ResolvePDF implements LayoutFormatter {
--- /dev/null
+package net.sf.jabref.external;
+
+import net.sf.jabref.BibtexEntry;
+import net.sf.jabref.GUIGlobals;
+import net.sf.jabref.Util;
+import net.sf.jabref.BasePanel;
+import net.sf.jabref.gui.FileListTableModel;
+
+import java.awt.datatransfer.StringSelection;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ *
+ */
+public class TransferableFileLinkSelection implements Transferable {
+
+ List<File> fileList = new ArrayList<File>();
+
+ public TransferableFileLinkSelection(BasePanel panel, BibtexEntry[] selection) {
+ String s = selection[0].getField(GUIGlobals.FILE_FIELD);
+ FileListTableModel tm = new FileListTableModel();
+ if (s != null)
+ tm.setContent(s);
+ if (tm.getRowCount() > 0) {
+ // Find the default directory for this field type, if any:
+ String dir = panel.metaData().getFileDirectory(GUIGlobals.FILE_FIELD);
+ // Include the standard "file" directory:
+ String fileDir = panel.metaData().getFileDirectory(GUIGlobals.FILE_FIELD);
+ // Include the directory of the bib file:
+ String[] dirs;
+ if (panel.metaData().getFile() != null) {
+ String databaseDir = panel.metaData().getFile().getParent();
+ dirs = new String[] { dir, fileDir, databaseDir };
+ }
+ else
+ dirs = new String[] { dir, fileDir };
+ File expLink = Util.expandFilename(tm.getEntry(0).getLink(), dirs);
+ fileList.add(expLink);
+
+ }
+
+ }
+
+ public DataFlavor[] getTransferDataFlavors() {
+ return new DataFlavor[] {DataFlavor.javaFileListFlavor};//, DataFlavor.stringFlavor};
+ }
+
+ public boolean isDataFlavorSupported(DataFlavor dataFlavor) {
+ System.out.println("Query: "+dataFlavor.getHumanPresentableName()+" , "+
+ dataFlavor.getDefaultRepresentationClass()+" , "+dataFlavor.getMimeType());
+ return dataFlavor.equals(DataFlavor.javaFileListFlavor)
+ || dataFlavor.equals(DataFlavor.stringFlavor);
+ }
+
+ public Object getTransferData(DataFlavor dataFlavor) throws UnsupportedFlavorException, IOException {
+ //if (dataFlavor.equals(DataFlavor.javaFileListFlavor))
+ return fileList;
+ //else
+ // return "test";
+ }
+ /*
+ private StringSelection ss;
+
+ public TransferableFileLinkSelection(BasePanel panel, BibtexEntry[] selection) {
+ String s = selection[0].getField(GUIGlobals.FILE_FIELD);
+ FileListTableModel tm = new FileListTableModel();
+ if (s != null)
+ tm.setContent(s);
+ if (tm.getRowCount() > 0) {
+ // Find the default directory for this field type, if any:
+ String dir = panel.metaData().getFileDirectory(GUIGlobals.FILE_FIELD);
+ // Include the standard "file" directory:
+ String fileDir = panel.metaData().getFileDirectory(GUIGlobals.FILE_FIELD);
+ // Include the directory of the bib file:
+ String[] dirs;
+ if (panel.metaData().getFile() != null) {
+ String databaseDir = panel.metaData().getFile().getParent();
+ dirs = new String[] { dir, fileDir, databaseDir };
+ }
+ else
+ dirs = new String[] { dir, fileDir };
+ System.out.println(tm.getEntry(0).getLink());
+ for (int i = 0; i < dirs.length; i++) {
+ String dir1 = dirs[i];
+ System.out.println("dir:"+dir1);
+ }
+ File expLink = Util.expandFilename(tm.getEntry(0).getLink(), dirs);
+ try {
+ System.out.println(expLink.toURI().toURL().toString());
+ ss = new StringSelection(expLink.toURI().toURL().toString());
+
+ } catch (MalformedURLException ex) {
+ ss = new StringSelection("");
+ }
+ }
+ else
+ ss = new StringSelection("");
+
+ }
+
+ public Transferable getTransferable() {
+ return ss;
+ } */
+}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashSet;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Set;
import javax.swing.*;
import javax.swing.event.CaretEvent;
import net.sf.jabref.JabRefFrame;
import net.sf.jabref.Util;
import net.sf.jabref.undo.NamedCompound;
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.builder.ButtonBarBuilder;
+import com.jgoodies.forms.layout.FormLayout;
/**
* Dialog for creating or modifying groups. Operates directly on the Vector
deliminator = new JTextField(60);
JLabel nf = new JLabel(Globals.lang("Field to group by") + ":"),
nr = new JLabel(Globals.lang("Characters to ignore") + ":");
+ JRadioButton
+ keywords = new JRadioButton(Globals.lang("Generate groups from keywords in a BibTeX field")),
+ authors = new JRadioButton(Globals.lang("Generate groups for author last names")),
+ editors = new JRadioButton(Globals.lang("Generate groups for editor last names"));
JCheckBox nd = new JCheckBox(Globals.lang(
"Use the following delimiter character(s)")
+ ":"); // JZTODO lyrics
GroupTreeNode autoGroupsRoot = new GroupTreeNode(
new ExplicitGroup(Globals.lang("Automatically created groups"),
AbstractGroup.INCLUDING));
- HashSet<String> hs = null;
- if (nd.isSelected()) {
- hs = Util
- .findDeliminatedWordsInField(panel.getDatabase(),
- field().toLowerCase().trim(), deliminator
- .getText());
- } else {
- hs = Util.findAllWordsInField(panel.getDatabase(), field()
- .toLowerCase().trim(), remove());
+ Set<String> hs = null;
+ String field = field();
+ if (keywords.isSelected()) {
+ if (nd.isSelected()) {
+ hs = Util
+ .findDeliminatedWordsInField(panel.getDatabase(),
+ field().toLowerCase().trim(), deliminator
+ .getText());
+ } else {
+ hs = Util.findAllWordsInField(panel.getDatabase(),
+ field().toLowerCase().trim(), remove());
+
+ }
+ }
+ else if (authors.isSelected()) {
+ List<String> fields = new ArrayList<String>(2);
+ fields.add("author");
+ hs = Util.findAuthorLastNames(panel.getDatabase(), fields);
+ field = "author";
}
+ else if (editors.isSelected()) {
+ List<String> fields = new ArrayList<String>(2);
+ fields.add("editor");
+ hs = Util.findAuthorLastNames(panel.getDatabase(), fields);
+ field = "editor";
+ }
+
for (String keyword : hs){
- KeywordGroup group = new KeywordGroup(keyword, field(),
+ KeywordGroup group = new KeywordGroup(keyword, field,
keyword, false, false, AbstractGroup.INDEPENDENT);
autoGroupsRoot.add(new GroupTreeNode(group));
}
InputMap im = main.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
im.put(frame.prefs().getKey("Close dialog"), "close");
am.put("close", cancelAction);
+
+ ButtonGroup bg = new ButtonGroup();
+ bg.add(keywords);
+ bg.add(authors);
+ bg.add(editors);
+ keywords.setSelected(true);
+ DefaultFormBuilder b = new DefaultFormBuilder(new FormLayout
+ ("left:20dlu, 4dlu, left:pref, 4dlu, fill:60dlu, 4dlu, fill:0dlu", ""), main);
+ b.append(keywords, 5);
+ b.nextLine();
+ b.append(new JPanel());
+ b.append(Globals.lang("Field to group by")+":");
+ b.append(field);
+ b.nextLine();
+ b.append(new JPanel());
+ b.append(Globals.lang("Characters to ignore")+":");
+ b.append(remove);
+ b.nextLine();
+ b.append(new JPanel());
+ b.append(nd);
+ b.append(deliminator);
+ b.nextLine();
+ b.append(authors, 5);
+ b.nextLine();
+ b.append(editors, 5);
+ b.nextLine();
+
+ ButtonBarBuilder bb = new ButtonBarBuilder(opt);
+ bb.addGlue();
+ bb.addGridded(ok);
+ bb.addGridded(cancel);
+ bb.addGlue();
+
+
// Layout starts here.
- main.setLayout(gbl);
+ /*main.setLayout(gbl);
opt.setLayout(gbl);
main.setBorder(BorderFactory.createTitledBorder(BorderFactory
.createEtchedBorder(), Globals.lang("Group properties")));
con.anchor = GridBagConstraints.WEST;
con.gridwidth = GridBagConstraints.REMAINDER;
gbl.setConstraints(cancel, con);
- opt.add(cancel);
+ opt.add(cancel);*/
+ main.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
+ opt.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
getContentPane().add(main, BorderLayout.CENTER);
getContentPane().add(opt, BorderLayout.SOUTH);
// pack();
updateComponents();
- setSize(400, 200);
+ pack();
Util.placeDialog(this, frame);
}
package net.sf.jabref.groups;
-import java.awt.datatransfer.Clipboard;
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
-import java.awt.datatransfer.UnsupportedFlavorException;
+import java.awt.datatransfer.*;
import java.awt.dnd.DnDConstants;
import java.awt.event.InputEvent;
+import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import net.sf.jabref.JabRefFrame;
import net.sf.jabref.external.DroppedFileHandler;
import net.sf.jabref.external.ExternalFileType;
+import net.sf.jabref.external.TransferableFileLinkSelection;
import net.sf.jabref.gui.MainTable;
+import net.sf.jabref.gui.MainTableFormat;
import net.sf.jabref.imports.ImportMenuItem;
import net.sf.jabref.imports.OpenDatabaseAction;
import net.sf.jabref.imports.ParserResult;
* This method is called when dragging stuff *from* the table.
*/
public Transferable createTransferable(JComponent c) {
- /* so we can assume it will never be called if entryTable==null: */
- return new TransferableEntrySelection(entryTable.getSelectedEntries());
+ if (!draggingFile) {
+ /* so we can assume it will never be called if entryTable==null: */
+ return new TransferableEntrySelection(entryTable.getSelectedEntries());
+ }
+ else {
+ draggingFile = false;
+ return (new TransferableFileLinkSelection
+ (panel, entryTable.getSelectedEntries()));//.getTransferable();
+ }
}
/**
// nope, never heard of this type
return false;
}
+ boolean draggingFile = false;
public void exportAsDrag(JComponent comp, InputEvent e, int action) {
- // action is always LINK
- /* TODO: add support for dragging file link from table icon into other apps
+ /* TODO: add support for dragging file link from table icon into other apps */
if (e instanceof MouseEvent) {
MouseEvent me = (MouseEvent)e;
int col = entryTable.columnAtPoint(me.getPoint());
// We have an icon column:
if (res == MainTableFormat.FILE) {
System.out.println("dragging file");
+ draggingFile = true;
}
- }*/
+ }
super.exportAsDrag(comp, e, DnDConstants.ACTION_LINK);
}
// add-ons -----------------------
protected boolean handleDropTransfer(String dropStr, final int dropRow) throws IOException {
- if (dropStr.startsWith("file:")) {
+ if (dropStr.startsWith("file:")) {
// This appears to be a dragged file link and not a reference
// format. Check if we can map this to a set of files:
if (handleDraggedFilenames(dropStr, dropRow))
package net.sf.jabref.groups;
-import java.awt.Color;
-import java.awt.Component;
+import java.awt.*;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
* @author jzieren
*/
public class GroupTreeCellRenderer extends DefaultTreeCellRenderer {
+
+ public static final int MAX_DISPLAYED_LETTERS = 35;
+
/** The cell over which the user is currently dragging */
protected Object highlight1Cell = null;
protected Object[] highlight2Cells = null;
if (group == null || !(c instanceof JLabel))
return c; // sanity check
JLabel label = (JLabel) c;
+
if (highlightBorderCell != null && highlightBorderCell == value)
label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
else
}
}
}
+ String name = group.getName();
+ if (name.length() > MAX_DISPLAYED_LETTERS)
+ name = name.substring(0, MAX_DISPLAYED_LETTERS-2)+"...";
StringBuffer sb = new StringBuffer();
sb.append("<html>");
if (red)
sb.append("<u>");
if (italics)
sb.append("<i>");
- sb.append(Util.quoteForHTML(group.getName()));
+ sb.append(Util.quoteForHTML(name));
if (italics)
sb.append("</i>");
if (underline)
sb.append("</font>");
sb.append("</html>");
final String text = sb.toString();
+
if (!label.getText().equals(text))
label.setText(text);
label.setToolTipText("<html>" + group.getShortDescription() + "</html>");
protected void compilePattern() throws IllegalArgumentException,
PatternSyntaxException {
- m_pattern = m_caseSensitive ? Pattern.compile(m_searchExpression)
- : Pattern.compile(m_searchExpression, Pattern.CASE_INSENSITIVE);
+ m_pattern = m_caseSensitive ? Pattern.compile("\\b"+m_searchExpression+"\\b")
+ : Pattern.compile("\\b"+m_searchExpression+"\\b", Pattern.CASE_INSENSITIVE);
}
/**
if (m_regExp)
return m_pattern.matcher(content).find();
if (m_caseSensitive)
- return content.indexOf(m_searchExpression) >= 0;
- content = content.toLowerCase();
- return content.indexOf(m_searchExpression.toLowerCase()) >= 0;
+ return containsWord(m_searchExpression, content);
+ return containsWord(m_searchExpression.toLowerCase(), content.toLowerCase());
}
+ /**
+ * Look for the given non-regexp string in another string, but check whether a
+ * match concerns a complete word, not part of a word.
+ * @param word The word to look for.
+ * @param text The string to look in.
+ * @return true if the word was found, false otherwise.
+ */
+ private static boolean containsWord(String word, String text) {
+ int piv = 0;
+ while (piv < text.length()) {
+ int ind = text.indexOf(word, piv);
+ if (ind < 0)
+ return false;
+ // Found a match. See if it is a complete word:
+ if (((ind == 0) || !Character.isLetterOrDigit(text.charAt(ind-1))) &&
+ ((ind+word.length() == text.length()) || !Character.isLetterOrDigit(text.charAt(ind+word.length())))) {
+ return true;
+ }
+ else piv = ind+1;
+ }
+ return false;
+ }
+
/**
* Removes matches of searchString in the entry's field. This is only
* possible if the search expression is not a regExp.
import javax.swing.text.BadLocationException;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.FocusEvent;
/**
* Created by Morten O. Alver, 16 Feb. 2007
*/
-public class AutoCompleteListener extends KeyAdapter {
+public class AutoCompleteListener extends KeyAdapter implements FocusListener {
AutoCompleter completer;
protected Object[] lastCompletions = null;
protected int lastShownCompletion = 0;
+ // This field is set if the focus listener should call another focus listener
+ // after finishing. This is needed because the autocomplete listener must
+ // run before the focus listener responsible for storing the current edit.
+ protected FocusListener nextFocusListener = null;
+
// These variables keep track of the situation from time to time.
public AutoCompleteListener(AutoCompleter completer) {
this.completer = completer;
}
+ /**
+ * This method is used if the focus listener should call another focus listener
+ * after finishing. This is needed because the autocomplete listener must
+ * run before the focus listener responsible for storing the current edit.
+ *
+ * @param listener The listener to call.
+ */
+ public void setNextFocusListener(FocusListener listener) {
+ this.nextFocusListener = listener;
+ }
public void keyPressed(KeyEvent e) {
if ((toSetIn != null) && (e.getKeyCode() == KeyEvent.VK_ENTER)) {
try {
upToCaret = comp.getText(0, comp.getCaretPosition());
- if ((comp.getCaretPosition() < comp.getText().length())
- && !Character.isWhitespace(comp.getText().charAt(comp.getCaretPosition())))
- return null;
- boolean found = false;
- int piv = upToCaret.length() - 1;
- while (!found && (piv >= 0)) {
- if (Character.isWhitespace(upToCaret.charAt(piv)))
- found = true;
- else piv--;
+ // We now have the text from the start of the field up to the caret position.
+ // In most fields, we are only interested in the currently edited word, so we
+ // seek from the caret backward to the closest space:
+ if (!completer.isSingleUnitField()) {
+ if ((comp.getCaretPosition() < comp.getText().length())
+ && !Character.isWhitespace(comp.getText().charAt(comp.getCaretPosition())))
+ return null;
+ boolean found = false;
+ int piv = upToCaret.length() - 1;
+ while (!found && (piv >= 0)) {
+ if (Character.isWhitespace(upToCaret.charAt(piv)))
+ found = true;
+ else piv--;
+ }
+ //if (piv < 0)
+ //piv = 0;
+ res.append(upToCaret.substring(piv + 1));
}
- //if (piv < 0)
- //piv = 0;
- res.append(upToCaret.substring(piv + 1));
+ // For fields such as "journal" it is more reasonable to try to complete on the entire
+ // text field content, so we skip the searching and keep the entire part up to the caret:
+ else res.append(upToCaret);
//Util.pr("AutoCompListener: "+res.toString());
} catch (BadLocationException ex) {
}
}
}
+
+ public void focusGained(FocusEvent event) {
+ if (nextFocusListener != null)
+ nextFocusListener.focusGained(event);
+ }
+
+ public void focusLost(FocusEvent event) {
+ if (lastCompletions != null) {
+ JTextComponent comp = (JTextComponent)event.getSource();
+ int selStart = comp.getSelectionStart();
+ String text = comp.getText();
+ comp.setText(text.substring(0, selStart) + text.substring(comp.getSelectionEnd()));
+ comp.setCaretPosition(selStart);
+ lastCompletions = null;
+ lastShownCompletion = 0;
+ lastCaretPosition = -1;
+ toSetIn = null;
+ }
+ if (nextFocusListener != null)
+ nextFocusListener.focusLost(event);
+ }
}
return nameField;
}
+ public boolean isSingleUnitField() {
+ return entireField;
+ }
+
public void addWord(String word) {
if (word.length() >= SHORTEST_WORD)
words.add(word);
public static File relativizePath(File f, ArrayList<File> dirs) {
String pth = f.getPath();
for (File dir : dirs) {
- if (pth.startsWith(dir.getPath())) {
- String subs = pth.substring(dir.getPath().length());
- if ((subs.length() > 0) && ((subs.charAt(0) == '/') || (subs.charAt(0) == '\\')))
- subs = subs.substring(1);
- return new File(subs);
+ if ((dir.getPath().length() > 0) && pth.startsWith(dir.getPath())) {
+ String subs = pth.substring(dir.getPath().length());
+ if ((subs.length() > 0) && ((subs.charAt(0) == '/') || (subs.charAt(0) == '\\')))
+ subs = subs.substring(1);
+ return new File(subs);
}
}
return f;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.regex.Pattern;
import javax.swing.*;
import javax.swing.event.DocumentEvent;