Revision: 7402
          http://mahogany.svn.sourceforge.net/mahogany/?rev=7402&view=rev
Author:   vadz
Date:     2008-02-23 19:27:26 -0800 (Sat, 23 Feb 2008)

Log Message:
-----------
create page controls only when the page is shown to reduce the time needed to 
show the options dialog initially

Modified Paths:
--------------
    trunk/M/include/gui/wxOptionsPage.h
    trunk/M/src/gui/wxOptionsDlg.cpp

Modified: trunk/M/include/gui/wxOptionsPage.h
===================================================================
--- trunk/M/include/gui/wxOptionsPage.h 2008-01-23 11:39:33 UTC (rev 7401)
+++ trunk/M/include/gui/wxOptionsPage.h 2008-02-24 03:27:26 UTC (rev 7402)
@@ -165,10 +165,14 @@
    virtual ~wxOptionsPage();
 
 
-   // transfer data to/from the controls
+   // transfer data to/from the controls: derived classes should implement
+   // DoTransferOptionsTo/FromWindow() instead of overriding those
    virtual bool TransferDataToWindow();
    virtual bool TransferDataFromWindow();
 
+   // create controls when the page is shown in the notebook for the first time
+   virtual bool Show(bool show = true);
+
    // to change the profile associated with the page:
    void SetProfile(Profile *profile);
 
@@ -192,6 +196,10 @@
    int HelpId(void) const { return m_HelpId; }
 
 protected:
+   // these methods are called from TransferDataTo/FromWindow()
+   virtual bool DoTransferOptionsToWindow();
+   virtual bool DoTransferOptionsFromWindow();
+
    /// get the name of the folder we're editing the options of
    String GetFolderName() const;
 
@@ -518,9 +526,6 @@
 public:
    wxOptionsPageNetwork(wxNotebook *parent, Profile *profile);
 
-   virtual bool TransferDataToWindow();
-   virtual bool TransferDataFromWindow();
-
    // for wxOptionsPageDesc
    static wxOptionsPage *New(wxNotebook *parent,
                              const wxString& title,
@@ -537,6 +542,10 @@
                                       helpID, image);
    }
 
+protected:
+   virtual bool DoTransferOptionsToWindow();
+   virtual bool DoTransferOptionsFromWindow();
+
 private:
    // ctor for New()
    wxOptionsPageNetwork(wxNotebook *parent,
@@ -580,8 +589,9 @@
 
    void OnButton(wxCommandEvent&);
 
-   virtual bool TransferDataToWindow();
-   virtual bool TransferDataFromWindow();
+protected:
+   virtual bool DoTransferOptionsToWindow();
+   virtual bool DoTransferOptionsFromWindow();
 
 private:
    // create m_folder for our m_Profile
@@ -654,8 +664,9 @@
 
    void OnButton(wxCommandEvent&);
 
-   virtual bool TransferDataToWindow();
-   virtual bool TransferDataFromWindow();
+protected:
+   virtual bool DoTransferOptionsToWindow();
+   virtual bool DoTransferOptionsFromWindow();
 
 private:
    // the names of all available viewers
@@ -674,10 +685,10 @@
 public:
    wxOptionsPageFolderView(wxNotebook *parent, Profile *profile);
 
-   virtual bool TransferDataToWindow();
-   virtual bool TransferDataFromWindow();
+protected:
+   virtual bool DoTransferOptionsToWindow();
+   virtual bool DoTransferOptionsFromWindow();
 
-protected:
    void OnButton(wxCommandEvent&);
 
 private:
@@ -691,8 +702,9 @@
 public:
    wxOptionsPageFolderTree(wxNotebook *parent, Profile *profile);
 
-   virtual bool TransferDataToWindow();
-   virtual bool TransferDataFromWindow();
+protected:
+   virtual bool DoTransferOptionsToWindow();
+   virtual bool DoTransferOptionsFromWindow();
 
 private:
    bool m_isHomeOrig;
@@ -707,8 +719,9 @@
 public:
    wxOptionsPageFolders(wxNotebook *parent, Profile *profile);
 
-   virtual bool TransferDataToWindow();
-   virtual bool TransferDataFromWindow();
+protected:
+   virtual bool DoTransferOptionsToWindow();
+   virtual bool DoTransferOptionsFromWindow();
 
    void OnUpdateUIBtns(wxUpdateUIEvent&);
 
@@ -727,7 +740,7 @@
 public:
    wxOptionsPagePython(wxNotebook *parent, Profile *profile);
 
-   virtual bool TransferDataFromWindow();
+   virtual bool DoTransferOptionsFromWindow();
 
 private:
    DECLARE_NO_COPY_CLASS(wxOptionsPagePython)
@@ -741,8 +754,9 @@
 public:
    wxOptionsPageAdb(wxNotebook *parent, Profile *profile);
 
-   virtual bool TransferDataToWindow();
-   virtual bool TransferDataFromWindow();
+protected:
+   virtual bool DoTransferOptionsToWindow();
+   virtual bool DoTransferOptionsFromWindow();
 
 private:
    DECLARE_NO_COPY_CLASS(wxOptionsPageAdb)
@@ -765,12 +779,13 @@
 public:
    wxOptionsPageSync(wxNotebook *parent, Profile *profile);
 
-   virtual bool TransferDataToWindow();
-   virtual bool TransferDataFromWindow();
+protected:
+   virtual bool DoTransferOptionsToWindow();
+   virtual bool DoTransferOptionsFromWindow();
 
    void OnButton(wxCommandEvent& event);
 
-protected:
+
    // do we want to use settings synchronization?
    // (may be true, false or -1 if unknown)
    int m_activateSync;
@@ -791,12 +806,13 @@
 public:
    wxOptionsPageOthers(wxNotebook *parent, Profile *profile);
 
-   virtual bool TransferDataToWindow();
-   virtual bool TransferDataFromWindow();
+protected:
+   virtual bool DoTransferOptionsToWindow();
+   virtual bool DoTransferOptionsFromWindow();
 
    void OnButton(wxCommandEvent&);
 
-protected:
+
    // the old auto save timer interval
    long m_nAutosaveDelay;
 

Modified: trunk/M/src/gui/wxOptionsDlg.cpp
===================================================================
--- trunk/M/src/gui/wxOptionsDlg.cpp    2008-01-23 11:39:33 UTC (rev 7401)
+++ trunk/M/src/gui/wxOptionsDlg.cpp    2008-02-24 03:27:26 UTC (rev 7402)
@@ -76,6 +76,13 @@
 
 #include "ColourNames.h"
 
+// uncomment this to output some timings about options dialog creation
+#define PROFILE_OPTIONS_DLG
+
+#ifdef PROFILE_OPTIONS_DLG
+   #include <wx/stopwatch.h>
+#endif
+
 // ----------------------------------------------------------------------------
 // persistent msgboxes we use here
 // ----------------------------------------------------------------------------
@@ -2369,8 +2376,6 @@
       image = -1;
    }
 
-   notebook->AddPage(this, title, FALSE /* don't select */, image);
-
    m_Profile = profile;
    m_Profile->IncRef();
 
@@ -2379,8 +2384,11 @@
    m_nFirst = nFirst;
    m_nLast = nLast;
 
-   CreateControls();
+   notebook->AddPage(this, title, FALSE /* don't select */, image);
 
+   // don't create controls yet, this will be done in Show() when we become the
+   // notebook current page
+
    return true;
 }
 
@@ -2397,6 +2405,33 @@
    SafeDecRef(m_Profile);
 }
 
+bool wxOptionsPage::Show(bool show)
+{
+   if ( !wxNotebookPageBase::Show(show) )
+      return false;
+
+   if ( show && m_aControls.IsEmpty() )
+   {
+#ifdef PROFILE_OPTIONS_DLG
+      wxStopWatch sw;
+#endif
+
+      CreateControls();
+
+      Layout();
+
+      TransferDataToWindow();
+
+      UpdateUI();
+
+#ifdef PROFILE_OPTIONS_DLG
+      wxLogStatus(_T("Options page created in %ldms"), sw.Time());
+#endif
+   }
+
+   return true;
+}
+
 String wxOptionsPage::GetFolderName() const
 {
    return m_Profile->GetFolderName();
@@ -2655,6 +2690,9 @@
 
 void wxOptionsPage::UpdateUI()
 {
+   if ( m_aControls.IsEmpty() )
+      return;
+
    for ( size_t n = m_nFirst; n < m_nLast; n++ ) {
       int nCheckField = m_aFields[n].enable;
       if ( nCheckField != -1 ) {
@@ -2784,6 +2822,17 @@
 // read the data from config
 bool wxOptionsPage::TransferDataToWindow()
 {
+   if ( m_aControls.IsEmpty() )
+   {
+      // we're not created yet, will do this later
+      return true;
+   }
+
+   return DoTransferOptionsToWindow();
+}
+
+bool wxOptionsPage::DoTransferOptionsToWindow()
+{
    // disable environment variable expansion here because we want the user to
    // edit the real value stored in the config
    ProfileEnvVarSave suspend(m_Profile, false);
@@ -2974,12 +3023,23 @@
       ClearDirty(n);
    }
 
-   return TRUE;
+   return true;
 }
 
 // write the data to config
 bool wxOptionsPage::TransferDataFromWindow()
 {
+   if ( m_aControls.IsEmpty() )
+   {
+      // we must have been never shown so no data could have been modified
+      return true;
+   }
+
+   return DoTransferOptionsFromWindow();
+}
+
+bool wxOptionsPage::DoTransferOptionsFromWindow()
+{
    String strValue;
    long lValue = 0;
    for ( size_t n = m_nFirst; n < m_nLast; n++ )
@@ -3451,9 +3511,9 @@
    }
 }
 
-bool wxOptionsPageMessageView::TransferDataToWindow()
+bool wxOptionsPageMessageView::DoTransferOptionsToWindow()
 {
-   bool bRc = wxOptionsPage::TransferDataToWindow();
+   bool bRc = wxOptionsPage::DoTransferOptionsToWindow();
    if ( bRc )
    {
       wxArrayString descViewers;
@@ -3489,9 +3549,9 @@
    return bRc;
 }
 
-bool wxOptionsPageMessageView::TransferDataFromWindow()
+bool wxOptionsPageMessageView::DoTransferOptionsFromWindow()
 {
-   bool bRc = wxOptionsPage::TransferDataFromWindow();
+   bool bRc = wxOptionsPage::DoTransferOptionsFromWindow();
    if ( bRc )
    {
       wxWindow *win = GetControl(ConfigField_MsgViewer);
@@ -3541,9 +3601,9 @@
 {
 }
 
-bool wxOptionsPageFolderView::TransferDataToWindow()
+bool wxOptionsPageFolderView::DoTransferOptionsToWindow()
 {
-   if ( !wxOptionsPageStandard::TransferDataToWindow() )
+   if ( !wxOptionsPageStandard::DoTransferOptionsToWindow() )
       return false;
 
    wxRadioBox *radio =
@@ -3568,9 +3628,9 @@
    return true;
 }
 
-bool wxOptionsPageFolderView::TransferDataFromWindow()
+bool wxOptionsPageFolderView::DoTransferOptionsFromWindow()
 {
-   if ( !wxOptionsPageStandard::TransferDataFromWindow() )
+   if ( !wxOptionsPageStandard::DoTransferOptionsFromWindow() )
       return false;
 
    wxRadioBox *radio =
@@ -3643,9 +3703,9 @@
 {
 }
 
-bool wxOptionsPageFolderTree::TransferDataToWindow()
+bool wxOptionsPageFolderTree::DoTransferOptionsToWindow()
 {
-   if ( !wxOptionsPageStandard::TransferDataToWindow() )
+   if ( !wxOptionsPageStandard::DoTransferOptionsToWindow() )
       return false;
 
    wxControl *control = GetControl(ConfigField_FolderTreeIsHome);
@@ -3668,9 +3728,9 @@
    return true;
 }
 
-bool wxOptionsPageFolderTree::TransferDataFromWindow()
+bool wxOptionsPageFolderTree::DoTransferOptionsFromWindow()
 {
-   if ( !wxOptionsPageStandard::TransferDataFromWindow() )
+   if ( !wxOptionsPageStandard::DoTransferOptionsFromWindow() )
       return false;
 
    wxControl *control = GetControl(ConfigField_FolderTreeIsHome);
@@ -3787,7 +3847,7 @@
 #endif // USE_DIALUP
 
 // dynamically fill the RAS connections combo box under Windows
-bool wxOptionsPageNetwork::TransferDataToWindow()
+bool wxOptionsPageNetwork::DoTransferOptionsToWindow()
 {
 #ifdef USE_OWN_CCLIENT
    m_oldAuthsDisabled = READ_CONFIG_TEXT(m_Profile, MP_SMTP_DISABLED_AUTHS);
@@ -3805,7 +3865,7 @@
    }
 #endif // USE_OWN_CCLIENT
 
-   bool bRc = wxOptionsPage::TransferDataToWindow();
+   bool bRc = wxOptionsPage::DoTransferOptionsToWindow();
 
 #if defined(OS_WIN) && defined(USE_DIALUP)
    if ( bRc )
@@ -3833,7 +3893,7 @@
    return bRc;
 }
 
-bool wxOptionsPageNetwork::TransferDataFromWindow()
+bool wxOptionsPageNetwork::DoTransferOptionsFromWindow()
 {
 #ifdef USE_OWN_CCLIENT
    // we need to massage the disabled authentificators string a bit to fit it
@@ -3858,7 +3918,7 @@
    }
 #endif // USE_OWN_CCLIENT
 
-   return wxOptionsPage::TransferDataFromWindow();
+   return wxOptionsPage::DoTransferOptionsFromWindow();
 }
 
 // ----------------------------------------------------------------------------
@@ -3895,7 +3955,7 @@
    return m_folder != NULL;
 }
 
-bool wxOptionsPageNewMail::TransferDataToWindow()
+bool wxOptionsPageNewMail::DoTransferOptionsToWindow()
 {
    // the "collect new mail" checkbox corresponds to the value of
    // MF_FLAGS_INCOMING flag
@@ -3934,12 +3994,12 @@
    m_nIncomingDelay = READ_CONFIG(m_Profile, MP_POLLINCOMINGDELAY);
    m_nPingDelay = READ_CONFIG(m_Profile, MP_UPDATEINTERVAL);
 
-   return wxOptionsPage::TransferDataToWindow();
+   return wxOptionsPage::DoTransferOptionsToWindow();
 }
 
-bool wxOptionsPageNewMail::TransferDataFromWindow()
+bool wxOptionsPageNewMail::DoTransferOptionsFromWindow()
 {
-   bool rc = wxOptionsPage::TransferDataFromWindow();
+   bool rc = wxOptionsPage::DoTransferOptionsFromWindow();
 
    if ( rc )
    {
@@ -4049,11 +4109,11 @@
 {
 }
 
-bool wxOptionsPagePython::TransferDataFromWindow()
+bool wxOptionsPagePython::DoTransferOptionsFromWindow()
 {
    // currently we still have the old value for "Enable Python" in config
    const bool usePythonOld = READ_CONFIG_BOOL(m_Profile, MP_USEPYTHON);
-   if ( !wxOptionsPageStandard::TransferDataFromWindow() )
+   if ( !wxOptionsPageStandard::DoTransferOptionsFromWindow() )
    {
       return false;
    }
@@ -4116,9 +4176,9 @@
    m_lboxData = lboxDataEquivList;
 }
 
-bool wxOptionsPageAdb::TransferDataToWindow()
+bool wxOptionsPageAdb::DoTransferOptionsToWindow()
 {
-   bool bRc = wxOptionsPage::TransferDataToWindow();
+   bool bRc = wxOptionsPage::DoTransferOptionsToWindow();
 
    if ( bRc )
    {
@@ -4134,7 +4194,7 @@
    return bRc;
 }
 
-bool wxOptionsPageAdb::TransferDataFromWindow()
+bool wxOptionsPageAdb::DoTransferOptionsFromWindow()
 {
    // if the listbox contains just the return address, empty it: it is the
    // default anyhow and this avoids remembering it in config
@@ -4146,7 +4206,7 @@
       listbox->Clear();
    }
 
-   return wxOptionsPage::TransferDataFromWindow();
+   return wxOptionsPage::DoTransferOptionsFromWindow();
 }
 
 // ----------------------------------------------------------------------------
@@ -4168,9 +4228,9 @@
    m_activateSync = -1;
 }
 
-bool wxOptionsPageSync::TransferDataToWindow()
+bool wxOptionsPageSync::DoTransferOptionsToWindow()
 {
-   bool rc = wxOptionsPage::TransferDataToWindow();
+   bool rc = wxOptionsPage::DoTransferOptionsToWindow();
    if ( rc )
    {
       m_activateSync = READ_CONFIG(m_Profile, MP_SYNC_REMOTE);
@@ -4189,9 +4249,9 @@
    return rc;
 }
 
-bool wxOptionsPageSync::TransferDataFromWindow()
+bool wxOptionsPageSync::DoTransferOptionsFromWindow()
 {
-   bool rc = wxOptionsPage::TransferDataFromWindow();
+   bool rc = wxOptionsPage::DoTransferOptionsFromWindow();
    if ( rc )
    {
       bool syncRemote = READ_CONFIG_BOOL(m_Profile, MP_SYNC_REMOTE);
@@ -4387,7 +4447,7 @@
    }
 }
 
-bool wxOptionsPageOthers::TransferDataToWindow()
+bool wxOptionsPageOthers::DoTransferOptionsToWindow()
 {
    // if the user checked "don't ask me again" checkbox in the message box
    // these setting might be out of date - synchronize
@@ -4396,7 +4456,7 @@
    m_Profile->writeEntry(GetPersMsgBoxName(M_MSGBOX_CONFIRM_EXIT),
                          !wxPMessageBoxIsDisabled(MP_CONFIRMEXIT));
 
-   bool rc = wxOptionsPage::TransferDataToWindow();
+   bool rc = wxOptionsPage::DoTransferOptionsToWindow();
    if ( rc )
    {
       m_nAutosaveDelay = READ_CONFIG(m_Profile, MP_AUTOSAVEDELAY);
@@ -4406,13 +4466,13 @@
    return rc;
 }
 
-bool wxOptionsPageOthers::TransferDataFromWindow()
+bool wxOptionsPageOthers::DoTransferOptionsFromWindow()
 {
-   // read the old value before calling the base class TransferDataFromWindow()
-   // whieh may change it
+   // read the old value before calling the base class
+   // DoTransferOptionsFromWindow() whieh may change it
    wxString logfileOld = READ_CONFIG(m_Profile, MP_LOGFILE);
 
-   bool rc = wxOptionsPage::TransferDataFromWindow();
+   bool rc = wxOptionsPage::DoTransferOptionsFromWindow();
    if ( rc )
    {
       // now if the user checked "confirm exit" checkbox we must reenable
@@ -4498,9 +4558,9 @@
    m_lboxData->m_lboxDlgPers = _T("LastStartupFolder");
 }
 
-bool wxOptionsPageFolders::TransferDataToWindow()
+bool wxOptionsPageFolders::DoTransferOptionsToWindow()
 {
-   bool bRc = wxOptionsPage::TransferDataToWindow();
+   bool bRc = wxOptionsPage::DoTransferOptionsToWindow();
 
    if ( bRc )
    {
@@ -4523,10 +4583,10 @@
    return bRc;
 }
 
-bool wxOptionsPageFolders::TransferDataFromWindow()
+bool wxOptionsPageFolders::DoTransferOptionsFromWindow()
 {
-   // undo what we did in TransferDataToWindow: remove the main folder from
-   // the list of folders to be opened on startup
+   // undo what we did in DoTransferOptionsToWindow: remove the main folder
+   // from the list of folders to be opened on startup
    wxControl *control = GetControl(ConfigField_OpenFolders);
    if ( control )
    {
@@ -4539,7 +4599,7 @@
       }
    }
 
-   bool rc = wxOptionsPage::TransferDataFromWindow();
+   bool rc = wxOptionsPage::DoTransferOptionsFromWindow();
 
    if ( rc )
    {
@@ -5155,10 +5215,19 @@
 
 void ShowOptionsDialog(wxFrame *parent, OptionsPage page)
 {
+#ifdef PROFILE_OPTIONS_DLG
+   wxStopWatch sw;
+#endif
+
    wxGlobalOptionsDialog dlg(parent);
    dlg.CreateAllControls();
    dlg.SetNotebookPage(page);
    dlg.Layout();
+
+#ifdef PROFILE_OPTIONS_DLG
+   wxLogStatus(_T("Options dialog created in %ldms"), sw.Time());
+#endif
+
    (void)dlg.ShowModal();
 }
 


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Mahogany-cvsupdates mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mahogany-cvsupdates

Reply via email to