]> git.saurik.com Git - wxWidgets.git/blobdiff - utils/configtool/src/configtoolview.cpp
Old API depreciated. Use of new API. Source cleaning.
[wxWidgets.git] / utils / configtool / src / configtoolview.cpp
index c9549799ab24e386aa26606d9667cb11d49447e1..6cd42bc8faded61c77c8956f031b553554919e66 100644 (file)
@@ -9,19 +9,18 @@
 // Licence:
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "configtoolview.h"
 #endif
 
-// Includes other headers for precompiled compilation
-#include "wx/wx.h"
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-    #pragma hdrstop
+#pragma hdrstop
 #endif
 
 #include "wx/wfstream.h"
-
 #include "configtoolview.h"
 #include "configtooldoc.h"
 #include "configtree.h"
@@ -81,31 +80,34 @@ BEGIN_EVENT_TABLE(ctConfigToolView, wxView)
     EVT_UPDATE_UI(ctID_EDIT_CUSTOM_PROPERTY, ctConfigToolView::OnUpdateEditCustomProperty)
     EVT_UPDATE_UI(ctID_DELETE_CUSTOM_PROPERTY, ctConfigToolView::OnUpdateDeleteCustomProperty)
 
-    EVT_NOTEBOOK_PAGE_CHANGED(-1, ctConfigToolView::OnTabSelect)
+    EVT_NOTEBOOK_PAGE_CHANGED(wxID_ANY, ctConfigToolView::OnTabSelect)
 
     EVT_MENU(ctID_SAVE_SETUP_FILE, ctConfigToolView::OnSaveSetupFile)
     EVT_MENU(ctID_SAVE_CONFIGURE_COMMAND, ctConfigToolView::OnSaveConfigureCommand)
     EVT_UPDATE_UI(ctID_SAVE_SETUP_FILE, ctConfigToolView::OnUpdateSaveSetupFile)
     EVT_UPDATE_UI(ctID_SAVE_CONFIGURE_COMMAND, ctConfigToolView::OnUpdateSaveConfigureCommand)
-END_EVENT_TABLE()
 
-ctConfigToolView::ctConfigToolView()
-{
-}
+    EVT_MENU(wxID_FIND, ctConfigToolView::OnFind)
+    EVT_UPDATE_UI(wxID_FIND, ctConfigToolView::OnUpdateFind)
+
+    EVT_MENU(ctID_GO, ctConfigToolView::OnGo)
+    EVT_UPDATE_UI(ctID_GO, ctConfigToolView::OnUpdateGo)
+
+END_EVENT_TABLE()
 
 // What to do when a view is created. Creates actual
 // windows for displaying the view.
 bool ctConfigToolView::OnCreate(wxDocument *doc, long WXUNUSED(flags) )
 {
-    wxGetApp().GetDocManager()->ActivateView(this, TRUE);
+    wxGetApp().GetDocManager()->ActivateView(this, true);
     wxGetApp().GetMainFrame()->SetDocument((ctConfigToolDoc*) doc);
     wxGetApp().GetMainFrame()->GetSetupPage()->SetDocument((ctConfigToolDoc*) doc) ;
     wxGetApp().GetMainFrame()->GetConfigurePage()->SetDocument((ctConfigToolDoc*) doc) ;
 
-    return TRUE;
+    return true;
 }
 
-void ctConfigToolView::OnDraw(wxDC *dc)
+void ctConfigToolView::OnDraw(wxDC *WXUNUSED(dc))
 {
 }
 
@@ -115,11 +117,11 @@ void ctConfigToolView::OnUpdate(wxView *WXUNUSED(sender), wxObject *hintObj)
     ctConfigTreeCtrl* treeCtrl = wxGetApp().GetMainFrame()->GetConfigTreeCtrl();
     if (!treeCtrl)
         return;
-    
+
     wxASSERT (doc != NULL);
-    
+
     ctConfigItem* selItem = NULL;
-    
+
     wxTreeItemId sel = treeCtrl->GetSelection();
     if (sel.IsOk())
     {
@@ -127,12 +129,12 @@ void ctConfigToolView::OnUpdate(wxView *WXUNUSED(sender), wxObject *hintObj)
         if (data)
             selItem = data->GetConfigItem() ;
     }
-    
+
     ctConfigToolHint* hint = (ctConfigToolHint*) hintObj;
     int hintOp = ctNoHint;
     if (hint)
         hintOp = hint->m_op;
-    
+
     switch (hintOp)
     {
     case ctInitialUpdate:
@@ -145,12 +147,12 @@ void ctConfigToolView::OnUpdate(wxView *WXUNUSED(sender), wxObject *hintObj)
             }
         }
         break;
-    case ctSelChanged:        
+    case ctSelChanged:
         {
             if (selItem)
             {
                 wxGetApp().GetMainFrame()->GetPropertyEditor()->ShowItem(selItem);
-            }            
+            }
         }
         break;
     case ctAllSaved:
@@ -169,37 +171,37 @@ void ctConfigToolView::OnUpdate(wxView *WXUNUSED(sender), wxObject *hintObj)
             treeCtrl->DeleteAllItems();
             wxGetApp().GetMainFrame()->GetPropertyEditor()->ShowItem(NULL);
             break;
-        }        
+        }
     case ctValueChanged:
         {
             // ctConfigItem& ti = *(ctConfigItem *)hint->m_item;
             wxGetApp().GetMainFrame()->GetPropertyEditor()->ShowItem(selItem);
-        }                      
+        }
         break;
-        
+
     default:
         break;
     }
 }
 
 // Clean up windows used for displaying the view.
-bool ctConfigToolView::OnClose(bool deleteWindow)
+bool ctConfigToolView::OnClose(bool WXUNUSED(deleteWindow))
 {
     if (!GetDocument()->Close())
-        return FALSE;
+        return false;
 
     ctConfigToolHint hint(NULL, ctClear);
     GetDocument()->UpdateAllViews (NULL, & hint);
 
-    wxGetApp().GetDocManager()->ActivateView(this, FALSE);
+    wxGetApp().GetDocManager()->ActivateView(this, false);
+
+    Activate(false);
 
-    Activate(FALSE);
-    
     wxGetApp().GetMainFrame()->SetDocument(NULL);
     wxGetApp().GetMainFrame()->GetSetupPage()->SetDocument(NULL) ;
     wxGetApp().GetMainFrame()->GetConfigurePage()->SetDocument(NULL) ;
 
-    return TRUE;
+    return true;
 }
 
 void ctConfigToolView::OnChangeFilename()
@@ -228,12 +230,12 @@ void ctConfigToolView::OnChangeFilename()
 // General disabler
 void ctConfigToolView::OnUpdateDisable(wxUpdateUIEvent& event)
 {
-    event.Enable( FALSE );
+    event.Enable( false );
 }
 
 void ctConfigToolView::OnUpdateAddItem(wxUpdateUIEvent& event)
 {
-    event.Enable( TRUE );
+    event.Enable( true );
 }
 
 /// Add item and its children to the tree
@@ -342,17 +344,23 @@ void ctConfigToolView::OnIconLeftDown(ctConfigTreeCtrl* treeControl, ctConfigIte
 
         item->Enable(!item->IsEnabled());
 
-        GetDocument()->Modify(TRUE);
+        GetDocument()->Modify(true);
         OnChangeFilename();
 
         SyncItem(treeControl, item);
 
         wxList considered;
-        item->PropagateChange(considered);
         if ((item->GetType() == ctTypeBoolRadio || item->GetType() == ctTypeRadioGroup) && item->IsEnabled())
         {
             item->PropagateRadioButton(considered);
         }
+        item->PropagateChange(considered);
+
+        // Update the setup.h and configure text
+        if (wxGetApp().GetMainFrame()->GetMainNotebook()->GetSelection() > 0)
+        {
+            RegenerateSetup();
+        }
     }
 }
 
@@ -374,37 +382,37 @@ ctConfigItem* ctConfigToolView::GetSelection()
 }
 
 /// Add a checkbox item
-void ctConfigToolView::OnAddCheckBoxItem(wxCommandEvent& event)
+void ctConfigToolView::OnAddCheckBoxItem(wxCommandEvent& WXUNUSED(event))
 {
     AddItem(ctTypeBoolCheck, _("New checkbox item"));
 }
 
 /// Add a radiobutton item
-void ctConfigToolView::OnAddRadioButtonItem(wxCommandEvent& event)
+void ctConfigToolView::OnAddRadioButtonItem(wxCommandEvent& WXUNUSED(event))
 {
     AddItem(ctTypeBoolRadio, _("New radio button item"));
 }
 
 /// Add a group item
-void ctConfigToolView::OnAddGroupItem(wxCommandEvent& event)
+void ctConfigToolView::OnAddGroupItem(wxCommandEvent& WXUNUSED(event))
 {
     AddItem(ctTypeGroup, _("New group item"));
 }
 
 /// Add a group option item
-void ctConfigToolView::OnAddCheckGroupItem(wxCommandEvent& event)
+void ctConfigToolView::OnAddCheckGroupItem(wxCommandEvent& WXUNUSED(event))
 {
     AddItem(ctTypeCheckGroup, _("New check group item"));
 }
 
 /// Add a group option item
-void ctConfigToolView::OnAddRadioGroupItem(wxCommandEvent& event)
+void ctConfigToolView::OnAddRadioGroupItem(wxCommandEvent& WXUNUSED(event))
 {
     AddItem(ctTypeRadioGroup, _("New radio group item"));
 }
 
 /// Add a string item
-void ctConfigToolView::OnAddStringItem(wxCommandEvent& event)
+void ctConfigToolView::OnAddStringItem(wxCommandEvent& WXUNUSED(event))
 {
     AddItem(ctTypeString, _("New string item"));
 }
@@ -431,7 +439,7 @@ void ctConfigToolView::AddItem(ctConfigType type, const wxString& msg)
                 parent = sel->GetParent();
                 insertBefore = sel->FindNextSibling();
             }
-            
+
             ctConfigItem* newItem = new ctConfigItem(NULL, type, name);
             newItem->InitProperties();
 
@@ -443,7 +451,7 @@ void ctConfigToolView::AddItem(ctConfigType type, const wxString& msg)
 }
 
 /// Delete an item
-void ctConfigToolView::OnDeleteItem(wxCommandEvent& event)
+void ctConfigToolView::OnDeleteItem(wxCommandEvent& WXUNUSED(event))
 {
     ctConfigItem* sel = GetSelection();
     if (sel)
@@ -459,7 +467,7 @@ void ctConfigToolView::OnDeleteItem(wxCommandEvent& event)
 }
 
 /// Rename an item
-void ctConfigToolView::OnRenameItem(wxCommandEvent& event)
+void ctConfigToolView::OnRenameItem(wxCommandEvent& WXUNUSED(event))
 {
     ctConfigItem* sel = GetSelection();
     if (sel)
@@ -478,7 +486,7 @@ void ctConfigToolView::OnRenameItem(wxCommandEvent& event)
 }
 
 /// Copy an item to the clipboard
-void ctConfigToolView::OnCopy(wxCommandEvent& event)
+void ctConfigToolView::OnCopy(wxCommandEvent& WXUNUSED(event))
 {
     ctConfigToolDoc* doc = (ctConfigToolDoc*) GetDocument();
     ctConfigItem* sel = GetSelection();
@@ -489,7 +497,7 @@ void ctConfigToolView::OnCopy(wxCommandEvent& event)
 }
 
 /// Copy an item to the clipboard and cut the item
-void ctConfigToolView::OnCut(wxCommandEvent& event)
+void ctConfigToolView::OnCut(wxCommandEvent& WXUNUSED(event))
 {
     ctConfigToolDoc* doc = (ctConfigToolDoc*) GetDocument();
     ctConfigItem* sel = GetSelection();
@@ -504,7 +512,7 @@ void ctConfigToolView::OnCut(wxCommandEvent& event)
 }
 
 /// Paste an item from the clipboard to the tree
-void ctConfigToolView::OnPaste(wxCommandEvent& event)
+void ctConfigToolView::OnPaste(wxCommandEvent& WXUNUSED(event))
 {
     ctConfigToolDoc* doc = (ctConfigToolDoc*) GetDocument();
     ctConfigItem* sel = GetSelection();
@@ -552,7 +560,7 @@ void ctConfigToolView::OnUpdatePaste(wxUpdateUIEvent& event)
 }
 
 /// Copy an item to the clipboard
-void ctConfigToolView::OnContextCopy(wxCommandEvent& event)
+void ctConfigToolView::OnContextCopy(wxCommandEvent& WXUNUSED(event))
 {
     ctConfigToolDoc* doc = (ctConfigToolDoc*) GetDocument();
     ctConfigItem* sel = wxGetApp().GetMainFrame()->GetConfigTreeCtrl()->GetContextItem();
@@ -563,7 +571,7 @@ void ctConfigToolView::OnContextCopy(wxCommandEvent& event)
 }
 
 /// Copy an item to the clipboard and cut the item
-void ctConfigToolView::OnContextCut(wxCommandEvent& event)
+void ctConfigToolView::OnContextCut(wxCommandEvent& WXUNUSED(event))
 {
     ctConfigToolDoc* doc = (ctConfigToolDoc*) GetDocument();
     ctConfigItem* sel = wxGetApp().GetMainFrame()->GetConfigTreeCtrl()->GetContextItem();
@@ -578,7 +586,7 @@ void ctConfigToolView::OnContextCut(wxCommandEvent& event)
 }
 
 /// Paste an item from the clipboard to the tree
-void ctConfigToolView::OnContextPasteBefore(wxCommandEvent& event)
+void ctConfigToolView::OnContextPasteBefore(wxCommandEvent& WXUNUSED(event))
 {
     ctConfigToolDoc* doc = (ctConfigToolDoc*) GetDocument();
     ctConfigItem* sel = wxGetApp().GetMainFrame()->GetConfigTreeCtrl()->GetContextItem();
@@ -595,7 +603,7 @@ void ctConfigToolView::OnContextPasteBefore(wxCommandEvent& event)
 }
 
 /// Paste an item from the clipboard to the tree
-void ctConfigToolView::OnContextPasteAfter(wxCommandEvent& event)
+void ctConfigToolView::OnContextPasteAfter(wxCommandEvent& WXUNUSED(event))
 {
     ctConfigToolDoc* doc = (ctConfigToolDoc*) GetDocument();
     ctConfigItem* sel = wxGetApp().GetMainFrame()->GetConfigTreeCtrl()->GetContextItem();
@@ -612,7 +620,7 @@ void ctConfigToolView::OnContextPasteAfter(wxCommandEvent& event)
 }
 
 /// Paste an item from the clipboard to the tree
-void ctConfigToolView::OnContextPasteAsChild(wxCommandEvent& event)
+void ctConfigToolView::OnContextPasteAsChild(wxCommandEvent& WXUNUSED(event))
 {
     ctConfigToolDoc* doc = (ctConfigToolDoc*) GetDocument();
     ctConfigItem* sel = wxGetApp().GetMainFrame()->GetConfigTreeCtrl()->GetContextItem();
@@ -622,7 +630,7 @@ void ctConfigToolView::OnContextPasteAsChild(wxCommandEvent& event)
         {
             ctConfigItem* parent = sel;
             ctConfigItem* insertBefore = NULL;
-            
+
             ctConfigItem* newItem = doc->GetClipboardItem()->DeepClone();
             ctConfigCommand* cmd = new ctConfigCommand(wxT("Paste Config Item"), ctCMD_PASTE,
                 NULL, newItem, parent, insertBefore);
@@ -672,7 +680,7 @@ void ctConfigToolView::OnUpdateContextPasteAsChild(wxUpdateUIEvent& event)
 }
 
 /// Item help
-void ctConfigToolView::OnItemHelp(wxCommandEvent& event)
+void ctConfigToolView::OnItemHelp(wxCommandEvent& WXUNUSED(event))
 {
     ctConfigToolDoc* doc = (ctConfigToolDoc*) GetDocument();
     if ( doc && GetSelection() )
@@ -693,7 +701,7 @@ void ctConfigToolView::OnUpdateItemHelp(wxUpdateUIEvent& event)
 }
 
 /// Add a custom property
-void ctConfigToolView::OnAddCustomProperty(wxCommandEvent& event)
+void ctConfigToolView::OnAddCustomProperty(wxCommandEvent& WXUNUSED(event))
 {
     ctConfigToolDoc* doc = (ctConfigToolDoc*) GetDocument();
     ctConfigItem* sel = GetSelection();
@@ -701,7 +709,7 @@ void ctConfigToolView::OnAddCustomProperty(wxCommandEvent& event)
     if (doc && sel && editor)
     {
         ctCustomPropertyDialog dialog(wxGetApp().GetMainFrame(),
-            -1, _("Add a custom property"));
+            wxID_ANY, _("Add a custom property"));
         if (dialog.ShowModal() == wxID_OK)
         {
             wxString name = dialog.GetPropertyName();
@@ -718,14 +726,14 @@ void ctConfigToolView::OnAddCustomProperty(wxCommandEvent& event)
             }
             ctProperty* property = new ctProperty;
             if (type == wxT("bool"))
-                property->GetVariant() = wxVariant((bool) FALSE, name);
+                property->GetVariant() = wxVariant(false, name);
             else if (type == wxT("double"))
                 property->GetVariant() = wxVariant((double) 0.0, name);
             else if (type == wxT("long"))
                 property->GetVariant() = wxVariant((long) 0, name);
             else
                 property->GetVariant() = wxVariant(wxT(""), name);
-            property->SetCustom(TRUE);
+            property->SetCustom(true);
             property->SetDescription(descr);
             property->SetChoices(choices);
             property->SetEditorType(editorType);
@@ -738,7 +746,7 @@ void ctConfigToolView::OnAddCustomProperty(wxCommandEvent& event)
 }
 
 /// Edit a custom property
-void ctConfigToolView::OnEditCustomProperty(wxCommandEvent& event)
+void ctConfigToolView::OnEditCustomProperty(wxCommandEvent& WXUNUSED(event))
 {
     ctConfigToolDoc* doc = (ctConfigToolDoc*) GetDocument();
     ctConfigItem* sel = GetSelection();
@@ -754,9 +762,9 @@ void ctConfigToolView::OnEditCustomProperty(wxCommandEvent& event)
             wxString oldType = property->GetVariant().GetType();
             wxString oldEditorType = property->GetEditorType();
             wxArrayString oldChoices = property->GetChoices();
-            
+
             ctCustomPropertyDialog dialog(wxGetApp().GetMainFrame(),
-                -1, _("Edit custom property"));
+                wxID_ANY, _("Edit custom property"));
             dialog.SetPropertyName(oldName);
             dialog.SetPropertyType(oldType);
             dialog.SetPropertyDescription(oldDescription);
@@ -767,7 +775,7 @@ void ctConfigToolView::OnEditCustomProperty(wxCommandEvent& event)
                 wxString editorType = dialog.GetEditorType();
                 wxArrayString choices = dialog.GetChoices();
                 wxString descr = dialog.GetPropertyDescription();
-                
+
                 if (name != oldName && sel->GetProperties().FindProperty(name))
                 {
                     wxMessageBox(_("Sorry, this name already exists."), _T("Add custom property"),
@@ -777,7 +785,7 @@ void ctConfigToolView::OnEditCustomProperty(wxCommandEvent& event)
                 if (type != oldType)
                 {
                     if (type == wxT("bool"))
-                        property->GetVariant() = wxVariant((bool) FALSE, name);
+                        property->GetVariant() = wxVariant(false, name);
                     else if (type == wxT("double"))
                         property->GetVariant() = wxVariant((double) 0.0, name);
                     else if (type == wxT("long"))
@@ -797,11 +805,11 @@ void ctConfigToolView::OnEditCustomProperty(wxCommandEvent& event)
                 if (name != oldName)
                     property->GetVariant().SetName(name);
 
-                property->SetCustom(TRUE);
+                property->SetCustom(true);
 
                 if (descr != oldDescription)
                     property->SetDescription(descr);
-                
+
                 editor->ShowItem(sel);
                 OnChangeFilename();
             }
@@ -810,7 +818,7 @@ void ctConfigToolView::OnEditCustomProperty(wxCommandEvent& event)
 }
 
 /// Delete a custom property
-void ctConfigToolView::OnDeleteCustomProperty(wxCommandEvent& event)
+void ctConfigToolView::OnDeleteCustomProperty(wxCommandEvent& WXUNUSED(event))
 {
     ctConfigToolDoc* doc = (ctConfigToolDoc*) GetDocument();
     ctConfigItem* sel = GetSelection();
@@ -895,25 +903,26 @@ void ctConfigToolView::OnTabSelect(wxNotebookEvent& event)
     }
 }
 
-void ctConfigToolView::OnSaveSetupFile(wxCommandEvent& event)
+void ctConfigToolView::OnSaveSetupFile(wxCommandEvent& WXUNUSED(event))
 {
     ctConfigToolDoc* doc = (ctConfigToolDoc*) GetDocument();
     wxString setupStr = doc->GenerateSetup();
 
     wxString filename = _T("setup.h");
-    wxString path = doc->GetFrameworkDir(FALSE);
+    wxString path = wxGetApp().GetSettings().m_lastSetupSaveDir;
+    if (path.IsEmpty())
+        path = doc->GetFrameworkDir(false);
     wxString wildcard = _T("Header files (*.h)|*.h|All files (*.*)|*.*");
-    
+
     wxFileDialog dialog(wxTheApp->GetTopWindow(),
         _("Save Setup File As"),
         path, filename ,
         wildcard, wxSAVE|wxOVERWRITE_PROMPT);
-    
+
     if (dialog.ShowModal() == wxID_OK)
     {
         wxString fullPath = dialog.GetPath();
-
-        // TODO: save last saved path in settings.
+        wxGetApp().GetSettings().m_lastSetupSaveDir = wxPathOnly(fullPath);
 
         wxFileOutputStream stream(fullPath);
         if (!stream.Ok())
@@ -923,28 +932,29 @@ void ctConfigToolView::OnSaveSetupFile(wxCommandEvent& event)
         }
 
         stream << setupStr;
-    }    
+    }
 }
 
-void ctConfigToolView::OnSaveConfigureCommand(wxCommandEvent& event)
+void ctConfigToolView::OnSaveConfigureCommand(wxCommandEvent& WXUNUSED(event))
 {
     ctConfigToolDoc* doc = (ctConfigToolDoc*) GetDocument();
     wxString configureStr = doc->GenerateConfigureCommand();
 
     wxString filename = _T("configurewx.sh");
-    wxString path = doc->GetFrameworkDir(FALSE);
+    wxString path = wxGetApp().GetSettings().m_lastSetupSaveDir;
+    if (path.IsEmpty())
+        path = doc->GetFrameworkDir(false);
     wxString wildcard = _T("Shell script files (*.sh)|*.sh|All files (*.*)|*.*");
-    
+
     wxFileDialog dialog(wxTheApp->GetTopWindow(),
         _("Save Configure Command File As"),
         path, filename ,
         wildcard, wxSAVE|wxOVERWRITE_PROMPT);
-    
+
     if (dialog.ShowModal() == wxID_OK)
     {
         wxString fullPath = dialog.GetPath();
-
-        // TODO: save last saved path in settings.
+        wxGetApp().GetSettings().m_lastSetupSaveDir = wxPathOnly(fullPath);
 
         wxFileOutputStream stream(fullPath);
         if (!stream.Ok())
@@ -954,15 +964,273 @@ void ctConfigToolView::OnSaveConfigureCommand(wxCommandEvent& event)
         }
 
         stream << configureStr;
-    }    
+    }
 }
 
 void ctConfigToolView::OnUpdateSaveSetupFile(wxUpdateUIEvent& event)
 {
-    event.Enable(TRUE);
+    event.Enable(true);
 }
 
 void ctConfigToolView::OnUpdateSaveConfigureCommand(wxUpdateUIEvent& event)
 {
-    event.Enable(TRUE);
+    event.Enable(true);
+}
+
+/// Find text
+void ctConfigToolView::OnFind(wxCommandEvent& WXUNUSED(event))
+{
+    ctFindReplaceDialog* dialog = wxGetApp().GetMainFrame()->GetFindDialog();
+    if (dialog)
+    {
+        dialog->Raise();
+    }
+
+    if (!dialog)
+    {
+        int style = wxFR_NOUPDOWN;
+        wxString caption(wxT("Find text in settings"));
+        int flags = wxFR_DOWN;
+        if (wxGetApp().GetSettings().m_matchCase)
+            flags|=wxFR_MATCHCASE;
+        if (wxGetApp().GetSettings().m_matchWholeWord)
+            flags|=wxFR_WHOLEWORD;
+
+        ctFindReplaceDialog::sm_findData.SetFlags(flags);
+
+        dialog = new ctFindReplaceDialog(wxGetApp().GetMainFrame(), caption, style);
+        dialog->Show(true);
+    }
+}
+
+/// Update find text
+void ctConfigToolView::OnUpdateFind(wxUpdateUIEvent& event)
+{
+    event.Enable(true);
+}
+
+/// Save default file type
+void ctConfigToolView::OnGo(wxCommandEvent& WXUNUSED(event))
+{
+    ctConfigToolDoc* doc = (ctConfigToolDoc*) GetDocument();
+    wxString path = wxGetApp().GetSettings().m_lastSetupSaveDir;
+    if (!path.IsEmpty())
+    {
+        if (wxGetApp().GetSettings().m_defaultFileKind == wxT("Setup file"))
+        {
+            // setup.h
+            wxString setupStr = doc->GenerateSetup();
+
+            wxString fullPath = path + wxFILE_SEP_PATH + wxT("setup.h");
+            if (wxFileExists(fullPath))
+            {
+                wxString msg;
+                msg.Printf(wxT("Overwrite existing file %s?"), (const wxChar*) fullPath);
+                int ans = wxMessageBox(msg, _("Save Setup File"), wxICON_QUESTION|wxYES_NO|wxCANCEL);
+                if (ans == wxCANCEL)
+                    return;
+                if (ans == wxNO)
+                    return;
+            }
+            wxFileOutputStream stream(fullPath);
+            if (!stream.Ok())
+            {
+                wxMessageBox(_("Sorry, could not save this file."), _("Save Setup File"), wxICON_EXCLAMATION|wxOK);
+                return;
+            }
+            stream << setupStr;
+        }
+        else if (wxGetApp().GetSettings().m_defaultFileKind == wxT("Configure script"))
+        {
+            // configurewx.sh
+            wxString configureStr = doc->GenerateConfigureCommand();
+
+            wxString fullPath = path + wxFILE_SEP_PATH + wxT("configurewx.sh");
+            if (wxFileExists(fullPath))
+            {
+                wxString msg;
+                msg.Printf(wxT("Overwrite existing file %s?"), (const wxChar*) fullPath);
+                int ans = wxMessageBox(msg, _("Save Configure Script"), wxICON_QUESTION|wxYES_NO|wxCANCEL);
+                if (ans == wxCANCEL)
+                    return;
+                if (ans == wxNO)
+                    return;
+            }
+            wxFileOutputStream stream(fullPath);
+            if (!stream.Ok())
+            {
+                wxMessageBox(_("Sorry, could not save this file."), _("Save Configure Script"), wxICON_EXCLAMATION|wxOK);
+                return;
+            }
+            stream << configureStr;
+        }
+        else
+        {
+            wxMessageBox(wxT("Unrecognised default file type."));
+        }
+    }
+}
+
+/// Update
+void ctConfigToolView::OnUpdateGo(wxUpdateUIEvent& event)
+{
+    wxString path = wxGetApp().GetSettings().m_lastSetupSaveDir;
+    event.Enable(!path.IsEmpty());
+}
+
+//----------------------------------------------------------------------------
+// ctFindReplaceDialog
+//----------------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(ctFindReplaceDialog, wxFindReplaceDialog)
+    EVT_FIND(wxID_ANY, ctFindReplaceDialog::OnFind)
+    EVT_FIND_NEXT(wxID_ANY, ctFindReplaceDialog::OnFind)
+    EVT_FIND_CLOSE(wxID_ANY, ctFindReplaceDialog::OnClose)
+END_EVENT_TABLE()
+
+wxFindReplaceData ctFindReplaceDialog::sm_findData;
+wxString ctFindReplaceDialog::sm_currentItem = wxEmptyString;
+
+ctFindReplaceDialog::ctFindReplaceDialog( wxWindow *parent, const wxString& title,
+        long style):
+    wxFindReplaceDialog( parent, & sm_findData, title, style )
+{
+    sm_currentItem = wxEmptyString;
+
+    if (parent)
+        ((ctMainFrame*) parent)->SetFindDialog(this);
+}
+
+void ctFindReplaceDialog::OnFind(wxFindDialogEvent& event)
+{
+    wxString textToFind = event.GetFindString();
+    bool matchCase = ((event.GetFlags() & wxFR_MATCHCASE) != 0);
+    bool wholeWord = ((event.GetFlags() & wxFR_WHOLEWORD) != 0);
+
+    wxGetApp().GetSettings().m_matchCase = matchCase;
+    wxGetApp().GetSettings().m_matchWholeWord = wholeWord;
+
+    if (!DoFind(textToFind, matchCase, wholeWord))
+    {
+        wxMessageBox(wxT("No more matches."), wxT("Search"), wxOK|wxICON_INFORMATION, this);
+    }
+}
+
+bool ctFindReplaceDialog::DoFind(const wxString& textToFind, bool matchCase, bool wholeWord, bool wrap)
+{
+    ctConfigToolDoc* doc = wxGetApp().GetMainFrame()->GetDocument();
+    if (!doc)
+        return false;
+    ctConfigToolView* view = (ctConfigToolView*) doc->GetFirstView();
+
+    ctConfigItem* currentItem = NULL;
+    ctConfigItem* focusItem = view->GetSelection();
+    if (!focusItem)
+    {
+        focusItem = doc->GetTopItem();
+        if (!focusItem)
+            return false;
+    }
+
+    if (!sm_currentItem.IsEmpty())
+    {
+        currentItem = doc->GetTopItem()->FindItem(sm_currentItem);
+    }
+
+    // If we were at this item last time, skip the first one.
+    bool skipFirstItem = (currentItem == focusItem);
+    currentItem = FindNextItem(doc, currentItem, textToFind, matchCase, wholeWord, wrap,
+        skipFirstItem);
+
+    if (currentItem)
+    {
+        sm_currentItem = currentItem->GetName();
+        wxGetApp().GetMainFrame()->GetConfigTreeCtrl()->SelectItem(currentItem->GetTreeItemId());
+        return true;
+    }
+    else
+    {
+        sm_currentItem = wxEmptyString;
+    }
+
+    return false;
+}
+
+ctConfigItem* ctFindReplaceDialog::FindNextItem(ctConfigToolDoc* doc,
+                                                      ctConfigItem* item,
+                                                      const wxString& text,
+                                                      bool matchCase,
+                                                      bool matchWordOnly,
+                                                      bool wrap,
+                                                      bool skipFirst)
+{
+    ctConfigItem* firstInDoc = NULL;
+
+    wxString text2(text);
+    if (!matchCase)
+        text2.MakeLower();
+
+    ctConfigItem* found = NULL;
+    ctConfigItem* next = item;
+
+    int i = 0;
+    do
+    {
+        // If starting the search from beginning, we can now
+        // set the value of 'item' in the 2nd iteration without immediately
+        // dropping out of the while loop because card == next
+        if (!item && (i > 0))
+            item = firstInDoc;
+
+        // We might want to start from this item if skipFirst is false.
+        if ((i == 0) && !skipFirst && next)
+        {
+        }
+        else
+            next = doc->FindNextItem(next, wrap);
+
+        // Save to be used in iteration 2
+        if ((i == 0) && !item)
+            firstInDoc = next;
+
+        if (next)
+        {
+            wxString str(next->GetName());
+            wxString description(next->GetPropertyString(wxT("description")));
+            wxString notes(next->GetPropertyString(wxT("notes")));
+            if (!matchCase)
+            {
+                str.MakeLower();
+                description.MakeLower();
+                notes.MakeLower();
+            }
+            if (ctMatchString(str, text2, matchWordOnly) ||
+                ctMatchString(description, text2, matchWordOnly) ||
+                ctMatchString(notes, text2, matchWordOnly))
+            {
+                found = next;
+            }
+        }
+        else
+            break; // Didn't find an item at all
+
+        i ++;
+    }
+    while (!found && item != next);
+
+    if (item == found && !firstInDoc)
+        return NULL;
+    else
+        return found;
+}
+
+void ctFindReplaceDialog::OnClose(wxFindDialogEvent& event)
+{
+    bool matchCase = ((event.GetFlags() & wxFR_MATCHCASE) != 0);
+    bool wholeWord = ((event.GetFlags() & wxFR_WHOLEWORD) != 0);
+    wxGetApp().GetSettings().m_matchCase = matchCase;
+    wxGetApp().GetSettings().m_matchWholeWord = wholeWord;
+
+    this->Destroy();
+    ((ctMainFrame*) GetParent())->SetFindDialog(NULL);
 }