Top > Extensions > Sidebar
* サイドバー [#y6df0db0]

Apache OpenOffice 4.0 で追加されたサイドバーに独自のデッキやパネルを拡張機能で追加できます。パネルの実装にはコンポーネントが必要なため、マクロのみでは実装できません。

#contents

** 用語 [#r5299a64]
:サイドバー|一連のウィンドウを表示する部分です
:デッキ|タブで切り替えられるウィンドウ部分で内部に一つまたは複数のパネルを表示します
:パネル|デッキ内に表示されるウィンドウです
:タブバー|サイドバーの端にあるボタンが並んだ部分で表示するデッキを切り替えます
:タブ|各デッキごとにタブがあり、表示するデッキを切り替えます
:タイトルバー|デッキの上の部分にあるデッキ名を表示する部分です
:パネルタイトル|各パネルの上の部分に表示され、この部分でパネルを開閉できます。デッキにパネルがひとつしかない場合に非表示にすることもできます

以下の画像も参照。
http://wiki.openoffice.org/wiki/File:SidebarNames.png


** コンフィグレーション [#p773bf07]
サイドバーをどこに表示するかといった情報はコンフィグレーション /org.openoffice.Office.UI.Sidebar/Content で指定します。

項目の詳細は以下参照。
- http://svn.apache.org/viewvc/openoffice/trunk/main/officecfg/registry/schema/org/openoffice/Office/UI/Sidebar.xcs?view=markup
- http://svn.apache.org/viewvc/openoffice/trunk/main/officecfg/registry/data/org/openoffice/Office/UI/Sidebar.xcu?view=markup

以下の例では、独自のデッキ (デッキ名 MytoolsDeck) を追加、そこに二つのパネルを表示します。
要点をまとめておきます。
- DeckList ノードの子ノードに独自の名前のノードを定義してデッキを追加します。
- PanelList ノードの子ノードに独自の名前のノードを定義してパネルを追加します。
- パネルの DeckId に表示したいデッキの Id (MytoolsDeck) を指定
- ContextList については上記 Sidebar.xcs のリンク参照。
- パネルの TitleBarIsOptional プロパティを true にすると、デッキにパネルがひとつしか無い時にパネルのタイトルバーが表示されなくなります。
- OrderIndex は数値が 0 に近い方が上に表示されます。
- パネルの ImplementationURL でそのパネルを生成するコンポーネントが指定されます。次の Factory でコンポーネントと結びつけます。

#code(xcu){{
<?xml version="1.0" encoding="UTF-8"?>
<oor:component-data
oor:name="Sidebar"
oor:package="org.openoffice.Office.UI"
xmlns:oor="http://openoffice.org/2001/registry"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <node oor:name="Content">
    <node oor:name="DeckList">
      <node oor:name="MytoolsDeck" oor:op="replace">
        <prop oor:name="Title" oor:type="xs:string">
          <value xml:lang="en-US">My Deck</value>
        </prop>
        <prop oor:name="Id" oor:type="xs:string">
          <value>MytoolsDeck</value>
        </prop>
        <prop oor:name="IconURL" oor:type="xs:string">
          <value>vnd.sun.star.extension://mytools.ui.test.SidebarByMacros/icon1.png</value>
        </prop>
        <prop oor:name="HighContrastIconURL" oor:type="xs:string">
          <value>vnd.sun.star.extension://mytools.ui.test.SidebarByMacros/icon1.png</value>
        </prop>
        <prop oor:name="ContextList">
          <value oor:separator=";">
            Writer, any, visible ;
          </value>
        </prop>
        <prop oor:name="OrderIndex" oor:type="xs:int">
          <value>500</value>
        </prop>
      </node>
    </node>
    <node oor:name="PanelList">
      <node oor:name="MyPanel1" oor:op="replace">
        <prop oor:name="Title" oor:type="xs:string">
          <value xml:lang="en-US">My Panel 1</value>
        </prop>
        <prop oor:name="TitleBarIsOptional" oor:type="xs:boolean">
          <value>false</value>
        </prop>
        <prop oor:name="Id" oor:type="xs:string">
          <value>MyPanel1</value>
        </prop>
        <prop oor:name="DeckId" oor:type="xs:string">
          <value>MytoolsDeck</value>
        </prop>
        <prop oor:name="ContextList">
          <value oor:separator=";">
            Writer, any, visible ;
          </value>
        </prop>
        <prop oor:name="ImplementationURL" oor:type="xs:string">
          <value>private:resource/toolpanel/foo.bar/MyPanel1</value>
        </prop>
        <prop oor:name="OrderIndex" oor:type="xs:int">
          <value>100</value>
        </prop>
      </node>
    </node>
    <node oor:name="PanelList">
      <node oor:name="MyPanel2" oor:op="replace">
        <prop oor:name="Title" oor:type="xs:string">
          <value xml:lang="en-US">My Panel 2</value>
        </prop>
        <prop oor:name="TitleBarIsOptional" oor:type="xs:boolean">
          <value>false</value>
        </prop>
        <prop oor:name="Id" oor:type="xs:string">
          <value>MyPanel2</value>
        </prop>
        <prop oor:name="DeckId" oor:type="xs:string">
          <value>MytoolsDeck</value>
        </prop>
        <prop oor:name="ContextList">
          <value oor:separator=";">
            Writer, any, visible ;
          </value>
        </prop>
        <prop oor:name="ImplementationURL" oor:type="xs:string">
          <value>private:resource/toolpanel/foo.bar/MyPanel2</value>
        </prop>
        <prop oor:name="OrderIndex" oor:type="xs:int">
          <value>110</value>
        </prop>
      </node>
    </node>
  </node>
</oor:component-data>
}}

パネルの ImplementationURL プロパティで指定された値を処理してパネルをインスタンス化するコンポーネントを登録します。UIElementFactories ノードの独自名の子ノードの名前は他のものと衝突しなければ好きな名前でかまいません (リソース URL の一部といった名前にする必要はありません)。
- Type を toolpanel に
- Name が private:resource/toolpanel/NAME/hoge の NAME 部分に一致するリソースのみ、コンポーネントに処理要求が来ます。 
- Module ドキュメントの種類
- 処理する FactoryImplementation 実装名を指定します。css.ui.XUIElementFactory インターフェースをサポートしている必要があります。以下参照。

#code(xcu){{
<?xml version='1.0' encoding='UTF-8'?>
<oor:component-data 
    xmlns:install="http://openoffice.org/2004/installation" 
    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="Factories" 
    oor:package="org.openoffice.Office.UI">
    <node oor:name="Registered">
        <node oor:name="UIElementFactories">
            <node oor:name="private:resource/toolpanel/foo.bar" oor:op="replace">
                <prop oor:name="Type">
                    <value>toolpanel</value>
                </prop>
                <prop oor:name="Name">
                    <value>foo.bar</value>
                </prop>
                <prop oor:name="Module">
                    <value>com.sun.star.text.TextDocument</value>
                </prop>
                <prop oor:name="FactoryImplementation">
                    <value>mytools.ui.SidebarHelperForMacros</value>
                </prop>
            </node>
        </node>
    </node>
</oor:component-data>
}}
** コンポーネント [#lb12d5b8]

/org.openoffice.Office.UI.Factories に登録したコンポーネントはファクトリで、要求に応じて生成した要素を返します。以下のインターフェースが利用されます。各インターフェースについては各々のリファレンス参照。

- &idlref(com.sun.star.ui.XUIElementFactory);

createUIElement メソッドの返り値のコンポーネントは以下のインターフェースをサポートしている必要があります。

- &idlref(com.sun.star.ui.XUIElement);
-- 他の XUIElement を必要とする場合と同じ
- &idlref(com.sun.star.ui.XToolPanel);
-- 同上。Window 属性がパネルのウィンドウを返すようにします。
- &idlref(com.sun.star.ui.XSidebarPanel);
-- getHeightForWidth メソッドの返り値でパネルの表示中の高さが決まります。

css.ui.XSidebarPanel::getHeightForWidth の返り値には注意が必要です。
- 引数で与えられる幅に対して必要な高さを返さないと、パネルがおかしな表示になります。
- デッキにパネルがひとつで、そのパネルがデッキ全体を専有するように表示したい場合、css.ui.LayoutSize(0, -1, 0) を返してください。パネルが複数ある場合に LayoutSize(0, -1, 0) を返すと、パネルの高さは均等に割り当てられるようです。
** 例 [#x06904b3]
以下など。

- https://github.com/hanya/ww

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes