Update of /cvsroot/mahogany/M/src/modules
In directory usw-pr-cvs1:/tmp/cvs-serv29321/src/modules

Modified Files:
        Migrate.cpp 
Log Message:
the GUI for migration tool is mostly in place (except for the last wizard page)

Index: Migrate.cpp
===================================================================
RCS file: /cvsroot/mahogany/M/src/modules/Migrate.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -b -u -2 -r1.2 -r1.3
--- Migrate.cpp 8 Oct 2002 17:42:15 -0000       1.2
+++ Migrate.cpp 8 Oct 2002 21:28:18 -0000       1.3
@@ -41,4 +41,7 @@
 #include "MModule.h"
 
+#include "ASMailFolder.h"
+#include "ListReceiver.h"
+
 #include <wx/wizard.h>
 
@@ -107,4 +110,14 @@
    // or the local file(s)
    MigrateLocal dstLocal;
+
+   // the number of folders on the source server (-1 if unknown)
+   int countFolders;
+
+   MigrateData()
+   {
+      toIMAP = true;
+
+      countFolders = -1;
+   }
 };
 
@@ -147,4 +160,10 @@
    virtual bool TransferDataFromWindow();
 
+   // has anything changed?
+   bool IsDirty() const { return m_isDirty; }
+
+   // update the state of the wizards "Forward" button
+   void UpdateForwardBtnUI();
+
 protected:
    void OnText(wxCommandEvent& event);
@@ -167,22 +186,85 @@
    MFolder *m_folder;
 
+   // the dirty flag, true if anything has changed
+   bool m_isDirty;
+
    DECLARE_EVENT_TABLE()
 };
 
 // ----------------------------------------------------------------------------
+// LocalPanel: a panel containing the controls for MigrateLocal data
+// ----------------------------------------------------------------------------
+
+class LocalPanel : public wxEnhancedPanel
+{
+public:
+   LocalPanel(wxWindow *panel, MigrateLocal *localData);
+
+   virtual bool TransferDataToWindow();
+   virtual bool TransferDataFromWindow();
+
+   // returns the name of the mailbox format
+   static const wxChar *GetFormatName(FileMailboxFormat format);
+
+private:
+   wxTextCtrl *m_textDir;
+   wxChoice *m_choiceFormat;
+
+   MigrateLocal *m_localData;
+};
+
+// ----------------------------------------------------------------------------
 // MigrateWizard: the wizard used to interact with the user
 // ----------------------------------------------------------------------------
 
-class MigrateWizard : public wxWizard
+class MigrateWizard : public wxWizard,
+                      public ListEventReceiver
 {
 public:
+   // all our pages
+   enum Page
+   {
+      Page_Source,
+      Page_CantAccessSource,
+      Page_WarnEmptySource,
+      Page_Dst,
+      Page_Confirm,
+      Page_Progress,
+      Page_Max
+   };
+
    MigrateWizard(wxWindow *parent);
 
+   // do run the wizard
    bool Run();
 
+   // access the migration data
    MigrateData& Data() { return m_migrateData; }
 
+   // return the next/previous page for the given one
+   wxWizardPage *GetNextPage(Page page);
+   wxWizardPage *GetPrevPage(Page page);
+
+   // determine ourselves whether there is a prev/next page as we don't want to
+   // create the pages just for this (this can usually be postponed until
+   // later or even not done at all in some cases)
+   virtual bool HasNextPage(wxWizardPage *page);
+   virtual bool HasPrevPage(wxWizardPage *page);
+
+   // implement ListEventReceiver methods
+   virtual void OnListFolder(const String& path, char delim, long flags);
+   virtual void OnNoMoreFolders();
+
 private:
+   // return, creating if necessary, the given page
+   wxWizardPage *GetPage(Page page);
+
    MigrateData m_migrateData;
+
+   // the pages (created on demand by GetPage())
+   wxWizardPage *m_pages[Page_Max];
+
+   // false while we're waiting for the events from ListFolders()
+   bool m_doneWithList;
 };
 
@@ -191,18 +273,45 @@
 // ----------------------------------------------------------------------------
 
-class MigrateWizardPage : public wxWizardPageSimple
+class MigrateWizardPage : public wxWizardPage
 {
 public:
-   MigrateWizardPage(MigrateWizard *wizard)
-      : wxWizardPageSimple(wizard)
+   MigrateWizardPage(MigrateWizard *wizard, MigrateWizard::Page id)
+      : wxWizardPage(wizard)
    {
       m_wizard = wizard;
+      m_id = id;
    }
 
+   // common accessors
    MigrateWizard *GetWizard() const { return m_wizard; }
    MigrateData& Data() { return GetWizard()->Data(); }
 
+   MigrateWizard::Page GetId() const { return m_id; }
+
+   // let the wizard decide the order in which the pages are shown
+   virtual wxWizardPage *GetPrev() const
+      { return GetWizard()->GetPrevPage(GetId()); }
+   virtual wxWizardPage *GetNext() const
+      { return GetWizard()->GetNextPage(GetId()); }
+
 private:
    MigrateWizard *m_wizard;
+   MigrateWizard::Page m_id;
+};
+
+// ----------------------------------------------------------------------------
+// MigrateWizardMsgOnlyPage: base class for pages without any controls
+// ----------------------------------------------------------------------------
+
+class MigrateWizardMsgOnlyPage : public MigrateWizardPage
+{
+public:
+   MigrateWizardMsgOnlyPage(MigrateWizard *wizard,
+                            MigrateWizard::Page id,
+                            const String& msg)
+      : MigrateWizardPage(wizard, id)
+   {
+      new wxStaticText(this, -1, msg);
+   }
 };
 
@@ -223,4 +332,104 @@
 };
 
+// ----------------------------------------------------------------------------
+// MigrateWizardCantAccessPage: page shown if we failed to connect to IMAP src
+// ----------------------------------------------------------------------------
+
+class MigrateWizardCantAccessPage : public MigrateWizardMsgOnlyPage
+{
+public:
+   MigrateWizardCantAccessPage(MigrateWizard *parent)
+      : MigrateWizardMsgOnlyPage
+        (
+         parent,
+         MigrateWizard::Page_CantAccessSource,
+         String::Format
+         (
+            _("Failed to access the IMAP server %s,\n"
+              "please return to the previous page and\n"
+              "check its parameters."),
+            parent->Data().source.server.c_str()
+         )
+        )
+   {
+   }
+};
+
+// ----------------------------------------------------------------------------
+// MigrateWizardNothingToDoPage: shown if there are no folders to copy
+// ----------------------------------------------------------------------------
+
+class MigrateWizardNothingToDoPage : public MigrateWizardMsgOnlyPage
+{
+public:
+   MigrateWizardNothingToDoPage(MigrateWizard *parent)
+      : MigrateWizardMsgOnlyPage
+        (
+         parent,
+         MigrateWizard::Page_WarnEmptySource,
+         String::Format
+         (
+            _("There doesn't seem to be any folders on\n"
+              "the IMAP server %s!\n"
+              "\n"
+              "You may want to change its parameters\n"
+              "by return to the previous pages."),
+            parent->Data().source.server.c_str()
+         )
+        )
+   {
+   }
+};
+
+// ----------------------------------------------------------------------------
+// MigrateWizardDstPage: second page, choose the destination
+// ----------------------------------------------------------------------------
+
+class MigrateWizardDstPage : public MigrateWizardPage
+{
+public:
+   MigrateWizardDstPage(MigrateWizard *parent);
+
+   virtual bool TransferDataToWindow();
+   virtual bool TransferDataFromWindow();
+
+protected:
+   void OnCheckBox(wxCommandEvent& event);
+
+   // enable/disable the panels according to whether we use IMAP or local file
+   void UseIMAP(bool useIMAP);
+
+private:
+   wxCheckBox *m_chkUseIMAP;
+
+   IMAPServerPanel *m_panelIMAP;
+   LocalPanel *m_panelLocal;
+
+   DECLARE_EVENT_TABLE()
+};
+
+// ----------------------------------------------------------------------------
+// MigrateWizardConfirmPage: third page, confirm the migration parameters
+// ----------------------------------------------------------------------------
+
+class MigrateWizardConfirmPage : public MigrateWizardMsgOnlyPage
+{
+public:
+   MigrateWizardConfirmPage(MigrateWizard *parent);
+
+private:
+   String BuildMsg(MigrateWizard *parent) const;
+};
+
+// ----------------------------------------------------------------------------
+// MigrateWizardProgressPage: fourth and final page, show migration progress
+// ----------------------------------------------------------------------------
+
+class MigrateWizardProgressPage : public MigrateWizardPage
+{
+public:
+   MigrateWizardProgressPage(MigrateWizard *parent);
+};
+
 // ============================================================================
 // MigrateModule implementation
@@ -337,4 +546,5 @@
    m_imapData = imapData;
    m_folder = NULL;
+   m_isDirty = false;
 
    // the controls data
@@ -406,4 +616,6 @@
 #endif // USE_SSL
 
+   UpdateForwardBtnUI();
+
    return true;
 }
@@ -426,18 +638,50 @@
       }
 
+      if ( (unsigned long)m_imapData->port != l )
+      {
       // cast is safe because of the check above
       m_imapData->port = (int)l;
 
+         m_isDirty = true;
+      }
+
       // remove the port pat from the host string
       server.erase(posColon);
    }
 
+   if ( m_imapData->server != server )
+   {
+      m_isDirty = true;
    m_imapData->server = server;
-   m_imapData->root = m_textRoot->GetValue();
-   m_imapData->username = m_textLogin->GetValue();
-   m_imapData->password = m_textPass->GetValue();
+   }
+
+   String value = m_textRoot->GetValue();
+   if ( m_imapData->root != value )
+   {
+      m_isDirty = true;
+      m_imapData->root = value;
+   }
+
+   value = m_textLogin->GetValue();
+   if ( m_imapData->username != value )
+   {
+      m_isDirty = true;
+      m_imapData->username = value;
+   }
+
+   value = m_textPass->GetValue();
+   if ( m_imapData->password != value )
+   {
+      m_isDirty = true;
+      m_imapData->password = value;
+   }
 
 #ifdef USE_SSL
-   m_imapData->useSSL = m_chkSSL->GetValue();
+   bool useSSL = m_chkSSL->GetValue();
+   if ( m_imapData->useSSL != useSSL )
+   {
+      m_isDirty = true;
+      m_imapData->useSSL = useSSL;
+   }
 #endif // USE_SSL
 
@@ -450,15 +694,4 @@
    if ( folder != m_folder )
    {
-      // check that a valid folder was chosen
-      if ( folder && folder->GetType() != MF_IMAP )
-      {
-         wxLogError(_("You can only migrate from IMAP folder."));
-
-         // it was already changed by the browse button
-         m_textServer->SetValue(_T(""));
-
-         return;
-      }
-
       if ( m_folder )
       {
@@ -470,4 +703,17 @@
       if ( m_folder )
       {
+         // check that a valid folder was chosen
+         if ( m_folder->GetType() != MF_IMAP )
+         {
+            wxLogError(_("You can only migrate from or to an IMAP server."));
+
+            // it was already changed by the browse button
+            m_textServer->SetValue(_T(""));
+
+            m_folder = NULL;
+
+            return;
+         }
+
          // to compensate for implicit DecRef() by MFolder_obj dtor
          m_folder->IncRef();
@@ -485,7 +731,93 @@
    }
 
+   // check if the server name became empty
+   UpdateForwardBtnUI();
+
    event.Skip();
 }
 
+void IMAPServerPanel::UpdateForwardBtnUI()
+{
+   wxWindow *wizard = GetParent()->GetParent();
+   CHECK_RET( wizard, _T("IMAPServerPanel outside a wizard?") );
+
+   wxWindow *btnForward = wizard->FindWindow(wxID_FORWARD);
+   CHECK_RET( btnForward, _T("no \"Forward\" button?") );
+
+   btnForward->Enable( !m_textServer->GetValue().empty() );
+}
+
+// ----------------------------------------------------------------------------
+// LocalPanel
+// ----------------------------------------------------------------------------
+
+LocalPanel::LocalPanel(wxWindow *panel, MigrateLocal *localData)
+          : wxEnhancedPanel(panel)
+{
+   m_localData = localData;
+
+   // create the controls
+   enum Fields
+   {
+      Label_Dir,
+      Label_Format,
+      Label_Max
+   };
+
+   wxArrayString labels;
+   labels.Add(_("&Directory for files:"));
+   labels.Add(_("Mailbox &format"));
+
+   // check that we didn't forget to update something
+   ASSERT_MSG( labels.GetCount() == Label_Max, _T("label count mismatch") );
+
+   const long widthMax = GetMaxLabelWidth(labels, this);
+
+   m_textDir = CreateDirEntry(labels[Label_Dir], widthMax, NULL);
+
+   String formats = labels[Label_Format];
+   for ( int fmt = 0; fmt < FileMbox_Max + 1 /* for MH */; fmt++ )
+   {
+      formats << _T(':') << GetFormatName((FileMailboxFormat)fmt);
+   }
+
+   m_choiceFormat = CreateChoice(formats, widthMax, m_textDir);
+}
+
+bool LocalPanel::TransferDataToWindow()
+{
+   m_textDir->SetValue(m_localData->root);
+   m_choiceFormat->SetSelection(m_localData->format);
+
+   return true;
+}
+
+bool LocalPanel::TransferDataFromWindow()
+{
+   m_localData->root = m_textDir->GetValue();
+   m_localData->format = (FileMailboxFormat)m_choiceFormat->GetSelection();
+
+   return true;
+}
+
+/* static */
+const wxChar *LocalPanel::GetFormatName(FileMailboxFormat format)
+{
+   // this array must be in sync with FileMailboxFormat
+   static const wxChar *formatNames[] =
+   {
+      gettext_noop("MBX (UW-IMAPd)"),
+      gettext_noop("MBOX (traditional Unix)"),
+      gettext_noop("MMDF (SCO Unix)"),
+      gettext_noop("Tenex (historical)"),
+      gettext_noop("MH (one file per message)"),
+   };
+
+   ASSERT_MSG( (size_t)format < WXSIZEOF(formatNames),
+               _T("mailbox format out of range") );
+
+   return _(formatNames[format]);
+}
+
 // ----------------------------------------------------------------------------
 // MigrateWizardSourcePage
@@ -493,5 +825,5 @@
 
 MigrateWizardSourcePage::MigrateWizardSourcePage(MigrateWizard *parent)
-                       : MigrateWizardPage(parent)
+                       : MigrateWizardPage(parent, MigrateWizard::Page_Source)
 {
    wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
@@ -526,5 +858,170 @@
 bool MigrateWizardSourcePage::TransferDataFromWindow()
 {
-   return m_panel->TransferDataFromWindow();
+   if ( !m_panel->TransferDataFromWindow() )
+      return false;
+
+   if ( m_panel->IsDirty() )
+   {
+      // reset the number of folders as the server has changed
+      Data().countFolders = -1;
+   }
+
+   return true;
+}
+
+// ----------------------------------------------------------------------------
+// MigrateWizardDstPage
+// ----------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(MigrateWizardDstPage, MigrateWizardPage)
+   EVT_CHECKBOX(-1, MigrateWizardDstPage::OnCheckBox)
+END_EVENT_TABLE()
+
+MigrateWizardDstPage::MigrateWizardDstPage(MigrateWizard *parent)
+                    : MigrateWizardPage(parent, MigrateWizard::Page_Dst)
+{
+   wxSizer *sizer = new wxBoxSizer(wxVERTICAL);
+   sizer->Add
+          (
+            new wxStaticText
+                (
+                  this,
+                  -1,
+                  _("Please choose where to copy mail now:")
+                ),
+            0,
+            wxALL | wxEXPAND,
+            LAYOUT_X_MARGIN
+          );
+
+   m_chkUseIMAP = new wxCheckBox(this, -1, _("to another &IMAP server:"));
+   sizer->Add(m_chkUseIMAP, 0, wxALL, LAYOUT_X_MARGIN);
+
+   m_panelIMAP = new IMAPServerPanel(this, &Data().dstIMAP);
+   sizer->Add(m_panelIMAP, 1, wxALL | wxEXPAND, LAYOUT_X_MARGIN);
+
+   sizer->Add(new wxStaticText(this, -1, _("or to a &local file:")));
+
+   m_panelLocal = new LocalPanel(this, &Data().dstLocal);
+   sizer->Add(m_panelLocal, 1, wxALL | wxEXPAND, LAYOUT_X_MARGIN);
+
+   SetSizer(sizer);
+}
+
+void MigrateWizardDstPage::UseIMAP(bool useIMAP)
+{
+   m_panelIMAP->Enable(useIMAP);
+   m_panelLocal->Enable(!useIMAP);
+}
+
+void MigrateWizardDstPage::OnCheckBox(wxCommandEvent& event)
+{
+   if ( event.GetEventObject() == m_chkUseIMAP )
+   {
+      bool useIMAP = event.IsChecked();
+      Data().toIMAP = useIMAP;
+
+      UseIMAP(useIMAP);
+
+      if ( useIMAP )
+      {
+         // button should be disabled if the server is not entered
+         m_panelIMAP->UpdateForwardBtnUI();
+      }
+      else // local dst
+      {
+         // button is always enabled
+         wxWindow *btnForward = GetParent()->FindWindow(wxID_FORWARD);
+         CHECK_RET( btnForward, _T("no \"Forward\" button?") );
+
+         btnForward->Enable();
+      }
+   }
+
+   event.Skip();
+}
+
+bool MigrateWizardDstPage::TransferDataToWindow()
+{
+   bool useIMAP = Data().toIMAP;
+
+   m_chkUseIMAP->SetValue(useIMAP);
+
+   UseIMAP(useIMAP);
+
+   return (useIMAP ? m_panelIMAP : m_panelLocal)->TransferDataToWindow();
+}
+
+bool MigrateWizardDstPage::TransferDataFromWindow()
+{
+   return (Data().toIMAP ? m_panelIMAP : m_panelLocal)->TransferDataFromWindow();
+}
+
+// ----------------------------------------------------------------------------
+// MigrateWizardConfirmPage
+// ----------------------------------------------------------------------------
+
+MigrateWizardConfirmPage::MigrateWizardConfirmPage(MigrateWizard *parent)
+                        : MigrateWizardMsgOnlyPage
+                          (
+                           parent,
+                           MigrateWizard::Page_Confirm,
+                           BuildMsg(parent)
+                          )
+{
+}
+
+String
+MigrateWizardConfirmPage::BuildMsg(MigrateWizard *parent) const
+{
+   const MigrateData& data = parent->Data();
+
+   String msg;
+
+   msg.Printf(_("About to start copying %d folders from %s\n"),
+              data.countFolders, data.source.server.c_str());
+   if ( data.toIMAP )
+   {
+      msg += String::Format
+             (
+               _("to the IMAP server %s"),
+               data.dstIMAP.server.c_str()
+             );
+
+      const String& root = data.dstIMAP.root;
+      if ( !root.empty() )
+         msg += String::Format(_(" (under %s)"), root.c_str());
+
+      msg += _T('\n');
+   }
+   else
+   {
+      msg += String::Format
+             (
+               _("to the files in %s format under\n"
+                 "the directory \"%s\""),
+               LocalPanel::GetFormatName(data.dstLocal.format),
+               data.dstLocal.root.c_str()
+             );
+   }
+
+   msg += _("\n\nPlease press \"Next\" to conitnue, \"Back\" to\n"
+            "modify the migration parameters\n"
+            "or \"Cancel\" to abort the operation.");
+
+   return msg;
+}
+
+// ----------------------------------------------------------------------------
+// MigrateWizardProgressPage
+// ----------------------------------------------------------------------------
+
+MigrateWizardProgressPage::MigrateWizardProgressPage(MigrateWizard *parent)
+                         : MigrateWizardPage
+                           (
+                              parent,
+                              MigrateWizard::Page_Progress
+                           )
+{
 }
 
@@ -536,9 +1033,195 @@
              : wxWizard(parent, -1, _("Mahogany Migration Tool")) // TODO: bmp
 {
+   for ( size_t n = 0; n < WXSIZEOF(m_pages); n++ )
+   {
+      m_pages[n] = NULL;
+   }
 }
 
 bool MigrateWizard::Run()
 {
-   return RunWizard(new MigrateWizardSourcePage(this));
+   return RunWizard(GetPage(Page_Source));
+}
+
+wxWizardPage *MigrateWizard::GetPage(Page page)
+{
+   wxWizardPage *p;
+   switch ( page )
+   {
+      case Page_Source:
+         p = new MigrateWizardSourcePage(this);
+         break;
+
+      case Page_CantAccessSource:
+         p = new MigrateWizardCantAccessPage(this);
+         break;
+
+      case Page_WarnEmptySource:
+         p = new MigrateWizardNothingToDoPage(this);
+         break;
+
+      case Page_Dst:
+         p = new MigrateWizardDstPage(this);
+         break;
+
+      case Page_Confirm:
+         p = new MigrateWizardConfirmPage(this);
+         break;
+
+      case Page_Progress:
+         p = new MigrateWizardProgressPage(this);
+         break;
+
+      default:
+         FAIL_MSG( _T("unknown page in MigrateWizard") );
+         return NULL;
+   }
+
+   m_pages[page] = p;
+   return p;
+}
+
+wxWizardPage *MigrateWizard::GetNextPage(Page page)
+{
+   static const Page nextPages[Page_Max] =
+   {
+      /* Page_Source */             Page_Max, // not used!
+      /* Page_CantAccessSource */   Page_Max,
+      /* Page_WarnEmptySource */    Page_Dst,
+      /* Page_Dst */                Page_Confirm,
+      /* Page_Confirm */            Page_Progress,
+      /* Page_Progress */           Page_Max,
+   };
+
+   // first deal with dynamic page order cases
+   Page pageNext;
+   if ( page == Page_Source )
+   {
+      // try to connect to the source server to get the number of folders to
+      // copy
+      if ( Data().countFolders == -1 )
+      {
+         MProgressInfo progress(this, _("Accessing IMAP server..."));
+
+         MFolder_obj folderSrc(MFolder::CreateTemp(_T(""), MF_IMAP));
+
+         const MigrateImapServer& imapData = Data().source;
+         folderSrc->SetServer(imapData.server);
+         folderSrc->SetPath(imapData.root);
+         folderSrc->SetAuthInfo(imapData.username, imapData.password);
+
+#ifdef USE_SSL
+         if ( imapData.useSSL )
+         {
+            // we don't have a separate checkbox for accepting unsinged SSL
+            // certs because of lack of space in the dialog but we do accept
+            // them here because always accepting them is better than never
+            // doing it
+            folderSrc->AddFlags(MF_FLAGS_SSLAUTH | MF_FLAGS_SSLUNSIGNED);
+         }
+#endif // USE_SSL
+
+         ASMailFolder *asmf = ASMailFolder::OpenFolder
+                              (
+                               folderSrc,
+                               MailFolder::HalfOpen
+                              );
+         if ( asmf )
+         {
+            Data().countFolders = 0;
+            m_doneWithList = false;
+
+            // the cast below is needed as ListEventReceiver compares the user
+            // data in the results it gets with "this" and its this pointer is
+            // different from our "this" as we use multiple inheritance
+            Ticket t = asmf->ListFolders(_T(""), false, _T(""),
+                                         (ListEventReceiver *)this);
+            if ( t != ILLEGAL_TICKET )
+            {
+               // process the events from ListFolders
+               do
+               {
+                  MEventManager::DispatchPending();
+               }
+               while ( !m_doneWithList );
+            }
+
+            asmf->DecRef();
+         }
+      }
+
+      switch ( Data().countFolders )
+      {
+         case -1:
+            pageNext = Page_CantAccessSource;
+            break;
+
+         case 0:
+            pageNext = Page_WarnEmptySource;
+            break;
+
+         default:
+            pageNext = Page_Dst;
+      }
+   }
+   else // static case
+   {
+      pageNext = nextPages[page];
+   }
+
+   return pageNext == Page_Max ? NULL : GetPage(pageNext);
+}
+
+wxWizardPage *MigrateWizard::GetPrevPage(Page page)
+{
+   static const Page prevPages[Page_Max] =
+   {
+      /* Page_Source */             Page_Max,
+      /* Page_CantAccessSource */   Page_Source,
+      /* Page_WarnEmptySource */    Page_Source,
+      /* Page_Dst */                Page_Source,
+      /* Page_Confirm */            Page_Dst,
+      /* Page_Progress */           Page_Confirm,
+   };
+
+   Page pagePrev = prevPages[page];
+   return pagePrev == Page_Max ? NULL : GetPage(pagePrev);
+}
+
+bool MigrateWizard::HasNextPage(wxWizardPage *page)
+{
+   switch ( ((MigrateWizardPage *)page)->GetId() )
+   {
+      case Page_Source:
+      case Page_WarnEmptySource:
+      case Page_Dst:
+      case Page_Confirm:
+         return true;
+
+      default:
+         FAIL_MSG( _T("unknown page in MigrateWizard") );
+
+      case Page_CantAccessSource:
+      case Page_Progress:
+         return false;
+   }
+}
+
+bool MigrateWizard::HasPrevPage(wxWizardPage *page)
+{
+   // all pages have a previous one except the initial one
+   return ((MigrateWizardPage *)page)->GetId() != Page_Source;
+}
+
+void
+MigrateWizard::OnListFolder(const String& path, char delim, long flags)
+{
+   Data().countFolders++;
+}
+
+void
+MigrateWizard::OnNoMoreFolders()
+{
+   m_doneWithList = true;
 }
 



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Mahogany-cvsupdates mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/mahogany-cvsupdates

Reply via email to