diff --git a/source/distro/changelog.txt b/source/distro/changelog.txt
index fd31513..1d4a82b 100644
--- a/source/distro/changelog.txt
+++ b/source/distro/changelog.txt
@@ -2,8 +2,11 @@ Changelog for Writer2LaTeX version 1.0 -> 1.2
---------- version 1.1.6 ----------
+[w2l] New option use_natbib (default false) to use natbib.sty. This implies that natbib.sty is no longer loaded automatically
+ if Zotero or JabRef support is enabled
+
[w4l] Bibliography options page has been reworked to include JabRef support and unify BibTeX directory (which is now allowed
- to contain special characters like spaces)
+ to contain special characters like spaces and can be relative to the the document directory)
[w2l] Added support for JabRef reference marks: A new option jabref_bibtex_files has been added to give the names of
the BibTeX files from JabRef
diff --git a/source/distro/doc/user-manual.odt b/source/distro/doc/user-manual.odt
index c204083..c01610c 100644
Binary files a/source/distro/doc/user-manual.odt and b/source/distro/doc/user-manual.odt differ
diff --git a/source/java/org/openoffice/da/comp/writer4latex/BibliographyDialog.java b/source/java/org/openoffice/da/comp/writer4latex/BibliographyDialog.java
index e421c0e..0061ceb 100644
--- a/source/java/org/openoffice/da/comp/writer4latex/BibliographyDialog.java
+++ b/source/java/org/openoffice/da/comp/writer4latex/BibliographyDialog.java
@@ -20,7 +20,7 @@
*
* All Rights Reserved.
*
- * Version 1.2 (2011-01-24)
+ * Version 1.2 (2011-01-28)
*
*/
@@ -35,8 +35,12 @@ import com.sun.star.awt.XContainerWindowEventHandler;
import com.sun.star.awt.XDialog;
import com.sun.star.awt.XWindow;
import com.sun.star.beans.XPropertySet;
+import com.sun.star.frame.XDesktop;
+import com.sun.star.frame.XModel;
+import com.sun.star.lang.XComponent;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.uno.AnyConverter;
+import com.sun.star.uno.Exception;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.util.XChangesBatch;
@@ -45,9 +49,13 @@ import com.sun.star.lib.uno.helper.WeakBase;
import org.openoffice.da.comp.w2lcommon.helper.DialogAccess;
import org.openoffice.da.comp.w2lcommon.helper.FolderPicker;
+import org.openoffice.da.comp.w2lcommon.helper.MessageBox;
import org.openoffice.da.comp.w2lcommon.helper.RegistryHelper;
import org.openoffice.da.comp.w2lcommon.helper.XPropertySetHelper;
+import writer2latex.util.CSVList;
+import writer2latex.util.Misc;
+
/** This class provides a uno component which implements the configuration
* of the bibliography in Writer4LaTeX.
*/
@@ -85,9 +93,6 @@ public final class BibliographyDialog
if (sMethod.equals("external_event") ){
return handleExternalEvent(dlg, event);
}
- else if (sMethod.equals("BibTeXDirClick")) {
- return bibTeXDirClick(dlg);
- }
else if (sMethod.equals("ConvertZoteroCitationsChange")) {
return convertZoteroCitationsChange(dlg);
}
@@ -97,6 +102,15 @@ public final class BibliographyDialog
else if (sMethod.equals("UseExternalBibTeXFilesChange")) {
return useExternalBibTeXFilesChange(dlg);
}
+ else if (sMethod.equals("UseNatbibChange")) {
+ return useNatbibChange(dlg);
+ }
+ else if (sMethod.equals("BibTeXLocationChange")) {
+ return bibTeXLocationChange(dlg);
+ }
+ else if (sMethod.equals("BibTeXDirClick")) {
+ return bibTeXDirClick(dlg);
+ }
}
catch (com.sun.star.uno.RuntimeException e) {
throw e;
@@ -109,7 +123,7 @@ public final class BibliographyDialog
public String[] getSupportedMethodNames() {
String[] sNames = { "external_event", "UseExternalBibTeXFilesChange", "ConvertZoteroCitationsChange",
- "ConvertJabRefCitationsChange", "ExternalBibTeXDirClick" };
+ "ConvertJabRefCitationsChange", "UseNatbibChange", "BibTeXLocationChange", "ExternalBibTeXDirClick" };
return sNames;
}
@@ -138,6 +152,8 @@ public final class BibliographyDialog
return true;
} else if (sMethod.equals("back") || sMethod.equals("initialize")) {
loadConfiguration(dlg);
+ enableBibTeXSettings(dlg);
+ useNatbibChange(dlg);
return true;
}
}
@@ -160,8 +176,12 @@ public final class BibliographyDialog
XPropertySetHelper.getPropertyValueAsBoolean(xProps, "ConvertZoteroCitations"));
dlg.setCheckBoxStateAsBoolean("ConvertJabRefCitations",
XPropertySetHelper.getPropertyValueAsBoolean(xProps, "ConvertJabRefCitations"));
- dlg.setTextFieldText("NatbibOptions",
+ dlg.setCheckBoxStateAsBoolean("UseNatbib",
+ XPropertySetHelper.getPropertyValueAsBoolean(xProps, "UseNatbib"));
+ dlg.setTextFieldText("NatbibOptions",
XPropertySetHelper.getPropertyValueAsString(xProps, "NatbibOptions"));
+ dlg.setListBoxSelectedItem("BibTeXLocation",
+ XPropertySetHelper.getPropertyValueAsShort(xProps, "BibTeXLocation"));
dlg.setTextFieldText("BibTeXDir",
XPropertySetHelper.getPropertyValueAsString(xProps, "BibTeXDir"));
registry.disposeRegistryView(view);
@@ -184,7 +204,9 @@ public final class BibliographyDialog
XPropertySetHelper.setPropertyValue(xProps, "UseExternalBibTeXFiles", dlg.getCheckBoxStateAsBoolean("UseExternalBibTeXFiles"));
XPropertySetHelper.setPropertyValue(xProps, "ConvertZoteroCitations", dlg.getCheckBoxStateAsBoolean("ConvertZoteroCitations"));
XPropertySetHelper.setPropertyValue(xProps, "ConvertJabRefCitations", dlg.getCheckBoxStateAsBoolean("ConvertJabRefCitations"));
+ XPropertySetHelper.setPropertyValue(xProps, "UseNatbib", dlg.getCheckBoxStateAsBoolean("UseNatbib"));
XPropertySetHelper.setPropertyValue(xProps, "NatbibOptions", dlg.getTextFieldText("NatbibOptions"));
+ XPropertySetHelper.setPropertyValue(xProps, "BibTeXLocation", dlg.getListBoxSelectedItem("BibTeXLocation"));
XPropertySetHelper.setPropertyValue(xProps, "BibTeXDir", dlg.getTextFieldText("BibTeXDir"));
// Commit registry changes
@@ -205,43 +227,114 @@ public final class BibliographyDialog
}
private boolean useExternalBibTeXFilesChange(DialogAccess dlg) {
- enableBibTeXDir(dlg);
+ enableBibTeXSettings(dlg);
return true;
}
private boolean convertZoteroCitationsChange(DialogAccess dlg) {
- enableNatbibOptions(dlg);
- enableBibTeXDir(dlg);
+ enableBibTeXSettings(dlg);
return true;
}
private boolean convertJabRefCitationsChange(DialogAccess dlg) {
- enableNatbibOptions(dlg);
- enableBibTeXDir(dlg);
+ enableBibTeXSettings(dlg);
return true;
}
- private void enableNatbibOptions(DialogAccess dlg) {
- boolean bConvertZotero = dlg.getCheckBoxStateAsBoolean("ConvertZoteroCitations");
- boolean bConvertJabRef = dlg.getCheckBoxStateAsBoolean("ConvertJabRefCitations");
- dlg.setControlEnabled("NatbibOptionsLabel", bConvertZotero || bConvertJabRef);
- dlg.setControlEnabled("NatbibOptions", bConvertZotero || bConvertJabRef);
+ private boolean useNatbibChange(DialogAccess dlg) {
+ boolean bUseNatbib = dlg.getCheckBoxStateAsBoolean("UseNatbib");
+ dlg.setControlEnabled("NatbibOptionsLabel", bUseNatbib);
+ dlg.setControlEnabled("NatbibOptions", bUseNatbib);
+ return true;
}
-
- private void enableBibTeXDir(DialogAccess dlg) {
- boolean bExternal = dlg.getCheckBoxStateAsBoolean("UseExternalBibTeXFiles");
- boolean bConvertZotero = dlg.getCheckBoxStateAsBoolean("ConvertZoteroCitations");
- boolean bConvertJabRef = dlg.getCheckBoxStateAsBoolean("ConvertJabRefCitations");
- dlg.setControlEnabled("BibTeXDirLabel", bExternal || bConvertZotero || bConvertJabRef);
- dlg.setControlEnabled("BibTeXDir", bExternal || bConvertZotero || bConvertJabRef);
- dlg.setControlEnabled("BibTeXDirButton", bExternal|| bConvertZotero || bConvertJabRef);
+
+ private boolean bibTeXLocationChange(DialogAccess dlg) {
+ enableBibTeXSettings(dlg);
+ return true;
}
+ private void enableBibTeXSettings(DialogAccess dlg) {
+ boolean bEnableLocation = dlg.getCheckBoxStateAsBoolean("UseExternalBibTeXFiles")
+ || dlg.getCheckBoxStateAsBoolean("ConvertZoteroCitations")
+ || dlg.getCheckBoxStateAsBoolean("ConvertJabRefCitations");
+ boolean bEnableDir = dlg.getListBoxSelectedItem("BibTeXLocation")<2;
+ dlg.setControlEnabled("BibTeXLocationLabel", bEnableLocation);
+ dlg.setControlEnabled("BibTeXLocation", bEnableLocation);
+ dlg.setControlEnabled("BibTeXDirLabel", bEnableLocation && bEnableDir);
+ dlg.setControlEnabled("BibTeXDir", bEnableLocation && bEnableDir);
+ dlg.setControlEnabled("BibTeXDirButton", bEnableLocation && bEnableDir);
+ }
+
+ private String getDocumentDirURL() {
+ // Get the desktop from the service manager
+ Object desktop=null;
+ try {
+ desktop = xContext.getServiceManager().createInstanceWithContext("com.sun.star.frame.Desktop", xContext);
+ } catch (Exception e) {
+ // Failed to get the desktop service
+ return "";
+ }
+ XDesktop xDesktop = (XDesktop) UnoRuntime.queryInterface(XDesktop.class, desktop);
+
+ // Get the current component and verify that it really is a text document
+ if (xDesktop!=null) {
+ XComponent xComponent = xDesktop.getCurrentComponent();
+ XServiceInfo xInfo = (XServiceInfo)UnoRuntime.queryInterface(XServiceInfo.class, xComponent);
+ if (xInfo!=null && xInfo.supportsService("com.sun.star.text.TextDocument")) {
+ // Get the model, which provides the URL
+ XModel xModel = (XModel) UnoRuntime.queryInterface(XModel.class, xComponent);
+ if (xModel!=null) {
+ String sURL = xModel.getURL();
+ int nSlash = sURL.lastIndexOf('/');
+ return nSlash>-1 ? sURL.substring(0, nSlash) : "";
+ }
+ }
+ }
+
+ return "";
+ }
+
+ private boolean hasBibTeXFiles(File dir) {
+ if (dir.isDirectory()) {
+ File[] files = dir.listFiles();
+ for (File file : files) {
+ if (file.isFile() && file.getName().endsWith(".bib")) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
private boolean bibTeXDirClick(DialogAccess dlg) {
String sPath = folderPicker.getPath();
if (sPath!=null) {
try {
- dlg.setTextFieldText("BibTeXDir", new File(new URI(sPath)).getCanonicalPath());
+ File bibDir = new File(new URI(sPath));
+ String sBibPath = bibDir.getCanonicalPath();
+ if (dlg.getListBoxSelectedItem("BibTeXLocation")==1) {
+ // Path relative to document directory, remove the document directory part
+ String sDocumentDirURL = getDocumentDirURL();
+ if (sDocumentDirURL.length()>0) {
+ String sDocumentDirPath = new File(new URI(sDocumentDirURL)).getCanonicalPath();
+ if (sBibPath.startsWith(sDocumentDirPath)) {
+ if (sBibPath.length()>sDocumentDirPath.length()) {
+ sBibPath = sBibPath.substring(sDocumentDirPath.length()+1);
+ }
+ else { // Same as document directory
+ sBibPath = "";
+ }
+ }
+ else { // not a subdirectory
+ sBibPath = "";
+ }
+ }
+ }
+ dlg.setTextFieldText("BibTeXDir", sBibPath);
+ if (!hasBibTeXFiles(bibDir)) {
+ MessageBox msgBox = new MessageBox(xContext);
+ msgBox.showMessage("Writer4LaTeX warning", "The selected directory does not contain any BibTeX files");
+ }
}
catch (IOException e) {
}
diff --git a/source/java/org/openoffice/da/comp/writer4latex/Writer4LaTeX.java b/source/java/org/openoffice/da/comp/writer4latex/Writer4LaTeX.java
index f8c9696..05dde91 100644
--- a/source/java/org/openoffice/da/comp/writer4latex/Writer4LaTeX.java
+++ b/source/java/org/openoffice/da/comp/writer4latex/Writer4LaTeX.java
@@ -20,7 +20,7 @@
*
* All Rights Reserved.
*
- * Version 1.2 (2011-01-25)
+ * Version 1.2 (2011-01-28)
*
*/
@@ -36,15 +36,18 @@ import com.sun.star.beans.XPropertyAccess;
import com.sun.star.beans.XPropertySet;
import com.sun.star.container.XNameAccess;
import com.sun.star.frame.XController;
+import com.sun.star.frame.XDesktop;
import com.sun.star.frame.XFrame;
import com.sun.star.frame.XModel;
import com.sun.star.frame.XStorable;
+import com.sun.star.lang.XComponent;
+import com.sun.star.lang.XServiceInfo;
import com.sun.star.lib.uno.helper.WeakBase;
import com.sun.star.task.XStatusIndicator;
import com.sun.star.task.XStatusIndicatorFactory;
import com.sun.star.ui.dialogs.ExecutableDialogResults;
import com.sun.star.ui.dialogs.XExecutableDialog;
-import com.sun.star.uno.AnyConverter;
+import com.sun.star.uno.Exception;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
@@ -221,22 +224,24 @@ public final class Writer4LaTeX extends WeakBase
try {
Object view = registry.getRegistryView(BibliographyDialog.REGISTRY_PATH, false);
XPropertySet xProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class,view);
- String sBibTeXFiles = getFileList(XPropertySetHelper.getPropertyValueAsString(xProps, "BibTeXDir"));
+ String sBibTeXFiles = getFileList(XPropertySetHelper.getPropertyValueAsShort(xProps, "BibTeXLocation"),
+ XPropertySetHelper.getPropertyValueAsString(xProps, "BibTeXDir"));
if (XPropertySetHelper.getPropertyValueAsBoolean(xProps, "ConvertZoteroCitations")) {
filterHelper.put("zotero_bibtex_files", sBibTeXFiles);
- filterHelper.put("natbib_options", XPropertySetHelper.getPropertyValueAsString(xProps, "NatbibOptions"));
}
if (XPropertySetHelper.getPropertyValueAsBoolean(xProps, "ConvertJabRefCitations")) {
filterHelper.put("jabref_bibtex_files", sBibTeXFiles);
- filterHelper.put("natbib_options", XPropertySetHelper.getPropertyValueAsString(xProps, "NatbibOptions"));
}
if (XPropertySetHelper.getPropertyValueAsBoolean(xProps, "UseExternalBibTeXFiles")) {
filterHelper.put("external_bibtex_files", sBibTeXFiles);
}
String sBibTeXDir = XPropertySetHelper.getPropertyValueAsString(xProps, "BibTeXDir");
if (sBibTeXDir.length()>0) {
- sBibinputs = sBibTeXDir+":";
+ // The separator character in BIBINPUTS is OS specific
+ sBibinputs = sBibTeXDir+File.pathSeparatorChar;
}
+ filterHelper.put("use_natbib", Boolean.toString(XPropertySetHelper.getPropertyValueAsBoolean(xProps, "UseNatbib")));
+ filterHelper.put("natbib_options", XPropertySetHelper.getPropertyValueAsString(xProps, "NatbibOptions"));
mediaHelper.put("FilterData",filterHelper.toArray());
mediaProps = mediaHelper.toArray();
@@ -295,9 +300,20 @@ public final class Writer4LaTeX extends WeakBase
xStatus.end();
}
-
- private String getFileList(String sDirectory) {
- File dir = new File(sDirectory);
+
+ private String getFileList(short nType, String sDirectory) {
+ File dir;
+ switch (nType) {
+ case 0: // absolute path
+ dir = new File(sDirectory);
+ break;
+ case 1: // relative path
+ dir = new File(urlToFile(sBasePath),sDirectory);
+ break;
+ default: // document directory
+ dir = urlToFile(sBasePath);
+ }
+
CSVList filelist = new CSVList(",");
if (dir.isDirectory()) {
File[] files = dir.listFiles();
diff --git a/source/java/writer2latex/api/ConverterFactory.java b/source/java/writer2latex/api/ConverterFactory.java
index e2744c4..370579a 100644
--- a/source/java/writer2latex/api/ConverterFactory.java
+++ b/source/java/writer2latex/api/ConverterFactory.java
@@ -20,7 +20,7 @@
*
* All Rights Reserved.
*
- * Version 1.2 (2011-01-25)
+ * Version 1.2 (2011-01-28)
*
*/
@@ -33,7 +33,7 @@ public class ConverterFactory {
// Version information
private static final String VERSION = "1.1.6";
- private static final String DATE = "2011-01-25";
+ private static final String DATE = "2011-01-28";
/** Return the Writer2LaTeX version in the form
* (major version).(minor version).(patch level)
diff --git a/source/java/writer2latex/latex/BibConverter.java b/source/java/writer2latex/latex/BibConverter.java
index d91f8d5..55ac638 100644
--- a/source/java/writer2latex/latex/BibConverter.java
+++ b/source/java/writer2latex/latex/BibConverter.java
@@ -16,11 +16,11 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
- * Copyright: 2002-2010 by Henrik Just
+ * Copyright: 2002-2011 by Henrik Just
*
* All Rights Reserved.
*
- * Version 1.2 (2010-03-28)
+ * Version 1.2 (2011-01-27)
*
*/
@@ -79,7 +79,14 @@ public class BibConverter extends ConverterHelper {
* other declarations should be added.
*/
public void appendDeclarations(LaTeXDocumentPortion pack, LaTeXDocumentPortion decl) {
- // Currently nothing; may add support for eg. natbib later
+ // Use natbib
+ if (config.useBibtex() && config.useNatbib()) {
+ pack.append("\\usepackage");
+ if (config.getNatbibOptions().length()>0) {
+ pack.append("[").append(config.getNatbibOptions()).append("]");
+ }
+ pack.append("{natbib}").nl();
+ }
}
/** Process a bibliography (text:bibliography tag)
diff --git a/source/java/writer2latex/latex/FieldConverter.java b/source/java/writer2latex/latex/FieldConverter.java
index 4b962f0..9526f26 100644
--- a/source/java/writer2latex/latex/FieldConverter.java
+++ b/source/java/writer2latex/latex/FieldConverter.java
@@ -20,7 +20,7 @@
*
* All Rights Reserved.
*
- * Version 1.2 (2011-01-24)
+ * Version 1.2 (2011-01-28)
*
*/
@@ -59,8 +59,7 @@ public class FieldConverter extends ConverterHelper {
// Identify Zotero items
private static final String ZOTERO_ITEM = "ZOTERO_ITEM";
// Identify JabRef items
- private static final String JABREF_ITEM_1 = "JR_cite_1";
- private static final String JABREF_ITEM_2 = "JR_cite_2";
+ private static final String JABREF_ITEM = "JR_cite";
// Links & references
private ExportNameCollection targets = new ExportNameCollection(true);
@@ -83,7 +82,7 @@ public class FieldConverter extends ConverterHelper {
private boolean bUsesOooref = false;
private boolean bConvertZotero = false;
private boolean bConvertJabRef = false;
- private boolean bNeedNatbib = false;
+ private boolean bUseNatbib = false;
public FieldConverter(OfficeReader ofr, LaTeXConfig config, ConverterPalette palette) {
super(ofr,config,palette);
@@ -91,6 +90,7 @@ public class FieldConverter extends ConverterHelper {
bUseHyperref = config.useHyperref() && !config.useTitleref() && !config.useOooref();
bConvertZotero = config.useBibtex() && config.zoteroBibtexFiles().length()>0;
bConvertJabRef = config.useBibtex() && config.jabrefBibtexFiles().length()>0;
+ bUseNatbib = config.useBibtex() && config.useNatbib();
}
/**
Append declarations needed by the FieldConverter
to
@@ -138,16 +138,7 @@ public class FieldConverter extends ConverterHelper {
}
pack.append("}").nl();
}
-
- // Use natbib
- if (bNeedNatbib) {
- pack.append("\\usepackage");
- if (config.getNatbibOptions().length()>0) {
- pack.append("[").append(config.getNatbibOptions()).append("]");
- }
- pack.append("{natbib}").nl();
- }
-
+
// Export sequence declarations
// The number format is fetched from the first occurence of the
// sequence in the text, while the outline level and the separation
@@ -484,129 +475,165 @@ public class FieldConverter extends ConverterHelper {
if (citationItemsArray!=null) {
int nCitationCount = citationItemsArray.length();
- if (nCitationCount>1) {
- // For multiple citations, use \citetext, otherwise we cannot add individual prefixes and suffixes
- // TODO: If no prefixes or suffixes exist, it's safe to combine the citations
- ldp.append("\\citetext{");
- }
- for (int nIndex=0; nIndex