LibreOffice5(66)オプションページを持つ拡張機能の例を作る: その4

ツール→オプション、で表示されるオプションページに新しいオプションダイアログを挿入するOptionsDialog.xcuファイルについて調べます。xcuファイルはファイル名は拡張子以外はどうでもよく、ノード名が重要です。

前の関連記事:LibreOffice5(65)オプションページを持つ拡張機能の例を作る: その3


コンポーネントスキーマノードを確認する


xcuファイルの文法についてはLibreOffice5(30)xcsファイルとxcuファイルとxcdファイル:その1でやりました。

xcuファイルにはコンポーネントデータノードが定義してあります。

コンポーネントデータノードはコンポーネントスキーマノードで定義されているのでそれを確認します。

コンポーネントスキーマノードは/opt/libreoffice5.2/share/registryにあるmain.xcdファイルに書いてあるのでこのファイルをChromiumで開いて整形されるのを待ちます。

OptionsDialogで検索するとoor:name="OptionsDialog"、oor:package="org.openoffice.Office"のノードが見つかります。
<oor:component-schema oor:name="OptionsDialog" oor:package="org.openoffice.Office" xml:lang="en-US">
 <templates>
  <group oor:name="SingleOption">
   <prop oor:name="Hide" oor:type="xs:boolean"/>
  </group>
  <group oor:name="OptionsPage">
   <prop oor:name="Hide" oor:type="xs:boolean"/>
   <set oor:name="Options" oor:node-type="SingleOption"/>
  </group>
  <group oor:name="OptionsGroup">
   <prop oor:name="Hide" oor:type="xs:boolean"/>
   <set oor:name="Pages" oor:node-type="OptionsPage"/>
  </group>
  <group oor:name="Module">
   <set oor:name="Nodes" oor:node-type="OrderedNode"/>
  </group>
  <group oor:name="Node">
   <prop oor:name="Label" oor:type="xs:string" oor:localized="true" oor:nillable="false"/>
   <prop oor:name="OptionsPage" oor:type="xs:string"/>
   <prop oor:name="AllModules" oor:type="xs:boolean" oor:nillable="false">
    <value>false</value>
   </prop>
   <prop oor:name="GroupId" oor:type="xs:string" oor:nillable="false">
    <value/>
   </prop>
   <prop oor:name="GroupIndex" oor:type="xs:int" oor:nillable="false">
    <value>-1</value>
   </prop>
   <set oor:name="Leaves" oor:node-type="Leaf"/>
  </group>
  <group oor:name="Leaf">
   <prop oor:name="Id" oor:type="xs:string"/>
   <prop oor:name="Label" oor:type="xs:string" oor:localized="true" oor:nillable="false"/>
   <prop oor:name="OptionsPage" oor:type="xs:string" oor:nillable="false"/>
   <prop oor:name="EventHandlerService" oor:type="xs:string" oor:nillable="false"/>
   <prop oor:name="GroupId" oor:type="xs:string" oor:nillable="false">
    <value/>
   </prop>
   <prop oor:name="GroupIndex" oor:type="xs:int" oor:nillable="false">
    <value>-1</value>
   </prop>
  </group>
  <group oor:name="OrderedNode"
   <prop oor:name="Index" oor:type="xs:int" oor:nillable="false">
    <value>-1</value>
   </prop>
  </group>
 </templates>
 <component>
  <set oor:name="OptionsDialogGroups" oor:node-type="OptionsGroup"/>
  <set oor:name="Modules" oor:node-type="Module"/>
  <set oor:name="Nodes" oor:node-type="Node"/>
 </component>
</oor:component-schema>
これがオプションページを定義するコンポーネントデータノードを定義しているコンポーネントスキーマノードです。

コンポーネントノードをみるとOptionsDialogGroups、Modules、Nodesという3種類のセットノードがあることがわかります。

セットノードNodesでオプションページの項目を作成する


セットノードNodesは、Nodes(Node)→Leaves(Leaf)、というセットノード(カッコ内はノードタイプ名)が入れ子になっています。

各propノードについての解説はExtensions/Options - ...?が詳しいです。

ノードタイプNodeのLabelがオプションページの大項目名になります。

propノードOptionsPageでオプションダイアログが設定できます。

しかし大項目を選択してもそれは表示されないようですのでこのpropノードは使っていません。

propノードAllModulesにはブーリアンを値に持ちます。

これをtrueにするとセットノードModulesでの制限が無効になります。

ノードタイプLeafではオプションページの小項目の設定になります。

このラベルをクリックするとオプションダイアログが表示されます。

LibreOffice5(65)オプションページを持つ拡張機能の例を作る: その3の「3 拡張機能マネージャーにオプションボタンを表示する」でやったようにpropノードIdをdescription.xmlのidentifier(拡張機能ID)と一致させると拡張機能マネージャーにオプションボタンが表示されるようになります。

このIdも実装サービス名と同じにしておきました。

複数のLeafがあるときにIdを拡張機能IDに一致させたLeafノードが一つでもあると拡張機能マネージャーがフリーズしました。

propノードEventHandlerServiceの値にはオプションダイアログが呼ばれたときに呼び出すサービス名を指定しています。

これも実装サービス名にしました。

この実装サービスでコントロールをランタイムで作成してpropノードOptionPageで呼び出されたxdlファイルで定義されたオプションダイアログ上にコントロールを描画します。

複数のLeafを作成するときは、propノードOptionPageで異なるオプションダイアログを呼び出してそのidで振り分けるか、propノードEventHandlerServiceで異なるサービスを呼び出すか、しないといけません。

Leafごとに異なるサービスを呼び出すとxdlファイルが一つで済みますが、UNOコンポーネントを複数作らないといけないので手間が増えます。

それよりもoptionsdialog.xdlをコピペしてidを変えると、xdlファイルで定義したidはcallHandlerMethod()メソッドの第一引数のダイアログ名になっているのでそれで振り分けした方が楽です。

でも拡張機能マネージャーにオプションボタンを表示させたいときは、Leafは一つだけにしておかないといけません。

セットノードModulesでオプションページの表示を限定する


これは「5 拡張機能マネージャーか、Writerからオプションページを呼び出した時だけに表示する」を実現している部分です。

セットノードModulesは、Modules(Module)→Nodes(OrderdNode)、というセットノードが入れ子になっています。

ノードタイプModuleのoor:nameをFramework/Article/Options Dialog Configuration - Apache OpenOffice Wikiのいずれかにするとそのときだけにオプションページの表示を限定することができます。

今回はcom.sun.star.text.TextDocumentをoor:nameに指定して、Writerから呼び出したときのみにオプションページを表示させるようにしています。

セットノードNodesで限定するオプションページを指定します。

ただし、拡張機能マネージャーのオプションボタンからはこの設定に関係なく呼び出せます。

またオプションページのAllModulesをfalseにしておかないといけません。

セットノードOptionsDialogGroupsでオプションページを非表示にする


これは「6 一部のオプションページを非表示にする」を実現している部分です。

セットノードOptionsDialogGroupsはOptionsDialogGroups(OptionsGroup)→Pages(OptionsPage)→Options(SingleOption)、というセットノードが入れ子になっていてそれぞれブーリアンを値に持つHideというプロパティをもっています。

この設定はこの拡張機能のオプションページだけではなく、すでにあるオプションページを非表示にできます。

セットノードOptionsDialogGroupsの子ノードのoor:nameでオプションページの大項目名を指定します。

英語版に切り替えたときの大項目名とだいたい一致しているようですが、「LibreOffice」は「ProductName」にしないといけませんでした。

「LibreOffice」が「ProductName」というのはHow to hide Memory options and Internet options menu in LibreOffice [closed] - Ask LibreOfficeに例があったからわかったものです。

ノードタイプOptionsPageでは副項目の設定を非表示にします。

ノードタイプSingleOptionではさらにオプションダイアログ内のコントロールの表示もできるようにですが、例がなかったので試していません。

非表示にできるモジュールを限定することはできないようで、この設定をしている拡張機能をアンイストールするしか項目を復活させる方法はないようです。

参考にしたサイト


Extensions/Options - ...?
オプションページを作成するxcuファイルの解説。

Framework/Article/Options Dialog Configuration - Apache OpenOffice Wiki
セットノードModulesの子ノードのノード名一覧。

How to hide Memory options and Internet options menu in LibreOffice [closed] - Ask LibreOffice
セットノードOptionsDialogGroupsの例。

次の関連記事:LibreOffice5(67)オプションページを持つ拡張機能の例を作る: その5

PR

0 件のコメント:

コメントを投稿