【问题标题】:openoffice Complex toolbar in javajava中的openoffice复杂工具栏
【发布时间】:2011-07-13 16:58:32
【问题描述】:

网上有没有关于如何用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>

我的工具栏控制器类:

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

}

【问题讨论】:

    标签: java openoffice.org


    【解决方案1】:

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

    【讨论】:

    • 我看到了这个帖子,但它不是很有帮助。他正在以另一种方式做到这一点。我有兴趣为 ToolbarController 做这件事,就像在 java.dzone.com/news/… 为 PopupMenuController 做的一样@
    • 我怀疑它与 controller.xcu 有关。为“命令”元素添加什么? &lt;prop oor:name="Command"&gt; &lt;value&gt;com.example.toolbar:Toolbar&lt;/value&gt; &lt;/prop&gt;
    【解决方案2】:

    解决方案是使用 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 2022-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      相关资源
      最近更新 更多