]> git.saurik.com Git - wxWidgets.git/blame - samples/text/text.cpp
Fix handling of help buttons with non-empty label under OS X.
[wxWidgets.git] / samples / text / text.cpp
CommitLineData
02e8b87f 1/////////////////////////////////////////////////////////////////////////////
4aff28fc 2// Name: text.cpp
be5a51fb 3// Purpose: TextCtrl wxWidgets sample
02e8b87f
RR
4// Author: Robert Roebling
5// Modified by:
6// RCS-ID: $Id$
4aff28fc 7// Copyright: (c) Robert Roebling, Julian Smart, Vadim Zeitlin
526954c5 8// Licence: wxWindows licence
02e8b87f
RR
9/////////////////////////////////////////////////////////////////////////////
10
02e8b87f
RR
11// For compilers that support precompilation, includes "wx/wx.h".
12#include "wx/wxprec.h"
13
14#ifdef __BORLANDC__
15 #pragma hdrstop
16#endif
17
18#ifndef WX_PRECOMP
19 #include "wx/wx.h"
20#endif
21
22#if wxUSE_CLIPBOARD
23 #include "wx/dataobj.h"
24 #include "wx/clipbrd.h"
25#endif
26
0ddea946 27#if wxUSE_FILE
ae3dd4a5 28 #include "wx/file.h"
0ddea946
VZ
29#endif
30
02e8b87f
RR
31#if wxUSE_TOOLTIPS
32 #include "wx/tooltip.h"
33#endif
34
b6a0d8a2
VZ
35// We test for wxUSE_DRAG_AND_DROP also, because data objects may not be
36// implemented for compilers that can't cope with the OLE parts in
37// wxUSE_DRAG_AND_DROP.
38#if !wxUSE_DRAG_AND_DROP
39 #undef wxUSE_CLIPBOARD
40 #define wxUSE_CLIPBOARD 0
41#endif
42
e00a5d3c
JS
43#include "wx/colordlg.h"
44#include "wx/fontdlg.h"
ea180b18 45#include "wx/numdlg.h"
7fb3f3c4 46#include "wx/tokenzr.h"
e00a5d3c 47
41f02b9a
FM
48#ifndef __WXMSW__
49 #include "../sample.xpm"
50#endif
51
02e8b87f
RR
52//----------------------------------------------------------------------
53// class definitions
54//----------------------------------------------------------------------
55
56class MyApp: public wxApp
57{
58public:
59 bool OnInit();
60};
61
62// a text ctrl which allows to call different wxTextCtrl functions
63// interactively by pressing function keys in it
64class MyTextCtrl : public wxTextCtrl
65{
66public:
67 MyTextCtrl(wxWindow *parent, wxWindowID id, const wxString &value,
68 const wxPoint &pos, const wxSize &size, int style = 0)
56c4a88b
VZ
69 : wxTextCtrl(parent, id, value, pos, size, style)
70 {
effbd41d 71 m_hasCapture = false;
56c4a88b 72 }
02e8b87f
RR
73
74 void OnKeyDown(wxKeyEvent& event);
75 void OnKeyUp(wxKeyEvent& event);
76 void OnChar(wxKeyEvent& event);
d7eee191 77
9ca03a57 78 void OnText(wxCommandEvent& event);
c5dd5a3d 79 void OnTextEnter(wxCommandEvent& event);
c57e3339 80 void OnTextURL(wxTextUrlEvent& event);
d7eee191
VZ
81 void OnTextMaxLen(wxCommandEvent& event);
82
78c91815
VZ
83 void OnTextCut(wxClipboardTextEvent & event);
84 void OnTextCopy(wxClipboardTextEvent & event);
85 void OnTextPaste(wxClipboardTextEvent & event);
86
4aff28fc 87 void OnMouseEvent(wxMouseEvent& event);
02e8b87f 88
94ccc254
VZ
89 void OnSetFocus(wxFocusEvent& event);
90 void OnKillFocus(wxFocusEvent& event);
91
56c4a88b
VZ
92 static bool ms_logKey;
93 static bool ms_logChar;
94 static bool ms_logMouse;
1ce58dc6 95 static bool ms_logText;
94ccc254 96 static bool ms_logFocus;
78c91815 97 static bool ms_logClip;
f152cf5a 98
02e8b87f 99private:
9a83f860 100 static inline wxChar GetChar(bool on, wxChar c) { return on ? c : wxT('-'); }
78c91815 101
94ccc254 102 void LogKeyEvent(const wxChar *name, wxKeyEvent& event) const;
78c91815 103 void LogClipEvent(const wxChar *what, wxClipboardTextEvent& event);
02e8b87f 104
56c4a88b
VZ
105 bool m_hasCapture;
106
02e8b87f
RR
107 DECLARE_EVENT_TABLE()
108};
109
110class MyPanel: public wxPanel
111{
112public:
113 MyPanel(wxFrame *frame, int x, int y, int w, int h);
925e9792
WS
114 virtual ~MyPanel()
115 {
b29903d4 116#if wxUSE_LOG
925e9792 117 delete wxLog::SetActiveTarget(m_logOld);
b29903d4
WS
118#endif // wxUSE_LOG
119 }
02e8b87f 120
b6a0d8a2
VZ
121#if wxUSE_CLIPBOARD
122 void DoPasteFromClipboard();
123 void DoCopyToClipboard();
124#endif // wxUSE_CLIPBOARD
125
cba1148d 126 void DoRemoveText();
cdd732de 127 void DoReplaceText();
29676ca0 128 void DoSelectText();
b6a0d8a2
VZ
129 void DoMoveToEndOfText();
130 void DoMoveToEndOfEntry();
02e8b87f 131
5b07594a
VZ
132 // return true if currently text control has any selection
133 bool HasSelection() const
134 {
135 long from, to;
136 GetFocusedText()->GetSelection(&from, &to);
137 return from != to;
138 }
139
02e8b87f
RR
140 MyTextCtrl *m_text;
141 MyTextCtrl *m_password;
142 MyTextCtrl *m_enter;
143 MyTextCtrl *m_tab;
02e8b87f 144 MyTextCtrl *m_readonly;
d7eee191 145 MyTextCtrl *m_limited;
bb69661b 146
02e8b87f
RR
147 MyTextCtrl *m_multitext;
148 MyTextCtrl *m_horizontal;
02e8b87f 149
0ddea946
VZ
150 MyTextCtrl *m_textrich;
151
b29903d4 152#if wxUSE_LOG
02e8b87f 153 wxTextCtrl *m_log;
d847e69a 154 wxLog *m_logOld;
b29903d4 155#endif // wxUSE_LOG
d847e69a 156
89124b1a 157private:
5b07594a
VZ
158 // get the currently focused text control or return the default one
159 // (m_multitext) is no text ctrl has focus -- in any case, returns
160 // something non NULL
161 wxTextCtrl *GetFocusedText() const;
02e8b87f
RR
162};
163
164class MyFrame: public wxFrame
165{
166public:
ab1ca7b3 167 MyFrame(wxFrame *frame, const wxChar *title, int x, int y, int w, int h);
02e8b87f
RR
168
169 void OnQuit(wxCommandEvent& event);
170 void OnAbout(wxCommandEvent& event);
171#if wxUSE_TOOLTIPS
172 void OnSetTooltipDelay(wxCommandEvent& event);
173 void OnToggleTooltips(wxCommandEvent& event);
174#endif // wxUSE_TOOLTIPS
b6a0d8a2
VZ
175
176#if wxUSE_CLIPBOARD
656562d8 177 void OnPasteFromClipboard( wxCommandEvent& WXUNUSED(event) )
5b07594a 178 {
9a83f860 179 wxLogMessage(wxT("Pasting text from clipboard."));
5b07594a
VZ
180 m_panel->DoPasteFromClipboard();
181 }
656562d8 182 void OnCopyToClipboard( wxCommandEvent& WXUNUSED(event) )
5b07594a 183 {
9a83f860 184 wxLogMessage(wxT("Copying text to clipboard."));
5b07594a
VZ
185 m_panel->DoCopyToClipboard();
186 }
187
188 void OnUpdatePasteFromClipboard(wxUpdateUIEvent& event)
189 {
190 wxClipboardLocker lockClip;
191
192 event.Enable( wxTheClipboard->IsSupported(wxDF_TEXT) );
193 }
194
195 void OnUpdateCopyToClipboard(wxUpdateUIEvent& event)
196 {
197 event.Enable( m_panel->HasSelection() );
198 }
b6a0d8a2
VZ
199#endif // wxUSE_CLIPBOARD
200
be83461c
VZ
201 void OnAddTextLine(wxCommandEvent& WXUNUSED(event))
202 {
203 static int s_n = 0;
204 m_panel->m_textrich->AppendText(wxString::Format("Line %d\n", ++s_n));
205 }
206
656562d8 207 void OnAddTextFreeze( wxCommandEvent& WXUNUSED(event) )
eff00523 208 { DoAddText(true); }
656562d8 209 void OnAddText( wxCommandEvent& WXUNUSED(event) )
eff00523 210 { DoAddText(false); }
656562d8 211 void OnRemoveText( wxCommandEvent& WXUNUSED(event) )
cba1148d 212 { m_panel->DoRemoveText(); }
656562d8 213 void OnReplaceText( wxCommandEvent& WXUNUSED(event) )
cdd732de 214 { m_panel->DoReplaceText(); }
656562d8 215 void OnSelectText( wxCommandEvent& WXUNUSED(event) )
29676ca0 216 { m_panel->DoSelectText(); }
eff00523 217
656562d8 218 void OnMoveToEndOfText( wxCommandEvent& WXUNUSED(event) )
b6a0d8a2 219 { m_panel->DoMoveToEndOfText(); }
656562d8 220 void OnMoveToEndOfEntry( wxCommandEvent& WXUNUSED(event) )
b6a0d8a2
VZ
221 { m_panel->DoMoveToEndOfEntry(); }
222
656562d8 223 void OnScrollLineDown(wxCommandEvent& WXUNUSED(event))
22670da4
VZ
224 {
225 if ( !m_panel->m_textrich->LineDown() )
43b2d5e7 226 {
9a83f860 227 wxLogMessage(wxT("Already at the bottom"));
43b2d5e7 228 }
22670da4
VZ
229 }
230
656562d8 231 void OnScrollLineUp(wxCommandEvent& WXUNUSED(event))
22670da4
VZ
232 {
233 if ( !m_panel->m_textrich->LineUp() )
43b2d5e7 234 {
9a83f860 235 wxLogMessage(wxT("Already at the top"));
43b2d5e7 236 }
22670da4
VZ
237 }
238
656562d8 239 void OnScrollPageDown(wxCommandEvent& WXUNUSED(event))
22670da4
VZ
240 {
241 if ( !m_panel->m_textrich->PageDown() )
43b2d5e7 242 {
9a83f860 243 wxLogMessage(wxT("Already at the bottom"));
43b2d5e7 244 }
22670da4
VZ
245 }
246
656562d8 247 void OnScrollPageUp(wxCommandEvent& WXUNUSED(event))
22670da4
VZ
248 {
249 if ( !m_panel->m_textrich->PageUp() )
43b2d5e7 250 {
9a83f860 251 wxLogMessage(wxT("Already at the top"));
43b2d5e7 252 }
22670da4 253 }
925e9792 254
ae25e5cc
RN
255 void OnGetLine(wxCommandEvent& WXUNUSED(event))
256 {
257 long nLine = wxGetNumberFromUser(wxT("Which line would you like to get?"),
258 wxT("Enter which line you would like to get"),
259 wxT("Get a line from the tabbed multiline text control") );
925e9792 260
ae25e5cc
RN
261 wxMessageBox(m_panel->m_tab->GetLineText(nLine));
262 }
263
264 void OnGetLineLength(wxCommandEvent& WXUNUSED(event))
265 {
266 long nLine = wxGetNumberFromUser(wxT("Which line would you like to get?"),
267 wxT("Enter which line you would like to get"),
268 wxT("Get length of a line from the tabbed multiline text control") );
925e9792
WS
269
270 wxMessageBox(wxString::Format(wxT("Length of line %i is:%i"),
ae25e5cc
RN
271 (int) nLine,
272 m_panel->m_tab->GetLineLength(nLine))
273 );
274 }
22670da4 275
b29903d4 276#if wxUSE_LOG
e66ad5c6 277 void OnLogClear(wxCommandEvent& event);
b29903d4 278#endif // wxUSE_LOG
0ddea946 279 void OnFileSave(wxCommandEvent& event);
b6a0d8a2 280 void OnFileLoad(wxCommandEvent& event);
e00a5d3c 281 void OnRichTextTest(wxCommandEvent& event);
b6a0d8a2 282
f6bcfd97
BP
283 void OnSetEditable(wxCommandEvent& event);
284 void OnSetEnabled(wxCommandEvent& event);
285
56c4a88b
VZ
286 void OnLogKey(wxCommandEvent& event)
287 {
288 MyTextCtrl::ms_logKey = event.IsChecked();
289 }
290
291 void OnLogChar(wxCommandEvent& event)
292 {
293 MyTextCtrl::ms_logChar = event.IsChecked();
294 }
295
296 void OnLogMouse(wxCommandEvent& event)
297 {
298 MyTextCtrl::ms_logMouse = event.IsChecked();
299 }
300
1ce58dc6
VZ
301 void OnLogText(wxCommandEvent& event)
302 {
303 MyTextCtrl::ms_logText = event.IsChecked();
304 }
305
94ccc254
VZ
306 void OnLogFocus(wxCommandEvent& event)
307 {
308 MyTextCtrl::ms_logFocus = event.IsChecked();
309 }
310
78c91815
VZ
311 void OnLogClip(wxCommandEvent& event)
312 {
313 MyTextCtrl::ms_logClip = event.IsChecked();
314 }
315
656562d8 316 void OnSetText(wxCommandEvent& WXUNUSED(event))
60f52320 317 {
9a83f860 318 m_panel->m_text->SetValue(wxT("Hello, world! (what else did you expect?)"));
7ddc9343
VZ
319 }
320
321 void OnChangeText(wxCommandEvent& WXUNUSED(event))
322 {
9a83f860 323 m_panel->m_text->ChangeValue(wxT("Changed, not set: no event"));
60f52320
VZ
324 }
325
02e8b87f
RR
326 void OnIdle( wxIdleEvent& event );
327
328private:
eff00523
VZ
329 void DoAddText(bool freeze)
330 {
cdd732de 331 wxTextCtrl * const text = m_panel->m_textrich;
cdd732de 332
eff00523
VZ
333 if ( freeze )
334 text->Freeze();
335
53aa9c77
VS
336 text->Clear();
337
eff00523 338 for ( int i = 0; i < 100; i++ )
0146a47e 339 {
4693b20c 340 text->AppendText(wxString::Format(wxT("Line %i\n"), i));
0146a47e 341 }
eff00523 342
53aa9c77
VS
343 text->SetInsertionPoint(0);
344
eff00523
VZ
345 if ( freeze )
346 text->Thaw();
347 }
348
b6a0d8a2
VZ
349 MyPanel *m_panel;
350
02e8b87f
RR
351 DECLARE_EVENT_TABLE()
352};
353
e00a5d3c
JS
354/*
355 * RichTextFrame is used to demonstrate rich text behaviour
356 */
357
358class RichTextFrame: public wxFrame
359{
360public:
361 RichTextFrame(wxWindow* parent, const wxString& title);
362
363// Event handlers
364
365 void OnClose(wxCommandEvent& event);
80185c6c 366 void OnIdle(wxIdleEvent& event);
e00a5d3c
JS
367 void OnLeftAlign(wxCommandEvent& event);
368 void OnRightAlign(wxCommandEvent& event);
369 void OnJustify(wxCommandEvent& event);
370 void OnCentre(wxCommandEvent& event);
371 void OnChangeFont(wxCommandEvent& event);
372 void OnChangeTextColour(wxCommandEvent& event);
373 void OnChangeBackgroundColour(wxCommandEvent& event);
374 void OnLeftIndent(wxCommandEvent& event);
375 void OnRightIndent(wxCommandEvent& event);
7fb3f3c4 376 void OnTabStops(wxCommandEvent& event);
e00a5d3c
JS
377
378private:
379 wxTextCtrl *m_textCtrl;
80185c6c 380 long m_currentPosition;
e00a5d3c
JS
381
382 DECLARE_EVENT_TABLE()
383};
384
02e8b87f
RR
385//----------------------------------------------------------------------
386// main()
387//----------------------------------------------------------------------
388
389IMPLEMENT_APP(MyApp)
390
391//----------------------------------------------------------------------
392// MyApp
393//----------------------------------------------------------------------
394
395enum
396{
91b07357
JS
397 TEXT_QUIT = wxID_EXIT,
398 TEXT_ABOUT = wxID_ABOUT,
399 TEXT_LOAD = 101,
ae3dd4a5 400 TEXT_SAVE,
e66ad5c6 401 TEXT_CLEAR,
e00a5d3c 402 TEXT_RICH_TEXT_TEST,
b6a0d8a2
VZ
403
404 // clipboard menu
405 TEXT_CLIPBOARD_COPY = 200,
406 TEXT_CLIPBOARD_PASTE,
78c91815 407 TEXT_CLIPBOARD_VETO,
02e8b87f
RR
408
409 // tooltip menu
b6a0d8a2
VZ
410 TEXT_TOOLTIPS_SETDELAY = 300,
411 TEXT_TOOLTIPS_ENABLE,
412
f6bcfd97 413 // text menu
eff00523
VZ
414 TEXT_ADD_SOME = 400,
415 TEXT_ADD_FREEZE,
be83461c 416 TEXT_ADD_LINE,
eff00523 417 TEXT_MOVE_ENDTEXT,
f6bcfd97
BP
418 TEXT_MOVE_ENDENTRY,
419 TEXT_SET_EDITABLE,
22670da4
VZ
420 TEXT_SET_ENABLED,
421 TEXT_LINE_DOWN,
422 TEXT_LINE_UP,
423 TEXT_PAGE_DOWN,
424 TEXT_PAGE_UP,
925e9792 425
ae25e5cc
RN
426 TEXT_GET_LINE,
427 TEXT_GET_LINELENGTH,
925e9792 428
cba1148d 429 TEXT_REMOVE,
cdd732de 430 TEXT_REPLACE,
29676ca0 431 TEXT_SELECT,
60f52320 432 TEXT_SET,
7ddc9343 433 TEXT_CHANGE,
56c4a88b
VZ
434
435 // log menu
436 TEXT_LOG_KEY,
437 TEXT_LOG_CHAR,
438 TEXT_LOG_MOUSE,
1ce58dc6 439 TEXT_LOG_TEXT,
94ccc254 440 TEXT_LOG_FOCUS,
78c91815 441 TEXT_LOG_CLIP,
56c4a88b
VZ
442
443 TEXT_END
02e8b87f
RR
444};
445
446bool MyApp::OnInit()
447{
45e6e6f8
VZ
448 if ( !wxApp::OnInit() )
449 return false;
450
02e8b87f
RR
451 // Create the main frame window
452 MyFrame *frame = new MyFrame((wxFrame *) NULL,
9a83f860 453 wxT("Text wxWidgets sample"), 50, 50, 700, 550);
89124b1a 454 frame->SetSizeHints( 500, 400 );
02e8b87f 455
02e8b87f 456 wxMenu *file_menu = new wxMenu;
9a83f860
VZ
457 file_menu->Append(TEXT_SAVE, wxT("&Save file\tCtrl-S"),
458 wxT("Save the text control contents to file"));
459 file_menu->Append(TEXT_LOAD, wxT("&Load file\tCtrl-O"),
460 wxT("Load the sample file into text control"));
b6a0d8a2 461 file_menu->AppendSeparator();
9a83f860 462 file_menu->Append(TEXT_RICH_TEXT_TEST, wxT("Show Rich Text Editor"));
e00a5d3c 463 file_menu->AppendSeparator();
9a83f860 464 file_menu->Append(TEXT_ABOUT, wxT("&About\tAlt-A"));
b6a0d8a2 465 file_menu->AppendSeparator();
9a83f860 466 file_menu->Append(TEXT_QUIT, wxT("E&xit\tAlt-X"), wxT("Quit this sample"));
02e8b87f
RR
467
468 wxMenuBar *menu_bar = new wxMenuBar( wxMB_DOCKABLE );
9a83f860 469 menu_bar->Append(file_menu, wxT("&File"));
02e8b87f
RR
470
471#if wxUSE_TOOLTIPS
472 wxMenu *tooltip_menu = new wxMenu;
9a83f860 473 tooltip_menu->Append(TEXT_TOOLTIPS_SETDELAY, wxT("Set &delay\tCtrl-D"));
02e8b87f 474 tooltip_menu->AppendSeparator();
9a83f860
VZ
475 tooltip_menu->Append(TEXT_TOOLTIPS_ENABLE, wxT("&Toggle tooltips\tCtrl-T"),
476 wxT("enable/disable tooltips"), true);
effbd41d 477 tooltip_menu->Check(TEXT_TOOLTIPS_ENABLE, true);
9a83f860 478 menu_bar->Append(tooltip_menu, wxT("&Tooltips"));
02e8b87f
RR
479#endif // wxUSE_TOOLTIPS
480
b6a0d8a2 481#if wxUSE_CLIPBOARD
5b07594a
VZ
482 // notice that we use non default accelerators on purpose here to compare
483 // their behaviour with the built in handling of standard Ctrl/Cmd-C/V
b6a0d8a2 484 wxMenu *menuClipboard = new wxMenu;
9a83f860
VZ
485 menuClipboard->Append(TEXT_CLIPBOARD_COPY, wxT("&Copy\tCtrl-Shift-C"),
486 wxT("Copy the selection to the clipboard"));
487 menuClipboard->Append(TEXT_CLIPBOARD_PASTE, wxT("&Paste\tCtrl-Shift-V"),
488 wxT("Paste from clipboard to the text control"));
78c91815 489 menuClipboard->AppendSeparator();
9a83f860
VZ
490 menuClipboard->AppendCheckItem(TEXT_CLIPBOARD_VETO, wxT("Vet&o\tCtrl-Shift-O"),
491 wxT("Veto all clipboard operations"));
492 menu_bar->Append(menuClipboard, wxT("&Clipboard"));
b6a0d8a2
VZ
493#endif // wxUSE_CLIPBOARD
494
f6bcfd97 495 wxMenu *menuText = new wxMenu;
9a83f860
VZ
496 menuText->Append(TEXT_ADD_SOME, wxT("&Append some text\tCtrl-A"));
497 menuText->Append(TEXT_ADD_FREEZE, wxT("&Append text with freeze/thaw\tShift-Ctrl-A"));
498 menuText->Append(TEXT_ADD_LINE, wxT("Append a new &line\tAlt-Shift-A"));
499 menuText->Append(TEXT_REMOVE, wxT("&Remove first 10 characters\tCtrl-Y"));
500 menuText->Append(TEXT_REPLACE, wxT("&Replace characters 4 to 8 with ABC\tCtrl-R"));
501 menuText->Append(TEXT_SELECT, wxT("&Select characters 4 to 8\tCtrl-I"));
502 menuText->Append(TEXT_SET, wxT("&Set the first text zone value\tCtrl-E"));
503 menuText->Append(TEXT_CHANGE, wxT("&Change the first text zone value\tShift-Ctrl-E"));
cba1148d 504 menuText->AppendSeparator();
9a83f860
VZ
505 menuText->Append(TEXT_MOVE_ENDTEXT, wxT("Move cursor to the end of &text"));
506 menuText->Append(TEXT_MOVE_ENDENTRY, wxT("Move cursor to the end of &entry"));
507 menuText->AppendCheckItem(TEXT_SET_EDITABLE, wxT("Toggle &editable state"));
508 menuText->AppendCheckItem(TEXT_SET_ENABLED, wxT("Toggle e&nabled state"));
effbd41d
WS
509 menuText->Check(TEXT_SET_EDITABLE, true);
510 menuText->Check(TEXT_SET_ENABLED, true);
22670da4 511 menuText->AppendSeparator();
9a83f860
VZ
512 menuText->Append(TEXT_LINE_DOWN, wxT("Scroll text one line down"));
513 menuText->Append(TEXT_LINE_UP, wxT("Scroll text one line up"));
514 menuText->Append(TEXT_PAGE_DOWN, wxT("Scroll text one page down"));
515 menuText->Append(TEXT_PAGE_UP, wxT("Scroll text one page up"));
ae25e5cc 516 menuText->AppendSeparator();
9a83f860
VZ
517 menuText->Append(TEXT_GET_LINE, wxT("Get the text of a line of the tabbed multiline"));
518 menuText->Append(TEXT_GET_LINELENGTH, wxT("Get the length of a line of the tabbed multiline"));
519 menu_bar->Append(menuText, wxT("Te&xt"));
56c4a88b 520
b29903d4 521#if wxUSE_LOG
56c4a88b 522 wxMenu *menuLog = new wxMenu;
9a83f860
VZ
523 menuLog->AppendCheckItem(TEXT_LOG_KEY, wxT("Log &key events"));
524 menuLog->AppendCheckItem(TEXT_LOG_CHAR, wxT("Log &char events"));
525 menuLog->AppendCheckItem(TEXT_LOG_MOUSE, wxT("Log &mouse events"));
526 menuLog->AppendCheckItem(TEXT_LOG_TEXT, wxT("Log &text events"));
527 menuLog->AppendCheckItem(TEXT_LOG_FOCUS, wxT("Log &focus events"));
528 menuLog->AppendCheckItem(TEXT_LOG_CLIP, wxT("Log clip&board events"));
56c4a88b 529 menuLog->AppendSeparator();
9a83f860
VZ
530 menuLog->Append(TEXT_CLEAR, wxT("&Clear the log\tCtrl-L"),
531 wxT("Clear the log window contents"));
94ccc254
VZ
532
533 // select only the interesting events by default
78c91815 534 MyTextCtrl::ms_logClip =
effbd41d 535 MyTextCtrl::ms_logText = true;
b29903d4 536
c9539346
VZ
537 menuLog->Check(TEXT_LOG_KEY, MyTextCtrl::ms_logKey);
538 menuLog->Check(TEXT_LOG_CHAR, MyTextCtrl::ms_logChar);
539 menuLog->Check(TEXT_LOG_TEXT, MyTextCtrl::ms_logText);
540
9a83f860 541 menu_bar->Append(menuLog, wxT("&Log"));
b29903d4 542#endif // wxUSE_LOG
b6a0d8a2 543
02e8b87f
RR
544 frame->SetMenuBar(menu_bar);
545
effbd41d 546 frame->Show(true);
02e8b87f
RR
547
548 SetTopWindow(frame);
549
550 // report success
effbd41d 551 return true;
02e8b87f
RR
552}
553
554//----------------------------------------------------------------------
555// MyTextCtrl
556//----------------------------------------------------------------------
557
558BEGIN_EVENT_TABLE(MyTextCtrl, wxTextCtrl)
559 EVT_KEY_DOWN(MyTextCtrl::OnKeyDown)
560 EVT_KEY_UP(MyTextCtrl::OnKeyUp)
561 EVT_CHAR(MyTextCtrl::OnChar)
d7eee191 562
effbd41d 563 EVT_TEXT(wxID_ANY, MyTextCtrl::OnText)
c5dd5a3d 564 EVT_TEXT_ENTER(wxID_ANY, MyTextCtrl::OnTextEnter)
effbd41d
WS
565 EVT_TEXT_URL(wxID_ANY, MyTextCtrl::OnTextURL)
566 EVT_TEXT_MAXLEN(wxID_ANY, MyTextCtrl::OnTextMaxLen)
78c91815
VZ
567 EVT_TEXT_CUT(wxID_ANY, MyTextCtrl::OnTextCut)
568 EVT_TEXT_COPY(wxID_ANY, MyTextCtrl::OnTextCopy)
569 EVT_TEXT_PASTE(wxID_ANY, MyTextCtrl::OnTextPaste)
d7eee191 570
4aff28fc 571 EVT_MOUSE_EVENTS(MyTextCtrl::OnMouseEvent)
94ccc254
VZ
572
573 EVT_SET_FOCUS(MyTextCtrl::OnSetFocus)
574 EVT_KILL_FOCUS(MyTextCtrl::OnKillFocus)
02e8b87f
RR
575END_EVENT_TABLE()
576
effbd41d
WS
577bool MyTextCtrl::ms_logKey = false;
578bool MyTextCtrl::ms_logChar = false;
579bool MyTextCtrl::ms_logMouse = false;
580bool MyTextCtrl::ms_logText = false;
581bool MyTextCtrl::ms_logFocus = false;
78c91815 582bool MyTextCtrl::ms_logClip = false;
56c4a88b 583
94ccc254 584void MyTextCtrl::LogKeyEvent(const wxChar *name, wxKeyEvent& event) const
02e8b87f
RR
585{
586 wxString key;
b1d4dd7a 587 long keycode = event.GetKeyCode();
02e8b87f
RR
588 {
589 switch ( keycode )
590 {
9a83f860
VZ
591 case WXK_BACK: key = wxT("BACK"); break;
592 case WXK_TAB: key = wxT("TAB"); break;
593 case WXK_RETURN: key = wxT("RETURN"); break;
594 case WXK_ESCAPE: key = wxT("ESCAPE"); break;
595 case WXK_SPACE: key = wxT("SPACE"); break;
596 case WXK_DELETE: key = wxT("DELETE"); break;
597 case WXK_START: key = wxT("START"); break;
598 case WXK_LBUTTON: key = wxT("LBUTTON"); break;
599 case WXK_RBUTTON: key = wxT("RBUTTON"); break;
600 case WXK_CANCEL: key = wxT("CANCEL"); break;
601 case WXK_MBUTTON: key = wxT("MBUTTON"); break;
602 case WXK_CLEAR: key = wxT("CLEAR"); break;
603 case WXK_SHIFT: key = wxT("SHIFT"); break;
604 case WXK_ALT: key = wxT("ALT"); break;
605 case WXK_CONTROL: key = wxT("CONTROL"); break;
606 case WXK_MENU: key = wxT("MENU"); break;
607 case WXK_PAUSE: key = wxT("PAUSE"); break;
608 case WXK_CAPITAL: key = wxT("CAPITAL"); break;
609 case WXK_END: key = wxT("END"); break;
610 case WXK_HOME: key = wxT("HOME"); break;
611 case WXK_LEFT: key = wxT("LEFT"); break;
612 case WXK_UP: key = wxT("UP"); break;
613 case WXK_RIGHT: key = wxT("RIGHT"); break;
614 case WXK_DOWN: key = wxT("DOWN"); break;
615 case WXK_SELECT: key = wxT("SELECT"); break;
616 case WXK_PRINT: key = wxT("PRINT"); break;
617 case WXK_EXECUTE: key = wxT("EXECUTE"); break;
618 case WXK_SNAPSHOT: key = wxT("SNAPSHOT"); break;
619 case WXK_INSERT: key = wxT("INSERT"); break;
620 case WXK_HELP: key = wxT("HELP"); break;
621 case WXK_NUMPAD0: key = wxT("NUMPAD0"); break;
622 case WXK_NUMPAD1: key = wxT("NUMPAD1"); break;
623 case WXK_NUMPAD2: key = wxT("NUMPAD2"); break;
624 case WXK_NUMPAD3: key = wxT("NUMPAD3"); break;
625 case WXK_NUMPAD4: key = wxT("NUMPAD4"); break;
626 case WXK_NUMPAD5: key = wxT("NUMPAD5"); break;
627 case WXK_NUMPAD6: key = wxT("NUMPAD6"); break;
628 case WXK_NUMPAD7: key = wxT("NUMPAD7"); break;
629 case WXK_NUMPAD8: key = wxT("NUMPAD8"); break;
630 case WXK_NUMPAD9: key = wxT("NUMPAD9"); break;
631 case WXK_MULTIPLY: key = wxT("MULTIPLY"); break;
632 case WXK_ADD: key = wxT("ADD"); break;
633 case WXK_SEPARATOR: key = wxT("SEPARATOR"); break;
634 case WXK_SUBTRACT: key = wxT("SUBTRACT"); break;
635 case WXK_DECIMAL: key = wxT("DECIMAL"); break;
636 case WXK_DIVIDE: key = wxT("DIVIDE"); break;
637 case WXK_F1: key = wxT("F1"); break;
638 case WXK_F2: key = wxT("F2"); break;
639 case WXK_F3: key = wxT("F3"); break;
640 case WXK_F4: key = wxT("F4"); break;
641 case WXK_F5: key = wxT("F5"); break;
642 case WXK_F6: key = wxT("F6"); break;
643 case WXK_F7: key = wxT("F7"); break;
644 case WXK_F8: key = wxT("F8"); break;
645 case WXK_F9: key = wxT("F9"); break;
646 case WXK_F10: key = wxT("F10"); break;
647 case WXK_F11: key = wxT("F11"); break;
648 case WXK_F12: key = wxT("F12"); break;
649 case WXK_F13: key = wxT("F13"); break;
650 case WXK_F14: key = wxT("F14"); break;
651 case WXK_F15: key = wxT("F15"); break;
652 case WXK_F16: key = wxT("F16"); break;
653 case WXK_F17: key = wxT("F17"); break;
654 case WXK_F18: key = wxT("F18"); break;
655 case WXK_F19: key = wxT("F19"); break;
656 case WXK_F20: key = wxT("F20"); break;
657 case WXK_F21: key = wxT("F21"); break;
658 case WXK_F22: key = wxT("F22"); break;
659 case WXK_F23: key = wxT("F23"); break;
660 case WXK_F24: key = wxT("F24"); break;
661 case WXK_NUMLOCK: key = wxT("NUMLOCK"); break;
662 case WXK_SCROLL: key = wxT("SCROLL"); break;
663 case WXK_PAGEUP: key = wxT("PAGEUP"); break;
664 case WXK_PAGEDOWN: key = wxT("PAGEDOWN"); break;
665 case WXK_NUMPAD_SPACE: key = wxT("NUMPAD_SPACE"); break;
666 case WXK_NUMPAD_TAB: key = wxT("NUMPAD_TAB"); break;
667 case WXK_NUMPAD_ENTER: key = wxT("NUMPAD_ENTER"); break;
668 case WXK_NUMPAD_F1: key = wxT("NUMPAD_F1"); break;
669 case WXK_NUMPAD_F2: key = wxT("NUMPAD_F2"); break;
670 case WXK_NUMPAD_F3: key = wxT("NUMPAD_F3"); break;
671 case WXK_NUMPAD_F4: key = wxT("NUMPAD_F4"); break;
672 case WXK_NUMPAD_HOME: key = wxT("NUMPAD_HOME"); break;
673 case WXK_NUMPAD_LEFT: key = wxT("NUMPAD_LEFT"); break;
674 case WXK_NUMPAD_UP: key = wxT("NUMPAD_UP"); break;
675 case WXK_NUMPAD_RIGHT: key = wxT("NUMPAD_RIGHT"); break;
676 case WXK_NUMPAD_DOWN: key = wxT("NUMPAD_DOWN"); break;
677 case WXK_NUMPAD_PAGEUP: key = wxT("NUMPAD_PAGEUP"); break;
678 case WXK_NUMPAD_PAGEDOWN: key = wxT("NUMPAD_PAGEDOWN"); break;
679 case WXK_NUMPAD_END: key = wxT("NUMPAD_END"); break;
680 case WXK_NUMPAD_BEGIN: key = wxT("NUMPAD_BEGIN"); break;
681 case WXK_NUMPAD_INSERT: key = wxT("NUMPAD_INSERT"); break;
682 case WXK_NUMPAD_DELETE: key = wxT("NUMPAD_DELETE"); break;
683 case WXK_NUMPAD_EQUAL: key = wxT("NUMPAD_EQUAL"); break;
684 case WXK_NUMPAD_MULTIPLY: key = wxT("NUMPAD_MULTIPLY"); break;
685 case WXK_NUMPAD_ADD: key = wxT("NUMPAD_ADD"); break;
686 case WXK_NUMPAD_SEPARATOR: key = wxT("NUMPAD_SEPARATOR"); break;
687 case WXK_NUMPAD_SUBTRACT: key = wxT("NUMPAD_SUBTRACT"); break;
688 case WXK_NUMPAD_DECIMAL: key = wxT("NUMPAD_DECIMAL"); break;
02e8b87f 689
4afd7529 690 default:
89124b1a
RR
691 {
692 if ( wxIsprint((int)keycode) )
9a83f860 693 key.Printf(wxT("'%c'"), (char)keycode);
1ce58dc6 694 else if ( keycode > 0 && keycode < 27 )
9a83f860 695 key.Printf(_("Ctrl-%c"), wxT('A') + keycode - 1);
89124b1a 696 else
9a83f860 697 key.Printf(wxT("unknown (%ld)"), keycode);
4afd7529 698 }
02e8b87f
RR
699 }
700 }
701
0d9b2c16 702#if wxUSE_UNICODE
9a83f860 703 key += wxString::Format(wxT(" (Unicode: %#04x)"), event.GetUnicodeKey());
0d9b2c16
VZ
704#endif // wxUSE_UNICODE
705
9a83f860 706 wxLogMessage( wxT("%s event: %s (flags = %c%c%c%c)"),
02e8b87f
RR
707 name,
708 key.c_str(),
9a83f860
VZ
709 GetChar( event.ControlDown(), wxT('C') ),
710 GetChar( event.AltDown(), wxT('A') ),
711 GetChar( event.ShiftDown(), wxT('S') ),
712 GetChar( event.MetaDown(), wxT('M') ) );
02e8b87f
RR
713}
714
c57e3339
VZ
715static wxString GetMouseEventDesc(const wxMouseEvent& ev)
716{
717 // click event
718 wxString button;
719 bool dbl, up;
720 if ( ev.LeftDown() || ev.LeftUp() || ev.LeftDClick() )
721 {
9a83f860 722 button = wxT("Left");
c57e3339
VZ
723 dbl = ev.LeftDClick();
724 up = ev.LeftUp();
725 }
726 else if ( ev.MiddleDown() || ev.MiddleUp() || ev.MiddleDClick() )
727 {
9a83f860 728 button = wxT("Middle");
c57e3339
VZ
729 dbl = ev.MiddleDClick();
730 up = ev.MiddleUp();
731 }
732 else if ( ev.RightDown() || ev.RightUp() || ev.RightDClick() )
733 {
9a83f860 734 button = wxT("Right");
c57e3339
VZ
735 dbl = ev.RightDClick();
736 up = ev.RightUp();
737 }
738 else
739 {
9a83f860 740 return wxT("Unknown mouse event");
c57e3339
VZ
741 }
742
9a83f860 743 return wxString::Format(wxT("%s mouse button %s"),
c57e3339 744 button.c_str(),
9a83f860
VZ
745 dbl ? wxT("double clicked")
746 : up ? wxT("released") : wxT("clicked"));
c57e3339
VZ
747}
748
4aff28fc
VZ
749void MyTextCtrl::OnMouseEvent(wxMouseEvent& ev)
750{
56c4a88b
VZ
751 ev.Skip();
752
1ce58dc6 753 if ( !ms_logMouse )
56c4a88b
VZ
754 return;
755
4aff28fc
VZ
756 if ( !ev.Moving() )
757 {
758 wxString msg;
759 if ( ev.Entering() )
760 {
9a83f860 761 msg = wxT("Mouse entered the window");
4aff28fc
VZ
762 }
763 else if ( ev.Leaving() )
764 {
9a83f860 765 msg = wxT("Mouse left the window");
4aff28fc
VZ
766 }
767 else
768 {
c57e3339 769 msg = GetMouseEventDesc(ev);
4aff28fc
VZ
770 }
771
9a83f860 772 msg << wxT(" at (") << ev.GetX() << wxT(", ") << ev.GetY() << wxT(") ");
692c9b86
VZ
773
774 long pos;
775 wxTextCtrlHitTestResult rc = HitTest(ev.GetPosition(), &pos);
776 if ( rc != wxTE_HT_UNKNOWN )
777 {
9a83f860 778 msg << wxT("at position ") << pos << wxT(' ');
692c9b86
VZ
779 }
780
9a83f860
VZ
781 msg << wxT("[Flags: ")
782 << GetChar( ev.LeftIsDown(), wxT('1') )
783 << GetChar( ev.MiddleIsDown(), wxT('2') )
784 << GetChar( ev.RightIsDown(), wxT('3') )
785 << GetChar( ev.ControlDown(), wxT('C') )
786 << GetChar( ev.AltDown(), wxT('A') )
787 << GetChar( ev.ShiftDown(), wxT('S') )
788 << GetChar( ev.MetaDown(), wxT('M') )
789 << wxT(']');
4aff28fc
VZ
790
791 wxLogMessage(msg);
792 }
793 //else: we're not interested in mouse move events
794}
795
94ccc254
VZ
796void MyTextCtrl::OnSetFocus(wxFocusEvent& event)
797{
798 if ( ms_logFocus )
43b2d5e7 799 {
eba33006 800 wxLogMessage( wxT("%p got focus."), this);
43b2d5e7 801 }
94ccc254
VZ
802
803 event.Skip();
804}
805
806void MyTextCtrl::OnKillFocus(wxFocusEvent& event)
807{
808 if ( ms_logFocus )
43b2d5e7 809 {
eba33006 810 wxLogMessage( wxT("%p lost focus"), this);
43b2d5e7 811 }
94ccc254
VZ
812
813 event.Skip();
814}
815
9ca03a57 816void MyTextCtrl::OnText(wxCommandEvent& event)
02e8b87f 817{
1ce58dc6
VZ
818 if ( !ms_logText )
819 return;
820
9ca03a57 821 MyTextCtrl *win = (MyTextCtrl *)event.GetEventObject();
9a83f860
VZ
822 const wxChar *changeVerb = win->IsModified() ? wxT("changed")
823 : wxT("set by program");
ae3dd4a5
VZ
824 const wxChar *data = (const wxChar *)(win->GetClientData());
825 if ( data )
826 {
9a83f860 827 wxLogMessage(wxT("Text %s in control \"%s\""), changeVerb, data);
ae3dd4a5 828 }
f6bcfd97
BP
829 else
830 {
9a83f860 831 wxLogMessage(wxT("Text %s in some control"), changeVerb);
f6bcfd97 832 }
9ca03a57
VZ
833}
834
c5dd5a3d
VZ
835void MyTextCtrl::OnTextEnter(wxCommandEvent& event)
836{
837 if ( !ms_logText )
838 return;
839
840 MyTextCtrl *win = (MyTextCtrl *)event.GetEventObject();
841 const wxChar *data = (const wxChar *)(win->GetClientData());
842 if ( data )
843 {
9a83f860 844 wxLogMessage(wxT("Enter pressed in control '%s'"), data);
c5dd5a3d
VZ
845 }
846 else
847 {
9a83f860 848 wxLogMessage(wxT("Enter pressed in some control"));
c5dd5a3d
VZ
849 }
850}
851
656562d8 852void MyTextCtrl::OnTextMaxLen(wxCommandEvent& WXUNUSED(event))
d7eee191 853{
9a83f860 854 wxLogMessage(wxT("You can't enter more characters into this control."));
d7eee191
VZ
855}
856
78c91815
VZ
857
858void MyTextCtrl::OnTextCut(wxClipboardTextEvent& event)
859{
9a83f860 860 LogClipEvent(wxT("cut to"), event);
78c91815
VZ
861}
862
863void MyTextCtrl::OnTextCopy(wxClipboardTextEvent& event)
864{
9a83f860 865 LogClipEvent(wxT("copied to"), event);
78c91815
VZ
866}
867
868void MyTextCtrl::OnTextPaste(wxClipboardTextEvent& event)
869{
9a83f860 870 LogClipEvent(wxT("pasted from"), event);
78c91815
VZ
871}
872
873void MyTextCtrl::LogClipEvent(const wxChar *what, wxClipboardTextEvent& event)
874{
875 wxFrame *frame = wxDynamicCast(wxGetTopLevelParent(this), wxFrame);
9a83f860 876 wxCHECK_RET( frame, wxT("no parent frame?") );
78c91815
VZ
877
878 const bool veto = frame->GetMenuBar()->IsChecked(TEXT_CLIPBOARD_VETO);
879 if ( !veto )
880 event.Skip();
881
882 if ( ms_logClip )
883 {
9a83f860
VZ
884 wxLogMessage(wxT("Text %s%s the clipboard."),
885 veto ? wxT("not ") : wxT(""), what);
78c91815
VZ
886 }
887}
888
889
c57e3339
VZ
890void MyTextCtrl::OnTextURL(wxTextUrlEvent& event)
891{
892 const wxMouseEvent& ev = event.GetMouseEvent();
893
894 // filter out mouse moves, too many of them
895 if ( ev.Moving() )
896 return;
897
898 long start = event.GetURLStart(),
899 end = event.GetURLEnd();
900
9a83f860 901 wxLogMessage(wxT("Mouse event over URL '%s': %s"),
c57e3339
VZ
902 GetValue().Mid(start, end - start).c_str(),
903 GetMouseEventDesc(ev).c_str());
904}
905
9ca03a57
VZ
906void MyTextCtrl::OnChar(wxKeyEvent& event)
907{
1ce58dc6 908 if ( ms_logChar )
9a83f860 909 LogKeyEvent( wxT("Char"), event);
3017f78d 910
3017f78d 911 event.Skip();
02e8b87f
RR
912}
913
914void MyTextCtrl::OnKeyUp(wxKeyEvent& event)
915{
1ce58dc6 916 if ( ms_logKey )
9a83f860 917 LogKeyEvent( wxT("Key up"), event);
02e8b87f
RR
918
919 event.Skip();
920}
921
922void MyTextCtrl::OnKeyDown(wxKeyEvent& event)
923{
b1d4dd7a 924 switch ( event.GetKeyCode() )
02e8b87f
RR
925 {
926 case WXK_F1:
927 // show current position and text length
928 {
929 long line, column, pos = GetInsertionPoint();
930 PositionToXY(pos, &column, &line);
931
9a83f860 932 wxLogMessage(wxT("Current position: %ld\nCurrent line, column: (%ld, %ld)\nNumber of lines: %ld\nCurrent line length: %ld\nTotal text length: %u (%ld)"),
02e8b87f
RR
933 pos,
934 line, column,
8b1d8f36
VZ
935 (long) GetNumberOfLines(),
936 (long) GetLineLength(line),
d4964163 937 (unsigned int) GetValue().length(),
02e8b87f 938 GetLastPosition());
2b5f62a0
VZ
939
940 long from, to;
941 GetSelection(&from, &to);
942
943 wxString sel = GetStringSelection();
944
9a83f860
VZ
945 wxLogMessage(wxT("Selection: from %ld to %ld."), from, to);
946 wxLogMessage(wxT("Selection = '%s' (len = %u)"),
ce709481
RN
947 sel.c_str(),
948 (unsigned int) sel.length());
b7ca4853
VZ
949
950 const wxString text = GetLineText(line);
9a83f860 951 wxLogMessage(wxT("Current line: \"%s\"; length = %lu"),
b7ca4853 952 text.c_str(), text.length());
02e8b87f
RR
953 }
954 break;
955
956 case WXK_F2:
957 // go to the end
958 SetInsertionPointEnd();
959 break;
960
961 case WXK_F3:
962 // go to position 10
963 SetInsertionPoint(10);
964 break;
4afd7529 965
f152cf5a 966 case WXK_F4:
4afd7529
VZ
967 if (!m_hasCapture)
968 {
f152cf5a 969 wxLogDebug( wxT("Now capturing mouse and events.") );
effbd41d 970 m_hasCapture = true;
4afd7529
VZ
971 CaptureMouse();
972 }
973 else
974 {
f152cf5a 975 wxLogDebug( wxT("Stopped capturing mouse and events.") );
effbd41d 976 m_hasCapture = false;
4afd7529
VZ
977 ReleaseMouse();
978 }
f152cf5a 979 break;
4afd7529
VZ
980
981 case WXK_F5:
982 // insert a blank line
9a83f860 983 WriteText(wxT("\n"));
ae3dd4a5 984 break;
02e8b87f 985
f6bcfd97 986 case WXK_F6:
9a83f860 987 wxLogMessage(wxT("IsModified() before SetValue(): %d"),
2b5f62a0 988 IsModified());
9a83f860
VZ
989 ChangeValue(wxT("ChangeValue() has been called"));
990 wxLogMessage(wxT("IsModified() after SetValue(): %d"),
2b5f62a0 991 IsModified());
f6bcfd97
BP
992 break;
993
994 case WXK_F7:
9a83f860 995 wxLogMessage(wxT("Position 10 should be now visible."));
f6bcfd97
BP
996 ShowPosition(10);
997 break;
18414479 998
80695f83 999 case WXK_F8:
9a83f860 1000 wxLogMessage(wxT("Control has been cleared"));
80695f83
VZ
1001 Clear();
1002 break;
1003
2b5f62a0 1004 case WXK_F9:
9a83f860 1005 WriteText(wxT("WriteText() has been called"));
2b5f62a0 1006 break;
18414479 1007
2b5f62a0 1008 case WXK_F10:
9a83f860 1009 AppendText(wxT("AppendText() has been called"));
2b5f62a0 1010 break;
dabb9b6d
VZ
1011
1012 case WXK_F11:
1013 DiscardEdits();
9a83f860 1014 wxLogMessage(wxT("Control marked as non modified"));
dabb9b6d 1015 break;
0ddea946 1016 }
02e8b87f 1017
1ce58dc6 1018 if ( ms_logKey )
94ccc254 1019 LogKeyEvent( wxT("Key down"), event);
f6bcfd97 1020
02e8b87f
RR
1021 event.Skip();
1022}
1023
1024//----------------------------------------------------------------------
1025// MyPanel
1026//----------------------------------------------------------------------
1027
02e8b87f 1028MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
effbd41d 1029 : wxPanel( frame, wxID_ANY, wxPoint(x, y), wxSize(w, h) )
02e8b87f 1030{
b29903d4 1031#if wxUSE_LOG
9a83f860 1032 m_log = new wxTextCtrl( this, wxID_ANY, wxT("This is the log window.\n"),
30982415 1033 wxPoint(5,260), wxSize(630,100),
d2356abe 1034 wxTE_MULTILINE | wxTE_READONLY);
02e8b87f 1035
d847e69a 1036 m_logOld = wxLog::SetActiveTarget( new wxLogTextCtrl( m_log ) );
b29903d4 1037#endif // wxUSE_LOG
02e8b87f
RR
1038
1039 // single line text controls
1040
9a83f860 1041 m_text = new MyTextCtrl( this, wxID_ANY, wxT("Single line."),
b29903d4 1042 wxDefaultPosition, wxDefaultSize,
f6bcfd97 1043 wxTE_PROCESS_ENTER);
4ed0aceb
VZ
1044 m_text->SetForegroundColour(*wxBLUE);
1045 m_text->SetBackgroundColour(*wxLIGHT_GREY);
9a83f860 1046 (*m_text) << wxT(" Appended.");
02e8b87f 1047 m_text->SetInsertionPoint(0);
9a83f860 1048 m_text->WriteText( wxT("Prepended. ") );
bb69661b 1049
9a83f860 1050 m_password = new MyTextCtrl( this, wxID_ANY, wxT(""),
422d0ff0 1051 wxPoint(10,50), wxSize(140,wxDefaultCoord), wxTE_PASSWORD );
bb69661b 1052
9a83f860 1053 m_readonly = new MyTextCtrl( this, wxID_ANY, wxT("Read only"),
422d0ff0 1054 wxPoint(10,90), wxSize(140,wxDefaultCoord), wxTE_READONLY );
bb69661b 1055
9a83f860 1056 m_limited = new MyTextCtrl(this, wxID_ANY, wxT("Max 8 ch"),
422d0ff0 1057 wxPoint(10, 130), wxSize(140, wxDefaultCoord));
d7eee191
VZ
1058 m_limited->SetMaxLength(8);
1059
02e8b87f
RR
1060 // multi line text controls
1061
9a83f860 1062 m_horizontal = new MyTextCtrl( this, wxID_ANY, wxT("Multiline text control with a horizontal scrollbar.\n"),
b7f5f3cc 1063 wxPoint(10,170), wxSize(140,70), wxTE_MULTILINE | wxHSCROLL);
f6bcfd97
BP
1064
1065 // a little hack to use the command line argument for encoding testing
1066 if ( wxTheApp->argc == 2 )
1067 {
88fb99a2 1068 switch ( (wxChar)wxTheApp->argv[1][0] )
f6bcfd97
BP
1069 {
1070 case '2':
1071 m_horizontal->SetFont(wxFont(18, wxSWISS, wxNORMAL, wxNORMAL,
9a83f860 1072 false, wxT(""),
f6bcfd97 1073 wxFONTENCODING_ISO8859_2));
9a83f860 1074 m_horizontal->AppendText(wxT("\256lu\273ou\350k\375 k\371\362 zb\354sile \350e\271tina \253\273"));
f6bcfd97
BP
1075 break;
1076
aac7e7fe
VZ
1077 case '1':
1078 m_horizontal->SetFont(wxFont(18, wxSWISS, wxNORMAL, wxNORMAL,
9a83f860 1079 false, wxT(""),
aac7e7fe 1080 wxFONTENCODING_CP1251));
9a83f860 1081 m_horizontal->AppendText(wxT("\317\360\350\342\345\362!"));
aac7e7fe
VZ
1082 break;
1083
1084 case '8':
f6bcfd97 1085 m_horizontal->SetFont(wxFont(18, wxSWISS, wxNORMAL, wxNORMAL,
9a83f860 1086 false, wxT(""),
aac7e7fe 1087 wxFONTENCODING_CP1251));
60f52320 1088#if wxUSE_UNICODE
b7f5f3cc 1089 m_horizontal->AppendText(L"\x0412\x0430\x0434\x0438\x043c \x0426");
60f52320 1090#else
548bbe14 1091 m_horizontal->AppendText("\313\301\326\305\324\323\321 \325\304\301\336\316\331\315");
60f52320 1092#endif
f6bcfd97
BP
1093 }
1094 }
1095 else
1096 {
9a83f860 1097 m_horizontal->AppendText(wxT("Text in default encoding"));
f6bcfd97 1098 }
bb69661b 1099
6ab069f2 1100 m_multitext = new MyTextCtrl( this, wxID_ANY,
9a83f860 1101 wxT("Multi line without vertical scrollbar."),
6ab069f2 1102 wxPoint(180,10), wxSize(200,70), wxTE_MULTILINE | wxTE_NO_VSCROLL );
f6bcfd97 1103 m_multitext->SetFont(*wxITALIC_FONT);
9a83f860 1104 (*m_multitext) << wxT(" Appended.");
02e8b87f 1105 m_multitext->SetInsertionPoint(0);
9a83f860 1106 m_multitext->WriteText( wxT("Prepended. ") );
86028025 1107 m_multitext->SetForegroundColour(*wxYELLOW);
f6bcfd97 1108 m_multitext->SetBackgroundColour(*wxLIGHT_GREY);
bb69661b 1109
02e8b87f 1110#if wxUSE_TOOLTIPS
9a83f860 1111 m_multitext->SetToolTip(wxT("Press Fn function keys here"));
02e8b87f
RR
1112#endif
1113
9a83f860 1114 m_tab = new MyTextCtrl( this, 100, wxT("Multiline, allow <TAB> processing."),
5a22377e 1115 wxPoint(180,90), wxSize(200,70), wxTE_MULTILINE | wxTE_PROCESS_TAB );
9a83f860 1116 m_tab->SetClientData((void *)wxT("tab"));
02e8b87f 1117
9a83f860 1118 m_enter = new MyTextCtrl( this, 100, wxT("Multiline, allow <ENTER> processing."),
5a22377e 1119 wxPoint(180,170), wxSize(200,70), wxTE_MULTILINE);
9a83f860
VZ
1120 m_enter->SetClientData((void *)wxT("enter"));
1121
1122 m_textrich = new MyTextCtrl(this, wxID_ANY, wxT("Allows more than 30Kb of text\n")
1123 wxT("(even under broken Win9x)\n")
1124 wxT("and a very very very very very ")
1125 wxT("very very very long line to test ")
1126 wxT("wxHSCROLL style\n")
1127 wxT("\nAnd here is a link in quotation marks to ")
1128 wxT("test wxTE_AUTO_URL: \"http://www.wxwidgets.org\""),
5a22377e 1129 wxPoint(450, 10), wxSize(200, 230),
22095a6e 1130 wxTE_RICH | wxTE_MULTILINE | wxTE_AUTO_URL);
4bc1afd5
VZ
1131 m_textrich->SetStyle(0, 10, *wxRED);
1132 m_textrich->SetStyle(10, 20, *wxBLUE);
1133 m_textrich->SetStyle(30, 40,
1134 wxTextAttr(*wxGREEN, wxNullColour, *wxITALIC_FONT));
17665a2b 1135 m_textrich->SetDefaultStyle(wxTextAttr());
9a83f860
VZ
1136 m_textrich->AppendText(wxT("\n\nFirst 10 characters should be in red\n"));
1137 m_textrich->AppendText(wxT("Next 10 characters should be in blue\n"));
1138 m_textrich->AppendText(wxT("Next 10 characters should be normal\n"));
1139 m_textrich->AppendText(wxT("And the next 10 characters should be green and italic\n"));
17665a2b 1140 m_textrich->SetDefaultStyle(wxTextAttr(*wxCYAN, *wxBLUE));
9a83f860 1141 m_textrich->AppendText(wxT("This text should be cyan on blue\n"));
eda40bfc 1142 m_textrich->SetDefaultStyle(wxTextAttr(*wxBLUE, *wxWHITE));
9a83f860
VZ
1143 m_textrich->AppendText(wxT("And this should be in blue and the text you ")
1144 wxT("type should be in blue as well"));
b29903d4 1145
c9539346
VZ
1146
1147 // lay out the controls
b29903d4 1148 wxBoxSizer *column1 = new wxBoxSizer(wxVERTICAL);
c9539346
VZ
1149 column1->Add( m_text, 0, wxALL | wxEXPAND, 10 );
1150 column1->Add( m_password, 0, wxALL | wxEXPAND, 10 );
1151 column1->Add( m_readonly, 0, wxALL | wxEXPAND, 10 );
1152 column1->Add( m_limited, 0, wxALL | wxEXPAND, 10 );
b29903d4
WS
1153 column1->Add( m_horizontal, 1, wxALL | wxEXPAND, 10 );
1154
1155 wxBoxSizer *column2 = new wxBoxSizer(wxVERTICAL);
1156 column2->Add( m_multitext, 1, wxALL | wxEXPAND, 10 );
1157 column2->Add( m_tab, 1, wxALL | wxEXPAND, 10 );
1158 column2->Add( m_enter, 1, wxALL | wxEXPAND, 10 );
1159
b29903d4
WS
1160 wxBoxSizer *row1 = new wxBoxSizer(wxHORIZONTAL);
1161 row1->Add( column1, 0, wxALL | wxEXPAND, 10 );
1162 row1->Add( column2, 1, wxALL | wxEXPAND, 10 );
c9539346 1163 row1->Add( m_textrich, 1, wxALL | wxEXPAND, 10 );
b29903d4
WS
1164
1165 wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
1166 topSizer->Add( row1, 2, wxALL | wxEXPAND, 10 );
1167
1168#if wxUSE_LOG
c9539346 1169 topSizer->Add( m_log, 1, wxALL | wxEXPAND, 10 );
b29903d4
WS
1170#endif
1171
b29903d4 1172 SetSizer(topSizer);
02e8b87f
RR
1173}
1174
5b07594a 1175wxTextCtrl *MyPanel::GetFocusedText() const
cba1148d
VZ
1176{
1177 wxWindow *win = FindFocus();
1178
1179 wxTextCtrl *text = win ? wxDynamicCast(win, wxTextCtrl) : NULL;
5b07594a 1180 return text ? text : m_multitext;
cba1148d
VZ
1181}
1182
b6a0d8a2
VZ
1183#if wxUSE_CLIPBOARD
1184void MyPanel::DoPasteFromClipboard()
02e8b87f 1185{
7e2c43b8
RR
1186 // On X11, we want to get the data from the primary selection instead
1187 // of the normal clipboard (which isn't normal under X11 at all). This
1188 // call has no effect under MSW.
1189 wxTheClipboard->UsePrimarySelection();
1190
02e8b87f
RR
1191 if (!wxTheClipboard->Open())
1192 {
b29903d4 1193#if wxUSE_LOG
9a83f860 1194 *m_log << wxT("Error opening the clipboard.\n");
b29903d4 1195#endif // wxUSE_LOG
02e8b87f
RR
1196 return;
1197 }
1198 else
1199 {
b29903d4 1200#if wxUSE_LOG
9a83f860 1201 *m_log << wxT("Successfully opened the clipboard.\n");
b29903d4 1202#endif // wxUSE_LOG
02e8b87f
RR
1203 }
1204
1205 wxTextDataObject data;
1206
1207 if (wxTheClipboard->IsSupported( data.GetFormat() ))
1208 {
b29903d4 1209#if wxUSE_LOG
9a83f860 1210 *m_log << wxT("Clipboard supports requested format.\n");
b29903d4 1211#endif // wxUSE_LOG
02e8b87f 1212
11e1c70d 1213 if (wxTheClipboard->GetData( data ))
02e8b87f 1214 {
b29903d4 1215#if wxUSE_LOG
9a83f860 1216 *m_log << wxT("Successfully retrieved data from the clipboard.\n");
b29903d4 1217#endif // wxUSE_LOG
5b07594a 1218 GetFocusedText()->AppendText(data.GetText());
02e8b87f
RR
1219 }
1220 else
1221 {
b29903d4 1222#if wxUSE_LOG
9a83f860 1223 *m_log << wxT("Error getting data from the clipboard.\n");
b29903d4 1224#endif // wxUSE_LOG
02e8b87f
RR
1225 }
1226 }
1227 else
1228 {
b29903d4 1229#if wxUSE_LOG
9a83f860 1230 *m_log << wxT("Clipboard doesn't support requested format.\n");
b29903d4 1231#endif // wxUSE_LOG
02e8b87f
RR
1232 }
1233
1234 wxTheClipboard->Close();
1235
b29903d4 1236#if wxUSE_LOG
9a83f860 1237 *m_log << wxT("Closed the clipboard.\n");
b29903d4 1238#endif // wxUSE_LOG
02e8b87f
RR
1239}
1240
b6a0d8a2 1241void MyPanel::DoCopyToClipboard()
02e8b87f 1242{
eff869aa
RR
1243 // On X11, we want to get the data from the primary selection instead
1244 // of the normal clipboard (which isn't normal under X11 at all). This
1245 // call has no effect under MSW.
1246 wxTheClipboard->UsePrimarySelection();
1247
5b07594a 1248 wxString text( GetFocusedText()->GetStringSelection() );
02e8b87f
RR
1249
1250 if (text.IsEmpty())
1251 {
b29903d4 1252#if wxUSE_LOG
9a83f860 1253 *m_log << wxT("No text to copy.\n");
b29903d4 1254#endif // wxUSE_LOG
02e8b87f
RR
1255
1256 return;
1257 }
1258
1259 if (!wxTheClipboard->Open())
1260 {
b29903d4 1261#if wxUSE_LOG
9a83f860 1262 *m_log << wxT("Error opening the clipboard.\n");
b29903d4 1263#endif // wxUSE_LOG
02e8b87f
RR
1264
1265 return;
1266 }
1267 else
1268 {
b29903d4 1269#if wxUSE_LOG
9a83f860 1270 *m_log << wxT("Successfully opened the clipboard.\n");
b29903d4 1271#endif // wxUSE_LOG
02e8b87f
RR
1272 }
1273
1274 wxTextDataObject *data = new wxTextDataObject( text );
1275
1276 if (!wxTheClipboard->SetData( data ))
1277 {
b29903d4 1278#if wxUSE_LOG
9a83f860 1279 *m_log << wxT("Error while copying to the clipboard.\n");
b29903d4 1280#endif // wxUSE_LOG
02e8b87f
RR
1281 }
1282 else
1283 {
b29903d4 1284#if wxUSE_LOG
9a83f860 1285 *m_log << wxT("Successfully copied data to the clipboard.\n");
b29903d4 1286#endif // wxUSE_LOG
02e8b87f
RR
1287 }
1288
1289 wxTheClipboard->Close();
1290
b29903d4 1291#if wxUSE_LOG
9a83f860 1292 *m_log << wxT("Closed the clipboard.\n");
b29903d4 1293#endif // wxUSE_LOG
02e8b87f
RR
1294}
1295
b6a0d8a2
VZ
1296#endif // wxUSE_CLIPBOARD
1297
1298void MyPanel::DoMoveToEndOfText()
02e8b87f
RR
1299{
1300 m_multitext->SetInsertionPointEnd();
1301 m_multitext->SetFocus();
1302}
1303
b6a0d8a2 1304void MyPanel::DoMoveToEndOfEntry()
02e8b87f
RR
1305{
1306 m_text->SetInsertionPointEnd();
1307 m_text->SetFocus();
1308}
1309
cba1148d
VZ
1310void MyPanel::DoRemoveText()
1311{
5b07594a 1312 GetFocusedText()->Remove(0, 10);
cba1148d
VZ
1313}
1314
cdd732de
VZ
1315void MyPanel::DoReplaceText()
1316{
9a83f860 1317 GetFocusedText()->Replace(3, 8, wxT("ABC"));
cdd732de
VZ
1318}
1319
29676ca0
JS
1320void MyPanel::DoSelectText()
1321{
5b07594a 1322 GetFocusedText()->SetSelection(3, 8);
29676ca0
JS
1323}
1324
02e8b87f
RR
1325//----------------------------------------------------------------------
1326// MyFrame
1327//----------------------------------------------------------------------
1328
1329BEGIN_EVENT_TABLE(MyFrame, wxFrame)
b6a0d8a2
VZ
1330 EVT_MENU(TEXT_QUIT, MyFrame::OnQuit)
1331 EVT_MENU(TEXT_ABOUT, MyFrame::OnAbout)
0ddea946 1332 EVT_MENU(TEXT_SAVE, MyFrame::OnFileSave)
b6a0d8a2 1333 EVT_MENU(TEXT_LOAD, MyFrame::OnFileLoad)
e00a5d3c 1334 EVT_MENU(TEXT_RICH_TEXT_TEST, MyFrame::OnRichTextTest)
56c4a88b
VZ
1335
1336 EVT_MENU(TEXT_LOG_KEY, MyFrame::OnLogKey)
1ce58dc6
VZ
1337 EVT_MENU(TEXT_LOG_CHAR, MyFrame::OnLogChar)
1338 EVT_MENU(TEXT_LOG_MOUSE,MyFrame::OnLogMouse)
1339 EVT_MENU(TEXT_LOG_TEXT, MyFrame::OnLogText)
94ccc254 1340 EVT_MENU(TEXT_LOG_FOCUS,MyFrame::OnLogFocus)
78c91815 1341 EVT_MENU(TEXT_LOG_CLIP, MyFrame::OnLogClip)
b29903d4 1342#if wxUSE_LOG
60f52320 1343 EVT_MENU(TEXT_CLEAR, MyFrame::OnLogClear)
b29903d4 1344#endif // wxUSE_LOG
b6a0d8a2 1345
02e8b87f 1346#if wxUSE_TOOLTIPS
b6a0d8a2
VZ
1347 EVT_MENU(TEXT_TOOLTIPS_SETDELAY, MyFrame::OnSetTooltipDelay)
1348 EVT_MENU(TEXT_TOOLTIPS_ENABLE, MyFrame::OnToggleTooltips)
02e8b87f 1349#endif // wxUSE_TOOLTIPS
b6a0d8a2 1350
ee31c392 1351#if wxUSE_CLIPBOARD
b6a0d8a2
VZ
1352 EVT_MENU(TEXT_CLIPBOARD_PASTE, MyFrame::OnPasteFromClipboard)
1353 EVT_MENU(TEXT_CLIPBOARD_COPY, MyFrame::OnCopyToClipboard)
5b07594a
VZ
1354
1355 EVT_UPDATE_UI(TEXT_CLIPBOARD_PASTE, MyFrame::OnUpdatePasteFromClipboard)
1356 EVT_UPDATE_UI(TEXT_CLIPBOARD_COPY, MyFrame::OnUpdateCopyToClipboard)
ee31c392
VZ
1357#endif // wxUSE_CLIPBOARD
1358
cba1148d 1359 EVT_MENU(TEXT_REMOVE, MyFrame::OnRemoveText)
cdd732de 1360 EVT_MENU(TEXT_REPLACE, MyFrame::OnReplaceText)
29676ca0 1361 EVT_MENU(TEXT_SELECT, MyFrame::OnSelectText)
eff00523
VZ
1362 EVT_MENU(TEXT_ADD_SOME, MyFrame::OnAddText)
1363 EVT_MENU(TEXT_ADD_FREEZE, MyFrame::OnAddTextFreeze)
be83461c 1364 EVT_MENU(TEXT_ADD_LINE, MyFrame::OnAddTextLine)
b6a0d8a2
VZ
1365 EVT_MENU(TEXT_MOVE_ENDTEXT, MyFrame::OnMoveToEndOfText)
1366 EVT_MENU(TEXT_MOVE_ENDENTRY, MyFrame::OnMoveToEndOfEntry)
1367
f6bcfd97
BP
1368 EVT_MENU(TEXT_SET_EDITABLE, MyFrame::OnSetEditable)
1369 EVT_MENU(TEXT_SET_ENABLED, MyFrame::OnSetEnabled)
1370
22670da4
VZ
1371 EVT_MENU(TEXT_LINE_DOWN, MyFrame::OnScrollLineDown)
1372 EVT_MENU(TEXT_LINE_UP, MyFrame::OnScrollLineUp)
1373 EVT_MENU(TEXT_PAGE_DOWN, MyFrame::OnScrollPageDown)
1374 EVT_MENU(TEXT_PAGE_UP, MyFrame::OnScrollPageUp)
1375
7ddc9343
VZ
1376 EVT_MENU(TEXT_GET_LINE, MyFrame::OnGetLine)
1377 EVT_MENU(TEXT_GET_LINELENGTH, MyFrame::OnGetLineLength)
ae25e5cc 1378
60f52320 1379 EVT_MENU(TEXT_SET, MyFrame::OnSetText)
7ddc9343 1380 EVT_MENU(TEXT_CHANGE, MyFrame::OnChangeText)
60f52320 1381
b6a0d8a2 1382 EVT_IDLE(MyFrame::OnIdle)
02e8b87f
RR
1383END_EVENT_TABLE()
1384
ab1ca7b3 1385MyFrame::MyFrame(wxFrame *frame, const wxChar *title, int x, int y, int w, int h)
effbd41d 1386 : wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h) )
02e8b87f 1387{
41f02b9a
FM
1388 SetIcon(wxICON(sample));
1389
8520f137 1390#if wxUSE_STATUSBAR
02e8b87f 1391 CreateStatusBar(2);
8520f137 1392#endif // wxUSE_STATUSBAR
02e8b87f 1393
b6a0d8a2 1394 m_panel = new MyPanel( this, 10, 10, 300, 100 );
02e8b87f
RR
1395}
1396
1397void MyFrame::OnQuit (wxCommandEvent& WXUNUSED(event) )
1398{
effbd41d 1399 Close(true);
02e8b87f
RR
1400}
1401
1402void MyFrame::OnAbout( wxCommandEvent& WXUNUSED(event) )
1403{
1404 wxBeginBusyCursor();
1405
b6a0d8a2 1406 wxMessageDialog dialog(this,
9a83f860
VZ
1407 wxT("This is a text control sample. It demonstrates the many different\n")
1408 wxT("text control styles, the use of the clipboard, setting and handling\n")
1409 wxT("tooltips and intercepting key and char events.\n")
1410 wxT("\n")
1411 wxT("Copyright (c) 1999, Robert Roebling, Julian Smart, Vadim Zeitlin"),
1412 wxT("About wxTextCtrl Sample"),
b6a0d8a2
VZ
1413 wxOK | wxICON_INFORMATION);
1414
02e8b87f
RR
1415 dialog.ShowModal();
1416
1417 wxEndBusyCursor();
1418}
1419
1420#if wxUSE_TOOLTIPS
656562d8
VZ
1421
1422void MyFrame::OnSetTooltipDelay(wxCommandEvent& WXUNUSED(event))
02e8b87f
RR
1423{
1424 static long s_delay = 5000;
1425
1426 wxString delay;
9a83f860 1427 delay.Printf( wxT("%ld"), s_delay);
02e8b87f 1428
9a83f860
VZ
1429 delay = wxGetTextFromUser(wxT("Enter delay (in milliseconds)"),
1430 wxT("Set tooltip delay"),
bb69661b
VZ
1431 delay,
1432 this);
02e8b87f
RR
1433 if ( !delay )
1434 return; // cancelled
1435
9a83f860 1436 wxSscanf(delay, wxT("%ld"), &s_delay);
02e8b87f
RR
1437
1438 wxToolTip::SetDelay(s_delay);
1439
9a83f860 1440 wxLogStatus(this, wxT("Tooltip delay set to %ld milliseconds"), s_delay);
02e8b87f
RR
1441}
1442
656562d8 1443void MyFrame::OnToggleTooltips(wxCommandEvent& WXUNUSED(event))
02e8b87f 1444{
effbd41d 1445 static bool s_enabled = true;
02e8b87f
RR
1446
1447 s_enabled = !s_enabled;
1448
1449 wxToolTip::Enable(s_enabled);
1450
9a83f860 1451 wxLogStatus(this, wxT("Tooltips %sabled"), s_enabled ? wxT("en") : wxT("dis") );
02e8b87f
RR
1452}
1453#endif // tooltips
1454
b29903d4 1455#if wxUSE_LOG
e66ad5c6
VZ
1456void MyFrame::OnLogClear(wxCommandEvent& WXUNUSED(event))
1457{
1458 m_panel->m_log->Clear();
1459}
b29903d4 1460#endif // wxUSE_LOG
e66ad5c6 1461
f6bcfd97
BP
1462void MyFrame::OnSetEditable(wxCommandEvent& WXUNUSED(event))
1463{
effbd41d 1464 static bool s_editable = true;
f6bcfd97
BP
1465
1466 s_editable = !s_editable;
1467 m_panel->m_text->SetEditable(s_editable);
1468 m_panel->m_password->SetEditable(s_editable);
1469 m_panel->m_multitext->SetEditable(s_editable);
1470 m_panel->m_textrich->SetEditable(s_editable);
1471}
1472
1473void MyFrame::OnSetEnabled(wxCommandEvent& WXUNUSED(event))
1474{
1475 bool enabled = m_panel->m_text->IsEnabled();
1476 enabled = !enabled;
1477
1478 m_panel->m_text->Enable(enabled);
1479 m_panel->m_password->Enable(enabled);
1480 m_panel->m_multitext->Enable(enabled);
1481 m_panel->m_readonly->Enable(enabled);
d7eee191 1482 m_panel->m_limited->Enable(enabled);
f6bcfd97
BP
1483 m_panel->m_textrich->Enable(enabled);
1484}
1485
656562d8 1486void MyFrame::OnFileSave(wxCommandEvent& WXUNUSED(event))
0ddea946 1487{
9a83f860 1488 if ( m_panel->m_textrich->SaveFile(wxT("dummy.txt")) )
0ddea946
VZ
1489 {
1490#if wxUSE_FILE
1491 // verify that the fil length is correct (it wasn't under Win95)
4693b20c 1492 wxFile file(wxT("dummy.txt"));
aafbc345 1493 wxLogStatus(this,
9a83f860 1494 wxT("Successfully saved file (text len = %lu, file size = %ld)"),
aafbc345 1495 (unsigned long)m_panel->m_textrich->GetValue().length(),
2b5f62a0 1496 (long) file.Length());
0ddea946
VZ
1497#endif
1498 }
1499 else
9a83f860 1500 wxLogStatus(this, wxT("Couldn't save the file"));
0ddea946
VZ
1501}
1502
656562d8 1503void MyFrame::OnFileLoad(wxCommandEvent& WXUNUSED(event))
b6a0d8a2 1504{
9a83f860 1505 if ( m_panel->m_textrich->LoadFile(wxT("dummy.txt")) )
43b2d5e7 1506 {
9a83f860 1507 wxLogStatus(this, wxT("Successfully loaded file"));
43b2d5e7 1508 }
5e3dad49 1509 else
43b2d5e7 1510 {
9a83f860 1511 wxLogStatus(this, wxT("Couldn't load the file"));
43b2d5e7 1512 }
b6a0d8a2
VZ
1513}
1514
656562d8 1515void MyFrame::OnRichTextTest(wxCommandEvent& WXUNUSED(event))
e00a5d3c 1516{
9a83f860 1517 RichTextFrame* frame = new RichTextFrame(this, wxT("Rich Text Editor"));
effbd41d 1518 frame->Show(true);
e00a5d3c
JS
1519}
1520
02e8b87f
RR
1521void MyFrame::OnIdle( wxIdleEvent& event )
1522{
1523 // track the window which has the focus in the status bar
1524 static wxWindow *s_windowFocus = (wxWindow *)NULL;
1525 wxWindow *focus = wxWindow::FindFocus();
1526 if ( focus && (focus != s_windowFocus) )
1527 {
1528 s_windowFocus = focus;
1529
1530 wxString msg;
1531 msg.Printf(
1532#ifdef __WXMSW__
9a83f860 1533 wxT("Focus: wxWindow = %p, HWND = %p"),
02e8b87f 1534#else
9a83f860 1535 wxT("Focus: wxWindow = %p"),
02e8b87f
RR
1536#endif
1537 s_windowFocus
1538#ifdef __WXMSW__
647d7ce9 1539 , s_windowFocus->GetHWND()
02e8b87f
RR
1540#endif
1541 );
1542
8520f137 1543#if wxUSE_STATUSBAR
02e8b87f 1544 SetStatusText(msg);
8520f137 1545#endif // wxUSE_STATUSBAR
02e8b87f
RR
1546 }
1547 event.Skip();
1548}
e00a5d3c
JS
1549
1550/*
1551 * RichTextFrame is used to demonstrate rich text behaviour
1552 */
1553
1554enum
1555{
1556 RICHTEXT_CLOSE = 1000,
1557 RICHTEXT_LEFT_ALIGN,
1558 RICHTEXT_RIGHT_ALIGN,
1559 RICHTEXT_CENTRE,
1560 RICHTEXT_JUSTIFY,
1561 RICHTEXT_CHANGE_FONT,
1562 RICHTEXT_CHANGE_TEXT_COLOUR,
1563 RICHTEXT_CHANGE_BACKGROUND_COLOUR,
1564 RICHTEXT_LEFT_INDENT,
7fb3f3c4
MR
1565 RICHTEXT_RIGHT_INDENT,
1566 RICHTEXT_TAB_STOPS
e00a5d3c
JS
1567};
1568
1569BEGIN_EVENT_TABLE(RichTextFrame, wxFrame)
80185c6c 1570 EVT_IDLE(RichTextFrame::OnIdle)
e00a5d3c
JS
1571 EVT_MENU(RICHTEXT_CLOSE, RichTextFrame::OnClose)
1572 EVT_MENU(RICHTEXT_LEFT_ALIGN, RichTextFrame::OnLeftAlign)
1573 EVT_MENU(RICHTEXT_RIGHT_ALIGN, RichTextFrame::OnRightAlign)
1574 EVT_MENU(RICHTEXT_CENTRE, RichTextFrame::OnCentre)
1575 EVT_MENU(RICHTEXT_JUSTIFY, RichTextFrame::OnJustify)
1576 EVT_MENU(RICHTEXT_CHANGE_FONT, RichTextFrame::OnChangeFont)
1577 EVT_MENU(RICHTEXT_CHANGE_TEXT_COLOUR, RichTextFrame::OnChangeTextColour)
1578 EVT_MENU(RICHTEXT_CHANGE_BACKGROUND_COLOUR, RichTextFrame::OnChangeBackgroundColour)
1579 EVT_MENU(RICHTEXT_LEFT_INDENT, RichTextFrame::OnLeftIndent)
1580 EVT_MENU(RICHTEXT_RIGHT_INDENT, RichTextFrame::OnRightIndent)
7fb3f3c4 1581 EVT_MENU(RICHTEXT_TAB_STOPS, RichTextFrame::OnTabStops)
e00a5d3c
JS
1582END_EVENT_TABLE()
1583
1584RichTextFrame::RichTextFrame(wxWindow* parent, const wxString& title):
effbd41d 1585 wxFrame(parent, wxID_ANY, title, wxDefaultPosition, wxSize(300, 400))
e00a5d3c 1586{
80185c6c 1587 m_currentPosition = -1;
effbd41d 1588 m_textCtrl = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition,
e00a5d3c
JS
1589 wxDefaultSize, wxTE_MULTILINE|wxTE_RICH2);
1590
1591 wxString value;
1592 int i;
1593 for (i = 0; i < 10; i++)
1594 {
1595 int j;
1596 for (j = 0; j < 10; j++)
1597 {
1598 value << wxT("Hello, welcome to a very simple rich text editor. You can set some character and paragraph styles from the Edit menu. ");
1599 }
1600 value << wxT("\n\n");
1601 }
1602 m_textCtrl->SetValue(value);
1603
1604 wxMenuBar* menuBar = new wxMenuBar;
1605 wxMenu* fileMenu = new wxMenu;
1606 fileMenu->Append(RICHTEXT_CLOSE, _("Close\tCtrl+W"));
1607 menuBar->Append(fileMenu, _("File"));
1608
1609 wxMenu* editMenu = new wxMenu;
1610 editMenu->Append(RICHTEXT_LEFT_ALIGN, _("Left Align"));
1611 editMenu->Append(RICHTEXT_RIGHT_ALIGN, _("Right Align"));
1612 editMenu->Append(RICHTEXT_CENTRE, _("Centre"));
1613 editMenu->Append(RICHTEXT_JUSTIFY, _("Justify"));
1614 editMenu->AppendSeparator();
1615 editMenu->Append(RICHTEXT_CHANGE_FONT, _("Change Font"));
1616 editMenu->Append(RICHTEXT_CHANGE_TEXT_COLOUR, _("Change Text Colour"));
1617 editMenu->Append(RICHTEXT_CHANGE_BACKGROUND_COLOUR, _("Change Background Colour"));
1618 editMenu->AppendSeparator();
1619 editMenu->Append(RICHTEXT_LEFT_INDENT, _("Left Indent"));
7fb3f3c4
MR
1620 editMenu->Append(RICHTEXT_RIGHT_INDENT, _("Right Indent"));
1621 editMenu->Append(RICHTEXT_TAB_STOPS, _("Tab Stops"));
e00a5d3c
JS
1622 menuBar->Append(editMenu, _("Edit"));
1623
1624 SetMenuBar(menuBar);
8520f137 1625#if wxUSE_STATUSBAR
80185c6c 1626 CreateStatusBar();
8520f137 1627#endif // wxUSE_STATUSBAR
e00a5d3c
JS
1628}
1629
1630// Event handlers
1631
656562d8 1632void RichTextFrame::OnClose(wxCommandEvent& WXUNUSED(event))
e00a5d3c 1633{
effbd41d 1634 Close(true);
e00a5d3c
JS
1635}
1636
656562d8 1637void RichTextFrame::OnLeftAlign(wxCommandEvent& WXUNUSED(event))
e00a5d3c
JS
1638{
1639 wxTextAttr attr;
1640 attr.SetAlignment(wxTEXT_ALIGNMENT_LEFT);
1641
1642 long start, end;
1643 m_textCtrl->GetSelection(& start, & end);
1644 m_textCtrl->SetStyle(start, end, attr);
80185c6c
JS
1645
1646 m_currentPosition = -1;
e00a5d3c
JS
1647}
1648
656562d8 1649void RichTextFrame::OnRightAlign(wxCommandEvent& WXUNUSED(event))
e00a5d3c
JS
1650{
1651 wxTextAttr attr;
1652 attr.SetAlignment(wxTEXT_ALIGNMENT_RIGHT);
1653
1654 long start, end;
1655 m_textCtrl->GetSelection(& start, & end);
1656 m_textCtrl->SetStyle(start, end, attr);
80185c6c
JS
1657
1658 m_currentPosition = -1;
e00a5d3c
JS
1659}
1660
656562d8 1661void RichTextFrame::OnJustify(wxCommandEvent& WXUNUSED(event))
e00a5d3c
JS
1662{
1663 wxTextAttr attr;
1664 attr.SetAlignment(wxTEXT_ALIGNMENT_JUSTIFIED);
1665
1666 long start, end;
1667 m_textCtrl->GetSelection(& start, & end);
1668 m_textCtrl->SetStyle(start, end, attr);
80185c6c
JS
1669
1670 m_currentPosition = -1;
e00a5d3c
JS
1671}
1672
656562d8 1673void RichTextFrame::OnCentre(wxCommandEvent& WXUNUSED(event))
e00a5d3c
JS
1674{
1675 wxTextAttr attr;
1676 attr.SetAlignment(wxTEXT_ALIGNMENT_CENTRE);
1677
1678 long start, end;
1679 m_textCtrl->GetSelection(& start, & end);
1680 m_textCtrl->SetStyle(start, end, attr);
80185c6c
JS
1681
1682 m_currentPosition = -1;
e00a5d3c
JS
1683}
1684
656562d8 1685void RichTextFrame::OnChangeFont(wxCommandEvent& WXUNUSED(event))
e00a5d3c
JS
1686{
1687 wxFontData data;
1688
1689 wxFontDialog dialog(this, data);
1690
1691 if (dialog.ShowModal() == wxID_OK)
1692 {
1693 wxFontData retData = dialog.GetFontData();
1694 wxFont font = retData.GetChosenFont();
1695
1696 wxTextAttr attr;
1697 attr.SetFont(font);
925e9792 1698
e00a5d3c
JS
1699 long start, end;
1700 m_textCtrl->GetSelection(& start, & end);
1701 m_textCtrl->SetStyle(start, end, attr);
80185c6c
JS
1702
1703 m_currentPosition = -1;
e00a5d3c
JS
1704 }
1705}
1706
656562d8 1707void RichTextFrame::OnChangeTextColour(wxCommandEvent& WXUNUSED(event))
e00a5d3c
JS
1708{
1709 wxColourData data;
1710 data.SetColour(* wxBLACK);
effbd41d 1711 data.SetChooseFull(true);
e00a5d3c
JS
1712 for (int i = 0; i < 16; i++)
1713 {
925e9792 1714 wxColour colour((unsigned char)(i*16), (unsigned char)(i*16), (unsigned char)(i*16));
e00a5d3c
JS
1715 data.SetCustomColour(i, colour);
1716 }
1717
1718 wxColourDialog dialog(this, &data);
9a83f860 1719 dialog.SetTitle(wxT("Choose the text colour"));
e00a5d3c
JS
1720 if (dialog.ShowModal() == wxID_OK)
1721 {
1722 wxColourData retData = dialog.GetColourData();
1723 wxColour col = retData.GetColour();
1724
1725 wxTextAttr attr;
1726 attr.SetTextColour(col);
925e9792 1727
e00a5d3c
JS
1728 long start, end;
1729 m_textCtrl->GetSelection(& start, & end);
1730 m_textCtrl->SetStyle(start, end, attr);
80185c6c
JS
1731
1732 m_currentPosition = -1;
e00a5d3c
JS
1733 }
1734}
1735
656562d8 1736void RichTextFrame::OnChangeBackgroundColour(wxCommandEvent& WXUNUSED(event))
e00a5d3c
JS
1737{
1738 wxColourData data;
1739 data.SetColour(* wxWHITE);
effbd41d 1740 data.SetChooseFull(true);
e00a5d3c
JS
1741 for (int i = 0; i < 16; i++)
1742 {
925e9792 1743 wxColour colour((unsigned char)(i*16), (unsigned char)(i*16), (unsigned char)(i*16));
e00a5d3c
JS
1744 data.SetCustomColour(i, colour);
1745 }
1746
1747 wxColourDialog dialog(this, &data);
9a83f860 1748 dialog.SetTitle(wxT("Choose the text background colour"));
e00a5d3c
JS
1749 if (dialog.ShowModal() == wxID_OK)
1750 {
1751 wxColourData retData = dialog.GetColourData();
1752 wxColour col = retData.GetColour();
1753
1754 wxTextAttr attr;
1755 attr.SetBackgroundColour(col);
925e9792 1756
e00a5d3c
JS
1757 long start, end;
1758 m_textCtrl->GetSelection(& start, & end);
1759 m_textCtrl->SetStyle(start, end, attr);
80185c6c
JS
1760
1761 m_currentPosition = -1;
e00a5d3c
JS
1762 }
1763}
1764
656562d8 1765void RichTextFrame::OnLeftIndent(wxCommandEvent& WXUNUSED(event))
e00a5d3c 1766{
656562d8
VZ
1767 wxString indentStr = wxGetTextFromUser
1768 (
1769 _("Please enter the left indent in tenths of a millimetre."),
effbd41d
WS
1770 _("Left Indent"),
1771 wxEmptyString,
1772 this
656562d8 1773 );
e00a5d3c
JS
1774 if (!indentStr.IsEmpty())
1775 {
1776 int indent = wxAtoi(indentStr);
1777
1778 wxTextAttr attr;
1779 attr.SetLeftIndent(indent);
925e9792 1780
e00a5d3c
JS
1781 long start, end;
1782 m_textCtrl->GetSelection(& start, & end);
1783 m_textCtrl->SetStyle(start, end, attr);
80185c6c
JS
1784
1785 m_currentPosition = -1;
e00a5d3c
JS
1786 }
1787}
1788
656562d8 1789void RichTextFrame::OnRightIndent(wxCommandEvent& WXUNUSED(event))
e00a5d3c 1790{
656562d8
VZ
1791 wxString indentStr = wxGetTextFromUser
1792 (
1793 _("Please enter the right indent in tenths of a millimetre."),
effbd41d
WS
1794 _("Right Indent"),
1795 wxEmptyString,
1796 this
656562d8 1797 );
e00a5d3c
JS
1798 if (!indentStr.IsEmpty())
1799 {
1800 int indent = wxAtoi(indentStr);
1801
1802 wxTextAttr attr;
1803 attr.SetRightIndent(indent);
925e9792 1804
e00a5d3c
JS
1805 long start, end;
1806 m_textCtrl->GetSelection(& start, & end);
1807 m_textCtrl->SetStyle(start, end, attr);
80185c6c
JS
1808
1809 m_currentPosition = -1;
1810 }
1811}
1812
7fb3f3c4
MR
1813void RichTextFrame::OnTabStops(wxCommandEvent& WXUNUSED(event))
1814{
1815 wxString tabsStr = wxGetTextFromUser
1816 (
1817 _("Please enter the tab stop positions in tenths of a millimetre, separated by spaces.\nLeave empty to reset tab stops."),
1818 _("Tab Stops"),
1819 wxEmptyString,
1820 this
1821 );
1822
1823 wxArrayInt tabs;
1824
9a83f860 1825 wxStringTokenizer tokens(tabsStr, wxT(" "));
7fb3f3c4
MR
1826 while (tokens.HasMoreTokens())
1827 {
1828 wxString token = tokens.GetNextToken();
1829 tabs.Add(wxAtoi(token));
1830 }
1831
1832 wxTextAttr attr;
1833 attr.SetTabs(tabs);
1834
1835 long start, end;
1836 m_textCtrl->GetSelection(& start, & end);
1837 m_textCtrl->SetStyle(start, end, attr);
1838
1839 m_currentPosition = -1;
1840}
1841
656562d8 1842void RichTextFrame::OnIdle(wxIdleEvent& WXUNUSED(event))
80185c6c
JS
1843{
1844 long insertionPoint = m_textCtrl->GetInsertionPoint();
1845 if (insertionPoint != m_currentPosition)
1846 {
8520f137 1847#if wxUSE_STATUSBAR
80185c6c
JS
1848 wxTextAttr attr;
1849 if (m_textCtrl->GetStyle(insertionPoint, attr))
1850 {
1851 wxString msg;
1852 wxString facename(wxT("unknown"));
1853 if (attr.GetFont().Ok())
1854 {
1855 facename = attr.GetFont().GetFaceName();
1856 }
1857 wxString alignment(wxT("unknown alignment"));
1858 if (attr.GetAlignment() == wxTEXT_ALIGNMENT_CENTRE)
1859 alignment = wxT("centred");
1860 else if (attr.GetAlignment() == wxTEXT_ALIGNMENT_RIGHT)
1861 alignment = wxT("right-aligned");
1862 else if (attr.GetAlignment() == wxTEXT_ALIGNMENT_LEFT)
1863 alignment = wxT("left-aligned");
1864 else if (attr.GetAlignment() == wxTEXT_ALIGNMENT_JUSTIFIED)
1865 alignment = wxT("justified");
6e2b69c6 1866 msg.Printf( "Facename: %s, wxColour(%d, %d, %d), %s", facename,
80185c6c 1867 attr.GetTextColour().Red(), attr.GetTextColour().Green(), attr.GetTextColour().Blue(),
6e2b69c6 1868 alignment );
093dee5e
RN
1869
1870 if (attr.HasFont())
1871 {
1872 if (attr.GetFont().GetWeight() == wxBOLD)
1873 msg += wxT(" BOLD");
1874 else if (attr.GetFont().GetWeight() == wxNORMAL)
1875 msg += wxT(" NORMAL");
1876
1877 if (attr.GetFont().GetStyle() == wxITALIC)
1878 msg += wxT(" ITALIC");
1879
1880 if (attr.GetFont().GetUnderlined())
1881 msg += wxT(" UNDERLINED");
1882 }
1883
80185c6c
JS
1884 SetStatusText(msg);
1885 }
8520f137 1886#endif // wxUSE_STATUSBAR
80185c6c 1887 m_currentPosition = insertionPoint;
e00a5d3c
JS
1888 }
1889}