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