Top > OOoBasic > Generic > DispatchInterception

コマンドの捕捉 Edit

frame からの dispatch によるコマンドの実行を捕捉します。あるコマンドの実行を捕捉して別の処理を行ったり、補足処理を行ったり、コマンドを破棄したりといったことができます。

これはフレーム単位で行います。そのため、ドキュメントごとにフレームからのコマンドを無効化したりといったことができます。

フレームの com.sun.star.frame.XDispatchProviderInterception インターフェースのメソッドを利用してインターセプタを登録、削除します。インターセプタは複数登録できます。

そして、インターセプタは順番が回ってきたら com.sun.star.frame.XDispatchProviderInterceptor および com.sun.star.frame.XDispatchProvider インターフェースのメソッドを利用して何かを行います。

動作の詳細が必要であれば以下のドキュメントを参照してください。

新しくインターセプタを作成してフレームに登録します。また、二つ目のプロシージャは削除用です。

Global oDispatchInterceptor As Object
Global oSlaveDispatchProvider As Object
Global oMasterDispatchProvider As Object
Global oInterceptor As Object

' register interceptor
Sub registerInterceptor()
  ' create interceptor
  oInterceptor = CreateUnoListener( _
    "DispatchPRoviderInterceptor_", _
      "com.sun.star.frame.XDispatchProviderInterceptor")
  oDoc = ThisComponent
  oController = oDoc.getCurrentController()
  oFrame = oController.getFrame()
  ' register to the frame
  oFrame.registerDispatchProviderInterceptor(oInterceptor)
End Sub

' release interceptor
Sub releaseInterceptor()
  oDoc = ThisComponent
  oController = oDoc.getCurrentController()
  oFrame = oController.getFrame()
  ' release from the frame
  oFrame.releaseDispatchProviderInterceptor(oInterceptor)
End Sub

インターセプタは XDispatchProvider インターフェースのメソッドが呼ばれることでコマンドを捕捉、受け取ります。ここで処理が必要であれば捕捉します。処理が終わったり、処理が不要であれば次のインターセプタに処理をまわします。コマンドを無効化するのであれば Null が戻るようにします。

' intercept commands, judge and pass or disable it
Function DispatchPRoviderInterceptor_queryDispatch( aURL, sName, nFlag )
  On Error GoTo Handler:
  If aURL.Protocol = ".uno:" Then
    If aURL.Path = "Copy" OR aURL.Path = "Paste" OR aURL.Path = "Cut" Then
      'DispatchPRoviderInterceptor_queryDispatch = Null
      Exit Function
    End If
  End If
  'If NOT IsNull(oSlaveDispatchProvider) Then
  DispatchPRoviderInterceptor_queryDispatch = oSlaveDispatchProvider.queryDispatch( aURL, sName, nFlag )
  'End If
  Exit Function
  Handler:
End Function

Function DispatchPRoviderInterceptor_queryDispatches()
End Function

前後のインターセプタと協調するために以下のプロシージャや関数が必要です。

Function DispatchPRoviderInterceptor_getSlaveDispatchProvider()
  DispatchPRoviderInterceptor_getSlaveDispatchProvider() = oSlaveDispatchProvider
End Function

Sub DispatchPRoviderInterceptor_setSlaveDispatchProvider( oNewDispatchProvider )
  oSlaveDispatchProvider = oNewDispatchProvider
End Sub

Function DispatchPRoviderInterceptor_getMasterDispatchProvider()
  DispatchPRoviderInterceptor_getMasterDispatchProvider() = oMasterDispatchProvider
End Function

Sub DispatchPRoviderInterceptor_setMasterDispatchProvider( oNewSupplier )
  oMasterDispatchProvider = oNewSupplier
End Sub

Dispatch インターセプションでコマンドを無効化すれば XDispatch インターフェースが戻らないのでメニューなどの該当項目もグレーになり利用不可になります (当該フレームのみ)。


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