On Tue, 2012-02-28 at 12:26 +0000, Caolán McNamara wrote:
FWIW, the nastiness in that SpellDialog is that there are a bunch of
things which would be natural to put directly into the ctor, but they
would require calling virtual methods during construction, which doesn't
work in c++, so there's some lame post-an-event hack and complete the
construction steps that want to call virtuals in the event-callback
which gets called on the next iteration of the main loop after the
construction has completed.
Oh - that sounds pretty horrible lifecycle wise.
Dialog is fragile and tricky :-(
So - given that the dialog was moved to cui, is not public, and has
only one constructor in the factory method - would something like the
appended clean that up rather pleasantly ?
Thoughts on the appended appreciated ...
All the best,
Michael.
diff --git a/cui/source/dialogs/SpellDialog.cxx b/cui/source/dialogs/SpellDialog.cxx
index cd9b273..8fe8036 100644
--- a/cui/source/dialogs/SpellDialog.cxx
+++ b/cui/source/dialogs/SpellDialog.cxx
@@ -284,9 +284,6 @@ SpellDialog::SpellDialog(
// disable controls if service is missing
if (!xSpell.is())
Enable( sal_False );
-
- Application::PostUserEvent( STATIC_LINK(
- this, SpellDialog, InitHdl ) );
}
// -----------------------------------------------------------------------
@@ -530,34 +527,33 @@ void SpellDialog::SpellContinue_Impl(bool bUseSavedSentence, bool
bIgnoreCurrent
/* Initialize, asynchronous to prevent virtial calls
from a constructor
*/
-IMPL_STATIC_LINK( SpellDialog, InitHdl, SpellDialog *, EMPTYARG )
+void SpellDialog::LateInit()
{
- pThis->SetUpdateMode( sal_False );
+ SetUpdateMode( sal_False );
//show or hide AutoCorrect depending on the modules abilities
- pThis->aAutoCorrPB.Show(pThis->rParent.HasAutoCorrection());
- pThis->SpellContinue_Impl();
- pThis->aSentenceED.ResetUndo();
- pThis->aUndoPB.Enable(sal_False);
+ aAutoCorrPB.Show(rParent.HasAutoCorrection());
+ SpellContinue_Impl();
+ aSentenceED.ResetUndo();
+ aUndoPB.Enable(sal_False);
// get current language
- pThis->UpdateBoxes_Impl();
+ UpdateBoxes_Impl();
// fill dictionary PopupMenu
- pThis->InitUserDicts();
-
- pThis->LockFocusChanges(true);
- if( pThis->aChangePB.IsEnabled() )
- pThis->aChangePB.GrabFocus();
- else if( pThis->aIgnorePB.IsEnabled() )
- pThis->aIgnorePB.GrabFocus();
- else if( pThis->aClosePB.IsEnabled() )
- pThis->aClosePB.GrabFocus();
- pThis->LockFocusChanges(false);
+ InitUserDicts();
+
+ LockFocusChanges(true);
+ if( aChangePB.IsEnabled() )
+ aChangePB.GrabFocus();
+ else if( aIgnorePB.IsEnabled() )
+ aIgnorePB.GrabFocus();
+ else if( aClosePB.IsEnabled() )
+ aClosePB.GrabFocus();
+ LockFocusChanges(false);
//show grammar CheckBox depending on the modules abilities
- pThis->aCheckGrammarCB.Check( pThis->rParent.IsGrammarChecking() );
- pThis->SetUpdateMode( sal_True );
- pThis->Show();
- return 0;
+ aCheckGrammarCB.Check( rParent.IsGrammarChecking() );
+ SetUpdateMode( sal_True );
+ Show();
};
// -----------------------------------------------------------------------
diff --git a/cui/source/factory/dlgfact.cxx b/cui/source/factory/dlgfact.cxx
index 5825421..c3f53e8 100644
--- a/cui/source/factory/dlgfact.cxx
+++ b/cui/source/factory/dlgfact.cxx
@@ -1184,6 +1184,7 @@ AbstractSpellDialog * AbstractDialogFactory_Impl::CreateSvxSpellDialog(
svx::SpellDialogChildWindow* pSpellChildWindow )
{
svx::SpellDialog* pDlg = new svx::SpellDialog(pSpellChildWindow, pParent, pBindings);
+ pDlg->LateInit();
return new AbstractSpellDialog_Impl(pDlg);
}
diff --git a/cui/source/inc/SpellDialog.hxx b/cui/source/inc/SpellDialog.hxx
index 71d502c..bf496c3 100644
--- a/cui/source/inc/SpellDialog.hxx
+++ b/cui/source/inc/SpellDialog.hxx
@@ -217,8 +217,6 @@ private:
DECL_LINK( DialogUndoHdl, SpellUndoAction_Impl* );
DECL_LINK( HandleHyperlink, svt::FixedHyperlink * );
- DECL_STATIC_LINK( SpellDialog, InitHdl, SpellDialog * );
-
void StartSpellOptDlg_Impl();
void InitUserDicts();
void UpdateBoxes_Impl();
@@ -251,10 +249,10 @@ public:
SfxBindings* pBindings);
~SpellDialog();
- void SetLanguage( sal_uInt16 nLang );
- virtual sal_Bool Close();
-
- void InvalidateDialog();
+ void LateInit();
+ void SetLanguage( sal_uInt16 nLang );
+ virtual sal_Bool Close();
+ void InvalidateDialog();
};
} //namespace svx
--
michael.meeks@suse.com <><, Pseudo Engineer, itinerant idiot
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.