(2017.11.12追記。「ファイルフィルター」という用語を「表示フィルター」に変更しました。LibreOffice5(93)ファイルフィルターのダイアログ(UIComponent)の一覧を取得参照。)
前の関連記事:LibreOffice5(76)FilePickerのフィルターを作成: 失敗
initialize()かcreateInstanceWithArgumentsAndContext()でTemplateDescriptionをFilePickerに渡す
定数com.sun.star.ui.dialogs.TemplateDescriptionをFilePickerサービスに与えるとファイル選択ダイアログの種類を変更できます。
FilePickerサービスのAPIリファレンスをみるとcreateWithMode()という関数が載っています。
TemplateDescriptionはこのcreateWithMode()の引数でFilePickerサービスに渡されます。
しかしこのcreateWithMode()はどのインターフェイスにも属しておらず、FilePickerサービスのインスタンスのメソッドにもでてきません。
このcreateWithMode()はLibreOffice5(23)ダイアログエディタでGUIを作成しPythonで利用する:その3でやったDialogProviderサービスのcreateWithModelAndScripting()と同様にXInitializationインターフェイスのinitialize()メソッドで呼び出されるものです。
(XInitializationの実装は必須ではなく、実装されていないUNOコンポーネントでは次に述べるようにcreateInstanceWithArgumentsAndContext()の引数でしか渡せません。)
なので、FilePickerサービスのインスタンスにTemplateDescriptionを渡すにはinitialize()メソッドを使います。
initialize()メソッドの引数はタプルでないといけないので、TemplateDescriptionはタプルの1番目の引数で渡します。
FilePickerサービスはXInitializationインターフェイスを実装しているので、createInstanceWithArgumentsAndContext()でもTemplateDescriptionを渡せます(initialize()メソッドがあれば最ビスマネージャーのcreateInstanceWithArgumentsAndContext()が使えますが、逆は常に真ではありません。LibreOffice5(23)ダイアログエディタでGUIを作成しPythonで利用する:その3参照。)
XInitializationインターフェイスは実装に依存するためにAPIリファレンスに出てこないのでわかりにくいですが、インターフェイスに属していないメソッドが書いてあればそれはinitialize()メソッドで使えるようです。
TemplateDescriptionを変化させてFilePickerを表示させるマクロ
GUI/systemdialog.py at 77db52cd83090d152e47a1ebe044cdc962787a2b · p--q/GUI
このマクロを実行するとTemplateDescriptionを変化させてファイル選択ダイアログを表示させます。
次のダイアログを表示させるにはダイアログの「キャンセル」ボタンをクリックします。
途中でやめる方法は用意していないので、一旦起動したら13個すべてのダイアログと1個のフォルダ選択ダイアログを表示させないといけません。
オートメーションで実行させるコードもついていますが、これは単なるデバッグ用としか使えず、オートメーションでFilePickerサービスをインスタンス化して実行するとLibreOfficeがクラッシュします。
FolderPickerも同様にクラッシュします。
関数createFilepicker()でinitialize()メソッドかサービスマネージャーのcreateInstanceWithArgumentsAndContext()メソッドで、TemplateDescriptionを渡せるようにしていますが、たぶんどちらの方法でも結果は同じです。
最初に開くフォルダはホームフォルダにしています。
ダイアログタイトルに使用したTemplateDescriptionの名前を表示させています。
保存ダイアログではデフォルトファイル名をsetDefaultName()で表示できますが、開くダイアログでは無視されました。
FILEOPEN_PREVIEWとFILEOPEN_LINK_PLAYは、LibreOffice5.3以上でしか実装されていないので、インポートエラーがでたときはその旨をメッセージボックスで表示するようにしました。
表示フィルターはLibreOffice5(68)画像フィルターリストの作成で作成した画像ファイルのものと、これらをすべてを表示するAll Image Files、画像ファイルに限らずすべてのファイルを表示するAll Filesを追加しました。
デフォルト表示フィルターにはAll Image Filesを設定していますが、linuxBeanの保存ダイアログでは「すべての形式」というのが優先して表示されてしまいます。
この「すべての形式」フィルタはappendFilter()で追加された表示フィルターのすべての拡張子を結合したもののようです(つまりAll Image Filesと同じ)。
ファイル選択ダイアログのあと、最後にFolderPickerサービスを使ってフォルダ選択ダイアログも表示させています。
開くダイアログ
linuxBean14.04のデスクトップ環境はLXDE、ウィンドウマネージャーはOpenboxです。
Windows10は64bit版です。
FILEOPEN_SIMPLE
コントロールが一つもないシンプルな開くダイアログです。
ドットから始まる隠しフォルダが表示されていますが、Ctrl+hで隠しファイルを非表示にできます。
setDefaultName()を設定してもデフォルトファイル名は空欄になっています。
左の枠の下の+-ボタンはlinuxBeanのファイルマネージャーのブックマークの編集ボタンです。
表示フィルターを一つも追加していないときは表示フィルター選択リストボックスは表示されません。
Windows10では表示フィルターは表示フィルター名だけでなく拡張子も表示されます。
FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE
チェックボックス: プレビュー
チェックボックス: リンクとして挿入
リストボックス: 枠スタイル
チェックボックス2個とリストボックス1個がついています。
プレビューのチェックボックスにチェックをつけると選択したファイルのプレビューが取得できるときのみ、ウィンドウがダイアログ内の右側にでてきます。
このプレビューチェックボックス以外は自分で実装しないといけないようで、操作しても何も起こりません。
Windows10ではデフォルトでプレビューボタンがついているせいか、プレビューのチェックボックスは表示されませんでした。
コントロールのラベルの訳とレイアウトがOS(ファイルマネージャ?)によって少し違いますね。
FILEOPEN_PLAY
再生ボタン
再生ボタンが1個ついています。
Windows10ではPlayボタンが出現します。
FILEOPEN_READONLY_VERSION
チェックボックス: 読み取り専用
リストボックス: バージョン
チェックボックス1個とリストボックス1個がついています。
Windows10のコントロール部分。
FILEOPEN_LINK_PREVIEW
チェックボックス: プレビュー
チェックボックス: リンクとして挿入
Windows10。
FILEOPEN_PREVIEW
チェックボックス: プレビュー
LibreOffice 5.3以上のみ
手元にLibreOffice5.3を入れたWindows10を試していませんが、Windows10ではプレビューチェックボックスが表示されないので、FILEOPEN_SIMPLEと同じになると思います。
FILEOPEN_LINK_PLAY
チェックボックス: リンクとして挿入
再生ボタン
LibreOffice 5.3以上のみ
これもWindows10では試していません。
以上の7個が開くダイアログのテンプレートの実行結果です。
保存ダイアログ
次は保存ダイアログ6個です。
FILESAVE_SIMPLE
コントロールのないシンプルな保存ダイアログ。
開くダイアログと違ってsetDefaultName()が反映されてデフォルトファイル名「UML.png」が表示されています。
ところが保存ダイアログではデフォルト表示フィルターは「すべての形式」になってしまいます。
「すべての形式」はダイアログが勝手に作成した表示フィルターのようで、追加した表示フィルターの*を除くすべての拡張子を結合したもののようです。
つまり今回の例の場合はAll Image Filesと同じものなので、同じ意味の表示フィルターが重複することになります。
Windows10ではlinuxBeanのときのように自動生成される表示フィルターは出現しませんでしたので、All Image Filesを省くのも考えものです。
Windows10のFILESAVE_SIMPLEではsetDefaultName()の設定が無視されています。
FILESAVE_AUTOEXTENSION_PASSWORD
チェックボックス: 拡張子をつける
チェックボックス: パスワード付きで保存する
linuxBeanでは「拡張子をつける」チェックボックスは表示されませんでした。
Windows10ではデフォルトで「ファイル名に拡張子を付ける」チェックボックスにチェックが入っていました。
setDefaultName()で設定した「UMO.png」というファイル名がなぜか「UML.fh11」と表示されています。
FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS
チェックボックス: 拡張子をつける
チェックボックス: フィルター 設定を編集する
チェックボックス: パスワード付きで保存する
この「フィルター設定」というのは「表示フィルター」ではなく「ファイルフィルター」のことです。
Windows10。
FILESAVE_AUTOEXTENSION_SELECTION
チェックボックス: 拡張子をつける
チェックボックス: 選択範囲
Windows10。
FILESAVE_AUTOEXTENSION_TEMPLATE
チェックボックス: 拡張子をつける
リストボックス: スタイル
Windows10ではリストボックスのラベルがTemplateになっていますね。
FILESAVE_AUTOEXTENSION
チェックボックス: 拡張子をつける
linuxBeanでは「拡張子をつける」チェックボックスが表示されないので、これはFILESAVE_SIMPLEと同じになります。
Windows10。
プレビューのチェックボックス以外は自分で実装しないといけないようです。
XFilePickerControlAccessインターフェイスのメソッドである程度カスタマイズできるようですが、コントロールの追加や削除は好きにできないようです。
フォルダ選択ダイアログ
FolderPicker。
linuxBeanではFilePickerと似たようなデザインになっています。
Windows10ではFilePickerと全く違うデザインになっています。
0 件のコメント:
コメントを投稿