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