Bug 42796 - Macro assigned to dataform Before Unload or While Unloading events are not called when form container is closed
mcmurchy1917-libreoffice at yahoo.co.uk
mcmurchy1917-libreoffice at yahoo.co.uk
Mon Apr 8 09:03:30 PDT 2013
Where I've got to thus far is -
Line 209 is not called in
comphelper/source/eventattachermgr/eventattachermgr.cxx
206 // Iterate over all listeners and pass events.
207 OInterfaceIteratorHelper aIt( mpManager->aScriptListeners );
208 while( aIt.hasMoreElements() )
209 ((XScriptListener *)aIt.next())->firing( aScriptEvent );
So I commented out lines 1279 and 1280 in
/home/libreoffice/core/forms/source/misc/InterfaceContainer.cxx
1277 void SAL_CALL OInterfaceContainer::removeScriptListener( const Reference<
XScriptListener >& xListener ) throw(IllegalArgumentException,
RuntimeException)
1278 {
1279 //mcmurchy if ( m_xEventAttacher.is() )
1280 //mcmurchy m_xEventAttacher->removeScriptListener( xListener );
1281 }
which gets me to lines 439/440 in
/home/libreoffice/core/svx/source/form/fmscriptingenv.cxx before returning which
suggests that scripting isn't running
437 // SfxObjectShellRef is good here since the model controls the lifetime of
the object
438 SfxObjectShellRef xObjectShell = m_rFormModel.GetObjectShell();
439 if( !xObjectShell.Is() )
440 return;
Iain
On Monday 08 Apr 2013 17:06:30 Lionel Elie Mamane wrote:
> On Wed, Mar 27, 2013 at 09:46:44AM +0000, mcmurchy1917-libreoffice at yahoo.co.uk
wrote:
> > In the bug report it was confirmed that a macro assigned to either
> > the Before Unloading or When Unloading events of a dataform are not
> > called when the form document is closed.
> >
> > However, when editing a form and the "Design Mode" option is toggled
> > the events are called.
>
> I completely missed that in my first reading of your mail:
>
> The *same* event (namely "Before Unloading" on the FormData) is:
>
> 1) *not* called when closing the form document
>
> 2) *called* when switching normal mode to design mode
>
> So we need to see *what* codepath calls it in case "2)" (with the
> msgbox / ctrl-c in gdb trick I described). That's already more or less
> done, with Noel's quote of:
>
> FmFormView::ChangeDesignMode
>
> 258 // --- 4. load resp. unload the forms
> 259 FmFormPage* pCurPage = GetCurPage();
> 260 if ( pCurPage )
> 261 {
> 262 if ( pFormShell && pFormShell->GetImpl() )
> 263 pFormShell->GetImpl()->loadForms( pCurPage, ( bDesign ?
> FORMS_UNLOAD : FORMS_LOAD ) ); 264 }
>
> The operative call seems to be:
> pFormShell->GetImpl()->loadForms(pCurPage, FORMS_UNLOAD)
>
> And then, we need to find where we need to call
> pFormShell->GetImpl()->loadForms(pCurPage, FORMS_UNLOAD)
> in the case "1)". My idea for that is to see what triggers the *form*
> *document* "before close" event (there does not seem to be a "before
> unload" event for it). That codepath should call
> pFormShell->GetImpl()->loadForms(pCurPage, FORMS_UNLOAD)
> somewhere
>
> I've taken a look, and this the relevant part of the backtrace:
>
>
> #36 0x00007f745fce2226 in SfxObjectShell::PrepareClose
> (this=0x3d2a1a0, bUI=<optimized out>,
> bForBrowsing=<optimized out>)
> at
>
> /home/master/src/libreoffice/workdirs/libreoffice-4.0/sfx2/source/doc/objxt
> or.cxx:596 #37 0x00007f742c1e82a7 in SwDocShell::PrepareClose
> (this=0x3d2a1a0, bUI=<optimized out>,
> bForBrowsing=<optimized out>)
> at
>
> /home/master/src/libreoffice/workdirs/libreoffice-4.0/sw/source/ui/app/docs
> h2.cxx:317 #38 0x00007f745fd87500 in SfxBaseController::suspend
> (this=0x3e89980, bSuspend=<optimized out>)
> at
>
> /home/master/src/libreoffice/workdirs/libreoffice-4.0/sfx2/source/view/sfxb
> asecontroller.cxx:650 #39 0x00007f743c5a1955 in
> dbaccess::ODocumentDefinition::prepareClose (this=0x31dfe30)
> at
>
> /home/master/src/libreoffice/workdirs/libreoffice-4.0/dbaccess/source/core/
> dataaccess/documentdefinition.cxx:2058 #40 0x00007f743c5b4c74 in
> dbaccess::OInterceptor::OnDispatch
> (this=0x2ca0990, _pDispatcher=0x3d680f0)
> at
>
> /home/master/src/libreoffice/workdirs/libreoffice-4.0/dbaccess/source/core/
> dataaccess/intercept.cxx:192
>
>
> But frankly, at this point I'm not sure how to get the "pFormShell"
> and "pCurPage" somewhere in this call stack; I think we need to do
> that in SwDocShell::PrepareClose or SfxObjectShell::PrepareClose
> somehow.
>
>
> Mcmurchy1917, I've also seen your email looking at the
> "m_aLoadListeners.notifyEach( &XLoadListener::unloading, aEvt );"
> That looks like a promising avenue, too.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/libreoffice/attachments/20130408/524e36e2/attachment.html>
More information about the LibreOffice
mailing list