xml-copy-editor-code/src/findreplacepanel.cpp

267 lines
7.1 KiB
C++
Executable File

#include <wx/fdrepdlg.h>
#include "findreplacepanel.h"
#include "nocasecompare.h"
#include "xmlcopyeditor.h"
BEGIN_EVENT_TABLE(FindReplacePanel, wxPanel)
EVT_BUTTON(ID_FINDREPLACE_FIND_NEXT, FindReplacePanel::OnFindNext)
EVT_BUTTON(ID_FINDREPLACE_REPLACE, FindReplacePanel::OnReplace)
EVT_BUTTON(ID_FINDREPLACE_REPLACE_ALL, FindReplacePanel::OnReplaceAll)
EVT_IDLE(FindReplacePanel::OnIdle)
END_EVENT_TABLE()
FindReplacePanel::FindReplacePanel(
wxWindow *parentParameter,
int id,
wxFindReplaceData *findDataParameter,
bool isReplacePanel,
bool isRegexParameter) : wxPanel(parentParameter, id)
{
parent = parentParameter;
findData = findDataParameter;
incrementalFind = notFoundSet = false;
isRegex = isRegexParameter;
matchCaseMemory = (findData->GetFlags()) & wxFR_MATCHCASE;
regexMemory = isRegex;
label1 = new wxStaticText(this, wxID_ANY, _("Find:"));
spacer1 = new wxStaticText(this, wxID_ANY, _(" "));
spacer2 = new wxStaticText(this, wxID_ANY, _(" "));
int editWidth = 140;
findEdit = new wxTextCtrl(
this,
ID_FINDREPLACE_FIND_NEXT,
_T(""),
wxDefaultPosition,
wxSize(editWidth, -1)
);
findEdit->SetValue(findData->GetFindString());
label2 = new wxStaticText(this, wxID_ANY, _("Replace with:"));
replaceEdit = new wxTextCtrl(
this,
ID_FINDREPLACE_REPLACE,
_T(""),
wxDefaultPosition,
wxSize(editWidth, -1));
replaceEdit->SetValue(findData->GetReplaceString());
findNextButton = new wxButton(
this,
ID_FINDREPLACE_FIND_NEXT,
_("Find &Next"),
wxDefaultPosition,
wxDefaultSize,
wxBU_EXACTFIT | wxNO_BORDER);
replaceButton = new wxButton(
this,
ID_FINDREPLACE_REPLACE,
_("&Replace"),
wxDefaultPosition,
wxDefaultSize,
wxBU_EXACTFIT | wxNO_BORDER);
replaceAllButton = new wxButton(
this,
ID_FINDREPLACE_REPLACE_ALL,
_("Replace &All"),
wxDefaultPosition,
wxDefaultSize,
wxBU_EXACTFIT | wxNO_BORDER);
matchCaseBox = new wxCheckBox(
this,
ID_FINDREPLACE_MATCH_CASE,
_("&Match case"));
size_t flags = findData->GetFlags();
matchCaseBox->SetValue(flags & wxFR_MATCHCASE);
regexBox = new wxCheckBox(
this,
ID_FINDREPLACE_REGEX,
_("Re&gex"));
int sizerOffset = 2;
sizer = new wxBoxSizer(wxHORIZONTAL);
sizer->Add(label1, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset);
sizer->Add(findEdit, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset);
sizer->Add(label2, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset);
sizer->Add(replaceEdit, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset);
sizer->Add(spacer1, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset);
sizer->Add(findNextButton, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset);
sizer->Add(replaceButton, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset);
sizer->Add(replaceAllButton, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset);
sizer->Add(spacer2, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset);
sizer->Add(matchCaseBox, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset);
sizer->Add(regexBox, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, sizerOffset);
sizer->Layout();
this->SetSizer(sizer);
this->SetSize(-1, findNextButton->GetSize().GetHeight() + 10);
findEditLength = findEdit->GetValue().Length();
if (!isReplacePanel)
{
label2->Hide();
replaceEdit->Hide();
replaceButton->Hide();
replaceAllButton->Hide();
}
refresh();
}
FindReplacePanel::~FindReplacePanel()
{
}
void FindReplacePanel::OnFindNext(wxCommandEvent& event)
{
findData->SetFindString(findEdit->GetValue());
findData->SetReplaceString(replaceEdit->GetValue());
incrementalFind = false;
size_t flags = 0;
flags |= wxFR_DOWN;
if (matchCaseBox->GetValue())
flags |= wxFR_MATCHCASE;
sendFindEvent(flags);
}
void FindReplacePanel::OnReplace(wxCommandEvent& event)
{
wxFindDialogEvent replaceEvent(wxEVT_COMMAND_FIND_REPLACE, 0);
replaceEvent.SetFlags(wxFR_DOWN);
replaceEvent.SetFindString(findEdit->GetValue());
replaceEvent.SetReplaceString(replaceEdit->GetValue());
parent->ProcessEvent(replaceEvent);
}
void FindReplacePanel::OnReplaceAll(wxCommandEvent& event)
{
wxFindDialogEvent replaceAllEvent(wxEVT_COMMAND_FIND_REPLACE_ALL, 0);
replaceAllEvent.SetFlags(wxFR_DOWN);
replaceAllEvent.SetFindString(findEdit->GetValue());
replaceAllEvent.SetReplaceString(replaceEdit->GetValue());
parent->ProcessEvent(replaceAllEvent);
}
void FindReplacePanel::focusOnFind()
{
findEdit->SelectAll();
findEdit->SetFocus();
}
void FindReplacePanel::OnIdle(wxIdleEvent& event)
{
size_t newLength = findEdit->GetValue().Length();
enableButtons((!newLength) ? false : true);
bool settingsChanged = false;
if (matchCaseMemory != matchCaseBox->GetValue() ||
regexMemory != regexBox->GetValue())
{
settingsChanged = true;
matchCaseMemory = matchCaseBox->GetValue();
regexMemory = regexBox->GetValue();
}
if (newLength != findEditLength || settingsChanged)
{
incrementalFind = true;
size_t flags = 0;
flags |= wxFR_DOWN;
if (matchCaseBox->GetValue())
flags |= wxFR_MATCHCASE;
sendFindEvent(flags);
findEditLength = newLength;
findData->SetFlags(flags);
}
}
void FindReplacePanel::sendFindEvent(size_t flags)
{
wxFindDialogEvent findEvent(wxEVT_COMMAND_FIND_NEXT, 0);
findEvent.SetFlags(flags);
findEvent.SetFindString(findEdit->GetValue());
MyFrame *frame = (MyFrame *)parent;
frame->setStrictScrolling(true);
frame->ProcessEvent(findEvent); // was parent->
frame->setStrictScrolling(false);
findData->SetFindString(findEdit->GetValue());
findData->SetReplaceString(replaceEdit->GetValue());
}
bool FindReplacePanel::getIncrementalFind()
{
return incrementalFind;
}
void FindReplacePanel::refresh()
{
incrementalFind = false;
findEdit->SetValue(findData->GetFindString());
replaceEdit->SetValue(findData->GetReplaceString());
size_t flags = findData->GetFlags();
bool matchCase;
matchCase = flags & wxFR_MATCHCASE;
matchCaseBox->SetValue(matchCase);
matchCaseMemory = matchCase;
regexBox->SetValue(isRegex);
regexMemory = isRegex;
}
void FindReplacePanel::setReplaceVisible(bool b)
{
label2->Show(b);
replaceEdit->Show(b);
replaceButton->Show(b);
replaceAllButton->Show(b);
sizer->Layout();
}
void FindReplacePanel::flagNotFound(bool b)
{
if (notFoundSet && b || !notFoundSet && !b)
return;
notFoundSet = b;
}
bool FindReplacePanel::getRegex()
{
return regexBox->GetValue();
}
void FindReplacePanel::setMatchCase(bool b)
{
matchCaseBox->SetValue(b);
}
void FindReplacePanel::setRegex(bool b)
{
regexBox->SetValue(b);
}
void FindReplacePanel::enableButtons(bool b)
{
findNextButton->Enable(b);
replaceButton->Enable(b);
replaceAllButton->Enable(b);
}