w2x toolbar configuration dialog

git-svn-id: svn://svn.code.sf.net/p/writer2latex/code/trunk@235 f0f2a975-2e09-46c8-9428-3b39399b9f3c
This commit is contained in:
henrikjust 2015-04-05 13:47:15 +00:00
parent c1fecb5252
commit 199616dde6
22 changed files with 794 additions and 178 deletions

View file

@ -0,0 +1,262 @@
/************************************************************************
*
* ToolbarSettingsDialog.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-2015 by Henrik Just
*
* All Rights Reserved.
*
* Version 1.6 (2015-04-05)
*
*/
package org.openoffice.da.comp.writer2xhtml;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import com.sun.star.awt.XContainerWindowEventHandler;
import com.sun.star.awt.XDialog;
import com.sun.star.awt.XWindow;
import com.sun.star.beans.XPropertySet;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.uno.AnyConverter;
import com.sun.star.uno.Exception;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.sun.star.util.XChangesBatch;
import com.sun.star.lib.uno.helper.WeakBase;
import org.openoffice.da.comp.w2lcommon.helper.DialogAccess;
import org.openoffice.da.comp.w2lcommon.helper.FilePicker;
import org.openoffice.da.comp.w2lcommon.helper.RegistryHelper;
import org.openoffice.da.comp.w2lcommon.helper.XPropertySetHelper;
/** This class provides a uno component which implements the configuration
* of the writer2xhtml toolbar
*/
public final class ToolbarSettingsDialog
extends WeakBase
implements XServiceInfo, XContainerWindowEventHandler {
public static final String REGISTRY_PATH = "/org.openoffice.da.Writer2xhtml.toolbar.ToolbarOptions/Settings";
private XComponentContext xContext;
private FilePicker filePicker;
/** The component will be registered under this name.
*/
public static String __serviceName = "org.openoffice.da.writer2xhtml.ToolbarSettingsDialog";
/** The component should also have an implementation name.
*/
public static String __implementationName = "org.openoffice.da.comp.writer2xhtml.ToolbarSettingsDialog";
/** Create a new ToolbarSettingsDialog */
public ToolbarSettingsDialog(XComponentContext xContext) {
this.xContext = xContext;
filePicker = new FilePicker(xContext);
}
// Implement XContainerWindowEventHandler
public boolean callHandlerMethod(XWindow xWindow, Object event, String sMethod)
throws com.sun.star.lang.WrappedTargetException {
XDialog xDialog = (XDialog)UnoRuntime.queryInterface(XDialog.class, xWindow);
DialogAccess dlg = new DialogAccess(xDialog);
try {
if (sMethod.equals("external_event") ){
return handleExternalEvent(dlg, event);
}
else if (sMethod.equals("XhtmlFormatChange")) {
return true;
}
else if (sMethod.equals("XhtmlViewChange")) {
return xhtmlViewChange(dlg);
}
else if (sMethod.equals("XhtmlBrowseClick")) {
return xhtmlBrowseClick(dlg);
}
else if (sMethod.equals("EpubFormatChange")) {
return true;
}
else if (sMethod.equals("EpubViewChange")) {
return epubViewChange(dlg);
}
else if (sMethod.equals("EpubBrowseClick")) {
return epubBrowseClick(dlg);
}
}
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", "XhtmlFormatChange", "XhtmlViewChange", "XhtmlBrowseClick",
"EpupFormatChange", "EpubViewChange", "EpubBrowseClick" };
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(DialogAccess dlg, Object aEventObject)
throws com.sun.star.uno.Exception {
try {
String sMethod = AnyConverter.toString(aEventObject);
if (sMethod.equals("ok")) {
saveConfiguration(dlg);
return true;
} else if (sMethod.equals("back") || sMethod.equals("initialize")) {
loadConfiguration(dlg);
enableXhtmlExecutable(dlg);
enableEpubExecutable(dlg);
return true;
}
}
catch (com.sun.star.lang.IllegalArgumentException e) {
throw new com.sun.star.lang.IllegalArgumentException(
"Method external_event requires a string in the event object argument.", this,(short) -1);
}
return false;
}
private void loadConfiguration(DialogAccess dlg) {
RegistryHelper registry = new RegistryHelper(xContext);
try {
Object view = registry.getRegistryView(REGISTRY_PATH, false);
XPropertySet xProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class,view);
dlg.setListBoxSelectedItem("XhtmlFormat",
XPropertySetHelper.getPropertyValueAsShort(xProps, "XhtmlFormat"));
dlg.setListBoxSelectedItem("XhtmlView",
XPropertySetHelper.getPropertyValueAsShort(xProps, "XhtmlView"));
dlg.setTextFieldText("XhtmlExecutable",
XPropertySetHelper.getPropertyValueAsString(xProps, "XhtmlExecutable"));
dlg.setListBoxSelectedItem("EpubFormat",
XPropertySetHelper.getPropertyValueAsShort(xProps, "EpubFormat"));
dlg.setListBoxSelectedItem("EpubView",
XPropertySetHelper.getPropertyValueAsShort(xProps, "EpubView"));
dlg.setTextFieldText("EpubExecutable",
XPropertySetHelper.getPropertyValueAsString(xProps, "EpubExecutable"));
} catch (Exception e) {
// Failed to get registry view
}
}
private void saveConfiguration(DialogAccess dlg) {
RegistryHelper registry = new RegistryHelper(xContext);
try {
Object view = registry.getRegistryView(REGISTRY_PATH, true);
XPropertySet xProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class,view);
XPropertySetHelper.setPropertyValue(xProps, "XhtmlFormat", dlg.getListBoxSelectedItem("XhtmlFormat"));
XPropertySetHelper.setPropertyValue(xProps, "XhtmlView", dlg.getListBoxSelectedItem("XhtmlView"));
XPropertySetHelper.setPropertyValue(xProps, "XhtmlExecutable", dlg.getTextFieldText("XhtmlExecutable"));
XPropertySetHelper.setPropertyValue(xProps, "EpubFormat", dlg.getListBoxSelectedItem("EpubFormat"));
XPropertySetHelper.setPropertyValue(xProps, "EpubView", dlg.getListBoxSelectedItem("EpubView"));
XPropertySetHelper.setPropertyValue(xProps, "EpubExecutable", dlg.getTextFieldText("EpubExecutable"));
// Commit registry changes
XChangesBatch xUpdateContext = (XChangesBatch)
UnoRuntime.queryInterface(XChangesBatch.class,view);
try {
xUpdateContext.commitChanges();
}
catch (Exception e) {
// ignore
}
registry.disposeRegistryView(view);
}
catch (Exception e) {
// Failed to get registry view
}
}
private boolean xhtmlViewChange(DialogAccess dlg) {
enableXhtmlExecutable(dlg);
return true;
}
private void enableXhtmlExecutable(DialogAccess dlg) {
int nItem = dlg.getListBoxSelectedItem("XhtmlView");
dlg.setControlEnabled("XhtmlExecutable", nItem==2);
dlg.setControlEnabled("XhtmlBrowseButton", nItem==2);
}
private boolean xhtmlBrowseClick(DialogAccess dlg) {
browseForExecutable(dlg,"XhtmlExecutable");
return true;
}
private boolean epubViewChange(DialogAccess dlg) {
enableEpubExecutable(dlg);
return true;
}
private void enableEpubExecutable(DialogAccess dlg) {
int nItem = dlg.getListBoxSelectedItem("EpubView");
dlg.setControlEnabled("EpubExecutable", nItem==2);
dlg.setControlEnabled("EpubBrowseButton", nItem==2);
}
private boolean epubBrowseClick(DialogAccess dlg) {
browseForExecutable(dlg,"EpubExecutable");
return true;
}
private boolean browseForExecutable(DialogAccess dlg, String sControlName) {
String sPath = filePicker.getPath();
if (sPath!=null) {
try {
dlg.setComboBoxText(sControlName, new File(new URI(sPath)).getCanonicalPath());
}
catch (IOException e) {
}
catch (URISyntaxException e) {
}
}
return true;
}
}

View file

@ -16,11 +16,11 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
* Copyright: 2002-2014 by Henrik Just
* Copyright: 2002-2015 by Henrik Just
*
* All Rights Reserved.
*
* Version 1.6 (2014-10-06)
* Version 1.6 (2015-04-03)
*
*/
@ -114,6 +114,12 @@ public class W2XRegistration {
multiFactory,
regKey);
}
else if (implName.equals(ToolbarSettingsDialog.__implementationName)) {
xSingleServiceFactory = FactoryHelper.getServiceFactory(ToolbarSettingsDialog.class,
ToolbarSettingsDialog.__serviceName,
multiFactory,
regKey);
}
return xSingleServiceFactory;
}
@ -145,7 +151,9 @@ public class W2XRegistration {
FactoryHelper.writeRegistryServiceInfo(EpubMetadataDialog.__implementationName,
EpubMetadataDialog.__serviceName, regKey) &
FactoryHelper.writeRegistryServiceInfo(ConfigurationDialog.__implementationName,
ConfigurationDialog.__serviceName, regKey);
ConfigurationDialog.__serviceName, regKey) &
FactoryHelper.writeRegistryServiceInfo(ToolbarSettingsDialog.__implementationName,
ToolbarSettingsDialog.__serviceName, regKey);
}
}

View file

@ -20,7 +20,7 @@
*
* All Rights Reserved.
*
* Version 1.6 (2015-01-09)
* Version 1.6 (2015-04-05)
*
*/
@ -28,6 +28,7 @@ package org.openoffice.da.comp.writer2xhtml;
// TODO: Create common base for dispatcher classes
import com.sun.star.beans.XPropertySet;
import com.sun.star.frame.XFrame;
import com.sun.star.lang.XComponent;
import com.sun.star.lib.uno.helper.WeakBase;
@ -36,6 +37,8 @@ import com.sun.star.uno.Exception;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import org.openoffice.da.comp.w2lcommon.filter.UNOPublisher.TargetFormat;
import org.openoffice.da.comp.w2lcommon.helper.RegistryHelper;
import org.openoffice.da.comp.w2lcommon.helper.XPropertySetHelper;
/** This class implements the ui (dispatch) commands provided by Writer2xhtml.
*/
@ -57,10 +60,6 @@ public final class Writer2xhtml extends WeakBase
public static final String __serviceName = "com.sun.star.frame.ProtocolHandler";
private static final String[] m_serviceNames = { __serviceName };
// TODO: These should be configurable
private TargetFormat xhtmlFormat = TargetFormat.html5;
private TargetFormat epubFormat = TargetFormat.epub3;
public Writer2xhtml(XComponentContext xContext) {
m_xContext = xContext;
}
@ -129,11 +128,11 @@ public final class Writer2xhtml extends WeakBase
com.sun.star.beans.PropertyValue[] aArguments ) {
if ( aURL.Protocol.compareTo(PROTOCOL) == 0 ) {
if ( aURL.Path.compareTo("PublishAsXHTML") == 0 ) {
publish(xhtmlFormat);
publishAsXhtml();
return;
}
else if ( aURL.Path.compareTo("PublishAsEPUB") == 0 ) {
publish(epubFormat);
publishAsEpub();
return;
}
else if ( aURL.Path.compareTo("EditEPUBDocumentProperties") == 0 ) {
@ -168,6 +167,39 @@ public final class Writer2xhtml extends WeakBase
}
}
private void publishAsXhtml() {
RegistryHelper registry = new RegistryHelper(m_xContext);
try {
Object view = registry.getRegistryView(ToolbarSettingsDialog.REGISTRY_PATH, false);
XPropertySet xProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class,view);
short nXhtmlFormat = XPropertySetHelper.getPropertyValueAsShort(xProps, "XhtmlFormat");
switch (nXhtmlFormat) {
case 0: publish(TargetFormat.xhtml); break;
case 1: publish(TargetFormat.xhtml11); break;
case 2: publish(TargetFormat.xhtml_mathml); break;
case 3: publish(TargetFormat.html5);
}
} catch (Exception e) {
// Failed to get registry view
}
}
private void publishAsEpub() {
RegistryHelper registry = new RegistryHelper(m_xContext);
try {
Object view = registry.getRegistryView(ToolbarSettingsDialog.REGISTRY_PATH, false);
XPropertySet xProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class,view);
short nEpubFormat = XPropertySetHelper.getPropertyValueAsShort(xProps, "EpubFormat");
switch (nEpubFormat) {
case 0: publish(TargetFormat.epub); break;
case 1: publish(TargetFormat.epub3);
}
} catch (Exception e) {
// Failed to get registry view
}
}
private void publish(TargetFormat format) {
if (unoPublisher==null) {
unoPublisher = new XhtmlUNOPublisher(m_xContext,m_xFrame,"Writer2xhtml");

View file

@ -16,11 +16,11 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
* Copyright: 2002-2014 by Henrik Just
* Copyright: 2002-2015 by Henrik Just
*
* All Rights Reserved.
*
* Version 1.6 (2014-11-03)
* Version 1.6 (2015-04-05)
*
*/
package org.openoffice.da.comp.writer2xhtml;
@ -28,13 +28,20 @@ package org.openoffice.da.comp.writer2xhtml;
import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import java.util.Vector;
import org.openoffice.da.comp.w2lcommon.filter.UNOPublisher;
import org.openoffice.da.comp.w2lcommon.helper.MessageBox;
import org.openoffice.da.comp.w2lcommon.helper.RegistryHelper;
import org.openoffice.da.comp.w2lcommon.helper.StreamGobbler;
import org.openoffice.da.comp.w2lcommon.helper.XPropertySetHelper;
import writer2latex.util.Misc;
import com.sun.star.beans.XPropertySet;
import com.sun.star.frame.XFrame;
import com.sun.star.uno.Exception;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
public class XhtmlUNOPublisher extends UNOPublisher {
@ -44,27 +51,97 @@ public class XhtmlUNOPublisher extends UNOPublisher {
}
/** Display the converted document in the default application
/** Display the converted document depending on user settings
*
* @param sURL the URL of the converted document
* @param format the target format
*/
@Override protected void postProcess(String sURL) {
@Override protected void postProcess(String sURL, TargetFormat format) {
RegistryHelper registry = new RegistryHelper(xContext);
short nView = 1;
String sExecutable = null;
try {
Object view = registry.getRegistryView(ToolbarSettingsDialog.REGISTRY_PATH, false);
XPropertySet xProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class,view);
if (format==TargetFormat.xhtml || format==TargetFormat.xhtml11 || format==TargetFormat.xhtml_mathml || format==TargetFormat.html5) {
nView = XPropertySetHelper.getPropertyValueAsShort(xProps, "XhtmlView");
sExecutable = XPropertySetHelper.getPropertyValueAsString(xProps, "XhtmlExecutable");
}
else { // EPUB
nView = XPropertySetHelper.getPropertyValueAsShort(xProps, "EpubView");
sExecutable = XPropertySetHelper.getPropertyValueAsString(xProps, "EpubExecutable");
}
} catch (Exception e) {
// Failed to get registry view
}
File file = Misc.urlToFile(sURL);
if (file.exists()) {
// Open the file in the default application on this system (if any)
if (Desktop.isDesktopSupported()) {
Desktop desktop = Desktop.getDesktop();
try {
desktop.open(file);
} catch (IOException e) {
System.err.println(e.getMessage());
}
}
}
else {
MessageBox msgBox = new MessageBox(xContext, xFrame);
msgBox.showMessage("Writer2xhtml","Error: Failed to open exported document");
if (nView==0) {
return;
}
else if (nView==1) {
if (openWithDefaultApplication(file)) {
return;
}
}
else if (nView==2) {
if (openWithCustomApplication(file, sExecutable)) {
return;
}
}
}
MessageBox msgBox = new MessageBox(xContext, xFrame);
msgBox.showMessage("Writer2xhtml","Error: Failed to open exported document");
}
// Open the file in the default application on this system (if any)
private boolean openWithDefaultApplication(File file) {
if (Desktop.isDesktopSupported()) {
Desktop desktop = Desktop.getDesktop();
try {
desktop.open(file);
return true;
} catch (IOException e) {
System.err.println(e.getMessage());
}
}
return false;
}
// Open the file with the user defined application
private boolean openWithCustomApplication(File file, String sExecutable) {
try {
Vector<String> command = new Vector<String>();
command.add(sExecutable);
command.add(file.getPath());
ProcessBuilder pb = new ProcessBuilder(command);
Process proc = pb.start();
// Gobble the error stream of the application
StreamGobbler errorGobbler = new
StreamGobbler(proc.getErrorStream(), "ERROR");
// Gobble the output stream of the application
StreamGobbler outputGobbler = new
StreamGobbler(proc.getInputStream(), "OUTPUT");
errorGobbler.start();
outputGobbler.start();
// The application exists if the process exits with 0
return proc.waitFor()==0;
}
catch (InterruptedException e) {
return false;
}
catch (IOException e) {
return false;
}
}
}