X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f8105809ef8f7cb0d1a9933f3f790b7b446c7cfa..8a82c9ecc9a2cba9727b538c818ebdba243eacbc:/utils/configtool/src/configtoolview.cpp?ds=sidebyside diff --git a/utils/configtool/src/configtoolview.cpp b/utils/configtool/src/configtoolview.cpp index c9549799ab..138fc3eac5 100644 --- a/utils/configtool/src/configtoolview.cpp +++ b/utils/configtool/src/configtoolview.cpp @@ -87,6 +87,13 @@ BEGIN_EVENT_TABLE(ctConfigToolView, wxView) 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) + + 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() ctConfigToolView::ctConfigToolView() @@ -348,11 +355,17 @@ void ctConfigToolView::OnIconLeftDown(ctConfigTreeCtrl* treeControl, ctConfigIte 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(); + } } } @@ -901,7 +914,9 @@ void ctConfigToolView::OnSaveSetupFile(wxCommandEvent& event) 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(), @@ -912,8 +927,7 @@ void ctConfigToolView::OnSaveSetupFile(wxCommandEvent& event) 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()) @@ -932,7 +946,9 @@ void ctConfigToolView::OnSaveConfigureCommand(wxCommandEvent& event) 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(), @@ -943,8 +959,7 @@ void ctConfigToolView::OnSaveConfigureCommand(wxCommandEvent& event) 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()) @@ -966,3 +981,261 @@ void ctConfigToolView::OnUpdateSaveConfigureCommand(wxUpdateUIEvent& event) { event.Enable(TRUE); } + +/// Find text +void ctConfigToolView::OnFind(wxCommandEvent& 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& 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(-1, ctFindReplaceDialog::OnFind) + EVT_FIND_NEXT(-1, ctFindReplaceDialog::OnFind) + EVT_FIND_CLOSE(-1, 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); +}