Пример #1
0
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);
    }
}
Пример #2
0
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);
}
Пример #3
0
//-----------------------------------------------------------------------------
// 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;
}
Пример #4
0
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);
    }
}
Пример #5
0
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
    }
}
Пример #6
0
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;
}
Пример #7
0
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();
    }
}