Hi Mathias, Alle 16:50, martedì 5 settembre 2006, Mathias Bauer ha scritto: > Cor Nouws wrote: > > Hi *, > > > > In order to force/advice the saving of certain documents on a specified > > location, I prepared some macro's, looking at the documents state, name > > and such, and opening the save-dialog. > > Then I assigned the macro's to Save(-As) with Tools|Customisation|Events > > in order that a click on the 'floppy' or File|Save triggers my macro. > > > > However, it appears (2.0.3, on XP, 2.0.2 on Madrake) that my code is > > triggered áfter the regular Save(-As) actions :-\ > > Yes and no. Your code will be triggered right after the dialog is closed > but before the real saving starts. These events are means to perform > actions on the document before they get saved, not as a hook to replace > the built-in UI code. > > > What am I supposed to do to actually replace those? > > This is what DispatchInterceptors are for. Unfortunately you can't > implement them in Basic. Replacing dispatch actions triggered by the UI > with macros is currently not supported. Sounds like a good idea though.
Although an "official" support is actually missing, with a "creative" ;-) use of the createUnoListener() function it's possible to intercept dispatches and replace dispatch actions with your arbitrary basic code. See for example the demo code below: (please, restore lines broken from the mailer before your test) REM ***** BASIC ***** Option Explicit Global oDispatchInterceptor Global oSlaveDispatchProvider Global oMasterDispatchProvider Global oFrame Global bDebug As Boolean Dim oCopyDispatch '_______________________________________________________________________________________________________________________ Sub RegisterInterceptor oFrame = ThisComponent.currentController.Frame oDispatchInterceptor = CreateUnoListener("ThisFrame_", _ "com.sun.star.frame.XDispatchProviderInterceptor") oFrame.registerDispatchProviderInterceptor(oDispatchInterceptor) End Sub '_______________________________________________________________________________________________________________________ Sub ReleaseInterceptor() On Error Resume Next oFrame.releaseDispatchProviderInterceptor(oDispatchInterceptor) End Sub '_______________________________________________________________________________________________________________________ Function ThisFrame_queryDispatch ( oUrl, _ sTargetFrameName As String, lSearchFlags As Long ) As Variant Dim oDisp Dim sUrl As String 'slot protocol causes OOo crash... if oUrl.Protocol = "slot:" Then Exit Function End If If bDebug Then Print oUrl.complete End If 'do your dispatch management here: Select Case oUrl.complete Case ".uno:Copy" oDisp = GetCopyDispatch 'replace the original dispatch Case ".uno:Paste" oDisp = GetCopyDispatch 'replace the original dispatch Case ".uno:Save" oDisp = GetCopyDispatch 'replace the original dispatch Case ".uno:Undo" oDisp = GetCopyDispatch 'replace the original dispatch 'Case ".uno:blabla" 'do something Case Else oDisp = _ oSlaveDispatchProvider.queryDispatch( oUrl, sTargetFrameName, lSearchFlags ) End Select ThisFrame_queryDispatch = oDisp End Function '_______________________________________________________________________________________________________________________ Function ThisFrame_queryDispatches ( mDispatches ) As Variant 'ThisFrame_queryDispatches = mDispatches() End Function '_______________________________________________________________________________________________________________________ Function ThisFrame_getSlaveDispatchProvider ( ) As Variant ThisFrame_getSlaveDispatchProvider = oSlaveDispatchProvider End Function '_______________________________________________________________________________________________________________________ Sub ThisFrame_setSlaveDispatchProvider ( oSDP ) oSlaveDispatchProvider = oSDP End Sub '_______________________________________________________________________________________________________________________ Function ThisFrame_getMasterDispatchProvider ( ) As Variant ThisFrame_getMasterDispatchProvider = oMasterDispatchProvider End Function '_______________________________________________________________________________________________________________________ Sub ThisFrame_setMasterDispatchProvider ( oMDP ) oMasterDispatchProvider = oMDP End Sub '_______________________________________________________________________________________________________________________ Sub toggleDebug bDebug = Not bDebug End Sub '_______________________________________________________________________________________________________________________ Function GetCopyDispatch() If Not IsNull(oCopyDispatch) Then oCopyDispatch = _ CreateUnoListener("MyCustom_", "com.sun.star.frame.XDispatch") End If GetCopyDispatch = oCopyDispatch End Function '_______________________________________________________________________________________________________________________ Sub MyCustom_dispatch(URL, Arguments) Select Case URL.complete Case ".uno:Copy" MsgBox "Sorry, the original " & URL.complete & _ " dispatch was stolen from Paolo M.", 48 Case ".uno:Paste" ThisComponent.CurrentSelection(0).String = _ "**** ARBITRARY CLIPBOARD CONTENT PROVIDED BY PAOLO M. ****" Case ".uno:Save" MsgBox "Sorry, the original " & URL.complete & _ " dispatch was stolen from Paolo M.", 48 Case ".uno:Undo" MsgBox "Undo What????!!!???", 16 Case Else End Select End Sub '_______________________________________________________________________________________________________________________ Sub MyCustom_addStatusListener(Control, URL) End Sub '_______________________________________________________________________________________________________________________ Sub MyCustom_removeStatusListener (Control, URL) End Sub --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]