void wxSTEditorFindReplacePanel::UpdateFindFlags() { m_flags = 0; if (m_matchcaseCheckBox->GetValue()) m_flags |= wxFR_MATCHCASE; if (m_wholewordCheckBox->GetValue()) m_flags |= wxFR_WHOLEWORD; if (!m_backwardsCheckBox->GetValue()) m_flags |= wxFR_DOWN; if (m_wordstartCheckBox->GetValue()) m_flags |= STE_FR_WORDSTART; if (m_regexpFindCheckBox->GetValue()) m_flags |= STE_FR_REGEXP; if (m_wraparoundCheckBox->GetValue()) m_flags |= STE_FR_WRAPAROUND; if (m_findallCheckBox->GetValue()) m_flags |= STE_FR_FINDALL; if (m_bookmarkallCheckBox->GetValue()) m_flags |= STE_FR_BOOKMARKALL; if (m_scopewholeRadioButton->GetValue()) m_flags |= STE_FR_WHOLEDOC; else if (m_scopecursorRadioButton->GetValue()) m_flags |= STE_FR_FROMCURSOR; else if (m_scopealldocsRadioButton->GetValue()) m_flags |= STE_FR_ALLDOCS; if (m_resultEditor->IsShown() != STE_HASBIT(m_flags, STE_FR_FINDALL)) { InvalidateBestSize(); SetMinSize(wxSize(10, 10)); GetSizer()->SetMinSize(wxSize(10, 10)); GetSizer()->Show(m_resultEditor, STE_HASBIT(m_flags, STE_FR_FINDALL)); GetSizer()->Layout(); GetSizer()->SetSizeHints(this); } }
void wxSTEditorFindReplacePanel::SetData(wxSTEditorFindReplaceData *data) { wxCHECK_RET(data, wxT("Invalid find replace data in wxSTEditorFindReplaceDialog::SetData")); m_findReplaceData = data; // setup the find/replace comboboxes wxSTEInitComboBoxStrings(*m_findReplaceData->GetFindStrings(), m_findCombo); wxSTEInitComboBoxStrings(*m_findReplaceData->GetReplaceStrings(), m_replaceCombo); // setup the options checkboxes int flags = m_findReplaceData->GetFlags(); m_wholewordCheckBox->SetValue(STE_HASBIT(flags, wxFR_WHOLEWORD)); m_matchcaseCheckBox->SetValue(STE_HASBIT(flags, wxFR_MATCHCASE)); m_backwardsCheckBox->SetValue(!STE_HASBIT(flags, wxFR_DOWN)); m_wordstartCheckBox->SetValue(STE_HASBIT(flags, STE_FR_WORDSTART)); m_regexpFindCheckBox->SetValue(STE_HASBIT(flags, STE_FR_REGEXP)); m_wraparoundCheckBox->SetValue(STE_HASBIT(flags, STE_FR_WRAPAROUND)); m_findallCheckBox->SetValue(STE_HASBIT(flags, STE_FR_FINDALL)); m_bookmarkallCheckBox->SetValue(STE_HASBIT(flags, STE_FR_BOOKMARKALL)); // setup the scope radio buttons if (STE_HASBIT(flags, STE_FR_FROMCURSOR)) m_scopecursorRadioButton->SetValue(true); else if (STE_HASBIT(flags, STE_FR_ALLDOCS)) m_scopealldocsRadioButton->SetValue(true); else m_scopewholeRadioButton->SetValue(true); }
//----------------------------------------------------------------------------- // wxSTEditorFindReplaceData //----------------------------------------------------------------------------- int wxSTEditorFindReplaceData::STEToScintillaFlags(int ste_flags) { int sci_flags = 0; if (STE_HASBIT(ste_flags, STE_FR_MATCHCASE)) sci_flags |= wxSTC_FIND_MATCHCASE; if (STE_HASBIT(ste_flags, STE_FR_WHOLEWORD)) sci_flags |= wxSTC_FIND_WHOLEWORD; if (STE_HASBIT(ste_flags, STE_FR_WORDSTART)) sci_flags |= wxSTC_FIND_WORDSTART; if (STE_HASBIT(ste_flags, STE_FR_REGEXP )) sci_flags |= wxSTC_FIND_REGEXP; if (STE_HASBIT(ste_flags, STE_FR_POSIX )) sci_flags |= wxSTC_FIND_POSIX; return sci_flags; }
void wxSTEditorFindReplacePanel::OnMenu(wxCommandEvent& event) { wxString c; int ipos = 0; switch (event.GetId()) { case ID_STEDLG_INSERTMENU_TAB : c = wxT("\t"); break; case ID_STEDLG_INSERTMENU_CR : c = wxT("\r"); break; case ID_STEDLG_INSERTMENU_LF : c = wxT("\n"); break; case ID_STEDLG_INSERTMENURE_ANYCHAR : c = wxT("."); break; case ID_STEDLG_INSERTMENURE_RANGE : c = wxT("[]"); ipos = -1; break; case ID_STEDLG_INSERTMENURE_NOTRANGE : c = wxT("[^]"); ipos = -1; break; case ID_STEDLG_INSERTMENURE_BEGINLINE : c = wxT("^"); break; case ID_STEDLG_INSERTMENURE_ENDLINE : c = wxT("$"); break; case ID_STEDLG_INSERTMENURE_TAGEXPR : { if (!STE_HASBIT(GetFindFlags(), STE_FR_POSIX)) { c = wxT("\\(\\)"); ipos = -2; } else { c = wxT("()"); ipos = -1; } break; } case ID_STEDLG_INSERTMENURE_0MATCHES : c = wxT("*"); break; case ID_STEDLG_INSERTMENURE_1MATCHES : c = wxT("+"); break; case ID_STEDLG_INSERTMENURE_01MATCHES : c = wxT("?"); break; case ID_STEDLG_INSERTMENURE_ALPHANUM : c = wxT("[a-zA-Z][0-9]"); break; case ID_STEDLG_INSERTMENURE_ALPHA : c = wxT("[a-zA-Z]"); break; case ID_STEDLG_INSERTMENURE_NUMERIC : c = wxT("[0-9]"); break; case ID_STEDLG_INSERTMENURE_TAB : c = wxT("\\t"); break; default : break; } if (!c.IsEmpty()) // this must have been for the m_insertMenu { wxComboBox* cBox = (wxComboBox*)m_insertMenu->GetClientData(); wxCHECK_RET(cBox, wxT("Unexpected missing control")); int pos = (cBox == m_findCombo) ? m_find_insert_pos : m_replace_insert_pos; wxString s = cBox->GetValue(); if (pos >= int(s.Length())) s += c; else if (pos == 0) s = c + s; else s = s.Mid(0, pos) + c + s.Mid(pos); cBox->SetValue(s); cBox->SetFocus(); cBox->SetInsertionPoint(pos + c.Length() + ipos); } }
void wxSTEditorNotebook::SortTabs(int style) { if ((int)GetPageCount() < 2) return; if (STE_HASBIT(style, STN_ALPHABETICAL_TABS)) { int sel = GetSelection(); int new_sel = sel; size_t page_count = GetPageCount(); size_t n; if (page_count < 2) return; wxString curPageName; wxArrayString names; for (n = 0; n < page_count; n++) { wxString name(GetPageText(n)); if ((name.Length() > 0) && (name[0u] == wxT('*'))) name = name.Mid(1); names.Add(name + wxString::Format(wxT("=%d"), (int)n)); } names.Sort(STN_SortNameCompareFunction); bool sel_changed = false; for (n = 0; n < page_count; n++) { long old_page = 0; names[n].AfterLast(wxT('=')).ToLong(&old_page); if (old_page != long(n)) { wxWindow *oldWin = GetPage(old_page); wxString oldName(GetPageText(old_page)); if (oldWin && RemovePage(old_page)) { sel_changed = true; if (old_page == sel) new_sel = (int)n; if (n < page_count - 1) InsertPage((int)(n+1), oldWin, oldName, old_page == sel); else AddPage(oldWin, oldName, old_page == sel); } } } if (sel_changed) { wxNotebookEvent noteEvent(wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED, GetId(), new_sel, new_sel); noteEvent.SetString(wxT("wxSTEditorNotebook Page Change")); noteEvent.SetExtraLong(new_sel); // FIXME no Clone in wxNotebookEvent // NOTE: this may have to be AddPendingEvent for wx < 2.7 since gtk // can become reentrant GetEventHandler()->AddPendingEvent(noteEvent); } // causes reentrant assert in gtk, even though it's necessary sometimes //SetSelection(new_sel); // force selection for GTK } }
int wxSTEditorNotebook::FindString(const wxString &str, STE_TextPos start_pos, int flags, int action) { int n_pages = (int)GetPageCount(); int n_sel = GetSelection(); int n = -1; STE_TextPos pos = start_pos; bool forward = STE_HASBIT(flags, wxFR_DOWN) != 0; int noteb_flags = flags & (~STE_FR_WRAPAROUND); // switch to new page wxSTEditor *editor = NULL; if (n_sel < 0) return wxNOT_FOUND; // oops // search this page and later or before to end for (n = n_sel; forward ? n < n_pages : n >= 0; n = forward ? n+1 : n-1) { editor = GetEditor(n); if (!editor) continue; if (n != n_sel) pos = forward ? 0 : editor->GetLength(); pos = editor->FindString(str, pos, -1, noteb_flags, action); if (pos != wxNOT_FOUND) { SetSelection(n); editor->UpdateCanDo(true); // make sure CanFind is updated return pos; } } // search through remaining pages for (n = forward ? 0 : n_pages-1; forward ? n < n_sel : n > n_sel; n = forward ? n+1 : n-1) { editor = GetEditor(n); if (!editor) continue; pos = forward ? 0 : editor->GetLength(); pos = editor->FindString(str, pos, -1, noteb_flags, action); if (pos != wxNOT_FOUND) { SetSelection(n); editor->UpdateCanDo(true); // make sure CanFind is updated return pos; } } // if we haven't found the string then try to wrap around on this doc. editor = GetEditor(n_sel); if ((editor != NULL) && STE_HASBIT(flags, STE_FR_WRAPAROUND)) { pos = editor->FindString(str, start_pos, -1, flags, action); editor->UpdateCanDo(true); // make sure CanFind is updated return pos; } return wxNOT_FOUND; }
void wxSTEditorNotebook::OnFindDialog(wxFindDialogEvent &event) { wxSTERecursionGuard guard(m_rGuard_OnFindDialog); if (guard.IsInside()) return; // currently opened page is where the search starts wxSTEditor *editor = GetEditor(); if (!editor) return; // just search the given page by letting the editor handle it if (!STE_HASBIT(event.GetFlags(), STE_FR_ALLDOCS)) { editor->HandleFindDialogEvent(event); return; } wxEventType eventType = event.GetEventType(); wxString findString = event.GetFindString(); long flags = event.GetFlags(); editor->SetFindString(findString, true); editor->SetFindFlags(flags, true); STE_TextPos pos = editor->GetCurrentPos(); if ((eventType == wxEVT_COMMAND_FIND) && STE_HASBIT(flags, STE_FR_WHOLEDOC)) pos = -1; // we have to move cursor to start of word if last backwards search suceeded // note cmp is ok since regexp doesn't handle searching backwards if ((eventType == wxEVT_COMMAND_FIND_NEXT) && !STE_HASBIT(flags, wxFR_DOWN)) { if ((labs(editor->GetSelectionEnd() - editor->GetSelectionStart()) == long(findString.Length())) && (editor->GetFindReplaceData()->StringCmp(findString, editor->GetSelectedText(), flags))) pos -= (STE_TextPos)findString.Length() + 1; // doesn't matter if it matches or not, skip it } if (eventType == wxEVT_STEFIND_GOTO) { wxString findAllString(event.GetString()); wxString fileName; int line_number = 0; int line_start_pos = 0; int string_start_pos = 0; int string_length = 0; wxString lineText; bool ok = wxSTEditorFindReplaceData::ParseFindAllString(findAllString, fileName, line_number, line_start_pos, string_start_pos, string_length, lineText); int page = wxNOT_FOUND; if (ok) page = FindEditorPageByFileName(fileName); if (page != wxNOT_FOUND) { SetSelection(page); GetEditor(page)->HandleFindDialogEvent(event); } } else if ((eventType == wxEVT_COMMAND_FIND) || (eventType == wxEVT_COMMAND_FIND_NEXT)) { if (STE_HASBIT(flags, STE_FR_FINDALL|STE_FR_BOOKMARKALL)) { // sum up all of the find strings in all editors int n, count = (int)GetPageCount(); for (n = 0; n < count; n++) { wxSTEditor* e = GetEditor(n); if (e) e->HandleFindDialogEvent(event); } } else { if ((eventType == wxEVT_COMMAND_FIND) && STE_HASBIT(flags, STE_FR_WHOLEDOC)) pos = 0; pos = FindString(findString, pos, flags, STE_FINDSTRING_SELECT|STE_FINDSTRING_GOTO); if (pos >= 0) { //editor->SetFocus(); } else { wxBell(); // bell ok to signify no more occurances? } } } else if (eventType == wxEVT_COMMAND_FIND_REPLACE) { if (!editor->GetFindReplaceData()->StringCmp(findString, editor->GetSelectedText(), flags)) { wxBell(); return; } STE_TextPos pos = editor->GetSelectionStart(); wxString replaceString(event.GetReplaceString()); editor->ReplaceSelection(replaceString); editor->EnsureCaretVisible(); editor->SetSelection(pos, pos + (STE_TextPos)replaceString.Length()); editor->UpdateCanDo(true); //editor->SetFocus(); } else if (eventType == wxEVT_COMMAND_FIND_REPLACE_ALL) { wxString replaceString(event.GetReplaceString()); if (editor->GetFindReplaceData()->StringCmp(findString, replaceString, flags)) return; wxBusyCursor busy; int pages = 0; int count = ReplaceAllStrings(findString, replaceString, flags, &pages); wxString msg( wxString::Format(_("Replaced %d occurances of\n'%s' with '%s'\nin %d documents."), count, findString.wx_str(), replaceString.wx_str(), pages) ); wxMessageBox( msg, _("Finished replacing"), wxOK|wxICON_INFORMATION|wxSTAY_ON_TOP, wxGetTopLevelParent(this) ); // make it be on top in GTK //wxDynamicCast(event.GetEventObject(), wxDialog)); } else if (eventType == wxEVT_COMMAND_FIND_CLOSE) { //if (wxDynamicCast(event.GetEventObject(), wxDialog)) // ((wxDialog*)event.GetEventObject())->Destroy(); } }