Don't ask for wxTextAttr colour if it doesn't have any in text sample.
[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
737 {
738 return wxT("Unknown mouse event");
739 }
740
741 return wxString::Format(wxT("%s mouse button %s"),
742 button.c_str(),
743 dbl ? wxT("double clicked")
744 : up ? wxT("released") : wxT("clicked"));
745 }
746
747 void MyTextCtrl::OnMouseEvent(wxMouseEvent& ev)
748 {
749 ev.Skip();
750
751 if ( !ms_logMouse )
752 return;
753
754 if ( !ev.Moving() )
755 {
756 wxString msg;
757 if ( ev.Entering() )
758 {
759 msg = wxT("Mouse entered the window");
760 }
761 else if ( ev.Leaving() )
762 {
763 msg = wxT("Mouse left the window");
764 }
765 else
766 {
767 msg = GetMouseEventDesc(ev);
768 }
769
770 msg << wxT(" at (") << ev.GetX() << wxT(", ") << ev.GetY() << wxT(") ");
771
772 long pos;
773 wxTextCtrlHitTestResult rc = HitTest(ev.GetPosition(), &pos);
774 if ( rc != wxTE_HT_UNKNOWN )
775 {
776 msg << wxT("at position ") << pos << wxT(' ');
777 }
778
779 msg << wxT("[Flags: ")
780 << GetChar( ev.LeftIsDown(), wxT('1') )
781 << GetChar( ev.MiddleIsDown(), wxT('2') )
782 << GetChar( ev.RightIsDown(), wxT('3') )
783 << GetChar( ev.ControlDown(), wxT('C') )
784 << GetChar( ev.AltDown(), wxT('A') )
785 << GetChar( ev.ShiftDown(), wxT('S') )
786 << GetChar( ev.MetaDown(), wxT('M') )
787 << wxT(']');
788
789 wxLogMessage(msg);
790 }
791 //else: we're not interested in mouse move events
792 }
793
794 void MyTextCtrl::OnSetFocus(wxFocusEvent& event)
795 {
796 if ( ms_logFocus )
797 {
798 wxLogMessage( wxT("%p got focus."), this);
799 }
800
801 event.Skip();
802 }
803
804 void MyTextCtrl::OnKillFocus(wxFocusEvent& event)
805 {
806 if ( ms_logFocus )
807 {
808 wxLogMessage( wxT("%p lost focus"), this);
809 }
810
811 event.Skip();
812 }
813
814 void MyTextCtrl::OnText(wxCommandEvent& event)
815 {
816 if ( !ms_logText )
817 return;
818
819 MyTextCtrl *win = (MyTextCtrl *)event.GetEventObject();
820 const wxChar *changeVerb = win->IsModified() ? wxT("changed")
821 : wxT("set by program");
822 const wxChar *data = (const wxChar *)(win->GetClientData());
823 if ( data )
824 {
825 wxLogMessage(wxT("Text %s in control \"%s\""), changeVerb, data);
826 }
827 else
828 {
829 wxLogMessage(wxT("Text %s in some control"), changeVerb);
830 }
831 }
832
833 void MyTextCtrl::OnTextEnter(wxCommandEvent& event)
834 {
835 if ( !ms_logText )
836 return;
837
838 MyTextCtrl *win = (MyTextCtrl *)event.GetEventObject();
839 const wxChar *data = (const wxChar *)(win->GetClientData());
840 if ( data )
841 {
842 wxLogMessage(wxT("Enter pressed in control '%s'"), data);
843 }
844 else
845 {
846 wxLogMessage(wxT("Enter pressed in some control"));
847 }
848 }
849
850 void MyTextCtrl::OnTextMaxLen(wxCommandEvent& WXUNUSED(event))
851 {
852 wxLogMessage(wxT("You can't enter more characters into this control."));
853 }
854
855
856 void MyTextCtrl::OnTextCut(wxClipboardTextEvent& event)
857 {
858 LogClipEvent(wxT("cut to"), event);
859 }
860
861 void MyTextCtrl::OnTextCopy(wxClipboardTextEvent& event)
862 {
863 LogClipEvent(wxT("copied to"), event);
864 }
865
866 void MyTextCtrl::OnTextPaste(wxClipboardTextEvent& event)
867 {
868 LogClipEvent(wxT("pasted from"), event);
869 }
870
871 void MyTextCtrl::LogClipEvent(const wxChar *what, wxClipboardTextEvent& event)
872 {
873 wxFrame *frame = wxDynamicCast(wxGetTopLevelParent(this), wxFrame);
874 wxCHECK_RET( frame, wxT("no parent frame?") );
875
876 const bool veto = frame->GetMenuBar()->IsChecked(TEXT_CLIPBOARD_VETO);
877 if ( !veto )
878 event.Skip();
879
880 if ( ms_logClip )
881 {
882 wxLogMessage(wxT("Text %s%s the clipboard."),
883 veto ? wxT("not ") : wxT(""), what);
884 }
885 }
886
887
888 void MyTextCtrl::OnTextURL(wxTextUrlEvent& event)
889 {
890 const wxMouseEvent& ev = event.GetMouseEvent();
891
892 // filter out mouse moves, too many of them
893 if ( ev.Moving() )
894 return;
895
896 long start = event.GetURLStart(),
897 end = event.GetURLEnd();
898
899 wxLogMessage(wxT("Mouse event over URL '%s': %s"),
900 GetValue().Mid(start, end - start).c_str(),
901 GetMouseEventDesc(ev).c_str());
902 }
903
904 void MyTextCtrl::OnChar(wxKeyEvent& event)
905 {
906 if ( ms_logChar )
907 LogKeyEvent( wxT("Char"), event);
908
909 event.Skip();
910 }
911
912 void MyTextCtrl::OnKeyUp(wxKeyEvent& event)
913 {
914 if ( ms_logKey )
915 LogKeyEvent( wxT("Key up"), event);
916
917 event.Skip();
918 }
919
920 void MyTextCtrl::OnKeyDown(wxKeyEvent& event)
921 {
922 switch ( event.GetKeyCode() )
923 {
924 case WXK_F1:
925 // show current position and text length
926 {
927 long line, column, pos = GetInsertionPoint();
928 PositionToXY(pos, &column, &line);
929
930 wxLogMessage(wxT("Current position: %ld\nCurrent line, column: (%ld, %ld)\nNumber of lines: %ld\nCurrent line length: %ld\nTotal text length: %u (%ld)"),
931 pos,
932 line, column,
933 (long) GetNumberOfLines(),
934 (long) GetLineLength(line),
935 (unsigned int) GetValue().length(),
936 GetLastPosition());
937
938 long from, to;
939 GetSelection(&from, &to);
940
941 wxString sel = GetStringSelection();
942
943 wxLogMessage(wxT("Selection: from %ld to %ld."), from, to);
944 wxLogMessage(wxT("Selection = '%s' (len = %u)"),
945 sel.c_str(),
946 (unsigned int) sel.length());
947
948 const wxString text = GetLineText(line);
949 wxLogMessage(wxT("Current line: \"%s\"; length = %lu"),
950 text.c_str(), text.length());
951 }
952 break;
953
954 case WXK_F2:
955 // go to the end
956 SetInsertionPointEnd();
957 break;
958
959 case WXK_F3:
960 // go to position 10
961 SetInsertionPoint(10);
962 break;
963
964 case WXK_F4:
965 if (!m_hasCapture)
966 {
967 wxLogDebug( wxT("Now capturing mouse and events.") );
968 m_hasCapture = true;
969 CaptureMouse();
970 }
971 else
972 {
973 wxLogDebug( wxT("Stopped capturing mouse and events.") );
974 m_hasCapture = false;
975 ReleaseMouse();
976 }
977 break;
978
979 case WXK_F5:
980 // insert a blank line
981 WriteText(wxT("\n"));
982 break;
983
984 case WXK_F6:
985 wxLogMessage(wxT("IsModified() before SetValue(): %d"),
986 IsModified());
987 ChangeValue(wxT("ChangeValue() has been called"));
988 wxLogMessage(wxT("IsModified() after SetValue(): %d"),
989 IsModified());
990 break;
991
992 case WXK_F7:
993 wxLogMessage(wxT("Position 10 should be now visible."));
994 ShowPosition(10);
995 break;
996
997 case WXK_F8:
998 wxLogMessage(wxT("Control has been cleared"));
999 Clear();
1000 break;
1001
1002 case WXK_F9:
1003 WriteText(wxT("WriteText() has been called"));
1004 break;
1005
1006 case WXK_F10:
1007 AppendText(wxT("AppendText() has been called"));
1008 break;
1009
1010 case WXK_F11:
1011 DiscardEdits();
1012 wxLogMessage(wxT("Control marked as non modified"));
1013 break;
1014 }
1015
1016 if ( ms_logKey )
1017 LogKeyEvent( wxT("Key down"), event);
1018
1019 event.Skip();
1020 }
1021
1022 //----------------------------------------------------------------------
1023 // MyPanel
1024 //----------------------------------------------------------------------
1025
1026 MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
1027 : wxPanel( frame, wxID_ANY, wxPoint(x, y), wxSize(w, h) )
1028 {
1029 #if wxUSE_LOG
1030 m_log = new wxTextCtrl( this, wxID_ANY, wxT("This is the log window.\n"),
1031 wxPoint(5,260), wxSize(630,100),
1032 wxTE_MULTILINE | wxTE_READONLY);
1033
1034 m_logOld = wxLog::SetActiveTarget( new wxLogTextCtrl( m_log ) );
1035 #endif // wxUSE_LOG
1036
1037 // single line text controls
1038
1039 m_text = new MyTextCtrl( this, wxID_ANY, wxT("Single line."),
1040 wxDefaultPosition, wxDefaultSize,
1041 wxTE_PROCESS_ENTER);
1042 m_text->SetForegroundColour(*wxBLUE);
1043 m_text->SetBackgroundColour(*wxLIGHT_GREY);
1044 (*m_text) << wxT(" Appended.");
1045 m_text->SetInsertionPoint(0);
1046 m_text->WriteText( wxT("Prepended. ") );
1047
1048 m_password = new MyTextCtrl( this, wxID_ANY, wxT(""),
1049 wxPoint(10,50), wxSize(140,wxDefaultCoord), wxTE_PASSWORD );
1050
1051 m_readonly = new MyTextCtrl( this, wxID_ANY, wxT("Read only"),
1052 wxPoint(10,90), wxSize(140,wxDefaultCoord), wxTE_READONLY );
1053
1054 m_limited = new MyTextCtrl(this, wxID_ANY, wxT("Max 8 ch"),
1055 wxPoint(10, 130), wxSize(140, wxDefaultCoord));
1056 m_limited->SetMaxLength(8);
1057
1058 // multi line text controls
1059
1060 m_horizontal = new MyTextCtrl( this, wxID_ANY, wxT("Multiline text control with a horizontal scrollbar.\n"),
1061 wxPoint(10,170), wxSize(140,70), wxTE_MULTILINE | wxHSCROLL);
1062
1063 // a little hack to use the command line argument for encoding testing
1064 if ( wxTheApp->argc == 2 )
1065 {
1066 switch ( (wxChar)wxTheApp->argv[1][0] )
1067 {
1068 case '2':
1069 m_horizontal->SetFont(wxFont(18, wxSWISS, wxNORMAL, wxNORMAL,
1070 false, wxT(""),
1071 wxFONTENCODING_ISO8859_2));
1072 m_horizontal->AppendText(wxT("\256lu\273ou\350k\375 k\371\362 zb\354sile \350e\271tina \253\273"));
1073 break;
1074
1075 case '1':
1076 m_horizontal->SetFont(wxFont(18, wxSWISS, wxNORMAL, wxNORMAL,
1077 false, wxT(""),
1078 wxFONTENCODING_CP1251));
1079 m_horizontal->AppendText(wxT("\317\360\350\342\345\362!"));
1080 break;
1081
1082 case '8':
1083 m_horizontal->SetFont(wxFont(18, wxSWISS, wxNORMAL, wxNORMAL,
1084 false, wxT(""),
1085 wxFONTENCODING_CP1251));
1086 #if wxUSE_UNICODE
1087 m_horizontal->AppendText(L"\x0412\x0430\x0434\x0438\x043c \x0426");
1088 #else
1089 m_horizontal->AppendText("\313\301\326\305\324\323\321 \325\304\301\336\316\331\315");
1090 #endif
1091 }
1092 }
1093 else
1094 {
1095 m_horizontal->AppendText(wxT("Text in default encoding"));
1096 }
1097
1098 m_multitext = new MyTextCtrl( this, wxID_ANY,
1099 wxT("Multi line without vertical scrollbar."),
1100 wxPoint(180,10), wxSize(200,70), wxTE_MULTILINE | wxTE_NO_VSCROLL );
1101 m_multitext->SetFont(*wxITALIC_FONT);
1102 (*m_multitext) << wxT(" Appended.");
1103 m_multitext->SetInsertionPoint(0);
1104 m_multitext->WriteText( wxT("Prepended. ") );
1105 m_multitext->SetForegroundColour(*wxYELLOW);
1106 m_multitext->SetBackgroundColour(*wxLIGHT_GREY);
1107
1108 #if wxUSE_TOOLTIPS
1109 m_multitext->SetToolTip(wxT("Press Fn function keys here"));
1110 #endif
1111
1112 m_tab = new MyTextCtrl( this, 100, wxT("Multiline, allow <TAB> processing."),
1113 wxPoint(180,90), wxSize(200,70), wxTE_MULTILINE | wxTE_PROCESS_TAB );
1114 m_tab->SetClientData((void *)wxT("tab"));
1115
1116 m_enter = new MyTextCtrl( this, 100, wxT("Multiline, allow <ENTER> processing."),
1117 wxPoint(180,170), wxSize(200,70), wxTE_MULTILINE);
1118 m_enter->SetClientData((void *)wxT("enter"));
1119
1120 m_textrich = new MyTextCtrl(this, wxID_ANY, wxT("Allows more than 30Kb of text\n")
1121 wxT("(even under broken Win9x)\n")
1122 wxT("and a very very very very very ")
1123 wxT("very very very long line to test ")
1124 wxT("wxHSCROLL style\n")
1125 wxT("\nAnd here is a link in quotation marks to ")
1126 wxT("test wxTE_AUTO_URL: \"http://www.wxwidgets.org\""),
1127 wxPoint(450, 10), wxSize(200, 230),
1128 wxTE_RICH | wxTE_MULTILINE | wxTE_AUTO_URL);
1129 m_textrich->SetStyle(0, 10, *wxRED);
1130 m_textrich->SetStyle(10, 20, *wxBLUE);
1131 m_textrich->SetStyle(30, 40,
1132 wxTextAttr(*wxGREEN, wxNullColour, *wxITALIC_FONT));
1133 m_textrich->SetDefaultStyle(wxTextAttr());
1134 m_textrich->AppendText(wxT("\n\nFirst 10 characters should be in red\n"));
1135 m_textrich->AppendText(wxT("Next 10 characters should be in blue\n"));
1136 m_textrich->AppendText(wxT("Next 10 characters should be normal\n"));
1137 m_textrich->AppendText(wxT("And the next 10 characters should be green and italic\n"));
1138 m_textrich->SetDefaultStyle(wxTextAttr(*wxCYAN, *wxBLUE));
1139 m_textrich->AppendText(wxT("This text should be cyan on blue\n"));
1140 m_textrich->SetDefaultStyle(wxTextAttr(*wxBLUE, *wxWHITE));
1141 m_textrich->AppendText(wxT("And this should be in blue and the text you ")
1142 wxT("type should be in blue as well"));
1143
1144
1145 // lay out the controls
1146 wxBoxSizer *column1 = new wxBoxSizer(wxVERTICAL);
1147 column1->Add( m_text, 0, wxALL | wxEXPAND, 10 );
1148 column1->Add( m_password, 0, wxALL | wxEXPAND, 10 );
1149 column1->Add( m_readonly, 0, wxALL | wxEXPAND, 10 );
1150 column1->Add( m_limited, 0, wxALL | wxEXPAND, 10 );
1151 column1->Add( m_horizontal, 1, wxALL | wxEXPAND, 10 );
1152
1153 wxBoxSizer *column2 = new wxBoxSizer(wxVERTICAL);
1154 column2->Add( m_multitext, 1, wxALL | wxEXPAND, 10 );
1155 column2->Add( m_tab, 1, wxALL | wxEXPAND, 10 );
1156 column2->Add( m_enter, 1, wxALL | wxEXPAND, 10 );
1157
1158 wxBoxSizer *row1 = new wxBoxSizer(wxHORIZONTAL);
1159 row1->Add( column1, 0, wxALL | wxEXPAND, 10 );
1160 row1->Add( column2, 1, wxALL | wxEXPAND, 10 );
1161 row1->Add( m_textrich, 1, wxALL | wxEXPAND, 10 );
1162
1163 wxBoxSizer *topSizer = new wxBoxSizer(wxVERTICAL);
1164 topSizer->Add( row1, 2, wxALL | wxEXPAND, 10 );
1165
1166 #if wxUSE_LOG
1167 topSizer->Add( m_log, 1, wxALL | wxEXPAND, 10 );
1168 #endif
1169
1170 SetSizer(topSizer);
1171 }
1172
1173 wxTextCtrl *MyPanel::GetFocusedText() const
1174 {
1175 wxWindow *win = FindFocus();
1176
1177 wxTextCtrl *text = win ? wxDynamicCast(win, wxTextCtrl) : NULL;
1178 return text ? text : m_multitext;
1179 }
1180
1181 #if wxUSE_CLIPBOARD
1182 void MyPanel::DoPasteFromClipboard()
1183 {
1184 // On X11, we want to get the data from the primary selection instead
1185 // of the normal clipboard (which isn't normal under X11 at all). This
1186 // call has no effect under MSW.
1187 wxTheClipboard->UsePrimarySelection();
1188
1189 if (!wxTheClipboard->Open())
1190 {
1191 #if wxUSE_LOG
1192 *m_log << wxT("Error opening the clipboard.\n");
1193 #endif // wxUSE_LOG
1194 return;
1195 }
1196 else
1197 {
1198 #if wxUSE_LOG
1199 *m_log << wxT("Successfully opened the clipboard.\n");
1200 #endif // wxUSE_LOG
1201 }
1202
1203 wxTextDataObject data;
1204
1205 if (wxTheClipboard->IsSupported( data.GetFormat() ))
1206 {
1207 #if wxUSE_LOG
1208 *m_log << wxT("Clipboard supports requested format.\n");
1209 #endif // wxUSE_LOG
1210
1211 if (wxTheClipboard->GetData( data ))
1212 {
1213 #if wxUSE_LOG
1214 *m_log << wxT("Successfully retrieved data from the clipboard.\n");
1215 #endif // wxUSE_LOG
1216 GetFocusedText()->AppendText(data.GetText());
1217 }
1218 else
1219 {
1220 #if wxUSE_LOG
1221 *m_log << wxT("Error getting data from the clipboard.\n");
1222 #endif // wxUSE_LOG
1223 }
1224 }
1225 else
1226 {
1227 #if wxUSE_LOG
1228 *m_log << wxT("Clipboard doesn't support requested format.\n");
1229 #endif // wxUSE_LOG
1230 }
1231
1232 wxTheClipboard->Close();
1233
1234 #if wxUSE_LOG
1235 *m_log << wxT("Closed the clipboard.\n");
1236 #endif // wxUSE_LOG
1237 }
1238
1239 void MyPanel::DoCopyToClipboard()
1240 {
1241 // On X11, we want to get the data from the primary selection instead
1242 // of the normal clipboard (which isn't normal under X11 at all). This
1243 // call has no effect under MSW.
1244 wxTheClipboard->UsePrimarySelection();
1245
1246 wxString text( GetFocusedText()->GetStringSelection() );
1247
1248 if (text.IsEmpty())
1249 {
1250 #if wxUSE_LOG
1251 *m_log << wxT("No text to copy.\n");
1252 #endif // wxUSE_LOG
1253
1254 return;
1255 }
1256
1257 if (!wxTheClipboard->Open())
1258 {
1259 #if wxUSE_LOG
1260 *m_log << wxT("Error opening the clipboard.\n");
1261 #endif // wxUSE_LOG
1262
1263 return;
1264 }
1265 else
1266 {
1267 #if wxUSE_LOG
1268 *m_log << wxT("Successfully opened the clipboard.\n");
1269 #endif // wxUSE_LOG
1270 }
1271
1272 wxTextDataObject *data = new wxTextDataObject( text );
1273
1274 if (!wxTheClipboard->SetData( data ))
1275 {
1276 #if wxUSE_LOG
1277 *m_log << wxT("Error while copying to the clipboard.\n");
1278 #endif // wxUSE_LOG
1279 }
1280 else
1281 {
1282 #if wxUSE_LOG
1283 *m_log << wxT("Successfully copied data to the clipboard.\n");
1284 #endif // wxUSE_LOG
1285 }
1286
1287 wxTheClipboard->Close();
1288
1289 #if wxUSE_LOG
1290 *m_log << wxT("Closed the clipboard.\n");
1291 #endif // wxUSE_LOG
1292 }
1293
1294 #endif // wxUSE_CLIPBOARD
1295
1296 void MyPanel::DoMoveToEndOfText()
1297 {
1298 m_multitext->SetInsertionPointEnd();
1299 m_multitext->SetFocus();
1300 }
1301
1302 void MyPanel::DoMoveToEndOfEntry()
1303 {
1304 m_text->SetInsertionPointEnd();
1305 m_text->SetFocus();
1306 }
1307
1308 void MyPanel::DoRemoveText()
1309 {
1310 GetFocusedText()->Remove(0, 10);
1311 }
1312
1313 void MyPanel::DoReplaceText()
1314 {
1315 GetFocusedText()->Replace(3, 8, wxT("ABC"));
1316 }
1317
1318 void MyPanel::DoSelectText()
1319 {
1320 GetFocusedText()->SetSelection(3, 8);
1321 }
1322
1323 //----------------------------------------------------------------------
1324 // MyFrame
1325 //----------------------------------------------------------------------
1326
1327 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
1328 EVT_MENU(TEXT_QUIT, MyFrame::OnQuit)
1329 EVT_MENU(TEXT_ABOUT, MyFrame::OnAbout)
1330 EVT_MENU(TEXT_SAVE, MyFrame::OnFileSave)
1331 EVT_MENU(TEXT_LOAD, MyFrame::OnFileLoad)
1332 EVT_MENU(TEXT_RICH_TEXT_TEST, MyFrame::OnRichTextTest)
1333
1334 EVT_MENU(TEXT_LOG_KEY, MyFrame::OnLogKey)
1335 EVT_MENU(TEXT_LOG_CHAR, MyFrame::OnLogChar)
1336 EVT_MENU(TEXT_LOG_MOUSE,MyFrame::OnLogMouse)
1337 EVT_MENU(TEXT_LOG_TEXT, MyFrame::OnLogText)
1338 EVT_MENU(TEXT_LOG_FOCUS,MyFrame::OnLogFocus)
1339 EVT_MENU(TEXT_LOG_CLIP, MyFrame::OnLogClip)
1340 #if wxUSE_LOG
1341 EVT_MENU(TEXT_CLEAR, MyFrame::OnLogClear)
1342 #endif // wxUSE_LOG
1343
1344 #if wxUSE_TOOLTIPS
1345 EVT_MENU(TEXT_TOOLTIPS_SETDELAY, MyFrame::OnSetTooltipDelay)
1346 EVT_MENU(TEXT_TOOLTIPS_ENABLE, MyFrame::OnToggleTooltips)
1347 #endif // wxUSE_TOOLTIPS
1348
1349 #if wxUSE_CLIPBOARD
1350 EVT_MENU(TEXT_CLIPBOARD_PASTE, MyFrame::OnPasteFromClipboard)
1351 EVT_MENU(TEXT_CLIPBOARD_COPY, MyFrame::OnCopyToClipboard)
1352
1353 EVT_UPDATE_UI(TEXT_CLIPBOARD_PASTE, MyFrame::OnUpdatePasteFromClipboard)
1354 EVT_UPDATE_UI(TEXT_CLIPBOARD_COPY, MyFrame::OnUpdateCopyToClipboard)
1355 #endif // wxUSE_CLIPBOARD
1356
1357 EVT_MENU(TEXT_REMOVE, MyFrame::OnRemoveText)
1358 EVT_MENU(TEXT_REPLACE, MyFrame::OnReplaceText)
1359 EVT_MENU(TEXT_SELECT, MyFrame::OnSelectText)
1360 EVT_MENU(TEXT_ADD_SOME, MyFrame::OnAddText)
1361 EVT_MENU(TEXT_ADD_FREEZE, MyFrame::OnAddTextFreeze)
1362 EVT_MENU(TEXT_ADD_LINE, MyFrame::OnAddTextLine)
1363 EVT_MENU(TEXT_MOVE_ENDTEXT, MyFrame::OnMoveToEndOfText)
1364 EVT_MENU(TEXT_MOVE_ENDENTRY, MyFrame::OnMoveToEndOfEntry)
1365
1366 EVT_MENU(TEXT_SET_EDITABLE, MyFrame::OnSetEditable)
1367 EVT_MENU(TEXT_SET_ENABLED, MyFrame::OnSetEnabled)
1368
1369 EVT_MENU(TEXT_LINE_DOWN, MyFrame::OnScrollLineDown)
1370 EVT_MENU(TEXT_LINE_UP, MyFrame::OnScrollLineUp)
1371 EVT_MENU(TEXT_PAGE_DOWN, MyFrame::OnScrollPageDown)
1372 EVT_MENU(TEXT_PAGE_UP, MyFrame::OnScrollPageUp)
1373
1374 EVT_MENU(TEXT_GET_LINE, MyFrame::OnGetLine)
1375 EVT_MENU(TEXT_GET_LINELENGTH, MyFrame::OnGetLineLength)
1376
1377 EVT_MENU(TEXT_SET, MyFrame::OnSetText)
1378 EVT_MENU(TEXT_CHANGE, MyFrame::OnChangeText)
1379
1380 EVT_IDLE(MyFrame::OnIdle)
1381 END_EVENT_TABLE()
1382
1383 MyFrame::MyFrame(wxFrame *frame, const wxChar *title, int x, int y, int w, int h)
1384 : wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h) )
1385 {
1386 SetIcon(wxICON(sample));
1387
1388 #if wxUSE_STATUSBAR
1389 CreateStatusBar(2);
1390 #endif // wxUSE_STATUSBAR
1391
1392 m_panel = new MyPanel( this, 10, 10, 300, 100 );
1393 }
1394
1395 void MyFrame::OnQuit (wxCommandEvent& WXUNUSED(event) )
1396 {
1397 Close(true);
1398 }
1399
1400 void MyFrame::OnAbout( wxCommandEvent& WXUNUSED(event) )
1401 {
1402 wxBeginBusyCursor();
1403
1404 wxMessageDialog dialog(this,
1405 wxT("This is a text control sample. It demonstrates the many different\n")
1406 wxT("text control styles, the use of the clipboard, setting and handling\n")
1407 wxT("tooltips and intercepting key and char events.\n")
1408 wxT("\n")
1409 wxT("Copyright (c) 1999, Robert Roebling, Julian Smart, Vadim Zeitlin"),
1410 wxT("About wxTextCtrl Sample"),
1411 wxOK | wxICON_INFORMATION);
1412
1413 dialog.ShowModal();
1414
1415 wxEndBusyCursor();
1416 }
1417
1418 #if wxUSE_TOOLTIPS
1419
1420 void MyFrame::OnSetTooltipDelay(wxCommandEvent& WXUNUSED(event))
1421 {
1422 static long s_delay = 5000;
1423
1424 wxString delay;
1425 delay.Printf( wxT("%ld"), s_delay);
1426
1427 delay = wxGetTextFromUser(wxT("Enter delay (in milliseconds)"),
1428 wxT("Set tooltip delay"),
1429 delay,
1430 this);
1431 if ( !delay )
1432 return; // cancelled
1433
1434 wxSscanf(delay, wxT("%ld"), &s_delay);
1435
1436 wxToolTip::SetDelay(s_delay);
1437
1438 wxLogStatus(this, wxT("Tooltip delay set to %ld milliseconds"), s_delay);
1439 }
1440
1441 void MyFrame::OnToggleTooltips(wxCommandEvent& WXUNUSED(event))
1442 {
1443 static bool s_enabled = true;
1444
1445 s_enabled = !s_enabled;
1446
1447 wxToolTip::Enable(s_enabled);
1448
1449 wxLogStatus(this, wxT("Tooltips %sabled"), s_enabled ? wxT("en") : wxT("dis") );
1450 }
1451 #endif // tooltips
1452
1453 #if wxUSE_LOG
1454 void MyFrame::OnLogClear(wxCommandEvent& WXUNUSED(event))
1455 {
1456 m_panel->m_log->Clear();
1457 }
1458 #endif // wxUSE_LOG
1459
1460 void MyFrame::OnSetEditable(wxCommandEvent& WXUNUSED(event))
1461 {
1462 static bool s_editable = true;
1463
1464 s_editable = !s_editable;
1465 m_panel->m_text->SetEditable(s_editable);
1466 m_panel->m_password->SetEditable(s_editable);
1467 m_panel->m_multitext->SetEditable(s_editable);
1468 m_panel->m_textrich->SetEditable(s_editable);
1469 }
1470
1471 void MyFrame::OnSetEnabled(wxCommandEvent& WXUNUSED(event))
1472 {
1473 bool enabled = m_panel->m_text->IsEnabled();
1474 enabled = !enabled;
1475
1476 m_panel->m_text->Enable(enabled);
1477 m_panel->m_password->Enable(enabled);
1478 m_panel->m_multitext->Enable(enabled);
1479 m_panel->m_readonly->Enable(enabled);
1480 m_panel->m_limited->Enable(enabled);
1481 m_panel->m_textrich->Enable(enabled);
1482 }
1483
1484 void MyFrame::OnFileSave(wxCommandEvent& WXUNUSED(event))
1485 {
1486 if ( m_panel->m_textrich->SaveFile(wxT("dummy.txt")) )
1487 {
1488 #if wxUSE_FILE
1489 // verify that the fil length is correct (it wasn't under Win95)
1490 wxFile file(wxT("dummy.txt"));
1491 wxLogStatus(this,
1492 wxT("Successfully saved file (text len = %lu, file size = %ld)"),
1493 (unsigned long)m_panel->m_textrich->GetValue().length(),
1494 (long) file.Length());
1495 #endif
1496 }
1497 else
1498 wxLogStatus(this, wxT("Couldn't save the file"));
1499 }
1500
1501 void MyFrame::OnFileLoad(wxCommandEvent& WXUNUSED(event))
1502 {
1503 if ( m_panel->m_textrich->LoadFile(wxT("dummy.txt")) )
1504 {
1505 wxLogStatus(this, wxT("Successfully loaded file"));
1506 }
1507 else
1508 {
1509 wxLogStatus(this, wxT("Couldn't load the file"));
1510 }
1511 }
1512
1513 void MyFrame::OnRichTextTest(wxCommandEvent& WXUNUSED(event))
1514 {
1515 RichTextFrame* frame = new RichTextFrame(this, wxT("Rich Text Editor"));
1516 frame->Show(true);
1517 }
1518
1519 void MyFrame::OnIdle( wxIdleEvent& event )
1520 {
1521 // track the window which has the focus in the status bar
1522 static wxWindow *s_windowFocus = (wxWindow *)NULL;
1523 wxWindow *focus = wxWindow::FindFocus();
1524 if ( focus && (focus != s_windowFocus) )
1525 {
1526 s_windowFocus = focus;
1527
1528 wxString msg;
1529 msg.Printf(
1530 #ifdef __WXMSW__
1531 wxT("Focus: wxWindow = %p, HWND = %p"),
1532 #else
1533 wxT("Focus: wxWindow = %p"),
1534 #endif
1535 s_windowFocus
1536 #ifdef __WXMSW__
1537 , s_windowFocus->GetHWND()
1538 #endif
1539 );
1540
1541 #if wxUSE_STATUSBAR
1542 SetStatusText(msg);
1543 #endif // wxUSE_STATUSBAR
1544 }
1545 event.Skip();
1546 }
1547
1548 /*
1549 * RichTextFrame is used to demonstrate rich text behaviour
1550 */
1551
1552 enum
1553 {
1554 RICHTEXT_CLOSE = 1000,
1555 RICHTEXT_LEFT_ALIGN,
1556 RICHTEXT_RIGHT_ALIGN,
1557 RICHTEXT_CENTRE,
1558 RICHTEXT_JUSTIFY,
1559 RICHTEXT_CHANGE_FONT,
1560 RICHTEXT_CHANGE_TEXT_COLOUR,
1561 RICHTEXT_CHANGE_BACKGROUND_COLOUR,
1562 RICHTEXT_LEFT_INDENT,
1563 RICHTEXT_RIGHT_INDENT,
1564 RICHTEXT_TAB_STOPS
1565 };
1566
1567 BEGIN_EVENT_TABLE(RichTextFrame, wxFrame)
1568 EVT_IDLE(RichTextFrame::OnIdle)
1569 EVT_MENU(RICHTEXT_CLOSE, RichTextFrame::OnClose)
1570 EVT_MENU(RICHTEXT_LEFT_ALIGN, RichTextFrame::OnLeftAlign)
1571 EVT_MENU(RICHTEXT_RIGHT_ALIGN, RichTextFrame::OnRightAlign)
1572 EVT_MENU(RICHTEXT_CENTRE, RichTextFrame::OnCentre)
1573 EVT_MENU(RICHTEXT_JUSTIFY, RichTextFrame::OnJustify)
1574 EVT_MENU(RICHTEXT_CHANGE_FONT, RichTextFrame::OnChangeFont)
1575 EVT_MENU(RICHTEXT_CHANGE_TEXT_COLOUR, RichTextFrame::OnChangeTextColour)
1576 EVT_MENU(RICHTEXT_CHANGE_BACKGROUND_COLOUR, RichTextFrame::OnChangeBackgroundColour)
1577 EVT_MENU(RICHTEXT_LEFT_INDENT, RichTextFrame::OnLeftIndent)
1578 EVT_MENU(RICHTEXT_RIGHT_INDENT, RichTextFrame::OnRightIndent)
1579 EVT_MENU(RICHTEXT_TAB_STOPS, RichTextFrame::OnTabStops)
1580 END_EVENT_TABLE()
1581
1582 RichTextFrame::RichTextFrame(wxWindow* parent, const wxString& title):
1583 wxFrame(parent, wxID_ANY, title, wxDefaultPosition, wxSize(300, 400))
1584 {
1585 m_currentPosition = -1;
1586 m_textCtrl = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition,
1587 wxDefaultSize, wxTE_MULTILINE|wxTE_RICH2);
1588
1589 wxString value;
1590 int i;
1591 for (i = 0; i < 10; i++)
1592 {
1593 int j;
1594 for (j = 0; j < 10; j++)
1595 {
1596 value << wxT("Hello, welcome to a very simple rich text editor. You can set some character and paragraph styles from the Edit menu. ");
1597 }
1598 value << wxT("\n\n");
1599 }
1600 m_textCtrl->SetValue(value);
1601
1602 wxMenuBar* menuBar = new wxMenuBar;
1603 wxMenu* fileMenu = new wxMenu;
1604 fileMenu->Append(RICHTEXT_CLOSE, _("Close\tCtrl+W"));
1605 menuBar->Append(fileMenu, _("File"));
1606
1607 wxMenu* editMenu = new wxMenu;
1608 editMenu->Append(RICHTEXT_LEFT_ALIGN, _("Left Align"));
1609 editMenu->Append(RICHTEXT_RIGHT_ALIGN, _("Right Align"));
1610 editMenu->Append(RICHTEXT_CENTRE, _("Centre"));
1611 editMenu->Append(RICHTEXT_JUSTIFY, _("Justify"));
1612 editMenu->AppendSeparator();
1613 editMenu->Append(RICHTEXT_CHANGE_FONT, _("Change Font"));
1614 editMenu->Append(RICHTEXT_CHANGE_TEXT_COLOUR, _("Change Text Colour"));
1615 editMenu->Append(RICHTEXT_CHANGE_BACKGROUND_COLOUR, _("Change Background Colour"));
1616 editMenu->AppendSeparator();
1617 editMenu->Append(RICHTEXT_LEFT_INDENT, _("Left Indent"));
1618 editMenu->Append(RICHTEXT_RIGHT_INDENT, _("Right Indent"));
1619 editMenu->Append(RICHTEXT_TAB_STOPS, _("Tab Stops"));
1620 menuBar->Append(editMenu, _("Edit"));
1621
1622 SetMenuBar(menuBar);
1623 #if wxUSE_STATUSBAR
1624 CreateStatusBar();
1625 #endif // wxUSE_STATUSBAR
1626 }
1627
1628 // Event handlers
1629
1630 void RichTextFrame::OnClose(wxCommandEvent& WXUNUSED(event))
1631 {
1632 Close(true);
1633 }
1634
1635 void RichTextFrame::OnLeftAlign(wxCommandEvent& WXUNUSED(event))
1636 {
1637 wxTextAttr attr;
1638 attr.SetAlignment(wxTEXT_ALIGNMENT_LEFT);
1639
1640 long start, end;
1641 m_textCtrl->GetSelection(& start, & end);
1642 m_textCtrl->SetStyle(start, end, attr);
1643
1644 m_currentPosition = -1;
1645 }
1646
1647 void RichTextFrame::OnRightAlign(wxCommandEvent& WXUNUSED(event))
1648 {
1649 wxTextAttr attr;
1650 attr.SetAlignment(wxTEXT_ALIGNMENT_RIGHT);
1651
1652 long start, end;
1653 m_textCtrl->GetSelection(& start, & end);
1654 m_textCtrl->SetStyle(start, end, attr);
1655
1656 m_currentPosition = -1;
1657 }
1658
1659 void RichTextFrame::OnJustify(wxCommandEvent& WXUNUSED(event))
1660 {
1661 wxTextAttr attr;
1662 attr.SetAlignment(wxTEXT_ALIGNMENT_JUSTIFIED);
1663
1664 long start, end;
1665 m_textCtrl->GetSelection(& start, & end);
1666 m_textCtrl->SetStyle(start, end, attr);
1667
1668 m_currentPosition = -1;
1669 }
1670
1671 void RichTextFrame::OnCentre(wxCommandEvent& WXUNUSED(event))
1672 {
1673 wxTextAttr attr;
1674 attr.SetAlignment(wxTEXT_ALIGNMENT_CENTRE);
1675
1676 long start, end;
1677 m_textCtrl->GetSelection(& start, & end);
1678 m_textCtrl->SetStyle(start, end, attr);
1679
1680 m_currentPosition = -1;
1681 }
1682
1683 void RichTextFrame::OnChangeFont(wxCommandEvent& WXUNUSED(event))
1684 {
1685 wxFontData data;
1686
1687 wxFontDialog dialog(this, data);
1688
1689 if (dialog.ShowModal() == wxID_OK)
1690 {
1691 wxFontData retData = dialog.GetFontData();
1692 wxFont font = retData.GetChosenFont();
1693
1694 wxTextAttr attr;
1695 attr.SetFont(font);
1696
1697 long start, end;
1698 m_textCtrl->GetSelection(& start, & end);
1699 m_textCtrl->SetStyle(start, end, attr);
1700
1701 m_currentPosition = -1;
1702 }
1703 }
1704
1705 void RichTextFrame::OnChangeTextColour(wxCommandEvent& WXUNUSED(event))
1706 {
1707 wxColourData data;
1708 data.SetColour(* wxBLACK);
1709 data.SetChooseFull(true);
1710 for (int i = 0; i < 16; i++)
1711 {
1712 wxColour colour((unsigned char)(i*16), (unsigned char)(i*16), (unsigned char)(i*16));
1713 data.SetCustomColour(i, colour);
1714 }
1715
1716 wxColourDialog dialog(this, &data);
1717 dialog.SetTitle(wxT("Choose the text colour"));
1718 if (dialog.ShowModal() == wxID_OK)
1719 {
1720 wxColourData retData = dialog.GetColourData();
1721 wxColour col = retData.GetColour();
1722
1723 wxTextAttr attr;
1724 attr.SetTextColour(col);
1725
1726 long start, end;
1727 m_textCtrl->GetSelection(& start, & end);
1728 m_textCtrl->SetStyle(start, end, attr);
1729
1730 m_currentPosition = -1;
1731 }
1732 }
1733
1734 void RichTextFrame::OnChangeBackgroundColour(wxCommandEvent& WXUNUSED(event))
1735 {
1736 wxColourData data;
1737 data.SetColour(* wxWHITE);
1738 data.SetChooseFull(true);
1739 for (int i = 0; i < 16; i++)
1740 {
1741 wxColour colour((unsigned char)(i*16), (unsigned char)(i*16), (unsigned char)(i*16));
1742 data.SetCustomColour(i, colour);
1743 }
1744
1745 wxColourDialog dialog(this, &data);
1746 dialog.SetTitle(wxT("Choose the text background colour"));
1747 if (dialog.ShowModal() == wxID_OK)
1748 {
1749 wxColourData retData = dialog.GetColourData();
1750 wxColour col = retData.GetColour();
1751
1752 wxTextAttr attr;
1753 attr.SetBackgroundColour(col);
1754
1755 long start, end;
1756 m_textCtrl->GetSelection(& start, & end);
1757 m_textCtrl->SetStyle(start, end, attr);
1758
1759 m_currentPosition = -1;
1760 }
1761 }
1762
1763 void RichTextFrame::OnLeftIndent(wxCommandEvent& WXUNUSED(event))
1764 {
1765 wxString indentStr = wxGetTextFromUser
1766 (
1767 _("Please enter the left indent in tenths of a millimetre."),
1768 _("Left Indent"),
1769 wxEmptyString,
1770 this
1771 );
1772 if (!indentStr.IsEmpty())
1773 {
1774 int indent = wxAtoi(indentStr);
1775
1776 wxTextAttr attr;
1777 attr.SetLeftIndent(indent);
1778
1779 long start, end;
1780 m_textCtrl->GetSelection(& start, & end);
1781 m_textCtrl->SetStyle(start, end, attr);
1782
1783 m_currentPosition = -1;
1784 }
1785 }
1786
1787 void RichTextFrame::OnRightIndent(wxCommandEvent& WXUNUSED(event))
1788 {
1789 wxString indentStr = wxGetTextFromUser
1790 (
1791 _("Please enter the right indent in tenths of a millimetre."),
1792 _("Right Indent"),
1793 wxEmptyString,
1794 this
1795 );
1796 if (!indentStr.IsEmpty())
1797 {
1798 int indent = wxAtoi(indentStr);
1799
1800 wxTextAttr attr;
1801 attr.SetRightIndent(indent);
1802
1803 long start, end;
1804 m_textCtrl->GetSelection(& start, & end);
1805 m_textCtrl->SetStyle(start, end, attr);
1806
1807 m_currentPosition = -1;
1808 }
1809 }
1810
1811 void RichTextFrame::OnTabStops(wxCommandEvent& WXUNUSED(event))
1812 {
1813 wxString tabsStr = wxGetTextFromUser
1814 (
1815 _("Please enter the tab stop positions in tenths of a millimetre, separated by spaces.\nLeave empty to reset tab stops."),
1816 _("Tab Stops"),
1817 wxEmptyString,
1818 this
1819 );
1820
1821 wxArrayInt tabs;
1822
1823 wxStringTokenizer tokens(tabsStr, wxT(" "));
1824 while (tokens.HasMoreTokens())
1825 {
1826 wxString token = tokens.GetNextToken();
1827 tabs.Add(wxAtoi(token));
1828 }
1829
1830 wxTextAttr attr;
1831 attr.SetTabs(tabs);
1832
1833 long start, end;
1834 m_textCtrl->GetSelection(& start, & end);
1835 m_textCtrl->SetStyle(start, end, attr);
1836
1837 m_currentPosition = -1;
1838 }
1839
1840 void RichTextFrame::OnIdle(wxIdleEvent& WXUNUSED(event))
1841 {
1842 long insertionPoint = m_textCtrl->GetInsertionPoint();
1843 if (insertionPoint != m_currentPosition)
1844 {
1845 #if wxUSE_STATUSBAR
1846 wxTextAttr attr;
1847 if (m_textCtrl->GetStyle(insertionPoint, attr))
1848 {
1849 wxString msg;
1850 wxString facename(wxT("unknown"));
1851 if (attr.GetFont().Ok())
1852 {
1853 facename = attr.GetFont().GetFaceName();
1854 }
1855 wxString alignment(wxT("unknown alignment"));
1856 if (attr.GetAlignment() == wxTEXT_ALIGNMENT_CENTRE)
1857 alignment = wxT("centred");
1858 else if (attr.GetAlignment() == wxTEXT_ALIGNMENT_RIGHT)
1859 alignment = wxT("right-aligned");
1860 else if (attr.GetAlignment() == wxTEXT_ALIGNMENT_LEFT)
1861 alignment = wxT("left-aligned");
1862 else if (attr.GetAlignment() == wxTEXT_ALIGNMENT_JUSTIFIED)
1863 alignment = wxT("justified");
1864
1865 msg.Printf("Facename: %s", facename);
1866
1867 if (attr.HasTextColour())
1868 {
1869 msg += wxString::Format(", colour: %s",
1870 attr.GetTextColour().GetAsString());
1871 }
1872 else
1873 {
1874 msg += ", no colour";
1875 }
1876
1877 msg << ", " << alignment;
1878
1879 if (attr.HasFont())
1880 {
1881 if (attr.GetFont().GetWeight() == wxBOLD)
1882 msg += wxT(" BOLD");
1883 else if (attr.GetFont().GetWeight() == wxNORMAL)
1884 msg += wxT(" NORMAL");
1885
1886 if (attr.GetFont().GetStyle() == wxITALIC)
1887 msg += wxT(" ITALIC");
1888
1889 if (attr.GetFont().GetUnderlined())
1890 msg += wxT(" UNDERLINED");
1891 }
1892
1893 SetStatusText(msg);
1894 }
1895 #endif // wxUSE_STATUSBAR
1896 m_currentPosition = insertionPoint;
1897 }
1898 }