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 
IMPLEMENT_DYNAMIC_CLASS(wxGenericFindReplaceDialog,wxDialog)53 IMPLEMENT_DYNAMIC_CLASS(wxGenericFindReplaceDialog, wxDialog)
54 
55 BEGIN_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)
66 END_EVENT_TABLE()
67 
68 // ----------------------------------------------------------------------------
69 // wxGenericFindReplaceDialog
70 // ----------------------------------------------------------------------------
71 
72 void 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 
Create(wxWindow * parent,wxFindReplaceData * data,const wxString & title,int style)85 bool 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 
SendEvent(const wxEventType & evtType)226 void 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 
OnFind(wxCommandEvent & WXUNUSED (event))258 void wxGenericFindReplaceDialog::OnFind(wxCommandEvent& WXUNUSED(event))
259 {
260     SendEvent(wxEVT_COMMAND_FIND_NEXT);
261 }
262 
OnReplace(wxCommandEvent & WXUNUSED (event))263 void wxGenericFindReplaceDialog::OnReplace(wxCommandEvent& WXUNUSED(event))
264 {
265     SendEvent(wxEVT_COMMAND_FIND_REPLACE);
266 }
267 
OnReplaceAll(wxCommandEvent & WXUNUSED (event))268 void wxGenericFindReplaceDialog::OnReplaceAll(wxCommandEvent& WXUNUSED(event))
269 {
270     SendEvent(wxEVT_COMMAND_FIND_REPLACE_ALL);
271 }
272 
OnCancel(wxCommandEvent & WXUNUSED (event))273 void wxGenericFindReplaceDialog::OnCancel(wxCommandEvent& WXUNUSED(event))
274 {
275     SendEvent(wxEVT_COMMAND_FIND_CLOSE);
276 
277     Show(false);
278 }
279 
OnUpdateFindUI(wxUpdateUIEvent & event)280 void wxGenericFindReplaceDialog::OnUpdateFindUI(wxUpdateUIEvent &event)
281 {
282     // we can't search for empty strings
283     event.Enable( !m_textFind->GetValue().empty() );
284 }
285 
OnCloseWindow(wxCloseEvent &)286 void wxGenericFindReplaceDialog::OnCloseWindow(wxCloseEvent &)
287 {
288     SendEvent(wxEVT_COMMAND_FIND_CLOSE);
289 }
290 
291 #endif // wxUSE_FINDREPLDLG
292