LibreOffice5(75)thePathSettingsシングルトンで既定のパスを取得

2017-08-25

旧ブログ

t f B! P L
LibreOffice 5.3 SDK - Developer's Guide ExamplesのPathsettingsTest.javaをPythonにします。thePathSettingsシングルトンから既定のパスを取得します。

前の関連記事:LibreOffice5(74)PathSubstitutionサービスで既定値を取得する


pathsettingstest_macro.py: LibreOfficeの既定のパスを取得


OfficeDev/pathsettingstest_macro.py at cbf95bab699e5a83f52b57ba34be0ed2eaacba82 · p--q/OfficeDev
def macro():
 ctx = XSCRIPTCONTEXT.getComponentContext()  # コンポーネントコンテクストの取得。
 doc = XSCRIPTCONTEXT.getDocument()
 if not doc.supportsService("com.sun.star.text.TextDocument"):  # Writerドキュメントに結果を出力するのでWriterドキュメントであることを確認する。
  raise RuntimeError("Please execute this macro with a Writer document.")  # Writerドキュメントでないときは終わる。 
 txts = []  # Writerドキュメントに出力する文字列を入れるリスト。
 predefinedpathproperties = "Addin",\
        "AutoCorrect",\
        "AutoText",\
        "Backup",\
        "Basic",\
        "Bitmap",\
        "Config",\
        "Dictionary",\
        "Favorite",\
        "Filter",\
        "Gallery",\
        "Graphic",\
        "Help",\
        "Linguistic",\
        "Module",\
        "Palette",\
        "Plugin",\
        "Storage",\
        "Temp",\
        "Template",\
        "UIConfig",\
        "UserConfig",\
        "UserDictionary",\
        "Work"  # https://wiki.openoffice.org/wiki/Documentation/DevGuide/OfficeDev/Path_Settings
 pathsettingssingleton = ctx.getByName('/singletons/com.sun.star.util.thePathSettings')
 for predefinedpathproperty in predefinedpathproperties:
  try:
   url = pathsettingssingleton.getPropertyValue(predefinedpathproperty)
  except UnknownPropertyException:
   t = "Cannot get a property value of {}.".format(predefinedpathproperty)
   print(t, file=sys.stderr)
   txts.append(t)
   continue
  systempath = ";".join([os.path.normpath(unohelper.fileUrlToSystemPath(p)) if p.startswith("file://") else p for p in url.split(";")]) # 各パスについてシステムパスにして正規化する
  t = "{} : {}".format(predefinedpathproperty, systempath)
  print(t)
  txts.append(t)
 for predefinedpathproperty in predefinedpathproperties:  # プロパティ名に_writableをつけてみる。パスが取得できたもののみ出力。
  predefinedpathproperty = "{}_writable".format(predefinedpathproperty)
  try:
   url = pathsettingssingleton.getPropertyValue(predefinedpathproperty)
  except:
   continue
  if url:  
   systempath = ";".join([os.path.normpath(unohelper.fileUrlToSystemPath(p)) if p.startswith("file://") else p for p in url.split(";")])  # 各パスについてシステムパスにして正規化する。
   t = "{} : {}".format(predefinedpathproperty, systempath)
   print(t)
   txts.append(t)
 t = "These paths have been converted to system paths."
 print(t)
 txts.append(t)
 doc.getText().setString("\n".join(txts))  # Writerドキュメントに出力。     
g_exportedScripts = macro, #マクロセレクターに限定表示させる関数をタプルで指定。
thePathSettingsシングルトンのプロパティとして既定のパスを取得します。

プロパティはXPathSettingsインターフェイスの属性になります。

しかし、PyDevのデバッガのVariablesビューでプロパティをみようとするとなぜかデバッガが終了してしまいます。

なので、このスクリプトでプロパティの値を確認しないといけません。

getPropertyValue()メソッドで返ってくるのはFileURLなのでそれをunohelper moduleの fileUrlToSystemPath()でシステムパスに変換してから出力しています。
Addin : /opt/libreoffice5.2/program/addin
AutoCorrect : /opt/libreoffice5.2/share/autocorr;/home/pq/.config/libreoffice/4/user/autocorr
AutoText : /opt/libreoffice5.2/share/autotext/ja;/home/pq/.config/libreoffice/4/user/autotext
Backup : /home/pq/.config/libreoffice/4/user/backup
Basic : /opt/libreoffice5.2/share/basic;/home/pq/.config/libreoffice/4/user/basic
Bitmap : /opt/libreoffice5.2/share/config/symbol
Config : /opt/libreoffice5.2/share/config
Dictionary : /opt/libreoffice5.2/share/wordbook;/home/pq/.config/libreoffice/4/user/wordbook
Favorite : /home/pq/.config/libreoffice/4/user/config/folders
Filter : /opt/libreoffice5.2/program/filter
Gallery : /opt/libreoffice5.2/share/gallery;/home/pq/.config/libreoffice/4/user/gallery
Graphic : /home/pq/.config/libreoffice/4/user/gallery
Help : /opt/libreoffice5.2/help
Linguistic : /opt/libreoffice5.2/share/dict;/opt/libreoffice5.2/share/dict/ooo;/home/pq/.config/libreoffice/4/user/wordbook
Module : /opt/libreoffice5.2/program
Palette : /opt/libreoffice5.2/share/palette;/home/pq/.config/libreoffice/4/user/config
Plugin : /opt/libreoffice5.2/program/plugin
Storage : /home/pq/.config/libreoffice/4/user/store
Temp : /tmp
Template : /opt/libreoffice5.2/share/template/common;/opt/libreoffice5.2/share/template/ja;vnd.sun.star.expand:$BUNDLED_EXTENSIONS/wiki-publisher/templates;/home/pq/.config/libreoffice/4/user/template
UIConfig : /opt/libreoffice5.2/share/config
UserConfig : /home/pq/.config/libreoffice/4/user/config
Cannot get a property value of UserDictionary.
Work : /home/pq
AutoCorrect_writable : /home/pq/.config/libreoffice/4/user/autocorr
AutoText_writable : /home/pq/.config/libreoffice/4/user/autotext
Backup_writable : /home/pq/.config/libreoffice/4/user/backup
Basic_writable : /home/pq/.config/libreoffice/4/user/basic
Dictionary_writable : /home/pq/.config/libreoffice/4/user/wordbook
Favorite_writable : /home/pq/.config/libreoffice/4/user/config/folders
Gallery_writable : /home/pq/.config/libreoffice/4/user/gallery
Graphic_writable : /home/pq/.config/libreoffice/4/user/gallery
Palette_writable : /home/pq/.config/libreoffice/4/user/config
Storage_writable : /home/pq/.config/libreoffice/4/user/store
Temp_writable : /tmp
Template_writable : /home/pq/.config/libreoffice/4/user/template
UserConfig_writable : /home/pq/.config/libreoffice/4/user/config
Work_writable : /home/pq
These paths have been converted to system paths.
これらは定義なので、まだ存在していないフォルダもあります。

Path Settings - Apache OpenOffice Wikiに各プロパティの解説があります。

これらのパスはshare/registry/main.xcdのorg.openoffice.OfficeパッケージのPathsコンポーネントのPathsノード以下で定義されています。

そこではLibreOffice5(74)PathSubstitutionサービスで既定値を取得するででてきた$で始まる既定値がたくさん使われています。

$(insturl)とか$(userurl)がまだ使われています。

_writableをつけたプロパティ名では、ユーザー権限で書き込みできるフォルダのみが返ってきます。

_writableをつけたプロパティ名はjavaの動かない例のSystemDialog.javaで使ってあったものですが、解説はみつけられませんでしたのでそのうち使えなくなっているかもしれません。

Templateプロパティではvnd.sun.star.expand:$BUNDLED_EXTENSIONS/wiki-publisher/templatesというパスが返ってきています。

このパスをunohelper.fileUrlToSystemPath()に渡すと、エラーが返ってきます。

uno.RuntimeException: Couldn't convert file url  to a system path for reason (21)

なので40行目ではfile://で始まるパスのみfileUrlToSystemPath()を渡しています。

vnd.sun.star.expandはUCPのプロトコールの一つですがいまのところ展開のやり方はわかりません(OOoBasic/Generic/UCB - ...?参照)。

ユーザーがインストールした拡張機能までのパスはAddons.xcuでは%origin%で取得できます(LibreOffice5(40)ツールバーやメニューに表示させるアイコン画像)。

変更した既定のパスを元に戻す方法


$で始まる既定値と違って、既定のパスは通常のプロパティと同様にsetPropertyValue()で変更できます。

Javaの例PathsettingsTest.javaではWorkを$(temp)に置換しています。


ツール→オプション→LibreOffice→パス、で変更後のパスが確認できます。

「マイドキュメント」が/tmpに変わっています。

元に戻すには項目を選択して「標準」ボタンをクリックします。

このダイアログに表示されていないパスについては変更できるのかとかどうやって元に戻すのかはわかりません。

Windows10 64bitで既定のパス

Addin : C:\Program Files (x86)\LibreOffice 5\program\addin
AutoCorrect : C:\Program Files (x86)\LibreOffice 5\share\autocorr;C:\Users\pq\AppData\Roaming\LibreOffice\4\user\autocorr
AutoText : C:\Program Files (x86)\LibreOffice 5\share\autotext\ja;C:\Users\pq\AppData\Roaming\LibreOffice\4\user\autotext
Backup : C:\Users\pq\AppData\Roaming\LibreOffice\4\user\backup
Basic : C:\Program Files (x86)\LibreOffice 5\share\basic;C:\Users\pq\AppData\Roaming\LibreOffice\4\user\basic
Bitmap : C:\Program Files (x86)\LibreOffice 5\share\config\symbol
Config : C:\Program Files (x86)\LibreOffice 5\share\config
Dictionary : C:\Program Files (x86)\LibreOffice 5\share\wordbook;C:\Users\pq\AppData\Roaming\LibreOffice\4\user\wordbook
Favorite : C:\Users\pq\AppData\Roaming\LibreOffice\4\user\config\folders
Filter : C:\Program Files (x86)\LibreOffice 5\program\filter
Gallery : C:\Program Files (x86)\LibreOffice 5\share\gallery;C:\Users\pq\AppData\Roaming\LibreOffice\4\user\gallery
Graphic : C:\Users\pq\AppData\Roaming\LibreOffice\4\user\gallery
Help : C:\Program Files (x86)\LibreOffice 5\help
Linguistic : C:\Program Files (x86)\LibreOffice 5\share\dict;C:\Program Files (x86)\LibreOffice 5\share\dict\ooo;C:\Users\pq\AppData\Roaming\LibreOffice\4\user\wordbook
Module : C:\Program Files (x86)\LibreOffice 5\program
Palette : C:\Program Files (x86)\LibreOffice 5\share\palette;C:\Users\pq\AppData\Roaming\LibreOffice\4\user\config
Plugin : C:\Program Files (x86)\LibreOffice 5\program\plugin
Storage : C:\Users\pq\AppData\Roaming\LibreOffice\4\user\store
Temp : C:\Users\pq\AppData\Local\Temp
Template : C:\Program Files (x86)\LibreOffice 5\share\template\common;C:\Program Files (x86)\LibreOffice 5\share\template\ja;vnd.sun.star.expand:$BUNDLED_EXTENSIONS/wiki-publisher/templates;C:\Users\pq\AppData\Roaming\LibreOffice\4\user\template
UIConfig : C:\Program Files (x86)\LibreOffice 5\share\config
UserConfig : C:\Users\pq\AppData\Roaming\LibreOffice\4\user\config
Cannot get a property value of UserDictionary.
Work : C:\Users\pq\Documents
AutoCorrect_writable : C:\Users\pq\AppData\Roaming\LibreOffice\4\user\autocorr
AutoText_writable : C:\Users\pq\AppData\Roaming\LibreOffice\4\user\autotext
Backup_writable : C:\Users\pq\AppData\Roaming\LibreOffice\4\user\backup
Basic_writable : C:\Users\pq\AppData\Roaming\LibreOffice\4\user\basic
Dictionary_writable : C:\Users\pq\AppData\Roaming\LibreOffice\4\user\wordbook
Favorite_writable : C:\Users\pq\AppData\Roaming\LibreOffice\4\user\config\folders
Gallery_writable : C:\Users\pq\AppData\Roaming\LibreOffice\4\user\gallery
Graphic_writable : C:\Users\pq\AppData\Roaming\LibreOffice\4\user\gallery
Palette_writable : C:\Users\pq\AppData\Roaming\LibreOffice\4\user\config
Storage_writable : C:\Users\pq\AppData\Roaming\LibreOffice\4\user\store
Temp_writable : C:\Users\pq\AppData\Local\Temp
Template_writable : C:\Users\pq\AppData\Roaming\LibreOffice\4\user\template
UserConfig_writable : C:\Users\pq\AppData\Roaming\LibreOffice\4\user\config
Work_writable : C:\Users\pq\Documents
These paths have been converted to system paths.
linuxBeanで実行したときと同様にUserDictionaryは定義されていませんでした。

(2017.11.30追記。拡張機能のインストールパスは拡張機能IDを引数にして、PackageInformationProviderサービスのgetPackageLocation()メソッドで取得できます。)

参考にしたサイト

LibreOffice 5.3 SDK - Developer's Guide Examples
Javaの例PathsettingsTest.javaをPythonにしました。

OOoBasic/Generic/UCB - ...?
vnd.sun.star.expandがでてくる解説。

次の関連記事:LibreOffice5(76)FilePickerのフィルターを作成: 失敗

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ