** [[OOobbs2/71]] [#xc106eee] -''サマリ'': 拡張機能オプション設定ダイアログ (OOo 2.3) -''環境'': General -''状態'': 投稿 -''投稿者'': [[はにゃ?]] -''投稿日'': 2007-09-26 (水) 03:25:11 *** 質問 [#w985ac6a] 2.3 から拡張機能の設定を行うためにオプションダイアログを利用できます。新しい Developers Guide に詳細が載っていますのでここではちょっと試してみる程度にしておきます。 #contents これは新たに専用のダイアログを追加することで行います。 必要なもの -オプションダイアログ設定ファイル -ダイアログ -イベントハンドル用サービス ***パッケージ [#d476281a] &ref(MaximumPageSize.oxt); ***オプションダイアログ設定ファイル [#uef55a33] まず、OpenOffice.org/share/registry/schema/org/openoffice/Office/OptionDialog.xcs にしたがってオプションダイアログ用の設定ファイルを作成します。このファイルでは、オプション設定ダイアログの左側に表示されているツリーコントロールのどの位置に新たに項目を追加するか指定します。追加項目設定には表示するラベル、項目に対応したダイアログ、イベントハンドル用サービスなども設定します。 OptionsDialog.xcu #code(xcu){{ <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE oor:component-data SYSTEM "../../../../component-update.dtd"> <oor:component-data oor:name="OptionsDialog" oor:package="org.openoffice.Office" 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="Nodes"> <node oor:name="mytools.Extensions" oor:op="fuse"> <prop oor:name="Label"> <value xml:lang="en-US">Extensions</value> <value xml:lang="ja-JP">拡張機能</value> </prop> <prop oor:name="OptionsPage"> <value>%origin%/dialogs/node/mytools_Extensions_Node.xdl</value> </prop> <prop oor:name="AllModules"> <value>true</value> </prop> <node oor:name="Leaves"> <node oor:name="mytools.Extensions.MaximumPaperSize" oor:op="fuse"> <prop oor:name="Id"> <value>mytools.Extensions.MaximumPaperSize</value> </prop> <prop oor:name="Label"> <value xml:lang="en-US">Maximum Paper Size</value> <value xml:lang="ja-JP">最大用紙サイズ</value> </prop> <prop oor:name="OptionsPage"> <value>%origin%/dialogs/MaximumPaperSize/mytools_Extensions_MaximumPaperSize.xdl</value> </prop> <prop oor:name="EventHandlerService"> <value>mytools.MaximumPaperSize.DialogHandler</value> </prop> </node> </node> </node> </node> </oor:component-data> }} お試しなので Nodes に項目を追加、Leaves に一つ項目を追加しています。 -Nodes の項目にはハンドラは指定できない -位置を指定しないときには一番下に表示される -Leavs の項目を特定のコンテキストに表示することも可 (普通はこちら)。 -ラベルのローカライズ -ダイアログパス OptionsPage -ハンドラ用サービス名 EventHandlerService Leaves の Id を拡張機能 ID と同じにすると拡張機能マネージャにあるオプションボタンからオプションページを開くことができます。 ***ダイアログ [#ndf55e46] オプション設定ダイアログの右側に表示されるコントロール類は OOo のダイアログエディタで作成します。 ダイアログはタイトルバーをなし (2.3) に設定して作成、ダイアログのみをエクスポートします (2.3)。ダイアログはローカライズされたものも利用できる (はず)。 丁度オプションダイアログにぴったり収まるサイズ: -Width: 185, Height: 260 (確認中) -Title bar: No ***イベントハンドル用サービス [#z9349ee1] Developers Guide には Java で書かれた例が記載されています。 一方、ここでは Python-UNO によるコンポーネントでハンドラサービスを作成します。 サービスは XContainerWindowEventHandler インターフェースを実装している必要があります。オプションダイアログのイベントで (ブロードキャスタにより) callHandlerMethod が呼ばれます。 //ダイアログでボタンなどイベントが必要なときにはリスナーを自分で追加してやる必要があります。 DialogHandler.py #code(python){{ #! # -*- coding: utf_8 -*- import uno import unohelper #interfaces from com.sun.star.awt import XContainerWindowEventHandler from com.sun.star.lang import XServiceInfo # listeners from com.sun.star.awt import XActionListener # push button listener class ButtonListener(unohelper.Base,XActionListener): DEFAULTMAXIMUM = 30000 def __init__(self,cast,dialog): self.cast = cast self.dialog = dialog def disposing(self,eventObject): pass def actionPerformed(self,actionEvent): cmd = str(actionEvent.ActionCommand) if cmd == "width": self.dialog.getControl("nf_width").Value = self.DEFAULTMAXIMUM / 100 elif cmd == "height": self.dialog.getControl("nf_height").Value = self.DEFAULTMAXIMUM / 100 return # main class class DilaogHandler(unohelper.Base,XServiceInfo,XContainerWindowEventHandler): def __init__(self,ctx): self.ctx = ctx; self.smgr = ctx.ServiceManager self.CFGNODE = "/org.openoffice.Office.Common/Drawinglayer" self.cp = self.smgr.createInstanceWithContext( "com.sun.star.configuration.ConfigurationProvider",self.ctx) node = uno.createUnoStruct("com.sun.star.beans.PropertyValue") node.Name = "nodepath" node.Value = self.CFGNODE self.node = node self.cfg_names = ("MaximumPaperHeight","MaximumPaperWidth") return #XContainerWindowEventHandler def callHandlerMethod(self,window,eventObject,method): if method == "external_event": try: self.handleExternalEvent(window,eventObject) except: pass return True #XContainerWindowEventHandler def getSupportedMethodNames(self): return ("external_event",) def supportsService(self,name): return False def getImplementationName(self): return "mytools.extensions.maximumpapersize.DilaogHandler" def getSupportedServiceNames(self): return () def handleExternalEvent(self,window,eventName): if eventName == "ok": self.saveData(window) elif eventName == "back": self.loadData(window,"back") elif eventName == "initialize": self.loadData(window,"initialize") return True # load and set the data def loadData(self,window,ev): name = window.getModel().Name if name != "mytools_Extensions_MaximumPaperSize": return settings = self.configreader() if settings: cfgs = self.cfg_names nf_width = window.getControl("nf_width") nf_height = window.getControl("nf_height") nf_height.Value = settings[cfgs[0]] / 100 nf_width.Value = settings[cfgs[1]] / 100 if ev == "initialize": listener = ButtonListener(self,window) btn_width = window.getControl("btn_width") btn_height = window.getControl("btn_height") btn_width.ActionCommand = "width" btn_height.ActionCommand = "height" btn_width.addActionListener(listener) btn_height.addActionListener(listener) return # making the save data def saveData(self,window): name = window.getModel().Name if name != "mytools_Extensions_MaximumPaperSize": return nf_height = window.getControl("nf_height") nf_width = window.getControl("nf_width") settings = [] settings.append(long(nf_height.Value * 100)) settings.append(long(nf_width.Value * 100)) t_settings = tuple(settings) self.configwriter(t_settings) return # read configuration def configreader(self): settings = {} try: ConfigReader = self.cp.createInstanceWithArguments( "com.sun.star.configuration.ConfigurationAccess",(self.node,)) cfg_values = ConfigReader.getPropertyValues(self.cfg_names) for i in range(len(self.cfg_names)): settings[self.cfg_names[i]] = cfg_values[i] except: raise return settings # write configuration, cfg_values: tuple # keep the order of the values def configwriter(self,cfg_values): try: ConfigWriter = self.cp.createInstanceWithArguments( "com.sun.star.configuration.ConfigurationUpdateAccess",(self.node,)) ConfigWriter.setPropertyValues(self.cfg_names,cfg_values) ConfigWriter.commitChanges() # commits except: raise ### # uno implementation g_ImplementationHelper = unohelper.ImplementationHelper() g_ImplementationHelper.addImplementation( DilaogHandler,"mytools.MaximumPaperSize.DialogHandler", ("mytools.MaximumPaperSize.DialogHandler",),) ### }} ***manifest.xml [#h0de4d0c] 拡張機能パッケージの登録に必要な manifest.xml ファイルを作成します。 <?xml version="1.0" encoding="UTF-8"?> <manifest:manifest> <manifest:file-entry manifest:full-path="OptionsDialog.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/> <manifest:file-entry manifest:full-path="DialogHandler.py" manifest:media-type="application/vnd.sun.star.uno-component;type=Python"/> </manifest:manifest> ***パッケージ構成 [#ue9639db] 今回作成するパッケージファイル構成 -package --META-INF ---manifest.xml --dialogs ---MaximumPaperSize ----mytoolsExtensionsMaximumPaperSize.xdl ----mytoolsExtensionsMaximumPaperSize_en_US.default ----mytoolsExtensionsMaximumPaperSize_en_US.properties ----mytoolsExtensionsMaximumPaperSize_ja_JP.properties ----node ----mytoolsExtensionsNode.xdl ----mytoolsExtensionsNode_en_US.default ----mytoolsExtensionsNode_en_US.properties ----mytoolsExtensionsNode_ja_JP.properties --OptionsDialog.xcu --DialogHandler.py 拡張機能パッケージを作成する手順と同じように ZIP 圧縮して .oxt に拡張子を変更す。ダイアログはリソースをまとめて同じディレクトリに保存する。 ***インストール方法 [#iad12171] ツール - パッケージマネージャからインストールします。サービスの実装に Py-UNO を利用しているため、パッケージインストール後に一度完全に OpenOffice.org を再起動してください。クイック起動も終了させる必要があります。 アンインストールもツール - パッケージマネージャから行います。 ***使い方 [#i7c6cf26] ツール - オプションメニューを選択して表示されるダイアログに次のように項目が追加されます。 &ref(maximumpagesize.png,,50%); //ダイアログの言語リソースを用意したのですが、日本語ロケールにしてもなぜか日本語になりませんでした。Developers Guide には特に設定が必要とはかかれていないのですが、不明。Nodes と Leaves のラベルは日本語で表示されるのですが。 *** 回答 [#ke78fa9d] #comment *** 感想,コメント,メモ [#mfb48560] #comment |