]> git.saurik.com Git - wxWidgets.git/blob - src/generic/fdrepdlg.cpp
avoid asserts when the cipboard is acquired by another application
[wxWidgets.git] / src / generic / fdrepdlg.cpp
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
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
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
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
258 void wxGenericFindReplaceDialog::OnFind(wxCommandEvent& WXUNUSED(event))
259 {
260 SendEvent(wxEVT_COMMAND_FIND_NEXT);
261 }
262
263 void wxGenericFindReplaceDialog::OnReplace(wxCommandEvent& WXUNUSED(event))
264 {
265 SendEvent(wxEVT_COMMAND_FIND_REPLACE);
266 }
267
268 void wxGenericFindReplaceDialog::OnReplaceAll(wxCommandEvent& WXUNUSED(event))
269 {
270 SendEvent(wxEVT_COMMAND_FIND_REPLACE_ALL);
271 }
272
273 void wxGenericFindReplaceDialog::OnCancel(wxCommandEvent& WXUNUSED(event))
274 {
275 SendEvent(wxEVT_COMMAND_FIND_CLOSE);
276
277 Show(false);
278 }
279
280 void wxGenericFindReplaceDialog::OnUpdateFindUI(wxUpdateUIEvent &event)
281 {
282 // we can't search for empty strings
283 event.Enable( !m_textFind->GetValue().empty() );
284 }
285
286 void wxGenericFindReplaceDialog::OnCloseWindow(wxCloseEvent &)
287 {
288 SendEvent(wxEVT_COMMAND_FIND_CLOSE);
289 }
290
291 #endif // wxUSE_FINDREPLDLG