166 lines
5.2 KiB
C++
166 lines
5.2 KiB
C++
|
#include "globalreplacedialog.h"
|
||
|
#include "wrapregex.h"
|
||
|
|
||
|
BEGIN_EVENT_TABLE(GlobalReplaceDialog, wxDialog)
|
||
|
EVT_BUTTON(wxID_OK, GlobalReplaceDialog::OnOk)
|
||
|
EVT_HELP_RANGE(ID_FIND, ID_ALLDOCUMENTS, GlobalReplaceDialog::OnContextHelp)
|
||
|
EVT_HELP(wxID_OK, GlobalReplaceDialog::OnContextHelp)
|
||
|
EVT_HELP(wxID_CANCEL, GlobalReplaceDialog::OnContextHelp)
|
||
|
EVT_UPDATE_UI(wxID_OK, GlobalReplaceDialog::OnUpdateOk)
|
||
|
END_EVENT_TABLE()
|
||
|
|
||
|
GlobalReplaceDialog::GlobalReplaceDialog(
|
||
|
wxWindow *parent,
|
||
|
const wxString& findParameter,
|
||
|
const wxString& replaceParameter,
|
||
|
bool matchCaseParameter,
|
||
|
bool allDocumentsParameter,
|
||
|
bool regexParameter) :
|
||
|
wxDialog(),
|
||
|
find(findParameter),
|
||
|
replace(replaceParameter),
|
||
|
matchCase(matchCaseParameter),
|
||
|
allDocuments(allDocumentsParameter),
|
||
|
regex(regexParameter)
|
||
|
{
|
||
|
SetExtraStyle(wxDIALOG_EX_CONTEXTHELP);
|
||
|
Create(
|
||
|
parent,
|
||
|
wxID_ANY,
|
||
|
wxString(_("Global Find and Replace")),
|
||
|
wxDefaultPosition,
|
||
|
wxSize(-1, -1),
|
||
|
wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
|
||
|
|
||
|
wxBoxSizer *dialogSizer = new wxBoxSizer(wxVERTICAL);
|
||
|
wxStaticText *findLabel = new wxStaticText(this, ID_FIND, _("&Find what: "));
|
||
|
wxStaticText *replaceLabel =
|
||
|
new wxStaticText(this, ID_REPLACE, _("Replace with: "));
|
||
|
findCtrl = new wxTextCtrl(
|
||
|
this,
|
||
|
ID_FIND,
|
||
|
find,
|
||
|
wxDefaultPosition,
|
||
|
wxSize(400, -1));
|
||
|
|
||
|
replaceCtrl = new wxTextCtrl(
|
||
|
this,
|
||
|
ID_REPLACE,
|
||
|
replace,
|
||
|
wxDefaultPosition,
|
||
|
wxSize(400, -1));
|
||
|
|
||
|
regexBox =
|
||
|
new wxCheckBox(this, ID_REGEX, _("&Regex"));
|
||
|
regexBox->SetValue(regex);
|
||
|
|
||
|
matchCaseBox =
|
||
|
new wxCheckBox(this, ID_MATCHCASE, _("&Match case"));
|
||
|
matchCaseBox->SetValue(matchCase);
|
||
|
|
||
|
allDocumentsBox =
|
||
|
new wxCheckBox(this, ID_ALLDOCUMENTS, _("R&eplace in all open documents"));
|
||
|
allDocumentsBox->SetValue(allDocuments);
|
||
|
|
||
|
dialogSizer->Add(findLabel, 0, wxTOP | wxLEFT | wxALIGN_LEFT, 5);
|
||
|
dialogSizer->Add(findCtrl, 0, wxALL | wxALIGN_LEFT | wxEXPAND, 5);
|
||
|
dialogSizer->Add(replaceLabel, 0, wxTOP | wxLEFT | wxALIGN_LEFT, 5);
|
||
|
dialogSizer->Add(replaceCtrl, 0, wxALL | wxALIGN_LEFT | wxEXPAND, 5);
|
||
|
dialogSizer->Add(matchCaseBox, 0, wxALL | wxALIGN_LEFT, 5);
|
||
|
dialogSizer->Add(regexBox, 0, wxALL | wxALIGN_LEFT, 5);
|
||
|
dialogSizer->Add(allDocumentsBox, 0, wxALL | wxALIGN_LEFT, 5);
|
||
|
dialogSizer->Add(
|
||
|
CreateButtonSizer(wxOK | wxCANCEL), 0, wxTOP | wxBOTTOM | wxALIGN_RIGHT, 5);
|
||
|
this->SetSizer(dialogSizer);
|
||
|
dialogSizer->SetSizeHints(this);
|
||
|
findCtrl->SetFocus();
|
||
|
}
|
||
|
|
||
|
GlobalReplaceDialog::~GlobalReplaceDialog()
|
||
|
{ }
|
||
|
|
||
|
void GlobalReplaceDialog::OnOk(wxCommandEvent& e)
|
||
|
{
|
||
|
std::string findUtf8, replaceUtf8;
|
||
|
find = findCtrl->GetValue();
|
||
|
replace = replaceCtrl->GetValue();
|
||
|
findUtf8 = (const char *)find.mb_str(wxConvUTF8);
|
||
|
replaceUtf8 = (const char *)replace.mb_str(wxConvUTF8);
|
||
|
regex = regexBox->GetValue();
|
||
|
allDocuments = allDocumentsBox->GetValue();
|
||
|
matchCase = matchCaseBox->GetValue();
|
||
|
|
||
|
if (regex)
|
||
|
{
|
||
|
try {
|
||
|
std::auto_ptr<WrapRegex> wr(new WrapRegex(
|
||
|
findUtf8,
|
||
|
matchCase,
|
||
|
replaceUtf8));
|
||
|
}
|
||
|
catch (std::exception& e)
|
||
|
{
|
||
|
std::string pcreError(e.what());
|
||
|
wxString widePcreError =
|
||
|
wxString(pcreError.c_str(), wxConvUTF8, pcreError.size());
|
||
|
wxMessageBox(
|
||
|
_("Cannot compile regular expression '") +
|
||
|
findCtrl->GetValue() +
|
||
|
_T("': ") +
|
||
|
widePcreError,
|
||
|
_("Global Find and Replace"));
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
e.Skip();
|
||
|
}
|
||
|
|
||
|
void GlobalReplaceDialog::OnContextHelp(wxHelpEvent& e)
|
||
|
{
|
||
|
wxTipWindow *tw;
|
||
|
|
||
|
int id = e.GetId();
|
||
|
if (id == ID_FIND)
|
||
|
tw = new wxTipWindow(
|
||
|
this,
|
||
|
_("Provides a space for you to type the text you want to find"));
|
||
|
else if (id == ID_REPLACE)
|
||
|
tw = new wxTipWindow(
|
||
|
this,
|
||
|
_("Provides a space for you to type the text you want to replace the text you typed in Find what"));
|
||
|
else if (id == ID_MATCHCASE)
|
||
|
tw = new wxTipWindow(
|
||
|
this,
|
||
|
_("Finds only text with lowercase and uppercase letters as specified in Find what"));
|
||
|
else if (id == ID_ALLDOCUMENTS)
|
||
|
tw = new wxTipWindow(
|
||
|
this,
|
||
|
_("Extends the scope to all open documents"));
|
||
|
else if (id == ID_REGEX)
|
||
|
tw = new wxTipWindow(
|
||
|
this,
|
||
|
_("Interprets the text specified in Find what as a regular expression"));
|
||
|
else if (id == wxID_OK)
|
||
|
tw = new wxTipWindow(
|
||
|
this,
|
||
|
_("Finds all instances of the text specified in Find what and replaces them with the text in Replace with"));
|
||
|
else if (id == wxID_CANCEL)
|
||
|
tw = new wxTipWindow(
|
||
|
this,
|
||
|
_("Closes the dialog box without saving any changes you have made"));
|
||
|
else { }
|
||
|
e.Skip();
|
||
|
}
|
||
|
|
||
|
void GlobalReplaceDialog::OnUpdateOk(wxUpdateUIEvent& e)
|
||
|
{
|
||
|
e.Enable(!findCtrl->GetValue().empty());
|
||
|
}
|
||
|
|
||
|
|
||
|
wxString GlobalReplaceDialog::getFindString() { return find; }
|
||
|
wxString GlobalReplaceDialog::getReplaceString() { return replace; }
|
||
|
bool GlobalReplaceDialog::getRegex() { return regex; }
|
||
|
bool GlobalReplaceDialog::getAllDocuments() { return allDocuments; }
|
||
|
bool GlobalReplaceDialog::getMatchCase() { return matchCase; }
|