Top > OOoBasic > Generic > FilterOption

フィルタオプションダイアログ Edit

フィルタを指定して開いたり保存したりするときに表示されるフィルタオプションダイアログを利用する方法です。

フィルタオプションダイアログはサービスとして実装されており、マクロなどからも利用できます。

フィルタオプションダイアログを利用するとフィルタオプションの値が取得できます。が、フィルタオプションの値を調べるだけであればマクロの記録を利用できます。そのため、ユーザーに指定させる必要がある時に。

UI コンポーネント Edit

フィルタオプション設定が利用できるフィルタには UIComponent が指定されています。 このプロパティ値がフィルタオプションダイアログのサービス名を示しています。空のときにはフィルタオプションダイアログはありません。

まず利用したいフィルタの UIComponent 値を調べます。調べる方法は二つあります。

  1. /share/registry/modules/org/openoffice/TypeDetection/Filters 以下のファイルから探す
  2. com.sun.star.document.FilterFactory からフィルタの取得する

一つ目の方法は見るだけなので二つ目の方法を取り上げます。フィルターファクトリからフィルタ名などを指定してフィルタディスクリプタを取得、そこから 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 など他の画像のエクスポートでも利用されます。

フィルタオプションダイアログの利用 Edit

実際にフィルタオプションダイアログを利用します。このとき、実際にフィルタされるドキュメントが必要です。

手順は次のようになります。

  1. UIComponent の値から調べたサービスをインスタンス化。
  2. フィルター名を設定
  3. フィルタするドキュメントを設定
  4. ダイアログを表示
  5. フィルタオプション結果の値を取得
  6. (取得した結果を利用して保存または開く)

ドキュメント(モデル)オブジェクトが必要です。

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 です。フィルタ名の指定を追加して保存などの際の引数に利用できます。

保存例 Edit

たとえば、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

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes