- The added line is THIS COLOR.
- The deleted line is THIS COLOR.
- Go to OOobbs2/71.
** [[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