1///////////////////////////////////////////////////////////////////////////// 2// Name: src/generic/fdrepgg.cpp 3// Purpose: Find/Replace dialogs 4// Author: Markus Greither and Vadim Zeitlin 5// Modified by: 6// Created: 05/25/01 7// RCS-ID: 8// Copyright: (c) wxWidgets team 9// Licence: wxWindows licence 10///////////////////////////////////////////////////////////////////////////// 11 12// ============================================================================ 13// declarations 14// ============================================================================ 15 16// ---------------------------------------------------------------------------- 17// headers 18// ---------------------------------------------------------------------------- 19 20// For compilers that support precompilation, includes "wx.h". 21#include "wx/wxprec.h" 22 23#ifdef __BORLANDC__ 24 #pragma hdrstop 25#endif 26 27#if wxUSE_FINDREPLDLG 28 29#ifndef WX_PRECOMP 30 #include "wx/intl.h" 31 #include "wx/log.h" 32 33 #include "wx/sizer.h" 34 35 #include "wx/button.h" 36 #include "wx/checkbox.h" 37 #include "wx/radiobox.h" 38 #include "wx/stattext.h" 39 #include "wx/textctrl.h" 40 #include "wx/settings.h" 41#endif 42 43#include "wx/fdrepdlg.h" 44 45// ---------------------------------------------------------------------------- 46// constants 47// ---------------------------------------------------------------------------- 48 49// ============================================================================ 50// implementation 51// ============================================================================ 52 53IMPLEMENT_DYNAMIC_CLASS(wxGenericFindReplaceDialog, wxDialog) 54 55BEGIN_EVENT_TABLE(wxGenericFindReplaceDialog, wxDialog) 56 EVT_BUTTON(wxID_FIND, wxGenericFindReplaceDialog::OnFind) 57 EVT_BUTTON(wxID_REPLACE, wxGenericFindReplaceDialog::OnReplace) 58 EVT_BUTTON(wxID_REPLACE_ALL, wxGenericFindReplaceDialog::OnReplaceAll) 59 EVT_BUTTON(wxID_CANCEL, wxGenericFindReplaceDialog::OnCancel) 60 61 EVT_UPDATE_UI(wxID_FIND, wxGenericFindReplaceDialog::OnUpdateFindUI) 62 EVT_UPDATE_UI(wxID_REPLACE, wxGenericFindReplaceDialog::OnUpdateFindUI) 63 EVT_UPDATE_UI(wxID_REPLACE_ALL, wxGenericFindReplaceDialog::OnUpdateFindUI) 64 65 EVT_CLOSE(wxGenericFindReplaceDialog::OnCloseWindow) 66END_EVENT_TABLE() 67 68// ---------------------------------------------------------------------------- 69// wxGenericFindReplaceDialog 70// ---------------------------------------------------------------------------- 71 72void wxGenericFindReplaceDialog::Init() 73{ 74 m_FindReplaceData = NULL; 75 76 m_chkWord = 77 m_chkCase = NULL; 78 79 m_radioDir = NULL; 80 81 m_textFind = 82 m_textRepl = NULL; 83} 84 85bool wxGenericFindReplaceDialog::Create(wxWindow *parent, 86 wxFindReplaceData *data, 87 const wxString& title, 88 int style) 89{ 90 if ( !wxDialog::Create(parent, wxID_ANY, title, 91 wxDefaultPosition, wxDefaultSize, 92 wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER 93 | style) ) 94 { 95 return false; 96 } 97 98 SetData(data); 99 100 wxCHECK_MSG( m_FindReplaceData, false, 101 _T("can't create dialog without data") ); 102 103 bool isPda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); 104 105 wxBoxSizer *leftsizer = new wxBoxSizer( wxVERTICAL ); 106 107 // 3 columns because there is a spacer in the middle 108 wxFlexGridSizer *sizer2Col = new wxFlexGridSizer(3); 109 sizer2Col->AddGrowableCol(2); 110 111 sizer2Col->Add(new wxStaticText(this, wxID_ANY, _("Search for:"), 112 wxDefaultPosition, wxSize(80, wxDefaultCoord)), 113 0, 114 wxALIGN_CENTRE_VERTICAL | wxALIGN_RIGHT); 115 116 sizer2Col->Add(10, 0); 117 118 m_textFind = new wxTextCtrl(this, wxID_ANY, m_FindReplaceData->GetFindString()); 119 sizer2Col->Add(m_textFind, 1, wxALIGN_CENTRE_VERTICAL | wxEXPAND); 120 121 if ( style & wxFR_REPLACEDIALOG ) 122 { 123 sizer2Col->Add(new wxStaticText(this, wxID_ANY, _("Replace with:"), 124 wxDefaultPosition, wxSize(80, wxDefaultCoord)), 125 0, 126 wxALIGN_CENTRE_VERTICAL | 127 wxALIGN_RIGHT | wxTOP, 5); 128 129 sizer2Col->Add(isPda ? 2 : 10, 0); 130 131 m_textRepl = new wxTextCtrl(this, wxID_ANY, 132 m_FindReplaceData->GetReplaceString()); 133 sizer2Col->Add(m_textRepl, 1, 134 wxALIGN_CENTRE_VERTICAL | wxEXPAND | wxTOP, 5); 135 } 136 137 leftsizer->Add(sizer2Col, 0, wxEXPAND | wxALL, 5); 138 139 wxBoxSizer *optsizer = new wxBoxSizer( isPda ? wxVERTICAL : wxHORIZONTAL ); 140 141 wxBoxSizer *chksizer = new wxBoxSizer( wxVERTICAL); 142 143 m_chkWord = new wxCheckBox(this, wxID_ANY, _("Whole word")); 144 chksizer->Add(m_chkWord, 0, wxALL, 3); 145 146 m_chkCase = new wxCheckBox(this, wxID_ANY, _("Match case")); 147 chksizer->Add(m_chkCase, 0, wxALL, 3); 148 149 optsizer->Add(chksizer, 0, wxALL, 10); 150 151 static const wxString searchDirections[] = {_("Up"), _("Down")}; 152 int majorDimension = 0; 153 int rbStyle ; 154 if (isPda) 155 rbStyle = wxRA_SPECIFY_ROWS; 156 else 157 rbStyle = wxRA_SPECIFY_COLS; 158 159 m_radioDir = new wxRadioBox(this, wxID_ANY, _("Search direction"), 160 wxDefaultPosition, wxDefaultSize, 161 WXSIZEOF(searchDirections), searchDirections, 162 majorDimension, rbStyle); 163 164 optsizer->Add(m_radioDir, 0, wxALL, isPda ? 5 : 10); 165 166 leftsizer->Add(optsizer); 167 168 wxBoxSizer *bttnsizer = new wxBoxSizer(wxVERTICAL); 169 170 wxButton* btn = new wxButton(this, wxID_FIND); 171 btn->SetDefault(); 172 bttnsizer->Add(btn, 0, wxALL, 3); 173 174 bttnsizer->Add(new wxButton(this, wxID_CANCEL), 0, wxALL, 3); 175 176 if ( style & wxFR_REPLACEDIALOG ) 177 { 178 bttnsizer->Add(new wxButton(this, wxID_REPLACE, _("&Replace")), 179 0, wxALL, 3); 180 181 bttnsizer->Add(new wxButton(this, wxID_REPLACE_ALL, _("Replace &all")), 182 0, wxALL, 3); 183 } 184 185 wxBoxSizer *topsizer = new wxBoxSizer( wxHORIZONTAL ); 186 187 topsizer->Add(leftsizer, 1, wxALL, isPda ? 0 : 5); 188 topsizer->Add(bttnsizer, 0, wxALL, isPda ? 0 : 5); 189 190 int flags = m_FindReplaceData->GetFlags(); 191 192 if ( flags & wxFR_MATCHCASE ) 193 m_chkCase->SetValue(true); 194 195 if ( flags & wxFR_WHOLEWORD ) 196 m_chkWord->SetValue(true); 197 198 m_radioDir->SetSelection( flags & wxFR_DOWN ); 199 200 if ( style & wxFR_NOMATCHCASE ) 201 m_chkCase->Enable(false); 202 203 if ( style & wxFR_NOWHOLEWORD ) 204 m_chkWord->Enable(false); 205 206 if ( style & wxFR_NOUPDOWN) 207 m_radioDir->Enable(false); 208 209 SetAutoLayout( true ); 210 SetSizer( topsizer ); 211 212 topsizer->SetSizeHints( this ); 213 topsizer->Fit( this ); 214 215 Centre( wxBOTH ); 216 217 m_textFind->SetFocus(); 218 219 return true; 220} 221 222// ---------------------------------------------------------------------------- 223// send the notification event 224// ---------------------------------------------------------------------------- 225 226void wxGenericFindReplaceDialog::SendEvent(const wxEventType& evtType) 227{ 228 wxFindDialogEvent event(evtType, GetId()); 229 event.SetEventObject(this); 230 event.SetFindString(m_textFind->GetValue()); 231 if ( HasFlag(wxFR_REPLACEDIALOG) ) 232 { 233 event.SetReplaceString(m_textRepl->GetValue()); 234 } 235 236 int flags = 0; 237 238 if ( m_chkCase->GetValue() ) 239 flags |= wxFR_MATCHCASE; 240 241 if ( m_chkWord->GetValue() ) 242 flags |= wxFR_WHOLEWORD; 243 244 if ( !m_radioDir || m_radioDir->GetSelection() == 1 ) 245 { 246 flags |= wxFR_DOWN; 247 } 248 249 event.SetFlags(flags); 250 251 wxFindReplaceDialogBase::Send(event); 252} 253 254// ---------------------------------------------------------------------------- 255// event handlers 256// ---------------------------------------------------------------------------- 257 258void wxGenericFindReplaceDialog::OnFind(wxCommandEvent& WXUNUSED(event)) 259{ 260 SendEvent(wxEVT_COMMAND_FIND_NEXT); 261} 262 263void wxGenericFindReplaceDialog::OnReplace(wxCommandEvent& WXUNUSED(event)) 264{ 265 SendEvent(wxEVT_COMMAND_FIND_REPLACE); 266} 267 268void wxGenericFindReplaceDialog::OnReplaceAll(wxCommandEvent& WXUNUSED(event)) 269{ 270 SendEvent(wxEVT_COMMAND_FIND_REPLACE_ALL); 271} 272 273void wxGenericFindReplaceDialog::OnCancel(wxCommandEvent& WXUNUSED(event)) 274{ 275 SendEvent(wxEVT_COMMAND_FIND_CLOSE); 276 277 Show(false); 278} 279 280void wxGenericFindReplaceDialog::OnUpdateFindUI(wxUpdateUIEvent &event) 281{ 282 // we can't search for empty strings 283 event.Enable( !m_textFind->GetValue().empty() ); 284} 285 286void wxGenericFindReplaceDialog::OnCloseWindow(wxCloseEvent &) 287{ 288 SendEvent(wxEVT_COMMAND_FIND_CLOSE); 289} 290 291#endif // wxUSE_FINDREPLDLG 292