]> git.saurik.com Git - wxWidgets.git/blob - samples/text/text.cpp
added the test for GtkText inside wxYield crash
[wxWidgets.git] / samples / text / text.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: text.cpp
3 // Purpose: TextCtrl wxWindows sample
4 // Author: Robert Roebling
5 // Modified by:
6 // RCS-ID: $Id$
7 // Copyright: (c) Robert Roebling, Julian Smart, Vadim Zeitlin
8 // Licence: wxWindows license
9 /////////////////////////////////////////////////////////////////////////////
10
11 #ifdef __GNUG__
12 #pragma implementation "text.cpp"
13 #endif
14
15 // For compilers that support precompilation, includes "wx/wx.h".
16 #include "wx/wxprec.h"
17
18 #ifdef __BORLANDC__
19 #pragma hdrstop
20 #endif
21
22 #ifndef WX_PRECOMP
23 #include "wx/wx.h"
24 #endif
25
26 #if wxUSE_CLIPBOARD
27 #include "wx/dataobj.h"
28 #include "wx/clipbrd.h"
29 #endif
30
31 #if wxUSE_FILE
32 #include "wx/file.h"
33 #endif
34
35 #if wxUSE_TOOLTIPS
36 #include "wx/tooltip.h"
37 #endif
38
39 #include "wx/progdlg.h"
40
41 // We test for wxUSE_DRAG_AND_DROP also, because data objects may not be
42 // implemented for compilers that can't cope with the OLE parts in
43 // wxUSE_DRAG_AND_DROP.
44 #if !wxUSE_DRAG_AND_DROP
45 #undef wxUSE_CLIPBOARD
46 #define wxUSE_CLIPBOARD 0
47 #endif
48
49 //----------------------------------------------------------------------
50 // class definitions
51 //----------------------------------------------------------------------
52
53 class MyApp: public wxApp
54 {
55 public:
56 bool OnInit();
57 };
58
59 // a text ctrl which allows to call different wxTextCtrl functions
60 // interactively by pressing function keys in it
61 class MyTextCtrl : public wxTextCtrl
62 {
63 public:
64 MyTextCtrl(wxWindow *parent, wxWindowID id, const wxString &value,
65 const wxPoint &pos, const wxSize &size, int style = 0)
66 : wxTextCtrl(parent, id, value, pos, size, style)
67 {
68 m_hasCapture = FALSE;
69 }
70
71 void OnKeyDown(wxKeyEvent& event);
72 void OnKeyUp(wxKeyEvent& event);
73 void OnChar(wxKeyEvent& event);
74
75 void OnText(wxCommandEvent& event);
76 void OnTextURL(wxTextUrlEvent& event);
77 void OnTextMaxLen(wxCommandEvent& event);
78
79 void OnMouseEvent(wxMouseEvent& event);
80
81 static bool ms_logKey;
82 static bool ms_logChar;
83 static bool ms_logMouse;
84 static bool ms_logText;
85
86 private:
87 static inline wxChar GetChar(bool on, wxChar c) { return on ? c : _T('-'); }
88 void LogEvent(const wxChar *name, wxKeyEvent& event) const;
89
90 bool m_hasCapture;
91
92 DECLARE_EVENT_TABLE()
93 };
94
95 class MyPanel: public wxPanel
96 {
97 public:
98 MyPanel(wxFrame *frame, int x, int y, int w, int h);
99
100 #if wxUSE_CLIPBOARD
101 void DoPasteFromClipboard();
102 void DoCopyToClipboard();
103 #endif // wxUSE_CLIPBOARD
104
105 void DoRemoveText();
106 void DoMoveToEndOfText();
107 void DoMoveToEndOfEntry();
108
109 void OnSize( wxSizeEvent &event );
110
111 MyTextCtrl *m_text;
112 MyTextCtrl *m_password;
113 MyTextCtrl *m_enter;
114 MyTextCtrl *m_tab;
115 MyTextCtrl *m_readonly;
116 MyTextCtrl *m_limited;
117
118 MyTextCtrl *m_multitext;
119 MyTextCtrl *m_horizontal;
120
121 MyTextCtrl *m_textrich;
122
123 wxTextCtrl *m_log;
124
125 private:
126 // get the currently focused text control or return the default one is no
127 // text ctrl has focus
128 wxTextCtrl *GetFocusedText(wxTextCtrl *textDef);
129
130 DECLARE_EVENT_TABLE()
131 };
132
133 class MyFrame: public wxFrame
134 {
135 public:
136 MyFrame(wxFrame *frame, const char *title, int x, int y, int w, int h);
137
138 void OnQuit(wxCommandEvent& event);
139 void OnAbout(wxCommandEvent& event);
140 #if wxUSE_TOOLTIPS
141 void OnSetTooltipDelay(wxCommandEvent& event);
142 void OnToggleTooltips(wxCommandEvent& event);
143 #endif // wxUSE_TOOLTIPS
144
145 #if wxUSE_CLIPBOARD
146 void OnPasteFromClipboard( wxCommandEvent &event )
147 { m_panel->DoPasteFromClipboard(); }
148 void OnCopyToClipboard( wxCommandEvent &event )
149 { m_panel->DoCopyToClipboard(); }
150 #endif // wxUSE_CLIPBOARD
151
152 void OnAddTextFreeze( wxCommandEvent& event )
153 { DoAddText(true); }
154 void OnAddText( wxCommandEvent& event )
155 { DoAddText(false); }
156 void OnRemoveText( wxCommandEvent& event )
157 { m_panel->DoRemoveText(); }
158
159 void OnMoveToEndOfText( wxCommandEvent &event )
160 { m_panel->DoMoveToEndOfText(); }
161 void OnMoveToEndOfEntry( wxCommandEvent &event )
162 { m_panel->DoMoveToEndOfEntry(); }
163
164 void OnScrollLineDown(wxCommandEvent& event)
165 {
166 if ( !m_panel->m_textrich->LineDown() )
167 wxLogMessage(_T("Already at the bottom"));
168 }
169
170 void OnScrollLineUp(wxCommandEvent& event)
171 {
172 if ( !m_panel->m_textrich->LineUp() )
173 wxLogMessage(_T("Already at the top"));
174 }
175
176 void OnScrollPageDown(wxCommandEvent& event)
177 {
178 if ( !m_panel->m_textrich->PageDown() )
179 wxLogMessage(_T("Already at the bottom"));
180 }
181
182 void OnScrollPageUp(wxCommandEvent& event)
183 {
184 if ( !m_panel->m_textrich->PageUp() )
185 wxLogMessage(_T("Already at the top"));
186 }
187
188 void OnLogClear(wxCommandEvent& event);
189 void OnFileSave(wxCommandEvent& event);
190 void OnFileLoad(wxCommandEvent& event);
191
192 void OnSetEditable(wxCommandEvent& event);
193 void OnSetEnabled(wxCommandEvent& event);
194
195 void OnLogKey(wxCommandEvent& event)
196 {
197 MyTextCtrl::ms_logKey = event.IsChecked();
198 }
199
200 void OnLogChar(wxCommandEvent& event)
201 {
202 MyTextCtrl::ms_logChar = event.IsChecked();
203 }
204
205 void OnLogMouse(wxCommandEvent& event)
206 {
207 MyTextCtrl::ms_logMouse = event.IsChecked();
208 }
209
210 void OnLogText(wxCommandEvent& event)
211 {
212 MyTextCtrl::ms_logText = event.IsChecked();
213 }
214
215 void OnSetText(wxCommandEvent& event)
216 {
217 m_panel->m_text->SetValue(_T("Hello, world (what else did you expect)?"));
218 }
219
220 void OnIdle( wxIdleEvent& event );
221
222 private:
223 void DoAddText(bool freeze)
224 {
225 wxTextCtrl *text = m_panel->m_textrich;
226 if ( freeze )
227 text->Freeze();
228
229 text->Clear();
230
231 wxProgressDialog dlg(_T("Wait..."), _T("Updating"), 100, this);
232 for ( int i = 0; i < 100; i++ )
233 {
234 dlg.Update(i);
235 text->AppendText(wxString::Format(wxT("Line %i\n"), i));
236 }
237
238 text->SetInsertionPoint(0);
239
240 if ( freeze )
241 text->Thaw();
242 }
243
244 MyPanel *m_panel;
245
246 DECLARE_EVENT_TABLE()
247 };
248
249 //----------------------------------------------------------------------
250 // main()
251 //----------------------------------------------------------------------
252
253 IMPLEMENT_APP(MyApp)
254
255 //----------------------------------------------------------------------
256 // MyApp
257 //----------------------------------------------------------------------
258
259 enum
260 {
261 TEXT_QUIT = 100,
262 TEXT_ABOUT,
263 TEXT_LOAD,
264 TEXT_SAVE,
265 TEXT_CLEAR,
266
267 // clipboard menu
268 TEXT_CLIPBOARD_COPY = 200,
269 TEXT_CLIPBOARD_PASTE,
270
271 // tooltip menu
272 TEXT_TOOLTIPS_SETDELAY = 300,
273 TEXT_TOOLTIPS_ENABLE,
274
275 // text menu
276 TEXT_ADD_SOME = 400,
277 TEXT_ADD_FREEZE,
278 TEXT_MOVE_ENDTEXT,
279 TEXT_MOVE_ENDENTRY,
280 TEXT_SET_EDITABLE,
281 TEXT_SET_ENABLED,
282 TEXT_LINE_DOWN,
283 TEXT_LINE_UP,
284 TEXT_PAGE_DOWN,
285 TEXT_PAGE_UP,
286 TEXT_REMOVE,
287 TEXT_SET,
288
289 // log menu
290 TEXT_LOG_KEY,
291 TEXT_LOG_CHAR,
292 TEXT_LOG_MOUSE,
293 TEXT_LOG_TEXT,
294
295 TEXT_END
296 };
297
298 bool MyApp::OnInit()
299 {
300 // Create the main frame window
301 MyFrame *frame = new MyFrame((wxFrame *) NULL,
302 "Text wxWindows sample", 50, 50, 700, 420);
303 frame->SetSizeHints( 500, 400 );
304
305 wxMenu *file_menu = new wxMenu;
306 file_menu->Append(TEXT_SAVE, "&Save file\tCtrl-S",
307 "Save the text control contents to file");
308 file_menu->Append(TEXT_LOAD, "&Load file\tCtrl-O",
309 "Load the sample file into text control");
310 file_menu->AppendSeparator();
311 file_menu->Append(TEXT_ABOUT, "&About\tAlt-A");
312 file_menu->AppendSeparator();
313 file_menu->Append(TEXT_QUIT, "E&xit\tAlt-X", "Quit this sample");
314
315 wxMenuBar *menu_bar = new wxMenuBar( wxMB_DOCKABLE );
316 menu_bar->Append(file_menu, "&File");
317
318 #if wxUSE_TOOLTIPS
319 wxMenu *tooltip_menu = new wxMenu;
320 tooltip_menu->Append(TEXT_TOOLTIPS_SETDELAY, "Set &delay\tCtrl-D");
321 tooltip_menu->AppendSeparator();
322 tooltip_menu->Append(TEXT_TOOLTIPS_ENABLE, "&Toggle tooltips\tCtrl-T",
323 "enable/disable tooltips", TRUE);
324 tooltip_menu->Check(TEXT_TOOLTIPS_ENABLE, TRUE);
325 menu_bar->Append(tooltip_menu, "&Tooltips");
326 #endif // wxUSE_TOOLTIPS
327
328 #if wxUSE_CLIPBOARD
329 wxMenu *menuClipboard = new wxMenu;
330 menuClipboard->Append(TEXT_CLIPBOARD_COPY, "&Copy\tCtrl-C",
331 "Copy the first line to the clipboard");
332 menuClipboard->Append(TEXT_CLIPBOARD_PASTE, "&Paste\tCtrl-V",
333 "Paste from clipboard to the text control");
334 menu_bar->Append(menuClipboard, "&Clipboard");
335 #endif // wxUSE_CLIPBOARD
336
337 wxMenu *menuText = new wxMenu;
338 menuText->Append(TEXT_ADD_SOME, "&Append some text\tCtrl-A");
339 menuText->Append(TEXT_ADD_FREEZE, "&Append text with freeze/thaw\tShift-Ctrl-A");
340 menuText->Append(TEXT_REMOVE, "&Remove first 10 characters\tCtrl-X");
341 menuText->Append(TEXT_SET, "&Set the first text zone value\tCtrl-E");
342 menuText->AppendSeparator();
343 menuText->Append(TEXT_MOVE_ENDTEXT, "Move cursor to the end of &text");
344 menuText->Append(TEXT_MOVE_ENDENTRY, "Move cursor to the end of &entry");
345 menuText->Append(TEXT_SET_EDITABLE, "Toggle &editable state", "", TRUE);
346 menuText->Append(TEXT_SET_ENABLED, "Toggle e&nabled state", "", TRUE);
347 menuText->Check(TEXT_SET_EDITABLE, TRUE);
348 menuText->Check(TEXT_SET_ENABLED, TRUE);
349 menuText->AppendSeparator();
350 menuText->Append(TEXT_LINE_DOWN, "Scroll text one line down");
351 menuText->Append(TEXT_LINE_UP, "Scroll text one line up");
352 menuText->Append(TEXT_PAGE_DOWN, "Scroll text one page down");
353 menuText->Append(TEXT_PAGE_DOWN, "Scroll text one page up");
354 menu_bar->Append(menuText, "Te&xt");
355
356 wxMenu *menuLog = new wxMenu;
357 menuLog->Append(TEXT_LOG_KEY, "Log &key events", "", TRUE);
358 menuLog->Append(TEXT_LOG_CHAR, "Log &char events", "", TRUE);
359 menuLog->Append(TEXT_LOG_MOUSE, "Log &mouse events", "", TRUE);
360 menuLog->Append(TEXT_LOG_TEXT, "Log &text events", "", TRUE);
361 menuLog->AppendSeparator();
362 menuLog->Append(TEXT_CLEAR, "&Clear the log\tCtrl-C",
363 "Clear the log window contents");
364 menuLog->Check(TEXT_LOG_KEY, TRUE);
365 menuLog->Check(TEXT_LOG_CHAR, TRUE);
366 menuLog->Check(TEXT_LOG_TEXT, TRUE);
367 menu_bar->Append(menuLog, "&Log");
368
369 frame->SetMenuBar(menu_bar);
370
371 frame->Show(TRUE);
372
373 SetTopWindow(frame);
374
375 // report success
376 return TRUE;
377 }
378
379 //----------------------------------------------------------------------
380 // MyTextCtrl
381 //----------------------------------------------------------------------
382
383 BEGIN_EVENT_TABLE(MyTextCtrl, wxTextCtrl)
384 EVT_KEY_DOWN(MyTextCtrl::OnKeyDown)
385 EVT_KEY_UP(MyTextCtrl::OnKeyUp)
386 EVT_CHAR(MyTextCtrl::OnChar)
387
388 EVT_TEXT(-1, MyTextCtrl::OnText)
389 EVT_TEXT_URL(-1, MyTextCtrl::OnTextURL)
390 EVT_TEXT_MAXLEN(-1, MyTextCtrl::OnTextMaxLen)
391
392 EVT_MOUSE_EVENTS(MyTextCtrl::OnMouseEvent)
393 END_EVENT_TABLE()
394
395 bool MyTextCtrl::ms_logKey = TRUE;
396 bool MyTextCtrl::ms_logChar = TRUE;
397 bool MyTextCtrl::ms_logMouse = FALSE;
398 bool MyTextCtrl::ms_logText = TRUE;
399
400 void MyTextCtrl::LogEvent(const wxChar *name, wxKeyEvent& event) const
401 {
402 wxString key;
403 long keycode = event.KeyCode();
404 {
405 switch ( keycode )
406 {
407 case WXK_BACK: key = "BACK"; break;
408 case WXK_TAB: key = "TAB"; break;
409 case WXK_RETURN: key = "RETURN"; break;
410 case WXK_ESCAPE: key = "ESCAPE"; break;
411 case WXK_SPACE: key = "SPACE"; break;
412 case WXK_DELETE: key = "DELETE"; break;
413 case WXK_START: key = "START"; break;
414 case WXK_LBUTTON: key = "LBUTTON"; break;
415 case WXK_RBUTTON: key = "RBUTTON"; break;
416 case WXK_CANCEL: key = "CANCEL"; break;
417 case WXK_MBUTTON: key = "MBUTTON"; break;
418 case WXK_CLEAR: key = "CLEAR"; break;
419 case WXK_SHIFT: key = "SHIFT"; break;
420 case WXK_ALT: key = "ALT"; break;
421 case WXK_CONTROL: key = "CONTROL"; break;
422 case WXK_MENU: key = "MENU"; break;
423 case WXK_PAUSE: key = "PAUSE"; break;
424 case WXK_CAPITAL: key = "CAPITAL"; break;
425 case WXK_PRIOR: key = "PRIOR"; break;
426 case WXK_NEXT: key = "NEXT"; break;
427 case WXK_END: key = "END"; break;
428 case WXK_HOME: key = "HOME"; break;
429 case WXK_LEFT: key = "LEFT"; break;
430 case WXK_UP: key = "UP"; break;
431 case WXK_RIGHT: key = "RIGHT"; break;
432 case WXK_DOWN: key = "DOWN"; break;
433 case WXK_SELECT: key = "SELECT"; break;
434 case WXK_PRINT: key = "PRINT"; break;
435 case WXK_EXECUTE: key = "EXECUTE"; break;
436 case WXK_SNAPSHOT: key = "SNAPSHOT"; break;
437 case WXK_INSERT: key = "INSERT"; break;
438 case WXK_HELP: key = "HELP"; break;
439 case WXK_NUMPAD0: key = "NUMPAD0"; break;
440 case WXK_NUMPAD1: key = "NUMPAD1"; break;
441 case WXK_NUMPAD2: key = "NUMPAD2"; break;
442 case WXK_NUMPAD3: key = "NUMPAD3"; break;
443 case WXK_NUMPAD4: key = "NUMPAD4"; break;
444 case WXK_NUMPAD5: key = "NUMPAD5"; break;
445 case WXK_NUMPAD6: key = "NUMPAD6"; break;
446 case WXK_NUMPAD7: key = "NUMPAD7"; break;
447 case WXK_NUMPAD8: key = "NUMPAD8"; break;
448 case WXK_NUMPAD9: key = "NUMPAD9"; break;
449 case WXK_MULTIPLY: key = "MULTIPLY"; break;
450 case WXK_ADD: key = "ADD"; break;
451 case WXK_SEPARATOR: key = "SEPARATOR"; break;
452 case WXK_SUBTRACT: key = "SUBTRACT"; break;
453 case WXK_DECIMAL: key = "DECIMAL"; break;
454 case WXK_DIVIDE: key = "DIVIDE"; break;
455 case WXK_F1: key = "F1"; break;
456 case WXK_F2: key = "F2"; break;
457 case WXK_F3: key = "F3"; break;
458 case WXK_F4: key = "F4"; break;
459 case WXK_F5: key = "F5"; break;
460 case WXK_F6: key = "F6"; break;
461 case WXK_F7: key = "F7"; break;
462 case WXK_F8: key = "F8"; break;
463 case WXK_F9: key = "F9"; break;
464 case WXK_F10: key = "F10"; break;
465 case WXK_F11: key = "F11"; break;
466 case WXK_F12: key = "F12"; break;
467 case WXK_F13: key = "F13"; break;
468 case WXK_F14: key = "F14"; break;
469 case WXK_F15: key = "F15"; break;
470 case WXK_F16: key = "F16"; break;
471 case WXK_F17: key = "F17"; break;
472 case WXK_F18: key = "F18"; break;
473 case WXK_F19: key = "F19"; break;
474 case WXK_F20: key = "F20"; break;
475 case WXK_F21: key = "F21"; break;
476 case WXK_F22: key = "F22"; break;
477 case WXK_F23: key = "F23"; break;
478 case WXK_F24: key = "F24"; break;
479 case WXK_NUMLOCK: key = "NUMLOCK"; break;
480 case WXK_SCROLL: key = "SCROLL"; break;
481 case WXK_PAGEUP: key = "PAGEUP"; break;
482 case WXK_PAGEDOWN: key = "PAGEDOWN"; break;
483 case WXK_NUMPAD_SPACE: key = "NUMPAD_SPACE"; break;
484 case WXK_NUMPAD_TAB: key = "NUMPAD_TAB"; break;
485 case WXK_NUMPAD_ENTER: key = "NUMPAD_ENTER"; break;
486 case WXK_NUMPAD_F1: key = "NUMPAD_F1"; break;
487 case WXK_NUMPAD_F2: key = "NUMPAD_F2"; break;
488 case WXK_NUMPAD_F3: key = "NUMPAD_F3"; break;
489 case WXK_NUMPAD_F4: key = "NUMPAD_F4"; break;
490 case WXK_NUMPAD_HOME: key = "NUMPAD_HOME"; break;
491 case WXK_NUMPAD_LEFT: key = "NUMPAD_LEFT"; break;
492 case WXK_NUMPAD_UP: key = "NUMPAD_UP"; break;
493 case WXK_NUMPAD_RIGHT: key = "NUMPAD_RIGHT"; break;
494 case WXK_NUMPAD_DOWN: key = "NUMPAD_DOWN"; break;
495 case WXK_NUMPAD_PRIOR: key = "NUMPAD_PRIOR"; break;
496 case WXK_NUMPAD_PAGEUP: key = "NUMPAD_PAGEUP"; break;
497 case WXK_NUMPAD_PAGEDOWN: key = "NUMPAD_PAGEDOWN"; break;
498 case WXK_NUMPAD_END: key = "NUMPAD_END"; break;
499 case WXK_NUMPAD_BEGIN: key = "NUMPAD_BEGIN"; break;
500 case WXK_NUMPAD_INSERT: key = "NUMPAD_INSERT"; break;
501 case WXK_NUMPAD_DELETE: key = "NUMPAD_DELETE"; break;
502 case WXK_NUMPAD_EQUAL: key = "NUMPAD_EQUAL"; break;
503 case WXK_NUMPAD_MULTIPLY: key = "NUMPAD_MULTIPLY"; break;
504 case WXK_NUMPAD_ADD: key = "NUMPAD_ADD"; break;
505 case WXK_NUMPAD_SEPARATOR: key = "NUMPAD_SEPARATOR"; break;
506 case WXK_NUMPAD_SUBTRACT: key = "NUMPAD_SUBTRACT"; break;
507 case WXK_NUMPAD_DECIMAL: key = "NUMPAD_DECIMAL"; break;
508
509 default:
510 {
511 if ( wxIsprint((int)keycode) )
512 key.Printf(_T("'%c'"), (char)keycode);
513 else if ( keycode > 0 && keycode < 27 )
514 key.Printf(_("Ctrl-%c"), _T('A') + keycode - 1);
515 else
516 key.Printf(_T("unknown (%ld)"), keycode);
517 }
518 }
519 }
520
521 wxLogMessage( _T("%s event: %s (flags = %c%c%c%c)"),
522 name,
523 key.c_str(),
524 GetChar( event.ControlDown(), _T('C') ),
525 GetChar( event.AltDown(), _T('A') ),
526 GetChar( event.ShiftDown(), _T('S') ),
527 GetChar( event.MetaDown(), _T('M') ) );
528 }
529
530 static wxString GetMouseEventDesc(const wxMouseEvent& ev)
531 {
532 // click event
533 wxString button;
534 bool dbl, up;
535 if ( ev.LeftDown() || ev.LeftUp() || ev.LeftDClick() )
536 {
537 button = _T("Left");
538 dbl = ev.LeftDClick();
539 up = ev.LeftUp();
540 }
541 else if ( ev.MiddleDown() || ev.MiddleUp() || ev.MiddleDClick() )
542 {
543 button = _T("Middle");
544 dbl = ev.MiddleDClick();
545 up = ev.MiddleUp();
546 }
547 else if ( ev.RightDown() || ev.RightUp() || ev.RightDClick() )
548 {
549 button = _T("Right");
550 dbl = ev.RightDClick();
551 up = ev.RightUp();
552 }
553 else
554 {
555 return _T("Unknown mouse event");
556 }
557
558 return wxString::Format(_T("%s mouse button %s"),
559 button.c_str(),
560 dbl ? _T("double clicked")
561 : up ? _T("released") : _T("clicked"));
562 }
563
564 void MyTextCtrl::OnMouseEvent(wxMouseEvent& ev)
565 {
566 ev.Skip();
567
568 if ( !ms_logMouse )
569 return;
570
571 if ( !ev.Moving() )
572 {
573 wxString msg;
574 if ( ev.Entering() )
575 {
576 msg = _T("Mouse entered the window");
577 }
578 else if ( ev.Leaving() )
579 {
580 msg = _T("Mouse left the window");
581 }
582 else
583 {
584 msg = GetMouseEventDesc(ev);
585 }
586
587 msg << _T(" at (") << ev.GetX() << _T(", ") << ev.GetY() << _T(") ")
588 << _T("Flags: ")
589 << GetChar( ev.LeftIsDown(), _T('1') )
590 << GetChar( ev.MiddleIsDown(), _T('2') )
591 << GetChar( ev.RightIsDown(), _T('3') )
592 << GetChar( ev.ControlDown(), _T('C') )
593 << GetChar( ev.AltDown(), _T('A') )
594 << GetChar( ev.ShiftDown(), _T('S') )
595 << GetChar( ev.MetaDown(), _T('M') );
596
597 wxLogMessage(msg);
598 }
599 //else: we're not interested in mouse move events
600 }
601
602 void MyTextCtrl::OnText(wxCommandEvent& event)
603 {
604 if ( !ms_logText )
605 return;
606
607 MyTextCtrl *win = (MyTextCtrl *)event.GetEventObject();
608 const wxChar *data = (const wxChar *)(win->GetClientData());
609 if ( data )
610 {
611 wxLogMessage(_T("Text changed in control '%s'"), data);
612 }
613 else
614 {
615 wxLogMessage(_T("Text changed in some control"));
616 }
617 }
618
619 void MyTextCtrl::OnTextMaxLen(wxCommandEvent& event)
620 {
621 wxLogMessage(_T("You can't enter more characters into this control."));
622 }
623
624 void MyTextCtrl::OnTextURL(wxTextUrlEvent& event)
625 {
626 const wxMouseEvent& ev = event.GetMouseEvent();
627
628 // filter out mouse moves, too many of them
629 if ( ev.Moving() )
630 return;
631
632 long start = event.GetURLStart(),
633 end = event.GetURLEnd();
634
635 wxLogMessage(_T("Mouse event over URL '%s': %s"),
636 GetValue().Mid(start, end - start).c_str(),
637 GetMouseEventDesc(ev).c_str());
638 }
639
640 void MyTextCtrl::OnChar(wxKeyEvent& event)
641 {
642 if ( ms_logChar )
643 LogEvent( _T("Char"), event);
644
645 event.Skip();
646 }
647
648 void MyTextCtrl::OnKeyUp(wxKeyEvent& event)
649 {
650 if ( ms_logKey )
651 LogEvent( _T("Key up"), event);
652
653 event.Skip();
654 }
655
656 void MyTextCtrl::OnKeyDown(wxKeyEvent& event)
657 {
658 switch ( event.KeyCode() )
659 {
660 case WXK_F1:
661 // show current position and text length
662 {
663 long line, column, pos = GetInsertionPoint();
664 PositionToXY(pos, &column, &line);
665
666 wxLogMessage( _T("Current position: %ld\nCurrent line, column: (%ld, %ld)\nNumber of lines: %ld\nCurrent line length: %ld\nTotal text length: %u (%ld)"),
667 pos,
668 line, column,
669 GetNumberOfLines(),
670 GetLineLength(line),
671 GetValue().length(),
672 GetLastPosition());
673 }
674 break;
675
676 case WXK_F2:
677 // go to the end
678 SetInsertionPointEnd();
679 break;
680
681 case WXK_F3:
682 // go to position 10
683 SetInsertionPoint(10);
684 break;
685
686 case WXK_F4:
687 if (!m_hasCapture)
688 {
689 wxLogDebug( wxT("Now capturing mouse and events.") );
690 m_hasCapture = TRUE;
691 CaptureMouse();
692 }
693 else
694 {
695 wxLogDebug( wxT("Stopped capturing mouse and events.") );
696 m_hasCapture = FALSE;
697 ReleaseMouse();
698 }
699 break;
700
701 case WXK_F5:
702 // insert a blank line
703 WriteText("\n");
704 break;
705
706 case WXK_F6:
707 SetValue("F6 was just pressed.");
708 break;
709
710 case WXK_F7:
711 ShowPosition(10);
712 break;
713
714 case WXK_F10:
715 {
716 long from, to;
717 GetSelection(&from, &to);
718
719 wxString sel = GetStringSelection();
720
721 wxLogMessage(_T("Selection: from %ld to %ld."), from, to);
722 wxLogMessage(_T("Selection = '%s' (len = %u)"),
723 sel.c_str(), sel.length());
724 }
725 }
726
727 if ( ms_logKey )
728 LogEvent( wxT("Key down"), event);
729
730 event.Skip();
731 }
732
733 //----------------------------------------------------------------------
734 // MyPanel
735 //----------------------------------------------------------------------
736
737 BEGIN_EVENT_TABLE(MyPanel, wxPanel)
738 EVT_SIZE(MyPanel::OnSize)
739 END_EVENT_TABLE()
740
741 MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
742 : wxPanel( frame, -1, wxPoint(x, y), wxSize(w, h) )
743 {
744 m_log = new wxTextCtrl( this, -1, "This is the log window.\n",
745 wxPoint(5,260), wxSize(630,100),
746 wxTE_MULTILINE | wxTE_READONLY /* | wxTE_RICH */);
747
748 wxLog *old_log = wxLog::SetActiveTarget( new wxLogTextCtrl( m_log ) );
749
750 delete old_log;
751
752 // single line text controls
753
754 m_text = new MyTextCtrl( this, -1, "Single line.",
755 wxPoint(10,10), wxSize(140,-1),
756 wxTE_PROCESS_ENTER);
757 m_text->SetForegroundColour(*wxBLUE);
758 m_text->SetBackgroundColour(*wxLIGHT_GREY);
759 (*m_text) << " Appended.";
760 m_text->SetInsertionPoint(0);
761 m_text->WriteText( "Prepended. " );
762
763 m_password = new MyTextCtrl( this, -1, "",
764 wxPoint(10,50), wxSize(140,-1), wxTE_PASSWORD );
765
766 m_readonly = new MyTextCtrl( this, -1, "Read only",
767 wxPoint(10,90), wxSize(140,-1), wxTE_READONLY );
768
769 m_limited = new MyTextCtrl(this, -1, "Max 8 ch",
770 wxPoint(10, 130), wxSize(140, -1));
771 m_limited->SetMaxLength(8);
772
773 // multi line text controls
774
775 m_horizontal = new MyTextCtrl( this, -1, "Multiline text control with a horizontal scrollbar.",
776 wxPoint(10,170), wxSize(140,70), wxTE_MULTILINE | wxHSCROLL );
777
778 // a little hack to use the command line argument for encoding testing
779 if ( wxTheApp->argc == 2 )
780 {
781 switch ( wxTheApp->argv[1][0] )
782 {
783 case '2':
784 m_horizontal->SetFont(wxFont(18, wxSWISS, wxNORMAL, wxNORMAL,
785 FALSE, "",
786 wxFONTENCODING_ISO8859_2));
787 m_horizontal->SetValue("®lu»ouèký kùò zbìsile èe¹tina «»");
788 break;
789
790 case '1':
791 m_horizontal->SetFont(wxFont(18, wxSWISS, wxNORMAL, wxNORMAL,
792 FALSE, "",
793 wxFONTENCODING_CP1251));
794 m_horizontal->SetValue("Ïðèâåò!");
795 break;
796
797 case '8':
798 m_horizontal->SetFont(wxFont(18, wxSWISS, wxNORMAL, wxNORMAL,
799 FALSE, "",
800 wxFONTENCODING_CP1251));
801 #if wxUSE_UNICODE
802 m_horizontal->SetValue(L"\x0412\x0430\x0434\x0438\x043c \x0426");
803 #else
804 m_horizontal->SetValue("ËÁÖÅÔÓÑ ÕÄÁÞÎÙÍ");
805 #endif
806 }
807 }
808 else
809 {
810 m_horizontal->SetValue("Text in default encoding");
811 }
812
813 m_multitext = new MyTextCtrl( this, -1, "Multi line.",
814 wxPoint(180,10), wxSize(240,70), wxTE_MULTILINE );
815 m_multitext->SetFont(*wxITALIC_FONT);
816 (*m_multitext) << " Appended.";
817 m_multitext->SetInsertionPoint(0);
818 m_multitext->WriteText( "Prepended. " );
819 m_multitext->SetForegroundColour(*wxRED);
820 m_multitext->SetBackgroundColour(*wxLIGHT_GREY);
821
822 #if wxUSE_TOOLTIPS
823 m_multitext->SetToolTip("Press F1 here for statitics, F4 for capture and uncapture mouse.");
824 #endif
825
826 m_tab = new MyTextCtrl( this, 100, "Multiline, allow <TAB> processing.",
827 wxPoint(180,90), wxSize(240,70), wxTE_MULTILINE | wxTE_PROCESS_TAB );
828 m_tab->SetClientData((void *)_T("tab"));
829
830 m_enter = new MyTextCtrl( this, 100, "Multiline, allow <ENTER> processing.",
831 wxPoint(180,170), wxSize(240,70), wxTE_MULTILINE);
832 m_enter->SetClientData((void *)_T("enter"));
833
834 m_textrich = new MyTextCtrl(this, -1, "Allows more than 30Kb of text\n"
835 "(even under broken Win9x)\n"
836 "and a very very very very very "
837 "very very very long line to test "
838 "wxHSCROLL style",
839 wxPoint(450, 10), wxSize(230, 230),
840 wxTE_RICH |
841 wxTE_MULTILINE |
842 // wxTE_AUTO_URL |
843 wxHSCROLL);
844
845 #if 1
846 m_textrich->SetStyle(0, 10, *wxRED);
847 m_textrich->SetStyle(10, 20, *wxBLUE);
848 m_textrich->SetStyle(30, 40,
849 wxTextAttr(*wxGREEN, wxNullColour, *wxITALIC_FONT));
850 m_textrich->SetDefaultStyle(wxTextAttr());
851 m_textrich->AppendText(_T("\n\nFirst 10 characters should be in red\n"));
852 m_textrich->AppendText(_T("Next 10 characters should be in blue\n"));
853 m_textrich->AppendText(_T("Next 10 characters should be normal\n"));
854 m_textrich->AppendText(_T("And the next 10 characters should be green and italic\n"));
855 m_textrich->SetDefaultStyle(wxTextAttr(*wxCYAN, *wxBLUE));
856 m_textrich->AppendText(_T("This text should be cyan on blue\n"));
857 m_textrich->SetDefaultStyle(wxTextAttr(*wxBLUE, *wxWHITE));
858 m_textrich->AppendText(_T("And this should be in blue and the text you ")
859 _T("type should be in blue as well"));
860 #else
861 m_textrich->SetFont(wxFont(12, wxFONTFAMILY_TELETYPE,
862 wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL));
863 m_textrich->SetDefaultStyle(wxTextAttr(*wxRED));
864 m_textrich->AppendText(_T("Red text\n"));
865 m_textrich->SetDefaultStyle(wxTextAttr(wxNullColour, *wxLIGHT_GREY));
866 m_textrich->AppendText(_T("Red on grey text\n"));
867 m_textrich->SetDefaultStyle(wxTextAttr(*wxBLUE));
868 m_textrich->AppendText(_T("Blue on grey text\n"));
869 #endif
870 }
871
872 void MyPanel::OnSize( wxSizeEvent &event )
873 {
874 wxSize client_area( GetClientSize() );
875 m_log->SetSize( 0, 260, client_area.x, client_area.y - 260 );
876 event.Skip();
877 }
878
879 wxTextCtrl *MyPanel::GetFocusedText(wxTextCtrl *textDef)
880 {
881 wxWindow *win = FindFocus();
882
883 wxTextCtrl *text = win ? wxDynamicCast(win, wxTextCtrl) : NULL;
884 return text ? text : textDef;
885 }
886
887 #if wxUSE_CLIPBOARD
888 void MyPanel::DoPasteFromClipboard()
889 {
890 // On X11, we want to get the data from the primary selection instead
891 // of the normal clipboard (which isn't normal under X11 at all). This
892 // call has no effect under MSW.
893 wxTheClipboard->UsePrimarySelection();
894
895 if (!wxTheClipboard->Open())
896 {
897 *m_log << "Error opening the clipboard.\n";
898 return;
899 }
900 else
901 {
902 *m_log << "Successfully opened the clipboard.\n";
903 }
904
905 wxTextDataObject data;
906
907 if (wxTheClipboard->IsSupported( data.GetFormat() ))
908 {
909 *m_log << "Clipboard supports requested format.\n";
910
911 if (wxTheClipboard->GetData( data ))
912 {
913 *m_log << "Successfully retrieved data from the clipboard.\n";
914 *m_multitext << data.GetText() << "\n";
915 }
916 else
917 {
918 *m_log << "Error getting data from the clipboard.\n";
919 }
920 }
921 else
922 {
923 *m_log << "Clipboard doesn't support requested format.\n";
924 }
925
926 wxTheClipboard->Close();
927
928 *m_log << "Closed the clipboard.\n";
929 }
930
931 void MyPanel::DoCopyToClipboard()
932 {
933 // On X11, we want to get the data from the primary selection instead
934 // of the normal clipboard (which isn't normal under X11 at all). This
935 // call has no effect under MSW.
936 wxTheClipboard->UsePrimarySelection();
937
938 wxString text( m_multitext->GetLineText(0) );
939
940 if (text.IsEmpty())
941 {
942 *m_log << "No text to copy.\n";
943
944 return;
945 }
946
947 if (!wxTheClipboard->Open())
948 {
949 *m_log << "Error opening the clipboard.\n";
950
951 return;
952 }
953 else
954 {
955 *m_log << "Successfully opened the clipboard.\n";
956 }
957
958 wxTextDataObject *data = new wxTextDataObject( text );
959
960 if (!wxTheClipboard->SetData( data ))
961 {
962 *m_log << "Error while copying to the clipboard.\n";
963 }
964 else
965 {
966 *m_log << "Successfully copied data to the clipboard.\n";
967 }
968
969 wxTheClipboard->Close();
970
971 *m_log << "Closed the clipboard.\n";
972 }
973
974 #endif // wxUSE_CLIPBOARD
975
976 void MyPanel::DoMoveToEndOfText()
977 {
978 m_multitext->SetInsertionPointEnd();
979 m_multitext->SetFocus();
980 }
981
982 void MyPanel::DoMoveToEndOfEntry()
983 {
984 m_text->SetInsertionPointEnd();
985 m_text->SetFocus();
986 }
987
988 void MyPanel::DoRemoveText()
989 {
990 GetFocusedText(m_multitext)->Remove(0, 10);
991 }
992
993 //----------------------------------------------------------------------
994 // MyFrame
995 //----------------------------------------------------------------------
996
997 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
998 EVT_MENU(TEXT_QUIT, MyFrame::OnQuit)
999 EVT_MENU(TEXT_ABOUT, MyFrame::OnAbout)
1000 EVT_MENU(TEXT_SAVE, MyFrame::OnFileSave)
1001 EVT_MENU(TEXT_LOAD, MyFrame::OnFileLoad)
1002
1003 EVT_MENU(TEXT_LOG_KEY, MyFrame::OnLogKey)
1004 EVT_MENU(TEXT_LOG_CHAR, MyFrame::OnLogChar)
1005 EVT_MENU(TEXT_LOG_MOUSE,MyFrame::OnLogMouse)
1006 EVT_MENU(TEXT_LOG_TEXT, MyFrame::OnLogText)
1007 EVT_MENU(TEXT_CLEAR, MyFrame::OnLogClear)
1008
1009 #if wxUSE_TOOLTIPS
1010 EVT_MENU(TEXT_TOOLTIPS_SETDELAY, MyFrame::OnSetTooltipDelay)
1011 EVT_MENU(TEXT_TOOLTIPS_ENABLE, MyFrame::OnToggleTooltips)
1012 #endif // wxUSE_TOOLTIPS
1013
1014 #if wxUSE_CLIPBOARD
1015 EVT_MENU(TEXT_CLIPBOARD_PASTE, MyFrame::OnPasteFromClipboard)
1016 EVT_MENU(TEXT_CLIPBOARD_COPY, MyFrame::OnCopyToClipboard)
1017 #endif // wxUSE_CLIPBOARD
1018
1019 EVT_MENU(TEXT_REMOVE, MyFrame::OnRemoveText)
1020 EVT_MENU(TEXT_ADD_SOME, MyFrame::OnAddText)
1021 EVT_MENU(TEXT_ADD_FREEZE, MyFrame::OnAddTextFreeze)
1022 EVT_MENU(TEXT_MOVE_ENDTEXT, MyFrame::OnMoveToEndOfText)
1023 EVT_MENU(TEXT_MOVE_ENDENTRY, MyFrame::OnMoveToEndOfEntry)
1024
1025 EVT_MENU(TEXT_SET_EDITABLE, MyFrame::OnSetEditable)
1026 EVT_MENU(TEXT_SET_ENABLED, MyFrame::OnSetEnabled)
1027
1028 EVT_MENU(TEXT_LINE_DOWN, MyFrame::OnScrollLineDown)
1029 EVT_MENU(TEXT_LINE_UP, MyFrame::OnScrollLineUp)
1030 EVT_MENU(TEXT_PAGE_DOWN, MyFrame::OnScrollPageDown)
1031 EVT_MENU(TEXT_PAGE_UP, MyFrame::OnScrollPageUp)
1032
1033 EVT_MENU(TEXT_SET, MyFrame::OnSetText)
1034
1035 EVT_IDLE(MyFrame::OnIdle)
1036 END_EVENT_TABLE()
1037
1038 MyFrame::MyFrame(wxFrame *frame, const char *title, int x, int y, int w, int h)
1039 : wxFrame(frame, -1, title, wxPoint(x, y), wxSize(w, h) )
1040 {
1041 CreateStatusBar(2);
1042
1043 m_panel = new MyPanel( this, 10, 10, 300, 100 );
1044 }
1045
1046 void MyFrame::OnQuit (wxCommandEvent& WXUNUSED(event) )
1047 {
1048 Close(TRUE);
1049 }
1050
1051 void MyFrame::OnAbout( wxCommandEvent& WXUNUSED(event) )
1052 {
1053 wxBeginBusyCursor();
1054
1055 wxMessageDialog dialog(this,
1056 "This is a text control sample. It demonstrates the many different\n"
1057 "text control styles, the use of the clipboard, setting and handling\n"
1058 "tooltips and intercepting key and char events.\n"
1059 "\n"
1060 "Copyright (c) 1999, Robert Roebling, Julian Smart, Vadim Zeitlin",
1061 "About wxTextCtrl Sample",
1062 wxOK | wxICON_INFORMATION);
1063
1064 dialog.ShowModal();
1065
1066 wxEndBusyCursor();
1067 }
1068
1069 #if wxUSE_TOOLTIPS
1070 void MyFrame::OnSetTooltipDelay(wxCommandEvent& event)
1071 {
1072 static long s_delay = 5000;
1073
1074 wxString delay;
1075 delay.Printf( _T("%ld"), s_delay);
1076
1077 delay = wxGetTextFromUser("Enter delay (in milliseconds)",
1078 "Set tooltip delay",
1079 delay,
1080 this);
1081 if ( !delay )
1082 return; // cancelled
1083
1084 wxSscanf(delay, _T("%ld"), &s_delay);
1085
1086 wxToolTip::SetDelay(s_delay);
1087
1088 wxLogStatus(this, _T("Tooltip delay set to %ld milliseconds"), s_delay);
1089 }
1090
1091 void MyFrame::OnToggleTooltips(wxCommandEvent& event)
1092 {
1093 static bool s_enabled = TRUE;
1094
1095 s_enabled = !s_enabled;
1096
1097 wxToolTip::Enable(s_enabled);
1098
1099 wxLogStatus(this, _T("Tooltips %sabled"), s_enabled ? _T("en") : _T("dis") );
1100 }
1101 #endif // tooltips
1102
1103 void MyFrame::OnLogClear(wxCommandEvent& WXUNUSED(event))
1104 {
1105 m_panel->m_log->Clear();
1106 }
1107
1108 void MyFrame::OnSetEditable(wxCommandEvent& WXUNUSED(event))
1109 {
1110 static bool s_editable = TRUE;
1111
1112 s_editable = !s_editable;
1113 m_panel->m_text->SetEditable(s_editable);
1114 m_panel->m_password->SetEditable(s_editable);
1115 m_panel->m_multitext->SetEditable(s_editable);
1116 m_panel->m_textrich->SetEditable(s_editable);
1117 }
1118
1119 void MyFrame::OnSetEnabled(wxCommandEvent& WXUNUSED(event))
1120 {
1121 bool enabled = m_panel->m_text->IsEnabled();
1122 enabled = !enabled;
1123
1124 m_panel->m_text->Enable(enabled);
1125 m_panel->m_password->Enable(enabled);
1126 m_panel->m_multitext->Enable(enabled);
1127 m_panel->m_readonly->Enable(enabled);
1128 m_panel->m_limited->Enable(enabled);
1129 m_panel->m_textrich->Enable(enabled);
1130 }
1131
1132 void MyFrame::OnFileSave(wxCommandEvent& event)
1133 {
1134 if ( m_panel->m_textrich->SaveFile("dummy.txt") )
1135 {
1136 #if wxUSE_FILE
1137 // verify that the fil length is correct (it wasn't under Win95)
1138 wxFile file(wxT("dummy.txt"));
1139 wxLogStatus(this, _T("Successfully saved file (text len = %ld, file size = %ld)"),
1140 m_panel->m_textrich->GetValue().length(),
1141 file.Length());
1142 #endif
1143 }
1144 else
1145 wxLogStatus(this, _T("Couldn't save the file"));
1146 }
1147
1148 void MyFrame::OnFileLoad(wxCommandEvent& event)
1149 {
1150 if ( m_panel->m_textrich->LoadFile("dummy.txt") )
1151 wxLogStatus(this, _T("Successfully loaded file"));
1152 else
1153 wxLogStatus(this, _T("Couldn't load the file"));
1154 }
1155
1156 void MyFrame::OnIdle( wxIdleEvent& event )
1157 {
1158 // track the window which has the focus in the status bar
1159 static wxWindow *s_windowFocus = (wxWindow *)NULL;
1160 wxWindow *focus = wxWindow::FindFocus();
1161 if ( focus && (focus != s_windowFocus) )
1162 {
1163 s_windowFocus = focus;
1164
1165 wxString msg;
1166 msg.Printf(
1167 #ifdef __WXMSW__
1168 _T("Focus: wxWindow = %p, HWND = %08x"),
1169 #else
1170 _T("Focus: wxWindow = %p"),
1171 #endif
1172 s_windowFocus
1173 #ifdef __WXMSW__
1174 , s_windowFocus->GetHWND()
1175 #endif
1176 );
1177
1178 SetStatusText(msg);
1179 }
1180 event.Skip();
1181 }