2011-07-13 58 views
6

是有關於如何在Java構建openoffice的複雜工具欄在網絡上的任何的例子嗎? 我發現的例子在C++中,但沒有在Java中 :http://wiki.services.openoffice.org/wiki/Framework/Article/Generic_UNO_Interfaces_for_complex_toolbar_controlsOpenOffice的複雜工具欄

我需要關於如何建立和麪向對象的插件,使用複雜的工具欄在Java

我發現這篇文章http://java.dzone.com/news/lets-extend-openofficeorg-java#comment-53245它實現了一個文章或教程java PopupMenuController。我試圖做同樣的過程,但使用XToolbarController代替PopupMenuController。但是我無法讓我的控制器插件工作。下面 是我controller.xcu和控制器類。 你能告訴我在做什麼錯? 謝謝。

我Controller.xcu:

<?xml version="1.0" encoding="UTF-8"?> 
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" oor:name="Controller" oor:package="org.openoffice.Office.UI"> 
    <node oor:name="Registered"> 
    <node oor:name="ToolBar"> 
     <node oor:name="c10" oor:op="replace"> 
     <prop oor:name="Command"> 
      <value>.uno:CommandLineToolbar</value> 
     </prop> 
     <prop oor:name="Module"> 
      <value></value> 
     </prop> 
     <prop oor:name="Controller"> 
       <value>com.example.toolbar.Toolbar</value> 
     </prop> 
     </node> 
    </node> 
    </node> 
</oor:component-data> 

我的工具欄控制器類:

public final class Toolbar extends ComponentBase 
    implements com.sun.star.util.XUpdatable, 
       com.sun.star.frame.XToolbarController, 
       com.sun.star.frame.XStatusListener, 
       com.sun.star.lang.XServiceInfo, 
       com.sun.star.lang.XInitialization, 
       com.sun.star.frame.XSubToolbarController 
{ 
    private final XComponentContext m_xContext; 
    private static final String m_implementationName = Toolbar.class.getName(); 
    private static final String[] m_serviceNames = { 
     &quot;com.sun.star.frame.ToolbarController&quot; }; 
private String msInternalName = &quot;i do not now&quot;; 
    private XComponent mxDocument; 
    private XTextComponent fixedText; 
    private XComboBox cBox_xComboBox; 
private XMultiComponentFactory mxMCF; 
    public XMultiServiceFactory mxMSF; 
    public Toolbar(XComponentContext context) 
    { 
     m_xContext = context; 

    }; 

    public static XSingleComponentFactory __getComponentFactory(String sImplementationName) { 
     XSingleComponentFactory xFactory = null; 

     if (sImplementationName.equals(m_implementationName)) 
      xFactory = Factory.createComponentFactory(Toolbar.class, m_serviceNames); 
     return xFactory; 
    } 

    public static boolean __writeRegistryServiceInfo(XRegistryKey xRegistryKey) { 
     return Factory.writeRegistryServiceInfo(m_implementationName, 
               m_serviceNames, 
               xRegistryKey); 
    } 

    // com.sun.star.util.XUpdatable: 
    public void update() 
    { 
     // TODO: Insert your implementation for &quot;update&quot; here. 
    } 

    // com.sun.star.frame.XToolbarController: 
    public void execute(short KeyModifier) 
    { 
     // TODO: Insert your implementation for &quot;execute&quot; here. 
    } 

    public void click() 
    { 
     // TODO: Insert your implementation for &quot;click&quot; here. 
    } 

    public void doubleClick() 
    { 
     // TODO: Insert your implementation for &quot;doubleClick&quot; here. 
    } 

    public com.sun.star.awt.XWindow createPopupWindow() 
    { 
     // TODO: Exchange the default return implementation for &quot;createPopupWindow&quot; !!! 
     // NOTE: Default initialized polymorphic structs can cause problems 
     // because of missing default initialization of primitive types of 
     // some C++ compilers or different Any initialization in Java and C++ 
     // polymorphic structs. 
     return null; 
    } 

    public com.sun.star.awt.XWindow createItemWindow(com.sun.star.awt.XWindow Parent) 
    { 
     System.out.println(&quot;ToolbarCombobox createItemWindow start&quot;); 
     Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); 

// xMSF is set by initialize(Object[]) 
     try { 
// get XWindowPeer 
     XWindowPeer xWinPeer = (XWindowPeer) UnoRuntime.queryInterface(XWindowPeer.class, Parent); 
     Object o = mxMSF.createInstance(&quot;com.sun.star.awt.Toolkit&quot;); 
     XToolkit xToolkit = (XToolkit) UnoRuntime.queryInterface(XToolkit.class, o); 
// create WindowDescriptor 
     WindowDescriptor wd = new WindowDescriptor(); 
     wd.Type = WindowClass.SIMPLE; 
     wd.Parent = xWinPeer; 
     wd.Bounds = new Rectangle(0, 0, 230, 23); 
     wd.ParentIndex = (short) -1; 
     wd.WindowAttributes = WindowAttribute.SHOW |VclWindowPeerAttribute .DROPDOWN; 
     wd.WindowServiceName = &quot;combobox&quot;; 
// create ComboBox 
     XWindowPeer cBox_xWinPeer = xToolkit.createWindow(wd); 
     cBox_xComboBox = (XComboBox) UnoRuntime.queryInterface(XComboBox.class, cBox_xWinPeer); 
// Get Interface for manipulating the text in the combobox 
     fixedText = (XTextComponent)UnoRuntime.queryInterface(XTextComponent.class,cBox_xComboBox); 
     fixedText.setText(&quot;Enter Command Here&quot;); 
     XWindow cBox_xWindow = (XWindow) UnoRuntime.queryInterface(XWindow.class, cBox_xWinPeer); 
// add some elements 
     cBox_xComboBox.addItems(new String[] { &quot;test&quot;, &quot;foo&quot;, &quot;bar&quot;, &quot;test2&quot;, &quot;foo2&quot;, &quot;bar2&quot; }, (short) 0); 
// cBox_xComboBox.addItems(new String[] {&quot;&quot;}, (short) 4); 
     cBox_xComboBox.setDropDownLineCount((short) 6); 
     //cBox_xWindow.addKeyListener(this); 

     System.out.println(&quot;ToolbarCombobox createItemWindow end&quot;); 

     return cBox_xWindow; 

     } catch (com.sun.star.uno.Exception e) { 
     System.out.println(&quot;ToolbarCombobox createItemWindow end not o.k.&quot;); 
     return null; } 
    } 

    // com.sun.star.lang.XEventListener: 
    public void disposing(com.sun.star.lang.EventObject Source) 
    { 
     // TODO: Insert your implementation for &quot;disposing&quot; here. 
    } 

    // com.sun.star.frame.XStatusListener: 
    public void statusChanged(com.sun.star.frame.FeatureStateEvent State) 
    { 
     // TODO: Insert your implementation for &quot;statusChanged&quot; here. 
    } 

    // 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 &lt; len; i++) { 
      if (sService.equals(m_serviceNames[i])) 
       return true; 
     } 
     return false; 
    } 

    public String[] getSupportedServiceNames() { 
     return m_serviceNames; 
    } 

    // com.sun.star.lang.XInitialization: 
    public void initialize(Object[] aArguments) throws com.sun.star.uno.Exception 
    { 
     if (aArguments.length &gt; 0) 
     { 
      mxMCF = m_xContext.getServiceManager(); 

      mxMSF = (XMultiServiceFactory) UnoRuntime.queryInterface(XMultiServiceFactory.class, mxMCF); 
     } 

    } 

    // com.sun.star.frame.XSubToolbarController: 
    public boolean opensSubToolbar() 
    { 
     // TODO: Exchange the default return implementation for &quot;opensSubToolbar&quot; !!! 
     // NOTE: Default initialized polymorphic structs can cause problems 
     // because of missing default initialization of primitive types of 
     // some C++ compilers or different Any initialization in Java and C++ 
     // polymorphic structs. 
     return false; 
    } 

    public String getSubToolbarName() 
    { 
     // TODO: Exchange the default return implementation for &quot;getSubToolbarName&quot; !!! 
     // NOTE: Default initialized polymorphic structs can cause problems 
     // because of missing default initialization of primitive types of 
     // some C++ compilers or different Any initialization in Java and C++ 
     // polymorphic structs. 
     return new String(); 
    } 

    public void functionSelected(String aCommand) 
    { 
     // TODO: Insert your implementation for &quot;functionSelected&quot; here. 
    } 

    public void updateImage() 
    { 
     // TODO: Insert your implementation for &quot;updateImage&quot; here. 
    } 

} 

回答

0

的解決方案是以下使用Addons.xcu文件。在Addons.xcu應該有一個屬性「URL」來引用Controller.xcu「命令」屬性。

<?xml version='1.0' encoding='UTF-8'?> 
<oor:component-data xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema" oor:name="Addons" oor:package="org.openoffice.Office"> 
<node oor:name="AddonUI"> 
    <node oor:name="OfficeToolBar"> 
     <node oor:name="com.example.toolbar.ToolbarAddOn" oor:op="replace"> 
      <node oor:name="a1_0" oor:op="replace"> 
       <prop oor:name="URL"> 
        <value>.uno:CommandLineToolbar</value> 
       </prop> 
       <prop oor:name="Title"> 
        <value>Text</value> 
       </prop> 
       <prop oor:name="Context" oor:type="xs:string"> 
        <value></value> 
       </prop> 
      </node> 
     </node> 
    </node> 
</node> 
</oor:component-data> 
0

不是一篇文章,但是這傢伙似乎已經想通了:http://www.oooforum.org/forum/viewtopic.phtml?t=85610

+0

我看到這個帖子,但它不是很有幫助。他以另一種方式進行。我有興趣做的,而是爲ToolbarController就像是爲PopupMenuController做在http://java.dzone.com/news/lets-extend-openofficeorg-java#comment-53245 – othman

+0

我懷疑它與controller.xcu做。爲「Command」元素放置什麼? ' com.example.toolbar:Toolbar ' – othman