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