def createWindowStateNodes(self, c, xdic): # ツールバーの設定。 ''' Properties for ToolBar :param DIC: PYTHON_UNO_Component,IMPLE_NAME,SERVICE_NAME,HANDLED_PROTOCOL :type DIC: dict :param xdic: Xml Attributes :type xdic: dict :returns: a list of nodes :rtype: list ''' ORDER = "UIName", "ContextSensitive", "Visible", "Docked" # ノードの順を指定。 lst_nd = list() # ノードをいれるリスト。 for key in ORDER: if key in xdic: val = xdic[key] if key == "UIName": # タイトルノードのとき nd = Elem("prop", { "oor:name": key, "oor:type": "xs:string" }) for lang, txt in val.items(): nd.append(Elem("value", {"xml:lang": lang}, text=txt)) lst_nd.append(nd) else: # それ以外のノードの時。 nd = Elem("prop", { "oor:name": key, "oor:type": "xs:boolean" }) nd.append(Elem("value", text=val)) lst_nd.append(nd) return lst_nd
def __init__(self, c): super().__init__("node", {'oor:name': "OfficeToolBar"}) # 変更不可。 self.append( Elem("node", { 'oor:name': c["HANDLED_PROTOCOL"], "oor:op": "replace" })) # oor:nameの値はノードの任意の固有名。 self[0].append(Elem("node", { 'oor:name': "m1", "oor:op": "replace" })) # oor:nameの値はノードの任意の固有名。この順でソートされる。 self[0][0].extend(super().createNodes( c, { "URL": "{}:Function1".format(c["HANDLED_PROTOCOL"]), "Title": { "en-US": "Function 1" }, "Target": "_self", "Context": "com.sun.star.text.TextDocument" })) self[0].append(Elem("node", { 'oor:name': "m2", "oor:op": "replace" })) # oor:nameの値はノードの任意の固有名。この順でソートされる。 self[0][1].extend(super().createNodes( c, { "URL": "{}:Function2".format(c["HANDLED_PROTOCOL"]), "Title": { "en-US": "Function 2" }, "Target": "_self", "Context": "com.sun.star.text.TextDocument" })) self.createWindwStatexcu(c, "Writer") # Writer用のツールバーのプロパティの設定。
def __init__( self, name, nodes ): # moduleはオプションダイアログを表示させるモジュールを指定。有効にするためにはnode-type=NodeのAllModulesをfalseにする必要がある。 super().__init__("node", {'oor:name': name, "oor:op": "fuse"}) self.append(Elem("node", {'oor:name': "Nodes"})) # セットノードNodes for node in nodes: self[-1].append(node) # node-type=OrderdNodeをセットノードNodesに追加。
def subMenu2(self, c, val): nd = Elem("node", {"oor:name": "Submenu"}) # 変更不可。 i = 0 nd.append(Elem("node", { "oor:name": val[i], "oor:op": "replace" })) # oor:nameの値はノードの任意の固有名。この順でソートされる。 nd[i].extend(super().createNodes( c, { "URL": "{}:Function2".format(c["HANDLED_PROTOCOL"]), "Title": { "en-US": "Add-On Function 2" }, "Target": "_self", "Context": "com.sun.star.sheet.SpreadsheetDocument" })) return nd
def __init__(self, name, *, hide=None, optionspages=None): super().__init__("node", {'oor:name': name, "oor:op": "fuse"}) if hide is not None: self.append(ElemProp("Hide", "true")) if optionspages is not None: self.append(Elem("node", {'oor:name': "Pages"})) # セットノードPages。 for optionspage in optionspages: self[-1].append( optionspage) # node-type=OptionsPageをセットノードPagesに追加。
def __init__(self, name, *, hide=None, singleoptions=None): super().__init__("node", {'oor:name': name, "oor:op": "fuse"}) if hide is not None: self.append(ElemProp("Hide", "true")) if singleoptions is not None: self.append(Elem("node", {'oor:name': "Options"})) # セットノードOptions。 for singleoption in singleoptions: self[-1].append( singleoption) # node-type=SingleOptionをセットノードOptionsに追加。
def createProtocolHandlerXcu(c): #Creation of ProtocolHandler.xcu os.chdir(c["src_path"]) # srcフォルダに移動。 if c["HANDLED_PROTOCOL"] is not None: # HANDLED_PROTOCOLの値があるとき filename = "ProtocolHandler.xcu" c["backup"](filename) # すでにあるファイルをバックアップ with open(filename, "w", encoding="utf-8") as f: # ProtocolHandler.xcuファイルの作成 rt = Elem( "oor:component-data", { "oor:name": "ProtocolHandler", "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" }) # 根の要素を作成。 rt.append(Elem("node", {'oor:name': "HandlerSet"})) rt[-1].append( Elem("node", { 'oor:name': c["IMPLE_NAME"], "oor:op": "replace" })) rt[-1][-1].append( Elem("prop", { 'oor:name': "Protocols", "oor:type": "oor:string-list" })) rt[-1][-1][-1].append( Elem("value", text="{}:*".format(c["HANDLED_PROTOCOL"]))) tree = ET.ElementTree( rt) # 根要素からxml.etree.ElementTree.ElementTreeオブジェクトにする。 tree.write(f.name, "utf-8", True) # xml_declarationを有効にしてutf-8でファイルに出力する。 print("{} has been created.".format(filename)) #Creation of Addons.xcu filename = "Addons.xcu" c["backup"](filename) # すでにあるファイルをバックアップ with open(filename, "w", encoding="utf-8") as f: # Addons.xcuファイルの作成。 rt = Elem( "oor:component-data", { "oor:name": "Addons", "oor:package": "org.openoffice.Office", "xmlns:oor": "http://openoffice.org/2001/registry", "xmlns:xs": "http://www.w3.org/2001/XMLSchema" }) # 根の要素を作成。 rt.append(Elem("node", {'oor:name': "AddonUI"})) rt[-1].extend([ AddonMenu(c), OfficeMenuBar(c), OfficeToolBar(c), Images(c), OfficeHelp(c) ]) # 追加するノード。 tree = ET.ElementTree( rt) # 根要素からxml.etree.ElementTree.ElementTreeオブジェクトにする。 tree.write(f.name, "utf-8", True) # xml_declarationを有効にしてutf-8でファイルに出力する。 print("{} has been created.".format(filename))
def subMenu(self, c, val): ''' サブメニューの作成。 :param DIC: PYTHON_UNO_Component,IMPLE_NAME,SERVICE_NAME,HANDLED_PROTOCOL :type DIC: dict :param val: Submenu IDs :type val: list :returns: a node for submenu :rtype: xml.etree.ElementTree.Element ''' nd = Elem("node", {"oor:name": "Submenu"}) # 変更不可。 i = 0 nd.append(Elem("node", { "oor:name": val[i], "oor:op": "replace" })) # oor:nameの値はノードの任意の固有名。この順でソートされる。 nd[i].extend(super().createNodes( c, { "URL": "{}:Function1".format(c["HANDLED_PROTOCOL"]), "Title": { "en-US": "Add-On Function 1" }, "Target": "_self" })) i += 1 nd.append(Elem("node", { "oor:name": val[i], "oor:op": "replace" })) # oor:nameの値はノードの任意の固有名。この順でソートされる。 nd[i].extend(super().createNodes( c, { "URL": "{}:Function2".format(c["HANDLED_PROTOCOL"]), "Title": { "en-US": "Add-On Function 2" }, "Target": "_self" })) return nd
def createWindwStatexcu(self, c, ctxt): # ツールバーのプロパティの設定。 #Creation of WriterWindwState.xcu、Calcの場合はCalcWindwState.xcu filename = "{}WindowState.xcu".format(ctxt) c["backup"](filename) # すでにあるファイルをbkに改名 with open(filename, "w", encoding="utf-8") as f: rt = Elem( "oor:component-data", { "oor:name": "{}WindowState".format(ctxt), "oor:package": "org.openoffice.Office.UI", "xmlns:oor": "http://openoffice.org/2001/registry", "xmlns:xs": "http://www.w3.org/2001/XMLSchema" }) # 根の要素を作成。 rt.append(Elem("node", {'oor:name': "UIElements"})) rt[-1].append(Elem("node", {'oor:name': "States"})) rt[-1][-1].append( Elem( "node", { 'oor:name': "private:resource/toolbar/addon_{}".format( c["HANDLED_PROTOCOL"]), "oor:op": "replace" })) rt[-1][-1][-1].extend(super().createWindowStateNodes( c, { "UIName": { "en-US": "OfficeToolBar Title" }, "ContextSensitive": "false", "Visible": "true", "Docked": "false" })) # ツールバーのプロパティを設定。 tree = ET.ElementTree( rt) # 根要素からxml.etree.ElementTree.ElementTreeオブジェクトにする。 tree.write(f.name, "utf-8", True) # xml_declarationを有効にしてutf-8でファイルに出力する。 print("{} has been created.".format(filename))
def subMenu(self, c, val): nd = Elem("node", {"oor:name": "Submenu"}) # 変更不可。 i = 0 nd.append(Elem("node", { "oor:name": val[i], "oor:op": "replace" })) # oor:nameの値はノードの任意の固有名。この順でソートされる。 nd[i].extend(super().createNodes( c, { "URL": "{}:Function1".format(c["HANDLED_PROTOCOL"]), "Title": { "en-US": "Add-On Function 1" }, "Target": "_self", "Context": "com.sun.star.text.TextDocument" })) i += 1 nd.append(Elem("node", { "oor:name": val[i], "oor:op": "replace" })) # oor:nameの値はノードの任意の固有名。この順でソートされる。 nd[i].extend(super().createNodes(c, {"URL": "private:separator"})) i += 1 nd.append(Elem("node", { "oor:name": val[i], "oor:op": "replace" })) # oor:nameの値はノードの任意の固有名。この順でソートされる。 nd[i].extend(super().createNodes( c, { "URL": "", "Title": { "en-US": "Add-On sub menu" }, "Target": "_self", "Submenu": ["m1", self.subMenu2] })) return nd
def __init__(self, DIC): super().__init__("node", {'oor:name': "OfficeMenuBar"}) # 変更不可。 self.append( Elem("node", { 'oor:name': c["HANDLED_PROTOCOL"], "oor:op": "replace" })) # oor:nameの値はノードの任意の固有名。 self[0].extend(super().createNodes( c, { "Title": { "en-US": "Add-On example by OfficeMenuBar" }, "Target": "_self", "Submenu": ["m1", "m2", "m3", self.subMenu] })) # ここから表示されるメニューの設定。
def createNodes(self, c, xdic): ''' oor:node-type="MenuItem"のElementのリストを返す。 :param DIC: PYTHON_UNO_Component,IMPLE_NAME,SERVICE_NAME,HANDLED_PROTOCOL :type DIC: dict :param xdic: Xml Attributes :type xdic: dict :returns: a list of nodes :rtype: list ''' ORDER = "URL", "Title", "Target", "Context", "Submenu", "ControlType", "Width" # ノードの順を指定。 "ImageIdentifier"ノードは使わないので無視する。 lst_nd = list() # ノードをいれるリスト。 for key in ORDER: if key in xdic: val = xdic[key] if key == "Title": # タイトルノードのとき nd = Elem("prop", { "oor:name": key, "oor:type": "xs:string" }) for lang, txt in val.items(): nd.append(Elem("value", {"xml:lang": lang}, text=txt)) lst_nd.append(nd) elif key == "Submenu": # サブメニューノードのとき fn = val.pop() # サブメニュー設定のための関数を取得。 if type(fn) is types.MethodType: lst_nd.append(fn(c, val)) else: # それ以外のノードの時。 nd = Elem("prop", { "oor:name": key, "oor:type": "xs:string" }) nd.append(Elem("value", text=val)) lst_nd.append(nd) return lst_nd
def __init__(self, c): super().__init__("node", {'oor:name': "AddonMenu"}) # 変更不可。 self.append( Elem( "node", { 'oor:name': "{}.function".format(c["HANDLED_PROTOCOL"]), "oor:op": "replace" })) # oor:nameの値はノードの任意の固有名。 self[-1].extend(super().createNodes( c, { "Title": { "en-US": "Add-On example by AddonMenuNode" }, "Context": "com.sun.star.text.TextDocument", "Submenu": ["m1", "m2", self.subMenu] })) # ここから表示されるメニューの設定。
def __init__(self, c): super().__init__("node", {'oor:name': "OfficeHelp"}) # 変更不可。 self.append( Elem( "node", { 'oor:name': "com.sun.star.comp.framework.addon", "oor:op": "replace" })) # oor:nameの値はノードの任意の固有名。 self[0].extend(super().createNodes( c, { "URL": "{}:Help".format(c["HANDLED_PROTOCOL"]), "Title": { "x-no-translate": "", "de": "Über Add-On Beispiel", "en-US": " About Add-On Example" }, "Target": "_self" }))
def __init__( self, c, attrs, *, leaves=None ): # 辞書attrのkeyはName, Label, OptionsPage, AllModules, GroupId, GroupIndex。 valueはすべて文字列でいれる。 super().__init__("node", { 'oor:name': attrs.pop("Name"), "oor:op": "fuse" }) for key, val in attrs.items(): if key == "Label": self.append(ElemPropLoc(key, val)) else: self.append(ElemProp(key, val)) if leaves is not None: self.append(Elem("node", {'oor:name': "Leaves"})) # セットノードLeaves for leaf in leaves: self[-1].append(leaf) # node-type=LeafをセットノードLeavesに追加。
def userDefinedImages(self, name, url, dic_image): ''' アイコンの設定。 :param name: name of icon :type name: str :param url: uri of icon :type url: str :param dic_image: a dictionary of the same image with different sizes :type dic_image: dict :returns: a node for an image :rtype: xml.etree.ElementTree.Element ''' nd = Elem("node", { "oor:name": name, "oor:op": "replace" }) # oor:nameの値はノードの任意の固有名。 nd.append(Elem("prop", {"oor:name": "URL"})) nd[-1].append(Elem("value", text=url)) # アイコンを表示させるコマンドURLを設定。 nd.append(Elem("node", {"oor:name": "UserDefinedImages"})) ORDER = "ImageSmall", "ImageBig", "ImageSmallHC", "ImageBigHC" for key in ORDER: if key in dic_image: snd = Elem("prop", { "oor:name": key, "oor:type": "xs:hexBinary" }) snd.append(Elem("value", text=dic_image[key])) nd[-1].append(snd) ORDER = "ImageSmallURL", "ImageBigURL" # "ImageSmallHCURL","ImageBigHCURL" valueノードのテキストノードの空白があると画像が表示されない。HC画像が優先して表示されてしまうのでHC画像は使わない。 for key in ORDER: if key in dic_image: snd = Elem("prop", {"oor:name": key, "oor:type": "xs:string"}) snd.append(Elem("value", text=dic_image[key])) nd[-1].append(snd) return nd
def createOptionsDialogXcu(c): #Creation of OptionsDialog.xcu os.chdir(c["src_path"]) # srcフォルダに移動。 filename = "OptionsDialog.xcu" c["backup"](filename) # すでにあるファイルをバックアップ with open(filename, "w", encoding="utf-8") as f: # OptionsDialog.xcuファイルの作成 root = Elem( "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" }) # 根の要素を作成。 #オプションページの作成。拡張機能IDのc["ExtentionID"]をNameに使った時はLeafを一つにしないと拡張機能マネージャーでフリーズする。 root.append(Elem("node", {'oor:name': "Nodes"})) # セットノードNodesを追加。 leaf = ElemLeaf( c, { "Name": c["ExtentionID"], "Label": { "en-US": "Maximum Paper Size", "ja-JP": "最大用紙サイズ" } }) # node-type=Leaf。小項目の設定。Idを拡張機能Idと同じc["ExtentionID"]にする。 name = "{}.Node1".format( c["ExtentionID"] ) # ロードマップコントロールに表示させる大項目のID。ユニークの必要があると考えるので拡張機能IDにくっつける。 node = ElemNode(c, { "Name": name, "Label": { "en-US": "Extensions Example", "ja-JP": "拡張機能の例" }, "AllModules": "false" }, leaves=(leaf, )) # node-type=Node。大項目の設定。 root[-1].append(node) # node-type=NodeをセットノードNodesに追加。 # オプションページを表示させるモジュールを限定する。 root.append(Elem("node", {'oor:name': "Modules"})) # セットノードModulesを追加。 orderednode = ElemOrderdNode( name) # node-type=OrderdNode。node-type=NodeのNameで表示させる大項目を指定。 node = ElemModeule( "com.sun.star.text.TextDocument", (orderednode, ) ) # node-type=Module。表示させるモジュールを指定。第一引数はhttps://wiki.openoffice.org/wiki/Framework/Article/Options_Dialog_Configurationのいずれか。 root[-1].append(node) # node-type=ModuleをセットノードModulesに追加。 # 一部のオプションページを非表示にする。 root.append(Elem("node", {'oor:name': "OptionsDialogGroups" })) # セットノードOptionsDialogGroupを追加。 security = ElemOptionsPage( "Security", hide=True) # node-type=OptionsPage。非表示にする小項目。セキュリティー。 memory = ElemOptionsPage( "Memory", hide=True) # node-type=OptionsPage。非表示にする小項目。メモリー。 productname = ElemOptionsGroup( "ProductName", optionspages=(security, memory) ) # node-type=OptionsGroup。非表示にする大項目。hide=Trueにしていないときは第2引数の小項目のみ非表示にする。 root[-1].append( productname ) # node-type=OptionsGroupをセットノードOptionsDialogGroupsに追加。 internet = ElemOptionsGroup( "Internet", hide=True) # node-type=OptionsGroup。非表示にする大項目。Internet。 root[-1].append( internet) # node-type=OptionsGroupをセットノードOptionsDialogGroupsに追加。 tree = ET.ElementTree( root) # 根要素からxml.etree.ElementTree.ElementTreeオブジェクトにする。 tree.write(f.name, "utf-8", True) # xml_declarationを有効にしてutf-8でファイルに出力する。 print("{} has been created.".format(filename))