[svn-upgrade] Integrating new upstream version, jabref (2.6~beta2) upstream/2.6_beta2
authorgregor herrmann <gregoa@debian.org>
Tue, 1 Dec 2009 16:45:51 +0000 (16:45 -0000)
committergregor herrmann <gregoa@debian.org>
Tue, 1 Dec 2009 16:45:51 +0000 (16:45 -0000)
191 files changed:
.classpath
JabRef.ipr [deleted file]
JabRef.iws [deleted file]
build.number
build.xml
src/Jabref.iml [deleted file]
src/Jabref_trunk.iml [new file with mode: 0644]
src/help/About.html
src/help/BaseFrameHelp.html
src/help/CustomExports.html
src/help/EntryEditorHelp.html
src/help/RevisionHistory.html
src/help/da/About.html
src/help/de/About.html
src/help/fr/About.html
src/help/fr/BaseFrameHelp.html
src/help/fr/CustomExports.html
src/help/fr/EntryEditorHelp.html
src/help/fr/RevisionHistory.html
src/images/absIcon.png [new file with mode: 0644]
src/images/add.png [new file with mode: 0644]
src/images/autumn.png [new file with mode: 0644]
src/images/completeItem.png [new file with mode: 0644]
src/images/contents.png [new file with mode: 0644]
src/images/database_connect.png [new file with mode: 0644]
src/images/database_save.png [new file with mode: 0644]
src/images/document-save-as.png [new file with mode: 0644]
src/images/document-save.png [new file with mode: 0644]
src/images/doismall.png [new file with mode: 0644]
src/images/duplicate.png [new file with mode: 0644]
src/images/edit-copy.png [new file with mode: 0644]
src/images/edit-cut.png [new file with mode: 0644]
src/images/edit-delete.png [new file with mode: 0644]
src/images/edit-find.png [new file with mode: 0644]
src/images/edit-paste.png [new file with mode: 0644]
src/images/edit-redo.png [new file with mode: 0644]
src/images/edit-undo.png [new file with mode: 0644]
src/images/editor.png [new file with mode: 0644]
src/images/emacs.png [new file with mode: 0644]
src/images/emblem-web-small.png [new file with mode: 0644]
src/images/emblem-web.png [new file with mode: 0644]
src/images/fileclose.png [new file with mode: 0644]
src/images/fileclose2.png [new file with mode: 0644]
src/images/filenew.png [new file with mode: 0644]
src/images/fileopen.png [new file with mode: 0644]
src/images/genIcon.png [new file with mode: 0644]
src/images/go-down.png [new file with mode: 0644]
src/images/go-next.png [new file with mode: 0644]
src/images/go-previous.png [new file with mode: 0644]
src/images/go-up.png [new file with mode: 0644]
src/images/groupIncluding.png [new file with mode: 0644]
src/images/groupRefining.png [new file with mode: 0644]
src/images/grouping_morten.png [new file with mode: 0644]
src/images/groupsHighlightAll.png [new file with mode: 0644]
src/images/groupsHighlightAny.png [new file with mode: 0644]
src/images/help-about.png [new file with mode: 0644]
src/images/help-browser.png [new file with mode: 0644]
src/images/integrity.png [new file with mode: 0644]
src/images/lyx2.png [new file with mode: 0644]
src/images/mark.png [new file with mode: 0644]
src/images/messageFail.png [new file with mode: 0644]
src/images/messageInfo.png [new file with mode: 0644]
src/images/messageWarn.png [new file with mode: 0755]
src/images/optIcon.png [new file with mode: 0644]
src/images/pdf-new.png [new file with mode: 0644]
src/images/pdf.png [new file with mode: 0644]
src/images/postscript.png [new file with mode: 0644]
src/images/preamble.png [new file with mode: 0644]
src/images/preferences.png [new file with mode: 0644]
src/images/remove.png [new file with mode: 0644]
src/images/reqIcon.png [new file with mode: 0644]
src/images/search.png [new file with mode: 0644]
src/images/splash-2.1.svg [new file with mode: 0644]
src/images/splash-2.1beta.png [new file with mode: 0644]
src/images/splash-2.3.svg [new file with mode: 0644]
src/images/splash-2.4.svg [new file with mode: 0644]
src/images/splash-2.5.svg
src/images/splash-2.6beta.svg [new file with mode: 0644]
src/images/splash.png
src/images/splashBackground.png [new file with mode: 0644]
src/images/strings.png [new file with mode: 0644]
src/images/unmark.png [new file with mode: 0644]
src/images/user-home.png [new file with mode: 0644]
src/images/view-refresh.png [new file with mode: 0644]
src/images/viewsource.gif [new file with mode: 0644]
src/images/winedt.png [new file with mode: 0644]
src/images/wizard.png [new file with mode: 0644]
src/images/wrongItem.png [new file with mode: 0644]
src/images/wwwciteseer.png [new file with mode: 0644]
src/java/net/sf/jabref/BasePanel.java
src/java/net/sf/jabref/ContentSelectorDialog2.java
src/java/net/sf/jabref/DuplicateCheck.java
src/java/net/sf/jabref/EntryEditor.java
src/java/net/sf/jabref/EntryEditorTab.java
src/java/net/sf/jabref/GeneralTab.java
src/java/net/sf/jabref/Globals.java
src/java/net/sf/jabref/JabRef.java
src/java/net/sf/jabref/JabRefPreferences.java
src/java/net/sf/jabref/PreviewPanel.java
src/java/net/sf/jabref/RegExpRule.java
src/java/net/sf/jabref/SearchManager2.java
src/java/net/sf/jabref/SimpleSearchRule.java
src/java/net/sf/jabref/Util.java
src/java/net/sf/jabref/collab/Change.java
src/java/net/sf/jabref/collab/ChangeDisplayDialog.java
src/java/net/sf/jabref/collab/ChangeScanner.java
src/java/net/sf/jabref/collab/EntryAddChange.java
src/java/net/sf/jabref/collab/EntryChange.java
src/java/net/sf/jabref/collab/EntryDeleteChange.java
src/java/net/sf/jabref/collab/FileUpdateMonitor.java
src/java/net/sf/jabref/collab/GroupChange.java
src/java/net/sf/jabref/collab/MetaDataChange.java [new file with mode: 0644]
src/java/net/sf/jabref/collab/PreambleChange.java
src/java/net/sf/jabref/collab/StringAddChange.java
src/java/net/sf/jabref/collab/StringChange.java
src/java/net/sf/jabref/collab/StringNameChange.java
src/java/net/sf/jabref/collab/StringRemoveChange.java
src/java/net/sf/jabref/export/FileActions.java
src/java/net/sf/jabref/export/OpenDocumentRepresentation.java
src/java/net/sf/jabref/export/SaveDatabaseAction.java
src/java/net/sf/jabref/export/SaveException.java
src/java/net/sf/jabref/export/SaveSession.java
src/java/net/sf/jabref/export/layout/Layout.java
src/java/net/sf/jabref/export/layout/LayoutEntry.java
src/java/net/sf/jabref/export/layout/format/Default.java [new file with mode: 0644]
src/java/net/sf/jabref/export/layout/format/FormatChars.java
src/java/net/sf/jabref/export/layout/format/HTMLChars.java
src/java/net/sf/jabref/export/layout/format/LastPage.java
src/java/net/sf/jabref/export/layout/format/RTFChars.java
src/java/net/sf/jabref/export/layout/format/ResolvePDF.java
src/java/net/sf/jabref/external/TransferableFileLinkSelection.java [new file with mode: 0644]
src/java/net/sf/jabref/groups/AutoGroupDialog.java
src/java/net/sf/jabref/groups/EntryTableTransferHandler.java
src/java/net/sf/jabref/groups/GroupTreeCellRenderer.java
src/java/net/sf/jabref/groups/KeywordGroup.java
src/java/net/sf/jabref/gui/AutoCompleteListener.java
src/java/net/sf/jabref/gui/AutoCompleter.java
src/java/net/sf/jabref/gui/FileListEditor.java
src/java/net/sf/jabref/gui/FileListEntryEditor.java
src/java/net/sf/jabref/gui/ImportInspectionDialog.java
src/java/net/sf/jabref/gui/MainTableSelectionListener.java
src/java/net/sf/jabref/gui/VerticalLabelUI.java [new file with mode: 0644]
src/java/net/sf/jabref/imports/CsaImporter.java
src/java/net/sf/jabref/imports/EndnoteImporter.java
src/java/net/sf/jabref/imports/IsiImporter.java
src/java/net/sf/jabref/imports/OpenDatabaseAction.java
src/java/net/sf/jabref/imports/ParserResult.java
src/java/net/sf/jabref/imports/ScifinderImporter.java
src/java/net/sf/jabref/journals/ManageJournalsPanel.java
src/java/net/sf/jabref/net/Cookie.java
src/java/net/sf/jabref/search/BasicSearch.java
src/java/net/sf/jabref/search/SearchExpressionTreeParser.java
src/java/net/sf/jabref/sql/SQLutil.java
src/resource/JabRef_da.properties
src/resource/JabRef_de.properties
src/resource/JabRef_en.properties
src/resource/JabRef_fr.properties
src/resource/JabRef_it.properties
src/resource/JabRef_nl.properties
src/resource/JabRef_no.properties
src/resource/JabRef_tr.properties
src/resource/JabRef_zh.properties
src/resource/JabRef_zh.properties.UTF8
src/resource/Menu_tr.properties
src/resource/build.properties
src/resource/layout/endnote/EndNote.article.layout
src/resource/layout/endnote/EndNote.book.layout
src/resource/layout/endnote/EndNote.booklet.layout
src/resource/layout/endnote/EndNote.inbook.layout
src/resource/layout/endnote/EndNote.incollection.layout
src/resource/layout/endnote/EndNote.inproceedings.layout
src/resource/layout/endnote/EndNote.layout
src/resource/layout/endnote/EndNote.manual.layout
src/resource/layout/endnote/EndNote.mastersthesis.layout
src/resource/layout/endnote/EndNote.misc.layout
src/resource/layout/endnote/EndNote.other.layout
src/resource/layout/endnote/EndNote.phdthesis.layout
src/resource/layout/endnote/EndNote.proceedings.layout
src/resource/layout/endnote/EndNote.techreport.layout
src/resource/layout/endnote/EndNote.unpublished.layout
src/resource/layout/harvard/harvard.book.layout
src/resource/layout/harvard/harvard.inbook.layout
src/resource/layout/harvard/harvard.incollection.layout
src/resource/layout/harvard/harvard.inproceedings.layout
src/resource/layout/harvard/harvard.layout
src/resource/layout/harvard/harvard.proceedings.layout
src/txt/CHANGELOG
src/txt/README
src/txt/README~ [deleted file]
src/txt/TODO
src/windows/nsis/launcher.nsi

index c66a907..16e0e16 100644 (file)
@@ -5,7 +5,7 @@
        <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"/>
diff --git a/JabRef.ipr b/JabRef.ipr
deleted file mode 100644 (file)
index f15c148..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-<?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>
-
diff --git a/JabRef.iws b/JabRef.iws
deleted file mode 100644 (file)
index b1b87af..0000000
+++ /dev/null
@@ -1,655 +0,0 @@
-<?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="&lt;template&gt;" 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>
-
index 3827efa..9f34c41 100644 (file)
@@ -1,3 +1,3 @@
 #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
index e6f9b7c..5a7bd0a 100644 (file)
--- a/build.xml
+++ b/build.xml
@@ -22,8 +22,8 @@
    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:
@@ -47,7 +47,7 @@
      +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-->
 
        <!-- 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" />
diff --git a/src/Jabref.iml b/src/Jabref.iml
deleted file mode 100644 (file)
index cab9dcf..0000000
+++ /dev/null
@@ -1,336 +0,0 @@
-<?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>
-
diff --git a/src/Jabref_trunk.iml b/src/Jabref_trunk.iml
new file mode 100644 (file)
index 0000000..5049fe7
--- /dev/null
@@ -0,0 +1,165 @@
+<?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>
+
index 1246bc9..92d8cc8 100755 (executable)
@@ -35,6 +35,7 @@
         Joerg K. Wegner,
         Michael Wrighton,
         Egon Willighagen,
+       Wenbo Yang,
         J&ouml;rg Zieren</p>
 
         <h2>Contributions from:</h2>
index b83d338..8522fdd 100755 (executable)
         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 -&gt; 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
@@ -85,7 +80,7 @@
     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>
 
index c7c2ba1..c8d8694 100644 (file)
         <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.
index 734b55c..9120ace 100755 (executable)
@@ -19,7 +19,7 @@
 
     <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
index 87ce748..ced61f5 100644 (file)
@@ -5,6 +5,107 @@
 
   <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
+      &lt;br&gt;, while multiple newlines are displayed as &lt;p&gt;.
+    <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 &quot;alpha&quot; BibTeX style. Patch submitted by Oliver Kopp.</li>
+      <li> Added [authorsAlpha] key marker that formats authors according to the &quot;alpha&quot; 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 &quot;.in&quot; is included or omitted.</li>
       <li> Modified ISI importer so the words &quot;of&quot;, &quot;and&quot; and &quot;the&quot; 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>
index a00300a..fbf40c4 100755 (executable)
@@ -37,6 +37,7 @@
         Joerg K. Wegner,
         Michael Wrighton,
         Egon Willighagen,
+       Wenbo Yang,
         J&ouml;rg Zieren</p>
 
         <h2>Bidrag fra:</h2>
index 721cf8e..5bf8769 100644 (file)
@@ -35,6 +35,7 @@
         Joerg K. Wegner,
         Michael Wrighton,
         Egon Willighagen,
+       Wenbo Yang,
         J&ouml;rg Zieren</p>
 
         <h2>Beitr&auml;ge von:</h2>
index a4d36d1..2a3ab4c 100644 (file)
@@ -35,6 +35,7 @@
         Joerg K. Wegner,
         Michael Wrighton,
         Egon Willighagen,
+       Wenbo Yang,
         J&ouml;rg Zieren</p>
 
         <h2>Contributions de&nbsp;:</h2>
index b005647..47351c4 100644 (file)
         fl&egrave;ches du clavier.</li>
 
         <li>Le tableau est tri&eacute; selon une s&eacute;rie de
-        champs de votre choix. L'ordre de tri par d&eacute;faut est
+        champs de votre choix. L'ordre de tri par d&eacute;faut peut être
         configur&eacute; dans <strong>Options -&gt;
         Pr&eacute;f&eacute;rences -&gt; Table des
-        entr&eacute;es</strong> mais pour changer rapidement cet
+        entr&eacute;es</strong> mais pour changer plus rapidement cet
         ordre, cliquez l'ent&ecirc;te d'une colonne pour la
         d&eacute;finir comme crit&egrave;re de tri principal, ou
         inverser l'ordre du tri s'il est d&eacute;j&agrave;
         enfonc&eacute;e et cliquez sur un autre ent&ecirc;te de
         colonne pour l'ajouter, l'inverser ou l'enlever comme
         crit&egrave;re de tri auxiliaire. Vous pouvez ajouter un
-        nombre arbitraire de crit&egrave;res auxiliaires.</li>
+        nombre arbitraire de crit&egrave;res auxiliaires, mais uniquement
+        trois niveaux seront mémoris&eacute;s pour
+        le d&eacute;marrage suivant de JabRef.</li>
 
         <li>Vous pouvez ajuster la largeur des colonnes en faisant
         glisser les limites entre les ent&ecirc;tes.</li>
 
-        <li>Dans la fen&ecirc;tre de dialogue
-        <strong>Pr&eacute;f&eacute;rences</strong>, choisissez si
-        le tableau doit &ecirc;tre redimensionn&eacute; pour
-        s'ajuster &agrave; la fen&ecirc;tre. S&eacute;lectionnez
-        cette option pour toujours voir l'ensemble du tableau, et
-        d&eacute;s&eacute;lectionnez l&agrave; pour permettre
-        l'affichage de plus d'informations.</li>
-
         <li>
             Les codes de couleurs vous aident &agrave; visualiser
             l'&eacute;tat de votre base de donn&eacute;es. Les
     les types les plus courants.</p>
 
     <p>Lorsqu'une nouvelle entr&eacute;e est ajout&eacute;e, par
-    d&eacute;faut, une <a href="EntryEditorHelp.html">fen&ecirc;tre
-    d'&eacute;dition</a> s'ouvre. Ce comportement peut &ecirc;tre
+    d&eacute;faut,  l'<a href="EntryEditorHelp.html">&eacute;diteur
+    d'entr&eacute;es</a> s'ouvre. Ce comportement peut &ecirc;tre
     modifi&eacute; dans la fen&ecirc;tre de dialogue
     <strong>Pr&eacute;f&eacute;rences</strong>.</p>
 
 
     <h2>Editer une entr&eacute;e</h2>
 
-    <p>Pour ouvrir la
-    <a href="EntryEditorHelp.html">fen&ecirc;tre
-    d'&eacute;dition</a> sur une entr&eacute;e existante,
+    <p>Pour ouvrir l'<a href="EntryEditorHelp.html">&eacute;diteur
+    d'entr&eacute;es</a> sur une entr&eacute;e existante,
     double-cliquez simplement sur la ligne correspondant &agrave;
     l'entr&eacute;e (ou appuyez sur ENTREE apr&egrave;s avoir
-    s&eacute;lectionner l'entr&eacute;e).</p>
+    s&eacute;lectionn&eacute; l'entr&eacute;e).</p>
 
     <h2>R&eacute;f&eacute;rencer une cha&icirc;ne <em>BibTeX</em>
     dans un champ</h2>
index 54b364d..39e0685 100644 (file)
         date peut-&ecirc;tre adapt&eacute;. Par exemple,
         <code>\format[CurrentDate]{yyyy.MM.dd}</code> renverra
         uniquement la date, comme par exemple 2005.11.30.</li>
+        
+        <li><code>Default</code>&nbsp;: prend un seul argument, qui sert comme
+        valeur par d&eacute;faut. Si la cha&icirc;ne &agrave; formatter
+        n'est pas vide, elle est renvoy&eacute;e sans changement.
+        Si elle est vide, la valeur par d&eacute;faut est renvoy&eacute;e.
+        Par exemple,
+        <code>\format[Default(unknown)]{\year}</code>
+        renverra l'ann&eacute;e de l'entr&eacute;e si elle existe,
+        et "unknown" si l'ann&eacute;e n'est pas pr&eacute;cis&eacute;e.</li>
        
         <li><code>FileLink(TypeDeFichier)</code>&nbsp;: sans argument, ce formateur renvoie
         le premier lien apparaissant dans le champ. Pour fonctionner, ce formateur doit
index 48c7f24..d448afe 100644 (file)
     d'utiliser les quatre autres onglets, vous devez cocher cette
     option.</p>
 
-    <p><strong>Astuce&nbsp;:</strong> Si votre base contient des
-    champs que JabRef ne conna&icirc;t pas, ils seront visibles
-    dans l'onglet <em>Source BibTeX</em>.</p>
-
     <p><strong>Astuce&nbsp;:</strong> les champs <i>pdf</i> et
     <i>url</i> supportent les op&eacute;rations de
     Glisser-D&eacute;placer. Vous pouvez faire glisser une url
@@ -97,7 +93,8 @@
     Pour les champs qui sont utilis&eacute;s par <em>BibTeX</em>,
     le contenu est v&eacute;rifi&eacute; par rapport &agrave;
     l'utilisation du caract&eacute;re '#'. Le symbole di&egrave;se
-    doit <em>toujours</em> &ecirc;tre utilis&eacute; par paires,
+    doit <em>toujours</em> &ecirc;tre utilis&eacute; par paires
+    (except&eacute; pour la forme d'&eacute;chappement '\#'),
     encadrant le nom d'une cha&icirc;ne <em>BibTeX</em> existante.
     Notez que JabRef ne v&eacute;rifie pas si la cha&icirc;ne
     <em>BibTeX</em> est vraiment d&eacute;finie (ce n'est pas
index 59bf77b..05e95e1 100644 (file)
@@ -5,6 +5,65 @@
 
   <h1>Historique des r&eacute;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>
 
@@ -13,7 +72,7 @@
       <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 &quot;alpha&quot; BibTeX style. Patch submitted by Oliver Kopp.</li>
+      <li> Added [authorsAlpha] key marker that formats authors according to the &quot;alpha&quot; 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 &quot;.in&quot; is included or omitted.</li>
       <li> Modified ISI importer so the words &quot;of&quot;, &quot;and&quot; and &quot;the&quot; 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
diff --git a/src/images/absIcon.png b/src/images/absIcon.png
new file mode 100644 (file)
index 0000000..f249fda
Binary files /dev/null and b/src/images/absIcon.png differ
diff --git a/src/images/add.png b/src/images/add.png
new file mode 100644 (file)
index 0000000..6b636fe
Binary files /dev/null and b/src/images/add.png differ
diff --git a/src/images/autumn.png b/src/images/autumn.png
new file mode 100644 (file)
index 0000000..77b7590
Binary files /dev/null and b/src/images/autumn.png differ
diff --git a/src/images/completeItem.png b/src/images/completeItem.png
new file mode 100644 (file)
index 0000000..5eeadc7
Binary files /dev/null and b/src/images/completeItem.png differ
diff --git a/src/images/contents.png b/src/images/contents.png
new file mode 100644 (file)
index 0000000..6e44fa7
Binary files /dev/null and b/src/images/contents.png differ
diff --git a/src/images/database_connect.png b/src/images/database_connect.png
new file mode 100644 (file)
index 0000000..3a11197
Binary files /dev/null and b/src/images/database_connect.png differ
diff --git a/src/images/database_save.png b/src/images/database_save.png
new file mode 100644 (file)
index 0000000..44c06dd
Binary files /dev/null and b/src/images/database_save.png differ
diff --git a/src/images/document-save-as.png b/src/images/document-save-as.png
new file mode 100644 (file)
index 0000000..7a1591f
Binary files /dev/null and b/src/images/document-save-as.png differ
diff --git a/src/images/document-save.png b/src/images/document-save.png
new file mode 100644 (file)
index 0000000..0311e47
Binary files /dev/null and b/src/images/document-save.png differ
diff --git a/src/images/doismall.png b/src/images/doismall.png
new file mode 100644 (file)
index 0000000..3c9595b
Binary files /dev/null and b/src/images/doismall.png differ
diff --git a/src/images/duplicate.png b/src/images/duplicate.png
new file mode 100644 (file)
index 0000000..5599a18
Binary files /dev/null and b/src/images/duplicate.png differ
diff --git a/src/images/edit-copy.png b/src/images/edit-copy.png
new file mode 100644 (file)
index 0000000..efec317
Binary files /dev/null and b/src/images/edit-copy.png differ
diff --git a/src/images/edit-cut.png b/src/images/edit-cut.png
new file mode 100644 (file)
index 0000000..7e750c9
Binary files /dev/null and b/src/images/edit-cut.png differ
diff --git a/src/images/edit-delete.png b/src/images/edit-delete.png
new file mode 100644 (file)
index 0000000..0ac3589
Binary files /dev/null and b/src/images/edit-delete.png differ
diff --git a/src/images/edit-find.png b/src/images/edit-find.png
new file mode 100644 (file)
index 0000000..b98e348
Binary files /dev/null and b/src/images/edit-find.png differ
diff --git a/src/images/edit-paste.png b/src/images/edit-paste.png
new file mode 100644 (file)
index 0000000..577e9c2
Binary files /dev/null and b/src/images/edit-paste.png differ
diff --git a/src/images/edit-redo.png b/src/images/edit-redo.png
new file mode 100644 (file)
index 0000000..712a8ee
Binary files /dev/null and b/src/images/edit-redo.png differ
diff --git a/src/images/edit-undo.png b/src/images/edit-undo.png
new file mode 100644 (file)
index 0000000..4652df0
Binary files /dev/null and b/src/images/edit-undo.png differ
diff --git a/src/images/editor.png b/src/images/editor.png
new file mode 100644 (file)
index 0000000..a653bfe
Binary files /dev/null and b/src/images/editor.png differ
diff --git a/src/images/emacs.png b/src/images/emacs.png
new file mode 100644 (file)
index 0000000..6b76f52
Binary files /dev/null and b/src/images/emacs.png differ
diff --git a/src/images/emblem-web-small.png b/src/images/emblem-web-small.png
new file mode 100644 (file)
index 0000000..3d81a37
Binary files /dev/null and b/src/images/emblem-web-small.png differ
diff --git a/src/images/emblem-web.png b/src/images/emblem-web.png
new file mode 100644 (file)
index 0000000..49f7290
Binary files /dev/null and b/src/images/emblem-web.png differ
diff --git a/src/images/fileclose.png b/src/images/fileclose.png
new file mode 100644 (file)
index 0000000..033326f
Binary files /dev/null and b/src/images/fileclose.png differ
diff --git a/src/images/fileclose2.png b/src/images/fileclose2.png
new file mode 100644 (file)
index 0000000..c1e5f4d
Binary files /dev/null and b/src/images/fileclose2.png differ
diff --git a/src/images/filenew.png b/src/images/filenew.png
new file mode 100644 (file)
index 0000000..7274a21
Binary files /dev/null and b/src/images/filenew.png differ
diff --git a/src/images/fileopen.png b/src/images/fileopen.png
new file mode 100644 (file)
index 0000000..7c9f7a6
Binary files /dev/null and b/src/images/fileopen.png differ
diff --git a/src/images/genIcon.png b/src/images/genIcon.png
new file mode 100644 (file)
index 0000000..5bedaa2
Binary files /dev/null and b/src/images/genIcon.png differ
diff --git a/src/images/go-down.png b/src/images/go-down.png
new file mode 100644 (file)
index 0000000..970d43a
Binary files /dev/null and b/src/images/go-down.png differ
diff --git a/src/images/go-next.png b/src/images/go-next.png
new file mode 100644 (file)
index 0000000..cfee8f4
Binary files /dev/null and b/src/images/go-next.png differ
diff --git a/src/images/go-previous.png b/src/images/go-previous.png
new file mode 100644 (file)
index 0000000..3311c05
Binary files /dev/null and b/src/images/go-previous.png differ
diff --git a/src/images/go-up.png b/src/images/go-up.png
new file mode 100644 (file)
index 0000000..4ee50ef
Binary files /dev/null and b/src/images/go-up.png differ
diff --git a/src/images/groupIncluding.png b/src/images/groupIncluding.png
new file mode 100644 (file)
index 0000000..6f2bd08
Binary files /dev/null and b/src/images/groupIncluding.png differ
diff --git a/src/images/groupRefining.png b/src/images/groupRefining.png
new file mode 100644 (file)
index 0000000..2ba0a26
Binary files /dev/null and b/src/images/groupRefining.png differ
diff --git a/src/images/grouping_morten.png b/src/images/grouping_morten.png
new file mode 100644 (file)
index 0000000..9b29f68
Binary files /dev/null and b/src/images/grouping_morten.png differ
diff --git a/src/images/groupsHighlightAll.png b/src/images/groupsHighlightAll.png
new file mode 100644 (file)
index 0000000..c6e1a97
Binary files /dev/null and b/src/images/groupsHighlightAll.png differ
diff --git a/src/images/groupsHighlightAny.png b/src/images/groupsHighlightAny.png
new file mode 100644 (file)
index 0000000..1bc2e28
Binary files /dev/null and b/src/images/groupsHighlightAny.png differ
diff --git a/src/images/help-about.png b/src/images/help-about.png
new file mode 100644 (file)
index 0000000..90ce540
Binary files /dev/null and b/src/images/help-about.png differ
diff --git a/src/images/help-browser.png b/src/images/help-browser.png
new file mode 100644 (file)
index 0000000..6de563b
Binary files /dev/null and b/src/images/help-browser.png differ
diff --git a/src/images/integrity.png b/src/images/integrity.png
new file mode 100644 (file)
index 0000000..4343947
Binary files /dev/null and b/src/images/integrity.png differ
diff --git a/src/images/lyx2.png b/src/images/lyx2.png
new file mode 100644 (file)
index 0000000..84a742f
Binary files /dev/null and b/src/images/lyx2.png differ
diff --git a/src/images/mark.png b/src/images/mark.png
new file mode 100644 (file)
index 0000000..6f8ab3a
Binary files /dev/null and b/src/images/mark.png differ
diff --git a/src/images/messageFail.png b/src/images/messageFail.png
new file mode 100644 (file)
index 0000000..474f63f
Binary files /dev/null and b/src/images/messageFail.png differ
diff --git a/src/images/messageInfo.png b/src/images/messageInfo.png
new file mode 100644 (file)
index 0000000..ecdc991
Binary files /dev/null and b/src/images/messageInfo.png differ
diff --git a/src/images/messageWarn.png b/src/images/messageWarn.png
new file mode 100755 (executable)
index 0000000..55a6f01
Binary files /dev/null and b/src/images/messageWarn.png differ
diff --git a/src/images/optIcon.png b/src/images/optIcon.png
new file mode 100644 (file)
index 0000000..64562b3
Binary files /dev/null and b/src/images/optIcon.png differ
diff --git a/src/images/pdf-new.png b/src/images/pdf-new.png
new file mode 100644 (file)
index 0000000..cda12b9
Binary files /dev/null and b/src/images/pdf-new.png differ
diff --git a/src/images/pdf.png b/src/images/pdf.png
new file mode 100644 (file)
index 0000000..d5eab07
Binary files /dev/null and b/src/images/pdf.png differ
diff --git a/src/images/postscript.png b/src/images/postscript.png
new file mode 100644 (file)
index 0000000..5065c98
Binary files /dev/null and b/src/images/postscript.png differ
diff --git a/src/images/preamble.png b/src/images/preamble.png
new file mode 100644 (file)
index 0000000..cf9d89d
Binary files /dev/null and b/src/images/preamble.png differ
diff --git a/src/images/preferences.png b/src/images/preferences.png
new file mode 100644 (file)
index 0000000..426460b
Binary files /dev/null and b/src/images/preferences.png differ
diff --git a/src/images/remove.png b/src/images/remove.png
new file mode 100644 (file)
index 0000000..0815d3f
Binary files /dev/null and b/src/images/remove.png differ
diff --git a/src/images/reqIcon.png b/src/images/reqIcon.png
new file mode 100644 (file)
index 0000000..5d2439c
Binary files /dev/null and b/src/images/reqIcon.png differ
diff --git a/src/images/search.png b/src/images/search.png
new file mode 100644 (file)
index 0000000..a555de8
Binary files /dev/null and b/src/images/search.png differ
diff --git a/src/images/splash-2.1.svg b/src/images/splash-2.1.svg
new file mode 100644 (file)
index 0000000..1f931f6
--- /dev/null
@@ -0,0 +1,229 @@
+<?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>
diff --git a/src/images/splash-2.1beta.png b/src/images/splash-2.1beta.png
new file mode 100644 (file)
index 0000000..4304131
Binary files /dev/null and b/src/images/splash-2.1beta.png differ
diff --git a/src/images/splash-2.3.svg b/src/images/splash-2.3.svg
new file mode 100644 (file)
index 0000000..d519da8
--- /dev/null
@@ -0,0 +1,276 @@
+<?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>
diff --git a/src/images/splash-2.4.svg b/src/images/splash-2.4.svg
new file mode 100644 (file)
index 0000000..8eaf7e1
--- /dev/null
@@ -0,0 +1,284 @@
+<?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>
index 55e8e0e..f571b08 100644 (file)
   </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"
diff --git a/src/images/splash-2.6beta.svg b/src/images/splash-2.6beta.svg
new file mode 100644 (file)
index 0000000..af82162
--- /dev/null
@@ -0,0 +1,299 @@
+<?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>
index efc1828..5b71a8a 100644 (file)
Binary files a/src/images/splash.png and b/src/images/splash.png differ
diff --git a/src/images/splashBackground.png b/src/images/splashBackground.png
new file mode 100644 (file)
index 0000000..d5a048e
Binary files /dev/null and b/src/images/splashBackground.png differ
diff --git a/src/images/strings.png b/src/images/strings.png
new file mode 100644 (file)
index 0000000..649899f
Binary files /dev/null and b/src/images/strings.png differ
diff --git a/src/images/unmark.png b/src/images/unmark.png
new file mode 100644 (file)
index 0000000..92ac338
Binary files /dev/null and b/src/images/unmark.png differ
diff --git a/src/images/user-home.png b/src/images/user-home.png
new file mode 100644 (file)
index 0000000..a3c4765
Binary files /dev/null and b/src/images/user-home.png differ
diff --git a/src/images/view-refresh.png b/src/images/view-refresh.png
new file mode 100644 (file)
index 0000000..952b5f7
Binary files /dev/null and b/src/images/view-refresh.png differ
diff --git a/src/images/viewsource.gif b/src/images/viewsource.gif
new file mode 100644 (file)
index 0000000..3ef9a2e
Binary files /dev/null and b/src/images/viewsource.gif differ
diff --git a/src/images/winedt.png b/src/images/winedt.png
new file mode 100644 (file)
index 0000000..cded1a7
Binary files /dev/null and b/src/images/winedt.png differ
diff --git a/src/images/wizard.png b/src/images/wizard.png
new file mode 100644 (file)
index 0000000..b5d81d3
Binary files /dev/null and b/src/images/wizard.png differ
diff --git a/src/images/wrongItem.png b/src/images/wrongItem.png
new file mode 100644 (file)
index 0000000..8b2f1eb
Binary files /dev/null and b/src/images/wrongItem.png differ
diff --git a/src/images/wwwciteseer.png b/src/images/wwwciteseer.png
new file mode 100644 (file)
index 0000000..1885445
Binary files /dev/null and b/src/images/wwwciteseer.png differ
index 8ed5da6..054b44e 100644 (file)
@@ -1789,6 +1789,42 @@ public class BasePanel extends JPanel implements ClipboardOwner, FileUpdateListe
         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);
+        }
+
+
     }
 
 
@@ -2478,6 +2514,15 @@ public class BasePanel extends JPanel implements ClipboardOwner, FileUpdateListe
          };
 
       // 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();
index 27869d4..66e9900 100644 (file)
@@ -292,6 +292,8 @@ public class ContentSelectorDialog2 extends JDialog {
        else {
            panel.rebuildAllEntryEditors();
        }
+    panel.addContentSelectorValuesToAutoCompleters();
+        
     }
 
     /**
index ad4148d..467db65 100644 (file)
@@ -25,16 +25,18 @@ public class DuplicateCheck {
         // 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);
         }
index 5b3b4fc..8de6827 100644 (file)
@@ -53,10 +53,9 @@ import net.sf.jabref.gui.*;
 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
@@ -101,6 +100,8 @@ public class EntryEditor extends JPanel implements VetoableChangeListener {
     // The action which generates a bibtexkey for this entry.
     public GenerateKeyAction generateKeyAction;
 
+    public AutoSetFileAction autoLink = new AutoSetFileAction();
+
     public AbstractAction writeXmp;
 
     SaveDatabaseAction saveDatabaseAction = new SaveDatabaseAction();
@@ -247,7 +248,12 @@ public class EntryEditor extends JPanel implements VetoableChangeListener {
     }
 
     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));
 
@@ -262,6 +268,8 @@ public class EntryEditor extends JPanel implements VetoableChangeListener {
         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");
@@ -275,17 +283,22 @@ public class EntryEditor extends JPanel implements VetoableChangeListener {
 
         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);
 
@@ -304,7 +317,8 @@ public class EntryEditor extends JPanel implements VetoableChangeListener {
         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);
     }
 
     /**
@@ -386,7 +400,7 @@ public class EntryEditor extends JPanel implements VetoableChangeListener {
         } 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;
@@ -720,6 +734,7 @@ public class EntryEditor extends JPanel implements VetoableChangeListener {
             // oldKey = entry.getCiteKey(),
             newKey = nu.getCiteKey();
             boolean anyChanged = false;
+            boolean changedType = false;
             boolean duplicateWarning = false;
             boolean emptyWarning = newKey == null || newKey.equals("");
 
@@ -755,6 +770,14 @@ public class EntryEditor extends JPanel implements VetoableChangeListener {
                 }
             }
 
+            // 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)
@@ -776,10 +799,14 @@ public class EntryEditor extends JPanel implements VetoableChangeListener {
             }
 
             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();
@@ -873,10 +900,13 @@ public class EntryEditor extends JPanel implements VetoableChangeListener {
     }
 
 
-    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");
@@ -895,15 +925,16 @@ public class EntryEditor extends JPanel implements VetoableChangeListener {
             });
         }
 
-        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);
         }
     }
 
@@ -1397,4 +1428,27 @@ public class EntryEditor extends JPanel implements VetoableChangeListener {
     }
 
 
+    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);
+        }
+    }
 }
index 42f4f4f..2028928 100644 (file)
@@ -48,7 +48,7 @@ import com.jgoodies.forms.layout.FormLayout;
  * 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 {
@@ -138,13 +138,14 @@ 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);
@@ -171,7 +172,7 @@ public class EntryEditorTab {
                        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);
                        /*
@@ -308,9 +309,23 @@ public class EntryEditorTab {
         * 
         * @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();
index 42e33e6..5d8ced5 100644 (file)
@@ -23,7 +23,7 @@ public class GeneralTab extends JPanel implements PrefsTab {
 
     private JCheckBox
     defSort, ctrlClick, useOwner, overwriteOwner,
-    keyDuplicateWarningDialog, keyEmptyWarningDialog,
+    keyDuplicateWarningDialog, keyEmptyWarningDialog, enforceLegalKeys,
     confirmDelete, allowEditing, memoryStick, useImportInspector,
     useImportInspectorForSingle, inspectionWarnDupli, useTimeStamp, overwriteTimeStamp,
     markImportedEntries, unmarkAllEntriesBeforeImporting;
@@ -57,6 +57,7 @@ public class GeneralTab extends JPanel implements PrefsTab {
             +"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."));
@@ -110,6 +111,8 @@ public class GeneralTab extends JPanel implements PrefsTab {
         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:
@@ -165,6 +168,7 @@ public class GeneralTab extends JPanel implements PrefsTab {
         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"));
@@ -205,6 +209,7 @@ public class GeneralTab extends JPanel implements PrefsTab {
         _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."),
index 856dae8..d6625ff 100644 (file)
@@ -410,7 +410,7 @@ public class Globals {
        }
 
 
-    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>();
index 3e8578b..125fd41 100644 (file)
@@ -293,7 +293,7 @@ public class JabRef {
                             loaded.add(ParserResult.INVALID_FORMAT);
                     }
                 }
-                else
+                else if (pr != ParserResult.FILE_LOCKED)
                     loaded.add(pr);
 
             }
@@ -482,10 +482,6 @@ public class JabRef {
             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;
         }
 
@@ -691,10 +687,11 @@ public class JabRef {
 
                         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);
 
                         }
                     }
@@ -858,6 +855,13 @@ public class JabRef {
                     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) {
index 4b51df8..fe02fde 100644 (file)
@@ -261,7 +261,7 @@ public class JabRefPreferences {
 
         //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);
@@ -298,6 +298,7 @@ public class JabRefPreferences {
         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]");
@@ -382,13 +383,15 @@ public class JabRefPreferences {
         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);
@@ -882,6 +885,7 @@ public class JabRefPreferences {
         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 {
index 036099c..1b5148c 100644 (file)
@@ -22,7 +22,7 @@ import net.sf.jabref.util.DocumentPrinter;
  * 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) $)
  * 
  */
index 5f591e5..4183f99 100644 (file)
@@ -32,12 +32,13 @@ import java.util.regex.Matcher;
 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;
index 43c041e..4a9b1c9 100644 (file)
@@ -218,7 +218,7 @@ class SearchManager2 extends SidePaneComponent
     // 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);
@@ -320,7 +320,7 @@ class SearchManager2 extends SidePaneComponent
         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());
index 2517d02..e42fe12 100644 (file)
@@ -28,12 +28,13 @@ package net.sf.jabref;
 
 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;
index efc49c5..8e44f07 100644 (file)
@@ -51,9 +51,7 @@ import java.io.IOException;
 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;
@@ -78,18 +76,12 @@ import java.util.Vector;
 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;
@@ -103,6 +95,7 @@ import net.sf.jabref.imports.CiteSeerFetcher;
 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;
@@ -137,6 +130,8 @@ public class Util {
 
        final static NumberFormat idFormat;
 
+    public static Pattern remoteLinkPattern = Pattern.compile("[a-z]+://.*");
+
        static {
                idFormat = NumberFormat.getInstance();
                idFormat.setMinimumIntegerDigits(8);
@@ -315,7 +310,21 @@ public class Util {
        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 != '"')
@@ -403,9 +412,9 @@ public class Util {
                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);
@@ -414,7 +423,7 @@ public class Util {
                                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;
@@ -434,8 +443,8 @@ public class Util {
         *            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);
@@ -443,12 +452,42 @@ public class Util {
                        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.
@@ -677,11 +716,32 @@ public class Util {
         *            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);
 
@@ -777,6 +837,34 @@ public class Util {
 
     }
 
+
+    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 {
 
@@ -2709,5 +2797,62 @@ public static boolean openExternalFileUnknown(JabRefFrame frame, BibtexEntry ent
         // 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
index 342fd8f..754e392 100644 (file)
@@ -2,6 +2,8 @@ package net.sf.jabref.collab;
 
 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;
@@ -57,8 +59,10 @@ public abstract class Change extends DefaultMutableTreeNode {
   * 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);
 
 }
index 92aa1b3..3ddaf27 100644 (file)
@@ -13,11 +13,13 @@ import java.awt.event.ActionListener;
 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(),
@@ -30,9 +32,16 @@ public class ChangeDisplayDialog extends JDialog implements TreeSelectionListene
   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();
@@ -77,7 +86,7 @@ public class ChangeDisplayDialog extends JDialog implements TreeSelectionListene
         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);
index 5e18b1a..e2969a9 100644 (file)
@@ -4,12 +4,17 @@ import java.io.File;
 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;
@@ -20,8 +25,8 @@ public class ChangeScanner extends Thread {
     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;
 
@@ -58,8 +63,8 @@ public class ChangeScanner extends Thread {
             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();
@@ -80,7 +85,7 @@ public class ChangeScanner extends Thread {
             EntrySorter sInMem = inMem.getSorter(comp);
 
             // Start looking at changes.
-
+            scanMetaData(mdInMem, mdInTemp, mdOnDisk);
             scanPreamble(inMem, inTemp, onDisk);
             scanStrings(inMem, inTemp, onDisk);
 
@@ -95,6 +100,7 @@ public class ChangeScanner extends Thread {
         }
     }
 
+
     public boolean changesFound() {
         return changes.getChildCount() > 0;
     }
@@ -103,10 +109,14 @@ public class ChangeScanner extends Thread {
         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();
+                    }
                 }
             });
 
@@ -117,6 +127,60 @@ public class ChangeScanner extends Thread {
         }
     }
 
+    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
@@ -129,7 +193,7 @@ public class ChangeScanner extends Thread {
         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++) {
@@ -323,11 +387,11 @@ public class ChangeScanner extends Thread {
                             // 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)
@@ -370,7 +434,7 @@ public class ChangeScanner extends Thread {
                                 }
                             }
 
-                            changes.add(new StringNameChange(bsMem, bsMem.getName(),
+                            changes.add(new StringNameChange(bsMem, tmp, bsMem.getName(),
                             tmp.getName(), disk.getName(),
                             tmp.getContent()));
                             i.remove();
@@ -389,7 +453,7 @@ public class ChangeScanner extends Thread {
                 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));
                 }
             }
         }
@@ -434,12 +498,12 @@ public class ChangeScanner extends Thread {
             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;
 
 //
index 5053041..275e8cf 100644 (file)
@@ -22,9 +22,10 @@ public class EntryAddChange extends Change {
     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));
   }
 
index bfc9719..01a44f5 100644 (file)
@@ -51,15 +51,15 @@ public class EntryChange extends Change {
       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());
@@ -67,14 +67,14 @@ public class EntryChange extends Change {
   }
 
   
-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());
@@ -93,13 +93,14 @@ public void makeChange(BasePanel panel, NamedCompound undoEdit) {
 
   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;
@@ -117,6 +118,8 @@ public void makeChange(BasePanel panel, NamedCompound undoEdit) {
 
       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))
@@ -127,10 +130,11 @@ public void makeChange(BasePanel panel, NamedCompound undoEdit) {
       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() {
index 121e2cf..d3997bb 100644 (file)
@@ -34,9 +34,10 @@ public class EntryDeleteChange extends Change {
     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() {
index 92b2624..0f7b433 100644 (file)
@@ -91,6 +91,20 @@ public class FileUpdateMonitor extends Thread {
        }
     }
 
+    /**
+     * 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.
@@ -213,7 +227,8 @@ public class FileUpdateMonitor extends Thread {
     // 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();
index 9b81a58..ed438ba 100644 (file)
@@ -5,6 +5,7 @@ import javax.swing.JLabel;
 
 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;
@@ -12,14 +13,17 @@ import net.sf.jabref.undo.NamedCompound;
 
 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
@@ -39,6 +43,14 @@ public class GroupChange extends Change {
         }
         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() {
diff --git a/src/java/net/sf/jabref/collab/MetaDataChange.java b/src/java/net/sf/jabref/collab/MetaDataChange.java
new file mode 100644 (file)
index 0000000..34f4f17
--- /dev/null
@@ -0,0 +1,108 @@
+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>&nbsp;&nbsp;");
+            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;
+        }
+    }
+}
index 6234e72..d82388d 100644 (file)
@@ -5,6 +5,7 @@ import javax.swing.JScrollPane;
 
 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;
 
@@ -36,9 +37,10 @@ public class PreambleChange extends Change {
       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() {
index d2978bf..e109371 100644 (file)
@@ -3,10 +3,7 @@ package net.sf.jabref.collab;
 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;
 
@@ -35,7 +32,7 @@ public class StringAddChange extends Change {
 
   }
 
-  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.
@@ -49,7 +46,12 @@ public class StringAddChange extends Change {
     } 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());
+    }
   }
 
 
index f57729f..ddc320a 100644 (file)
@@ -15,9 +15,12 @@ public class StringChange extends Change {
 
   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;
@@ -46,10 +49,12 @@ public class StringChange extends Change {
     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();
@@ -61,6 +66,15 @@ public class StringChange extends Change {
            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);
+      }
   }
 
 
index e3ea8be..a2ef52d 100644 (file)
@@ -12,9 +12,12 @@ public class StringNameChange extends Change {
 
   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;
@@ -23,7 +26,7 @@ public class StringNameChange extends Change {
 
   }
 
-  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.
@@ -46,6 +49,16 @@ public class StringNameChange extends Change {
         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);
+      }
   }
 
 
index 3e9be68..c45d00f 100644 (file)
@@ -6,6 +6,7 @@ import javax.swing.JScrollPane;
 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;
 
@@ -15,10 +16,12 @@ public class StringRemoveChange extends Change {
 
   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...?
 
@@ -36,7 +39,7 @@ public class StringRemoveChange extends Change {
 
   }
 
-  public void makeChange(BasePanel panel, NamedCompound undoEdit) {
+  public void makeChange(BasePanel panel, BibtexDatabase secondary, NamedCompound undoEdit) {
 
     try {
       panel.database().removeString(inMem.getId());
@@ -45,6 +48,8 @@ public class StringRemoveChange extends Change {
       Globals.logger("Error: could not add string '"+string.getName()+"': "+ex.getMessage());
     }
 
+      // Update tmp database:
+      secondary.removeString(tmpString.getId());
   }
 
 
index 2d28d2d..31cac70 100644 (file)
@@ -123,8 +123,17 @@ public class FileActions
         }
 
         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("{}");
 
index 7e0a77c..31e275e 100644 (file)
@@ -31,9 +31,11 @@ import ca.odell.glazedlists.SortedList;
  */
 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"));
@@ -45,10 +47,10 @@ public class OpenDocumentRepresentation {
         // 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));
@@ -181,8 +183,8 @@ public class OpenDocumentRepresentation {
     }
 
     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) {
index a14cdcd..7876d4d 100644 (file)
@@ -22,7 +22,7 @@ import java.util.Vector;
 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) {
 
@@ -34,10 +34,12 @@ public class SaveDatabaseAction extends AbstractWorker {
     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"),
@@ -61,6 +63,12 @@ public class SaveDatabaseAction extends AbstractWorker {
 
                     (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 {
@@ -118,7 +126,11 @@ public class SaveDatabaseAction extends AbstractWorker {
             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"));
         }
     }
 
@@ -136,19 +148,25 @@ public class SaveDatabaseAction extends AbstractWorker {
             // 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) {
@@ -166,6 +184,11 @@ public class SaveDatabaseAction extends AbstractWorker {
                 panel.setUpdatedExternally(false);
             }
         } catch (SaveException ex2) {
+            if (ex2 == SaveException.FILE_LOCKED) {
+                success =false;
+                fileLockedError = true;
+                return;
+            }
             ex2.printStackTrace();
         }
     }
@@ -187,6 +210,9 @@ public class SaveDatabaseAction extends AbstractWorker {
                     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:
index bf9c19b..a6e0990 100644 (file)
@@ -27,6 +27,7 @@ http://www.gnu.org/copyleft/gpl.ja.html
 package net.sf.jabref.export;
 
 import net.sf.jabref.BibtexEntry;
+import net.sf.jabref.Globals;
 
 
 /**
@@ -37,6 +38,9 @@ public class SaveException extends Exception
 {
     //~ 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 ///////////////////////////////////////////////////////////
index 1f2ddd7..09b885f 100644 (file)
@@ -26,17 +26,23 @@ import java.nio.charset.UnsupportedCharsetException;
  */
 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);
@@ -64,6 +70,20 @@ public class SaveSession {
             }
         }
         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
@@ -71,6 +91,15 @@ public class SaveSession {
             // 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();
@@ -80,6 +109,43 @@ public class SaveSession {
         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;
     }
index 3e262f1..1c14b8e 100755 (executable)
@@ -38,7 +38,7 @@ import wsi.ra.types.StringInt;
  * Main class for formatting DOCUMENT ME!
  *
  * @author $author$
- * @version $Revision: 3018 $
+ * @version $Revision: 3092 $
  */
 public class Layout
 {
@@ -142,6 +142,13 @@ 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
index 78db159..23c6687 100755 (executable)
@@ -43,7 +43,7 @@ import wsi.ra.types.StringInt;
  * DOCUMENT ME!
  * 
  * @author $author$
- * @version $Revision: 3018 $
+ * @version $Revision: 3092 $
  */
 public class LayoutEntry {
        // ~ Instance fields
@@ -51,6 +51,9 @@ public class LayoutEntry {
 
        private LayoutFormatter[] option;
 
+    // Formatter to be run after other formatters:
+    private LayoutFormatter postFormatter = null;
+
        private String text;
 
        private LayoutEntry[] layoutEntries;
@@ -171,6 +174,10 @@ public class LayoutEntry {
                
        }
 
+    public void setPostFormatter(LayoutFormatter formatter) {
+        this.postFormatter = formatter;
+    }
+
        public String doLayout(BibtexEntry bibtex, BibtexDatabase database) {
 
                switch (type) {
@@ -271,6 +278,10 @@ public class LayoutEntry {
                                }
                        }
 
+            // If a post formatter has been set, call it:
+            if (postFormatter != null)
+                fieldEntry = postFormatter.format(fieldEntry);
+
                        return fieldEntry;
                }
         case LayoutHelper.IS_ENCODING_NAME: {
@@ -311,6 +322,9 @@ public class LayoutEntry {
                                        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) {
diff --git a/src/java/net/sf/jabref/export/layout/format/Default.java b/src/java/net/sf/jabref/export/layout/format/Default.java
new file mode 100644 (file)
index 0000000..1fa56a1
--- /dev/null
@@ -0,0 +1,20 @@
+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;
+    }
+}
index 1468d9d..bd3de04 100644 (file)
@@ -85,133 +85,133 @@ public class FormatChars implements LayoutFormatter {
 
                // HTML special characters without names (UNICODE Latin Extended-A),
                // indicated by UNICODE number
-               CHARS.put("=A", "&#256;"); // "Amacr"
-               CHARS.put("=a", "&#257;"); // "amacr"
-               CHARS.put("uA", "&#258;"); // "Abreve"
-               CHARS.put("ua", "&#259;"); // "abreve"
-               CHARS.put("kA", "&#260;"); // "Aogon"
-               CHARS.put("ka", "&#261;"); // "aogon"
-               CHARS.put("'C", "&#262;"); // "Cacute"
-               CHARS.put("'c", "&#263;"); // "cacute"
-               CHARS.put("^C", "&#264;"); // "Ccirc"
-               CHARS.put("^c", "&#265;"); // "ccirc"
-               CHARS.put(".C", "&#266;"); // "Cdot"
-               CHARS.put(".c", "&#267;"); // "cdot"
-               CHARS.put("vC", "&#268;"); // "Ccaron"
-               CHARS.put("vc", "&#269;"); // "ccaron"
-               CHARS.put("vD", "&#270;"); // "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", "&#272;"); // "Dstrok"
-               CHARS.put("dj", "&#273;"); // "dstrok"
-               CHARS.put("=E", "&#274;"); // "Emacr"
-               CHARS.put("=e", "&#275;"); // "emacr"
-               CHARS.put("uE", "&#276;"); // "Ebreve"
-               CHARS.put("ue", "&#277;"); // "ebreve"
-               CHARS.put(".E", "&#278;"); // "Edot"
-               CHARS.put(".e", "&#279;"); // "edot"
-               CHARS.put("kE", "&#280;"); // "Eogon"
-               CHARS.put("ke", "&#281;"); // "eogon"
-               CHARS.put("vE", "&#282;"); // "Ecaron"
-               CHARS.put("ve", "&#283;"); // "ecaron"
-               CHARS.put("^G", "&#284;"); // "Gcirc"
-               CHARS.put("^g", "&#285;"); // "gcirc"
-               CHARS.put("uG", "&#286;"); // "Gbreve"
-               CHARS.put("ug", "&#287;"); // "gbreve"
-               CHARS.put(".G", "&#288;"); // "Gdot"
-               CHARS.put(".g", "&#289;"); // "gdot"
-               CHARS.put("cG", "&#290;"); // "Gcedil"
-               CHARS.put("'g", "&#291;"); // "gacute"
-               CHARS.put("^H", "&#292;"); // "Hcirc"
-               CHARS.put("^h", "&#293;"); // "hcirc"
-               CHARS.put("Hstrok", "&#294;"); // "Hstrok"
-               CHARS.put("hstrok", "&#295;"); // "hstrok"
-               CHARS.put("~I", "&#296;"); // "Itilde"
-               CHARS.put("~i", "&#297;"); // "itilde"
-               CHARS.put("=I", "&#298;"); // "Imacr"
-               CHARS.put("=i", "&#299;"); // "imacr"
-               CHARS.put("uI", "&#300;"); // "Ibreve"
-               CHARS.put("ui", "&#301;"); // "ibreve"
-               CHARS.put("kI", "&#302;"); // "Iogon"
-               CHARS.put("ki", "&#303;"); // "iogon"
-               CHARS.put(".I", "&#304;"); // "Idot"
-               CHARS.put("i", "&#305;"); // "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", "&#308;"); // "Jcirc"
-               CHARS.put("^j", "&#309;"); // "jcirc"
-               CHARS.put("cK", "&#310;"); // "Kcedil"
-               CHARS.put("ck", "&#311;"); // "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", "&#313;"); // "Lacute"
-               CHARS.put("'l", "&#314;"); // "lacute"
-               CHARS.put("cL", "&#315;"); // "Lcedil"
-               CHARS.put("cl", "&#316;"); // "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", "&#319;"); // "Lmidot"
-               CHARS.put("lmidot", "&#320;"); // "lmidot"
-               CHARS.put("L", "&#321;"); // "Lstrok"
-               CHARS.put("l", "&#322;"); // "lstrok"
-               CHARS.put("'N", "&#323;"); // "Nacute"
-               CHARS.put("'n", "&#324;"); // "nacute"
-               CHARS.put("cN", "&#325;"); // "Ncedil"
-               CHARS.put("cn", "&#326;"); // "ncedil"
-               CHARS.put("vN", "&#327;"); // "Ncaron"
-               CHARS.put("vn", "&#328;"); // "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", "&#330;"); // "ENG"
-               CHARS.put("ng", "&#331;"); // "eng"
-               CHARS.put("=O", "&#332;"); // "Omacr"
-               CHARS.put("=o", "&#333;"); // "omacr"
-               CHARS.put("uO", "&#334;"); // "Obreve"
-               CHARS.put("uo", "&#335;"); // "obreve"
-               CHARS.put("HO", "&#336;"); // "Odblac"
-               CHARS.put("Ho", "&#337;"); // "odblac"
-               CHARS.put("OE", "&#338;"); // "OElig"
-               CHARS.put("oe", "&#339;"); // "oelig"
-               CHARS.put("'R", "&#340;"); // "Racute"
-               CHARS.put("'r", "&#341;"); // "racute"
-               CHARS.put("cR", "&#342;"); // "Rcedil"
-               CHARS.put("cr", "&#343;"); // "rcedil"
-               CHARS.put("vR", "&#344;"); // "Rcaron"
-               CHARS.put("vr", "&#345;"); // "rcaron"
-               CHARS.put("'S", "&#346;"); // "Sacute"
-               CHARS.put("'s", "&#347;"); // "sacute"
-               CHARS.put("^S", "&#348;"); // "Scirc"
-               CHARS.put("^s", "&#349;"); // "scirc"
-               CHARS.put("cS", "&#350;"); // "Scedil"
-               CHARS.put("cs", "&#351;"); // "scedil"
-               CHARS.put("vS", "&#352;"); // "Scaron"
-               CHARS.put("vs", "&#353;"); // "scaron"
-               CHARS.put("cT", "&#354;"); // "Tcedil"
-               CHARS.put("ct", "&#355;"); // "tcedil"
-               CHARS.put("vT", "&#356;"); // "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", "&#358;"); // "Tstrok"
-               CHARS.put("tstrok", "&#359;"); // "tstrok"
-               CHARS.put("~U", "&#360;"); // "Utilde"
-               CHARS.put("~u", "&#361;"); // "utilde"
-               CHARS.put("=U", "&#362;"); // "Umacr"
-               CHARS.put("=u", "&#363;"); // "umacr"
-               CHARS.put("uU", "&#364;"); // "Ubreve"
-               CHARS.put("uu", "&#365;"); // "ubreve"
-               CHARS.put("rU", "&#366;"); // "Uring"
-               CHARS.put("ru", "&#367;"); // "uring"
-               CHARS.put("HU", "&#368;"); // "Odblac"
-               CHARS.put("Hu", "&#369;"); // "odblac"
-               CHARS.put("kU", "&#370;"); // "Uogon"
-               CHARS.put("ku", "&#371;"); // "uogon"
-               CHARS.put("^W", "&#372;"); // "Wcirc"
-               CHARS.put("^w", "&#373;"); // "wcirc"
-               CHARS.put("^Y", "&#374;"); // "Ycirc"
-               CHARS.put("^y", "&#375;"); // "ycirc"
-               CHARS.put("\"Y", "&#376;"); // "Yuml"
-               CHARS.put("'Z", "&#377;"); // "Zacute"
-               CHARS.put("'z", "&#378;"); // "zacute"
-               CHARS.put(".Z", "&#379;"); // "Zdot"
-               CHARS.put(".z", "&#380;"); // "zdot"
-               CHARS.put("vZ", "&#381;"); // "Zcaron"
-               CHARS.put("vz", "&#382;"); // "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
     }
index 51716b4..2e41117 100644 (file)
@@ -6,13 +6,14 @@ import net.sf.jabref.export.layout.LayoutFormatter;
 /**
  * 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("&|\\\\&", "&amp;").replaceAll("[\\n]{1,}", "<p>");
+               field = field.replaceAll("&|\\\\&", "&amp;").replaceAll("[\\n]{2,}", "<p>")
+                .replaceAll("\\n", "<br>");
 
                StringBuffer sb = new StringBuffer();
                StringBuffer currentCommand = null;
index 86db9b5..c1327f9 100644 (file)
@@ -16,7 +16,10 @@ public class LastPage implements LayoutFormatter {
                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
index 8fbf8ff..5524b91 100644 (file)
@@ -14,10 +14,12 @@ import net.sf.jabref.export.layout.LayoutFormatter;
  *   
  *   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 {
@@ -150,7 +152,7 @@ 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) {
index fc6a2a5..cbcea29 100644 (file)
@@ -11,7 +11,7 @@ import net.sf.jabref.export.layout.LayoutFormatter;
  * 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 {
 
diff --git a/src/java/net/sf/jabref/external/TransferableFileLinkSelection.java b/src/java/net/sf/jabref/external/TransferableFileLinkSelection.java
new file mode 100644 (file)
index 0000000..55dd56e
--- /dev/null
@@ -0,0 +1,111 @@
+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;
+    } */
+}
index dae7be8..68ee761 100644 (file)
@@ -33,6 +33,9 @@ import java.awt.Insets;
 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;
@@ -43,6 +46,9 @@ import net.sf.jabref.Globals;
 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
@@ -53,6 +59,10 @@ class AutoGroupDialog extends JDialog implements CaretListener {
             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
@@ -93,18 +103,35 @@ class AutoGroupDialog extends JDialog implements CaretListener {
                 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));
                 }
@@ -140,8 +167,42 @@ class AutoGroupDialog extends JDialog implements CaretListener {
         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")));
@@ -186,12 +247,14 @@ class AutoGroupDialog extends JDialog implements CaretListener {
         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);
     }
 
index 517c112..e6a1f06 100644 (file)
 
 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;
@@ -47,7 +45,9 @@ import net.sf.jabref.Globals;
 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;
@@ -107,8 +107,15 @@ public class EntryTableTransferHandler extends TransferHandler {
         * 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();
+        }
        }
 
        /**
@@ -189,10 +196,10 @@ public class EntryTableTransferHandler extends TransferHandler {
                // 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());
@@ -204,8 +211,9 @@ public class EntryTableTransferHandler extends TransferHandler {
             // We have an icon column:
             if (res == MainTableFormat.FILE) {
                 System.out.println("dragging file");
+                draggingFile = true;
             }
-        }*/
+        }
         super.exportAsDrag(comp, e, DnDConstants.ACTION_LINK);
        }
 
@@ -222,7 +230,7 @@ public class EntryTableTransferHandler extends TransferHandler {
        // 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))
index ce18ace..21c4ef6 100644 (file)
@@ -22,8 +22,7 @@
 
 package net.sf.jabref.groups;
 
-import java.awt.Color;
-import java.awt.Component;
+import java.awt.*;
 
 import javax.swing.BorderFactory;
 import javax.swing.ImageIcon;
@@ -42,6 +41,9 @@ import net.sf.jabref.Util;
  * @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;
@@ -69,6 +71,7 @@ public class GroupTreeCellRenderer extends DefaultTreeCellRenderer {
         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
@@ -94,6 +97,9 @@ public class GroupTreeCellRenderer extends DefaultTreeCellRenderer {
                 }
             }
         }
+        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)
@@ -102,7 +108,7 @@ public class GroupTreeCellRenderer extends DefaultTreeCellRenderer {
             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)
@@ -111,6 +117,7 @@ public class GroupTreeCellRenderer extends DefaultTreeCellRenderer {
             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>");
index ec1d4ed..68402a8 100644 (file)
@@ -62,8 +62,8 @@ public class KeywordGroup extends AbstractGroup implements SearchRule {
 
        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);
        }
 
        /**
@@ -239,11 +239,33 @@ public class KeywordGroup extends AbstractGroup implements SearchRule {
                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.
index 410cfe3..f23e851 100644 (file)
@@ -4,11 +4,13 @@ import javax.swing.text.JTextComponent;
 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;
@@ -18,12 +20,27 @@ public class AutoCompleteListener extends KeyAdapter {
     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)) {
@@ -190,19 +207,27 @@ public class AutoCompleteListener extends KeyAdapter {
 
         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 r