フィルタオプションダイアログ
フィルタを指定して開いたり保存したりするときに表示されるフィルタオプションダイアログを利用する方法です。 フィルタオプションダイアログはサービスとして実装されており、マクロなどからも利用できます。 フィルタオプションダイアログを利用するとフィルタオプションの値が取得できます。が、フィルタオプションの値を調べるだけであればマクロの記録を利用できます。そのため、ユーザーに指定させる必要がある時に。 UI コンポーネント
フィルタオプション設定が利用できるフィルタには UIComponent が指定されています。 このプロパティ値がフィルタオプションダイアログのサービス名を示しています。空のときにはフィルタオプションダイアログはありません。 まず利用したいフィルタの UIComponent 値を調べます。調べる方法は二つあります。
一つ目の方法は見るだけなので二つ目の方法を取り上げます。フィルターファクトリからフィルタ名などを指定してフィルタディスクリプタを取得、そこから UIComponent の値を参照します。 Sub filteroptions_1 oFC = CreateUnoService("com.sun.star.document.FilterFactory") oProps = oFC.getByName("draw_png_Export") msgbox GetPropertyValue(oProps, "UIComponent") End Sub Function GetPropertyValue( props, sName As String ) Dim found As Variant n = ubound(props) for i = 0 to n step 1 if props(i).Name = sName then found = props(i).Value exit for end if next GetPropertyValue = found End Function たとえば、上記の例では png エクスポートフィルタ draw_png_Export の UIComponent は "com.sun.star.svtools.SvFilterOptionsDialog" です。この UIComponent は jpeg、bmp、gif など他の画像のエクスポートでも利用されます。 フィルタオプションダイアログの利用
実際にフィルタオプションダイアログを利用します。このとき、実際にフィルタされるドキュメントが必要です。 手順は次のようになります。
ドキュメント(モデル)オブジェクトが必要です。 Sub filteroption_2 ( oLocDoc As Object ) oFilterOptionDialog = CreateUnoService( _ "com.sun.star.svtools.SvFilterOptionsDialog" ) ' 1 Dim aArg(0) As New com.sun.star.beans.PropertyValue aArg(0).Name = "FilterName" aArg(0).Value = "draw_png_Export" oFilterOptionDialog.setPropertyValues( aArg ) ' 2 oFilterOptionDialog.setSourceDocument( oLocDoc ) ' 3 if oFilterOptionDialog.execute() = 1 then ' 4 aOptions = oFilterOptionDialog.getPropertyValues() ' 5 end if End Sub 取得した値はドキュメントを開いたり保存したりするときに使用する .document.MediaDescriptor で指定する FilterOptions および FilterData です。フィルタ名の指定を追加して保存などの際の引数に利用できます。 保存例
たとえば、BookmarksMenu 拡張機能では次のように利用しています。aLocOptions がオプションダイアログを利用して取得したオプション設定。 ドキュメントの保存は .uno:SaveAs コマンドに行わせています (安全のため)。 Sub SaveAsWithOptions( _ sLocFileURL As String, sLocFilterName As String, oLocFrame As Object, _ sLocPassword As String, aLocOptions As Object ) ' do SaveAs with dispatch framework ' @param sLocFileURL file url ' @param sLocFilterName internal filter name ' @param oLocFrame frame retains the document will be stored ' @param sLocPassword password, if empty, ignored ' @param aLocOptions options from filter options dialog On Error GoTo Handler: aURL = createUnoStruct("com.sun.star.util.URL") aURL.Complete = ".uno:SaveAs" CreateUnoService("com.sun.star.util.URLTransformer")._ parseStrict(aURL) ' 保存時に必要な保存先およびフィルタ名指定 Dim aLocArgs(1) As New com.sun.star.beans.PropertyValue aLocArgs(0).Name = "URL" aLocArgs(0).Value = sLocFileURL aLocArgs(1).Name = "FilterName" aLocArgs(1).Value = sLocFilterName ' パスワード指定 If sLocPassword <> "" Then aPassword = CreateUnoStruct("com.sun.star.beans.PropertyValue") aPassword.Name = "Password" aPassword.Value = sLocPassword AppendToArray( aLocArgs, aPassword ) End If ' オプションを保存オプションに追加 If Not IsNull(aLocOptions) Then For i = 0 To UBound(aLocOptions) Step 1 AppendToArray( aLocArgs, aLocOptions(i) ) Next End If ' .uno:SaveAs 実行 oDisp = oLocFrame.queryDispatch(aURL,"_self",0) If Not IsNull(oDisp) Then oDisp.dispatch(aURL,aLocArgs) Else msgbox "This document can not be saved." End If Exit Sub Handler: msgbox "Faild to store the document." End Sub Sub AppendToArray( LocArray, LocItem ) n = UBound( LocArray ) ReDim Preserve LocArray(n +1) LocArray(n +1) = LocItem End Sub |