Date: prev next · Thread: first prev next last
2013 Archives by date, by thread · List index


On Wed, Mar 27, 2013 at 09:46:44AM +0000, mcmurchy1917-libreoffice@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/objxtor.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/docsh2.cxx:317
#38 0x00007f745fd87500 in SfxBaseController::suspend (this=0x3e89980,
bSuspend=<optimized out>)
    at
    /home/master/src/libreoffice/workdirs/libreoffice-4.0/sfx2/source/view/sfxbasecontroller.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.

-- 
Lionel

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.