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