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