pgadmin3/dlg/dlgFindReplace.cpp
2020-07-07 22:19:12 +05:00

367 lines
9.2 KiB
C++

//////////////////////////////////////////////////////////////////////////
//
// pgAdmin III - PostgreSQL Tools
//
// Copyright (C) 2002 - 2016, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
// dlgFindReplace.cpp - Search and replace
//
//////////////////////////////////////////////////////////////////////////
// App headers
#include "pgAdmin3.h"
#include "dlg/dlgFindReplace.h"
#include "ctl/ctlSQLBox.h"
BEGIN_EVENT_TABLE(dlgFindReplace, pgDialog)
EVT_BUTTON (wxID_FIND, dlgFindReplace::OnFind)
EVT_BUTTON (wxID_REPLACE, dlgFindReplace::OnReplace)
EVT_BUTTON (XRCID("wxID_REPLACEALL"), dlgFindReplace::OnReplaceAll)
EVT_BUTTON (wxID_CANCEL, dlgFindReplace::OnCancel)
EVT_RADIOBUTTON(XRCID("rdOriginCursor"), dlgFindReplace::OnChange)
EVT_RADIOBUTTON(XRCID("rdOriginTop"), dlgFindReplace::OnChange)
EVT_CHECKBOX(XRCID("chkOptionsUseRegexps"), dlgFindReplace::OnChange)
EVT_CLOSE( dlgFindReplace::OnClose)
END_EVENT_TABLE()
#define btnFind CTRL_BUTTON("wxID_FIND")
#define btnReplace CTRL_BUTTON("wxID_REPLACE")
#define btnReplaceAll CTRL_BUTTON("wxID_REPLACEALL")
#define btnCancel CTRL_BUTTON("wxID_CANCEL")
#define txtFind CTRL_TEXT("txtFind")
#define txtReplace CTRL_TEXT("txtReplace")
#define rdOriginTop CTRL_RADIOBUTTON("rdOriginTop")
#define rdOriginCursor CTRL_RADIOBUTTON("rdOriginCursor")
#define rdDirectionForward CTRL_RADIOBUTTON("rdDirectionForward")
#define rdDirectionBackward CTRL_RADIOBUTTON("rdDirectionBackward")
#define chkOptionsWholeWord CTRL_CHECKBOX("chkOptionsWholeWord")
#define chkOptionsAllFind CTRL_CHECKBOX("chkOptionsAllFind")
#define chkOptionsMatchCase CTRL_CHECKBOX("chkOptionsMatchCase")
#define chkOptionsUseRegexps CTRL_CHECKBOX("chkOptionsUseRegexps")
dlgFindReplace::dlgFindReplace(ctlSQLBox *parent) :
pgDialog()
{
sqlbox = parent;
startsqlbox = parent;
SetFont(settings->GetSystemFont());
LoadResource(parent, wxT("dlgFindReplace"));
RestorePosition();
// Icon
appearanceFactory->SetIcons(this);
// Accelerator table
wxAcceleratorEntry entries[2];
entries[0].Set(wxACCEL_NORMAL, WXK_F3, wxID_FIND);
entries[1].Set(wxACCEL_SHIFT, WXK_F3, wxID_FIND);
wxAcceleratorTable accel(2, entries);
SetAcceleratorTable(accel);
if (startsqlbox->GetQueryBook()==NULL) chkOptionsAllFind->Disable();
// Load up the defaults
wxString val;
bool bVal;
// Find/Replace values
settings->Read(wxT("FindReplace/Find"), &val, wxT(""));
txtFind->SetValue(val);
settings->Read(wxT("FindReplace/Replace"), &val, wxT(""));
txtReplace->SetValue(val);
// Origin
settings->Read(wxT("FindReplace/Origin"), &val, wxT("c"));
if (val == wxT("t"))
{
rdOriginCursor->SetValue(false);
rdOriginTop->SetValue(true);
}
else
{
rdOriginCursor->SetValue(true);
rdOriginTop->SetValue(false);
}
// Direction
settings->Read(wxT("FindReplace/Direction"), &val, wxT("f"));
if (val == wxT("b"))
{
rdDirectionForward->SetValue(false);
rdDirectionBackward->SetValue(true);
}
else
{
rdDirectionForward->SetValue(true);
rdDirectionBackward->SetValue(false);
}
// WholeWord
settings->Read(wxT("FindReplace/WholeWord"), &bVal, false);
chkOptionsWholeWord->SetValue(bVal);
// MatchCase
settings->Read(wxT("FindReplace/MatchCase"), &bVal, false);
chkOptionsMatchCase->SetValue(bVal);
// UseRegexps
settings->Read(wxT("FindReplace/UseRegexps"), &bVal, false);
chkOptionsUseRegexps->SetValue(bVal);
wxCommandEvent ev;
OnChange(ev);
ResetTabOrder();
}
dlgFindReplace::~dlgFindReplace()
{
SavePosition();
}
void dlgFindReplace::FocusSearch()
{
txtFind->SetFocus();
txtFind->SetSelection(-1, -1);
}
void dlgFindReplace::SaveSettings()
{
settings->Write(wxT("FindReplace/Find"), txtFind->GetValue());
settings->Write(wxT("FindReplace/Replace"), txtReplace->GetValue());
if (rdOriginTop->GetValue())
settings->Write(wxT("FindReplace/Origin"), wxT("t"));
else
settings->Write(wxT("FindReplace/Origin"), wxT("c"));
if (rdDirectionBackward->GetValue())
settings->Write(wxT("FindReplace/Direction"), wxT("b"));
else
settings->Write(wxT("FindReplace/Direction"), wxT("f"));
settings->WriteBool(wxT("FindReplace/WholeWord"), chkOptionsWholeWord->GetValue());
settings->WriteBool(wxT("FindReplace/MatchCase"), chkOptionsMatchCase->GetValue());
settings->WriteBool(wxT("FindReplace/UseRegexps"), chkOptionsUseRegexps->GetValue());
}
void dlgFindReplace::OnClose(wxCloseEvent &ev)
{
SaveSettings();
this->Hide();
if (ev.CanVeto())
ev.Veto();
}
void dlgFindReplace::OnCancel(wxCommandEvent &ev)
{
SaveSettings();
this->Hide();
}
void dlgFindReplace::OnChange(wxCommandEvent &ev)
{
if (chkOptionsUseRegexps->GetValue() == true || rdOriginTop->GetValue() == true)
{
rdDirectionForward->SetValue(true);
rdDirectionBackward->SetValue(false);
rdDirectionBackward->Enable(false);
}
else
{
rdDirectionBackward->Enable(true);
}
if (chkOptionsUseRegexps->GetValue() == true)
{
chkOptionsWholeWord->Enable(false);
chkOptionsMatchCase->Enable(false);
}
else
{
chkOptionsWholeWord->Enable(true);
chkOptionsMatchCase->Enable(true);
}
}
void dlgFindReplace::OnFind(wxCommandEvent &ev)
{
if (txtFind->GetValue().IsEmpty())
return;
bool wholeWord = false,
matchCase = false,
useRegexps = false,
startAtTop = false,
all = false,
reverse = false;
if (rdOriginTop->GetValue() == true)
startAtTop = true;
if (rdDirectionBackward->GetValue() == true)
reverse = true;
if (wxGetKeyState(WXK_SHIFT))
reverse = !reverse;
if (chkOptionsWholeWord->GetValue() == true)
wholeWord = true;
if (chkOptionsMatchCase->GetValue() == true)
matchCase = true;
if (chkOptionsUseRegexps->GetValue() == true)
useRegexps = true;
if (chkOptionsAllFind->GetValue() == true)
all = true;
if (sqlbox->Find(txtFind->GetValue(), wholeWord, matchCase, useRegexps, startAtTop, reverse,all))
{
if (startAtTop)
{
rdOriginTop->SetValue(false);
rdOriginCursor->SetValue(true);
wxCommandEvent nullEvent;
OnChange(nullEvent);
return;
}
} else
{
rdOriginTop->SetValue(true);
rdOriginCursor->SetValue(false);
wxCommandEvent nullEvent;
OnChange(nullEvent);
startAtTop=true;
reverse=false;
// not find in current tabs
if (all) {
ctlAuiNotebook *note=startsqlbox->GetQueryBook();
if (note!=NULL) {
size_t count_pages=note->GetPageCount();
ctlSQLBox *sqlQuery;
for(int i=0;i<count_pages;i++) {
sqlQuery = wxDynamicCast(note->GetPage(i), ctlSQLBox);
if (sqlQuery==sqlbox) {
while (true) {
i++;
if (i>=count_pages) i=0;
// next tabs
sqlQuery = wxDynamicCast(note->GetPage(i), ctlSQLBox);
if (sqlQuery==startsqlbox) {
note->SetSelection(i);
sqlbox=sqlQuery;
wxWindow *w = wxWindow::FindFocus();
wxMessageBox(_("Reached the end of the document"), _("Replace text"), wxICON_EXCLAMATION | wxOK, w);
return ;
}
note->SetSelection(i);
sqlbox=sqlQuery;
if (sqlbox->Find(txtFind->GetValue(), wholeWord, matchCase, useRegexps, startAtTop, reverse,all))
{
if (startAtTop)
{
rdOriginTop->SetValue(false);
rdOriginCursor->SetValue(true);
wxCommandEvent nullEvent;
OnChange(nullEvent);
return;
}
}
}
return;
}
}
}
wxWindow *w = wxWindow::FindFocus();
wxMessageBox(_("Reached the end of the document"), _("Replace text"), wxICON_EXCLAMATION | wxOK, w);
}
}
}
void dlgFindReplace::OnReplace(wxCommandEvent &ev)
{
if (txtFind->GetValue().IsEmpty())
return;
bool wholeWord = false,
matchCase = false,
useRegexps = false,
startAtTop = false,
reverse = false;
if (rdOriginTop->GetValue() == true)
startAtTop = true;
if (rdDirectionBackward->GetValue() == true)
reverse = true;
if (chkOptionsWholeWord->GetValue() == true)
wholeWord = true;
if (chkOptionsMatchCase->GetValue() == true)
matchCase = true;
if (chkOptionsUseRegexps->GetValue() == true)
useRegexps = true;
if (startsqlbox->Replace(txtFind->GetValue(), txtReplace->GetValue(), wholeWord, matchCase, useRegexps, startAtTop, reverse))
{
if (startAtTop)
{
rdOriginTop->SetValue(false);
rdOriginCursor->SetValue(true);
wxCommandEvent nullEvent;
OnChange(nullEvent);
}
}
}
void dlgFindReplace::OnReplaceAll(wxCommandEvent &ev)
{
if (txtFind->GetValue().IsEmpty())
return;
bool wholeWord = false,
matchCase = false,
useRegexps = false;
if (chkOptionsWholeWord->GetValue() == true)
wholeWord = true;
if (chkOptionsMatchCase->GetValue() == true)
matchCase = true;
if (chkOptionsUseRegexps->GetValue() == true)
useRegexps = true;
startsqlbox->ReplaceAll(txtFind->GetValue(), txtReplace->GetValue(), wholeWord, matchCase, useRegexps);
}
void dlgFindReplace::FindNext()
{
if (btnFind->IsEnabled() && !txtFind->IsEmpty())
{
wxCommandEvent ev;
OnFind(ev);
}
}
void dlgFindReplace::SetFindString(const wxString &val)
{
txtFind->SetValue(val);
}
void dlgFindReplace::ResetTabOrder()
{
btnFind->MoveAfterInTabOrder(chkOptionsUseRegexps);
btnReplace->MoveAfterInTabOrder(btnFind);
btnReplaceAll->MoveAfterInTabOrder(btnReplace);
btnCancel->MoveAfterInTabOrder(btnReplaceAll);
}