Merge in from trunk r67662 to r64801
[wxWidgets.git] / samples / text / text.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: text.cpp
3 // Purpose: TextCtrl wxWidgets sample
4 // Author: Robert Roebling
5 // Modified by:
6 // RCS-ID: $Id$
7 // Copyright: (c) Robert Roebling, Julian Smart, Vadim Zeitlin
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10
11 // For compilers that support precompilation, includes "wx/wx.h".
12 #include "wx/wxprec.h"
13
14 #ifdef __BORLANDC__
15 #pragma hdrstop
16 #endif
17
18 #ifndef WX_PRECOMP
19 #include "wx/wx.h"
20 #endif
21
22 #if wxUSE_CLIPBOARD
23 #include "wx/dataobj.h"
24 #include "wx/clipbrd.h"
25 #endif
26
27 #if wxUSE_FILE
28 #include "wx/file.h"
29 #endif
30
31 #if wxUSE_TOOLTIPS
32 #include "wx/tooltip.h"
33 #endif
34
35 // We test for wxUSE_DRAG_AND_DROP also, because data objects may not be
36 // implemented for compilers that can't cope with the OLE parts in
37 // wxUSE_DRAG_AND_DROP.
38 #if !wxUSE_DRAG_AND_DROP
39 #undef wxUSE_CLIPBOARD
40 #define wxUSE_CLIPBOARD 0
41 #endif
42
43 #include "wx/colordlg.h"
44 #include "wx/fontdlg.h"
45 #include "wx/numdlg.h"
46 #include "wx/tokenzr.h"
47
48 #ifndef __WXMSW__
49 #include "../sample.xpm"
50 #endif
51
52 //----------------------------------------------------------------------
53 // class definitions
54 //----------------------------------------------------------------------
55
56 class MyApp: public wxApp
57 {
58 public:
59 bool OnInit();
60 };
61
62 // a text ctrl which allows to call different wxTextCtrl functions
63 // interactively by pressing function keys in it
64 class MyTextCtrl : public wxTextCtrl
65 {
66 public:
67 MyTextCtrl(wxWindow *parent, wxWindowID id, const wxString &value,
68 const wxPoint &pos, const wxSize &size, int style = 0)
69 : wxTextCtrl(parent, id, value, pos, size, style)
70 {
71 m_hasCapture = false;
72 }
73
74 void OnKeyDown(wxKeyEvent& event);
75 void OnKeyUp(wxKeyEvent& event);
76 void OnChar(wxKeyEvent& event);
77
78 void OnText(wxCommandEvent& event);
79 void OnTextEnter(wxCommandEvent& event);
80 void OnTextURL(wxTextUrlEvent& event);
81 void OnTextMaxLen(wxCommandEvent& event);
82
83 void OnTextCut(wxClipboardTextEvent & event);
84 void OnTextCopy(wxClipboardTextEvent & event);
85 void OnTextPaste(wxClipboardTextEvent & event);
86
87 void OnMouseEvent(wxMouseEvent& event);
88
89 void OnSetFocus(wxFocusEvent& event);
90 void OnKillFocus(wxFocusEvent& event);
91
92 static bool ms_logKey;
93 static bool ms_logChar;
94 static bool ms_logMouse;
95 static bool ms_logText;
96 static bool ms_logFocus;
97 static bool ms_logClip;
98
99 private:
100 static inline wxChar GetChar(bool on, wxChar c) { return on ? c : wxT('-'); }
101
102 void LogKeyEvent(const wxChar *name, wxKeyEvent& event) const;
103 void LogClipEvent(const wxChar *what, wxClipboardTextEvent& event);
104
105 bool m_hasCapture;
106
107 DECLARE_EVENT_TABLE()
108 };
109
110 class MyPanel: public wxPanel
111 {
112 public:
113 MyPanel(wxFrame *frame, int x, int y, int w, int h);
114 virtual ~MyPanel()
115 {
116 #if wxUSE_LOG
117 delete wxLog::SetActiveTarget(m_logOld);
118 #endif // wxUSE_LOG
119 }
120
121 #if wxUSE_CLIPBOARD
122 void DoPasteFromClipboard();
123 void DoCopyToClipboard();
124 #endif // wxUSE_CLIPBOARD
125
126 void DoRemoveText();
127 void DoReplaceText();
128 void DoSelectText();
129 void DoMoveToEndOfText();
130 void DoMoveToEndOfEntry();
131
132 // return true if currently text control has any selection
133 bool HasSelection() const
134 {
135 long from, to;
136 GetFocusedText()->GetSelection(&from, &to);
137 return from != to;
138 }
139
140 MyTextCtrl *m_text;
141 MyTextCtrl *m_password;
142 MyTextCtrl *m_enter;
143 MyTextCtrl *m_tab;
144 MyTextCtrl *m_readonly;
145 MyTextCtrl *m_limited;
146
147 MyTextCtrl *m_multitext;
148 MyTextCtrl *m_horizontal;
149
150 MyTextCtrl *m_textrich;
151
152 #if wxUSE_LOG
153 wxTextCtrl *m_log;
154 wxLog *m_logOld;
155 #endif // wxUSE_LOG
156
157 private:
158 // get the currently focused text control or return the default one
159 // (m_multitext) is no text ctrl has focus -- in any case, returns
160 // something non NULL
161 wxTextCtrl *GetFocusedText() const;
162 };
163
164 class MyFrame: public wxFrame
165 {
166 public:
167 MyFrame(wxFrame *frame, const wxChar *title, int x, int y, int w, int h);
168
169 void OnQuit(wxCommandEvent& event);
170 void OnAbout(wxCommandEvent& event);
171 #if wxUSE_TOOLTIPS
172 void OnSetTooltipDelay(wxCommandEvent& event);
173 void OnToggleTooltips(wxCommandEvent& event);
174 #endif // wxUSE_TOOLTIPS
175
176 #if wxUSE_CLIPBOARD
177 void OnPasteFromClipboard( wxCommandEvent& WXUNUSED(event) )
178 {
179 wxLogMessage(wxT("Pasting text from clipboard."));
180 m_panel->DoPasteFromClipboard();
181 }
182 void OnCopyToClipboard( wxCommandEvent& WXUNUSED(event) )
183 {
184 wxLogMessage(wxT("Copying text to clipboard."));
185 m_panel->DoCopyToClipboard();
186 }
187
188 void OnUpdatePasteFromClipboard(wxUpdateUIEvent& event)
189 {
190 wxClipboardLocker lockClip;
191
192 event.Enable( wxTheClipboard->IsSupported(wxDF_TEXT) );
193 }
194
195 void OnUpdateCopyToClipboard(wxUpdateUIEvent& event)
196 {
197 event.Enable( m_panel->HasSelection() );
198 }
199 #endif // wxUSE_CLIPBOARD
200
201 void OnAddTextLine(wxCommandEvent& WXUNUSED(event))
202 {
203 static int s_n = 0;
204 m_panel->m_textrich->AppendText(wxString::Format("Line %d\n", ++s_n));
205 }
206
207 void OnAddTextFreeze( wxCommandEvent& WXUNUSED(event) )
208 { DoAddText(true); }
209 void OnAddText( wxCommandEvent& WXUNUSED(event) )
210 { DoAddText(false); }
211 void OnRemoveText( wxCommandEvent& WXUNUSED(event) )
212 { m_panel->DoRemoveText(); }
213 void OnReplaceText( wxCommandEvent& WXUNUSED(event) )
214 { m_panel->DoReplaceText(); }
215 void OnSelectText( wxCommandEvent& WXUNUSED(event) )
216 { m_panel->DoSelectText(); }
217
218 void OnMoveToEndOfText( wxCommandEvent& WXUNUSED(event) )
219 { m_panel->DoMoveToEndOfText(); }
220 void OnMoveToEndOfEntry( wxCommandEvent& WXUNUSED(event) )
221 { m_panel->DoMoveToEndOfEntry(); }
222
223 void OnScrollLineDown(wxCommandEvent& WXUNUSED(event))
224 {
225 if ( !m_panel->m_textrich->LineDown() )
226 {
227 wxLogMessage(wxT("Already at the bottom"));
228 }
229 }
230
231 void OnScrollLineUp(wxCommandEvent& WXUNUSED(event))
232 {
233 if ( !m_panel->m_textrich->LineUp() )
234 {
235 wxLogMessage(wxT("Already at the top"));
236 }
237 }
238
239 void OnScrollPageDown(wxCommandEvent& WXUNUSED(event))
240 {
241 if ( !m_panel->m_textrich->PageDown() )
242 {
243 wxLogMessage(wxT("Already at the bottom"));
244 }
245 }
246
247 void OnScrollPageUp(wxCommandEvent& WXUNUSED(event))
248 {
249 if ( !m_panel->m_textrich->PageUp() )
250 {
251 wxLogMessage(wxT("Already at the top"));
252 }
253 }
254
255 void OnGetLine(wxCommandEvent& WXUNUSED(event))
256 {
257 long nLine = wxGetNumberFromUser(wxT("Which line would you like to get?"),
258 wxT("Enter which line you would like to get"),
259 wxT("Get a line from the tabbed multiline text control") );
260
261 wxMessageBox(m_panel->m_tab->GetLineText(nLine));
262 }
263
264 void OnGetLineLength(wxCommandEvent& WXUNUSED(event))
265 {
266 long nLine = wxGetNumberFromUser(wxT("Which line would you like to get?"),
267 wxT("Enter which line you would like to get"),
268 wxT("Get length of a line from the tabbed multiline text control") );
269
270 wxMessageBox(wxString::Format(wxT("Length of line %i is:%i"),
271 (int) nLine,
272 m_panel->m_tab->GetLineLength(nLine))
273 );
274 }
275
276 #if wxUSE_LOG
277 void OnLogClear(wxCommandEvent& event);
278 #endif // wxUSE_LOG
279 void OnFileSave(wxCommandEvent& event);
280 void OnFileLoad(wxCommandEvent& event);
281 void OnRichTextTest(wxCommandEvent& event);
282
283 void OnSetEditable(wxCommandEvent& event);
284 void OnSetEnabled(wxCommandEvent& event);
285
286 void OnLogKey(wxCommandEvent& event)
287 {
288 MyTextCtrl::ms_logKey = event.IsChecked();
289 }
290
291 void OnLogChar(wxCommandEvent& event)
292 {
293 MyTextCtrl::ms_logChar = event.IsChecked();
294 }
295
296 void OnLogMouse(wxCommandEvent& event)
297 {
298 MyTextCtrl::ms_logMouse = event.IsChecked();
299 }
300
301 void OnLogText(wxCommandEvent& event)
302 {
303 MyTextCtrl::ms_logText = event.IsChecked();
304 }
305
306 void OnLogFocus(wxCommandEvent& event)
307 {
308 MyTextCtrl::ms_logFocus = event.IsChecked();
309 }
310
311 void OnLogClip(wxCommandEvent& event)
312 {
313 MyTextCtrl::ms_logClip = event.IsChecked();
314 }
315
316 void OnSetText(wxCommandEvent& WXUNUSED(event))
317 {
318 m_panel->m_text->SetValue(wxT("Hello, world! (what else did you expect?)"));
319 }
320
321 void OnChangeText(wxCommandEvent& WXUNUSED(event))
322 {
323 m_panel->m_text->ChangeValue(wxT("Changed, not set: no event"));
324 }
325
326 void OnIdle( wxIdleEvent& event );
327
328 private:
329 void DoAddText(bool freeze)
330 {
331 wxTextCtrl * const text = m_panel->m_textrich;
332
333 if ( freeze )
334 text->Freeze();
335
336 text->Clear();
337
338 for ( int i = 0; i < 100; i++ )
339 {
340 text->AppendText(wxString::Format(wxT("Line %i\n"), i));
341 }
342
343 text->SetInsertionPoint(0);
344
345 if ( freeze )
346 text->Thaw();
347 }
348
349 MyPanel *m_panel;
350
351 DECLARE_EVENT_TABLE()
352 };
353
354 /*
355 * RichTextFrame is used to demonstrate rich text behaviour
356 */
357
358 class RichTextFrame: public wxFrame
359 {
360 public:
361 RichTextFrame(wxWindow* parent, const wxString& title);
362
363 // Event handlers
364
365 void OnClose(wxCommandEvent& event);
366 void OnIdle(wxIdleEvent& event);
367 void OnLeftAlign(wxCommandEvent& event);
368 void OnRightAlign(wxCommandEvent& event);
369 void OnJustify(wxCommandEvent& event);
370 void OnCentre(wxCommandEvent& event);
371 void OnChangeFont(wxCommandEvent& event);
372 void OnChangeTextColour(wxCommandEvent& event);
373 void OnChangeBackgroundColour(wxCommandEvent& event);
374 void OnLeftIndent(wxCommandEvent& event);
375 void OnRightIndent(wxCommandEvent& event);
376 void OnTabStops(wxCommandEvent& event);
377
378 private:
379 wxTextCtrl *m_textCtrl;
380 long m_currentPosition;
381
382 DECLARE_EVENT_TABLE()
383 };
384
385 //----------------------------------------------------------------------
386 // main()
387 //----------------------------------------------------------------------
388
389 IMPLEMENT_APP(MyApp)
390
391 //----------------------------------------------------------------------
392 // MyApp
393 //----------------------------------------------------------------------
394
395 enum
396 {
397 TEXT_QUIT = wxID_EXIT,
398 TEXT_ABOUT = wxID_ABOUT,
399 TEXT_LOAD = 101,
400 TEXT_SAVE,
401 TEXT_CLEAR,
402 TEXT_RICH_TEXT_TEST,
403
404 // clipboard menu
405 TEXT_CLIPBOARD_COPY = 200,
406 TEXT_CLIPBOARD_PASTE,
407 TEXT_CLIPBOARD_VETO,
408
409 // tooltip menu
410 TEXT_TOOLTIPS_SETDELAY = 300,
411 TEXT_TOOLTIPS_ENABLE,
412
413 // text menu
414 TEXT_ADD_SOME = 400,
415 TEXT_ADD_FREEZE,
416 TEXT_ADD_LINE,
417 TEXT_MOVE_ENDTEXT,
418 TEXT_MOVE_ENDENTRY,
419 TEXT_SET_EDITABLE,
420 TEXT_SET_ENABLED,
421 TEXT_LINE_DOWN,
422 TEXT_LINE_UP,
423 TEXT_PAGE_DOWN,
424 TEXT_PAGE_UP,
425
426 TEXT_GET_LINE,
427 TEXT_GET_LINELENGTH,
428
429 TEXT_REMOVE,
430 TEXT_REPLACE,
431 TEXT_SELECT,
432 TEXT_SET,
433 TEXT_CHANGE,
434
435 // log menu
436 TEXT_LOG_KEY,
437 TEXT_LOG_CHAR,
438 TEXT_LOG_MOUSE,
439 TEXT_LOG_TEXT,
440 TEXT_LOG_FOCUS,
441 TEXT_LOG_CLIP,
442
443 TEXT_END
444 };
445
446 bool MyApp::OnInit()
447 {
448 if ( !wxApp::OnInit() )
449 return false;
450
451 // Create the main frame window
452 MyFrame *frame = new MyFrame((wxFrame *) NULL,
453 wxT("Text wxWidgets sample"), 50, 50, 700, 550);
454 frame->SetSizeHints( 500, 400 );
455
456 wxMenu *file_menu = new wxMenu;
457 file_menu->Append(TEXT_SAVE, wxT("&Save file\tCtrl-S"),
458 wxT("Save the text control contents to file"));
459 file_menu->Append(TEXT_LOAD, wxT("&Load file\tCtrl-O"),
460 wxT("Load the sample file into text control"));
461 file_menu->AppendSeparator();
462 file_menu->Append(TEXT_RICH_TEXT_TEST, wxT("Show Rich Text Editor"));
463 file_menu->AppendSeparator();
464 file_menu->Append(TEXT_ABOUT, wxT("&About\tAlt-A"));
465 file_menu->AppendSeparator();
466 file_menu->Append(TEXT_QUIT, wxT("E&xit\tAlt-X"), wxT("Quit this sample"));
467
468 wxMenuBar *menu_bar = new wxMenuBar( wxMB_DOCKABLE );
469 menu_bar->Append(file_menu, wxT("&File"));
470
471 #if wxUSE_TOOLTIPS
472 wxMenu *tooltip_menu = new wxMenu;
473 tooltip_menu->Append(TEXT_TOOLTIPS_SETDELAY, wxT("Set &delay\tCtrl-D"));
474 tooltip_menu->AppendSeparator();
475 tooltip_menu->Append(TEXT_TOOLTIPS_ENABLE, wxT("&Toggle tooltips\tCtrl-T"),
476 wxT("enable/disable tooltips"), true);
477 tooltip_menu->Check(TEXT_TOOLTIPS_ENABLE, true);
478 menu_bar->Append(tooltip_menu, wxT("&Tooltips"));
479 #endif // wxUSE_TOOLTIPS
480
481 #if wxUSE_CLIPBOARD
482 // notice that we use non default accelerators on purpose here to compare
483 // their behaviour with the built in handling of standard Ctrl/Cmd-C/V
484 wxMenu *menuClipboard = new wxMenu;
485 menuClipboard->Append(TEXT_CLIPBOARD_COPY, wxT("&Copy\tCtrl-Shift-C"),
486 wxT("Copy the selection to the clipboard"));
487 menuClipboard->Append(TEXT_CLIPBOARD_PASTE, wxT("&Paste\tCtrl-Shift-V"),
488 wxT("Paste from clipboard to the text control"));
489 menuClipboard->AppendSeparator();
490 menuClipboard->AppendCheckItem(TEXT_CLIPBOARD_VETO, wxT("Vet&o\tCtrl-Shift-O"),
491 wxT("Veto all clipboard operations"));
492 menu_bar->Append(menuClipboard, wxT("&Clipboard"));
493 #endif // wxUSE_CLIPBOARD
494
495 wxMenu *menuText = new wxMenu;
496 menuText->Append(TEXT_ADD_SOME, wxT("&Append some text\tCtrl-A"));
497 menuText->Append(TEXT_ADD_FREEZE, wxT("&Append text with freeze/thaw\tShift-Ctrl-A"));
498 menuText->Append(TEXT_ADD_LINE, wxT("Append a new &line\tAlt-Shift-A"));
499 menuText->Append(TEXT_REMOVE, wxT("&Remove first 10 characters\tCtrl-Y"));
500 menuText->Append(TEXT_REPLACE, wxT("&Replace characters 4 to 8 with ABC\tCtrl-R"));
501 menuText->Append(TEXT_SELECT, wxT("&Select characters 4 to 8\tCtrl-I"));
502 menuText->Append(TEXT_SET, wxT("&Set the first text zone value\tCtrl-E"));
503 menuText->Append(TEXT_CHANGE, wxT("&Change the first text zone value\tShift-Ctrl-E"));
504 menuText->AppendSeparator();
505 menuText->Append(TEXT_MOVE_ENDTEXT, wxT("Move cursor to the end of &text"));
506 menuText->Append(TEXT_MOVE_ENDENTRY, wxT("Move cursor to the end of &entry"));
507 menuText->AppendCheckItem(TEXT_SET_EDITABLE, wxT("Toggle &editable state"));
508 menuText->AppendCheckItem(TEXT_SET_ENABLED, wxT("Toggle e&nabled state"));
509 menuText->Check(TEXT_SET_EDITABLE, true);
510 menuText->Check(TEXT_SET_ENABLED, true);
511 menuText->AppendSeparator();
512 menuText->Append(TEXT_LINE_DOWN, wxT("Scroll text one line down"));
513 menuText->Append(TEXT_LINE_UP, wxT("Scroll text one line up"));
514 menuText->Append(TEXT_PAGE_DOWN, wxT("Scroll text one page down"));
515 menuText->Append(TEXT_PAGE_UP, wxT("Scroll text one page up"));
516 menuText->AppendSeparator();
517 menuText->Append(TEXT_GET_LINE, wxT("Get the text of a line of the tabbed multiline"));
518 menuText->Append(TEXT_GET_LINELENGTH, wxT("Get the length of a line of the tabbed multiline"));
519 menu_bar->Append(menuText, wxT("Te&xt"));
520
521 #if wxUSE_LOG
522 wxMenu *menuLog = new wxMenu;
523 menuLog->AppendCheckItem(TEXT_LOG_KEY, wxT("Log &key events"));
524 menuLog->AppendCheckItem(TEXT_LOG_CHAR, wxT("Log &char events"));
525 menuLog->AppendCheckItem(TEXT_LOG_MOUSE, wxT("Log &mouse events"));
526 menuLog->AppendCheckItem(TEXT_LOG_TEXT, wxT("Log &text events"));
527 menuLog->AppendCheckItem(TEXT_LOG_FOCUS, wxT("Log &focus events"));
528 menuLog->AppendCheckItem(TEXT_LOG_CLIP, wxT("Log clip&board events"));
529 menuLog->AppendSeparator();
530 menuLog->Append(TEXT_CLEAR, wxT("&Clear the log\tCtrl-L"),
531 wxT("Clear the log window contents"));
532
533 // select only the interesting events by default
534 MyTextCtrl::ms_logClip =
535 MyTextCtrl::ms_logText = true;
536
537 menuLog->Check(TEXT_LOG_KEY, MyTextCtrl::ms_logKey);
538 menuLog->Check(TEXT_LOG_CHAR, MyTextCtrl::ms_logChar);
539 menuLog->Check(TEXT_LOG_TEXT, MyTextCtrl::ms_logText);
540
541 menu_bar->Append(menuLog, wxT("&Log"));
542 #endif // wxUSE_LOG
543
544 frame->SetMenuBar(menu_bar);
545
546 frame->Show(true);
547
548 // report success
549 return true;
550 }
551
552 //----------------------------------------------------------------------
553 // MyTextCtrl
554 //----------------------------------------------------------------------
555
556 BEGIN_EVENT_TABLE(MyTextCtrl, wxTextCtrl)
557 EVT_KEY_DOWN(MyTextCtrl::OnKeyDown)
558 EVT_KEY_UP(MyTextCtrl::OnKeyUp)
559 EVT_CHAR(MyTextCtrl::OnChar)
560
561 EVT_TEXT(wxID_ANY, MyTextCtrl::OnText)
562 EVT_TEXT_ENTER(wxID_ANY, MyTextCtrl::OnTextEnter)
563 EVT_TEXT_URL(wxID_ANY, MyTextCtrl::OnTextURL)
564 EVT_TEXT_MAXLEN(wxID_ANY, MyTextCtrl::OnTextMaxLen)
565 EVT_TEXT_CUT(wxID_ANY, MyTextCtrl::OnTextCut)
566 EVT_TEXT_COPY(wxID_ANY, MyTextCtrl::OnTextCopy)
567 EVT_TEXT_PASTE(wxID_ANY, MyTextCtrl::OnTextPaste)
568
569 EVT_MOUSE_EVENTS(MyTextCtrl::OnMouseEvent)
570
571 EVT_SET_FOCUS(MyTextCtrl::OnSetFocus)
572 EVT_KILL_FOCUS(MyTextCtrl::OnKillFocus)
573 END_EVENT_TABLE()
574
575 bool MyTextCtrl::ms_logKey = false;
576 bool MyTextCtrl::ms_logChar = false;
577 bool MyTextCtrl::ms_logMouse = false;
578 bool MyTextCtrl::ms_logText = false;
579 bool MyTextCtrl::ms_logFocus = false;
580 bool MyTextCtrl::ms_logClip = false;
581
582 void MyTextCtrl::LogKeyEvent(const wxChar *name, wxKeyEvent& event) const
583 {
584 wxString key;
585 long keycode = event.GetKeyCode();
586 {
587 switch ( keycode )
588 {
589 case WXK_BACK: key = wxT("BACK"); break;
590 case WXK_TAB: key = wxT("TAB"); break;
591 case WXK_RETURN: key = wxT("RETURN"); break;
592 case WXK_ESCAPE: key = wxT("ESCAPE"); break;
593 case WXK_SPACE: key = wxT("SPACE"); break;
594 case WXK_DELETE: key = wxT("DELETE"); break;
595 case WXK_START: key = wxT("START"); break;
596 case WXK_LBUTTON: key = wxT("LBUTTON"); break;
597 case WXK_RBUTTON: key = wxT("RBUTTON"); break;
598 case WXK_CANCEL: key = wxT("CANCEL"); break;
599 case WXK_MBUTTON: key = wxT("MBUTTON"); break;
600 case WXK_CLEAR: key = wxT("CLEAR"); break;
601 case WXK_SHIFT: key = wxT("SHIFT"); break;
602 case WXK_ALT: key = wxT("ALT"); break;
603 case WXK_CONTROL: key = wxT("CONTROL"); break;
604 case WXK_MENU: key = wxT("MENU"); break;
605 case WXK_PAUSE: key = wxT("PAUSE"); break;
606 case WXK_CAPITAL: key = wxT("CAPITAL"); break;
607 case WXK_END: key = wxT("END"); break;
608 case WXK_HOME: key = wxT("HOME"); break;
609 case WXK_LEFT: key = wxT("LEFT"); break;
610 case WXK_UP: key = wxT("UP"); break;
611 case WXK_RIGHT: key = wxT("RIGHT"); break;
612 case WXK_DOWN: key = wxT("DOWN"); break;
613 case WXK_SELECT: key = wxT("SELECT"); break;
614 case WXK_PRINT: key = wxT("PRINT"); break;
615 case WXK_EXECUTE: key = wxT("EXECUTE"); break;
616 case WXK_SNAPSHOT: key = wxT("SNAPSHOT"); break;
617 case WXK_INSERT: key = wxT("INSERT"); break;
618 case WXK_HELP: key = wxT("HELP"); break;
619 case WXK_NUMPAD0: key = wxT("NUMPAD0"); break;
620 case WXK_NUMPAD1: key = wxT("NUMPAD1"); break;
621 case WXK_NUMPAD2: key = wxT("NUMPAD2"); break;
622 case WXK_NUMPAD3: key = wxT("NUMPAD3"); break;
623 case WXK_NUMPAD4: key = wxT("NUMPAD4"); break;
624 case WXK_NUMPAD5: key = wxT("NUMPAD5"); break;
625 case WXK_NUMPAD6: key = wxT("NUMPAD6"); break;
626 case WXK_NUMPAD7: key = wxT("NUMPAD7"); break;
627 case WXK_NUMPAD8: key = wxT("NUMPAD8"); break;
628 case WXK_NUMPAD9: key = wxT("NUMPAD9"); break;
629 case WXK_MULTIPLY: key = wxT("MULTIPLY"); break;
630 case WXK_ADD: key = wxT("ADD"); break;
631 case WXK_SEPARATOR: key = wxT("SEPARATOR"); break;
632 case WXK_SUBTRACT: key = wxT("SUBTRACT"); break;
633 case WXK_DECIMAL: key = wxT("DECIMAL"); break;
634 case WXK_DIVIDE: key = wxT("DIVIDE"); break;
635 case WXK_F1: key = wxT("F1"); break;
636 case WXK_F2: key = wxT("F2"); break;
637 case WXK_F3: key = wxT("F3"); break;
638 case WXK_F4: key = wxT("F4"); break;
639 case WXK_F5: key = wxT("F5"); break;
640 case WXK_F6: key = wxT("F6"); break;
641 case WXK_F7: key = wxT("F7"); break;
642 case WXK_F8: key = wxT("F8"); break;
643 case WXK_F9: key = wxT("F9"); break;
644 case WXK_F10: key = wxT("F10"); break;
645 case WXK_F11: key = wxT("F11"); break;
646 case WXK_F12: key = wxT("F12"); break;
647 case WXK_F13: key = wxT("F13"); break;
648 case WXK_F14: key = wxT("F14"); break;
649 case WXK_F15: key = wxT("F15"); break;
650 case WXK_F16: key = wxT("F16"); break;
651 case WXK_F17: key = wxT("F17"); break;
652 case WXK_F18: key = wxT("F18"); break;
653 case WXK_F19: key = wxT("F19"); break;
654 case WXK_F20: key = wxT("F20"); break;
655 case WXK_F21: key = wxT("F21"); break;
656 case WXK_F22: key = wxT("F22"); break;
657 case WXK_F23: key = wxT("F23"); break;
658 case WXK_F24: key = wxT("F24"); break;
659 case WXK_NUMLOCK: key = wxT("NUMLOCK"); break;
660 case WXK_SCROLL: key = wxT("SCROLL"); break;
661 case WXK_PAGEUP: key = wxT("PAGEUP"); break;
662 case WXK_PAGEDOWN: key = wxT("PAGEDOWN"); break;
663 case WXK_NUMPAD_SPACE: key = wxT("NUMPAD_SPACE"); break;
664 case WXK_NUMPAD_TAB: key = wxT("NUMPAD_TAB"); break;
665 case WXK_NUMPAD_ENTER: key = wxT("NUMPAD_ENTER"); break;
666 case WXK_NUMPAD_F1: key = wxT("NUMPAD_F1"); break;
667 case WXK_NUMPAD_F2: key = wxT("NUMPAD_F2"); break;
668 case WXK_NUMPAD_F3: key = wxT("NUMPAD_F3"); break;
669 case WXK_NUMPAD_F4: key = wxT("NUMPAD_F4"); break;
670 case WXK_NUMPAD_HOME: key = wxT("NUMPAD_HOME"); break;
671 case WXK_NUMPAD_LEFT: key = wxT("NUMPAD_LEFT"); break;
672 case WXK_NUMPAD_UP: key = wxT("NUMPAD_UP"); break;
673 case WXK_NUMPAD_RIGHT: key = wxT("NUMPAD_RIGHT"); break;
674 case WXK_NUMPAD_DOWN: key = wxT("NUMPAD_DOWN"); break;
675 case WXK_NUMPAD_PAGEUP: key = wxT("NUMPAD_PAGEUP"); break;
676 case WXK_NUMPAD_PAGEDOWN: key = wxT("NUMPAD_PAGEDOWN"); break;
677 case WXK_NUMPAD_END: key = wxT("NUMPAD_END"); break;
678 case WXK_NUMPAD_BEGIN: key = wxT("NUMPAD_BEGIN"); break;
679 case WXK_NUMPAD_INSERT: key = wxT("NUMPAD_INSERT"); break;
680 case WXK_NUMPAD_DELETE: key = wxT("NUMPAD_DELETE"); break;
681 case WXK_NUMPAD_EQUAL: key = wxT("NUMPAD_EQUAL"); break;
682 case WXK_NUMPAD_MULTIPLY: key = wxT("NUMPAD_MULTIPLY"); break;
683 case WXK_NUMPAD_ADD: key = wxT("NUMPAD_ADD"); break;
684 case WXK_NUMPAD_SEPARATOR: key = wxT("NUMPAD_SEPARATOR"); break;
685 case WXK_NUMPAD_SUBTRACT: key = wxT("NUMPAD_SUBTRACT"); break;
686 case WXK_NUMPAD_DECIMAL: key = wxT("NUMPAD_DECIMAL"); break;
687
688 default:
689 {
690 if ( wxIsprint((int)keycode) )
691 key.Printf(wxT("'%c'"), (char)keycode);
692 else if ( keycode > 0 && keycode < 27 )
693 key.Printf(_("Ctrl-%c"), wxT('A') + keycode - 1);
694 else
695 key.Printf(wxT("unknown (%ld)"), keycode);
696 }
697 }
698 }
699
700 #if wxUSE_UNICODE
701 key += wxString::Format(wxT(" (Unicode: %#04x)"), event.GetUnicodeKey());
702 #endif // wxUSE_UNICODE
703
704 wxLogMessage( wxT("%s event: %s (flags = %c%c%c%c)"),
705 name,
706 key.c_str(),
707 GetChar( event.ControlDown(), wxT('C') ),
708 GetChar( event.AltDown(), wxT('A') ),
709 GetChar( event.ShiftDown(), wxT('S') ),
710 GetChar( event.MetaDown(), wxT('M') ) );
711 }
712
713 static wxString GetMouseEventDesc(const wxMouseEvent& ev)
714 {
715 // click event
716 wxString button;
717 bool dbl, up;
718 if ( ev.LeftDown() || ev.LeftUp() || ev.LeftDClick() )
719 {
720 button = wxT("Left");
721 dbl = ev.LeftDClick();
722 up = ev.LeftUp();
723 }
724 else if ( ev.MiddleDown() || ev.MiddleUp() || ev.MiddleDClick() )
725 {
726 button = wxT("Middle");
727 dbl = ev.MiddleDClick();
728 up = ev.MiddleUp();
729 }
730 else if ( ev.RightDown() || ev.RightUp() || ev.RightDClick() )
731 {
732 button = wxT("Right");
733 dbl = ev.RightDClick();
734 up = ev.RightUp();
735 }
736 else if ( ev.Aux1Down() || ev.Aux1Up() || ev.Aux1DClick() )
737 {
738 button = wxT("Aux1");
739 dbl = ev.Aux1DClick();
740 up = ev.Aux1Up();
741 }
742 else if ( ev.Aux2Down() || ev.Aux2Up() || ev.Aux2DClick() )
743 {
744 button = wxT("Aux2");
745 dbl = ev.Aux2DClick();
746 up = ev.Aux2Up();
747 }
748 else if ( ev.GetWheelRotation() )
749 {
750 return wxString::Format("Wheel rotation %+d", ev.GetWheelRotation());
751 }
752 else
753 {
754 return wxT("Unknown mouse event");
755 }
756 wxASSERT(!(dbl && up));
757
758 return wxString::Format(wxT("%s mouse button %s"),
759 button.c_str(),
760 dbl ? wxT("double clicked")
761 : up ? wxT("released") : wxT("clicked"));
762 }
763
764 void MyTextCtrl::OnMouseEvent(wxMouseEvent& ev)
765 {
766 ev.Skip();
767
768 if ( !ms_logMouse )
769 return;
770
771 if ( !ev.Moving() )
772 {
773 wxString msg;
774 if ( ev.Entering() )
775 {
776 msg = wxT("Mouse entered the window");
777 }
778 else if ( ev.Leaving() )
779 {
780 msg = wxT("Mouse left the window");
781 }
782 else
783 {
784 msg = GetMouseEventDesc(ev);
785 }
786
787 msg << wxT(" at (") << ev.GetX() << wxT(", ") << ev.GetY() << wxT(") ");
788
789 long pos;
790 wxTextCtrlHitTestResult rc = HitTest(ev.GetPosition(), &pos);
791 if ( rc != wxTE_HT_UNKNOWN )
792 {
793 msg << wxT("at position ") << pos << wxT(' ');
794 }
795
796 msg << wxT("[Flags: ")
797 << GetChar( ev.LeftIsDown(), wxT('1') )
798 << GetChar( ev.MiddleIsDown(), wxT('2') )
799 << GetChar( ev.RightIsDown(), wxT('3') )
800 << GetChar( ev.Aux1IsDown(), wxT('x') )
801 << GetChar( ev.Aux2IsDown(), wxT('X') )
802 << GetChar( ev.ControlDown(), wxT('C') )
803 << GetChar( ev.AltDown(), wxT('A') )
804 << GetChar( ev.ShiftDown(), wxT('S') )
805 << GetChar( ev.MetaDown(), wxT('M') )
806 << wxT(']');
807
808 wxLogMessage(msg);
809 }
810 //else: we're not interested in mouse move events
811 }
812
813 void MyTextCtrl::OnSetFocus(wxFocusEvent& event)
814 {
815 if ( ms_logFocus )
816 {
817 wxLogMessage( wxT("%p got focus."), this);
818 }
819
820 event.Skip();
821 }
822
823 void MyTextCtrl::OnKillFocus(wxFocusEvent& event)
824 {
825 if ( ms_logFocus )
826 {
827 wxLogMessage( wxT("%p lost focus"), this);
828 }
829
830 event.Skip();
831 }
832
833 void MyTextCtrl::OnText(wxCommandEvent& event)
834 {
835 if ( !ms_logText )
836 return;
837
838 MyTextCtrl *win = (MyTextCtrl *)event.GetEventObject();
839 const wxChar *changeVerb = win->IsModified() ? wxT("changed")
840 : wxT("set by program");
841 const wxChar *data = (const wxChar *)(win->GetClientData());
842 if ( data )
843 {
844 wxLogMessage(wxT("Text %s in control \"%s\""), changeVerb, data);
845 }
846 else
847 {
848 wxLogMessage(wxT("Text %s in some control"), changeVerb);
849 }
850 }
851
852 void MyTextCtrl::OnTextEnter(wxCommandEvent& event)
853 {
854 if ( !ms_logText )
855 return;
856
857 MyTextCtrl *win = (MyTextCtrl *)event.GetEventObject();
858 const wxChar *data = (const wxChar *)(win->GetClientData());
859 if ( data )
860 {
861 wxLogMessage(wxT("Enter pressed in control '%s'"), data);
862 }
863 else
864 {
865 wxLogMessage(wxT("Enter pressed in some control"));
866 }
867 }
868
869 void MyTextCtrl::OnTextMaxLen(wxCommandEvent& WXUNUSED(event))
870 {
871 wxLogMessage(wxT("You can't enter more characters into this control."));
872 }
873
874
875 void MyTextCtrl::OnTextCut(wxClipboardTextEvent& event)
876 {
877 LogClipEvent(wxT("cut to"), event);
878 }
879
880 void MyTextCtrl::OnTextCopy(wxClipboardTextEvent& event)
881 {
882 LogClipEvent(wxT("copied to"), event);
883 }
884
885 void MyTextCtrl::OnTextPaste(wxClipboardTextEvent& event)
886 {
887 LogClipEvent(wxT("pasted from"), event);
888 }
889
890 void MyTextCtrl::LogClipEvent(const wxChar *what, wxClipboardTextEvent& event)
891 {
892 wxFrame *frame = wxDynamicCast(wxGetTopLevelParent(this), wxFrame);
893 wxCHECK_RET( frame, wxT("no parent frame?") );
894
895 const bool veto = frame->GetMenuBar()->IsChecked(TEXT_CLIPBOARD_VETO);
896 if ( !veto )
897 event.Skip();
898
899 if ( ms_logClip )
900 {
901 wxLogMessage(wxT("Text %s%s the clipboard."),
902 veto ? wxT("not ") : wxT(""), what);
903 }
904 }
905
906
907 void MyTextCtrl::OnTextURL(wxTextUrlEvent& event)
908 {
909 const wxMouseEvent& ev = event.GetMouseEvent();
910
911 // filter out mouse moves, too many of them
912 if ( ev.Moving() )
913 return;
914
915 long start = event.GetURLStart(),
916 end = event.GetURLEnd();
917
918 wxLogMessage(wxT("Mouse event over URL '%s': %s"),
919 GetValue().Mid(start, end - start).c_str(),
920 GetMouseEventDesc(ev).c_str());
921 }
922
923 void MyTextCtrl::OnChar(wxKeyEvent& event)
924 {
925 if ( ms_logChar )
926 LogKeyEvent( wxT("Char"), event);
927
928 event.Skip();
929 }
930
931 void MyTextCtrl::OnKeyUp(wxKeyEvent& event)
932 {
933 if ( ms_logKey )
934 LogKeyEvent( wxT("Key up"), event);
935
936 event.Skip();
937 }
938
939 void MyTextCtrl::OnKeyDown(wxKeyEvent& event)
940 {
941 switch ( event.GetKeyCode() )
942 {
943 case WXK_F1:
944 // show current position and text length
945 {
946 long line, column, pos = GetInsertionPoint();
947 PositionToXY(pos, &column, &line);
948
949 wxLogMessage(wxT("Current position: %ld\nCurrent line, column: (%ld, %ld)\nNumber of lines: %ld\nCurrent line length: %ld\nTotal text length: %u (%ld)"),
950 pos,
951 line, column,
952 (long) GetNumberOfLines(),
953 (long) GetLineLength(line),
954 (unsigned int) GetValue().length(),
955 GetLastPosition());
956
957 long from, to;
958 GetSelection(&from, &to);
959
960 wxString sel = GetStringSelection();
961
962 wxLogMessage(wxT("Selection: from %ld to %ld."), from, to);
963 wxLogMessage(wxT("Selection = '%s' (len = %u)"),
964 sel.c_str(),
965 (unsigned int) sel.length());
966
967 const wxString text = GetLineText(line);
968 wxLogMessage(wxT("Current line: \"%s\"; length = %lu"),
969 text.c_str(), text.length());
970 }
971 break;
972
973 case WXK_F2:
974 // go to the end
975 SetInsertionPointEnd();
976 break;
977
978 case WXK_F3:
979 // go to position 10
980 SetInsertionPoint(10);
981 break;
982
983 case WXK_F4:
984 if (!m_hasCapture)
985 {
986 wxLogDebug( wxT("Now capturing mouse and events.") );
987 m_hasCapture = true;
988 CaptureMouse();
989 }
990 else
991 {
992 wxLogDebug( wxT("Stopped capturing mouse and events.") );
993 m_hasCapture = false;
994 ReleaseMouse();
995 }
996 break;
997
998 case WXK_F5:
999 // insert a blank line
1000 WriteText(wxT("\n"));
1001 break;
1002
1003 case WXK_F6:
1004 wxLogMessage(wxT("IsModified() before SetValue(): %d"),
1005 IsModified());
1006 ChangeValue(wxT("ChangeValue() has been called"));
1007 wxLogMessage(wxT("IsModified() after SetValue(): %d"),
1008 IsModified());
1009 break;
1010
1011 case WXK_F7:
1012 wxLogMessage(wxT("Position 10 should be now visible."));
1013 ShowPosition(10);
1014 break;
1015
1016 case WXK_F8:
1017 wxLogMessage(wxT("Control has been cleared"));
1018 Clear();
1019 break;
1020
1021 case WXK_F9:
1022 WriteText(wxT("WriteText() has been called"));
1023 break;
1024
1025 case WXK_F10:
1026 AppendText(wxT("AppendText() has been called"));
1027 break;
1028
1029 case WXK_F11:
1030 DiscardEdits();
1031 wxLogMessage(wxT("Control marked as non modified"));
1032 break;
1033 }
1034
1035 if ( ms_logKey )
1036 LogKeyEvent( wxT("Key down"), event);
1037
1038 event.Skip();
1039 }
1040
1041 //----------------------------------------------------------------------
1042 // MyPanel
1043 //----------------------------------------------------------------------
1044
1045 MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
1046 : wxPanel( frame, wxID_ANY, wxPoint(x, y), wxSize(w, h) )
1047 {
1048 #if wxUSE_LOG
1049 m_log = new wxTextCtrl( this, wxID_ANY, wxT("This is the log window.\n"),
1050 wxPoint(5,260), wxSize(630,100),
1051 wxTE_MULTILINE | wxTE_READONLY);
1052
1053 m_logOld = wxLog::SetActiveTarget( new wxLogTextCtrl( m_log ) );
1054 #endif // wxUSE_LOG
1055
1056 // single line text controls
1057
1058 m_text = new MyTextCtrl( this, wxID_ANY, wxT("Single line."),
1059 wxDefaultPosition, wxDefaultSize,
1060 wxTE_PROCESS_ENTER);
1061 m_text->SetForegroundColour(*wxBLUE);
1062 m_text->SetBackgroundColour(*wxLIGHT_GREY);
1063 (*m_text) << wxT(" Appended.");
1064 m_text->SetInsertionPoint(0);
1065 m_text->WriteText( wxT("Prepended. ") );
1066
1067 m_password = new MyTextCtrl( this, wxID_ANY, wxT(""),
1068 wxPoint(10,50), wxSize(140,wxDefaultCoord), wxTE_PASSWORD );
1069
1070 m_readonly = new MyTextCtrl( this, wxID_ANY, wxT("Read only"),
1071 wxPoint(10,90), wxSize(140,wxDefaultCoord), wxTE_READONLY );
1072
1073 m_limited = new MyTextCtrl(this, wxID_ANY, wxT("Max 8 ch"),
1074 wxPoint(10, 130), wxSize(140, wxDefaultCoord));
1075 m_limited->SetMaxLength(8);
1076
1077 // multi line text controls
1078
1079 m_horizontal = new MyTextCtrl( this, wxID_ANY, wxT("Multiline text control with a horizontal scrollbar.\n"),
1080 wxPoint(10,170), wxSize(140,70), wxTE_MULTILINE | wxHSCROLL);
1081
1082 // a little hack to use the command line argument for encoding testing
1083 if ( wxTheApp->argc == 2 )
1084 {
1085 switch ( (wxChar)wxTheApp->argv[1][0] )
1086 {
1087 case '2':
1088 m_horizontal->SetFont(wxFont(18, wxSWISS, wxNORMAL, wxNORMAL,
1089 false, wxT(""),
1090 wxFONTENCODING_ISO8859_2));
1091 m_horizontal->AppendText(wxT("\256lu\273ou\350k\375 k\371\362 zb\354sile \350e\271tina \253\273"));
1092 break;
1093
1094 case '1':
1095 m_horizontal->SetFont(wxFont(18, wxSWISS, wxNORMAL, wxNORMAL,
1096 false, wxT(""),
1097 wxFONTENCODING_CP1251));
1098 m_horizontal->AppendText(wxT("\317\360\350\342\345\362!"));
1099 break;
1100
1101 case '8':
1102 m_horizontal->SetFont(wxFont(18, wxSWISS, wxNORMAL, wxNORMAL,
1103 false, wxT(""),
1104 wxFONTENCODING_CP1251));
1105 #if wxUSE_UNICODE
1106 m_horizontal->AppendText(L"\x0412\x0430\x0434\x0438\x043c \x0426");
1107 #else
1108 m_horizontal->AppendText("\313\301\326\305\324\323\321 \325\304\301\336\316\331\315");
1109 #endif
1110 }
1111 }
1112 else
1113 {
1114 m_horizontal->AppendText(wxT("Text in default encoding"));
1115 }
1116
1117 m_multitext = new MyTextCtrl( this, wxID_ANY,
1118 wxT("Multi line without vertical scrollbar."),
1119 wxPoint(180,10), wxSize(200,70), wxTE_MULTILINE | wxTE_NO_VSCROLL );
1120 m_multitext->SetFont(*wxITALIC_FONT);
1121 (*m_multitext) << wxT(" Appended.");
1122 m_multitext->SetInsertionPoint(0);
1123 m_multitext->WriteText( wxT("Prepended. ") );
1124 m_multitext->SetForegroundColour(*wxYELLOW);
1125 m_multitext->SetBackgroundColour(*wxLIGHT_GREY);
1126
1127 #if wxUSE_TOOLTIPS
1128 m_multitext->SetToolTip(wxT("Press Fn function keys here"));
1129 #endif
1130
1131 m_tab = new MyTextCtrl( this, 100, wxT("Multiline, allow <TAB> processing."),
1132 wxPoint(180,90), wxSize(200,70), wxTE_MULTILINE | wxTE_PROCESS_TAB );
1133 m_tab->SetClientData((void *)wxT("tab"));
1134
1135 m_enter = new MyTextCtrl( this, 100, wxT("Multiline, allow <ENTER> processing."),
1136 wxPoint(180,170), wxSize(200,70), wxTE_MULTILINE);
1137 m_enter->SetClientData((void *)wxT("enter"));
1138
1139 m_textrich = new MyTextCtrl(this, wxID_ANY, wxT("Allows more than 30Kb of text\n")
1140 wxT("(even under broken Win9x)\n")
1141 wxT("and a very very very very very ")
1142 wxT("very very very long line to test ")
1143 wxT("wxHSCROLL style\n")
1144 wxT("\nAnd here is a link in quotation marks to ")
1145 wxT("test wxTE_AUTO_URL: \"http://www.wxwidgets.org\""),
1146 wxPoint(450, 10), wxSize(200, 230),
1147 wxTE_RICH | wxTE_MULTILINE | wxTE_AUTO_URL);
1148 m_textrich->SetStyle(0, 10, *wxRED);
1149 m_textrich->SetStyle(10, 20, *wxBLUE);
1150 m_textrich->SetStyle(30, 40,
1151 wxTextAttr(*wxGREEN, wxNullColour, *wxITALIC_FONT));
1152 m_textrich->SetDefaultStyle(wxTextAttr());
1153 m_textrich->AppendText(wxT("\n\nFirst 10 characters should be in red\n"));
1154 m_textrich->AppendText(wxT("Next 10 characters should be in blue\n"));
1155 m_textrich->AppendText(wxT("Next 10 characters should be normal\n"));
1156 m_textrich->AppendText(wxT("And the next 10 characters should be green and italic\n"));
1157 m_textrich->SetDefaultStyle(wxTextAttr(*wxCYAN, *wxBLUE));
1158 m_textrich->AppendText(wxT("This text should be cyan on blue\n"));
1159 m_textrich->SetDefaultStyle(wxTextAttr(*wxBLUE, *wxWHITE));
1160 m_textrich->AppendText(wxT("And this should be in blue and the text you ")
1161 wxT("type should be in blue as well"));
1162
1163
1164 // lay out the controls
1165 wxBoxSizer *column1 = new wxBoxSizer(wxVERTICAL);
1166 column1->Add( m_text, 0, wxALL | wxEXPAND, 10 );
1167 column1->Add( m_password, 0, wxALL | wxEXPAND, 10 );
1168 column1->Add( m_readonly, 0, wxALL | wxEXPAND, 10 );
1169 column1->Add( m_limited, 0, wxALL | wxEXPAND, 10 );
1170 column1->Add( m_horizontal, 1, wxALL | wxEXPAND, 10 );
1171
1172 wxBoxSizer *column2 = new wxBoxSizer(wxVERTICAL);
1173 column2->Add( m_multitext, 1, wxALL | wxEXPAND, 10 );
1174 column2->Add( m_tab, 1, wxALL | wxEXPAND, 10 );
1175 column2->Add( m_enter, 1, wxALL | wxEXPAND, 10 );
1176
1177 wxBoxSizer *row1 = new wxBoxSizer(wxHORIZONTAL);
1178 row1->Add( column1, 0, wxALL | wxEXPAND, 10 );
1179 row1->Add( column2, 1, wxALL | wxEXPAND, 10 );
1180 row1->Add( m_textrich, 1, wxALL | wxEXPAND, 10 );
1181
1182 wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
1183 topSizer->Add( row1, 2, wxALL | wxEXPAND, 10 );
1184
1185 #if wxUSE_LOG
1186 topSizer->Add( m_log, 1, wxALL | wxEXPAND, 10 );
1187 #endif
1188
1189 SetSizer(topSizer);
1190 }
1191
1192 wxTextCtrl *MyPanel::GetFocusedText() const
1193 {
1194 wxWindow *win = FindFocus();
1195
1196 wxTextCtrl *text = win ? wxDynamicCast(win, wxTextCtrl) : NULL;
1197 return text ? text : m_multitext;
1198 }
1199
1200 #if wxUSE_CLIPBOARD
1201 void MyPanel::DoPasteFromClipboard()
1202 {
1203 // On X11, we want to get the data from the primary selection instead
1204 // of the normal clipboard (which isn't normal under X11 at all). This
1205 // call has no effect under MSW.
1206 wxTheClipboard->UsePrimarySelection();
1207
1208 if (!wxTheClipboard->Open())
1209 {
1210 #if wxUSE_LOG
1211 *m_log << wxT("Error opening the clipboard.\n");
1212 #endif // wxUSE_LOG
1213 return;
1214 }
1215 else
1216 {
1217 #if wxUSE_LOG
1218 *m_log << wxT("Successfully opened the clipboard.\n");
1219 #endif // wxUSE_LOG
1220 }
1221
1222 wxTextDataObject data;
1223
1224 if (wxTheClipboard->IsSupported( data.GetFormat() ))
1225 {
1226 #if wxUSE_LOG
1227 *m_log << wxT("Clipboard supports requested format.\n");
1228 #endif // wxUSE_LOG
1229
1230 if (wxTheClipboard->GetData( data ))
1231 {
1232 #if wxUSE_LOG
1233 *m_log << wxT("Successfully retrieved data from the clipboard.\n");
1234 #endif // wxUSE_LOG
1235 GetFocusedText()->AppendText(data.GetText());
1236 }
1237 else
1238 {
1239 #if wxUSE_LOG
1240 *m_log << wxT("Error getting data from the clipboard.\n");
1241 #endif // wxUSE_LOG
1242 }
1243 }
1244 else
1245 {
1246 #if wxUSE_LOG
1247 *m_log << wxT("Clipboard doesn't support requested format.\n");
1248 #endif // wxUSE_LOG
1249 }
1250
1251 wxTheClipboard->Close();
1252
1253 #if wxUSE_LOG
1254 *m_log << wxT("Closed the clipboard.\n");
1255 #endif // wxUSE_LOG
1256 }
1257
1258 void MyPanel::DoCopyToClipboard()
1259 {
1260 // On X11, we want to get the data from the primary selection instead
1261 // of the normal clipboard (which isn't normal under X11 at all). This
1262 // call has no effect under MSW.
1263 wxTheClipboard->UsePrimarySelection();
1264
1265 wxString text( GetFocusedText()->GetStringSelection() );
1266
1267 if (text.IsEmpty())
1268 {
1269 #if wxUSE_LOG
1270 *m_log << wxT("No text to copy.\n");
1271 #endif // wxUSE_LOG
1272
1273 return;
1274 }
1275
1276 if (!wxTheClipboard->Open())
1277 {
1278 #if wxUSE_LOG
1279 *m_log << wxT("Error opening the clipboard.\n");
1280 #endif // wxUSE_LOG
1281
1282 return;
1283 }
1284 else
1285 {
1286 #if wxUSE_LOG
1287 *m_log << wxT("Successfully opened the clipboard.\n");
1288 #endif // wxUSE_LOG
1289 }
1290
1291 wxTextDataObject *data = new wxTextDataObject( text );
1292
1293 if (!wxTheClipboard->SetData( data ))
1294 {
1295 #if wxUSE_LOG
1296 *m_log << wxT("Error while copying to the clipboard.\n");
1297 #endif // wxUSE_LOG
1298 }
1299 else
1300 {
1301 #if wxUSE_LOG
1302 *m_log << wxT("Successfully copied data to the clipboard.\n");
1303 #endif // wxUSE_LOG
1304 }
1305
1306 wxTheClipboard->Close();
1307
1308 #if wxUSE_LOG
1309 *m_log << wxT("Closed the clipboard.\n");
1310 #endif // wxUSE_LOG
1311 }
1312
1313 #endif // wxUSE_CLIPBOARD
1314
1315 void MyPanel::DoMoveToEndOfText()
1316 {
1317 m_multitext->SetInsertionPointEnd();
1318 m_multitext->SetFocus();
1319 }
1320
1321 void MyPanel::DoMoveToEndOfEntry()
1322 {
1323 m_text->SetInsertionPointEnd();
1324 m_text->SetFocus();
1325 }
1326
1327 void MyPanel::DoRemoveText()
1328 {
1329 GetFocusedText()->Remove(0, 10);
1330 }
1331
1332 void MyPanel::DoReplaceText()
1333 {
1334 GetFocusedText()->Replace(3, 8, wxT("ABC"));
1335 }
1336
1337 void MyPanel::DoSelectText()
1338 {
1339 GetFocusedText()->SetSelection(3, 8);
1340 }
1341
1342 //----------------------------------------------------------------------
1343 // MyFrame
1344 //----------------------------------------------------------------------
1345
1346 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
1347 EVT_MENU(TEXT_QUIT, MyFrame::OnQuit)
1348 EVT_MENU(TEXT_ABOUT, MyFrame::OnAbout)
1349 EVT_MENU(TEXT_SAVE, MyFrame::OnFileSave)
1350 EVT_MENU(TEXT_LOAD, MyFrame::OnFileLoad)
1351 EVT_MENU(TEXT_RICH_TEXT_TEST, MyFrame::OnRichTextTest)
1352
1353 EVT_MENU(TEXT_LOG_KEY, MyFrame::OnLogKey)
1354 EVT_MENU(TEXT_LOG_CHAR, MyFrame::OnLogChar)
1355 EVT_MENU(TEXT_LOG_MOUSE,MyFrame::OnLogMouse)
1356 EVT_MENU(TEXT_LOG_TEXT, MyFrame::OnLogText)
1357 EVT_MENU(TEXT_LOG_FOCUS,MyFrame::OnLogFocus)
1358 EVT_MENU(TEXT_LOG_CLIP, MyFrame::OnLogClip)
1359 #if wxUSE_LOG
1360 EVT_MENU(TEXT_CLEAR, MyFrame::OnLogClear)
1361 #endif // wxUSE_LOG
1362
1363 #if wxUSE_TOOLTIPS
1364 EVT_MENU(TEXT_TOOLTIPS_SETDELAY, MyFrame::OnSetTooltipDelay)
1365 EVT_MENU(TEXT_TOOLTIPS_ENABLE, MyFrame::OnToggleTooltips)
1366 #endif // wxUSE_TOOLTIPS
1367
1368 #if wxUSE_CLIPBOARD
1369 EVT_MENU(TEXT_CLIPBOARD_PASTE, MyFrame::OnPasteFromClipboard)
1370 EVT_MENU(TEXT_CLIPBOARD_COPY, MyFrame::OnCopyToClipboard)
1371
1372 EVT_UPDATE_UI(TEXT_CLIPBOARD_PASTE, MyFrame::OnUpdatePasteFromClipboard)
1373 EVT_UPDATE_UI(TEXT_CLIPBOARD_COPY, MyFrame::OnUpdateCopyToClipboard)
1374 #endif // wxUSE_CLIPBOARD
1375
1376 EVT_MENU(TEXT_REMOVE, MyFrame::OnRemoveText)
1377 EVT_MENU(TEXT_REPLACE, MyFrame::OnReplaceText)
1378 EVT_MENU(TEXT_SELECT, MyFrame::OnSelectText)
1379 EVT_MENU(TEXT_ADD_SOME, MyFrame::OnAddText)
1380 EVT_MENU(TEXT_ADD_FREEZE, MyFrame::OnAddTextFreeze)
1381 EVT_MENU(TEXT_ADD_LINE, MyFrame::OnAddTextLine)
1382 EVT_MENU(TEXT_MOVE_ENDTEXT, MyFrame::OnMoveToEndOfText)
1383 EVT_MENU(TEXT_MOVE_ENDENTRY, MyFrame::OnMoveToEndOfEntry)
1384
1385 EVT_MENU(TEXT_SET_EDITABLE, MyFrame::OnSetEditable)
1386 EVT_MENU(TEXT_SET_ENABLED, MyFrame::OnSetEnabled)
1387
1388 EVT_MENU(TEXT_LINE_DOWN, MyFrame::OnScrollLineDown)
1389 EVT_MENU(TEXT_LINE_UP, MyFrame::OnScrollLineUp)
1390 EVT_MENU(TEXT_PAGE_DOWN, MyFrame::OnScrollPageDown)
1391 EVT_MENU(TEXT_PAGE_UP, MyFrame::OnScrollPageUp)
1392
1393 EVT_MENU(TEXT_GET_LINE, MyFrame::OnGetLine)
1394 EVT_MENU(TEXT_GET_LINELENGTH, MyFrame::OnGetLineLength)
1395
1396 EVT_MENU(TEXT_SET, MyFrame::OnSetText)
1397 EVT_MENU(TEXT_CHANGE, MyFrame::OnChangeText)
1398
1399 EVT_IDLE(MyFrame::OnIdle)
1400 END_EVENT_TABLE()
1401
1402 MyFrame::MyFrame(wxFrame *frame, const wxChar *title, int x, int y, int w, int h)
1403 : wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h) )
1404 {
1405 SetIcon(wxICON(sample));
1406
1407 #if wxUSE_STATUSBAR
1408 CreateStatusBar(2);
1409 #endif // wxUSE_STATUSBAR
1410
1411 m_panel = new MyPanel( this, 10, 10, 300, 100 );
1412 }
1413
1414 void MyFrame::OnQuit (wxCommandEvent& WXUNUSED(event) )
1415 {
1416 Close(true);
1417 }
1418
1419 void MyFrame::OnAbout( wxCommandEvent& WXUNUSED(event) )
1420 {
1421 wxBeginBusyCursor();
1422
1423 wxMessageDialog dialog(this,
1424 wxT("This is a text control sample. It demonstrates the many different\n")
1425 wxT("text control styles, the use of the clipboard, setting and handling\n")
1426 wxT("tooltips and intercepting key and char events.\n")
1427 wxT("\n")
1428 wxT("Copyright (c) 1999, Robert Roebling, Julian Smart, Vadim Zeitlin"),
1429 wxT("About wxTextCtrl Sample"),
1430 wxOK | wxICON_INFORMATION);
1431
1432 dialog.ShowModal();
1433
1434 wxEndBusyCursor();
1435 }
1436
1437 #if wxUSE_TOOLTIPS
1438
1439 void MyFrame::OnSetTooltipDelay(wxCommandEvent& WXUNUSED(event))
1440 {
1441 static long s_delay = 5000;
1442
1443 wxString delay;
1444 delay.Printf( wxT("%ld"), s_delay);
1445
1446 delay = wxGetTextFromUser(wxT("Enter delay (in milliseconds)"),
1447 wxT("Set tooltip delay"),
1448 delay,
1449 this);
1450 if ( !delay )
1451 return; // cancelled
1452
1453 wxSscanf(delay, wxT("%ld"), &s_delay);
1454
1455 wxToolTip::SetDelay(s_delay);
1456
1457 wxLogStatus(this, wxT("Tooltip delay set to %ld milliseconds"), s_delay);
1458 }
1459
1460 void MyFrame::OnToggleTooltips(wxCommandEvent& WXUNUSED(event))
1461 {
1462 static bool s_enabled = true;
1463
1464 s_enabled = !s_enabled;
1465
1466 wxToolTip::Enable(s_enabled);
1467
1468 wxLogStatus(this, wxT("Tooltips %sabled"), s_enabled ? wxT("en") : wxT("dis") );
1469 }
1470 #endif // tooltips
1471
1472 #if wxUSE_LOG
1473 void MyFrame::OnLogClear(wxCommandEvent& WXUNUSED(event))
1474 {
1475 m_panel->m_log->Clear();
1476 }
1477 #endif // wxUSE_LOG
1478
1479 void MyFrame::OnSetEditable(wxCommandEvent& WXUNUSED(event))
1480 {
1481 static bool s_editable = true;
1482
1483 s_editable = !s_editable;
1484 m_panel->m_text->SetEditable(s_editable);
1485 m_panel->m_password->SetEditable(s_editable);
1486 m_panel->m_multitext->SetEditable(s_editable);
1487 m_panel->m_textrich->SetEditable(s_editable);
1488 }
1489
1490 void MyFrame::OnSetEnabled(wxCommandEvent& WXUNUSED(event))
1491 {
1492 bool enabled = m_panel->m_text->IsEnabled();
1493 enabled = !enabled;
1494
1495 m_panel->m_text->Enable(enabled);
1496 m_panel->m_password->Enable(enabled);
1497 m_panel->m_multitext->Enable(enabled);
1498 m_panel->m_readonly->Enable(enabled);
1499 m_panel->m_limited->Enable(enabled);
1500 m_panel->m_textrich->Enable(enabled);
1501 }
1502
1503 void MyFrame::OnFileSave(wxCommandEvent& WXUNUSED(event))
1504 {
1505 if ( m_panel->m_textrich->SaveFile(wxT("dummy.txt")) )
1506 {
1507 #if wxUSE_FILE
1508 // verify that the fil length is correct (it wasn't under Win95)
1509 wxFile file(wxT("dummy.txt"));
1510 wxLogStatus(this,
1511 wxT("Successfully saved file (text len = %lu, file size = %ld)"),
1512 (unsigned long)m_panel->m_textrich->GetValue().length(),
1513 (long) file.Length());
1514 #endif
1515 }
1516 else
1517 wxLogStatus(this, wxT("Couldn't save the file"));
1518 }
1519
1520 void MyFrame::OnFileLoad(wxCommandEvent& WXUNUSED(event))
1521 {
1522 if ( m_panel->m_textrich->LoadFile(wxT("dummy.txt")) )
1523 {
1524 wxLogStatus(this, wxT("Successfully loaded file"));
1525 }
1526 else
1527 {
1528 wxLogStatus(this, wxT("Couldn't load the file"));
1529 }
1530 }
1531
1532 void MyFrame::OnRichTextTest(wxCommandEvent& WXUNUSED(event))
1533 {
1534 RichTextFrame* frame = new RichTextFrame(this, wxT("Rich Text Editor"));
1535 frame->Show(true);
1536 }
1537
1538 void MyFrame::OnIdle( wxIdleEvent& event )
1539 {
1540 // track the window which has the focus in the status bar
1541 static wxWindow *s_windowFocus = (wxWindow *)NULL;
1542 wxWindow *focus = wxWindow::FindFocus();
1543 if ( focus && (focus != s_windowFocus) )
1544 {
1545 s_windowFocus = focus;
1546
1547 wxString msg;
1548 msg.Printf(
1549 #ifdef __WXMSW__
1550 wxT("Focus: wxWindow = %p, HWND = %p"),
1551 #else
1552 wxT("Focus: wxWindow = %p"),
1553 #endif
1554 s_windowFocus
1555 #ifdef __WXMSW__
1556 , s_windowFocus->GetHWND()
1557 #endif
1558 );
1559
1560 #if wxUSE_STATUSBAR
1561 SetStatusText(msg);
1562 #endif // wxUSE_STATUSBAR
1563 }
1564 event.Skip();
1565 }
1566
1567 /*
1568 * RichTextFrame is used to demonstrate rich text behaviour
1569 */
1570
1571 enum
1572 {
1573 RICHTEXT_CLOSE = 1000,
1574 RICHTEXT_LEFT_ALIGN,
1575 RICHTEXT_RIGHT_ALIGN,
1576 RICHTEXT_CENTRE,
1577 RICHTEXT_JUSTIFY,
1578 RICHTEXT_CHANGE_FONT,
1579 RICHTEXT_CHANGE_TEXT_COLOUR,
1580 RICHTEXT_CHANGE_BACKGROUND_COLOUR,
1581 RICHTEXT_LEFT_INDENT,
1582 RICHTEXT_RIGHT_INDENT,
1583 RICHTEXT_TAB_STOPS
1584 };
1585
1586 BEGIN_EVENT_TABLE(RichTextFrame, wxFrame)
1587 EVT_IDLE(RichTextFrame::OnIdle)
1588 EVT_MENU(RICHTEXT_CLOSE, RichTextFrame::OnClose)
1589 EVT_MENU(RICHTEXT_LEFT_ALIGN, RichTextFrame::OnLeftAlign)
1590 EVT_MENU(RICHTEXT_RIGHT_ALIGN, RichTextFrame::OnRightAlign)
1591 EVT_MENU(RICHTEXT_CENTRE, RichTextFrame::OnCentre)
1592 EVT_MENU(RICHTEXT_JUSTIFY, RichTextFrame::OnJustify)
1593 EVT_MENU(RICHTEXT_CHANGE_FONT, RichTextFrame::OnChangeFont)
1594 EVT_MENU(RICHTEXT_CHANGE_TEXT_COLOUR, RichTextFrame::OnChangeTextColour)
1595 EVT_MENU(RICHTEXT_CHANGE_BACKGROUND_COLOUR, RichTextFrame::OnChangeBackgroundColour)
1596 EVT_MENU(RICHTEXT_LEFT_INDENT, RichTextFrame::OnLeftIndent)
1597 EVT_MENU(RICHTEXT_RIGHT_INDENT, RichTextFrame::OnRightIndent)
1598 EVT_MENU(RICHTEXT_TAB_STOPS, RichTextFrame::OnTabStops)
1599 END_EVENT_TABLE()
1600
1601 RichTextFrame::RichTextFrame(wxWindow* parent, const wxString& title):
1602 wxFrame(parent, wxID_ANY, title, wxDefaultPosition, wxSize(300, 400))
1603 {
1604 m_currentPosition = -1;
1605 m_textCtrl = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition,
1606 wxDefaultSize, wxTE_MULTILINE|wxTE_RICH2);
1607
1608 wxString value;
1609 int i;
1610 for (i = 0; i < 10; i++)
1611 {
1612 int j;
1613 for (j = 0; j < 10; j++)
1614 {
1615 value << wxT("Hello, welcome to a very simple rich text editor. You can set some character and paragraph styles from the Edit menu. ");
1616 }
1617 value << wxT("\n\n");
1618 }
1619 m_textCtrl->SetValue(value);
1620
1621 wxMenuBar* menuBar = new wxMenuBar;
1622 wxMenu* fileMenu = new wxMenu;
1623 fileMenu->Append(RICHTEXT_CLOSE, _("Close\tCtrl+W"));
1624 menuBar->Append(fileMenu, _("File"));
1625
1626 wxMenu* editMenu = new wxMenu;
1627 editMenu->Append(RICHTEXT_LEFT_ALIGN, _("Left Align"));
1628 editMenu->Append(RICHTEXT_RIGHT_ALIGN, _("Right Align"));
1629 editMenu->Append(RICHTEXT_CENTRE, _("Centre"));
1630 editMenu->Append(RICHTEXT_JUSTIFY, _("Justify"));
1631 editMenu->AppendSeparator();
1632 editMenu->Append(RICHTEXT_CHANGE_FONT, _("Change Font"));
1633 editMenu->Append(RICHTEXT_CHANGE_TEXT_COLOUR, _("Change Text Colour"));
1634 editMenu->Append(RICHTEXT_CHANGE_BACKGROUND_COLOUR, _("Change Background Colour"));
1635 editMenu->AppendSeparator();
1636 editMenu->Append(RICHTEXT_LEFT_INDENT, _("Left Indent"));
1637 editMenu->Append(RICHTEXT_RIGHT_INDENT, _("Right Indent"));
1638 editMenu->Append(RICHTEXT_TAB_STOPS, _("Tab Stops"));
1639 menuBar->Append(editMenu, _("Edit"));
1640
1641 SetMenuBar(menuBar);
1642 #if wxUSE_STATUSBAR
1643 CreateStatusBar();
1644 #endif // wxUSE_STATUSBAR
1645 }
1646
1647 // Event handlers
1648
1649 void RichTextFrame::OnClose(wxCommandEvent& WXUNUSED(event))
1650 {
1651 Close(true);
1652 }
1653
1654 void RichTextFrame::OnLeftAlign(wxCommandEvent& WXUNUSED(event))
1655 {
1656 wxTextAttr attr;
1657 attr.SetAlignment(wxTEXT_ALIGNMENT_LEFT);
1658
1659 long start, end;
1660 m_textCtrl->GetSelection(& start, & end);
1661 m_textCtrl->SetStyle(start, end, attr);
1662
1663 m_currentPosition = -1;
1664 }
1665
1666 void RichTextFrame::OnRightAlign(wxCommandEvent& WXUNUSED(event))
1667 {
1668 wxTextAttr attr;
1669 attr.SetAlignment(wxTEXT_ALIGNMENT_RIGHT);
1670
1671 long start, end;
1672 m_textCtrl->GetSelection(& start, & end);
1673 m_textCtrl->SetStyle(start, end, attr);
1674
1675 m_currentPosition = -1;
1676 }
1677
1678 void RichTextFrame::OnJustify(wxCommandEvent& WXUNUSED(event))
1679 {
1680 wxTextAttr attr;
1681 attr.SetAlignment(wxTEXT_ALIGNMENT_JUSTIFIED);
1682
1683 long start, end;
1684 m_textCtrl->GetSelection(& start, & end);
1685 m_textCtrl->SetStyle(start, end, attr);
1686
1687 m_currentPosition = -1;
1688 }
1689
1690 void RichTextFrame::OnCentre(wxCommandEvent& WXUNUSED(event))
1691 {
1692 wxTextAttr attr;
1693 attr.SetAlignment(wxTEXT_ALIGNMENT_CENTRE);
1694
1695 long start, end;
1696 m_textCtrl->GetSelection(& start, & end);
1697 m_textCtrl->SetStyle(start, end, attr);
1698
1699 m_currentPosition = -1;
1700 }
1701
1702 void RichTextFrame::OnChangeFont(wxCommandEvent& WXUNUSED(event))
1703 {
1704 wxFontData data;
1705
1706 wxFontDialog dialog(this, data);
1707
1708 if (dialog.ShowModal() == wxID_OK)
1709 {
1710 wxFontData retData = dialog.GetFontData();
1711 wxFont font = retData.GetChosenFont();
1712
1713 wxTextAttr attr;
1714 attr.SetFont(font);
1715
1716 long start, end;
1717 m_textCtrl->GetSelection(& start, & end);
1718 m_textCtrl->SetStyle(start, end, attr);
1719
1720 m_currentPosition = -1;
1721 }
1722 }
1723
1724 void RichTextFrame::OnChangeTextColour(wxCommandEvent& WXUNUSED(event))
1725 {
1726 wxColourData data;
1727 data.SetColour(* wxBLACK);
1728 data.SetChooseFull(true);
1729 for (int i = 0; i < 16; i++)
1730 {
1731 wxColour colour((unsigned char)(i*16), (unsigned char)(i*16), (unsigned char)(i*16));
1732 data.SetCustomColour(i, colour);
1733 }
1734
1735 wxColourDialog dialog(this, &data);
1736 dialog.SetTitle(wxT("Choose the text colour"));
1737 if (dialog.ShowModal() == wxID_OK)
1738 {
1739 wxColourData retData = dialog.GetColourData();
1740 wxColour col = retData.GetColour();
1741
1742 wxTextAttr attr;
1743 attr.SetTextColour(col);
1744
1745 long start, end;
1746 m_textCtrl->GetSelection(& start, & end);
1747 m_textCtrl->SetStyle(start, end, attr);
1748
1749 m_currentPosition = -1;
1750 }
1751 }
1752
1753 void RichTextFrame::OnChangeBackgroundColour(wxCommandEvent& WXUNUSED(event))
1754 {
1755 wxColourData data;
1756 data.SetColour(* wxWHITE);
1757 data.SetChooseFull(true);
1758 for (int i = 0; i < 16; i++)
1759 {
1760 wxColour colour((unsigned char)(i*16), (unsigned char)(i*16), (unsigned char)(i*16));
1761 data.SetCustomColour(i, colour);
1762 }
1763
1764 wxColourDialog dialog(this, &data);
1765 dialog.SetTitle(wxT("Choose the text background colour"));
1766 if (dialog.ShowModal() == wxID_OK)
1767 {
1768 wxColourData retData = dialog.GetColourData();
1769 wxColour col = retData.GetColour();
1770
1771 wxTextAttr attr;
1772 attr.SetBackgroundColour(col);
1773
1774 long start, end;
1775 m_textCtrl->GetSelection(& start, & end);
1776 m_textCtrl->SetStyle(start, end, attr);
1777
1778 m_currentPosition = -1;
1779 }
1780 }
1781
1782 void RichTextFrame::OnLeftIndent(wxCommandEvent& WXUNUSED(event))
1783 {
1784 wxString indentStr = wxGetTextFromUser
1785 (
1786 _("Please enter the left indent in tenths of a millimetre."),
1787 _("Left Indent"),
1788 wxEmptyString,
1789 this
1790 );
1791 if (!indentStr.IsEmpty())
1792 {
1793 int indent = wxAtoi(indentStr);
1794
1795 wxTextAttr attr;
1796 attr.SetLeftIndent(indent);
1797
1798 long start, end;
1799 m_textCtrl->GetSelection(& start, & end);
1800 m_textCtrl->SetStyle(start, end, attr);
1801
1802 m_currentPosition = -1;
1803 }
1804 }
1805
1806 void RichTextFrame::OnRightIndent(wxCommandEvent& WXUNUSED(event))
1807 {
1808 wxString indentStr = wxGetTextFromUser
1809 (
1810 _("Please enter the right indent in tenths of a millimetre."),
1811 _("Right Indent"),
1812 wxEmptyString,
1813 this
1814 );
1815 if (!indentStr.IsEmpty())
1816 {
1817 int indent = wxAtoi(indentStr);
1818
1819 wxTextAttr attr;
1820 attr.SetRightIndent(indent);
1821
1822 long start, end;
1823 m_textCtrl->GetSelection(& start, & end);
1824 m_textCtrl->SetStyle(start, end, attr);
1825
1826 m_currentPosition = -1;
1827 }
1828 }
1829
1830 void RichTextFrame::OnTabStops(wxCommandEvent& WXUNUSED(event))
1831 {
1832 wxString tabsStr = wxGetTextFromUser
1833 (
1834 _("Please enter the tab stop positions in tenths of a millimetre, separated by spaces.\nLeave empty to reset tab stops."),
1835 _("Tab Stops"),
1836 wxEmptyString,
1837 this
1838 );
1839
1840 wxArrayInt tabs;
1841
1842 wxStringTokenizer tokens(tabsStr, wxT(" "));
1843 while (tokens.HasMoreTokens())
1844 {
1845 wxString token = tokens.GetNextToken();
1846 tabs.Add(wxAtoi(token));
1847 }
1848
1849 wxTextAttr attr;
1850 attr.SetTabs(tabs);
1851
1852 long start, end;
1853 m_textCtrl->GetSelection(& start, & end);
1854 m_textCtrl->SetStyle(start, end, attr);
1855
1856 m_currentPosition = -1;
1857 }
1858
1859 void RichTextFrame::OnIdle(wxIdleEvent& WXUNUSED(event))
1860 {
1861 long insertionPoint = m_textCtrl->GetInsertionPoint();
1862 if (insertionPoint != m_currentPosition)
1863 {
1864 #if wxUSE_STATUSBAR
1865 wxTextAttr attr;
1866 if (m_textCtrl->GetStyle(insertionPoint, attr))
1867 {
1868 wxString msg;
1869 wxString facename(wxT("unknown"));
1870 if (attr.GetFont().IsOk())
1871 {
1872 facename = attr.GetFont().GetFaceName();
1873 }
1874 wxString alignment(wxT("unknown alignment"));
1875 if (attr.GetAlignment() == wxTEXT_ALIGNMENT_CENTRE)
1876 alignment = wxT("centred");
1877 else if (attr.GetAlignment() == wxTEXT_ALIGNMENT_RIGHT)
1878 alignment = wxT("right-aligned");
1879 else if (attr.GetAlignment() == wxTEXT_ALIGNMENT_LEFT)
1880 alignment = wxT("left-aligned");
1881 else if (attr.GetAlignment() == wxTEXT_ALIGNMENT_JUSTIFIED)
1882 alignment = wxT("justified");
1883
1884 msg.Printf("Facename: %s", facename);
1885
1886 if (attr.HasTextColour())
1887 {
1888 msg += wxString::Format(", colour: %s",
1889 attr.GetTextColour().GetAsString());
1890 }
1891 else
1892 {
1893 msg += ", no colour";
1894 }
1895
1896 msg << ", " << alignment;
1897
1898 if (attr.HasFont())
1899 {
1900 if (attr.GetFont().GetWeight() == wxBOLD)
1901 msg += wxT(" BOLD");
1902 else if (attr.GetFont().GetWeight() == wxNORMAL)
1903 msg += wxT(" NORMAL");
1904
1905 if (attr.GetFont().GetStyle() == wxITALIC)
1906 msg += wxT(" ITALIC");
1907
1908 if (attr.GetFont().GetUnderlined())
1909 msg += wxT(" UNDERLINED");
1910 }
1911
1912 SetStatusText(msg);
1913 }
1914 #endif // wxUSE_STATUSBAR
1915 m_currentPosition = insertionPoint;
1916 }
1917 }