From 84f4d5cb207e9f439bbdcadb488b1dee2a67d4e1 Mon Sep 17 00:00:00 2001 From: henrikjust Date: Wed, 8 Dec 2010 09:16:49 +0000 Subject: [PATCH] W2L custom config ui refactoring + some LaTeX and EPUB fixes git-svn-id: svn://svn.code.sf.net/p/writer2latex/code/trunk@78 f0f2a975-2e09-46c8-9428-3b39399b9f3c --- source/distro/changelog.txt | 11 + source/distro/doc/user-manual.odt | Bin 48701 -> 48860 bytes .../filter/ConfigurationDialogBase.java | 2 +- .../writer2latex/ConfigurationDialog.java | 1546 ++++++++--------- .../writer2latex/api/ConverterFactory.java | 4 +- .../latex/CharStyleConverter.java | 6 +- .../writer2latex/latex/i18n/XeTeXI18n.java | 53 +- source/java/writer2latex/util/Misc.java | 23 +- .../writer2latex/xhtml/TextConverter.java | 15 +- .../xhtml/TextStyleConverter.java | 36 +- .../java/writer2latex/xhtml/XhtmlConfig.java | 51 +- .../export.xhp | 4 +- 12 files changed, 834 insertions(+), 917 deletions(-) diff --git a/source/distro/changelog.txt b/source/distro/changelog.txt index 30e24c1..19058f7 100644 --- a/source/distro/changelog.txt +++ b/source/distro/changelog.txt @@ -2,6 +2,17 @@ Changelog for Writer2LaTeX version 1.0 -> 1.2 ---------- version 1.1.9 ---------- +[w2x] In EPUB export, convert_to_px=true now (despite the name) exports relative font sizes + +[w2l] Custom config ui is now refactored to use ConfigurationDialogBase, fixing some minor bugs + +[w2l] String replace now also works with XeTeX as backend + +[w2l] Bugfix: The verbatim attribute for character style maps now also works if formatting=ignore_all + +[w2x] New option external_toc_depth to set the number of levels to include in the external table of contents + in EPUB export (default value is "auto", which determines the depth from the split level) + [w2x] New option page_break_split with values none (default), styles (split on page breaks defined by a style), explicit (split on all explicit page breaks, manual or defined by a style), all (split on all page breaks, including soft page breaks (will not split until current paragraph, table or list is finished)) diff --git a/source/distro/doc/user-manual.odt b/source/distro/doc/user-manual.odt index 3022c3bdd7f2e3d10035288a3a1921481a273618..641dabc7ebd20188bda34a15a6db781ac3033bc1 100644 GIT binary patch delta 42101 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 AiU0rr delta 41906 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 T+6MqwwkFqf(Zap9{q_DAHu<7N diff --git a/source/java/org/openoffice/da/comp/w2lcommon/filter/ConfigurationDialogBase.java b/source/java/org/openoffice/da/comp/w2lcommon/filter/ConfigurationDialogBase.java index c811ad0..9a717d5 100644 --- a/source/java/org/openoffice/da/comp/w2lcommon/filter/ConfigurationDialogBase.java +++ b/source/java/org/openoffice/da/comp/w2lcommon/filter/ConfigurationDialogBase.java @@ -577,7 +577,7 @@ public abstract class ConfigurationDialogBase extends WeakBase implements XConta private String sCurrentStyleName = null; // Access to display names of the styles in the current document - private StyleNameProvider styleNameProvider = null; + protected StyleNameProvider styleNameProvider = null; // Some methods to be implemented by the subclass protected abstract String getDefaultConfigName(); diff --git a/source/java/org/openoffice/da/comp/writer2latex/ConfigurationDialog.java b/source/java/org/openoffice/da/comp/writer2latex/ConfigurationDialog.java index 1e4f888..0c9666d 100644 --- a/source/java/org/openoffice/da/comp/writer2latex/ConfigurationDialog.java +++ b/source/java/org/openoffice/da/comp/writer2latex/ConfigurationDialog.java @@ -20,83 +20,30 @@ * * All Rights Reserved. * - * Version 1.2 (2010-11-21) + * Version 1.2 (2010-12-08) * */ package org.openoffice.da.comp.writer2latex; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.text.Collator; -import java.util.Arrays; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; -import java.util.Set; - -import com.sun.star.awt.XContainerWindowEventHandler; -import com.sun.star.awt.XDialog; -import com.sun.star.awt.XDialogProvider2; -import com.sun.star.awt.XWindow; -import com.sun.star.io.NotConnectedException; -import com.sun.star.io.XInputStream; -import com.sun.star.io.XOutputStream; -import com.sun.star.lang.XMultiComponentFactory; -import com.sun.star.lang.XServiceInfo; -import com.sun.star.ucb.CommandAbortedException; -import com.sun.star.ucb.XSimpleFileAccess2; -import com.sun.star.ui.dialogs.ExecutableDialogResults; -import com.sun.star.uno.AnyConverter; -import com.sun.star.uno.UnoRuntime; -import com.sun.star.uno.XComponentContext; -import com.sun.star.util.XStringSubstitution; - -import com.sun.star.lib.uno.helper.WeakBase; -import com.sun.star.lib.uno.adapter.XInputStreamToInputStreamAdapter; -import com.sun.star.lib.uno.adapter.XOutputStreamToOutputStreamAdapter; import writer2latex.api.ComplexOption; -import writer2latex.api.Config; -import writer2latex.api.ConverterFactory; +import org.openoffice.da.comp.w2lcommon.filter.ConfigurationDialogBase; import org.openoffice.da.comp.w2lcommon.helper.DialogAccess; -import org.openoffice.da.comp.w2lcommon.helper.StyleNameProvider; -/** This class provides a uno component which implements the configuration +import com.sun.star.lang.XServiceInfo; +import com.sun.star.uno.XComponentContext; + +/** This class provides a UNO component which implements the configuration * of Writer2LaTeX. The same component is used for all pages - using the * dialog title to distinguish between the pages. */ -public final class ConfigurationDialog extends WeakBase - implements XServiceInfo, XContainerWindowEventHandler { - - private String[] sFamilyNames = { "text", "paragraph", "paragraph-block", "list", "listitem" }; - private String[] sOOoFamilyNames = { "CharacterStyles", "ParagraphStyles", "ParagraphStyles", "NumberingStyles", "NumberingStyles" }; - private String[] sAttributeNames = { "bold", "italic", "small-caps", "superscript", "subscipt" }; +public final class ConfigurationDialog extends ConfigurationDialogBase implements XServiceInfo { - private XComponentContext xContext; - private XSimpleFileAccess2 sfa2; - private String sConfigFileName = null; - Config config; - // Local cache of complex options - ComplexOption[] styleMap; - ComplexOption attributeMap; - ComplexOption headingMap; - ComplexOption mathSymbols; - ComplexOption stringReplace; - short nCurrentFamily = -1; - String sCurrentStyleName = null; - short nCurrentAttribute = -1; - short nCurrentWriterLevel = 0; - String sCurrentMathSymbol = null; - String sCurrentText = null; - private String sTitle = null; - private DialogAccess dlg = null; - private StyleNameProvider styleNameProvider = null; - private CustomSymbolNameProvider customSymbolNameProvider = null; - - /** The component will be registered under this name. + /** The component will be registered under this name. */ public static String __serviceName = "org.openoffice.da.writer2latex.ConfigurationDialog"; @@ -104,8 +51,676 @@ public final class ConfigurationDialog extends WeakBase */ public static String __implementationName = "org.openoffice.da.comp.writer2latex.ConfigurationDialog"; - /** Create a new ConfigurationDialog */ + // Implement the interface XServiceInfo + public boolean supportsService(String sServiceName) { + return sServiceName.equals(__serviceName); + } + + public String getImplementationName() { + return __implementationName; + } + + public String[] getSupportedServiceNames() { + String[] sSupportedServiceNames = { __serviceName }; + return sSupportedServiceNames; + } + + // Configure the base class + @Override protected String getMIMEType() { return "application/x-latex"; } + + @Override protected String getDialogLibraryName() { return "W2LDialogs2"; } + + @Override protected String getConfigFileName() { return "writer2latex.xml"; } + + /** Construct a new ConfigurationDialog */ public ConfigurationDialog(XComponentContext xContext) { + super(xContext); + + pageHandlers.put("Documentclass", new DocumentclassHandler()); + pageHandlers.put("Headings", new HeadingsHandler()); + pageHandlers.put("Styles", new StylesHandler()); + pageHandlers.put("Characters", new CharactersHandler()); + pageHandlers.put("Fonts", new FontsHandler()); + pageHandlers.put("Pages", new PagesHandler()); + //pageHandlers.put("Tables", new Handler()); + //pageHandlers.put("Figures", new Handler()); + //pageHandlers.put("TextAndMath", new Handler()); + } + + // Implement remaining method from XContainerWindowEventHandler + public String[] getSupportedMethodNames() { + String[] sNames = { + "NoPreambleChange", // Documentclass + "MaxLevelChange", "WriterLevelChange", "NoIndexChange", // Headings + "StyleFamilyChange", "StyleNameChange", "NewStyleClick", "DeleteStyleClick", "AddNextClick", + "RemoveNextClick", "LoadDefaultsClick", // Styles + "UseSoulChange", "FormattingAttributeChange", "CustomAttributeChange", // Characters + "ExportGeometryChange", "ExportHeaderAndFooterChange", // Pages + "NoTablesChange", "UseSupertabularChange", "UseLongtableChange", // Tables + "NoImagesChange", // Images + "MathSymbolNameChange", "NewSymbolClick", "DeleteSymbolClick", + "TextInputChange", "NewTextClick", "DeleteTextClick" // Text and Math + }; + return sNames; + } + + // The page "Documentclass" + // This page handles the options no_preamble, documentclass, global_options and the custom-preamble + private class DocumentclassHandler extends PageHandler { + @Override protected void setControls(DialogAccess dlg) { + checkBoxFromConfig(dlg,"NoPreamble","no_preamble"); + textFieldFromConfig(dlg,"Documentclass","documentclass"); + textFieldFromConfig(dlg,"GlobalOptions","global_options"); + textFieldFromConfig(dlg,"CustomPreamble","custom-preamble"); + noPreambleChange(dlg); + } + + @Override protected void getControls(DialogAccess dlg) { + checkBoxToConfig(dlg,"NoPreamble", "no_preamble"); + textFieldToConfig(dlg,"Documentclass","documentclass"); + textFieldToConfig(dlg,"GlobalOptions","global_options"); + textFieldToConfig(dlg,"CustomPreamble","custom-preamble"); + } + + @Override protected boolean handleEvent(DialogAccess dlg, String sMethod) { + if (sMethod.equals("NoPreambleChange")) { + noPreambleChange(dlg); + return true; + } + return false; + } + + private void noPreambleChange(DialogAccess dlg) { + boolean bPreamble = !dlg.getCheckBoxStateAsBoolean("NoPreamble"); + dlg.setControlEnabled("DocumentclassLabel",bPreamble); + dlg.setControlEnabled("Documentclass",bPreamble); + dlg.setControlEnabled("GlobalOptionsLabel",bPreamble); + dlg.setControlEnabled("GlobalOptions",bPreamble); + dlg.setControlEnabled("CustomPreambleLabel",bPreamble); + dlg.setControlEnabled("CustomPreamble",bPreamble); + } + } + + // The page "Headings" + // This page handles the heading map as well as the options no_index, use_titlesec and use_titletoc + private class HeadingsHandler extends PageHandler { + ComplexOption headingMap = new ComplexOption(); // Cached heading map + short nCurrentWriterLevel = -1; // Currently displayed level + + @Override protected void setControls(DialogAccess dlg) { + // Load heading map from config + headingMap.clear(); + headingMap.copyAll(config.getComplexOption("heading-map")); + nCurrentWriterLevel = -1; + + // Determine and set the max level (from 0 to 10) + short nMaxLevel = 0; + while(nMaxLevel<10 && headingMap.containsKey(Integer.toString(nMaxLevel+1))) { + nMaxLevel++; + } + dlg.setListBoxSelectedItem("MaxLevel", nMaxLevel); + + // Get other controls from config + checkBoxFromConfig(dlg,"UseTitlesec","use_titlesec"); + + checkBoxFromConfig(dlg,"NoIndex","no_index"); + checkBoxFromConfig(dlg,"UseTitletoc","use_titletoc"); + + noIndexChange(dlg); + } + + @Override protected void getControls(DialogAccess dlg) { + updateHeadingMap(dlg); + + // Save heading map to config + config.getComplexOption("heading-map").clear(); + int nMaxLevel = dlg.getListBoxSelectedItem("MaxLevel"); + System.out.println("Using current max level of "+nMaxLevel); + for (int i=1; i<=nMaxLevel; i++) { + String sLevel = Integer.toString(i); + config.getComplexOption("heading-map").copy(sLevel,headingMap.get(sLevel)); + } + + // Save other controls to config + checkBoxToConfig(dlg,"UseTitlesec","use_titlesec"); + checkBoxToConfig(dlg,"NoIndex","no_index"); + checkBoxToConfig(dlg,"UseTitletoc","use_titletoc"); + } + + @Override protected boolean handleEvent(DialogAccess dlg, String sMethod) { + if (sMethod.equals("MaxLevelChange")) { + maxLevelChange(dlg); + return true; + } + else if (sMethod.equals("WriterLevelChange")) { + writerLevelChange(dlg); + return true; + } + else if (sMethod.equals("NoIndexChange")) { + noIndexChange(dlg); + return true; + } + return false; + } + + private void maxLevelChange(DialogAccess dlg) { + // Remember current writer level and clear it + short nPreviousWriterLevel = nCurrentWriterLevel; + dlg.setListBoxSelectedItem("WriterLevel", (short) -1); + + // Adjust the presented writer levels to the max level + short nMaxLevel = dlg.getListBoxSelectedItem("MaxLevel"); + String[] sWriterLevels = new String[nMaxLevel]; + for (int i=0; i0) { + short nNewWriterLevel; + if (nPreviousWriterLevel+1>nMaxLevel) { + // If we lower the max level, we may have to change the displayed Writer level + nNewWriterLevel = (short)(nMaxLevel-1); + } + else if (nPreviousWriterLevel>-1){ + // Otherwise reselect the current level, if any + nNewWriterLevel = nPreviousWriterLevel; + } + else { + // Or select the top level + nNewWriterLevel = (short) 0; + } + dlg.setListBoxSelectedItem("WriterLevel", nNewWriterLevel); + } + + // All controls should be disabled if the maximum level is zero + boolean bUpdate = dlg.getListBoxSelectedItem("MaxLevel")>0; + dlg.setControlEnabled("WriterLevelLabel", bUpdate); + dlg.setControlEnabled("WriterLevel", bUpdate); + dlg.setControlEnabled("LaTeXLevelLabel", bUpdate); + dlg.setControlEnabled("LaTeXLevel", bUpdate); + dlg.setControlEnabled("LaTeXNameLabel", bUpdate); + dlg.setControlEnabled("LaTeXName", bUpdate); + // Until implemented: + dlg.setControlEnabled("UseTitlesec", false); + //dlg.setControlEnabled("UseTitlesec", bUpdate); + } + + private void writerLevelChange(DialogAccess dlg) { + updateHeadingMap(dlg); + + // Load the values for the new level + nCurrentWriterLevel = dlg.getListBoxSelectedItem("WriterLevel"); + if (nCurrentWriterLevel>-1) { + String sLevel = Integer.toString(nCurrentWriterLevel+1); + if (headingMap.containsKey(sLevel)) { + Map attr = headingMap.get(sLevel); + dlg.setComboBoxText("LaTeXLevel", attr.containsKey("level") ? attr.get("level") : ""); + dlg.setComboBoxText("LaTeXName", attr.containsKey("name") ? attr.get("name") : ""); + } + else { + dlg.setListBoxSelectedItem("LaTeXLevel", (short)2); + dlg.setComboBoxText("LaTeXName", ""); + } + } + else { + dlg.setComboBoxText("LaTeXLevel", ""); + dlg.setComboBoxText("LaTeXName", ""); + } + } + + private void noIndexChange(DialogAccess dlg) { + // Until implemented: + dlg.setControlEnabled("UseTitletoc", false); + //boolean bNoIndex = dlg.getCheckBoxStateAsBoolean("NoIndex"); + //dlg.setControlEnabled("UseTitletoc", !bNoIndex); + } + + private void updateHeadingMap(DialogAccess dlg) { + // Save the current writer level in our cache + if (nCurrentWriterLevel>-1) { + System.out.println("Updating current definition for writer level "+nCurrentWriterLevel+ " from ui"); + Map attr = new HashMap(); + attr.put("name", dlg.getComboBoxText("LaTeXName")); + attr.put("level", dlg.getComboBoxText("LaTeXLevel")); + headingMap.put(Integer.toString(nCurrentWriterLevel+1), attr); + } + } + + } + + // The page "Styles" + // This page handles the various style maps as well as the options other_styles and formatting + // Limitation: Cannot handle the values "error" and "warning" for other_styles + private class StylesHandler extends StylesPageHandler { + private final String[] sLaTeXFamilyNames = { "text", "paragraph", "paragraph-block", "list", "listitem" }; + private final String[] sLaTeXOOoFamilyNames = { "CharacterStyles", "ParagraphStyles", "ParagraphStyles", "NumberingStyles", "NumberingStyles" }; + + protected StylesHandler() { + super(5); + sFamilyNames =sLaTeXFamilyNames; + sOOoFamilyNames = sLaTeXOOoFamilyNames; + } + + // Override standard PageHandler methods + @Override public void setControls(DialogAccess dlg) { + super.setControls(dlg); + + String sOtherStyles = config.getOption("other_styles"); + if ("accept".equals(sOtherStyles)) { + dlg.setListBoxSelectedItem("OtherStyles", (short)1); + } + else { + dlg.setListBoxSelectedItem("OtherStyles", (short)0); + } + + String sFormatting = config.getOption("formatting"); + if ("ignore_all".equals(sFormatting)) { + dlg.setListBoxSelectedItem("Formatting", (short)0); + } + else if ("ignore_most".equals(sFormatting)) { + dlg.setListBoxSelectedItem("Formatting", (short)1); + } + else if ("convert_most".equals(sFormatting)) { + dlg.setListBoxSelectedItem("Formatting", (short)3); + } + else if ("convert_all".equals(sFormatting)) { + dlg.setListBoxSelectedItem("Formatting", (short)4); + } + else { + dlg.setListBoxSelectedItem("Formatting", (short)2); + } + } + + @Override public void getControls(DialogAccess dlg) { + super.getControls(dlg); + + switch (dlg.getListBoxSelectedItem("OtherStyles")) { + case 0: config.setOption("other_styles", "ignore"); break; + case 1: config.setOption("other_styles", "accept"); + } + + switch (dlg.getListBoxSelectedItem("Formatting")) { + case 0: config.setOption("formatting", "ignore_all"); break; + case 1: config.setOption("formatting", "ignore_most"); break; + case 2: config.setOption("formatting", "convert_basic"); break; + case 3: config.setOption("formatting", "convert_most"); break; + case 4: config.setOption("formatting", "convert_all"); + } + } + + @Override protected boolean handleEvent(DialogAccess dlg, String sMethod) { + if (sMethod.equals("AddNextClick")) { + addNextClick(dlg); + return true; + } + else if (sMethod.equals("RemoveNextClick")) { + removeNextClick(dlg); + return true; + } + return super.handleEvent(dlg, sMethod); + } + + // Define methods required by super + protected String getDefaultConfigName() { + return "clean.xml"; + } + + protected void setControls(DialogAccess dlg, Map attr) { + // Always set before and after, and ensure they are defined + if (!attr.containsKey("before")) { attr.put("before", ""); } + if (!attr.containsKey("after")) { attr.put("after", ""); } + dlg.setTextFieldText("Before", attr.get("before")); + dlg.setTextFieldText("After", attr.get("after")); + + // Set next for paragraph block only + String[] sNextItems; + if (nCurrentFamily==2 && attr.containsKey("next") && attr.get("next").length()>0) { + sNextItems = attr.get("next").split(";"); + // Localize known styles + Map displayNames = styleNameProvider.getDisplayNames(sOOoFamilyNames[nCurrentFamily]); + int nLen = sNextItems.length; + for (int i=0; i attr) { + // Always get before and after + attr.put("before", dlg.getTextFieldText("Before")); + attr.put("after", dlg.getTextFieldText("After")); + + // Get next for paragraph block only + if (nCurrentFamily==2) { + String[] sNextItems = dlg.getListBoxStringItemList("Next"); + // Internalize known styles + Map internalNames = styleNameProvider.getInternalNames(sOOoFamilyNames[nCurrentFamily]); + int nLen = sNextItems.length; + for (int i=0; i0) list.append(';'); + list.append(sNextItems[i]); + } + attr.put("next", list.toString()); + } + + // Get verbatim for paragraph and character styles only + if (nCurrentFamily<2) { + attr.put("verbatim", Boolean.toString(dlg.getCheckBoxStateAsBoolean("Verbatim"))); + } + + // Get line break for paragraph style only + if (nCurrentFamily==1) { + attr.put("line-break", Boolean.toString(dlg.getCheckBoxStateAsBoolean("LineBreak"))); + } + } + + protected void clearControls(DialogAccess dlg) { + dlg.setTextFieldText("Before", ""); + dlg.setTextFieldText("After", ""); + dlg.setListBoxStringItemList("Next", new String[0]); + dlg.setCheckBoxStateAsBoolean("Verbatim", false); + dlg.setCheckBoxStateAsBoolean("LineBreak", false); + } + + protected void prepareControls(DialogAccess dlg) { + dlg.setControlEnabled("NextLabel", nCurrentFamily==2); + dlg.setControlEnabled("Next", nCurrentFamily==2); + dlg.setControlEnabled("AddNextButton", nCurrentFamily==2); + dlg.setControlEnabled("RemoveNextButton", nCurrentFamily==2); + dlg.setControlEnabled("Verbatim", nCurrentFamily<2); + dlg.setControlEnabled("LineBreak", nCurrentFamily==1); + } + + // Define own event handlers + private void addNextClick(DialogAccess dlg) { + appendItem(dlg, "Next",styleNameProvider.getInternalNames(sOOoFamilyNames[nCurrentFamily]).keySet()); + updateRemoveNextButton(dlg); + } + + private void removeNextClick(DialogAccess dlg) { + deleteCurrentItem(dlg, "Next"); + updateRemoveNextButton(dlg); + } + + private void updateRemoveNextButton(DialogAccess dlg) { + dlg.setControlEnabled("RemoveNextButton", dlg.getListBoxStringItemList("Next").length>0); + } + + } + + // The page "Characters" + // This page handles the options use_color, use_soul, use_ulem and use_hyperref + // In addition it handles style maps for formatting attributes + // TODO: Should extend AttributePageHandler + private class CharactersHandler extends PageHandler { + private final String[] sAttributeNames = { "bold", "italic", "small-caps", "superscript", "subscipt" }; + private ComplexOption attributeMap = new ComplexOption(); // Cache of attribute maps + short nCurrentAttribute = -1; // Currently displayed map + + @Override protected void setControls(DialogAccess dlg) { + // Load attribute style map from config and select the first map + attributeMap.clear(); + attributeMap.copyAll(config.getComplexOption("text-attribute-map")); + nCurrentAttribute = -1; + dlg.setListBoxSelectedItem("FormattingAttribute", (short)0); + + // Load other controls from config + checkBoxFromConfig(dlg,"UseHyperref","use_hyperref"); + checkBoxFromConfig(dlg,"UseColor","use_color"); + checkBoxFromConfig(dlg,"UseSoul","use_soul"); + checkBoxFromConfig(dlg,"UseUlem","use_ulem"); + } + + @Override protected void getControls(DialogAccess dlg) { + updateAttributeMap(dlg); + + // Save the attribute style map to config + config.getComplexOption("text-attribute-map").clear(); + for (String s : attributeMap.keySet()) { + if (!attributeMap.get(s).containsKey("deleted")) { + config.getComplexOption("text-attribute-map").copy(s, attributeMap.get(s)); + } + } + + // Save other controls to config + checkBoxToConfig(dlg,"UseHyperref","use_hyperref"); + checkBoxToConfig(dlg,"UseColor","use_color"); + checkBoxToConfig(dlg,"UseSoul","use_soul"); + checkBoxToConfig(dlg,"UseUlem","use_ulem"); + } + + @Override protected boolean handleEvent(DialogAccess dlg, String sMethod) { + if (sMethod.equals("UseSoulChange")) { + useSoulChange(dlg); + return true; + } + else if (sMethod.equals("FormattingAttributeChange")) { + formattingAttributeChange(dlg); + return true; + } + else if (sMethod.equals("CustomAttributeChange")) { + customAttributeChange(dlg); + return true; + } + return false; + } + + private void useSoulChange(DialogAccess dlg) { + // Until implemented... + dlg.setControlEnabled("UseSoul", false); + // After which it should be... + //boolean bUseSoul = dlg.getCheckBoxStateAsBoolean("UseSoul"); + //dlg.setControlEnabled("UseUlem", !bUseSoul); + } + + private void formattingAttributeChange(DialogAccess dlg) { + updateAttributeMap(dlg); + + short nNewAttribute = dlg.getListBoxSelectedItem("FormattingAttribute"); + if (nNewAttribute>-1) { + String sName = sAttributeNames[nNewAttribute]; + if (attributeMap.containsKey(sName)) { + Map attr = attributeMap.get(sName); + dlg.setCheckBoxStateAsBoolean("CustomAttribute", !attr.containsKey("deleted")); + dlg.setTextFieldText("Before", attr.containsKey("before") ? attr.get("before") : ""); + dlg.setTextFieldText("After", attr.containsKey("after") ? attr.get("after") : ""); + } + else { + dlg.setCheckBoxStateAsBoolean("CustomAttribute", false); + dlg.setTextFieldText("Before", ""); + dlg.setTextFieldText("After", ""); + } + customAttributeChange(dlg); // setCheckBoxStateAsBoolean does not trigger this + nCurrentAttribute = nNewAttribute; + } + } + + private void customAttributeChange(DialogAccess dlg) { + boolean bCustom = dlg.getCheckBoxStateAsBoolean("CustomAttribute"); + dlg.setControlEnabled("Before", bCustom); + dlg.setControlEnabled("After", bCustom); + } + + private void updateAttributeMap(DialogAccess dlg) { + // Save the current attribute map, if any + if (nCurrentAttribute>-1) { + Map attr = new HashMap(); + if (!dlg.getCheckBoxStateAsBoolean("CustomAttribute")) { + // don't delete the map now, but defer this to the dialog is closed + attr.put("deleted", "true"); + } + attr.put("before", dlg.getTextFieldText("Before")); + attr.put("after", dlg.getTextFieldText("After")); + attributeMap.put(sAttributeNames[nCurrentAttribute], attr); + } + } + + } + + // The page "Fonts" + // This page handles the options use_fontspec, use_pifont, use_tipa, use_eurosym, use_wasysym, + // use_ifsym, use_bbding + private class FontsHandler extends PageHandler { + @Override protected void setControls(DialogAccess dlg) { + checkBoxFromConfig(dlg,"UsePifont","use_pifont"); + checkBoxFromConfig(dlg,"UseTipa","use_tipa"); + checkBoxFromConfig(dlg,"UseEurosym","use_eurosym"); + checkBoxFromConfig(dlg,"UseWasysym","use_wasysym"); + checkBoxFromConfig(dlg,"UseIfsym","use_ifsym"); + checkBoxFromConfig(dlg,"UseBbding","use_bbding"); + checkBoxFromConfig(dlg,"UseFontspec","use_fontspec"); + // Until implemented: + dlg.setControlEnabled("UseFontspec", false); + } + + @Override protected void getControls(DialogAccess dlg) { + checkBoxToConfig(dlg,"UsePifont","use_pifont"); + checkBoxToConfig(dlg,"UseTipa","use_tipa"); + checkBoxToConfig(dlg,"UseEurosym","use_eurosym"); + checkBoxToConfig(dlg,"UseWasysym","use_wasysym"); + checkBoxToConfig(dlg,"UseIfsym","use_ifsym"); + checkBoxToConfig(dlg,"UseBbding","use_bbding"); + checkBoxToConfig(dlg,"UseFontspec","use_fontspec"); + } + + @Override protected boolean handleEvent(DialogAccess dlg, String sMethod) { + // Currently no events + return false; + } + } + + // The page "Pages" + // This page handles the options page_formatting, use_geometry, use_fancyhdr, use_lastpage and use_endnotes + private class PagesHandler extends PageHandler { + @Override protected void setControls(DialogAccess dlg) { + // The option page_formatting is presented as two options in the user interface + String sPageFormatting = config.getOption("page_formatting"); + if ("ignore_all".equals(sPageFormatting)) { + dlg.setCheckBoxStateAsBoolean("ExportGeometry", false); + dlg.setCheckBoxStateAsBoolean("ExportHeaderFooter", false); + } + else if ("convert_geometry".equals(sPageFormatting)) { + dlg.setCheckBoxStateAsBoolean("ExportGeometry", true); + dlg.setCheckBoxStateAsBoolean("ExportHeaderFooter", false); + } + else if ("convert_header_footer".equals(sPageFormatting)) { + dlg.setCheckBoxStateAsBoolean("ExportGeometry", false); + dlg.setCheckBoxStateAsBoolean("ExportHeaderFooter", true); + } + else if ("convert_all".equals(sPageFormatting)) { + dlg.setCheckBoxStateAsBoolean("ExportGeometry", true); + dlg.setCheckBoxStateAsBoolean("ExportHeaderFooter", true); + } + + checkBoxFromConfig(dlg,"UseGeometry", "use_geometry"); + checkBoxFromConfig(dlg,"UseFancyhdr", "use_fancyhdr"); + checkBoxFromConfig(dlg,"UseLastpage", "use_lastpage"); + checkBoxFromConfig(dlg,"UseEndnotes", "use_endnotes"); + + // Trigger change events (this is not done by the setters above) + exportGeometryChange(dlg); + exportHeaderAndFooterChange(dlg); + } + + @Override protected void getControls(DialogAccess dlg) { + boolean bGeometry = dlg.getCheckBoxStateAsBoolean("ExportGeometry"); + boolean bHeaderFooter = dlg.getCheckBoxStateAsBoolean("ExportHeaderFooter"); + if (bGeometry && bHeaderFooter) { + config.setOption("page_formatting", "convert_all"); + } + else if (bGeometry && !bHeaderFooter) { + config.setOption("page_formatting", "convert_geometry"); + } + else if (!bGeometry && bHeaderFooter) { + config.setOption("page_formatting", "convert_header_footer"); + } + else { + config.setOption("page_formatting", "ignore_all"); + } + + checkBoxToConfig(dlg,"UseGeometry", "use_geometry"); + checkBoxToConfig(dlg,"UseFancyhdr", "use_fancyhdr"); + checkBoxToConfig(dlg,"UseLastpage", "use_lastpage"); + checkBoxToConfig(dlg,"UseEndnotes", "use_endnotes"); + } + + @Override protected boolean handleEvent(DialogAccess dlg, String sMethod) { + if (sMethod.equals("ExportGeometryChange")) { + exportGeometryChange(dlg); + return true; + } + else if (sMethod.equals("ExportHeaderAndFooterChange")) { + exportHeaderAndFooterChange(dlg); + return true; + } + return false; + } + + private void exportGeometryChange(DialogAccess dlg) { + dlg.setControlEnabled("UseGeometry", dlg.getCheckBoxStateAsBoolean("ExportGeometry")); + } + + private void exportHeaderAndFooterChange(DialogAccess dlg) { + dlg.setControlEnabled("UseFancyhdr", dlg.getCheckBoxStateAsBoolean("ExportHeaderFooter")); + } + } + + + /* + + + private XComponentContext xContext; + private XSimpleFileAccess2 sfa2; + private String sConfigFileName = null; + Config config; + // Local cache of complex options + ComplexOption[] styleMap; + ComplexOption mathSymbols; + ComplexOption stringReplace; + short nCurrentFamily = -1; + String sCurrentStyleName = null; + String sCurrentMathSymbol = null; + String sCurrentText = null; + private String sTitle = null; + private DialogAccess dlg = null; + private StyleNameProvider styleNameProvider = null; + private CustomSymbolNameProvider customSymbolNameProvider = null; + + /** Create a new ConfigurationDialog */ + /*public ConfigurationDialog(XComponentContext xContext) { this.xContext = xContext; // Get the SimpleFileAccess service @@ -137,203 +752,16 @@ public final class ConfigurationDialog extends WeakBase // Initialize the local cache of complex options styleMap = new ComplexOption[5]; for (int i=0; i<5; i++) { styleMap[i]=new ComplexOption(); } - attributeMap = new ComplexOption(); - headingMap = new ComplexOption(); mathSymbols = new ComplexOption(); stringReplace = new ComplexOption(); styleNameProvider = new StyleNameProvider(xContext); customSymbolNameProvider = new CustomSymbolNameProvider(xContext); - } + }*/ - // Implement XContainerWindowEventHandler - public boolean callHandlerMethod(XWindow xWindow, Object event, String sMethod) - throws com.sun.star.lang.WrappedTargetException { - XDialog xDialog = (XDialog)UnoRuntime.queryInterface(XDialog.class, xWindow); - sTitle = xDialog.getTitle(); - dlg = new DialogAccess(xDialog); - - try { - if (sMethod.equals("external_event") ){ - return handleExternalEvent(event); - } - // Documentclass page - else if (sMethod.equals("NoPreambleChange")) { - updateDocumentclassControls(); - return true; - } - // Headings page - else if (sMethod.equals("MaxLevelChange")) { - updateHeadingsControls(); - return true; - } - else if (sMethod.equals("WriterLevelChange")) { - updateHeadingsControls(); - return true; - } - else if (sMethod.equals("NoIndexChange")) { - updateHeadingsControls(); - return true; - } - // Styles page - else if (sMethod.equals("StyleFamilyChange")) { - updateStylesControls(); - return true; - } - else if (sMethod.equals("StyleNameChange")) { - updateStylesControls(); - return true; - } - else if (sMethod.equals("NewStyleClick")) { - newStyleClick(); - return true; - } - else if (sMethod.equals("DeleteStyleClick")) { - deleteStyleClick(); - return true; - } - else if (sMethod.equals("AddNextClick")) { - addNextClick(); - return true; - } - else if (sMethod.equals("RemoveNextClick")) { - removeNextClick(); - return true; - } - else if (sMethod.equals("LoadDefaultsClick")) { - loadDefaultsClick(); - return true; - } - // Characters page - else if (sMethod.equals("UseSoulChange")) { - updateCharactersControls(); - return true; - } - else if (sMethod.equals("FormattingAttributeChange")) { - updateCharactersControls(); - return true; - } - else if (sMethod.equals("CustomAttributeChange")) { - updateCharactersControls(); - return true; - } - // Fonts page - // Pages page - else if (sMethod.equals("ExportGeometryChange")) { - updatePagesControls(); - return true; - } - else if (sMethod.equals("ExportHeaderAndFooterChange")) { - updatePagesControls(); - return true; - } - // Tables page - else if (sMethod.equals("NoTablesChange")) { - updateTablesControls(); - return true; - } - else if (sMethod.equals("UseSupertabularChange")) { - updateTablesControls(); - return true; - } - else if (sMethod.equals("UseLongtableChange")) { - updateTablesControls(); - return true; - } - // Figures page - else if (sMethod.equals("NoImagesChange")) { - updateFiguresControls(); - return true; - } - // Text and math page - else if (sMethod.equals("MathSymbolNameChange")) { - updateTextAndMathControls(); - return true; - } - else if (sMethod.equals("NewSymbolClick")) { - newSymbolClick(); - return true; - } - else if (sMethod.equals("DeleteSymbolClick")) { - deleteSymbolClick(); - return true; - } - else if (sMethod.equals("TextInputChange")) { - updateTextAndMathControls(); - return true; - } - else if (sMethod.equals("NewTextClick")) { - newTextClick(); - return true; - } - else if (sMethod.equals("DeleteTextClick")) { - deleteTextClick(); - return true; - } - } - catch (com.sun.star.uno.RuntimeException e) { - throw e; - } - catch (com.sun.star.uno.Exception e) { - throw new com.sun.star.lang.WrappedTargetException(sMethod, this, e); - } - return false; - } - public String[] getSupportedMethodNames() { - String[] sNames = { "external_event", - "NoPreambleChange", // Documentclass - "MaxLevelChange", "WriterLevelChange", "NoIndexChange", // Headings - "StyleFamilyChange", "StyleNameChange", "NewStyleClick", "DeleteStyleClick", "AddNextClick", "RemoveNextClick", "LoadDefaultsClick", // Styles - "UseSoulChange", "FormattingAttributeChange", "CustomAttributeChange", // Characters - "ExportGeometryChange", "ExportHeaderAndFooterChange", // Pages - "NoTablesChange", "UseSupertabularChange", "UseLongtableChange", // Tables - "NoImagesChange", // Images - "MathSymbolNameChange", "NewSymbolClick", "DeleteSymbolClick", - "TextInputChange", "NewTextClick", "DeleteTextClick" // Text and Math - }; - return sNames; - } - // Implement the interface XServiceInfo - public boolean supportsService(String sServiceName) { - return sServiceName.equals(__serviceName); - } - - public String getImplementationName() { - return __implementationName; - } - - public String[] getSupportedServiceNames() { - String[] sSupportedServiceNames = { __serviceName }; - return sSupportedServiceNames; - } - - // Private stuff - private boolean handleExternalEvent(Object aEventObject) - throws com.sun.star.uno.Exception { - try { - String sMethod = AnyConverter.toString(aEventObject); - if (sMethod.equals("ok")) { - loadConfig(); - getControls(); - saveConfig(); - return true; - } - else if (sMethod.equals("back") || sMethod.equals("initialize")) { - loadConfig(); - setControls(); - return true; - } - } - catch (com.sun.star.lang.IllegalArgumentException e) { - throw new com.sun.star.lang.IllegalArgumentException( - "Method external_event requires a string in the event object argument.", this,(short) -1); - } - return false; - } - - // Display a dialog + /*// Display a dialog private XDialog getDialog(String sDialogName) { XMultiComponentFactory xMCF = xContext.getServiceManager(); try { @@ -488,24 +916,9 @@ public final class ConfigurationDialog extends WeakBase // Set controls based on the config private void setControls() { - if ("Documentclass".equals(sTitle)) { - loadDocumentclass(); - } - else if ("Headings".equals(sTitle)) { - loadHeadings(); - } else if ("Styles".equals(sTitle)) { loadStyles(); } - else if ("Characters".equals(sTitle)) { - loadCharacters(); - } - else if ("Fonts".equals(sTitle)) { - loadFonts(); - } - else if ("Pages".equals(sTitle)) { - loadPages(); - } else if ("Tables".equals(sTitle)) { loadTables(); } @@ -519,24 +932,9 @@ public final class ConfigurationDialog extends WeakBase // Change the config based on the controls private void getControls() { - if ("Documentclass".equals(sTitle)) { - saveDocumentclass(); - } - else if ("Headings".equals(sTitle)) { - saveHeadings(); - } else if ("Styles".equals(sTitle)) { saveStyles(); } - else if ("Characters".equals(sTitle)) { - saveCharacters(); - } - else if ("Fonts".equals(sTitle)) { - saveFonts(); - } - else if ("Pages".equals(sTitle)) { - savePages(); - } else if ("Tables".equals(sTitle)) { saveTables(); } @@ -548,582 +946,8 @@ public final class ConfigurationDialog extends WeakBase } } - // The page "Documentclass" - // This page handles the options no_preamble, documentclass, global_options and the custom-preamble - private void loadDocumentclass() { - dlg.setCheckBoxStateAsBoolean("NoPreamble","true".equals(config.getOption("no_preamble"))); - dlg.setTextFieldText("Documentclass",config.getOption("documentclass")); - dlg.setTextFieldText("GlobalOptions",config.getOption("global_options")); - dlg.setTextFieldText("CustomPreamble",config.getOption("custom-preamble")); - updateDocumentclassControls(); - } - private void saveDocumentclass() { - config.setOption("no_preamble", Boolean.toString(dlg.getCheckBoxStateAsBoolean("NoPreamble"))); - config.setOption("documentclass", dlg.getTextFieldText("Documentclass")); - config.setOption("global_options", dlg.getTextFieldText("GlobalOptions")); - config.setOption("custom-preamble", dlg.getTextFieldText("CustomPreamble")); - } - - private void updateDocumentclassControls() { - boolean bPreamble = !dlg.getCheckBoxStateAsBoolean("NoPreamble"); - dlg.setControlEnabled("DocumentclassLabel",bPreamble); - dlg.setControlEnabled("Documentclass",bPreamble); - dlg.setControlEnabled("GlobalOptionsLabel",bPreamble); - dlg.setControlEnabled("GlobalOptions",bPreamble); - dlg.setControlEnabled("CustomPreambleLabel",bPreamble); - dlg.setControlEnabled("CustomPreamble",bPreamble); - } - - // The page "Headings" - // This page handles the heading map as well as the options no_index, use_titlesec and use_titletoc - - private void loadHeadings() { - // Load heading map from config - headingMap.clear(); - headingMap.copyAll(config.getComplexOption("heading-map")); - nCurrentWriterLevel = -1; - - // Determine the max level (from 0 to 10) - short nMaxLevel = 0; - while(nMaxLevel<10 && headingMap.containsKey(Integer.toString(nMaxLevel+1))) { - nMaxLevel++; - } - dlg.setListBoxSelectedItem("MaxLevel", nMaxLevel); - - dlg.setCheckBoxStateAsBoolean("UseTitlesec","true".equals(config.getOption("use_titlesec"))); - dlg.setCheckBoxStateAsBoolean("NoIndex","true".equals(config.getOption("no_index"))); - dlg.setCheckBoxStateAsBoolean("UseTitletoc","true".equals(config.getOption("use_titletoc"))); - - updateHeadingsControls(); - } - - private void saveHeadings() { - updateHeadingMap(); - - // Save heading map to config - config.getComplexOption("heading-map").clear(); - int nMaxLevel = dlg.getListBoxSelectedItem("MaxLevel"); - for (int i=1; i<=nMaxLevel; i++) { - String sLevel = Integer.toString(i); - config.getComplexOption("heading-map").copy(sLevel,headingMap.get(sLevel)); - } - - // Save other controls to config - config.setOption("use_titlesec", Boolean.toString(dlg.getCheckBoxStateAsBoolean("UseTitlesec"))); - config.setOption("no_index", Boolean.toString(dlg.getCheckBoxStateAsBoolean("NoIndex"))); - config.setOption("use_titletoc", Boolean.toString(dlg.getCheckBoxStateAsBoolean("UseTitletoc"))); - } - - private void updateHeadingMap() { - // Save the current writer level in our cache - if (nCurrentWriterLevel>-1) { - Map attr = new HashMap(); - attr.put("name", dlg.getComboBoxText("LaTeXName")); - attr.put("level", dlg.getComboBoxText("LaTeXLevel")); - headingMap.put(Integer.toString(nCurrentWriterLevel+1), attr); - } - } - - private void updateHeadingsControls() { - updateHeadingMap(); - - // Adjust the presented writer levels to the max level - int nMaxLevel = dlg.getListBoxSelectedItem("MaxLevel"); - nCurrentWriterLevel = dlg.getListBoxSelectedItem("WriterLevel"); - String[] sWriterLevels = new String[nMaxLevel]; - for (int i=0; inMaxLevel) { nCurrentWriterLevel = (short)(nMaxLevel-1); } - else if (nCurrentWriterLevel<0 && nMaxLevel>0) { nCurrentWriterLevel=0; } - dlg.setListBoxSelectedItem("WriterLevel", nCurrentWriterLevel); - - // Load the values for the current level - if (nCurrentWriterLevel>-1) { - String sLevel = Integer.toString(nCurrentWriterLevel+1); - if (headingMap.containsKey(sLevel)) { - Map attr = headingMap.get(sLevel); - dlg.setComboBoxText("LaTeXLevel", attr.containsKey("level") ? attr.get("level") : ""); - dlg.setComboBoxText("LaTeXName", attr.containsKey("name") ? attr.get("name") : ""); - } - else { - dlg.setListBoxSelectedItem("LaTeXLevel", (short)2); - dlg.setComboBoxText("LaTeXName", ""); - } - } - - boolean bupdate = dlg.getListBoxSelectedItem("MaxLevel")>0; - dlg.setControlEnabled("WriterLevelLabel", bupdate); - dlg.setControlEnabled("WriterLevel", bupdate); - dlg.setControlEnabled("LaTeXLevelLabel", bupdate); - dlg.setControlEnabled("LaTeXLevel", bupdate); - dlg.setControlEnabled("LaTeXNameLabel", bupdate); - dlg.setControlEnabled("LaTeXName", bupdate); - // Until implemented: - dlg.setControlEnabled("UseTitlesec", false); - //dlg.setControlEnabled("UseTitlesec", bupdate); - - // Until implemented: - dlg.setControlEnabled("UseTitletoc", false); - //boolean bNoIndex = dlg.getCheckBoxStateAsBoolean("NoIndex"); - //dlg.setControlEnabled("UseTitletoc", !bNoIndex); - } - - // The page "Styles" - // This page handles the various style maps as well as the options other_styles and formatting - // Limitation: Cannot handle the values "error" and "warning" for other_styles - - private void loadStyles() { - // Display paragraph maps first - dlg.setListBoxSelectedItem("StyleFamily", (short)1); - nCurrentFamily = -1; - sCurrentStyleName = null; - - // Load style maps from config (translating keys to display names) - for (int i=0; i<5; i++) { - ComplexOption configMap = config.getComplexOption(sFamilyNames[i]+"-map"); - styleMap[i].clear(); - Map displayNames = styleNameProvider.getDisplayNames(sOOoFamilyNames[i]); - copyStyles(configMap, styleMap[i], displayNames); - for (String sName : styleMap[i].keySet()) { - Map attr = styleMap[i].get(sName); - if (attr.containsKey("next")) { - String[] sNext = attr.get("next").split(";"); - String sNewNext = ""; - for (String sNextName : sNext) { - if (sNewNext.length()>0) { sNewNext+=";"; } - sNewNext+=displayNames.get(sNextName); - } - attr.put("next", sNewNext); - } - } - } - - // Load other controls from config - String sOtherStyles = config.getOption("other_styles"); - if ("accept".equals(sOtherStyles)) { - dlg.setListBoxSelectedItem("OtherStyles", (short)1); - } - else { - dlg.setListBoxSelectedItem("OtherStyles", (short)0); - } - - String sFormatting = config.getOption("formatting"); - if ("ignore_all".equals(sFormatting)) { - dlg.setListBoxSelectedItem("Formatting", (short)0); - } - else if ("ignore_most".equals(sFormatting)) { - dlg.setListBoxSelectedItem("Formatting", (short)1); - } - else if ("convert_most".equals(sFormatting)) { - dlg.setListBoxSelectedItem("Formatting", (short)3); - } - else if ("convert_all".equals(sFormatting)) { - dlg.setListBoxSelectedItem("Formatting", (short)4); - } - else { - dlg.setListBoxSelectedItem("Formatting", (short)2); - } - - updateStylesControls(); - } - - private void saveStyles() { - updateStyleMaps(); - - // Save style maps to config (translating keys back to internal names) - for (int i=0; i<5; i++) { - ComplexOption configMap = config.getComplexOption(sFamilyNames[i]+"-map"); - configMap.clear(); - Map internalNames = styleNameProvider.getInternalNames(sOOoFamilyNames[i]); - copyStyles(styleMap[i], configMap, internalNames); - for (String sName : configMap.keySet()) { - Map attr = configMap.get(sName); - if (attr.containsKey("next")) { - String[] sNext = attr.get("next").split(";"); - String sNewNext = ""; - for (String sNextName : sNext) { - if (sNewNext.length()>0) { sNewNext+=";"; } - sNewNext+=internalNames.get(sNextName); - } - attr.put("next", sNewNext); - } - } - } - - // Save other controls to config - switch (dlg.getListBoxSelectedItem("OtherStyles")) { - case 0: config.setOption("other_styles", "ignore"); break; - case 1: config.setOption("other_styles", "accept"); - } - - switch (dlg.getListBoxSelectedItem("Formatting")) { - case 0: config.setOption("formatting", "ignore_all"); break; - case 1: config.setOption("formatting", "ignore_most"); break; - case 2: config.setOption("formatting", "convert_basic"); break; - case 3: config.setOption("formatting", "convert_most"); break; - case 4: config.setOption("formatting", "convert_all"); - } - } - - private void updateStyleMaps() { - // Save the current style map, if any - if (nCurrentFamily>-1 && sCurrentStyleName!=null) { - Map attr=new HashMap(); - attr.put("before", dlg.getTextFieldText("Before")); - attr.put("after", dlg.getTextFieldText("After")); - if (dlg.getControlEnabled("Next")) { - String[] sNextItems = dlg.getListBoxStringItemList("Next"); - int nCount = sNextItems.length; - String sList = ""; - for (int i=0; i0) sList+=";"; - sList+=sNextItems[i]; - } - attr.put("next", sList); - } - if (dlg.getControlEnabled("LineBreak")) { - attr.put("line-break", Boolean.toString(dlg.getCheckBoxStateAsBoolean("LineBreak"))); - } - if (dlg.getControlEnabled("Verbatim")) { - attr.put("verbatim", Boolean.toString(dlg.getCheckBoxStateAsBoolean("Verbatim"))); - } - styleMap[nCurrentFamily].put(sCurrentStyleName, attr); - } - } - - private void updateStylesControls() { - updateStyleMaps(); - - short nNewFamily = dlg.getListBoxSelectedItem("StyleFamily"); - if (nNewFamily>-1 && nNewFamily!=nCurrentFamily) { - // The user has changed the family; load and display the corresponding style names - Set items = styleMap[nNewFamily].keySet(); - String[] sStyleNames = new String[items.size()]; - int i=0; - for (String s : items) { - sStyleNames[i++] = s; - } - sortStringArray(sStyleNames); - dlg.setListBoxStringItemList("StyleName", sStyleNames); - dlg.setListBoxSelectedItem("StyleName", (short)Math.min(sStyleNames.length-1, 0)); - dlg.setControlEnabled("NextLabel", nNewFamily==2); - dlg.setControlEnabled("Next", nNewFamily==2); - dlg.setControlEnabled("AddNextButton", nNewFamily==2); - dlg.setControlEnabled("RemoveNextButton", nNewFamily==2); - dlg.setControlEnabled("Verbatim", nNewFamily<2); - dlg.setControlEnabled("LineBreak", nNewFamily==1); - nCurrentFamily = nNewFamily; - } - - if (nCurrentFamily>-1) { - short nStyleNameItem = dlg.getListBoxSelectedItem("StyleName"); - if (nStyleNameItem>=0) { - sCurrentStyleName = dlg.getListBoxStringItemList("StyleName")[nStyleNameItem]; - - Map attr = styleMap[nCurrentFamily].get(sCurrentStyleName); - dlg.setTextFieldText("Before", attr.containsKey("before") ? attr.get("before") : ""); - dlg.setTextFieldText("After", attr.containsKey("after") ? attr.get("after") : ""); - String[] sNextItems; - if (attr.containsKey("next")) { - sNextItems = attr.get("next").split(";"); - } - else { - sNextItems = new String[0]; - } - dlg.setListBoxStringItemList("Next", sNextItems); - dlg.setListBoxSelectedItem("Next", (short)Math.min(sNextItems.length-1, 0)); - dlg.setCheckBoxStateAsBoolean("Verbatim", - attr.containsKey("verbatim") ? "true".equals(attr.get("verbatim")) : false); - dlg.setCheckBoxStateAsBoolean("LineBreak", - attr.containsKey("line-break") ? "true".equals(attr.get("line-break")) : false); - dlg.setControlEnabled("DeleteStyleButton", true); - } - else { - sCurrentStyleName = null; - dlg.setTextFieldText("Before", ""); - dlg.setTextFieldText("After", ""); - dlg.setListBoxStringItemList("Next", new String[0]); - dlg.setCheckBoxStateAsBoolean("Verbatim", false); - dlg.setCheckBoxStateAsBoolean("LineBreak", false); - dlg.setControlEnabled("DeleteStyleButton", false); - } - } - } - - private void newStyleClick() { - if (nCurrentFamily>-1) { - String sNewName = appendItem("StyleName",styleNameProvider.getInternalNames(sOOoFamilyNames[nCurrentFamily]).keySet()); - if (sNewName!=null) { - Map attr = new HashMap(); - attr.put("before", ""); - attr.put("after", ""); - attr.put("after", ""); - attr.put("verbatim", ""); - attr.put("line-break",""); - styleMap[nCurrentFamily].put(sNewName, attr); - } - saveStyles(); - updateStylesControls(); - } - } - - private void deleteStyleClick() { - if (nCurrentFamily>-1 && sCurrentStyleName!=null) { - if (deleteCurrentItem("StyleName")) { - styleMap[nCurrentFamily].remove(sCurrentStyleName); - sCurrentStyleName = null; - updateStylesControls(); - } - } - } - - private void addNextClick() { - appendItem("Next",styleNameProvider.getInternalNames(sOOoFamilyNames[nCurrentFamily]).keySet()); - saveStyles(); - updateStylesControls(); - } - - private void removeNextClick() { - deleteCurrentItem("Next"); - updateStylesControls(); - } - - private void loadDefaultsClick() { - saveStyles(); - // Force update of the ui - nCurrentFamily = -1; - sCurrentStyleName = null; - - // Count styles that we will overwrite - Config clean = ConverterFactory.createConverter("application/x-latex").getConfig(); - clean.readDefaultConfig("clean.xml"); - - int nCount = 0; - for (int i=0; i<5; i++) { - ComplexOption cleanMap = clean.getComplexOption(sFamilyNames[i]+"-map"); - Map displayNames = styleNameProvider.getDisplayNames(sOOoFamilyNames[i]); - for (String sName : cleanMap.keySet()) { - String sDisplayName = (displayNames!=null && displayNames.containsKey(sName)) ? displayNames.get(sName) : ""; - if (styleMap[i].containsKey(sDisplayName)) { nCount++; } - } - } - - // Display confirmation dialog - boolean bConfirm = false; - XDialog xDialog=getDialog("W2LDialogs2.LoadDefaults"); - if (xDialog!=null) { - DialogAccess ldlg = new DialogAccess(xDialog); - if (nCount>0) { - String sLabel = ldlg.getLabelText("OverwriteLabel"); - sLabel = sLabel.replaceAll("%s", Integer.toString(nCount)); - ldlg.setLabelText("OverwriteLabel", sLabel); - } - else { - ldlg.setLabelText("OverwriteLabel", ""); - } - bConfirm = xDialog.execute()==ExecutableDialogResults.OK; - xDialog.endExecute(); - } - - // Do the replacement - if (bConfirm) { - for (int i=0; i<5; i++) { - ComplexOption cleanMap = clean.getComplexOption(sFamilyNames[i]+"-map"); - Map displayNames = styleNameProvider.getDisplayNames(sOOoFamilyNames[i]); - copyStyles(cleanMap, styleMap[i], displayNames); - } - } - updateStylesControls(); - } - - private void copyStyles(ComplexOption source, ComplexOption target, Map nameTranslation) { - for (String sName : source.keySet()) { - String sNewName = sName; - if (nameTranslation!=null && nameTranslation.containsKey(sName)) { - sNewName = nameTranslation.get(sName); - } - target.copy(sNewName, source.get(sName)); - } - } - - // The page "Characters" - // This page handles the options use_color, use_soul, use_ulem and use_hyperref - // In addition it handles style maps for formatting attributes - - private void loadCharacters() { - // Load attribute style map from config - attributeMap.clear(); - attributeMap.copyAll(config.getComplexOption("text-attribute-map")); - nCurrentAttribute = -1; - dlg.setListBoxSelectedItem("FormattingAttribute", (short)0); - - // Load other controls from config - dlg.setCheckBoxStateAsBoolean("UseHyperref","true".equals(config.getOption("use_hyperref"))); - dlg.setCheckBoxStateAsBoolean("UseColor","true".equals(config.getOption("use_color"))); - dlg.setCheckBoxStateAsBoolean("UseSoul","true".equals(config.getOption("use_soul"))); - dlg.setCheckBoxStateAsBoolean("UseUlem","true".equals(config.getOption("use_ulem"))); - - updateCharactersControls(); - } - - private void saveCharacters() { - updateCharactersMap(); - - // Save the attribute style map to config - config.getComplexOption("text-attribute-map").clear(); - for (String s : attributeMap.keySet()) { - if (!attributeMap.get(s).containsKey("deleted")) { - config.getComplexOption("text-attribute-map").copy(s, attributeMap.get(s)); - } - } - - // Save other controls to config - config.setOption("use_hyperref", Boolean.toString(dlg.getCheckBoxStateAsBoolean("UseHyperref"))); - config.setOption("use_color", Boolean.toString(dlg.getCheckBoxStateAsBoolean("UseColor"))); - config.setOption("use_soul", Boolean.toString(dlg.getCheckBoxStateAsBoolean("UseSoul"))); - config.setOption("use_ulem", Boolean.toString(dlg.getCheckBoxStateAsBoolean("UseUlem"))); - } - - private void updateCharactersMap() { - // Save the current attribute map, if any - if (nCurrentAttribute>-1) { - HashMap attr = new HashMap(); - if (!dlg.getCheckBoxStateAsBoolean("CustomAttribute")) { - // don't delete the map now, but defer this to the dialog is closed - attr.put("deleted", "true"); - } - attr.put("before", dlg.getTextFieldText("Before")); - attr.put("after", dlg.getTextFieldText("After")); - attributeMap.put(sAttributeNames[nCurrentAttribute], attr); - } - } - - private void updateCharactersControls() { - updateCharactersMap(); - - short nNewAttribute = dlg.getListBoxSelectedItem("FormattingAttribute"); - if (nNewAttribute>-1 && nCurrentAttribute!=nNewAttribute) { - String sName = sAttributeNames[nNewAttribute]; - if (attributeMap.containsKey(sName)) { - Map attr = attributeMap.get(sName); - dlg.setCheckBoxStateAsBoolean("CustomAttribute", !attr.containsKey("deleted")); - dlg.setTextFieldText("Before", attr.containsKey("before") ? attr.get("before") : ""); - dlg.setTextFieldText("After", attr.containsKey("after") ? attr.get("after") : ""); - } - else { - dlg.setCheckBoxStateAsBoolean("CustomAttribute", false); - dlg.setTextFieldText("Before", ""); - dlg.setTextFieldText("After", ""); - } - nCurrentAttribute = nNewAttribute; - } - - boolean bCustom = dlg.getCheckBoxStateAsBoolean("CustomAttribute"); - dlg.setControlEnabled("Before", bCustom); - dlg.setControlEnabled("After", bCustom); - - // Until implemented... - dlg.setControlEnabled("UseSoul", false); - // After which it should be... - //boolean bUseSoul = dlg.getCheckBoxStateAsBoolean("UseSoul"); - //dlg.setControlEnabled("UseUlem", !bUseSoul); - } - - // The page "Fonts" - // This page handles the options use_fontspec, use_pifont, use_tipa, use_eurosym, use_wasysym, - // use_ifsym, use_bbding - - private void loadFonts() { - dlg.setCheckBoxStateAsBoolean("UseFontspec","true".equals(config.getOption("use_fontspec"))); - dlg.setCheckBoxStateAsBoolean("UsePifont","true".equals(config.getOption("use_pifont"))); - dlg.setCheckBoxStateAsBoolean("UseTipa","true".equals(config.getOption("use_tipa"))); - dlg.setCheckBoxStateAsBoolean("UseEurosym","true".equals(config.getOption("use_eurosym"))); - dlg.setCheckBoxStateAsBoolean("UseWasysym","true".equals(config.getOption("use_wasysym"))); - dlg.setCheckBoxStateAsBoolean("UseIfsym","true".equals(config.getOption("use_ifsym"))); - dlg.setCheckBoxStateAsBoolean("UseBbding","true".equals(config.getOption("use_bbding"))); - - updateFontsControls(); - } - - private void saveFonts() { - config.setOption("use_fontspec", Boolean.toString(dlg.getCheckBoxStateAsBoolean("UseFontspec"))); - config.setOption("use_pifont", Boolean.toString(dlg.getCheckBoxStateAsBoolean("UsePifont"))); - config.setOption("use_tipa", Boolean.toString(dlg.getCheckBoxStateAsBoolean("UseTipa"))); - config.setOption("use_eurosym", Boolean.toString(dlg.getCheckBoxStateAsBoolean("UseEurosym"))); - config.setOption("use_wasysym", Boolean.toString(dlg.getCheckBoxStateAsBoolean("UseWasysym"))); - config.setOption("use_ifsym", Boolean.toString(dlg.getCheckBoxStateAsBoolean("UseIfsym"))); - config.setOption("use_bbding", Boolean.toString(dlg.getCheckBoxStateAsBoolean("UseBbding"))); - } - - private void updateFontsControls() { - // Until implemented... - dlg.setControlEnabled("UseFontspec", false); - // Nothing to do - } - - // The page "Pages" - // This page handles the options page_formatting, use_geometry, use_fancyhdr, use_lastpage and use_endnotes - - private void loadPages() { - String sPageFormatting = config.getOption("page_formatting"); - if ("ignore_all".equals(sPageFormatting)) { - dlg.setCheckBoxStateAsBoolean("ExportGeometry", false); - dlg.setCheckBoxStateAsBoolean("ExportHeaderFooter", false); - } - else if ("convert_geometry".equals(sPageFormatting)) { - dlg.setCheckBoxStateAsBoolean("ExportGeometry", true); - dlg.setCheckBoxStateAsBoolean("ExportHeaderFooter", false); - } - else if ("convert_header_footer".equals(sPageFormatting)) { - dlg.setCheckBoxStateAsBoolean("ExportGeometry", false); - dlg.setCheckBoxStateAsBoolean("ExportHeaderFooter", true); - } - else if ("convert_all".equals(sPageFormatting)) { - dlg.setCheckBoxStateAsBoolean("ExportGeometry", true); - dlg.setCheckBoxStateAsBoolean("ExportHeaderFooter", true); - } - - dlg.setCheckBoxStateAsBoolean("UseGeometry", "true".equals(config.getOption("use_geometry"))); - dlg.setCheckBoxStateAsBoolean("UseFancyhdr", "true".equals(config.getOption("use_fancyhdr"))); - dlg.setCheckBoxStateAsBoolean("UseLastpage", "true".equals(config.getOption("use_lastpage"))); - dlg.setCheckBoxStateAsBoolean("UseEndnotes", "true".equals(config.getOption("use_endnotes"))); - - updatePagesControls(); - } - - private void savePages() { - boolean bGeometry = dlg.getCheckBoxStateAsBoolean("ExportGeometry"); - boolean bHeaderFooter = dlg.getCheckBoxStateAsBoolean("ExportHeaderFooter"); - if (bGeometry && bHeaderFooter) { - config.setOption("page_formatting", "convert_all"); - } - else if (bGeometry && !bHeaderFooter) { - config.setOption("page_formatting", "convert_geometry"); - } - else if (!bGeometry && bHeaderFooter) { - config.setOption("page_formatting", "convert_header_footer"); - } - else { - config.setOption("page_formatting", "ignore_all"); - } - - config.setOption("use_geometry", Boolean.toString(dlg.getCheckBoxStateAsBoolean("UseGeometry"))); - config.setOption("use_fancyhdr", Boolean.toString(dlg.getCheckBoxStateAsBoolean("UseFancyhdr"))); - config.setOption("use_lastpage", Boolean.toString(dlg.getCheckBoxStateAsBoolean("UseLastpage"))); - config.setOption("use_endnotes", Boolean.toString(dlg.getCheckBoxStateAsBoolean("UseEndnotes"))); - } - - private void updatePagesControls() { - boolean bExportGeometry = dlg.getCheckBoxStateAsBoolean("ExportGeometry"); - dlg.setControlEnabled("UseGeometry",bExportGeometry); - - boolean bExport = dlg.getCheckBoxStateAsBoolean("ExportHeaderFooter"); - dlg.setControlEnabled("UseFancyhdr",bExport); - } // The page "Tables" // This page handles the options table_content, use_tabulary, use_colortbl, use_multirow, use_supertabular, use_longtable, @@ -1318,9 +1142,10 @@ public final class ConfigurationDialog extends WeakBase Map attr = new HashMap(); attr.put("latex", ""); mathSymbols.put(sNewName, attr); + saveTextAndMath(); + dlg.setTextFieldText("MathLaTeX", ""); + updateTextAndMathControls(); } - saveTextAndMath(); - updateTextAndMathControls(); } private void deleteSymbolClick() { @@ -1338,9 +1163,10 @@ public final class ConfigurationDialog extends WeakBase attr.put("latex-code", ""); attr.put("fontenc", "any"); stringReplace.put(sNewName, attr); + dlg.setTextFieldText("LaTeX", ""); + saveTextAndMath(); + updateTextAndMathControls(); } - saveTextAndMath(); - updateTextAndMathControls(); } private void deleteTextClick() { @@ -1367,5 +1193,5 @@ public final class ConfigurationDialog extends WeakBase Collator collator = Collator.getInstance(); Arrays.sort(theArray, collator); } - + */ } diff --git a/source/java/writer2latex/api/ConverterFactory.java b/source/java/writer2latex/api/ConverterFactory.java index ad54074..b8af8bc 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 (2010-11-21) + * Version 1.2 (2010-12-08) * */ @@ -33,7 +33,7 @@ public class ConverterFactory { // Version information private static final String VERSION = "1.1.9"; - private static final String DATE = "2010-11-22"; + private static final String DATE = "2010-12-08"; /** Return the Writer2LaTeX version in the form * (major version).(minor version).(patch level)
diff --git a/source/java/writer2latex/latex/CharStyleConverter.java b/source/java/writer2latex/latex/CharStyleConverter.java index 8607a0a..f5454e7 100644 --- a/source/java/writer2latex/latex/CharStyleConverter.java +++ b/source/java/writer2latex/latex/CharStyleConverter.java @@ -16,11 +16,11 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * - * Copyright: 2002-2008 by Henrik Just + * Copyright: 2002-2010 by Henrik Just * * All Rights Reserved. * - * Version 1.0 (2008-12-03) + * Version 1.2 (2010-11-28) * */ @@ -97,6 +97,8 @@ public class CharStyleConverter extends StyleConverter { StyleMap sm = config.getTextStyleMap(); if (sm.contains(sDisplayName)) { ba.add(sm.getBefore(sDisplayName),sm.getAfter(sDisplayName)); + context.setVerbatim(sm.getVerbatim(sDisplayName)); + context.setNoLineBreaks(sm.getVerbatim(sDisplayName)); } return; } diff --git a/source/java/writer2latex/latex/i18n/XeTeXI18n.java b/source/java/writer2latex/latex/i18n/XeTeXI18n.java index 1e8da24..09d585c 100644 --- a/source/java/writer2latex/latex/i18n/XeTeXI18n.java +++ b/source/java/writer2latex/latex/i18n/XeTeXI18n.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.2 (2010-11-21) + * Version 1.2 (2010-11-30) * */ @@ -85,32 +85,43 @@ public class XeTeXI18n extends I18n { /** Convert a string of characters into LaTeX * @param s the source string * @param bMathMode true if the string should be rendered in math mode - * @param sLang the iso language of the string + * @param sLang the ISO language of the string * @return the LaTeX string */ public String convert(String s, boolean bMathMode, String sLang){ + // TODO: Do we need anything special for math mode? StringBuffer buf = new StringBuffer(); - int nLen = s.length(); - char c; - for (int i=0; i0) { + return Integer.toString(nPercent)+"%"; + } + else { + return "1%"; + } + } + public static final String multiply(String sPercent, String sLength){ if (sLength.equals("0")) { return "0"; } float fPercent=getFloat(sPercent.substring(0,sPercent.length()-1),1); diff --git a/source/java/writer2latex/xhtml/TextConverter.java b/source/java/writer2latex/xhtml/TextConverter.java index 2590b1b..6fc2898 100644 --- a/source/java/writer2latex/xhtml/TextConverter.java +++ b/source/java/writer2latex/xhtml/TextConverter.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.2 (2010-11-22) + * Version 1.2 (2010-11-28) * */ @@ -86,7 +86,8 @@ public class TextConverter extends ConverterHelper { private static final int EPUB_CHARACTER_COUNT_TRESHOLD = 150000; private int nPageBreakSplit = XhtmlConfig.NONE; // Should we split at page breaks? // TODO: Collect soft page breaks between table rows - private boolean bPendingPageBreak = false; // We have encountered a page break which should be inserted asap + private boolean bPendingPageBreak = false; // We have encountered a page break which should be inserted asap + private int nExternalTocDepth = 1; // The number of levels to include in the "external" table of contents private int nSplit = 0; // The outline level at which to split files (0=no split) private int nRepeatLevels = 5; // The number of levels to repeat when splitting (0=no repeat) private int nLastSplitLevel = 1; // The outline level at which the last split occurred @@ -147,6 +148,10 @@ public class TextConverter extends ConverterHelper { nPageBreakSplit = config.pageBreakSplit(); nSplit = config.getXhtmlSplitLevel(); nRepeatLevels = config.getXhtmlRepeatLevels(); + nExternalTocDepth = config.externalTocDepth(); + if (nExternalTocDepth==0) { // A value of zero means auto (i.e. determine from split level) + nExternalTocDepth = Math.max(nSplit,1); + } nFloatMode = ofr.isText() && config.xhtmlFloatObjects() ? DrawConverter.FLOATING : DrawConverter.ABSOLUTE; outlineNumbering = new ListCounter(ofr.getOutlineStyle()); @@ -674,10 +679,10 @@ public class TextConverter extends ConverterHelper { converter.addTarget(heading,sTarget); // Add in external content. For single file output we include all level 1 headings + their target - // For multi-file output, the included heading levels depends on the split leve, and we don't include targets - if (nLevel<=Math.max(nSplit,1)) { + // Targets are added only when the toc level is deeper than the split level + if (nLevel<=nExternalTocDepth) { converter.addContentEntry(sLabel+(sLabel.length()>0 ? " " : "")+converter.getPlainInlineText(onode), nLevel, - nSplit==0 ? sTarget : null); + nLevel>nSplit ? sTarget : null); } // Add to real toc diff --git a/source/java/writer2latex/xhtml/TextStyleConverter.java b/source/java/writer2latex/xhtml/TextStyleConverter.java index 19360bd..922f73f 100644 --- a/source/java/writer2latex/xhtml/TextStyleConverter.java +++ b/source/java/writer2latex/xhtml/TextStyleConverter.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.2 (2010-03-12) + * Version 1.2 (2010-12-08) * */ @@ -63,6 +63,10 @@ public class TextStyleConverter extends StyleWithPropertiesConverterHelper { private Hashtable anchorCombinedStyleNames = new Hashtable(); private Hashtable orgAnchorStyleNames = new Hashtable(); private Hashtable orgAnchorVisitedStyleNames = new Hashtable(); + + // Export font sizes as percentages? + private boolean bRelativeFontSize = false; + private String sBaseFontSize = "12pt"; /** Create a new TextStyleConverter * @param ofr an OfficeReader to read style information from @@ -75,6 +79,14 @@ public class TextStyleConverter extends StyleWithPropertiesConverterHelper { this.styleMap = config.getXTextStyleMap(); this.bConvertStyles = config.xhtmlFormatting()==XhtmlConfig.CONVERT_ALL || config.xhtmlFormatting()==XhtmlConfig.IGNORE_HARD; this.bConvertHard = config.xhtmlFormatting()==XhtmlConfig.CONVERT_ALL || config.xhtmlFormatting()==XhtmlConfig.IGNORE_STYLES; + this.bRelativeFontSize = converter.isOPS() && config.xhtmlConvertToPx(); + StyleWithProperties defaultStyle = ofr.getDefaultParStyle(); + if (defaultStyle!=null) { + String sFontSize = defaultStyle.getProperty(XMLString.FO_FONT_SIZE,false); + if (sFontSize!=null) { + sBaseFontSize = sFontSize; + } + } } /** Apply a link style, using a combination of two text styles @@ -298,14 +310,30 @@ public class TextStyleConverter extends StyleWithPropertiesConverterHelper { else { // one value s3 = s2; s4="100%"; } - if (s!=null) { props.addValue("font-size",Misc.multiply(s4,scale(s))); } - else { props.addValue("font-size",s4); } + if (s!=null) { + if (bRelativeFontSize) { + String sFontSize = Misc.divide(Misc.multiply(s4,s), sBaseFontSize); + if (!"100%".equals(sFontSize)) props.addValue("font-size", sFontSize); + } + else { + props.addValue("font-size",Misc.multiply(s4,scale(s))); + } + } + else { + props.addValue("font-size",s4); + } if (!"0%".equals(s3)) { props.addValue("vertical-align",s3); } } else if (s!=null) { - props.addValue("font-size",scale(s)); + if (bRelativeFontSize) { + String sFontSize = Misc.divide(s,sBaseFontSize); + if (!"100%".equals(sFontSize)) props.addValue("font-size", sFontSize); + } + else { + props.addValue("font-size",scale(s)); + } } } diff --git a/source/java/writer2latex/xhtml/XhtmlConfig.java b/source/java/writer2latex/xhtml/XhtmlConfig.java index b6a97df..0c62c4f 100644 --- a/source/java/writer2latex/xhtml/XhtmlConfig.java +++ b/source/java/writer2latex/xhtml/XhtmlConfig.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.2 (2010-11-22) + * Version 1.2 (2010-11-28) * */ @@ -41,7 +41,7 @@ import writer2latex.util.Misc; public class XhtmlConfig extends writer2latex.base.ConfigBase { // Implement configuration methods - protected int getOptionCount() { return 46; } + protected int getOptionCount() { return 47; } protected String getDefaultConfigPath() { return "/writer2latex/xhtml/config/"; } // Override setOption: To be backwards compatible, we must accept options @@ -70,7 +70,7 @@ public class XhtmlConfig extends writer2latex.base.ConfigBase { public static final int CSS1_HACK = 1; public static final int HARD_LABELS = 2; - // Formulas (for xhtml 1.0 strict) + // Formulas (for XHTML 1.0 strict) public static final int STARMATH = 0; public static final int LATEX = 1; public static final int IMAGE_STARMATH = 2; @@ -113,22 +113,23 @@ public class XhtmlConfig extends writer2latex.base.ConfigBase { private static final int TABSTOP_STYLE = 27; private static final int FORMULAS = 28; private static final int ENDNOTES_HEADING = 29; - private static final int SPLIT_LEVEL = 30; - private static final int REPEAT_LEVELS = 31; - private static final int PAGE_BREAK_SPLIT = 32; - private static final int CALC_SPLIT = 33; - private static final int DISPLAY_HIDDEN_SHEETS = 34; - private static final int DISPLAY_HIDDEN_ROWS_COLS = 35; - private static final int DISPLAY_FILTERED_ROWS_COLS = 36; - private static final int APPLY_PRINT_RANGES = 37; - private static final int USE_TITLE_AS_HEADING = 38; - private static final int USE_SHEET_NAMES_AS_HEADINGS = 39; - private static final int XSLT_PATH = 40; - private static final int SAVE_IMAGES_IN_SUBDIR = 41; - private static final int UPLINK = 42; - private static final int DIRECTORY_ICON = 43; - private static final int DOCUMENT_ICON = 44; - private static final int ZEN_HACK = 45; // temporary hack for ePub Zen Garden styles + private static final int EXTERNAL_TOC_DEPTH = 30; + private static final int SPLIT_LEVEL = 31; + private static final int REPEAT_LEVELS = 32; + private static final int PAGE_BREAK_SPLIT = 33; + private static final int CALC_SPLIT = 34; + private static final int DISPLAY_HIDDEN_SHEETS = 35; + private static final int DISPLAY_HIDDEN_ROWS_COLS = 36; + private static final int DISPLAY_FILTERED_ROWS_COLS = 37; + private static final int APPLY_PRINT_RANGES = 38; + private static final int USE_TITLE_AS_HEADING = 39; + private static final int USE_SHEET_NAMES_AS_HEADINGS = 40; + private static final int XSLT_PATH = 41; + private static final int SAVE_IMAGES_IN_SUBDIR = 42; + private static final int UPLINK = 43; + private static final int DIRECTORY_ICON = 44; + private static final int DOCUMENT_ICON = 45; + private static final int ZEN_HACK = 46; // temporary hack for ePub Zen Garden styles protected ComplexOption xheading = addComplexOption("heading-map"); protected ComplexOption xpar = addComplexOption("paragraph-map"); @@ -185,6 +186,17 @@ public class XhtmlConfig extends writer2latex.base.ConfigBase { else { nValue = IMAGE_STARMATH; } } }; + options[EXTERNAL_TOC_DEPTH] = new IntegerOption("external_toc_depth","auto") { + @Override public void setString(String sValue) { + super.setString(sValue); + if ("auto".equals(sValue)) { + nValue = 0; + } + else { + nValue = Misc.getPosInteger(sValue,1); + } + } + }; options[SPLIT_LEVEL] = new IntegerOption("split_level","0") { @Override public void setString(String sValue) { super.setString(sValue); @@ -319,6 +331,7 @@ public class XhtmlConfig extends writer2latex.base.ConfigBase { public String getXhtmlTabstopStyle() { return options[TABSTOP_STYLE].getString(); } public String getEndnotesHeading() { return options[ENDNOTES_HEADING].getString(); } public int formulas() { return ((IntegerOption) options[FORMULAS]).getValue(); } + public int externalTocDepth() { return ((IntegerOption) options[EXTERNAL_TOC_DEPTH]).getValue(); } public int getXhtmlSplitLevel() { return ((IntegerOption) options[SPLIT_LEVEL]).getValue(); } public int getXhtmlRepeatLevels() { return ((IntegerOption) options[REPEAT_LEVELS]).getValue(); } public int pageBreakSplit() { return ((IntegerOption) options[PAGE_BREAK_SPLIT]).getValue(); } diff --git a/source/oxt/writer2xhtml/help/en/org.openoffice.da.writer2xhtml.oxt/export.xhp b/source/oxt/writer2xhtml/help/en/org.openoffice.da.writer2xhtml.oxt/export.xhp index 272fbd0..5366530 100644 --- a/source/oxt/writer2xhtml/help/en/org.openoffice.da.writer2xhtml.oxt/export.xhp +++ b/source/oxt/writer2xhtml/help/en/org.openoffice.da.writer2xhtml.oxt/export.xhp @@ -79,7 +79,9 @@ Convert units to px (pixels) In %PRODUCTNAME, font sizes are usually given in points and other dimensions in e.g. cm or inches. For XHTML it is recommended to use the unit px instead, and using this option you can require that - all dimensions are converted to px. If you choose not to check this option,the original units will always be used. + all dimensions are converted to px. For EPUB it is recommended to use relative font sizes, and using this option will + export all font sizes as percentages (and use px for all other dimensions). + If you choose not to check this option,the original units will always be used.