From 62f2b970976538a4189cf6e469461d64a6b49ed7 Mon Sep 17 00:00:00 2001 From: Georgy Litvinov Date: Mon, 27 Jul 2020 14:33:41 +0200 Subject: [PATCH] Started working on GUI --- .../w2phtml/RegistrationHandler.classes | 1 + .../w2phtml/RegistrationHandler.java | 175 ++++++++++++++++++ .../litvinovg/w2phtml/W2PHTMLExtension.java | 97 ++++++++++ .../w2phtml/gui/ConfigurationWindow.java | 98 ++++++++++ .../w2phtml/gui/resources/w2phtml.png | Bin 0 -> 13721 bytes 5 files changed, 371 insertions(+) create mode 100644 src/main/java/pro/litvinovg/w2phtml/RegistrationHandler.classes create mode 100644 src/main/java/pro/litvinovg/w2phtml/RegistrationHandler.java create mode 100644 src/main/java/pro/litvinovg/w2phtml/W2PHTMLExtension.java create mode 100644 src/main/java/pro/litvinovg/w2phtml/gui/ConfigurationWindow.java create mode 100644 src/main/java/pro/litvinovg/w2phtml/gui/resources/w2phtml.png diff --git a/src/main/java/pro/litvinovg/w2phtml/RegistrationHandler.classes b/src/main/java/pro/litvinovg/w2phtml/RegistrationHandler.classes new file mode 100644 index 0000000..83a68b8 --- /dev/null +++ b/src/main/java/pro/litvinovg/w2phtml/RegistrationHandler.classes @@ -0,0 +1 @@ +pro.litvinovg.w2phtml.W2PHTMLExtension diff --git a/src/main/java/pro/litvinovg/w2phtml/RegistrationHandler.java b/src/main/java/pro/litvinovg/w2phtml/RegistrationHandler.java new file mode 100644 index 0000000..f563e6d --- /dev/null +++ b/src/main/java/pro/litvinovg/w2phtml/RegistrationHandler.java @@ -0,0 +1,175 @@ +/************************************************************************* + * + * The Contents of this file are made available subject to the terms of + * either of the GNU Lesser General Public License Version 2.1 + * + * Sun Microsystems Inc., October, 2000 + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * 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 + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. + * + * Copyright: 2002 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): Cedric Bosdonnat + * + * + ************************************************************************/ +package pro.litvinovg.w2phtml; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.LineNumberReader; +import java.lang.reflect.Method; +import java.util.ArrayList; + +import com.sun.star.lang.XSingleComponentFactory; +import com.sun.star.registry.XRegistryKey; + +/** + * Component main registration class. + * + *

This class should not be modified.

+ * + * @author Cedric Bosdonnat aka. cedricbosdo + * + */ +public class RegistrationHandler { + + /** + * Get a component factory for the implementations handled by this class. + * + *

This method calls all the methods of the same name from the classes listed + * in the RegistrationHandler.classes file. This method + * should not be modified.

+ * + * @param pImplementationName the name of the implementation to create. + * + * @return the factory which can create the implementation. + */ + public static XSingleComponentFactory __getComponentFactory(String sImplementationName ) { + XSingleComponentFactory xFactory = null; + + Class[] classes = findServicesImplementationClasses(); + + int i = 0; + while (i < classes.length && xFactory == null) { + Class clazz = classes[i]; + if ( sImplementationName.equals( clazz.getCanonicalName() ) ) { + try { + Class[] getTypes = new Class[]{String.class}; + Method getFactoryMethod = clazz.getMethod("__getComponentFactory", getTypes); + Object o = getFactoryMethod.invoke(null, sImplementationName); + xFactory = (XSingleComponentFactory)o; + } catch (Exception e) { + // Nothing to do: skip + System.err.println("Error happened"); + e.printStackTrace(); + } + } + i++; + } + return xFactory; + } + + /** + * Writes the services implementation informations to the UNO registry. + * + *

This method calls all the methods of the same name from the classes listed + * in the RegistrationHandler.classes file. This method + * should not be modified.

+ * + * @param pRegistryKey the root registry key where to write the informations. + * + * @return true if the informations have been successfully written + * to the registry key, false otherwise. + */ + public static boolean __writeRegistryServiceInfo(XRegistryKey xRegistryKey ) { + + Class[] classes = findServicesImplementationClasses(); + + boolean success = true; + int i = 0; + while (i < classes.length && success) { + Class clazz = classes[i]; + try { + Class[] writeTypes = new Class[]{XRegistryKey.class}; + Method getFactoryMethod = clazz.getMethod("__writeRegistryServiceInfo", writeTypes); + Object o = getFactoryMethod.invoke(null, xRegistryKey); + success = success && ((Boolean)o).booleanValue(); + } catch (Exception e) { + success = false; + e.printStackTrace(); + } + i++; + } + return success; + } + + /** + * @return all the UNO implementation classes. + */ + private static Class[] findServicesImplementationClasses() { + + ArrayList classes = new ArrayList(); + + InputStream in = RegistrationHandler.class.getResourceAsStream("RegistrationHandler.classes"); + LineNumberReader reader = new LineNumberReader(new InputStreamReader(in)); + + try { + String line = reader.readLine(); + while (line != null) { + if (!line.equals("")) { + line = line.trim(); + try { + Class clazz = Class.forName(line); + + Class[] writeTypes = new Class[]{XRegistryKey.class}; + Class[] getTypes = new Class[]{String.class}; + + Method writeRegMethod = clazz.getMethod("__writeRegistryServiceInfo", writeTypes); + Method getFactoryMethod = clazz.getMethod("__getComponentFactory", getTypes); + + if (writeRegMethod != null && getFactoryMethod != null) { + classes.add(clazz); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + line = reader.readLine(); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + reader.close(); + in.close(); + } catch (Exception e) {}; + } + + return classes.toArray(new Class[classes.size()]); + } +} diff --git a/src/main/java/pro/litvinovg/w2phtml/W2PHTMLExtension.java b/src/main/java/pro/litvinovg/w2phtml/W2PHTMLExtension.java new file mode 100644 index 0000000..a9a86c1 --- /dev/null +++ b/src/main/java/pro/litvinovg/w2phtml/W2PHTMLExtension.java @@ -0,0 +1,97 @@ +package pro.litvinovg.w2phtml; + +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XComponentContext; + +import pro.litvinovg.w2phtml.gui.ConfigurationWindow; + +import com.sun.star.lib.uno.helper.Factory; + +import java.util.Arrays; +import java.util.Comparator; + +import com.sun.star.beans.Property; +import com.sun.star.beans.XPropertyContainer; +import com.sun.star.beans.XPropertySet; +import com.sun.star.beans.XPropertySetInfo; +import com.sun.star.document.XDocumentProperties; +import com.sun.star.document.XDocumentPropertiesSupplier; +import com.sun.star.frame.XDesktop; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiComponentFactory; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.XSingleComponentFactory; +import com.sun.star.registry.XRegistryKey; +import com.sun.star.lib.uno.helper.WeakBase; + + +public final class W2PHTMLExtension extends WeakBase + implements com.sun.star.lang.XServiceInfo, + com.sun.star.task.XJobExecutor +{ + private final XComponentContext context; + private XDesktop xDesktop; + private XMultiComponentFactory multiComponentFactory; + private XComponent currentDocument; + private XDocumentProperties documentProperties; + private XDocumentPropertiesSupplier documentPropertiesSupplier; + private static final String m_implementationName = W2PHTMLExtension.class.getName(); + private static final String[] m_serviceNames = { "pro.litvinovg.writer2paginatedhtml" }; + + + public W2PHTMLExtension(XComponentContext componentContext) { + context = componentContext; + + }; + + public static XSingleComponentFactory __getComponentFactory( String sImplementationName ) { + XSingleComponentFactory xFactory = null; + + if ( sImplementationName.equals( m_implementationName ) ) + xFactory = Factory.createComponentFactory(W2PHTMLExtension.class, m_serviceNames); + return xFactory; + } + + public static boolean __writeRegistryServiceInfo( XRegistryKey xRegistryKey ) { + return Factory.writeRegistryServiceInfo(m_implementationName, + m_serviceNames, + xRegistryKey); + } + + // com.sun.star.lang.XServiceInfo: + public String getImplementationName() { + return m_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.task.XJobExecutor: + public void trigger(String action) + { + switch (action) { + case "openGUI": + ConfigurationWindow.runGUI(); + break; + default: + } + + } + + + + + + +} diff --git a/src/main/java/pro/litvinovg/w2phtml/gui/ConfigurationWindow.java b/src/main/java/pro/litvinovg/w2phtml/gui/ConfigurationWindow.java new file mode 100644 index 0000000..d5f9f59 --- /dev/null +++ b/src/main/java/pro/litvinovg/w2phtml/gui/ConfigurationWindow.java @@ -0,0 +1,98 @@ +package pro.litvinovg.w2phtml.gui; + +import java.awt.EventQueue; + +import javax.swing.JFrame; +import javax.swing.UIManager; +import java.awt.Toolkit; +import java.awt.GridLayout; +import javax.swing.JTabbedPane; +import javax.swing.JMenuBar; +import javax.swing.JMenu; +import javax.swing.JPanel; + +public class ConfigurationWindow extends JFrame { + + private JFrame frame; + private static JFrame singleFrame = null; + + + /** + * Launch the application. + */ + public static void main(String[] args) { + runGUI(); + /* + * EventQueue.invokeLater(new Runnable() { public void run() { try { + * ConfigurationWindow window = new ConfigurationWindow(); + * window.frame.setVisible(true); } catch (Exception e) { + * e.printStackTrace(); } } }); + */ + } + + /** + * Create the application. + */ + public ConfigurationWindow() { + setTitle("Converter from ODT to HTML, ePub and RDF"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setIconImage(Toolkit.getDefaultToolkit().getImage(ConfigurationWindow.class.getResource("/pro/litvinovg/w2phtml/gui/resources/w2phtml.png"))); + initComponents(); + createEvents(); + } + + private void createEvents() { + // TODO Auto-generated method stub + + } + + private void initComponents() { + getContentPane().setLayout(new GridLayout(1, 0, 0, 0)); + + JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.LEFT); + getContentPane().add(tabbedPane); + + JPanel panel_1 = new JPanel(); + tabbedPane.addTab("HTML", null, panel_1, null); + + JPanel panel = new JPanel(); + tabbedPane.addTab("ePub", null, panel, null); + + JPanel panel_2 = new JPanel(); + tabbedPane.addTab("RDF", null, panel_2, null); + + JMenuBar menuBar = new JMenuBar(); + setJMenuBar(menuBar); + + JMenu mnFile = new JMenu("File"); + menuBar.add(mnFile); + } + + public static void runGUI() { + if (singleFrame != null) { + singleFrame.dispose(); + } + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Throwable e) { + e.printStackTrace(); + } + EventQueue.invokeLater(new Runnable() { + public void run() { + try { + ConfigurationWindow frame = new ConfigurationWindow(); + singleFrame = frame; + frame.setBounds(100, 100, 800, 800); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setVisible(true); + + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + + } + + +} diff --git a/src/main/java/pro/litvinovg/w2phtml/gui/resources/w2phtml.png b/src/main/java/pro/litvinovg/w2phtml/gui/resources/w2phtml.png new file mode 100644 index 0000000000000000000000000000000000000000..586c74c2885fd5d58d496f2cfe3bc2cf190d7536 GIT binary patch literal 13721 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 literal 0 HcmV?d00001