openoffice java中的复杂工具栏

oth*_*man 6 java openoffice.org

在网上有关于如何在Java中构建openoffice复杂工具栏的任何示例吗?我在C++中找到了一些例子但在Java中没有:http: //wiki.services.openoffice.org/wiki/Framework/Article/Generic_UNO_Interfaces_for_complex_toolbar_controls

我需要一篇关于如何构建和使用java中的复杂工具栏的OO插件的文章或教程

我发现这篇文章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>
Run Code Online (Sandbox Code Playgroud)

我的工具栏控制器类:

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.
    }

}
Run Code Online (Sandbox Code Playgroud)

oth*_*man 0

解决方案是使用如下所示的 Addons.xcu 文件。Addons.xcu 应该有一个属性“URL”来引用 Controller.xcu 中的“Command”属性。

<?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>
Run Code Online (Sandbox Code Playgroud)