Config ui + Writer4LaTeX

git-svn-id: svn://svn.code.sf.net/p/writer2latex/code/trunk@42 f0f2a975-2e09-46c8-9428-3b39399b9f3c
This commit is contained in:
henrikjust 2009-12-07 13:29:45 +00:00
parent 04ed9dae7a
commit d79de9402a
10 changed files with 112 additions and 287 deletions

View file

@ -1,203 +0,0 @@
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: WinRegKey.java,v $
* $Revision: 1.4 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
package com.sun.star.lib.loader;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
/**
* This class provides functionality for reading string values from the
* Windows Registry. It requires the native library unowinreg.dll.
*/
final class WinRegKey {
private String m_rootKeyName;
private String m_subKeyName;
// native methods to access the windows registry
private static native boolean winreg_RegOpenClassesRoot( long[] hkresult );
private static native boolean winreg_RegOpenCurrentConfig(
long[] hkresult );
private static native boolean winreg_RegOpenCurrentUser( long[] hkresult );
private static native boolean winreg_RegOpenLocalMachine( long[] hkresult );
private static native boolean winreg_RegOpenUsers( long[] hkresult );
private static native boolean winreg_RegOpenKeyEx( long parent, String name,
long[] hkresult );
private static native boolean winreg_RegCloseKey( long hkey );
private static native boolean winreg_RegQueryValueEx(
long hkey, String value, long[] type,
byte[] data, long[] size );
private static native boolean winreg_RegQueryInfoKey(
long hkey, long[] subkeys, long[] maxSubkeyLen,
long[] values, long[] maxValueNameLen,
long[] maxValueLen, long[] secDescriptor );
// load the native library unowinreg.dll
static {
try {
ClassLoader cl = WinRegKey.class.getClassLoader();
InputStream is = cl.getResourceAsStream( "win/unowinreg.dll" );
if ( is != null ) {
// generate a temporary name for lib file and write to temp
// location
BufferedInputStream istream = new BufferedInputStream( is );
File libfile = File.createTempFile( "unowinreg", ".dll" );
libfile.deleteOnExit(); // ensure deletion
BufferedOutputStream ostream = new BufferedOutputStream(
new FileOutputStream( libfile ) );
int bsize = 2048; int n = 0;
byte[] buffer = new byte[bsize];
while ( ( n = istream.read( buffer, 0, bsize ) ) != -1 ) {
ostream.write( buffer, 0, n );
}
istream.close();
ostream.close();
// load library
System.load( libfile.getPath() );
} else {
// If the library cannot be found as a class loader resource,
// try the global System.loadLibrary(). The JVM will look for
// it in the java.library.path.
System.loadLibrary( "unowinreg" );
}
} catch ( java.lang.Exception e ) {
System.err.println( "com.sun.star.lib.loader.WinRegKey: " +
"loading of native library failed!" + e );
}
}
/**
* Constructs a <code>WinRegKey</code>.
*/
public WinRegKey( String rootKeyName, String subKeyName ) {
m_rootKeyName = rootKeyName;
m_subKeyName = subKeyName;
}
/**
* Reads a string value for the specified value name.
*/
public String getStringValue( String valueName ) throws WinRegKeyException {
byte[] data = getValue( valueName );
// remove terminating null character
return new String( data, 0, data.length - 1 );
}
/**
* Reads a value for the specified value name.
*/
private byte[] getValue( String valueName ) throws WinRegKeyException {
byte[] result = null;
long[] hkey = {0};
// open the specified registry key
boolean bRet = false;
long[] hroot = {0};
if ( m_rootKeyName.equals( "HKEY_CLASSES_ROOT" ) ) {
bRet = winreg_RegOpenClassesRoot( hroot );
} else if ( m_rootKeyName.equals( "HKEY_CURRENT_CONFIG" ) ) {
bRet = winreg_RegOpenCurrentConfig( hroot );
} else if ( m_rootKeyName.equals( "HKEY_CURRENT_USER" ) ) {
bRet = winreg_RegOpenCurrentUser( hroot );
} else if ( m_rootKeyName.equals( "HKEY_LOCAL_MACHINE" ) ) {
bRet = winreg_RegOpenLocalMachine( hroot );
} else if ( m_rootKeyName.equals( "HKEY_USERS" ) ) {
bRet = winreg_RegOpenUsers( hroot );
} else {
throw new WinRegKeyException( "unknown root registry key!");
}
if ( !bRet ) {
throw new WinRegKeyException( "opening root registry key " +
"failed!" );
}
if ( !winreg_RegOpenKeyEx( hroot[0], m_subKeyName, hkey ) ) {
if ( !winreg_RegCloseKey( hroot[0] ) ) {
throw new WinRegKeyException( "opening registry key and " +
"releasing root registry key handle failed!" );
}
throw new WinRegKeyException( "opening registry key failed!" );
}
// get the size of the longest data component among the key's values
long[] subkeys = {0};
long[] maxSubkeyLen = {0};
long[] values = {0};
long[] maxValueNameLen = {0};
long[] maxValueLen = {0};
long[] secDescriptor = {0};
if ( !winreg_RegQueryInfoKey( hkey[0], subkeys, maxSubkeyLen,
values, maxValueNameLen, maxValueLen, secDescriptor ) ) {
if ( !winreg_RegCloseKey( hkey[0] ) ||
!winreg_RegCloseKey( hroot[0] ) ) {
throw new WinRegKeyException( "retrieving information about " +
"the registry key and releasing registry key handles " +
"failed!" );
}
throw new WinRegKeyException( "retrieving information about " +
"the registry key failed!" );
}
// get the data for the specified value name
byte[] buffer = new byte[ (int) maxValueLen[0] ];
long[] size = new long[1];
size[0] = buffer.length;
long[] type = new long[1];
type[0] = 0;
if ( !winreg_RegQueryValueEx( hkey[0], valueName, type, buffer,
size ) ) {
if ( !winreg_RegCloseKey( hkey[0] ) ||
!winreg_RegCloseKey( hroot[0] ) ) {
throw new WinRegKeyException( "retrieving data for the " +
"specified value name and releasing registry key handles " +
"failed!" );
}
throw new WinRegKeyException( "retrieving data for the " +
"specified value name failed!" );
}
// release registry key handles
if ( !winreg_RegCloseKey( hkey[0] ) ||
!winreg_RegCloseKey( hroot[0] ) ) {
throw new WinRegKeyException( "releasing registry key handles " +
"failed!" );
}
result = new byte[ (int) size[0] ];
System.arraycopy( buffer, 0, result, 0, (int)size[0] );
return result;
}
}

View file

@ -1,54 +0,0 @@
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: WinRegKeyException.java,v $
* $Revision: 1.4 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org 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 version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
package com.sun.star.lib.loader;
/**
* WinRegKeyException is a checked exception.
*/
final class WinRegKeyException extends java.lang.Exception {
/**
* Constructs a <code>WinRegKeyException</code>.
*/
public WinRegKeyException() {
super();
}
/**
* Constructs a <code>WinRegKeyException</code> with the specified
* detail message.
*
* @param message the detail message
*/
public WinRegKeyException( String message ) {
super( message );
}
}

View file

@ -688,6 +688,18 @@ public final class ConfigurationDialog extends WeakBase
styleMap[i].clear();
Map<String,String> displayNames = styleNameProvider.getDisplayNames(sOOoFamilyNames[i]);
copyStyles(configMap, styleMap[i], displayNames);
for (String sName : styleMap[i].keySet()) {
Map<String,String> attr = styleMap[i].get(sName);
if (attr.containsKey("next")) {
String[] sNext = attr.get("next").split(";");
String sNewNext = "";
for (String sNextName : sNext) {
if (sNewNext.length()>0) { sNewNext+=";"; }
sNewNext+=displayNames.get(sNextName);
}
attr.put("next", sNewNext);
}
}
}
// Load other controls from config
@ -728,6 +740,18 @@ public final class ConfigurationDialog extends WeakBase
configMap.clear();
Map<String,String> internalNames = styleNameProvider.getInternalNames(sOOoFamilyNames[i]);
copyStyles(styleMap[i], configMap, internalNames);
for (String sName : configMap.keySet()) {
Map<String,String> attr = configMap.get(sName);
if (attr.containsKey("next")) {
String[] sNext = attr.get("next").split(";");
String sNewNext = "";
for (String sNextName : sNext) {
if (sNewNext.length()>0) { sNewNext+=";"; }
sNewNext+=internalNames.get(sNextName);
}
attr.put("next", sNewNext);
}
}
}
// Save other controls to config

View file

@ -20,7 +20,7 @@
*
* All Rights Reserved.
*
* Version 1.2 (2009-11-19)
* Version 1.2 (2009-11-29)
*
*/
@ -278,30 +278,85 @@ public final class ConfigurationDialog
info.append("Failed to find "+sName+"\n");
return false;
}
// Windows: Test that the given path contains MikTeX
private boolean containsMikTeX(String sPath) {
File dir = new File(sPath);
if (dir.exists() && dir.canRead()) {
File latex = new File(dir,"latex.exe");
return latex.exists();
}
return false;
}
// Windows: Configure a certain MikTeX application
private void configureMikTeX(String sPath, String sName, String sAppName, String sArguments, StringBuffer info) {
File app = new File(new File(sPath),sAppName+".exe");
if (app.exists()) {
externalApps.setApplication(sName, sAppName, sArguments);
info.append(" Found "+sName+": "+sAppName+" - OK\n");
}
else {
externalApps.setApplication(sName, "???", "???");
info.append(" Failed to find "+sName+"\n");
}
}
// Configure the applications automatically (OS dependent)
private boolean autoConfigure(XWindow xWindow) {
String sOsName = System.getProperty("os.name");
StringBuffer info = new StringBuffer();
info.append("Results of configuration:\n\n");
info.append("Your system identifies itself as "+sOsName+"\n\n");
if (sOsName.startsWith("Windows")) {
// TODO: Get information from the windows registry using unowinreg.dll from the SDK
// TODO: Get information from the windows registry using external vbs script
// Assume MikTeX
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.MK4HT, "mk4ht", "%c %s");
externalApps.setApplication(ExternalApps.DVIVIEWER, "yap", "--single-instance %s");
String sMikTeXPath = null;
String[] sPaths = System.getenv("PATH").split(";");
for (String s : sPaths) {
if (s.toLowerCase().indexOf("miktex")>-1 && containsMikTeX(s)) {
sMikTeXPath = s;
break;
}
}
if (sMikTeXPath==null) {
for (String s : sPaths) {
if (containsMikTeX(s)) {
sMikTeXPath = s;
break;
}
}
}
if (sMikTeXPath!=null) {
info.append("Found MikTeX\n");
configureMikTeX(sMikTeXPath, ExternalApps.LATEX, "latex", "--interaction=batchmode %s", info);
configureMikTeX(sMikTeXPath, ExternalApps.PDFLATEX, "pdflatex", "--interaction=batchmode %s", info);
configureMikTeX(sMikTeXPath, ExternalApps.XELATEX, "xelatex", "--interaction=batchmode %s", info);
configureMikTeX(sMikTeXPath, ExternalApps.DVIPS, "dvips", "%s", info);
configureMikTeX(sMikTeXPath, ExternalApps.BIBTEX, "bibtex", "%s", info);
configureMikTeX(sMikTeXPath, ExternalApps.MAKEINDEX, "makeindex", "%s", info);
configureMikTeX(sMikTeXPath, ExternalApps.MK4HT, "mk4ht", "%c %s", info);
configureMikTeX(sMikTeXPath, ExternalApps.DVIVIEWER, "yap", "--single-instance %s", info);
}
else {
info.append("Failed to find MikTeX\n");
info.append("Writer4LaTeX has been configured to work if MikTeX is added to your path\n");
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.MK4HT, "mk4ht", "%c %s");
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\"");
displayAutoConfigInfo("Configured for MikTeX...");
}
else { // Assume a unix-like system supporting the "which" command
StringBuffer info = new StringBuffer();
info.append("Results of configuration:\n\n");
configureApp(ExternalApps.LATEX, "latex", "--interaction=batchmode %s",info);
configureApp(ExternalApps.PDFLATEX, "pdflatex", "--interaction=batchmode %s",info);
configureApp(ExternalApps.XELATEX, "xelatex", "--interaction=batchmode %s",info);
@ -317,8 +372,8 @@ public final class ConfigurationDialog
String[] sPsViewers = {"evince", "okular", "ghostview"};
configureApp(ExternalApps.POSTSCRIPTVIEWER, sPsViewers, "%s",info);
displayAutoConfigInfo(info.toString());
}
displayAutoConfigInfo(info.toString());
changeApplication(xWindow);
return true;
}

View file

@ -20,7 +20,7 @@
*
* All Rights Reserved.
*
* Version 1.2 (2009-03-31)
* Version 1.2 (2009-11-29)
*
*/

View file

@ -20,7 +20,7 @@
*
* All Rights Reserved.
*
* Version 1.2 (2009-11-23)
* Version 1.2 (2009-12-07)
*
*/
@ -33,7 +33,7 @@ public class ConverterFactory {
// Version information
private static final String VERSION = "1.1.1";
private static final String DATE = "2009-11-23";
private static final String DATE = "2009-12-07";
/** Return version information
* @return the Writer2LaTeX version in the form

View file

@ -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-12-07)
*
*/
@ -29,6 +29,8 @@ package writer2latex.office;
//import java.io.ByteArrayInputStream;
//import java.io.ByteArrayOutputStream;
//import java.io.IOException;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.HashSet;
import org.w3c.dom.Node;
@ -56,6 +58,7 @@ public final class ImageLoader {
private String sOutFileName;
private boolean bUseSubdir = false;
private int nImageCount = 0;
private NumberFormat formatter;
// should EPS be extracted from SVM?
private boolean bExtractEPS;
@ -71,6 +74,7 @@ public final class ImageLoader {
this.oooDoc = oooDoc;
this.sOutFileName = sOutFileName;
this.bExtractEPS = bExtractEPS;
this.formatter = new DecimalFormat("000");
}
public void setOutFileName(String sOutFileName) { this.sOutFileName = sOutFileName; }
@ -94,7 +98,7 @@ public final class ImageLoader {
private boolean isAcceptedFormat(String sMime) { return acceptedFormats.contains(sMime); }
public void setGraphicConverter(GraphicConverter gcv) { this.gcv = gcv; }
public BinaryGraphicsDocument getImage(Node node) {
// node must be a draw:image element.
// variables to hold data about the image:
@ -142,7 +146,7 @@ public final class ImageLoader {
if (blob==null) { return null; }
// Assign a name (without extension)
String sName = sOutFileName+"-img"+(++nImageCount);
String sName = sOutFileName+"-img"+formatter.format(++nImageCount);
if (bUseSubdir) { sName = sOutFileName + "-img/" + sName; }
BinaryGraphicsDocument bgd = null;