From 9241a44f6ced3f218a3d285c38695f8a6fc8b3b8 Mon Sep 17 00:00:00 2001 From: henrikjust Date: Mon, 30 Mar 2009 07:38:37 +0000 Subject: [PATCH] Java 5 + Writer4LaTeX + bugfixes git-svn-id: svn://svn.code.sf.net/p/writer2latex/code/trunk@11 f0f2a975-2e09-46c8-9428-3b39399b9f3c --- build.xml | 46 +- source/distro/Readme.txt | 6 +- source/distro/changelog.txt | 343 +-------------- source/distro/doc/user-manual.odt | Bin 216093 -> 219189 bytes source/distro/doc/w4l-user-manual.odt | Bin 0 -> 16835 bytes .../w2lcommon/filter/ExportFilterBase.java | 4 +- .../w2lcommon/filter/FilterDataParser.java | 4 +- .../filter/GraphicConverterImpl2.java | 10 +- .../w2lcommon/filter/OptionsDialogBase.java | 4 +- .../comp/w2lcommon/helper/PropertyHelper.java | 12 +- .../writer4latex/ConfigurationDialog.java | 304 +++++++++++++ .../da/comp/writer4latex/ExternalApps.java | 250 +++++++++++ .../da/comp/writer4latex/LogViewerDialog.java | 146 +++++++ .../da/comp/writer4latex/StreamGobbler.java | 56 +++ .../da/comp/writer4latex/TeXify.java | 124 ++++++ .../da/comp/writer4latex/W4LRegistration.java | 103 +++++ .../da/comp/writer4latex/Writer4LaTeX.java | 408 ++++++++++++++++++ source/java/writer2latex/Application.java | 12 +- .../writer2latex/api/ConverterFactory.java | 6 +- .../writer2latex/api/ConverterResult.java | 2 +- .../writer2latex/bibtex/BibTeXDocument.java | 6 +- .../latex/CharStyleConverter.java | 4 +- .../writer2latex/latex/ConverterPalette.java | 4 +- .../writer2latex/latex/DrawConverter.java | 14 +- .../writer2latex/latex/FieldConverter.java | 18 +- .../writer2latex/latex/IndexConverter.java | 4 +- .../java/writer2latex/latex/LaTeXConfig.java | 22 +- .../latex/LaTeXDocumentPortion.java | 4 +- .../latex/ListStyleConverter.java | 4 +- .../writer2latex/latex/NoteConverter.java | 6 +- .../latex/PageStyleConverter.java | 4 +- .../writer2latex/latex/StarMathConverter.java | 4 +- .../writer2latex/latex/i18n/ClassicI18n.java | 26 +- source/java/writer2latex/latex/i18n/I18n.java | 4 +- .../latex/i18n/UnicodeTableHandler.java | 18 +- .../writer2latex/latex/i18n/XeTeXI18n.java | 2 +- .../writer2latex/latex/util/StyleMap.java | 16 +- .../writer2latex/office/ControlReader.java | 2 +- .../java/writer2latex/office/FormsReader.java | 12 +- .../java/writer2latex/office/ImageLoader.java | 2 +- .../writer2latex/office/OfficeReader.java | 56 ++- .../office/OfficeStyleFamily.java | 8 +- .../java/writer2latex/office/PropertySet.java | 12 +- .../java/writer2latex/office/TableReader.java | 24 +- .../java/writer2latex/office/TocReader.java | 6 +- .../java/writer2latex/office/XMLString.java | 8 +- .../util/ExportNameCollection.java | 6 +- source/java/writer2latex/xhtml/Converter.java | 34 +- .../writer2latex/xhtml/DrawConverter.java | 8 +- .../xhtml/FrameStyleConverter.java | 4 +- source/java/writer2latex/xhtml/L10n.java | 4 +- .../xhtml/ListStyleConverter.java | 4 +- .../xhtml/PageStyleConverter.java | 4 +- .../xhtml/PresentationStyleConverter.java | 8 +- .../StyleWithPropertiesConverterHelper.java | 4 +- .../writer2latex/xhtml/TableConverter.java | 2 +- .../writer2latex/xhtml/TextConverter.java | 36 +- .../xhtml/TextStyleConverter.java | 16 +- .../java/writer2latex/xhtml/XhtmlConfig.java | 4 +- .../writer2latex/xhtml/XhtmlStyleMap.java | 18 +- .../java/writer2latex/xmerge/ConvertData.java | 8 +- .../writer2latex/xmerge/OfficeDocument.java | 14 +- .../java/writer2latex/xmerge/OfficeZip.java | 16 +- source/oxt/writer2latex/description.xml | 16 +- source/oxt/writer2xhtml/description.xml | 16 +- source/oxt/writer4latex/Addons.xcu | 142 ++++++ source/oxt/writer4latex/META-INF/manifest.xml | 41 ++ source/oxt/writer4latex/Options.xcs | 28 ++ source/oxt/writer4latex/Options.xcu | 89 ++++ source/oxt/writer4latex/OptionsDialog.xcu | 29 ++ source/oxt/writer4latex/Paths.xcu | 12 + source/oxt/writer4latex/ProtocolHandler.xcu | 12 + source/oxt/writer4latex/W2LOptions.xcu | 36 ++ .../writer4latex/W4LDialogs/Configuration.xdl | 38 ++ .../oxt/writer4latex/W4LDialogs/LogViewer.xdl | 19 + .../oxt/writer4latex/W4LDialogs/Module1.xba | 10 + source/oxt/writer4latex/W4LDialogs/dialog.xlb | 6 + source/oxt/writer4latex/W4LDialogs/script.xlb | 5 + source/oxt/writer4latex/config/article.xml | 170 ++++++++ source/oxt/writer4latex/description.xml | 9 + .../template/Writer4LaTeX/LaTeX-article.ott | Bin 0 -> 11327 bytes .../oxt/xhtml-config-sample/description.xml | 2 +- source/readme-source.txt | 4 +- 83 files changed, 2373 insertions(+), 631 deletions(-) create mode 100644 source/distro/doc/w4l-user-manual.odt create mode 100644 source/java/org/openoffice/da/comp/writer4latex/ConfigurationDialog.java create mode 100644 source/java/org/openoffice/da/comp/writer4latex/ExternalApps.java create mode 100644 source/java/org/openoffice/da/comp/writer4latex/LogViewerDialog.java create mode 100644 source/java/org/openoffice/da/comp/writer4latex/StreamGobbler.java create mode 100644 source/java/org/openoffice/da/comp/writer4latex/TeXify.java create mode 100644 source/java/org/openoffice/da/comp/writer4latex/W4LRegistration.java create mode 100644 source/java/org/openoffice/da/comp/writer4latex/Writer4LaTeX.java create mode 100644 source/oxt/writer4latex/Addons.xcu create mode 100644 source/oxt/writer4latex/META-INF/manifest.xml create mode 100644 source/oxt/writer4latex/Options.xcs create mode 100644 source/oxt/writer4latex/Options.xcu create mode 100644 source/oxt/writer4latex/OptionsDialog.xcu create mode 100644 source/oxt/writer4latex/Paths.xcu create mode 100644 source/oxt/writer4latex/ProtocolHandler.xcu create mode 100644 source/oxt/writer4latex/W2LOptions.xcu create mode 100644 source/oxt/writer4latex/W4LDialogs/Configuration.xdl create mode 100644 source/oxt/writer4latex/W4LDialogs/LogViewer.xdl create mode 100644 source/oxt/writer4latex/W4LDialogs/Module1.xba create mode 100644 source/oxt/writer4latex/W4LDialogs/dialog.xlb create mode 100644 source/oxt/writer4latex/W4LDialogs/script.xlb create mode 100644 source/oxt/writer4latex/config/article.xml create mode 100644 source/oxt/writer4latex/description.xml create mode 100644 source/oxt/writer4latex/template/Writer4LaTeX/LaTeX-article.ott diff --git a/build.xml b/build.xml index 9262896..d5f9133 100644 --- a/build.xml +++ b/build.xml @@ -2,14 +2,15 @@ ############################################################################ # This is the Ant build file for writer2latex # Original: Sep 2004 (mgn) - # version 1.0 (2009-03-02) + # version 1.2 (2009-03-30) ############################################################################ --> - + + writer2latex - build file @@ -34,8 +35,8 @@ - - + + @@ -48,8 +49,10 @@ + + files="unoil.jar"/> @@ -67,7 +70,7 @@ @@ -185,11 +188,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + - + - @@ -208,7 +236,7 @@ + includes="${jarfile}.jar,writer2latex.oxt,writer2xhtml.oxt,writer4latex.oxt,xhtml-config-sample.oxt"/> diff --git a/source/distro/Readme.txt b/source/distro/Readme.txt index f51a633..2ba8f34 100644 --- a/source/distro/Readme.txt +++ b/source/distro/Readme.txt @@ -1,7 +1,7 @@ -Writer2LaTeX version 1.0 beta -============================= +Writer2LaTeX version 1.1.1 (development release) +================================================ -This is the distribution of Writer2LaTeX version 1.0 beta +This is the distribution of Writer2LaTeX version 1.1.1 Latest version can be found at the web site http://writer2latex.sourceforge.net diff --git a/source/distro/changelog.txt b/source/distro/changelog.txt index 1eba147..d7e239b 100644 --- a/source/distro/changelog.txt +++ b/source/distro/changelog.txt @@ -1,342 +1,15 @@ -Changelog for Writer2LaTeX version 0.5 -> 1.0 +Changelog for Writer2LaTeX version 1.0 -> 1.2 ----------- version 1.0 beta ---------- +---------- version 1.1.1 ---------- -[w2x] Added german translation from Raphael Fetzer +[all] Bugfix: Paragraphs containing only fields are no longer lost -[w2x] Do not export character formatting in toc +[w4l] Added Writer4LaTeX extension -[w2l] Bugfix: Added missing hyperlink targets for frames and graphics +[all] Buildfile is adapted to work with separated ure and office (OOo 3.0+) -[w2x] Bugfix: Fixed null pointer exception for text frames without height attribute +[all] Bugfix: Corrected path to descriptions in oxt -[w2l] Added spanish translation from Emilio José Juárez Pérez +[w2x] Bugfix: Corrected typo in german translation of navigation bar -[w2l] Added support for bitmap graphics with backend=dvips - -[all] No longer create source distribution (SourceForge provides tarballs generated - directly from SVN) - -[all] Added german description to filters - -[w2l] Bugfix: Fixed crash for tables with fewer columns than rows - ----------- version 0.9.4 ----------- - -[w2l] Added sample LaTeX configuration for Google Docs from Elefterios Stamatogiannakis - -[w2x] Added MathML named entites table from Bruno Mascret - -[all] Bugfix: Locked controls are now updated correctly when the dialog is displayed - -[w2l] New backed xetex (initial prototype) - -[c2x] Bugfix: Corrected wrong calculation of column number for columns with two letters - (affected apply_print_ranges=true) - -[c2x] Bugfix: Ensure that we always export a document, even if there are no defined - print ranges (affected apply_print_ranges=true) - -[c2x] Bugfix: Now also exports uplink for spreadsheets - -[w2l] Bugfix: No longer incorrectly assume math mode when exporting plain text - -[all] Added support for the new Writer notes/annotations (which now can contain several - formatted paragraphs rather than a single, plain text paragraph) - -[all] Added russian and ukrainian translations from Volodymyr Volkov - -[all] Bugfix: Removed PreferredFilter propery from type definitions (makes sense - only for import filters) - -[all] Changed unix startscript: By default assume that w2l and writer2latex are - in the same directory (thus using dirname $0), and assume that the java executable - is either in the PATH or the location is defined by JAVA_HOME - (which these assumptions manual editing of the script is usually not required) - -[all] Added french translation from Jacques Lamoine - -[w2l] The option simple_table_limit now refers to the *total* width of the table - measured in characters rather than the width of individual cells - -[w2x] Bugfix: The position and dimensions of a frame is now calculated correctly - (previously the size of margins, borders and padding was not taken into account) - -[w2l] The inputencoding utf8 now uses the LaTeX standard rather than ucs.sty - (which only supports latin and cyrillic alphabets) - -[w2l] New style map family "text-attribute" to map text formatting to LaTeX code - currently only the values "bold", "italic", "small-caps", "subscript" and - "superscript" are supported, and the verbatim attribute is not supported - ----------- version 0.9.3 ----------- - -[all] All source files are now US ASCII; added encoding of source files to build file - -[all] Added more File-based methods to the API - -[w2l] The paper sizes defined by standard LaTeX document classes are now - identified and added as global options (a4paper, a5paper, b5paper, - letterpaper, legalpaper, executivepaper, including landscape variants) - -[w2x] Bugfix: Now only exports the name of a text box if it actually exists! - -[w2l] Removed option "pagecolor" from \hypersetup (this option has been removed - from the hyperref package) - -[all] Filter bugfix: The new option name "ConfigURL" is now used in the dialogs - -[all] Added (partial) german localization from Martin Friedrich - -[w2x] New option use_named_entities: When set to true, named character entities - as defined in xhtml 1.0 are used (currently only those within ISO latin 1) - -[w2x] Characters not supported by the encoding are now exported as numeric - character entities - -[w2x] Bugfix: Internal hyperlinks to tables, sections, frames and graphics now - works correctly - -[w2x] Bugfix: Subtables are no longer exported with an id attribute - -[all] Bugfix: table:number-rows-repeated is now treated correctly - -[c2x] New option: apply_print_ranges - ----------- version 0.9.2 ----------- - -[c2x] No longer exports for tables without - -[all] Renamed "class" to "family" in style maps to avoid confusion - with css classes (old name is still accepted) - -[all] Filter: Renamed template and config options to the more - descriptive TemplateURL and ConfigURL - -[all] API: Added convenience method convert(File) to Converterer - -[all] API: Added convenience method write(File) to ConverterResult - -[all] New option: save_images_in_subdir - -[all] Use Robert Harders public domain Base64 decoder (replacing - the non-standard decoder in sun.misc) - -[all] MIMETypes used in the API are now defined in writer2latex.api.MIMETypes - -[all] Renamed the option keep_image_size to original_image_size (the meaning of - this option was confusing). The old name is still recognized. - -[all] OOo now saves SVM files with a MIME type in the package format. - This is now recognized by w2l, which implies that GraphicConverter - implementations can use SVM files from a package - -[w2x] New uno service org.openoffice.da.writer2xhtml.BatchConverter - provides batch conversion via uno. Interaction with the user can be implemented - using the interface org.openoffice.da.writer2xhtml.XBatchHandler - -[w2x] Batch processing from the command line can now be cancelled (using the Enter key) - -[all] API: Created new API for batch conversion - -[w2l] Bugfix: Tables were in rare cases exported with invalid row alignment - (null character) - -[w2x] Filter ui bugfix: Default value for RepeatLevels changed from - 6 to 5 (6 was not valid) - -[w2x] Filter: The xhtml export now uses it's own custom configuration - (writer2xhtml.xml, also stored in the user configuration of OOo) - -[w2l] Tabstops are now exported as \ \ , which usually is closer to - the expectations of the user (and is not ignored at the beginning of a par.) - -[w2x] Empty paragraphs are now (again!) exported with a   - (otherwise they are ignored by the browser) - -[w2x] Xhtml specific options no longer starts with the prefix xhtml_ - (is still accepted for backwards compatibility) - -[all] Filter: Added display name and description to the extensions - -[w2x] BatchConverter: Localized alternative text for icons - -[w2b] Bugfix: Replace ";" with "and" also in in editor field - -[w2x] Added new options xslt_path to give the path to the XSL - transformation from w3c (also in the ui) - -[all] Filter: Optimized the size of the extensions by excluding code not - relevant for the format(s) supported by the extension - -[all] Separated LaTeX and xhtml code. As a consequence, it is possible to build - and run Writer2LaTeX with support for only one format - -[c2x] New options display_hiddens_rows_cols and display_filtered_rows_cols. If - set to false (default), rows and columns that are hidden or filtered are not - exported - -[all] Filter: Translated dialogs to Danish - -[all] Filter: Raised requirement in description.xml to OOo 2.2 - (needs support for localized dialogs) - -[w2l] Added ui option "Support additional symbols". This sets all the - options use_pifont, use_ifsym, use_wasysym, use_eurosym and use_tipa. - The pseudo-option additional_symbols can be used in the LockedOptions list - -[all] Bugfix: The class w2l.xmerge.DOMDocument did not throw IOException when - trying to read a non-xml document - -[w2x] Bugfix: The convert method did not restart document enumeration - (relevant if it's called several times for the same converter instance) - -[w2x] API: Created new API for batch conversion, which is also moved - from Application to a separate class - -[all] API: The API now uses a interface to the configuration rather than using - the class writer2latex.util.Config - -[w2x] Style of header/footer in index pages (batch conversion) aligned with - document header/footer - -[all] Added package descriptions to the javadoc - -[w2l] Always export non-breaking space as ~ even if inputenc supports it - directly - non-breaking spaces are usually not easy to identify in text editors - ----------- version 0.9.1 ----------- - -[w2x] New option: xhtml_add_bom (default false), if set to true - a BOM will be added at the start of generated xhtml files - -[w2x] Fixed typo in filter name: XHTML 1.0 + MathML 2.0 should be - XHTML 1.1 + MathML 2.0 - -[w2l] Added support for the latin language - -[w2l] Removed article.xml from w2l - it now belongs to Writer4LaTeX - -[all] The distribution now includes a sample configuration - package: xhtml-config-sample.oxt - -[all] Filter: Split the filter component into two extensions: - writer2latex.oxt for LaTeX and BibTeX, writer2xhtml.oxt for xhtml - The build file now produces optimized jars for each application, and the - standalone jar does not contain any uno code - -[w2l] Added (imcomplete) support for some of the Euclid fonts from Design Science - -[w2b] Replace ";" with "and" in author field (multiple authors) - -[w2l] Added support for formulas inserted by OOoLaTeX - -[w2x] Now adds mini-toc to the element with id "panel" if it exists in the xhtml - template - -[w2l] API: Added new api for standalone StarMath converter - Writer2LaTeX api: writer2latex.api.StarMathConverter - Uno service: org.openoffice.da.writer2latex.StarMathConverter - -[all] Filter: Added dialogs to all filters (w2l, w2x and c2x) - -[w2l] Vector graphics (except wmf) is now exported as pdf if backend is pdftex - -[all] API: In the GraphicConverter interface, the method - supportsFormat has been replaced with the method supportsConversion - -[w2l] Added support for *numbered* display equations: If paragraph - contains exactly one equation and exactly one sequence field (and otherwise - only whitespace and brackets), it treated as a numbered equation - -[w2l] I18n: If several characters in a row are converted using math mode, they - are now combined (ie. ${\alpha}{\beta}$ rather than ${\alpha}$${\beta}$) - -[all] Extended FilterData to support the property AutoCreate. If set to true, - the configuration file will be created if it does not exist - -[w2l] Even if formatting=IGNORE_ALL, we should still obey character style maps - from the configuration - -[w2x] Added german translation of navigation pane (w2l.util.L10n) - -[all] Bugfix: A paragraph with a bibliographic reference as the only - content was considered empty (and the reference was lost) - -[w2l] Use url decoding when creating file names for linked sections - (in order to obtain more readable file names) - -[w2l] Avoid redundant \mathit in StarMathConverter in some rare - cases (such as greek letters pasted into Math) - -[w2l] Support formulas for sequence fields (only the most common - cases oow:Name, oow:Name+Number, oow:Name-Number and oow:Number) - -[c2x] New options xhtml_display_hidden_sheets, xhtml_use_title_as_heading and - xhtml_use_sheet_names_as_headings - -[o2x] New option xhtml_notes. If true notes (annotations) are exported to xhtml - comments, if false they are ignored - -[c2x] Convert notes (annotations) - -[w2l] Heading formatting: The prefix and suffix to the counter should not be - included in \thesection, but rather in the formatting. This means that the - prefix and suffix no longer will be exported if formatting=CONVERT_BASIC - -[w2l] Added support for chapter references to reference marks and bookmarks - (if the marks are contained in a heading) - -[w2l] New option external_bibtex_files gives a list of BibTeX files. If nonempty, - these files will be used instead of converting the actual bibliography marks - -[w2l] New option metadata. If true, export metadata as \author, - \date and pdf metadata, as well as pdf metadata (if use_hyperref is true) - -[all] Filters/API: Changed filternames to the more obvious - org.openoffice.da.writer2latex etc. - -[w2l] Updated clean.xml and ultraclean.xml. Both configurations - now exports predefined Writer styles (like article.xml) - -[w2x] New option: xhtml_repeat_levels defines the number of heading - levels to repeat when splitting a file (0 means no levels are repeated) - -[w2x] Allow xhtml templates without header and footer elements - -[w2x] Bugfix (w2l.office.ListCounter): OpenDocument does not use - numberings like 1.0.1 if a list level is missing, but rather 1.1.1 - -[all] Command line application now uses internal standard configurations - (*ultraclean.xml etc.) - -[all] Command line application now accepts several configuration - files (by using the -config option more than once) - -[w2x] Use text style for label when applying numbering to heading - -[w2x] Added support for other list styes applied to headings - -[w2x] Added support for text:restart-numbering, text:is-list-header on headings - -[w2x] No longer add hr and [] to links in navigation (the template and style - sheet should take care of this) - -[all] New filter configuration concept: Configuration packages containing an OOo - template, a w2l configuration and registry information to bind these together: - When a configuration package is installed in OOo, the configuration is added - to the filter ui, and is preselected for documents based on the OOo template - -[all] Repackaging: Distribution files are included in source, build - file is extended to create the distribution; source distribution is separated - -[all] Changed to new extension format (.oxt) - -[all] Filter: Added messagebox to display the error in case an - exception happens during conversion - -[all] Moved default configurations to jar; the FilterData property - can refer to these using the special url *filename.xml - -[all] The filter now reads the FilterData property, which can be - used to specify options, configuration fil (url) and xhtml template (url) \ No newline at end of file +[all] Raised requirement from Java 1.4 to Java 5 \ No newline at end of file diff --git a/source/distro/doc/user-manual.odt b/source/distro/doc/user-manual.odt index 5e48e3dfaeebddb367b5a5c533c17da76c01f3a0..0e82b2832547b188fa05e2d565ab8cce61d37672 100644 GIT binary patch delta 45287 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 diff --git a/source/distro/doc/w4l-user-manual.odt b/source/distro/doc/w4l-user-manual.odt new file mode 100644 index 0000000000000000000000000000000000000000..f016fb2026e9cceeedfb4e2c8c2e8eace99eb58b GIT binary patch literal 16835 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 literal 0 HcmV?d00001 diff --git a/source/java/org/openoffice/da/comp/w2lcommon/filter/ExportFilterBase.java b/source/java/org/openoffice/da/comp/w2lcommon/filter/ExportFilterBase.java index 3899deb..91f944a 100644 --- a/source/java/org/openoffice/da/comp/w2lcommon/filter/ExportFilterBase.java +++ b/source/java/org/openoffice/da/comp/w2lcommon/filter/ExportFilterBase.java @@ -378,7 +378,7 @@ public abstract class ExportFilterBase implements } // Write out files - Iterator docEnum = dataOut.iterator(); + Iterator docEnum = dataOut.iterator(); // Remove the file name part of the url String sNewURL = null; @@ -393,7 +393,7 @@ public abstract class ExportFilterBase implements } while (docEnum.hasNext() && sURL.startsWith("file:")) { - OutputFile docOut = (OutputFile)docEnum.next(); + OutputFile docOut = docEnum.next(); if (dataOut.getMasterDocument()==docOut) { // The master document is written to the XOutStream supplied diff --git a/source/java/org/openoffice/da/comp/w2lcommon/filter/FilterDataParser.java b/source/java/org/openoffice/da/comp/w2lcommon/filter/FilterDataParser.java index 765dd6b..31fa970 100644 --- a/source/java/org/openoffice/da/comp/w2lcommon/filter/FilterDataParser.java +++ b/source/java/org/openoffice/da/comp/w2lcommon/filter/FilterDataParser.java @@ -232,9 +232,9 @@ public class FilterDataParser { } // Read further configuration properties - Enumeration keys = props.keys(); + Enumeration keys = props.keys(); while (keys.hasMoreElements()) { - String sKey = (String) keys.nextElement(); + String sKey = keys.nextElement(); if (!"ConfigURL".equals(sKey) && !"TemplateURL".equals(sKey) && !"AutoCreate".equals(sKey)) { Object value = props.get(sKey); if (AnyConverter.isString(value)) { diff --git a/source/java/org/openoffice/da/comp/w2lcommon/filter/GraphicConverterImpl2.java b/source/java/org/openoffice/da/comp/w2lcommon/filter/GraphicConverterImpl2.java index f1364a3..e08f022 100644 --- a/source/java/org/openoffice/da/comp/w2lcommon/filter/GraphicConverterImpl2.java +++ b/source/java/org/openoffice/da/comp/w2lcommon/filter/GraphicConverterImpl2.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.0 (2009-03-08) + * Version 1.2 (2009-03-26) * */ @@ -58,14 +58,14 @@ import writer2latex.api.MIMETypes; public class GraphicConverterImpl2 implements GraphicConverter { private XComponentContext xComponentContext; - private Hashtable importFilter; - private Hashtable exportFilter; + private Hashtable importFilter; + private Hashtable exportFilter; private EPSCleaner epsCleaner; public GraphicConverterImpl2(XComponentContext xComponentContext) { this.xComponentContext = xComponentContext; - importFilter = new Hashtable(); + importFilter = new Hashtable(); importFilter.put(MIMETypes.BMP, "BMP - MS Windows"); //importFilter.put(MIMETypes.EMF, "EMF - MS Windows Metafile"); importFilter.put(MIMETypes.EPS, "EPS - Encapsulated PostScript"); @@ -76,7 +76,7 @@ public class GraphicConverterImpl2 implements GraphicConverter { importFilter.put(MIMETypes.TIFF, "TIF - Tag Image File"); importFilter.put(MIMETypes.WMF, "WMF - MS Windows Metafile"); - exportFilter = new Hashtable(); + exportFilter = new Hashtable(); exportFilter.put(MIMETypes.BMP,"draw_bmp_Export"); //exportFilter.put(MIMETypes.EMF,"draw_emf_Export"); exportFilter.put(MIMETypes.EPS,"draw_eps_Export"); diff --git a/source/java/org/openoffice/da/comp/w2lcommon/filter/OptionsDialogBase.java b/source/java/org/openoffice/da/comp/w2lcommon/filter/OptionsDialogBase.java index e1d0424..52c5db7 100644 --- a/source/java/org/openoffice/da/comp/w2lcommon/filter/OptionsDialogBase.java +++ b/source/java/org/openoffice/da/comp/w2lcommon/filter/OptionsDialogBase.java @@ -87,7 +87,7 @@ public abstract class OptionsDialogBase extends DialogBase implements this.xMSF = null; // must be set properly by subclass mediaProps = null; sConfigNames = null; - lockedOptions = new HashSet(); + lockedOptions = new HashSet(); } ////////////////////////////////////////////////////////////////////////// @@ -163,7 +163,7 @@ public abstract class OptionsDialogBase extends DialogBase implements private String[] sConfigNames; // Set of locked controls - private HashSet lockedOptions; + private HashSet lockedOptions; ////////////////////////////////////////////////////////////////////////// diff --git a/source/java/org/openoffice/da/comp/w2lcommon/helper/PropertyHelper.java b/source/java/org/openoffice/da/comp/w2lcommon/helper/PropertyHelper.java index 647f37c..bc79722 100644 --- a/source/java/org/openoffice/da/comp/w2lcommon/helper/PropertyHelper.java +++ b/source/java/org/openoffice/da/comp/w2lcommon/helper/PropertyHelper.java @@ -35,14 +35,14 @@ import com.sun.star.beans.PropertyValue; */ public class PropertyHelper { - private Hashtable data; + private Hashtable data; public PropertyHelper() { - data = new Hashtable(); + data = new Hashtable(); } public PropertyHelper(PropertyValue[] props) { - data = new Hashtable(); + data = new Hashtable(); int nLen = props.length; for (int i=0; i keys() { return data.keys(); } @@ -65,9 +65,9 @@ public class PropertyHelper { int nSize = data.size(); PropertyValue[] props = new PropertyValue[nSize]; int i=0; - Enumeration keys = keys(); + Enumeration keys = keys(); while (keys.hasMoreElements()) { - String sKey = (String) keys.nextElement(); + String sKey = keys.nextElement(); props[i] = new PropertyValue(); props[i].Name = sKey; props[i++].Value = get(sKey); diff --git a/source/java/org/openoffice/da/comp/writer4latex/ConfigurationDialog.java b/source/java/org/openoffice/da/comp/writer4latex/ConfigurationDialog.java new file mode 100644 index 0000000..d02577c --- /dev/null +++ b/source/java/org/openoffice/da/comp/writer4latex/ConfigurationDialog.java @@ -0,0 +1,304 @@ +/************************************************************************ + * + * ConfigurationDialog.java + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * Copyright: 2002-2009 by Henrik Just + * + * All Rights Reserved. + * + * Version 1.2 (2009-03-30) + * + */ + +package org.openoffice.da.comp.writer4latex; + +import java.io.File; +import java.net.URI; + +import com.sun.star.awt.XControl; +import com.sun.star.awt.XControlContainer; +import com.sun.star.awt.XControlModel; +import com.sun.star.awt.XContainerWindowEventHandler; +import com.sun.star.awt.XWindow; +import com.sun.star.beans.XPropertySet; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XServiceInfo; +import com.sun.star.ui.dialogs.ExecutableDialogResults; +import com.sun.star.ui.dialogs.XExecutableDialog; +import com.sun.star.ui.dialogs.XFilePicker; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XComponentContext; + +import com.sun.star.lib.uno.helper.WeakBase; + +/** This class provides a uno component which implements the configuration + * of Writer4LaTeX + */ +public final class ConfigurationDialog + extends WeakBase + implements XServiceInfo, XContainerWindowEventHandler { + + private XComponentContext xContext; + + private ExternalApps externalApps; + + /** The component will be registered under this name. + */ + public static String __serviceName = "org.openoffice.da.writer4latex.ConfigurationDialog"; + + /** The component should also have an implementation name. + */ + public static String __implementationName = "org.openoffice.da.comp.writer4latex.ConfigurationDialog"; + + /** Create a new ConfigurationDialog */ + public ConfigurationDialog(XComponentContext xContext) { + this.xContext = xContext; + externalApps = new ExternalApps(xContext); + } + + // Implement XContainerWindowEventHandler + public boolean callHandlerMethod(XWindow xWindow, Object event, String sMethod) + throws com.sun.star.lang.WrappedTargetException { + try { + if (sMethod.equals("external_event") ){ + return handleExternalEvent(xWindow, event); + } + else if (sMethod.equals("ApplicationChange")) { + return changeApplication(xWindow); + } + else if (sMethod.equals("BrowseClick")) { + return browseForExecutable(xWindow); + } + else if (sMethod.equals("ExecutableUnfocus")) { + return updateApplication(xWindow); + } + else if (sMethod.equals("OptionsUnfocus")) { + return updateApplication(xWindow); + } + else if (sMethod.equals("AutomaticClick")) { + return autoConfigure(xWindow); + } + } + 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", "ApplicationChange", "BrowseClick", "ExecutableUnfocus", "OptionsUnfocus", "AutomaticClick" }; + 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(com.sun.star.awt.XWindow xWindow, Object aEventObject) + throws com.sun.star.uno.Exception { + try { + String sMethod = AnyConverter.toString(aEventObject); + if (sMethod.equals("ok")) { + externalApps.save(); + return true; + } else if (sMethod.equals("back") || sMethod.equals("initialize")) { + externalApps.load(); + return changeApplication(xWindow); + } + } + 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; + } + + private boolean changeApplication(XWindow xWindow) { + String sAppName = getSelectedAppName(xWindow); + if (sAppName!=null) { + String[] s = externalApps.getApplication(sAppName); + setComboBoxText(xWindow, "Executable", s[0]); + setComboBoxText(xWindow, "Options", s[1]); + } + return true; + } + + private boolean browseForExecutable(XWindow xWindow) { + XComponent xComponent = null; + try { + // Create FilePicker + Object filePicker = xContext.getServiceManager() + .createInstanceWithContext("com.sun.star.ui.dialogs.FilePicker", xContext); + XFilePicker xFilePicker = (XFilePicker) + UnoRuntime.queryInterface(XFilePicker.class, filePicker); + xComponent = (XComponent) + UnoRuntime.queryInterface(XComponent.class, xFilePicker); + + // Display the FilePicker + XExecutableDialog xExecutable = (XExecutableDialog) + UnoRuntime.queryInterface(XExecutableDialog.class, xFilePicker); + + // Get the path + if (xExecutable.execute() == ExecutableDialogResults.OK) { + String[] sPathList = xFilePicker.getFiles(); + if (sPathList.length > 0) { + setComboBoxText(xWindow, "Executable", new File(new URI(sPathList[0])).getCanonicalPath()); + updateApplication(xWindow); + } + } + } + catch (com.sun.star.uno.Exception e) { + } + catch (java.net.URISyntaxException e) { + } + catch (java.io.IOException e) { + } + finally{ + // Always dispose the FilePicker component + if (xComponent!=null) { + xComponent.dispose(); + } + } + return true; + } + + private boolean updateApplication(XWindow xWindow) { + String sAppName = getSelectedAppName(xWindow); + if (sAppName!=null) { + externalApps.setApplication(sAppName, getComboBoxText(xWindow, "Executable"), getComboBoxText(xWindow, "Options")); + } + return true; + } + + private boolean autoConfigure(XWindow xWindow) { + externalApps.setApplication(ExternalApps.LATEX, "latex", "--interaction=batchmode %s"); + externalApps.setApplication(ExternalApps.PDFLATEX, "pdflatex", "--interaction=batchmode %s"); + externalApps.setApplication(ExternalApps.XELATEX, "xelatex", "--interaction=batchmode %s"); + externalApps.setApplication(ExternalApps.DVIPS, "dvips", "%s"); + externalApps.setApplication(ExternalApps.BIBTEX, "bibtex", "%s"); + externalApps.setApplication(ExternalApps.MAKEINDEX, "makeindex", "%s"); + externalApps.setApplication(ExternalApps.OOLATEX, "oolatex", "%s"); + + String sOsName = System.getProperty("os.name"); + if ("Linux".equals(sOsName)) { + // TODO: Search for applications (which...) + // Viewers may be evince, okular, xdvi, xpdf, ghostview or... + externalApps.setApplication(ExternalApps.DVIVIEWER, "evince", "%s"); + externalApps.setApplication(ExternalApps.PDFVIEWER, "evince", "%s"); + externalApps.setApplication(ExternalApps.POSTSCRIPTVIEWER, "evince", "%s"); + } + else if ("Windows".equals(sOsName)) { + // Assume MikTeX + externalApps.setApplication(ExternalApps.DVIVIEWER, "yap", "--single-instance %s"); + // And assume gsview for pdf and ps + // gsview32 may not be in the path, but at least this helps a bit + externalApps.setApplication(ExternalApps.PDFVIEWER, "gsview32.exe", "-e \"%s\""); + externalApps.setApplication(ExternalApps.POSTSCRIPTVIEWER, "gsview32.exe", "-e \"%s\""); + } + changeApplication(xWindow); + return true; + } + + private String getSelectedAppName(XWindow xWindow) { + short nItem = getListBoxSelectedItem(xWindow, "Application"); + //String sAppName = null; + switch (nItem) { + case 0: return ExternalApps.LATEX; + case 1: return ExternalApps.PDFLATEX; + case 2: return ExternalApps.XELATEX; + case 3: return ExternalApps.DVIPS; + case 4: return ExternalApps.BIBTEX; + case 5: return ExternalApps.MAKEINDEX; + case 6: return ExternalApps.OOLATEX; + case 7: return ExternalApps.DVIVIEWER; + case 8: return ExternalApps.PDFVIEWER; + case 9: return ExternalApps.POSTSCRIPTVIEWER; + } + return "???"; + } + + // Some helpers copied from DialogBase + private XPropertySet getControlProperties(XWindow xWindow, String sControlName) { + XControlContainer xContainer = (XControlContainer) + UnoRuntime.queryInterface(XControlContainer.class, xWindow); + XControl xControl = xContainer.getControl(sControlName); + XControlModel xModel = xControl.getModel(); + XPropertySet xPropertySet = (XPropertySet) + UnoRuntime.queryInterface(XPropertySet.class, xModel); + return xPropertySet; + } + + private String getComboBoxText(XWindow xWindow, String sControlName) { + // Returns the text of a combobox + XPropertySet xPropertySet = getControlProperties(xWindow, sControlName); + try { + return (String) xPropertySet.getPropertyValue("Text"); + } + catch (Exception e) { + // Will fail if the control does not exist or is not a combo + return ""; + } + } + + private void setComboBoxText(XWindow xWindow, String sControlName, String sText) { + XPropertySet xPropertySet = getControlProperties(xWindow, sControlName); + try { + xPropertySet.setPropertyValue("Text", sText); + } + catch (Exception e) { + // Will fail if the control does not exist or is not a combo box or + // nText is an illegal value + } + } + + private short getListBoxSelectedItem(XWindow xWindow, String sControlName) { + // Returns the first selected element in case of a multiselection + XPropertySet xPropertySet = getControlProperties(xWindow, sControlName); + try { + short[] selection = (short[]) xPropertySet.getPropertyValue("SelectedItems"); + return selection[0]; + } + catch (Exception e) { + // Will fail if the control does not exist or is not a list box + return -1; + } + } + + + + + +} + + + diff --git a/source/java/org/openoffice/da/comp/writer4latex/ExternalApps.java b/source/java/org/openoffice/da/comp/writer4latex/ExternalApps.java new file mode 100644 index 0000000..a92d57c --- /dev/null +++ b/source/java/org/openoffice/da/comp/writer4latex/ExternalApps.java @@ -0,0 +1,250 @@ +/************************************************************************ + * + * ExternalApps.java + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * Copyright: 2002-2009 by Henrik Just + * + * All Rights Reserved. + * + * Version 1.2 (2009-03-30) + * + */ + +package org.openoffice.da.comp.writer4latex; + +import java.io.File; +import java.io.IOException; +import java.lang.Process; +import java.lang.ProcessBuilder; +import java.util.HashMap; +import java.util.Vector; +//import java.util.Map; + +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.XMultiHierarchicalPropertySet; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XComponentContext; +import com.sun.star.util.XChangesBatch; + + +/** This class manages and executes external applications used by Writer4LaTeX. + * These include TeX and friends as well as viewers for the various backend + * formats. The registry is used for persistent storage of the settings. + */ +public class ExternalApps { + + public final static String LATEX = "LaTeX"; + public final static String PDFLATEX = "PdfLaTeX"; + public final static String XELATEX = "XeLaTeX"; + public final static String BIBTEX = "BibTeX"; + public final static String MAKEINDEX = "Makeindex"; + public final static String OOLATEX = "Oolatex"; + public final static String DVIPS = "Dvips"; + public final static String DVIVIEWER = "DVIViewer"; + public final static String POSTSCRIPTVIEWER = "PostscriptViewer"; + public final static String PDFVIEWER = "PdfViewer"; + + private final static String[] sApps = { LATEX, PDFLATEX, XELATEX, BIBTEX, MAKEINDEX, OOLATEX, DVIPS, DVIVIEWER, POSTSCRIPTVIEWER, PDFVIEWER }; + + private XComponentContext xContext; + + private HashMap apps; + + /** Construct a new ExternalApps object, with empty definitions */ + public ExternalApps(XComponentContext xContext) { + this.xContext = xContext; + apps = new HashMap(); + for (int i=0; i command = new Vector(); + command.add(sApp[0]); + String[] sArguments = sApp[1].split(" "); + for (String s : sArguments) { + command.add(s.replace("%s",sFileName)); + } + + ProcessBuilder pb = new ProcessBuilder(command); + //Map env = pb.environment(); + //env.put("VAR1", "myValue"); + pb.directory(workDir); + Process proc = pb.start(); + + + //Runtime rt = Runtime.getRuntime(); + //Process proc = rt.exec(sCommand, new String[0], workDir); + + // Gobble the error stream of the application + StreamGobbler errorGobbler = new + StreamGobbler(proc.getErrorStream(), "ERROR"); + + // Gooble the output stream of the application + StreamGobbler outputGobbler = new + StreamGobbler(proc.getInputStream(), "OUTPUT"); + + // Kick them off + errorGobbler.start(); + outputGobbler.start(); + + // Any error? + return bWaitFor ? proc.waitFor() : 0; + } + catch (InterruptedException e) { + return 1; + } + catch (IOException e) { + return 1; + } + } + + /** Load the external applications from the registry + */ + public void load() { + Object view; + try { + view = getRegistryView(false); + } + catch (com.sun.star.uno.Exception e) { + // Give up... + //setApplication(LATEX,"Error!",e.getMessage()); + return; + } + + XMultiHierarchicalPropertySet xProps = (XMultiHierarchicalPropertySet) + UnoRuntime.queryInterface(XMultiHierarchicalPropertySet.class, view); + for (int i=0; i 0 ) { + if (object[0] instanceof String) { + sBaseUrl = (String) object[0]; + } + } + } + + // Implement XDialogEventHandler + public boolean callHandlerMethod(XDialog xDialog, Object event, String sMethod) { + if (sMethod.equals("ViewLaTeXLog")) { + setComboBoxText("LogContents", sLaTeXLog); + } + else if (sMethod.equals("ViewBibTeXLog")) { + setComboBoxText("LogContents", sBibTeXLog); + } + else if (sMethod.equals("ViewMakeindexLog")) { + setComboBoxText("LogContents", sMakeindexLog); + } + return true; + } + + public String[] getSupportedMethodNames() { + String[] sNames = { "ViewLaTeXLog", "ViewBibTeXLog", "ViewMakeindexLog" }; + return sNames; + } + + // Utility methods + + private String readTextFile(String sUrl) { + StringBuffer buf = new StringBuffer(); + try { + File file = new File(new URI(sUrl)); + if (file.exists() && file.isFile()) { + InputStreamReader isr = new InputStreamReader(new FileInputStream(file)); + int n; + do { + n = isr.read(); + if (n>-1) { buf.append((char)n); } + } + while (n>-1); + isr.close(); + } + } + catch (URISyntaxException e) { + return ""; + } + catch (IOException e) { + return ""; + } + return buf.toString(); + } + +} + + + diff --git a/source/java/org/openoffice/da/comp/writer4latex/StreamGobbler.java b/source/java/org/openoffice/da/comp/writer4latex/StreamGobbler.java new file mode 100644 index 0000000..c8e802e --- /dev/null +++ b/source/java/org/openoffice/da/comp/writer4latex/StreamGobbler.java @@ -0,0 +1,56 @@ +/************************************************************************ + * + * StreamGobbler.java + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * Copyright: 2002-2009 by Henrik Just + * + * All Rights Reserved. + * + * Version 1.2 (2009-03-30) + * + */ + +package org.openoffice.da.comp.writer4latex; + +import java.io.*; + +class StreamGobbler extends Thread { + InputStream is; + String type; + + StreamGobbler(InputStream is, String type) { + this.is = is; + this.type = type; + } + + public void run() { + try { + InputStreamReader isr = new InputStreamReader(is); + BufferedReader br = new BufferedReader(isr); + String line=null; + while ( (line = br.readLine()) != null) { + //while ( br.readLine() != null) { + // Do nothing... + System.out.println(type + ">" + line); + } + } + catch (IOException ioe) { + ioe.printStackTrace(); + } + } +} + diff --git a/source/java/org/openoffice/da/comp/writer4latex/TeXify.java b/source/java/org/openoffice/da/comp/writer4latex/TeXify.java new file mode 100644 index 0000000..58ada66 --- /dev/null +++ b/source/java/org/openoffice/da/comp/writer4latex/TeXify.java @@ -0,0 +1,124 @@ +/************************************************************************ + * + * TeXify.java + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * Copyright: 2002-2009 by Henrik Just + * + * All Rights Reserved. + * + * Version 1.2 (2009-03-30) + * + */ + +package org.openoffice.da.comp.writer4latex; + +import java.io.File; +import java.io.IOException; + +import com.sun.star.uno.XComponentContext; + +/** This class builds LaTeX documents into dvi, postscript or pdf and displays + * the result. + */ +public final class TeXify { + + /** Backend format generic (dvi) */ + public static final short GENERIC = 1; + + /** Backend format dvips (postscript) */ + public static final short DVIPS = 2; + + /** Backend format pdfTeX (pdf) */ + public static final short PDFTEX = 3; + + // Define the applications to run for each backend + private static final String[] genericTexify = { + ExternalApps.LATEX, ExternalApps.BIBTEX, ExternalApps.MAKEINDEX, + ExternalApps.LATEX, ExternalApps.MAKEINDEX, ExternalApps.LATEX }; + private static final String[] pdfTexify = { + ExternalApps.PDFLATEX, ExternalApps.BIBTEX, ExternalApps.MAKEINDEX, + ExternalApps.PDFLATEX, ExternalApps.MAKEINDEX, ExternalApps.PDFLATEX }; + private static final String[] dvipsTexify = { + ExternalApps.LATEX, ExternalApps.BIBTEX, ExternalApps.MAKEINDEX, + ExternalApps.LATEX, ExternalApps.MAKEINDEX, ExternalApps.LATEX, + ExternalApps.DVIPS }; + + // Global objects + //private XComponentContext xContext; + private ExternalApps externalApps; + + public TeXify(XComponentContext xContext) { + //this.xContext = xContext; + externalApps = new ExternalApps(xContext); + } + + /** Process a document + * @param file the LaTeX file to process + * @param nBackend the desired backend format (generic, dvips, pdftex) + * @param bView set the true if the result should be displayed in the viewer + * @throws IOException if the document cannot be read + */ + public void process(File file, short nBackend, boolean bView) throws IOException { + // Remove extension from file + if (file.getName().endsWith(".tex")) { + file = new File(file.getParentFile(), + file.getName().substring(0,file.getName().length()-4)); + } + + // Update external apps from registry + externalApps.load(); + + // Process LaTeX document + if (nBackend==GENERIC) { + doTeXify(genericTexify, file); + if (externalApps.execute(ExternalApps.DVIVIEWER, + new File(file.getParentFile(),file.getName()+".dvi").getPath(), + file.getParentFile(), false)>0) { + throw new IOException("Error executing dvi viewer"); + } + } + else if (nBackend==PDFTEX) { + doTeXify(pdfTexify, file); + if (externalApps.execute(ExternalApps.PDFVIEWER, + new File(file.getParentFile(),file.getName()+".pdf").getPath(), + file.getParentFile(), false)>0) { + throw new IOException("Error executing pdf viewer"); + } + } + else if (nBackend==DVIPS) { + doTeXify(dvipsTexify, file); + if (externalApps.execute(ExternalApps.POSTSCRIPTVIEWER, + new File(file.getParentFile(),file.getName()+".ps").getPath(), + file.getParentFile(), false)>0) { + throw new IOException("Error executing postscript viewer"); + } + } + + } + + private void doTeXify(String[] sAppList, File file) throws IOException { + for (int i=0; i0) { + //throw new IOException("Error executing "+sAppList[i]); + } + } + } + +} \ No newline at end of file diff --git a/source/java/org/openoffice/da/comp/writer4latex/W4LRegistration.java b/source/java/org/openoffice/da/comp/writer4latex/W4LRegistration.java new file mode 100644 index 0000000..5c5b424 --- /dev/null +++ b/source/java/org/openoffice/da/comp/writer4latex/W4LRegistration.java @@ -0,0 +1,103 @@ +/************************************************************************ + * + * W4LRegistration.java + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * Copyright: 2002-2009 by Henrik Just + * + * All Rights Reserved. + * + * Version 1.2 (2009-03-26) + * + */ + +package org.openoffice.da.comp.writer4latex; + +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.XSingleServiceFactory; +import com.sun.star.registry.XRegistryKey; + +import com.sun.star.comp.loader.FactoryHelper; + +/** This class provides a static method to instantiate our uno components + * on demand (__getServiceFactory()), and a static method to give + * information about the components (__writeRegistryServiceInfo()). + * Furthermore, it saves the XMultiServiceFactory provided to the + * __getServiceFactory method for future reference by the componentes. + */ +public class W4LRegistration { + + public static XMultiServiceFactory xMultiServiceFactory; + + /** + * Returns a factory for creating the service. + * This method is called by the JavaLoader + * + * @return returns a XSingleServiceFactory for creating the + * component + * + * @param implName the name of the implementation for which a + * service is desired + * @param multiFactory the service manager to be used if needed + * @param regKey the registryKey + * + * @see com.sun.star.comp.loader.JavaLoader + */ + public static XSingleServiceFactory __getServiceFactory(String implName, + XMultiServiceFactory multiFactory, XRegistryKey regKey) { + xMultiServiceFactory = multiFactory; + XSingleServiceFactory xSingleServiceFactory = null; + if (implName.equals(Writer4LaTeX.__implementationName) ) { + xSingleServiceFactory = FactoryHelper.getServiceFactory(Writer4LaTeX.class, + Writer4LaTeX.__serviceName, + multiFactory, + regKey); + } + else if (implName.equals(ConfigurationDialog.__implementationName) ) { + xSingleServiceFactory = FactoryHelper.getServiceFactory(ConfigurationDialog.class, + ConfigurationDialog.__serviceName, + multiFactory, + regKey); + } + else if (implName.equals(LogViewerDialog.__implementationName) ) { + xSingleServiceFactory = FactoryHelper.getServiceFactory(LogViewerDialog.class, + LogViewerDialog.__serviceName, + multiFactory, + regKey); + } + + return xSingleServiceFactory; + } + + /** + * Writes the service information into the given registry key. + * This method is called by the JavaLoader + *

+ * @return returns true if the operation succeeded + * @param regKey the registryKey + * @see com.sun.star.comp.loader.JavaLoader + */ + public static boolean __writeRegistryServiceInfo(XRegistryKey regKey) { + return + FactoryHelper.writeRegistryServiceInfo(Writer4LaTeX.__implementationName, + Writer4LaTeX.__serviceName, regKey) & + FactoryHelper.writeRegistryServiceInfo(ConfigurationDialog.__implementationName, + ConfigurationDialog.__serviceName, regKey) & + FactoryHelper.writeRegistryServiceInfo(LogViewerDialog.__implementationName, + LogViewerDialog.__serviceName, regKey); + } +} + diff --git a/source/java/org/openoffice/da/comp/writer4latex/Writer4LaTeX.java b/source/java/org/openoffice/da/comp/writer4latex/Writer4LaTeX.java new file mode 100644 index 0000000..7658ee2 --- /dev/null +++ b/source/java/org/openoffice/da/comp/writer4latex/Writer4LaTeX.java @@ -0,0 +1,408 @@ +/************************************************************************ + * + * Writer4LaTeX.java + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * Copyright: 2002-2009 by Henrik Just + * + * All Rights Reserved. + * + * Version 1.2 (2009-03-30) + * + */ + +package org.openoffice.da.comp.writer4latex; + +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; + +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.XPropertyAccess; +import com.sun.star.frame.XController; +import com.sun.star.frame.XFrame; +import com.sun.star.frame.XModel; +import com.sun.star.frame.XStorable; +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.UnoRuntime; +import com.sun.star.uno.XComponentContext; + +import org.openoffice.da.comp.w2lcommon.helper.MessageBox; +import org.openoffice.da.comp.w2lcommon.helper.PropertyHelper; + +/** This class implements the ui (dispatch) commands provided by Writer4LaTeX. + * The actual processing is done by the three core classes TeXify, + * LaTeXImporter and BibTeXImporter + */ +public final class Writer4LaTeX extends WeakBase + implements com.sun.star.lang.XServiceInfo, + com.sun.star.frame.XDispatchProvider, + com.sun.star.lang.XInitialization, + com.sun.star.frame.XDispatch { + + private static final String PROTOCOL = "org.openoffice.da.writer4latex:"; + + // From constructor+initialization + private final XComponentContext m_xContext; + private XFrame m_xFrame; + private XModel xModel = null; + + // Global data + private TeXify texify = null; + private PropertyValue[] mediaProps = null; + private String sBasePath = null; + private String sBaseFileName = null; + + public static final String __implementationName = Writer4LaTeX.class.getName(); + public static final String __serviceName = "com.sun.star.frame.ProtocolHandler"; + private static final String[] m_serviceNames = { __serviceName }; + + public Writer4LaTeX( XComponentContext xContext ) { + m_xContext = xContext; + } + + // com.sun.star.lang.XInitialization: + public void initialize( Object[] object ) + throws com.sun.star.uno.Exception { + if ( object.length > 0 ) { + // The first item is the current frame + m_xFrame = (com.sun.star.frame.XFrame) UnoRuntime.queryInterface( + com.sun.star.frame.XFrame.class, object[0]); + // Get the model for the document from the frame + XController xController = m_xFrame.getController(); + if (xController!=null) { + xModel = xController.getModel(); + } + } + } + + // com.sun.star.lang.XServiceInfo: + public String getImplementationName() { + return __implementationName; + } + + public boolean supportsService( String sService ) { + int len = m_serviceNames.length; + + for( int i=0; i < len; i++) { + if (sService.equals(m_serviceNames[i])) + return true; + } + return false; + } + + public String[] getSupportedServiceNames() { + return m_serviceNames; + } + + + // com.sun.star.frame.XDispatchProvider: + public com.sun.star.frame.XDispatch queryDispatch( com.sun.star.util.URL aURL, + String sTargetFrameName, int iSearchFlags ) { + if ( aURL.Protocol.compareTo(PROTOCOL) == 0 ) { + if ( aURL.Path.compareTo("ProcessDocument") == 0 ) + return this; + else if ( aURL.Path.compareTo("ProcessDirectly") == 0 ) + return this; + else if ( aURL.Path.compareTo("ViewLog") == 0 ) + return this; + else if ( aURL.Path.compareTo("UseBibTeX") == 0 ) + return this; + else if ( aURL.Path.compareTo("ImportBibTeX") == 0 ) + return this; + else if ( aURL.Path.compareTo("ImportLaTeX") == 0 ) + return this; + } + return null; + } + + public com.sun.star.frame.XDispatch[] queryDispatches( + com.sun.star.frame.DispatchDescriptor[] seqDescriptors ) { + int nCount = seqDescriptors.length; + com.sun.star.frame.XDispatch[] seqDispatcher = + new com.sun.star.frame.XDispatch[seqDescriptors.length]; + + for( int i=0; i < nCount; ++i ) { + seqDispatcher[i] = queryDispatch(seqDescriptors[i].FeatureURL, + seqDescriptors[i].FrameName, + seqDescriptors[i].SearchFlags ); + } + return seqDispatcher; + } + + + // com.sun.star.frame.XDispatch: + public void dispatch( com.sun.star.util.URL aURL, + com.sun.star.beans.PropertyValue[] aArguments ) { + if ( aURL.Protocol.compareTo(PROTOCOL) == 0 ) { + if ( aURL.Path.compareTo("ProcessDocument") == 0 ) { + if (updateLocation()) { + if (updateMediaProperties()) { + process(); + } + } + else { + warnNotSaved(); + } + return; + } + else if ( aURL.Path.compareTo("ProcessDirectly") == 0 ) { + if (updateLocation()) { + if (mediaProps!=null || updateMediaProperties()) { + process(); + } + } + else { + warnNotSaved(); + } + return; + } + else if ( aURL.Path.compareTo("ViewLog") == 0 ) { + viewLog(); + return; + } + else if ( aURL.Path.compareTo("UseBibTeX") == 0 ) { + org.openoffice.da.comp.w2lcommon.helper.MessageBox msgBox = new org.openoffice.da.comp.w2lcommon.helper.MessageBox(m_xContext); + msgBox.showMessage("Writer4LaTeX", "This feature has not been implemented yet"); + return; + } + else if ( aURL.Path.compareTo("ImportBibTeX") == 0 ) { + org.openoffice.da.comp.w2lcommon.helper.MessageBox msgBox = new org.openoffice.da.comp.w2lcommon.helper.MessageBox(m_xContext); + msgBox.showMessage("Writer4LaTeX", "This feature has not been implemented yet"); + return; + } + else if ( aURL.Path.compareTo("ImportLaTeX") == 0 ) { + org.openoffice.da.comp.w2lcommon.helper.MessageBox msgBox = new org.openoffice.da.comp.w2lcommon.helper.MessageBox(m_xContext); + msgBox.showMessage("Writer4LaTeX", "This feature has not been implemented yet"); + return; + } + } + } + + public void addStatusListener( com.sun.star.frame.XStatusListener xControl, + com.sun.star.util.URL aURL ) { + } + + public void removeStatusListener( com.sun.star.frame.XStatusListener xControl, + com.sun.star.util.URL aURL ) { + } + + // The actual commands... + + private void process() { + // Create a (somewhat coarse grained) status indicator/progress bar + XStatusIndicatorFactory xFactory = (com.sun.star.task.XStatusIndicatorFactory) + UnoRuntime.queryInterface(com.sun.star.task.XStatusIndicatorFactory.class, m_xFrame); + XStatusIndicator xStatus = xFactory.createStatusIndicator(); + xStatus.start("Writer4LaTeX",10); + xStatus.setValue(1); // At least we have started, that's 10% :-) + + try { + // Convert to LaTeX + String sTargetUrl = sBasePath+sBaseFileName+".tex"; + XStorable xStorable = (XStorable) UnoRuntime.queryInterface(XStorable.class, xModel); + xStorable.storeToURL(sTargetUrl, mediaProps); + } + catch (com.sun.star.io.IOException e) { + xStatus.end(); + MessageBox msgBox = new MessageBox(m_xContext, m_xFrame); + msgBox.showMessage("Writer4LaTeX Error","Failed to export document to LaTeX"); + return; + } + + xStatus.setValue(6); // Export is finished, that's more than half :-) + + // Get the backend from the media properties + String sBackend = "generic"; + Object filterData = (new PropertyHelper(mediaProps)).get("FilterData"); + if (filterData instanceof PropertyValue[]) { + Object backend = (new PropertyHelper((PropertyValue[])filterData)).get("backend"); + if (backend instanceof String) { + sBackend = (String) backend; + } + } + + if (texify==null) { texify = new TeXify(m_xContext); } + File file = new File(urlToFile(sBasePath),sBaseFileName); + + try { + if (sBackend=="pdftex") { + texify.process(file, TeXify.PDFTEX, true); + } + else if (sBackend=="dvips") { + texify.process(file, TeXify.DVIPS, true); + } + else if (sBackend=="generic") { + texify.process(file, TeXify.GENERIC, true); + } + } + catch (IOException e) { + MessageBox msgBox = new MessageBox(m_xContext, m_xFrame); + msgBox.showMessage("Writer4LaTeX Error",e.getMessage()); + } + + xStatus.setValue(10); // The user will not really see this... + xStatus.end(); + } + + private void viewLog() { + if (updateLocation()) { + // Execute the log viewer dialog + try { + Object[] args = new Object[1]; + args[0] = sBasePath+sBaseFileName; + Object dialog = m_xContext.getServiceManager() + .createInstanceWithArgumentsAndContext( + "org.openoffice.da.writer4latex.LogViewerDialog", args, m_xContext); + XExecutableDialog xDialog = (XExecutableDialog) + UnoRuntime.queryInterface(XExecutableDialog.class, dialog); + if (xDialog.execute()==ExecutableDialogResults.OK) { + // Closed with the close button + } + } + catch (com.sun.star.uno.Exception e) { + } + } + else { + warnNotSaved(); + } + + } + + // Some utility methods + + private boolean updateMediaProperties() { + // Create inital media properties + mediaProps = new PropertyValue[2]; + mediaProps[0] = new PropertyValue(); + mediaProps[0].Name = "FilterName"; + mediaProps[0].Value = "org.openoffice.da.writer2latex"; + mediaProps[1] = new PropertyValue(); + mediaProps[1].Name = "Overwrite"; + mediaProps[1].Value = "true"; + + try { + // Display options dialog + Object dialog = m_xContext.getServiceManager() + .createInstanceWithContext("org.openoffice.da.writer2latex.LaTeXOptionsDialog", m_xContext); + + XPropertyAccess xPropertyAccess = (XPropertyAccess) + UnoRuntime.queryInterface(XPropertyAccess.class, dialog); + xPropertyAccess.setPropertyValues(mediaProps); + + XExecutableDialog xDialog = (XExecutableDialog) + UnoRuntime.queryInterface(XExecutableDialog.class, dialog); + if (xDialog.execute()==ExecutableDialogResults.OK) { + mediaProps = xPropertyAccess.getPropertyValues(); + return true; + } + else { + mediaProps = null; + return false; + } + } + catch (com.sun.star.beans.UnknownPropertyException e) { + // setPropertyValues will not fail.. + mediaProps = null; + return false; + } + catch (com.sun.star.uno.Exception e) { + // getServiceManager will not fail.. + mediaProps = null; + return false; + } + } + + private boolean updateLocation() { + String sDocumentUrl = xModel.getURL(); + if (sDocumentUrl.length()!=0) { + // Get the file name (without extension) + File f = urlToFile(sDocumentUrl); + sBaseFileName = f.getName(); + int iDot = sBaseFileName.lastIndexOf("."); + if (iDot>-1) { // remove extension + sBaseFileName = sBaseFileName.substring(0,iDot); + } + sBaseFileName=makeTeXSafe(sBaseFileName); + + // Get the path + int iSlash = sDocumentUrl.lastIndexOf("/"); + if (iSlash>-1) { + sBasePath = sDocumentUrl.substring(0,iSlash+1); + } + else { + sBasePath = ""; + } + + return true; + } + else { + return false; + } + } + + private void warnNotSaved() { + MessageBox msgBox = new MessageBox(m_xContext, m_xFrame); + msgBox.showMessage("Document not saved!","Please save the document before processing the file"); + } + + private String makeTeXSafe(String sArgument) { + String sResult = ""; + for (int i=0; i='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9') || c=='-' || c=='.') { + sResult += Character.toString(c); + } + // TODO: Create replacement table for other latin characters.. + else if (c==' ') { sResult += "-"; } + else if (c=='\u00c6') { sResult += "AE"; } + else if (c=='\u00d8') { sResult += "OE"; } + else if (c=='\u00c5') { sResult += "AA"; } + else if (c=='\u00e6') { sResult += "ae"; } + else if (c=='\u00f8') { sResult += "oe"; } + else if (c=='\u00e5') { sResult += "aa"; } + } + if (sResult.length()==0) { return "writer4latex"; } + else { return sResult; } + } + + private File urlToFile(String sUrl) { + try { + return new File(new URI(sUrl)); + } + catch (URISyntaxException e) { + return new File("."); + } + } + + /*private String urlToPath(String sUrl) { + try { + return (new File(new URI(sUrl))).getCanonicalPath(); + } + catch (URISyntaxException e) { + return "."; + } + catch (IOException e) { + return "."; + } + }*/ + +} \ No newline at end of file diff --git a/source/java/writer2latex/Application.java b/source/java/writer2latex/Application.java index 2e8f213..e1185e9 100644 --- a/source/java/writer2latex/Application.java +++ b/source/java/writer2latex/Application.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-2009 by Henrik Just * * All Rights Reserved. * - * Version 1.0 (2008-11-22) + * Version 1.2 (2009-03-26) * */ @@ -68,9 +68,9 @@ public final class Application { /* Based on command-line parameters. */ private String sTargetMIME = MIMETypes.LATEX; private boolean bRecurse = false; - private Vector configFileNames = new Vector(); + private Vector configFileNames = new Vector(); private String sTemplateFileName = null; - private Hashtable options = new Hashtable(); + private Hashtable options = new Hashtable(); private String sSource = null; private String sTarget = null; @@ -208,9 +208,9 @@ public final class Application { } // Step 7: Set options from command line - Enumeration keys = options.keys(); + Enumeration keys = options.keys(); while (keys.hasMoreElements()) { - String sKey = (String) keys.nextElement(); + String sKey = keys.nextElement(); String sValue = (String) options.get(sKey); converter.getConfig().setOption(sKey,sValue); if (batchCv!=null) { diff --git a/source/java/writer2latex/api/ConverterFactory.java b/source/java/writer2latex/api/ConverterFactory.java index 877cd4c..7369869 100644 --- a/source/java/writer2latex/api/ConverterFactory.java +++ b/source/java/writer2latex/api/ConverterFactory.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.0 (2009-03-25) + * Version 1.2 (2009-03-30) * */ @@ -32,8 +32,8 @@ package writer2latex.api; public class ConverterFactory { // Version information - private static final String VERSION = "1.0 beta"; - private static final String DATE = "2008-03-25"; + private static final String VERSION = "1.1.1"; + private static final String DATE = "2008-03-30"; /** Return version information * @return the Writer2LaTeX version in the form diff --git a/source/java/writer2latex/api/ConverterResult.java b/source/java/writer2latex/api/ConverterResult.java index eba2e97..69528c5 100644 --- a/source/java/writer2latex/api/ConverterResult.java +++ b/source/java/writer2latex/api/ConverterResult.java @@ -44,7 +44,7 @@ public interface ConverterResult { * ConverterResult. This includes the master document. * @return an Iterator of all files */ - public Iterator iterator(); + public Iterator iterator(); /** Write all files of the ConverterResult to a directory. * Subdirectories are created as required by the individual diff --git a/source/java/writer2latex/bibtex/BibTeXDocument.java b/source/java/writer2latex/bibtex/BibTeXDocument.java index b2f061e..6625ad8 100644 --- a/source/java/writer2latex/bibtex/BibTeXDocument.java +++ b/source/java/writer2latex/bibtex/BibTeXDocument.java @@ -51,7 +51,7 @@ public class BibTeXDocument implements Document { private static final String FILE_EXTENSION = ".bib"; private String sName; - private Hashtable entries = new Hashtable(); + private Hashtable entries = new Hashtable(); private ExportNameCollection exportNames = new ExportNameCollection(true); private I18n i18n; @@ -122,9 +122,9 @@ public class BibTeXDocument implements Document { osw.write("%% This file was converted to BibTeX by Writer2BibTeX ver. "+ConverterFactory.getVersion()+".\n"); osw.write("%% See http://writer2latex.sourceforge.net for more info.\n"); osw.write("\n"); - Enumeration enumeration = entries.elements(); + Enumeration enumeration = entries.elements(); while (enumeration.hasMoreElements()) { - BibMark entry = (BibMark) enumeration.nextElement(); + BibMark entry = enumeration.nextElement(); osw.write("@"); osw.write(entry.getEntryType().toUpperCase()); osw.write("{"); diff --git a/source/java/writer2latex/latex/CharStyleConverter.java b/source/java/writer2latex/latex/CharStyleConverter.java index f3f1305..8607a0a 100644 --- a/source/java/writer2latex/latex/CharStyleConverter.java +++ b/source/java/writer2latex/latex/CharStyleConverter.java @@ -43,7 +43,7 @@ import writer2latex.latex.util.StyleMap; public class CharStyleConverter extends StyleConverter { // Cache of converted font declarations - private Hashtable fontDecls = new Hashtable(); + private Hashtable fontDecls = new Hashtable(); // Which formatting should we export? private boolean bIgnoreHardFontsize; @@ -434,7 +434,7 @@ public class CharStyleConverter extends StyleConverter { String sFontFamilyGeneric = fd.getFontFamilyGeneric(); fontDecls.put(sName,nfssFamily(sFontFamily,sFontFamilyGeneric,sFontPitch)); } - return (String) fontDecls.get(sName); + return fontDecls.get(sName); } // The remaining methods are static helpers to convert single style properties diff --git a/source/java/writer2latex/latex/ConverterPalette.java b/source/java/writer2latex/latex/ConverterPalette.java index 8522f9f..4c2c52d 100644 --- a/source/java/writer2latex/latex/ConverterPalette.java +++ b/source/java/writer2latex/latex/ConverterPalette.java @@ -226,10 +226,10 @@ public final class ConverterPalette extends ConverterBase { mathmlCv.appendDeclarations(packages,declarations); // Add custom preamble - LinkedList customPreamble = config.getCustomPreamble(); + LinkedList customPreamble = config.getCustomPreamble(); int nCPLen = customPreamble.size(); for (int i=0; i> floatingFramesStack = new Stack>(); private Element getFrame(Element onode) { if (ofr.isOpenDocument()) return (Element) onode.getParentNode(); @@ -65,7 +65,7 @@ public class DrawConverter extends ConverterHelper { public DrawConverter(OfficeReader ofr, LaTeXConfig config, ConverterPalette palette) { super(ofr,config,palette); - floatingFramesStack.push(new LinkedList()); + floatingFramesStack.push(new LinkedList()); } public void appendDeclarations(LaTeXDocumentPortion pack, LaTeXDocumentPortion decl) { @@ -301,7 +301,7 @@ public class DrawConverter extends ConverterHelper { handleDrawImageAsChar(node,ldp,oc); } else { - ((LinkedList) floatingFramesStack.peek()).add(node); + floatingFramesStack.peek().add(node); } } @@ -429,7 +429,7 @@ public class DrawConverter extends ConverterHelper { makeDrawTextBox(node, ldp, oc); } else { - ((LinkedList) floatingFramesStack.peek()).add(node); + floatingFramesStack.peek().add(node); } } @@ -461,7 +461,7 @@ public class DrawConverter extends ConverterHelper { if (!bIsCaption) { ldp.append("\\begin{minipage}{").append(sWidth).append("}").nl(); } - floatingFramesStack.push(new LinkedList()); + floatingFramesStack.push(new LinkedList()); palette.getBlockCv().traverseBlockText(node,ldp,ic); flushFloatingFrames(ldp,ic); floatingFramesStack.pop(); @@ -477,7 +477,7 @@ public class DrawConverter extends ConverterHelper { public void flushFloatingFrames(LaTeXDocumentPortion ldp, Context oc) { // todo: fix language - LinkedList floatingFrames = (LinkedList) floatingFramesStack.peek(); + LinkedList floatingFrames = floatingFramesStack.peek(); int n = floatingFrames.size(); if (n==0) { return; } for (int i=0; itext:sequence-decl element) - private Hashtable seqDecl = new Hashtable(); + private Hashtable seqDecl = new Hashtable(); // first usage of sequence (maps name->text:sequence element) - private Hashtable seqFirst = new Hashtable(); + private Hashtable seqFirst = new Hashtable(); - private Vector postponedReferenceMarks = new Vector(); - private Vector postponedBookmarks = new Vector(); + private Vector postponedReferenceMarks = new Vector(); + private Vector postponedBookmarks = new Vector(); private boolean bUseHyperref = false; private boolean bUsesPageCount = false; @@ -128,11 +128,11 @@ public class FieldConverter extends ConverterHelper { // The number format is fetched from the first occurence of the // sequence in the text, while the outline level and the separation // character are fetched from the declaration - Enumeration names = seqFirst.keys(); + Enumeration names = seqFirst.keys(); while (names.hasMoreElements()) { // Get first text:sequence element - String sName = (String) names.nextElement(); - Element first = (Element) seqFirst.get(sName); + String sName = names.nextElement(); + Element first = seqFirst.get(sName); // Collect data String sNumFormat = Misc.getAttribute(first,XMLString.STYLE_NUM_FORMAT); if (sNumFormat==null) { sNumFormat="1"; } @@ -525,13 +525,13 @@ public class FieldConverter extends ConverterHelper { // Type out all postponed reference marks int n = postponedReferenceMarks.size(); for (int i=0; i postponedIndexMarks = new Vector(); /**

Construct a new IndexConverter. * @param config the configuration to use @@ -201,7 +201,7 @@ public class IndexConverter extends ConverterHelper { // Type out all postponed index marks int n = postponedIndexMarks.size(); for (int i=0; i customPreamble = new LinkedList(); protected StyleMap par = new StyleMap(); protected StyleMap parBlock = new StyleMap(); protected StyleMap text = new StyleMap(); @@ -153,7 +153,7 @@ public class LaTeXConfig extends writer2latex.base.ConfigBase { protected StyleMap listItem = new StyleMap(); protected StyleMap textAttr = new StyleMap(); protected HeadingMap headingMap = new HeadingMap(5); - protected Hashtable mathSymbols = new Hashtable(); + protected Hashtable mathSymbols = new Hashtable(); protected ReplacementTrie stringReplace = new ReplacementTrie(); public LaTeXConfig() { @@ -365,10 +365,10 @@ public class LaTeXConfig extends writer2latex.base.ConfigBase { protected void writeInner(Document dom) { // Write math symbol map - Enumeration msEnum = mathSymbols.keys(); + Enumeration msEnum = mathSymbols.keys(); while (msEnum.hasMoreElements()) { - String sName = (String) msEnum.nextElement(); - String sLatex = (String) mathSymbols.get(sName); + String sName = msEnum.nextElement(); + String sLatex = mathSymbols.get(sName); Element msNode = dom.createElement("math-symbol-map"); msNode.setAttribute("name",sName); msNode.setAttribute("latex",sLatex); @@ -413,9 +413,9 @@ public class LaTeXConfig extends writer2latex.base.ConfigBase { } private void writeStyleMap(Document dom, StyleMap sm, String sFamily) { - Enumeration smEnum = sm.getNames(); + Enumeration smEnum = sm.getNames(); while (smEnum.hasMoreElements()) { - String sName = (String) smEnum.nextElement(); + String sName = smEnum.nextElement(); Element smNode = dom.createElement("style-map"); smNode.setAttribute("name",sName); smNode.setAttribute("family",sFamily); @@ -434,11 +434,11 @@ public class LaTeXConfig extends writer2latex.base.ConfigBase { } } - private void writeContent(Document dom, LinkedList list, String sElement) { + private void writeContent(Document dom, LinkedList list, String sElement) { Element node = dom.createElement(sElement); int nLen = list.size(); for (int i=0; i getMathSymbols() { return mathSymbols; } public StyleMap getParStyleMap() { return par; } public StyleMap getParBlockStyleMap() { return parBlock; } @@ -537,7 +537,7 @@ public class LaTeXConfig extends writer2latex.base.ConfigBase { public StyleMap getListItemStyleMap() { return listItem; } public StyleMap getTextAttributeStyleMap() { return textAttr; } public HeadingMap getHeadingMap() { return headingMap; } - public LinkedList getCustomPreamble() { return customPreamble; } + public LinkedList getCustomPreamble() { return customPreamble; } } diff --git a/source/java/writer2latex/latex/LaTeXDocumentPortion.java b/source/java/writer2latex/latex/LaTeXDocumentPortion.java index 32d7ed0..5f4ec33 100644 --- a/source/java/writer2latex/latex/LaTeXDocumentPortion.java +++ b/source/java/writer2latex/latex/LaTeXDocumentPortion.java @@ -36,7 +36,7 @@ import writer2latex.util.Misc; number of lines, and may include subportions. */ public class LaTeXDocumentPortion { - private Vector nodes; // The collection of all nodes in this portion + private Vector nodes; // The collection of all nodes in this portion private StringBuffer curText; // The currently active node (always the last node) private boolean bEmpty; // Is the active node empty? @@ -45,7 +45,7 @@ public class LaTeXDocumentPortion { public LaTeXDocumentPortion(boolean bWrap){ this.bWrap = bWrap; - nodes = new Vector(); + nodes = new Vector(); curText = new StringBuffer(); bEmpty = true; } diff --git a/source/java/writer2latex/latex/ListStyleConverter.java b/source/java/writer2latex/latex/ListStyleConverter.java index c6dab0c..5c19c47 100644 --- a/source/java/writer2latex/latex/ListStyleConverter.java +++ b/source/java/writer2latex/latex/ListStyleConverter.java @@ -37,7 +37,7 @@ import writer2latex.latex.util.Context; */ public class ListStyleConverter extends StyleConverter { boolean bNeedSaveEnumCounter = false; - private Hashtable listStyleLevelNames = new Hashtable(); + private Hashtable listStyleLevelNames = new Hashtable(); /**

Constructs a new ListStyleConverter.

*/ @@ -99,7 +99,7 @@ public class ListStyleConverter extends StyleConverter { ba.add("\\liststyle"+styleNames.getExportName(getDisplayName(sStyleName))+"\n",""); } if (nLevel<=4) { - String sCounterName = ((String[]) listStyleLevelNames.get(sStyleName))[nLevel]; + String sCounterName = listStyleLevelNames.get(sStyleName)[nLevel]; if (bContinue && style.isNumber(nLevel)) { bNeedSaveEnumCounter = true; ba.add("\\setcounter{saveenum}{\\value{"+sCounterName+"}}\n",""); diff --git a/source/java/writer2latex/latex/NoteConverter.java b/source/java/writer2latex/latex/NoteConverter.java index eb618a5..c5260d6 100644 --- a/source/java/writer2latex/latex/NoteConverter.java +++ b/source/java/writer2latex/latex/NoteConverter.java @@ -53,7 +53,7 @@ public class NoteConverter extends ConverterHelper { private boolean bContainsEndnotes = false; private boolean bContainsFootnotes = false; // Keep track of footnotes (inside minipage etc.), that should be typeset later - private LinkedList postponedFootnotes = new LinkedList(); + private LinkedList postponedFootnotes = new LinkedList(); public NoteConverter(OfficeReader ofr, LaTeXConfig config, ConverterPalette palette) { super(ofr,config,palette); @@ -115,7 +115,7 @@ public class NoteConverter extends ConverterHelper { int n = postponedFootnotes.size(); if (n==1) { ldp.append("\\footnotetext{"); - traverseNoteBody((Element) postponedFootnotes.get(0),ldp,ic); + traverseNoteBody(postponedFootnotes.get(0),ldp,ic); ldp.append("}").nl(); postponedFootnotes.clear(); } @@ -124,7 +124,7 @@ public class NoteConverter extends ConverterHelper { ldp.append("\\addtocounter{footnote}{-"+n+"}").nl(); for (int i=0; i styles = ofr.getMasterPages().getStylesEnumeration(); ldp.append("% Pages styles").nl(); if (!config.useFancyhdr()) { ldp.append("\\makeatletter").nl(); @@ -385,7 +385,7 @@ public class PageStyleConverter extends StyleConverter { boolean bIncludeHead = false; boolean bIncludeFoot = false; // Look through all applied page layouts and use largest heights - Enumeration masters = ofr.getMasterPages().getStylesEnumeration(); + Enumeration masters = ofr.getMasterPages().getStylesEnumeration(); while (masters.hasMoreElements()) { MasterPage master = (MasterPage) masters.nextElement(); if (styleNames.containsName(getDisplayName(master.getName()))) { diff --git a/source/java/writer2latex/latex/StarMathConverter.java b/source/java/writer2latex/latex/StarMathConverter.java index 2eb6a50..3784e93 100644 --- a/source/java/writer2latex/latex/StarMathConverter.java +++ b/source/java/writer2latex/latex/StarMathConverter.java @@ -698,7 +698,7 @@ public final class StarMathConverter implements writer2latex.api.StarMathConvert private SmTokenTable keywords=new SmTokenTable(SmTokenTable.keywords); private SmTokenTable symbols=new SmTokenTable(SmTokenTable.symbols); private LaTeXConfig config; - private Hashtable configSymbols; + private Hashtable configSymbols; private boolean bUseColor; private SmToken curToken=new SmToken(); // contains the data of the current token private SimpleInputBuffer buffer; // contains the starmath formula @@ -860,7 +860,7 @@ public final class StarMathConverter implements writer2latex.api.StarMathConvert buffer.getChar(); String sIdent=buffer.getIdentifier(); if (configSymbols.containsKey(sIdent)) { // symbol defined in configuration - curToken.assign(Token.SPECIAL, (String) configSymbols.get(sIdent), 5); + curToken.assign(Token.SPECIAL, configSymbols.get(sIdent), 5); } else if (!symbols.lookup(sIdent,false,curToken)) curToken.assign(Token.IDENT, i18n.convert(sIdent,true,"en"), 5); diff --git a/source/java/writer2latex/latex/i18n/ClassicI18n.java b/source/java/writer2latex/latex/i18n/ClassicI18n.java index cc4a2a8..8cd2f9d 100644 --- a/source/java/writer2latex/latex/i18n/ClassicI18n.java +++ b/source/java/writer2latex/latex/i18n/ClassicI18n.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.0 (2009-02-16) + * Version 1.2 (2009-03-26) * */ @@ -185,12 +185,12 @@ public class ClassicI18n extends I18n { // End of static part of I18n! // **** Global variables **** - private Hashtable babelLanguages; // mappings iso->babel language + private Hashtable babelLanguages; // mappings iso->babel language // Unicode translation - private Hashtable tableSet; // all tables + private Hashtable tableSet; // all tables private UnicodeTable table; // currently active table (top of stack) - private Stack tableStack; // stack of active tables + private Stack tableStack; // stack of active tables private UnicodeStringParser ucparser; // Unicode string parser // Collected data @@ -231,7 +231,7 @@ public class ClassicI18n extends I18n { if (config.useEurosym()) sSymbols+="|eurosym"; if (config.useTipa()) sSymbols+="|tipa"; - tableSet = new Hashtable(); + tableSet = new Hashtable(); UnicodeTableHandler handler=new UnicodeTableHandler(tableSet, sSymbols); SAXParserFactory factory=SAXParserFactory.newInstance(); InputStream is = this.getClass().getResourceAsStream("symbols.xml"); @@ -244,9 +244,9 @@ public class ClassicI18n extends I18n { t.printStackTrace(); } // put root table at top of stack - tableStack = new Stack(); - tableStack.push((UnicodeTable) tableSet.get("root")); - table = (UnicodeTable) tableSet.get("root"); + tableStack = new Stack(); + tableStack.push(tableSet.get("root")); + table = tableSet.get("root"); } /** Construct a new I18n for general use @@ -386,8 +386,8 @@ public class ClassicI18n extends I18n { // If no name is specified we should keep the current table // Otherwise try to find the table, and use root if it's not available if (sName!=null) { - table = (UnicodeTable) tableSet.get(sName); - if (table==null) { table = (UnicodeTable) tableSet.get("root"); } + table = tableSet.get(sName); + if (table==null) { table = tableSet.get("root"); } } tableStack.push(table); } @@ -396,7 +396,7 @@ public class ClassicI18n extends I18n { */ public void popSpecialTable() { tableStack.pop(); - table = (UnicodeTable) tableStack.peek(); + table = tableStack.peek(); } /** Get the number of characters defined in the current table @@ -632,7 +632,7 @@ public class ClassicI18n extends I18n { // todo: support automatic choice of inputenc (see comments)? private String getBabelLanguage(String sLang) { if (babelLanguages.containsKey(sLang)) { - return (String) babelLanguages.get(sLang); + return babelLanguages.get(sLang); } else { return "english"; // interpret unknown languages as English @@ -640,7 +640,7 @@ public class ClassicI18n extends I18n { } private void prepareBabelLanguages() { - babelLanguages = new Hashtable(); + babelLanguages = new Hashtable(); babelLanguages.put("en", "english"); // latin1 babelLanguages.put("bg", "bulgarian"); // cp1251? babelLanguages.put("cs", "czech"); // latin2 diff --git a/source/java/writer2latex/latex/i18n/I18n.java b/source/java/writer2latex/latex/i18n/I18n.java index ac514ac..68fb2ab 100644 --- a/source/java/writer2latex/latex/i18n/I18n.java +++ b/source/java/writer2latex/latex/i18n/I18n.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.0 (2009-02-16) + * Version 1.2 (2009-03-26) * */ @@ -49,7 +49,7 @@ public abstract class I18n { // Collected data protected String sDefaultLanguage; // The default iso language to use - protected HashSet languages = new HashSet(); // All languages used + protected HashSet languages = new HashSet(); // All languages used // **** Constructors **** diff --git a/source/java/writer2latex/latex/i18n/UnicodeTableHandler.java b/source/java/writer2latex/latex/i18n/UnicodeTableHandler.java index 6a4a940..0f7af58 100644 --- a/source/java/writer2latex/latex/i18n/UnicodeTableHandler.java +++ b/source/java/writer2latex/latex/i18n/UnicodeTableHandler.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.0 (2009-02-17) + * Version 1.2 (2009-03-26) * */ @@ -31,9 +31,10 @@ import java.util.Hashtable; import org.xml.sax.Attributes; import org.xml.sax.helpers.DefaultHandler; -// Helper classs: SAX handler to parse symbols.xml from jar -class UnicodeTableHandler extends DefaultHandler{ - private Hashtable tableSet; // collection of all tables +/** Helper classs: SAX handler to parse symbols.xml from jar + */ +public class UnicodeTableHandler extends DefaultHandler{ + private Hashtable tableSet; // collection of all tables private UnicodeTable table; // the current table private String sSymbolSets; private boolean bGlobalReadThisSet; @@ -42,7 +43,12 @@ class UnicodeTableHandler extends DefaultHandler{ private int nFontencs = 0; // The currently active fontencodings private boolean b8bit = false; - UnicodeTableHandler(Hashtable tableSet, String sSymbolSets){ + /** Create a new UnicodeTableHandler + * + * @param tableSet the Hashtable to fill with tables read from the file + * @param sSymbolSets string containing table names to read (separated by |) + */ + public UnicodeTableHandler(Hashtable tableSet, String sSymbolSets){ this.sSymbolSets = sSymbolSets; this.tableSet = tableSet; } @@ -63,7 +69,7 @@ class UnicodeTableHandler extends DefaultHandler{ } else if (qName.equals("special-symbol-set")) { // start a new special symbol set; this requires a new table - table = new UnicodeTable((UnicodeTable) tableSet.get("root")); + table = new UnicodeTable(tableSet.get("root")); tableSet.put(attributes.getValue("name"),table); // Read it if it requires nothing, or something we read diff --git a/source/java/writer2latex/latex/i18n/XeTeXI18n.java b/source/java/writer2latex/latex/i18n/XeTeXI18n.java index 6e9679a..cb95f73 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.0 (2009-02-17) + * Version 1.2 (2009-03-26) * */ diff --git a/source/java/writer2latex/latex/util/StyleMap.java b/source/java/writer2latex/latex/util/StyleMap.java index d4469ef..eae5aac 100644 --- a/source/java/writer2latex/latex/util/StyleMap.java +++ b/source/java/writer2latex/latex/util/StyleMap.java @@ -30,7 +30,7 @@ import java.util.Hashtable; import java.util.Enumeration; public class StyleMap { - private Hashtable items = new Hashtable(); + private Hashtable items = new Hashtable(); public void put(String sName, String sBefore, String sAfter, boolean bLineBreak, boolean bVerbatim) { StyleMapItem item = new StyleMapItem(); @@ -67,32 +67,32 @@ public class StyleMap { } public String getBefore(String sName) { - return ((StyleMapItem) items.get(sName)).sBefore; + return items.get(sName).sBefore; } public String getAfter(String sName) { - return ((StyleMapItem) items.get(sName)).sAfter; + return items.get(sName).sAfter; } public String getNext(String sName) { - String sNext = ((StyleMapItem) items.get(sName)).sNext; + String sNext = items.get(sName).sNext; return sNext.substring(1,sNext.length()-1); } public boolean isNext(String sName, String sNext) { - String sNext1 = ((StyleMapItem) items.get(sName)).sNext; + String sNext1 = items.get(sName).sNext; return sNext1.indexOf(";"+sNext+";")>-1; } public boolean getLineBreak(String sName) { - return contains(sName) && ((StyleMapItem) items.get(sName)).bLineBreak; + return contains(sName) && items.get(sName).bLineBreak; } public boolean getVerbatim(String sName) { - return contains(sName) && ((StyleMapItem) items.get(sName)).bVerbatim; + return contains(sName) && items.get(sName).bVerbatim; } - public Enumeration getNames() { + public Enumeration getNames() { return items.keys(); } diff --git a/source/java/writer2latex/office/ControlReader.java b/source/java/writer2latex/office/ControlReader.java index a7f0f8a..c150696 100644 --- a/source/java/writer2latex/office/ControlReader.java +++ b/source/java/writer2latex/office/ControlReader.java @@ -42,7 +42,7 @@ public class ControlReader { private String sId; // a control is identified by id private Element control; // the control element private Element controlType; // the type specific child element - private Vector items = new Vector(); // the options/items of a list/combobox + private Vector items = new Vector(); // the options/items of a list/combobox /**

The constructor reads the content of a control element

* The representation in OpenDocument differs slightly from OOo 1.x. diff --git a/source/java/writer2latex/office/FormsReader.java b/source/java/writer2latex/office/FormsReader.java index 978f5cb..0052d20 100644 --- a/source/java/writer2latex/office/FormsReader.java +++ b/source/java/writer2latex/office/FormsReader.java @@ -45,8 +45,8 @@ import org.w3c.dom.Node; public class FormsReader { private Element formsElement; // The office:forms element - private Hashtable forms = new Hashtable(); // all forms, indexed by name - private Hashtable controls = new Hashtable(); // all controls, indexed by id + private Hashtable forms = new Hashtable(); // all forms, indexed by name + private Hashtable controls = new Hashtable(); // all controls, indexed by id /**

Read the content of an office:forms element

* @param formsElement a DOM element, which must be office:forms node @@ -77,7 +77,7 @@ public class FormsReader { /**

Get a Iterator over all forms.

* @return a Iterator over all forms */ - public Iterator getFormsIterator() { + public Iterator getFormsIterator() { return forms.values().iterator(); } @@ -86,13 +86,13 @@ public class FormsReader { * @return the form as a FormReader object */ public FormReader getForm(String sName) { - return (FormReader) forms.get(sName); + return forms.get(sName); } /**

Get a Iterator over all controls.

* @return a Iterator over all controls */ - public Iterator getControlsIterator() { + public Iterator getControlsIterator() { return controls.values().iterator(); } @@ -101,7 +101,7 @@ public class FormsReader { * @return the control as a ControlReader object */ public ControlReader getControl(String sId) { - return (ControlReader) controls.get(sId); + return controls.get(sId); } /**

Add a control

diff --git a/source/java/writer2latex/office/ImageLoader.java b/source/java/writer2latex/office/ImageLoader.java index 68c6f42..22b189c 100644 --- a/source/java/writer2latex/office/ImageLoader.java +++ b/source/java/writer2latex/office/ImageLoader.java @@ -65,7 +65,7 @@ public final class ImageLoader { private boolean bAcceptOtherFormats = true; private String sDefaultFormat = null; private String sDefaultVectorFormat = null; - private HashSet acceptedFormats = new HashSet(); + private HashSet acceptedFormats = new HashSet(); public ImageLoader(OfficeDocument oooDoc, String sOutFileName, boolean bExtractEPS) { this.oooDoc = oooDoc; diff --git a/source/java/writer2latex/office/OfficeReader.java b/source/java/writer2latex/office/OfficeReader.java index 1b64924..9e48bde 100644 --- a/source/java/writer2latex/office/OfficeReader.java +++ b/source/java/writer2latex/office/OfficeReader.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.0 (2008-09-22) + * Version 1.2 (2008-09-30) * */ @@ -115,16 +115,10 @@ public class OfficeReader { Node child = node.getFirstChild(); while (child!=null) { if (child.getNodeType()==Node.ELEMENT_NODE) { - if (child.getNodeName().equals(XMLString.TEXT_SPAN)) { + if (isTextElement(child)) { if (!isWhitespaceContent(child)) { return false; } } - else if (child.getNodeName().equals(XMLString.TEXT_A)) { - if (!isWhitespaceContent(child)) { return false; } - } - else if (child.getNodeName().equals(XMLString.TEXT_BIBLIOGRAPHY_MARK)) { - if (!isWhitespaceContent(child)) { return false; } - } - else if (!isTextElement(child)) { + else { return false; // found non-text content! } } @@ -282,32 +276,32 @@ public class OfficeReader { //private String sFirstMasterPageName = null; // All indexes - private Hashtable indexes = new Hashtable(); - private HashSet indexSourceStyles = new HashSet(); - private HashSet figureSequenceNames = new HashSet(); - private HashSet tableSequenceNames = new HashSet(); + private Hashtable indexes = new Hashtable(); + private HashSet indexSourceStyles = new HashSet(); + private HashSet figureSequenceNames = new HashSet(); + private HashSet tableSequenceNames = new HashSet(); private String sAutoFigureSequenceName = null; private String sAutoTableSequenceName = null; // Map paragraphs to sequence names (caption helper) - private Hashtable sequenceNames = new Hashtable(); + private Hashtable sequenceNames = new Hashtable(); // Map sequence reference names to sequence names - private Hashtable seqrefNames = new Hashtable(); + private Hashtable seqrefNames = new Hashtable(); // All references - private HashSet footnoteRef = new HashSet(); - private HashSet endnoteRef = new HashSet(); - private HashSet referenceRef = new HashSet(); - private HashSet bookmarkRef = new HashSet(); - private HashSet sequenceRef = new HashSet(); + private HashSet footnoteRef = new HashSet(); + private HashSet endnoteRef = new HashSet(); + private HashSet referenceRef = new HashSet(); + private HashSet bookmarkRef = new HashSet(); + private HashSet sequenceRef = new HashSet(); // Reference marks and bookmarks contained in headings - private HashSet referenceHeading = new HashSet(); - private HashSet bookmarkHeading = new HashSet(); + private HashSet referenceHeading = new HashSet(); + private HashSet bookmarkHeading = new HashSet(); // All internal hyperlinks - private HashSet links = new HashSet(); + private HashSet links = new HashSet(); // Forms private FormsReader forms = new FormsReader(); @@ -468,7 +462,7 @@ public class OfficeReader { * @return the iso language */ public String getMajorityLanguage() { - Hashtable langs = new Hashtable(); + Hashtable langs = new Hashtable(); // Read the default language from the default paragraph style String sDefaultLang = null; @@ -478,7 +472,7 @@ public class OfficeReader { } // Collect languages from paragraph styles - Enumeration enumeration = getParStyles().getStylesEnumeration(); + Enumeration enumeration = getParStyles().getStylesEnumeration(); while (enumeration.hasMoreElements()) { style = (StyleWithProperties) enumeration.nextElement(); String sLang = style.getProperty(XMLString.FO_LANGUAGE); @@ -486,7 +480,7 @@ public class OfficeReader { if (sLang!=null) { int nCount = 1; if (langs.containsKey(sLang)) { - nCount = ((Integer) langs.get(sLang)).intValue()+1; + nCount = langs.get(sLang).intValue()+1; } langs.put(sLang,new Integer(nCount)); } @@ -498,7 +492,7 @@ public class OfficeReader { enumeration = langs.keys(); while (enumeration.hasMoreElements()) { String sLang = (String) enumeration.nextElement(); - int nCount = ((Integer) langs.get(sLang)).intValue(); + int nCount = langs.get(sLang).intValue(); if (nCount>nMaxCount) { nMaxCount = nCount; sMajorityLanguage = sLang; @@ -571,7 +565,7 @@ public class OfficeReader { * @return the sequence name or null */ public String getSequenceName(Element par) { - return sequenceNames.containsKey(par) ? (String) sequenceNames.get(par) : null; + return sequenceNames.containsKey(par) ? sequenceNames.get(par) : null; } /**

Get the sequence name associated with a reference name

@@ -579,7 +573,7 @@ public class OfficeReader { * @return the sequence name or null */ public String getSequenceFromRef(String sRefName) { - return (String) seqrefNames.get(sRefName); + return seqrefNames.get(sRefName); } @@ -1129,14 +1123,14 @@ public class OfficeReader { } - private void collectRefName(HashSet ref, Element node) { + private void collectRefName(HashSet ref, Element node) { String sRefName = node.getAttribute(XMLString.TEXT_REF_NAME); if (sRefName!=null && sRefName.length()>0) { ref.add(sRefName); } } - private void collectMarkInHeading(HashSet marks, Element node) { + private void collectMarkInHeading(HashSet marks, Element node) { String sName = node.getAttribute(XMLString.TEXT_NAME); if (sName!=null && sName.length()>0) { Element par = getParagraph(node); diff --git a/source/java/writer2latex/office/OfficeStyleFamily.java b/source/java/writer2latex/office/OfficeStyleFamily.java index 36426e3..c9cc939 100644 --- a/source/java/writer2latex/office/OfficeStyleFamily.java +++ b/source/java/writer2latex/office/OfficeStyleFamily.java @@ -33,10 +33,10 @@ import writer2latex.util.Misc; /** Container class representing a style family in OOo */ public class OfficeStyleFamily { - private Hashtable styles = new Hashtable(); + private Hashtable styles = new Hashtable(); private Class styleClass; - private Hashtable displayNames = new Hashtable(); + private Hashtable displayNames = new Hashtable(); private OfficeStyle defaultStyle = null; @@ -80,7 +80,7 @@ public class OfficeStyleFamily { */ public OfficeStyle getStyleByDisplayName(String sDisplayName) { if (sDisplayName==null) { return null; } - else { return getStyle((String) displayNames.get(sDisplayName)); } + else { return getStyle(displayNames.get(sDisplayName)); } } /** Get the display name for the style with the specified name. @@ -101,7 +101,7 @@ public class OfficeStyleFamily { /** Get all named styles in the family (ie. excluding the default style) * @return an enumeration of all styles represented by OfficeStyle objects */ - public Enumeration getStylesEnumeration(){ + public Enumeration getStylesEnumeration(){ return styles.elements(); } diff --git a/source/java/writer2latex/office/PropertySet.java b/source/java/writer2latex/office/PropertySet.java index 0c67af0..80a612e 100644 --- a/source/java/writer2latex/office/PropertySet.java +++ b/source/java/writer2latex/office/PropertySet.java @@ -35,17 +35,17 @@ import java.util.Hashtable; is simply the set of attributes of an element).

*/ public class PropertySet { - private Hashtable properties = new Hashtable(); + private Hashtable properties = new Hashtable(); private String sName; public PropertySet() { - properties = new Hashtable(); + properties = new Hashtable(); sName=""; } public String getProperty(String sPropName) { if (sPropName!=null) { - String sValue = (String) properties.get(sPropName); + String sValue = properties.get(sPropName); if (sValue!=null && sValue.endsWith("inch")) { // Cut of inch to in return sValue.substring(0,sValue.length()-2); @@ -86,10 +86,10 @@ public class PropertySet { public String toString() { String s=""; - Enumeration keys = properties.keys(); + Enumeration keys = properties.keys(); while (keys.hasMoreElements()) { - String sKey = (String) keys.nextElement(); - String sValue = (String) properties.get(sKey); + String sKey = keys.nextElement(); + String sValue = properties.get(sKey); s += sKey+"="+sValue+" "; } return s; diff --git a/source/java/writer2latex/office/TableReader.java b/source/java/writer2latex/office/TableReader.java index 58153f1..1df4f6b 100644 --- a/source/java/writer2latex/office/TableReader.java +++ b/source/java/writer2latex/office/TableReader.java @@ -42,16 +42,16 @@ import writer2latex.util.Misc; public class TableReader { //private OfficeReader ofr; private Element tableNode; - private LinkedList cols = new LinkedList(); - private LinkedList rows = new LinkedList(); - private LinkedList cells = new LinkedList(); + private LinkedList cols = new LinkedList(); + private LinkedList rows = new LinkedList(); + private LinkedList> cells = new LinkedList>(); private int nMaxCols = 1; // real number of columns (count to last non-empty) private int nMaxRows = 1; // real number of rows (count to last non-empty) private String[] sColWidth; private String[] sRelColWidth; private String sTableWidth; private String sRelTableWidth; - private Vector printRanges; + private Vector printRanges; /** *

The constructor reads a table from a table:table or table:sub-table @@ -111,7 +111,7 @@ public class TableReader { boolean bHasRelWidth=true; // set to false if some columns does not have a relative width set int nColSum = 0; for (int nCol=0; nCol(); if (!"false".equals(tableNode.getAttribute(XMLString.TABLE_PRINT))) { TableRangeParser parser = new TableRangeParser(tableNode.getAttribute(XMLString.TABLE_PRINT_RANGES)); while (parser.hasMoreRanges()) { @@ -228,7 +228,7 @@ public class TableReader { rows.add(new TableLine(node,bHeader,bDisplay)); // Read the cells in the row - LinkedList row = new LinkedList(); + LinkedList row = new LinkedList(); if (node.hasChildNodes()) { NodeList nl = node.getChildNodes(); int nLen = nl.getLength(); @@ -344,7 +344,7 @@ public class TableReader { public Element getCell(int nRow, int nCol) { if (nRow<0 || nRow>=cells.size()) { return null; } - LinkedList row = (LinkedList) cells.get(nRow); + LinkedList row = cells.get(nRow); if (nCol<0 || nCol>=row.size()) { return null; } return (Element) row.get(nCol); } @@ -373,19 +373,19 @@ public class TableReader { public TableLine getRow(int nRow) { if (nRow<0 || nRow>=rows.size()) { return null; } - return (TableLine) rows.get(nRow); + return rows.get(nRow); } public TableLine getCol(int nCol) { if (nCol<0 || nCol>=cols.size()) { return null; } - return (TableLine) cols.get(nCol); + return cols.get(nCol); } public int getPrintRangeCount() { return printRanges.size(); } public TableRange getPrintRange(int nIndex) { if (0<=nIndex && nIndex indexSourceStyles = new Hashtable(); @@ -163,7 +163,7 @@ public class TocReader { /**

Get a set view of all index source styles

* @return a set of all index source style names */ - public Set getIndexSourceStyles() { return indexSourceStyles.keySet(); } + public Set getIndexSourceStyles() { return indexSourceStyles.keySet(); } /**

Get the level associated with a specific index source style

* @param sStyleName the style name of the index source style @@ -171,7 +171,7 @@ public class TocReader { */ public int getIndexSourceStyleLevel(String sStyleName) { if (indexSourceStyles.containsKey(sStyleName)) { - return ((Integer) indexSourceStyles.get(sStyleName)).intValue(); + return indexSourceStyles.get(sStyleName).intValue(); } else { return -1; diff --git a/source/java/writer2latex/office/XMLString.java b/source/java/writer2latex/office/XMLString.java index 6ab3167..bd68b4f 100644 --- a/source/java/writer2latex/office/XMLString.java +++ b/source/java/writer2latex/office/XMLString.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-2009 by Henrik Just * * All Rights Reserved. * - * Version 1.0 (2008-11-10) + * Version 1.2 (2009-03-26) * */ @@ -204,6 +204,10 @@ public class XMLString { public static final String STYLE_REPEAT="style:repeat"; public static final String STYLE_POSITION="style:position"; public static final String STYLE_ADJUSTMENT="style:adjustment"; + public static final String STYLE_LANGUAGE_COMPLEX="style:language-complex"; + public static final String STYLE_COUNTRY_COMPLEX="style:country-complex"; + public static final String STYLE_LANGUAGE_ASIAN="style:language-asian"; + public static final String STYLE_COUNTRY_ASIAN="style:country-asian"; // table namespace - elements public static final String TABLE_="table:"; diff --git a/source/java/writer2latex/util/ExportNameCollection.java b/source/java/writer2latex/util/ExportNameCollection.java index 50110d1..4203219 100644 --- a/source/java/writer2latex/util/ExportNameCollection.java +++ b/source/java/writer2latex/util/ExportNameCollection.java @@ -32,7 +32,7 @@ import java.util.Hashtable; // Collection of export names // Used for mapping named collections to simpler names (only A-Z, a-z and 0-9) public class ExportNameCollection{ - private Hashtable exportNames = new Hashtable(); + private Hashtable exportNames = new Hashtable(); private String sPrefix; private boolean bAcceptNumbers; @@ -45,7 +45,7 @@ public class ExportNameCollection{ this("",b); } - public Enumeration keys() { + public Enumeration keys() { return exportNames.keys(); } @@ -89,7 +89,7 @@ public class ExportNameCollection{ public String getExportName(String sName) { // add the name, if it does not exist if (!containsName(sName)) { addName(sName); } - return sPrefix + (String) exportNames.get(sName); + return sPrefix + exportNames.get(sName); } public boolean containsName(String sName) { diff --git a/source/java/writer2latex/xhtml/Converter.java b/source/java/writer2latex/xhtml/Converter.java index cbacd5e..aaa6ddd 100644 --- a/source/java/writer2latex/xhtml/Converter.java +++ b/source/java/writer2latex/xhtml/Converter.java @@ -81,15 +81,15 @@ public class Converter extends ConverterBase { // The xhtml output file(s) protected int nType = XhtmlDocument.XHTML10; // the doctype - Vector outFiles; + Vector outFiles; private int nOutFileIndex; private XhtmlDocument htmlDoc; // current outfile private Document htmlDOM; // current DOM, usually within htmlDoc private boolean bNeedHeaderFooter = false; // Hyperlinks - Hashtable targets = new Hashtable(); - LinkedList links = new LinkedList(); + Hashtable targets = new Hashtable(); + LinkedList links = new LinkedList(); // Strip illegal characters from internal hyperlink targets private ExportNameCollection targetNames = new ExportNameCollection(true); @@ -136,7 +136,7 @@ public class Converter extends ConverterBase { public void convertInner() throws IOException { sTargetFileName = Misc.trimDocumentName(sTargetFileName,XhtmlDocument.getExtension(nType)); - outFiles = new Vector(); + outFiles = new Vector(); nOutFileIndex = -1; bNeedHeaderFooter = ofr.isSpreadsheet() || ofr.isPresentation() || config.getXhtmlSplitLevel()>0 || config.getXhtmlUplink().length()>0; @@ -178,10 +178,10 @@ public class Converter extends ConverterBase { textCv.insertEndnotes(htmlDoc.getContentNode()); // Resolve links - ListIterator iter = links.listIterator(); + ListIterator iter = links.listIterator(); while (iter.hasNext()) { - LinkDescriptor ld = (LinkDescriptor) iter.next(); - Integer targetIndex = (Integer) targets.get(ld.sId); + LinkDescriptor ld = iter.next(); + Integer targetIndex = targets.get(ld.sId); if (targetIndex!=null) { int nTargetIndex = targetIndex.intValue(); if (nTargetIndex == ld.nIndex) { // same file @@ -196,7 +196,7 @@ public class Converter extends ConverterBase { // Export styles (temp.) for (int i=0; i<=nOutFileIndex; i++) { - Document dom = ((XhtmlDocument) outFiles.get(i)).getContentDOM(); + Document dom = outFiles.get(i).getContentDOM(); NodeList hlist = dom.getElementsByTagName("head"); Node styles = styleCv.exportStyles(dom); if (styles!=null) { @@ -208,7 +208,7 @@ public class Converter extends ConverterBase { if (ofr.isSpreadsheet()) { for (int i=0; i<=nOutFileIndex; i++) { - XhtmlDocument doc = (XhtmlDocument) outFiles.get(i); + XhtmlDocument doc = outFiles.get(i); Document dom = doc.getContentDOM(); Element header = doc.getHeaderNode(); Element footer = doc.getFooterNode(); @@ -233,12 +233,12 @@ public class Converter extends ConverterBase { int nSheets = tableCv.sheetNames.size(); for (int j=0; j0) { for (int i=0; i<=nOutFileIndex; i++) { - XhtmlDocument doc = (XhtmlDocument) outFiles.get(i); + XhtmlDocument doc = outFiles.get(i); Document dom = doc.getContentDOM(); //Element content = doc.getContentNode(); @@ -304,7 +304,7 @@ public class Converter extends ConverterBase { } else if (config.getXhtmlUplink().length()>0) { for (int i=0; i<=nOutFileIndex; i++) { - XhtmlDocument doc = (XhtmlDocument) outFiles.get(i); + XhtmlDocument doc = outFiles.get(i); Document dom = doc.getContentDOM(); //Element content = doc.getContentNode(); @@ -430,7 +430,7 @@ public class Converter extends ConverterBase { // Use another document. TODO: This is very ugly; clean it up!!! public void changeOutFile(int nIndex) { nOutFileIndex = nIndex; - htmlDoc = (XhtmlDocument) outFiles.get(nIndex); + htmlDoc = outFiles.get(nIndex); htmlDOM = htmlDoc.getContentDOM(); } @@ -537,7 +537,7 @@ public class Converter extends ConverterBase { // Recreate nested sections, if any if (!textCv.sections.isEmpty()) { - Iterator iter = textCv.sections.iterator(); + Iterator iter = textCv.sections.iterator(); while (iter.hasNext()) { Element section = (Element) iter.next(); String sStyleName = Misc.getAttribute(section,XMLString.TEXT_STYLE_NAME); diff --git a/source/java/writer2latex/xhtml/DrawConverter.java b/source/java/writer2latex/xhtml/DrawConverter.java index 93d7363..1bc9060 100644 --- a/source/java/writer2latex/xhtml/DrawConverter.java +++ b/source/java/writer2latex/xhtml/DrawConverter.java @@ -94,7 +94,7 @@ public class DrawConverter extends ConverterHelper { private boolean bOriginalImageSize; // Frames in spreadsheet documents are collected here - private Vector frames = new Vector(); + private Vector frames = new Vector(); // This flag determines wether to collect frames or insert them immediately private boolean bCollectFrames = false; @@ -102,9 +102,9 @@ public class DrawConverter extends ConverterHelper { super(ofr,config,converter); // We can only handle one form; pick an arbitrary one. // Also we cannot split a form over several files. - Iterator formsIterator = ofr.getForms().getFormsIterator(); + Iterator formsIterator = ofr.getForms().getFormsIterator(); if (formsIterator.hasNext() && config.getXhtmlSplitLevel()==0) { - form = (FormReader) formsIterator.next(); + form = formsIterator.next(); } bCollectFrames = ofr.isSpreadsheet(); sScale = config.getXhtmlScaling(); @@ -222,7 +222,7 @@ public class DrawConverter extends ConverterHelper { bCollectFrames = false; int nCount = frames.size(); for (int i=0; i names = styleNames.keys(); while (names.hasMoreElements()) { - String sDisplayName = (String) names.nextElement(); + String sDisplayName = names.nextElement(); StyleWithProperties style = (StyleWithProperties) getStyles().getStyleByDisplayName(sDisplayName); if (!style.isAutomatic()) { diff --git a/source/java/writer2latex/xhtml/L10n.java b/source/java/writer2latex/xhtml/L10n.java index d9f8f75..c268af3 100644 --- a/source/java/writer2latex/xhtml/L10n.java +++ b/source/java/writer2latex/xhtml/L10n.java @@ -20,7 +20,7 @@ * * All Rights Reserved. * - * Version 1.0 (2009-03-05) + * Version 1.2 (2009-03-27) * */ @@ -58,7 +58,7 @@ public class L10n { case UP: return "Nach oben"; case FIRST : return "Anfang"; case PREVIOUS : return "Vorheriges"; - case NEXT : return "N\u00ccchstes"; + case NEXT : return "N\u00e4chstes"; case LAST : return "Ende"; case CONTENTS : return "Inhalte"; case INDEX : return "Index"; diff --git a/source/java/writer2latex/xhtml/ListStyleConverter.java b/source/java/writer2latex/xhtml/ListStyleConverter.java index ff40aee..4203f09 100644 --- a/source/java/writer2latex/xhtml/ListStyleConverter.java +++ b/source/java/writer2latex/xhtml/ListStyleConverter.java @@ -85,9 +85,9 @@ public class ListStyleConverter extends StyleConverterHelper { public String getStyleDeclarations(String sIndent) { if (bConvertStyles) { StringBuffer buf = new StringBuffer(); - Enumeration names = styleNames.keys(); + Enumeration names = styleNames.keys(); while (names.hasMoreElements()) { - String sDisplayName = (String) names.nextElement(); + String sDisplayName = names.nextElement(); ListStyle style = (ListStyle) getStyles().getStyleByDisplayName(sDisplayName); if (!style.isAutomatic()) { diff --git a/source/java/writer2latex/xhtml/PageStyleConverter.java b/source/java/writer2latex/xhtml/PageStyleConverter.java index 67adc28..5ce2d13 100644 --- a/source/java/writer2latex/xhtml/PageStyleConverter.java +++ b/source/java/writer2latex/xhtml/PageStyleConverter.java @@ -83,10 +83,10 @@ public class PageStyleConverter extends StyleConverterHelper { */ public String getStyleDeclarations(String sIndent) { StringBuffer buf = new StringBuffer(); - Enumeration names = styleNames.keys(); + Enumeration names = styleNames.keys(); while (names.hasMoreElements()) { // This will be master pages for presentations only - String sDisplayName = (String) names.nextElement(); + String sDisplayName = names.nextElement(); MasterPage style = (MasterPage) getStyles().getStyleByDisplayName(sDisplayName); StyleInfo info = new StyleInfo(); diff --git a/source/java/writer2latex/xhtml/PresentationStyleConverter.java b/source/java/writer2latex/xhtml/PresentationStyleConverter.java index e2312a4..f4551f0 100644 --- a/source/java/writer2latex/xhtml/PresentationStyleConverter.java +++ b/source/java/writer2latex/xhtml/PresentationStyleConverter.java @@ -45,7 +45,7 @@ public class PresentationStyleConverter extends FrameStyleConverter { // Data about outline styles String sCurrentOutlineStyle = null; - Hashtable outlineStyles = new Hashtable(); + Hashtable outlineStyles = new Hashtable(); ExportNameCollection outlineStyleNames = new ExportNameCollection(true); /** Create a new PresentationStyleConverter @@ -87,9 +87,9 @@ public class PresentationStyleConverter extends FrameStyleConverter { if (bConvertStyles) { StringBuffer buf = new StringBuffer(); buf.append(super.getStyleDeclarations(sIndent)); - Enumeration names = outlineStyleNames.keys(); + Enumeration names = outlineStyleNames.keys(); while (names.hasMoreElements()) { - String sDisplayName = (String) names.nextElement(); + String sDisplayName = names.nextElement(); StyleWithProperties style = (StyleWithProperties) getStyles().getStyleByDisplayName(sDisplayName); if (!style.isAutomatic()) { @@ -147,7 +147,7 @@ public class PresentationStyleConverter extends FrameStyleConverter { public void applyOutlineStyle(int nLevel, StyleInfo info) { if (2<=nLevel && nLevel<=9 && sCurrentOutlineStyle!=null) { if (outlineStyles.containsKey(sCurrentOutlineStyle)) { - info.sClass = "outline"+outlineStyleNames.getExportName(((String[]) outlineStyles.get(sCurrentOutlineStyle))[nLevel]); + info.sClass = "outline"+outlineStyleNames.getExportName(outlineStyles.get(sCurrentOutlineStyle)[nLevel]); } } } diff --git a/source/java/writer2latex/xhtml/StyleWithPropertiesConverterHelper.java b/source/java/writer2latex/xhtml/StyleWithPropertiesConverterHelper.java index 133ddfd..c00d981 100644 --- a/source/java/writer2latex/xhtml/StyleWithPropertiesConverterHelper.java +++ b/source/java/writer2latex/xhtml/StyleWithPropertiesConverterHelper.java @@ -93,9 +93,9 @@ public abstract class StyleWithPropertiesConverterHelper public String getStyleDeclarations(String sIndent) { if (bConvertStyles) { StringBuffer buf = new StringBuffer(); - Enumeration names = styleNames.keys(); + Enumeration names = styleNames.keys(); while (names.hasMoreElements()) { - String sDisplayName = (String) names.nextElement(); + String sDisplayName = names.nextElement(); StyleWithProperties style = (StyleWithProperties) getStyles().getStyleByDisplayName(sDisplayName); if (!style.isAutomatic()) { diff --git a/source/java/writer2latex/xhtml/TableConverter.java b/source/java/writer2latex/xhtml/TableConverter.java index 474efea..55b8f41 100644 --- a/source/java/writer2latex/xhtml/TableConverter.java +++ b/source/java/writer2latex/xhtml/TableConverter.java @@ -46,7 +46,7 @@ public class TableConverter extends ConverterHelper { // The collection of all table names // TODO: Navigation should be handled here rather than in Converter.java - protected Vector sheetNames = new Vector(); + protected Vector sheetNames = new Vector(); public TableConverter(OfficeReader ofr, XhtmlConfig config, Converter converter) { super(ofr,config,converter); diff --git a/source/java/writer2latex/xhtml/TextConverter.java b/source/java/writer2latex/xhtml/TextConverter.java index 58337b3..bcd603b 100644 --- a/source/java/writer2latex/xhtml/TextConverter.java +++ b/source/java/writer2latex/xhtml/TextConverter.java @@ -83,27 +83,27 @@ public class TextConverter extends ConverterHelper { private int nLastSplitLevel = 1; // The outline level at which the last split occured private int nDontSplitLevel = 0; // if > 0 splitting is forbidden boolean bAfterHeading=false; // last element was a top level heading - protected Stack sections = new Stack(); // stack of nested sections + protected Stack sections = new Stack(); // stack of nested sections Element[] currentHeading = new Element[7]; // Last headings (repeated when splitting) // Counters for generated numbers private ListCounter outlineNumbering; - private Hashtable listCounters = new Hashtable(); + private Hashtable listCounters = new Hashtable(); private String sCurrentListLabel = null; // Mode used to handle floats (depends on source doc type and config) private int nFloatMode; // Data used for index bookkeeping - private Vector indexes = new Vector(); + private Vector indexes = new Vector(); // Data used to handle Alphabetical Index - Vector index = new Vector(); // All words for the index + Vector index = new Vector(); // All words for the index private int nIndexIndex = -1; // Current index used for id's (of form idxN) private int nAlphabeticalIndex = -1; // File containing alphabetical index // Data used to handle Table of Contents - private Vector tocEntries = new Vector(); // All potential(!) toc items + private Vector tocEntries = new Vector(); // All potential(!) toc items private int nTocFileIndex = -1; // file index for main toc private Element currentChapter = null; // Node for the current chapter (level 1) heading private int nTocIndex = -1; // Current index for id's (of form tocN) @@ -116,8 +116,8 @@ public class TextConverter extends ConverterHelper { private String sEntCitStyle = null; // Gather the footnotes and endnotes - private LinkedList footnotes = new LinkedList(); - private LinkedList endnotes = new LinkedList(); + private LinkedList footnotes = new LinkedList(); + private LinkedList endnotes = new LinkedList(); // Sometimes we have to create an inlinenode in a block context // (labels for footnotes and endnotes) @@ -169,7 +169,7 @@ public class TextConverter extends ConverterHelper { // Generate all indexes int nIndexCount = indexes.size(); for (int i=0; i=0; i--) { - TocEntry entry = (TocEntry) tocEntries.get(i); + TocEntry entry = tocEntries.get(i); if (XMLString.TEXT_H.equals(entry.onode.getTagName()) && entry.nFileIndex==nIndex && entry.nOutlineLevel<=nSplit) { entryCurrent = entry; break; } @@ -237,7 +237,7 @@ public class TextConverter extends ConverterHelper { int nPrevFileIndex = 0; for (int i=0; inPrevFileIndex+1) { // Skipping a file index means we have passed an index @@ -660,7 +660,7 @@ public class TextConverter extends ConverterHelper { else if (style!=null) { // Get existing or create new counter if (listCounters.containsKey(style.getName())) { - return (ListCounter) listCounters.get(style.getName()); + return listCounters.get(style.getName()); } else { ListCounter counter = new ListCounter(style); @@ -1066,7 +1066,7 @@ public class TextConverter extends ConverterHelper { // Find the chapter if (tocReader.isByChapter() && chapter!=null) { for (int i=0; i 0) { index.set(i,entryj); index.set(j,entryi); @@ -1243,7 +1243,7 @@ public class TextConverter extends ConverterHelper { int nColIndex = -1; for (int i=0; i<=nIndexIndex; i++) { if (i%nColEntries==0) { nColIndex++; } - AlphabeticalEntry entry = (AlphabeticalEntry) index.get(i); + AlphabeticalEntry entry = index.get(i); Element p = createParagraph(td[nColIndex],sEntryStyleName); Element a = converter.createLink("idx"+entry.nIndex); p.appendChild(a); @@ -1517,7 +1517,7 @@ public class TextConverter extends ConverterHelper { public void insertFootnotes(Node hnode) { int n = footnotes.size(); for (int i=0; i0 && n>0) { hnode = converter.nextOutFile(); } for (int i=0; i anchorCombinedStyleNames = new Hashtable(); + private Hashtable orgAnchorStyleNames = new Hashtable(); + private Hashtable orgAnchorVisitedStyleNames = new Hashtable(); /** Create a new TextStyleConverter * @param ofr an OfficeReader to read style information from @@ -111,7 +111,7 @@ public class TextStyleConverter extends StyleWithPropertiesConverterHelper { orgAnchorStyleNames.put(sExportName,sStyleName); orgAnchorVisitedStyleNames.put(sExportName,sVisitedStyleName); } - info.sClass = (String)anchorCombinedStyleNames.get(sName); + info.sClass = anchorCombinedStyleNames.get(sName); } /**

Convert style information for used styles

@@ -144,11 +144,11 @@ public class TextStyleConverter extends StyleWithPropertiesConverterHelper { } // Remaining link styles... - Enumeration enumer = anchorCombinedStyleNames.elements(); + Enumeration enumer = anchorCombinedStyleNames.elements(); while (enumer.hasMoreElements()) { - String sExportName = (String) enumer.nextElement(); - String sStyleName = (String) orgAnchorStyleNames.get(sExportName); - String sVisitedStyleName = (String) orgAnchorVisitedStyleNames.get(sExportName); + String sExportName = enumer.nextElement(); + String sStyleName = orgAnchorStyleNames.get(sExportName); + String sVisitedStyleName = orgAnchorVisitedStyleNames.get(sExportName); StyleWithProperties style = ofr.getTextStyle(sStyleName); diff --git a/source/java/writer2latex/xhtml/XhtmlConfig.java b/source/java/writer2latex/xhtml/XhtmlConfig.java index 2b93bad..06896f6 100644 --- a/source/java/writer2latex/xhtml/XhtmlConfig.java +++ b/source/java/writer2latex/xhtml/XhtmlConfig.java @@ -191,9 +191,9 @@ public class XhtmlConfig extends writer2latex.base.ConfigBase { } private void writeXStyleMap(Document dom, XhtmlStyleMap sm, String sFamily) { - Enumeration smEnum = sm.getNames(); + Enumeration smEnum = sm.getNames(); while (smEnum.hasMoreElements()) { - String sName = (String) smEnum.nextElement(); + String sName = smEnum.nextElement(); Element smNode = dom.createElement("xhtml-style-map"); smNode.setAttribute("name",sName); smNode.setAttribute("family",sFamily); diff --git a/source/java/writer2latex/xhtml/XhtmlStyleMap.java b/source/java/writer2latex/xhtml/XhtmlStyleMap.java index 8bd3d03..1d3ca80 100644 --- a/source/java/writer2latex/xhtml/XhtmlStyleMap.java +++ b/source/java/writer2latex/xhtml/XhtmlStyleMap.java @@ -30,10 +30,10 @@ import java.util.Hashtable; import java.util.Enumeration; public class XhtmlStyleMap { - private Hashtable blockElement = new Hashtable(); - private Hashtable blockCss = new Hashtable(); - private Hashtable element = new Hashtable(); - private Hashtable css = new Hashtable(); + private Hashtable blockElement = new Hashtable(); + private Hashtable blockCss = new Hashtable(); + private Hashtable element = new Hashtable(); + private Hashtable css = new Hashtable(); public void put(String sName, String sBlockElement, String sBlockCss, String sElement, String sCss) { blockElement.put(sName,sBlockElement); @@ -47,22 +47,22 @@ public class XhtmlStyleMap { } public String getBlockElement(String sName) { - return (String) blockElement.get(sName); + return blockElement.get(sName); } public String getBlockCss(String sName) { - return (String) blockCss.get(sName); + return blockCss.get(sName); } public String getElement(String sName) { - return (String) element.get(sName); + return element.get(sName); } public String getCss(String sName) { - return (String) css.get(sName); + return css.get(sName); } - public Enumeration getNames() { + public Enumeration getNames() { return element.keys(); } diff --git a/source/java/writer2latex/xmerge/ConvertData.java b/source/java/writer2latex/xmerge/ConvertData.java index c28dbe5..34c702b 100644 --- a/source/java/writer2latex/xmerge/ConvertData.java +++ b/source/java/writer2latex/xmerge/ConvertData.java @@ -64,7 +64,7 @@ public class ConvertData implements ConverterResult { /** * Vector of OutputFile objects. */ - private Vector v = new Vector(); + private Vector v = new Vector(); /** Master doc */ private OutputFile masterDoc = null; @@ -137,7 +137,7 @@ public class ConvertData implements ConverterResult { * @return The Iterator to access the * Vector of OutputFile objects. */ - public Iterator iterator() { + public Iterator iterator() { return v.iterator(); } @@ -154,9 +154,9 @@ public class ConvertData implements ConverterResult { public void write(File dir) throws IOException { if (dir!=null && !dir.exists()) throw new IOException("Directory does not exist"); - Iterator docEnum = iterator(); + Iterator docEnum = iterator(); while (docEnum.hasNext()) { - OutputFile docOut = (OutputFile) docEnum.next(); + OutputFile docOut = docEnum.next(); String sDirName = ""; String sFileName = docOut.getFileName(); File subdir = dir; diff --git a/source/java/writer2latex/xmerge/OfficeDocument.java b/source/java/writer2latex/xmerge/OfficeDocument.java index 1b2ee49..b43fee5 100644 --- a/source/java/writer2latex/xmerge/OfficeDocument.java +++ b/source/java/writer2latex/xmerge/OfficeDocument.java @@ -120,7 +120,7 @@ public class OfficeDocument private OfficeZip zip = null; /** Collection to keep track of the embedded objects in the document. */ - private Map embeddedObjects = null; + private Map embeddedObjects = null; /** * Default constructor. @@ -320,10 +320,10 @@ public class OfficeDocument * * @return An Iterator of EmbeddedObject objects. */ - public Iterator getEmbeddedObjects() { + public Iterator getEmbeddedObjects() { if (embeddedObjects == null && manifestDoc != null) { - embeddedObjects = new HashMap(); + embeddedObjects = new HashMap(); // Need to read the manifest file and construct a list of objects NodeList nl = manifestDoc.getElementsByTagName(TAG_MANIFEST_FILE); @@ -400,7 +400,7 @@ public class OfficeDocument } if (embeddedObjects.containsKey(name)) { - return (EmbeddedObject)embeddedObjects.get(name); + return embeddedObjects.get(name); } else { return null; @@ -419,7 +419,7 @@ public class OfficeDocument } if (embeddedObjects == null) { - embeddedObjects = new HashMap(); + embeddedObjects = new HashMap(); } embeddedObjects.put(embObj.getName(), embObj); @@ -734,9 +734,9 @@ public class OfficeDocument Element manifestRoot = manifestDoc.getDocumentElement(); // The EmbeddedObjects come first. - Iterator embObjs = getEmbeddedObjects(); + Iterator embObjs = getEmbeddedObjects(); while (embObjs.hasNext()) { - EmbeddedObject obj = (EmbeddedObject)embObjs.next(); + EmbeddedObject obj = embObjs.next(); obj.writeManifestData(manifestDoc); obj.write(zip); diff --git a/source/java/writer2latex/xmerge/OfficeZip.java b/source/java/writer2latex/xmerge/OfficeZip.java index 6de0010..a9abe1d 100644 --- a/source/java/writer2latex/xmerge/OfficeZip.java +++ b/source/java/writer2latex/xmerge/OfficeZip.java @@ -75,7 +75,7 @@ class OfficeZip { private final static int BUFFERSIZE = 1024; - private List entryList = null; + private List entryList = null; private int contentIndex = -1; private int styleIndex = -1; @@ -86,7 +86,7 @@ class OfficeZip { /** Default constructor. */ OfficeZip() { - entryList = new LinkedList(); + entryList = new LinkedList(); } @@ -229,7 +229,7 @@ class OfficeZip { // Could improve performance by caching the name and index when // iterating through the ZipFile in read(). for (int i = 0; i < entryList.size(); i++) { - Entry e = (Entry)entryList.get(i); + Entry e = entryList.get(i); if (e.zipEntry.getName().equals(name)) { return getEntryBytes(i); @@ -252,7 +252,7 @@ class OfficeZip { */ void setNamedBytes(String name, byte[] bytes) { for (int i = 0; i < entryList.size(); i++) { - Entry e = (Entry)entryList.get(i); + Entry e = entryList.get(i); if (e.zipEntry.getName().equals(name)) { setEntryBytes(i, bytes, name); @@ -283,7 +283,7 @@ class OfficeZip { byte[] bytes = null; if (index > -1) { - Entry entry = (Entry) entryList.get(index); + Entry entry = entryList.get(index); bytes = entry.bytes; } return bytes; @@ -373,7 +373,7 @@ class OfficeZip { // replace existing entry in entryList - Entry entry = (Entry) entryList.get(index); + Entry entry = entryList.get(index); name = entry.zipEntry.getName(); int method = entry.zipEntry.getMethod(); @@ -409,11 +409,11 @@ class OfficeZip { ZipOutputStream zos = new ZipOutputStream(os); - ListIterator iterator = entryList.listIterator(); + ListIterator iterator = entryList.listIterator(); while (iterator.hasNext()) { - Entry entry = (Entry) iterator.next(); + Entry entry = iterator.next(); ZipEntry ze = entry.zipEntry; //String name = ze.getName(); diff --git a/source/oxt/writer2latex/description.xml b/source/oxt/writer2latex/description.xml index c5b1f47..1ed0fba 100644 --- a/source/oxt/writer2latex/description.xml +++ b/source/oxt/writer2latex/description.xml @@ -5,7 +5,7 @@ - + @@ -22,13 +22,13 @@ - - - - - - - + + + + + + + diff --git a/source/oxt/writer2xhtml/description.xml b/source/oxt/writer2xhtml/description.xml index 4a90699..a5becfd 100644 --- a/source/oxt/writer2xhtml/description.xml +++ b/source/oxt/writer2xhtml/description.xml @@ -4,7 +4,7 @@ - + @@ -21,13 +21,13 @@ - - - - - - - + + + + + + + diff --git a/source/oxt/writer4latex/Addons.xcu b/source/oxt/writer4latex/Addons.xcu new file mode 100644 index 0000000..c676b65 --- /dev/null +++ b/source/oxt/writer4latex/Addons.xcu @@ -0,0 +1,142 @@ + + + + + + + + com.sun.star.text.TextDocument + + + Writer4LaTeX + + + _self + + + + + + + + com.sun.star.text.TextDocument + + + Run LaTeX... + Kør LaTeX... + + + _self + + + org.openoffice.da.writer4latex:ProcessDocument + + + + + + + + com.sun.star.text.TextDocument + + + Run LaTeX directly + Kør LaTeX direkte + + + _self + + + org.openoffice.da.writer4latex:ProcessDirectly + + + + + + + + com.sun.star.text.TextDocument + + + View Log files + Vis logfiler + + + _self + + + org.openoffice.da.writer4latex:ViewLog + + + + + + + + + private:separator + + + + + com.sun.star.text.TextDocument + + + Import LaTeX... + Importer LaTeX... + + + _self + + + org.openoffice.da.writer4latex:ImportLaTeX + + + + + + + + + + + + \ No newline at end of file diff --git a/source/oxt/writer4latex/META-INF/manifest.xml b/source/oxt/writer4latex/META-INF/manifest.xml new file mode 100644 index 0000000..e2f136d --- /dev/null +++ b/source/oxt/writer4latex/META-INF/manifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/oxt/writer4latex/Options.xcs b/source/oxt/writer4latex/Options.xcs new file mode 100644 index 0000000..a1a5012 --- /dev/null +++ b/source/oxt/writer4latex/Options.xcs @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/oxt/writer4latex/Options.xcu b/source/oxt/writer4latex/Options.xcu new file mode 100644 index 0000000..8ccfcbf --- /dev/null +++ b/source/oxt/writer4latex/Options.xcu @@ -0,0 +1,89 @@ + + + + + + latex + + + --interaction=batchmode %s + + + + + pdflatex + + + --interaction=batchmode %s + + + + + xelatex + + + --interaction=batchmode %s + + + + + bibtex + + + %s + + + + + makeindex + + + %s + + + + + oolatex + + + %s + + + + + dvips + + + %s + + + + + evince + + + %s + + + + + evince + + + %s + + + + + evince + + + %s + + + + \ No newline at end of file diff --git a/source/oxt/writer4latex/OptionsDialog.xcu b/source/oxt/writer4latex/OptionsDialog.xcu new file mode 100644 index 0000000..131fe19 --- /dev/null +++ b/source/oxt/writer4latex/OptionsDialog.xcu @@ -0,0 +1,29 @@ + + + + + + + + + + org.openoffice.da.writer4latex.oxt + + + Writer4LaTeX + + + %origin%/W4LDialogs/Configuration.xdl + + + org.openoffice.da.writer4latex.ConfigurationDialog + + + + + + \ No newline at end of file diff --git a/source/oxt/writer4latex/Paths.xcu b/source/oxt/writer4latex/Paths.xcu new file mode 100644 index 0000000..119ccd1 --- /dev/null +++ b/source/oxt/writer4latex/Paths.xcu @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/source/oxt/writer4latex/ProtocolHandler.xcu b/source/oxt/writer4latex/ProtocolHandler.xcu new file mode 100644 index 0000000..863586b --- /dev/null +++ b/source/oxt/writer4latex/ProtocolHandler.xcu @@ -0,0 +1,12 @@ + + + + + + + + org.openoffice.da.writer4latex:* + + + + \ No newline at end of file diff --git a/source/oxt/writer4latex/W2LOptions.xcu b/source/oxt/writer4latex/W2LOptions.xcu new file mode 100644 index 0000000..192da2c --- /dev/null +++ b/source/oxt/writer4latex/W2LOptions.xcu @@ -0,0 +1,36 @@ + + + + + + + + + + + W4L: LaTeX article + + + %origin%/config/article.xml + + + + + + + LaTeX-article + + + w4l-article + + + + + + + + \ No newline at end of file diff --git a/source/oxt/writer4latex/W4LDialogs/Configuration.xdl b/source/oxt/writer4latex/W4LDialogs/Configuration.xdl new file mode 100644 index 0000000..92675de --- /dev/null +++ b/source/oxt/writer4latex/W4LDialogs/Configuration.xdl @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/oxt/writer4latex/W4LDialogs/LogViewer.xdl b/source/oxt/writer4latex/W4LDialogs/LogViewer.xdl new file mode 100644 index 0000000..2bd9f8f --- /dev/null +++ b/source/oxt/writer4latex/W4LDialogs/LogViewer.xdl @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/oxt/writer4latex/W4LDialogs/Module1.xba b/source/oxt/writer4latex/W4LDialogs/Module1.xba new file mode 100644 index 0000000..9c46f60 --- /dev/null +++ b/source/oxt/writer4latex/W4LDialogs/Module1.xba @@ -0,0 +1,10 @@ + + +REM ***** BASIC ***** + +Sub Main + +End Sub + + + \ No newline at end of file diff --git a/source/oxt/writer4latex/W4LDialogs/dialog.xlb b/source/oxt/writer4latex/W4LDialogs/dialog.xlb new file mode 100644 index 0000000..719e888 --- /dev/null +++ b/source/oxt/writer4latex/W4LDialogs/dialog.xlb @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/source/oxt/writer4latex/W4LDialogs/script.xlb b/source/oxt/writer4latex/W4LDialogs/script.xlb new file mode 100644 index 0000000..76fa668 --- /dev/null +++ b/source/oxt/writer4latex/W4LDialogs/script.xlb @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/source/oxt/writer4latex/config/article.xml b/source/oxt/writer4latex/config/article.xml new file mode 100644 index 0000000..c41a711 --- /dev/null +++ b/source/oxt/writer4latex/config/article.xml @@ -0,0 +1,170 @@ + + + + + + + diff --git a/source/oxt/writer4latex/description.xml b/source/oxt/writer4latex/description.xml new file mode 100644 index 0000000..eaf83e3 --- /dev/null +++ b/source/oxt/writer4latex/description.xml @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/source/oxt/writer4latex/template/Writer4LaTeX/LaTeX-article.ott b/source/oxt/writer4latex/template/Writer4LaTeX/LaTeX-article.ott new file mode 100644 index 0000000000000000000000000000000000000000..9944af25cc05afb52d670e50737e1f93ca6095ad GIT binary patch literal 11327 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 OuM - + diff --git a/source/readme-source.txt b/source/readme-source.txt index 1e878d4..3a5dabb 100644 --- a/source/readme-source.txt +++ b/source/readme-source.txt @@ -1,5 +1,5 @@ -Writer2LaTeX source version 1.0 beta -==================================== +Writer2LaTeX source version 1.1.1 +================================= Writer2LaTeX is (c) 2002-2009 by Henrik Just. The source is available under the terms and conditions of the