+ 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.empty())
+ {
+ 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.empty());
+}
+
+//----------------------------------------------------------------------------
+// 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.empty())
+ {
+ 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);