1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: TextCtrl wxWidgets sample
4 // Author: Robert Roebling
7 // Copyright: (c) Robert Roebling, Julian Smart, Vadim Zeitlin
8 // Licence: wxWindows license
9 /////////////////////////////////////////////////////////////////////////////
11 // For compilers that support precompilation, includes "wx/wx.h".
12 #include "wx/wxprec.h"
23 #include "wx/dataobj.h"
24 #include "wx/clipbrd.h"
32 #include "wx/tooltip.h"
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
43 #include "wx/colordlg.h"
44 #include "wx/fontdlg.h"
45 #include "wx/numdlg.h"
46 #include "wx/tokenzr.h"
49 #include "../sample.xpm"
52 //----------------------------------------------------------------------
54 //----------------------------------------------------------------------
56 class MyApp
: public wxApp
62 // a text ctrl which allows to call different wxTextCtrl functions
63 // interactively by pressing function keys in it
64 class MyTextCtrl
: public wxTextCtrl
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
)
74 void OnKeyDown(wxKeyEvent
& event
);
75 void OnKeyUp(wxKeyEvent
& event
);
76 void OnChar(wxKeyEvent
& event
);
78 void OnText(wxCommandEvent
& event
);
79 void OnTextEnter(wxCommandEvent
& event
);
80 void OnTextURL(wxTextUrlEvent
& event
);
81 void OnTextMaxLen(wxCommandEvent
& event
);
83 void OnTextCut(wxClipboardTextEvent
& event
);
84 void OnTextCopy(wxClipboardTextEvent
& event
);
85 void OnTextPaste(wxClipboardTextEvent
& event
);
87 void OnMouseEvent(wxMouseEvent
& event
);
89 void OnSetFocus(wxFocusEvent
& event
);
90 void OnKillFocus(wxFocusEvent
& event
);
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
;
100 static inline wxChar
GetChar(bool on
, wxChar c
) { return on
? c
: wxT('-'); }
102 void LogKeyEvent(const wxChar
*name
, wxKeyEvent
& event
) const;
103 void LogClipEvent(const wxChar
*what
, wxClipboardTextEvent
& event
);
107 DECLARE_EVENT_TABLE()
110 class MyPanel
: public wxPanel
113 MyPanel(wxFrame
*frame
, int x
, int y
, int w
, int h
);
117 delete wxLog::SetActiveTarget(m_logOld
);
122 void DoPasteFromClipboard();
123 void DoCopyToClipboard();
124 #endif // wxUSE_CLIPBOARD
127 void DoReplaceText();
129 void DoMoveToEndOfText();
130 void DoMoveToEndOfEntry();
132 // return true if currently text control has any selection
133 bool HasSelection() const
136 GetFocusedText()->GetSelection(&from
, &to
);
141 MyTextCtrl
*m_password
;
144 MyTextCtrl
*m_readonly
;
145 MyTextCtrl
*m_limited
;
147 MyTextCtrl
*m_multitext
;
148 MyTextCtrl
*m_horizontal
;
150 MyTextCtrl
*m_textrich
;
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;
164 class MyFrame
: public wxFrame
167 MyFrame(wxFrame
*frame
, const wxChar
*title
, int x
, int y
, int w
, int h
);
169 void OnQuit(wxCommandEvent
& event
);
170 void OnAbout(wxCommandEvent
& event
);
172 void OnSetTooltipDelay(wxCommandEvent
& event
);
173 void OnToggleTooltips(wxCommandEvent
& event
);
174 #endif // wxUSE_TOOLTIPS
177 void OnPasteFromClipboard( wxCommandEvent
& WXUNUSED(event
) )
179 wxLogMessage(wxT("Pasting text from clipboard."));
180 m_panel
->DoPasteFromClipboard();
182 void OnCopyToClipboard( wxCommandEvent
& WXUNUSED(event
) )
184 wxLogMessage(wxT("Copying text to clipboard."));
185 m_panel
->DoCopyToClipboard();
188 void OnUpdatePasteFromClipboard(wxUpdateUIEvent
& event
)
190 wxClipboardLocker lockClip
;
192 event
.Enable( wxTheClipboard
->IsSupported(wxDF_TEXT
) );
195 void OnUpdateCopyToClipboard(wxUpdateUIEvent
& event
)
197 event
.Enable( m_panel
->HasSelection() );
199 #endif // wxUSE_CLIPBOARD
201 void OnAddTextLine(wxCommandEvent
& WXUNUSED(event
))
204 m_panel
->m_textrich
->AppendText(wxString::Format("Line %d\n", ++s_n
));
207 void OnAddTextFreeze( wxCommandEvent
& WXUNUSED(event
) )
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(); }
218 void OnMoveToEndOfText( wxCommandEvent
& WXUNUSED(event
) )
219 { m_panel
->DoMoveToEndOfText(); }
220 void OnMoveToEndOfEntry( wxCommandEvent
& WXUNUSED(event
) )
221 { m_panel
->DoMoveToEndOfEntry(); }
223 void OnScrollLineDown(wxCommandEvent
& WXUNUSED(event
))
225 if ( !m_panel
->m_textrich
->LineDown() )
227 wxLogMessage(wxT("Already at the bottom"));
231 void OnScrollLineUp(wxCommandEvent
& WXUNUSED(event
))
233 if ( !m_panel
->m_textrich
->LineUp() )
235 wxLogMessage(wxT("Already at the top"));
239 void OnScrollPageDown(wxCommandEvent
& WXUNUSED(event
))
241 if ( !m_panel
->m_textrich
->PageDown() )
243 wxLogMessage(wxT("Already at the bottom"));
247 void OnScrollPageUp(wxCommandEvent
& WXUNUSED(event
))
249 if ( !m_panel
->m_textrich
->PageUp() )
251 wxLogMessage(wxT("Already at the top"));
255 void OnGetLine(wxCommandEvent
& WXUNUSED(event
))
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") );
261 wxMessageBox(m_panel
->m_tab
->GetLineText(nLine
));
264 void OnGetLineLength(wxCommandEvent
& WXUNUSED(event
))
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") );
270 wxMessageBox(wxString::Format(wxT("Length of line %i is:%i"),
272 m_panel
->m_tab
->GetLineLength(nLine
))
277 void OnLogClear(wxCommandEvent
& event
);
279 void OnFileSave(wxCommandEvent
& event
);
280 void OnFileLoad(wxCommandEvent
& event
);
281 void OnRichTextTest(wxCommandEvent
& event
);
283 void OnSetEditable(wxCommandEvent
& event
);
284 void OnSetEnabled(wxCommandEvent
& event
);
286 void OnLogKey(wxCommandEvent
& event
)
288 MyTextCtrl::ms_logKey
= event
.IsChecked();
291 void OnLogChar(wxCommandEvent
& event
)
293 MyTextCtrl::ms_logChar
= event
.IsChecked();
296 void OnLogMouse(wxCommandEvent
& event
)
298 MyTextCtrl::ms_logMouse
= event
.IsChecked();
301 void OnLogText(wxCommandEvent
& event
)
303 MyTextCtrl::ms_logText
= event
.IsChecked();
306 void OnLogFocus(wxCommandEvent
& event
)
308 MyTextCtrl::ms_logFocus
= event
.IsChecked();
311 void OnLogClip(wxCommandEvent
& event
)
313 MyTextCtrl::ms_logClip
= event
.IsChecked();
316 void OnSetText(wxCommandEvent
& WXUNUSED(event
))
318 m_panel
->m_text
->SetValue(wxT("Hello, world! (what else did you expect?)"));
321 void OnChangeText(wxCommandEvent
& WXUNUSED(event
))
323 m_panel
->m_text
->ChangeValue(wxT("Changed, not set: no event"));
326 void OnIdle( wxIdleEvent
& event
);
329 void DoAddText(bool freeze
)
331 wxTextCtrl
* const text
= m_panel
->m_textrich
;
338 for ( int i
= 0; i
< 100; i
++ )
340 text
->AppendText(wxString::Format(wxT("Line %i\n"), i
));
343 text
->SetInsertionPoint(0);
351 DECLARE_EVENT_TABLE()
355 * RichTextFrame is used to demonstrate rich text behaviour
358 class RichTextFrame
: public wxFrame
361 RichTextFrame(wxWindow
* parent
, const wxString
& title
);
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
);
379 wxTextCtrl
*m_textCtrl
;
380 long m_currentPosition
;
382 DECLARE_EVENT_TABLE()
385 //----------------------------------------------------------------------
387 //----------------------------------------------------------------------
391 //----------------------------------------------------------------------
393 //----------------------------------------------------------------------
397 TEXT_QUIT
= wxID_EXIT
,
398 TEXT_ABOUT
= wxID_ABOUT
,
405 TEXT_CLIPBOARD_COPY
= 200,
406 TEXT_CLIPBOARD_PASTE
,
410 TEXT_TOOLTIPS_SETDELAY
= 300,
411 TEXT_TOOLTIPS_ENABLE
,
448 if ( !wxApp::OnInit() )
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 );
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"));
468 wxMenuBar
*menu_bar
= new wxMenuBar( wxMB_DOCKABLE
);
469 menu_bar
->Append(file_menu
, wxT("&File"));
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
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
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"));
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"));
533 // select only the interesting events by default
534 MyTextCtrl::ms_logClip
=
535 MyTextCtrl::ms_logText
= true;
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
);
541 menu_bar
->Append(menuLog
, wxT("&Log"));
544 frame
->SetMenuBar(menu_bar
);
554 //----------------------------------------------------------------------
556 //----------------------------------------------------------------------
558 BEGIN_EVENT_TABLE(MyTextCtrl
, wxTextCtrl
)
559 EVT_KEY_DOWN(MyTextCtrl::OnKeyDown
)
560 EVT_KEY_UP(MyTextCtrl::OnKeyUp
)
561 EVT_CHAR(MyTextCtrl::OnChar
)
563 EVT_TEXT(wxID_ANY
, MyTextCtrl::OnText
)
564 EVT_TEXT_ENTER(wxID_ANY
, MyTextCtrl::OnTextEnter
)
565 EVT_TEXT_URL(wxID_ANY
, MyTextCtrl::OnTextURL
)
566 EVT_TEXT_MAXLEN(wxID_ANY
, MyTextCtrl::OnTextMaxLen
)
567 EVT_TEXT_CUT(wxID_ANY
, MyTextCtrl::OnTextCut
)
568 EVT_TEXT_COPY(wxID_ANY
, MyTextCtrl::OnTextCopy
)
569 EVT_TEXT_PASTE(wxID_ANY
, MyTextCtrl::OnTextPaste
)
571 EVT_MOUSE_EVENTS(MyTextCtrl::OnMouseEvent
)
573 EVT_SET_FOCUS(MyTextCtrl::OnSetFocus
)
574 EVT_KILL_FOCUS(MyTextCtrl::OnKillFocus
)
577 bool MyTextCtrl::ms_logKey
= false;
578 bool MyTextCtrl::ms_logChar
= false;
579 bool MyTextCtrl::ms_logMouse
= false;
580 bool MyTextCtrl::ms_logText
= false;
581 bool MyTextCtrl::ms_logFocus
= false;
582 bool MyTextCtrl::ms_logClip
= false;
584 void MyTextCtrl::LogKeyEvent(const wxChar
*name
, wxKeyEvent
& event
) const
587 long keycode
= event
.GetKeyCode();
591 case WXK_BACK
: key
= wxT("BACK"); break;
592 case WXK_TAB
: key
= wxT("TAB"); break;
593 case WXK_RETURN
: key
= wxT("RETURN"); break;
594 case WXK_ESCAPE
: key
= wxT("ESCAPE"); break;
595 case WXK_SPACE
: key
= wxT("SPACE"); break;
596 case WXK_DELETE
: key
= wxT("DELETE"); break;
597 case WXK_START
: key
= wxT("START"); break;
598 case WXK_LBUTTON
: key
= wxT("LBUTTON"); break;
599 case WXK_RBUTTON
: key
= wxT("RBUTTON"); break;
600 case WXK_CANCEL
: key
= wxT("CANCEL"); break;
601 case WXK_MBUTTON
: key
= wxT("MBUTTON"); break;
602 case WXK_CLEAR
: key
= wxT("CLEAR"); break;
603 case WXK_SHIFT
: key
= wxT("SHIFT"); break;
604 case WXK_ALT
: key
= wxT("ALT"); break;
605 case WXK_CONTROL
: key
= wxT("CONTROL"); break;
606 case WXK_MENU
: key
= wxT("MENU"); break;
607 case WXK_PAUSE
: key
= wxT("PAUSE"); break;
608 case WXK_CAPITAL
: key
= wxT("CAPITAL"); break;
609 case WXK_END
: key
= wxT("END"); break;
610 case WXK_HOME
: key
= wxT("HOME"); break;
611 case WXK_LEFT
: key
= wxT("LEFT"); break;
612 case WXK_UP
: key
= wxT("UP"); break;
613 case WXK_RIGHT
: key
= wxT("RIGHT"); break;
614 case WXK_DOWN
: key
= wxT("DOWN"); break;
615 case WXK_SELECT
: key
= wxT("SELECT"); break;
616 case WXK_PRINT
: key
= wxT("PRINT"); break;
617 case WXK_EXECUTE
: key
= wxT("EXECUTE"); break;
618 case WXK_SNAPSHOT
: key
= wxT("SNAPSHOT"); break;
619 case WXK_INSERT
: key
= wxT("INSERT"); break;
620 case WXK_HELP
: key
= wxT("HELP"); break;
621 case WXK_NUMPAD0
: key
= wxT("NUMPAD0"); break;
622 case WXK_NUMPAD1
: key
= wxT("NUMPAD1"); break;
623 case WXK_NUMPAD2
: key
= wxT("NUMPAD2"); break;
624 case WXK_NUMPAD3
: key
= wxT("NUMPAD3"); break;
625 case WXK_NUMPAD4
: key
= wxT("NUMPAD4"); break;
626 case WXK_NUMPAD5
: key
= wxT("NUMPAD5"); break;
627 case WXK_NUMPAD6
: key
= wxT("NUMPAD6"); break;
628 case WXK_NUMPAD7
: key
= wxT("NUMPAD7"); break;
629 case WXK_NUMPAD8
: key
= wxT("NUMPAD8"); break;
630 case WXK_NUMPAD9
: key
= wxT("NUMPAD9"); break;
631 case WXK_MULTIPLY
: key
= wxT("MULTIPLY"); break;
632 case WXK_ADD
: key
= wxT("ADD"); break;
633 case WXK_SEPARATOR
: key
= wxT("SEPARATOR"); break;
634 case WXK_SUBTRACT
: key
= wxT("SUBTRACT"); break;
635 case WXK_DECIMAL
: key
= wxT("DECIMAL"); break;
636 case WXK_DIVIDE
: key
= wxT("DIVIDE"); break;
637 case WXK_F1
: key
= wxT("F1"); break;
638 case WXK_F2
: key
= wxT("F2"); break;
639 case WXK_F3
: key
= wxT("F3"); break;
640 case WXK_F4
: key
= wxT("F4"); break;
641 case WXK_F5
: key
= wxT("F5"); break;
642 case WXK_F6
: key
= wxT("F6"); break;
643 case WXK_F7
: key
= wxT("F7"); break;
644 case WXK_F8
: key
= wxT("F8"); break;
645 case WXK_F9
: key
= wxT("F9"); break;
646 case WXK_F10
: key
= wxT("F10"); break;
647 case WXK_F11
: key
= wxT("F11"); break;
648 case WXK_F12
: key
= wxT("F12"); break;
649 case WXK_F13
: key
= wxT("F13"); break;
650 case WXK_F14
: key
= wxT("F14"); break;
651 case WXK_F15
: key
= wxT("F15"); break;
652 case WXK_F16
: key
= wxT("F16"); break;
653 case WXK_F17
: key
= wxT("F17"); break;
654 case WXK_F18
: key
= wxT("F18"); break;
655 case WXK_F19
: key
= wxT("F19"); break;
656 case WXK_F20
: key
= wxT("F20"); break;
657 case WXK_F21
: key
= wxT("F21"); break;
658 case WXK_F22
: key
= wxT("F22"); break;
659 case WXK_F23
: key
= wxT("F23"); break;
660 case WXK_F24
: key
= wxT("F24"); break;
661 case WXK_NUMLOCK
: key
= wxT("NUMLOCK"); break;
662 case WXK_SCROLL
: key
= wxT("SCROLL"); break;
663 case WXK_PAGEUP
: key
= wxT("PAGEUP"); break;
664 case WXK_PAGEDOWN
: key
= wxT("PAGEDOWN"); break;
665 case WXK_NUMPAD_SPACE
: key
= wxT("NUMPAD_SPACE"); break;
666 case WXK_NUMPAD_TAB
: key
= wxT("NUMPAD_TAB"); break;
667 case WXK_NUMPAD_ENTER
: key
= wxT("NUMPAD_ENTER"); break;
668 case WXK_NUMPAD_F1
: key
= wxT("NUMPAD_F1"); break;
669 case WXK_NUMPAD_F2
: key
= wxT("NUMPAD_F2"); break;
670 case WXK_NUMPAD_F3
: key
= wxT("NUMPAD_F3"); break;
671 case WXK_NUMPAD_F4
: key
= wxT("NUMPAD_F4"); break;
672 case WXK_NUMPAD_HOME
: key
= wxT("NUMPAD_HOME"); break;
673 case WXK_NUMPAD_LEFT
: key
= wxT("NUMPAD_LEFT"); break;
674 case WXK_NUMPAD_UP
: key
= wxT("NUMPAD_UP"); break;
675 case WXK_NUMPAD_RIGHT
: key
= wxT("NUMPAD_RIGHT"); break;
676 case WXK_NUMPAD_DOWN
: key
= wxT("NUMPAD_DOWN"); break;
677 case WXK_NUMPAD_PAGEUP
: key
= wxT("NUMPAD_PAGEUP"); break;
678 case WXK_NUMPAD_PAGEDOWN
: key
= wxT("NUMPAD_PAGEDOWN"); break;
679 case WXK_NUMPAD_END
: key
= wxT("NUMPAD_END"); break;
680 case WXK_NUMPAD_BEGIN
: key
= wxT("NUMPAD_BEGIN"); break;
681 case WXK_NUMPAD_INSERT
: key
= wxT("NUMPAD_INSERT"); break;
682 case WXK_NUMPAD_DELETE
: key
= wxT("NUMPAD_DELETE"); break;
683 case WXK_NUMPAD_EQUAL
: key
= wxT("NUMPAD_EQUAL"); break;
684 case WXK_NUMPAD_MULTIPLY
: key
= wxT("NUMPAD_MULTIPLY"); break;
685 case WXK_NUMPAD_ADD
: key
= wxT("NUMPAD_ADD"); break;
686 case WXK_NUMPAD_SEPARATOR
: key
= wxT("NUMPAD_SEPARATOR"); break;
687 case WXK_NUMPAD_SUBTRACT
: key
= wxT("NUMPAD_SUBTRACT"); break;
688 case WXK_NUMPAD_DECIMAL
: key
= wxT("NUMPAD_DECIMAL"); break;
692 if ( wxIsprint((int)keycode
) )
693 key
.Printf(wxT("'%c'"), (char)keycode
);
694 else if ( keycode
> 0 && keycode
< 27 )
695 key
.Printf(_("Ctrl-%c"), wxT('A') + keycode
- 1);
697 key
.Printf(wxT("unknown (%ld)"), keycode
);
703 key
+= wxString::Format(wxT(" (Unicode: %#04x)"), event
.GetUnicodeKey());
704 #endif // wxUSE_UNICODE
706 wxLogMessage( wxT("%s event: %s (flags = %c%c%c%c)"),
709 GetChar( event
.ControlDown(), wxT('C') ),
710 GetChar( event
.AltDown(), wxT('A') ),
711 GetChar( event
.ShiftDown(), wxT('S') ),
712 GetChar( event
.MetaDown(), wxT('M') ) );
715 static wxString
GetMouseEventDesc(const wxMouseEvent
& ev
)
720 if ( ev
.LeftDown() || ev
.LeftUp() || ev
.LeftDClick() )
722 button
= wxT("Left");
723 dbl
= ev
.LeftDClick();
726 else if ( ev
.MiddleDown() || ev
.MiddleUp() || ev
.MiddleDClick() )
728 button
= wxT("Middle");
729 dbl
= ev
.MiddleDClick();
732 else if ( ev
.RightDown() || ev
.RightUp() || ev
.RightDClick() )
734 button
= wxT("Right");
735 dbl
= ev
.RightDClick();
740 return wxT("Unknown mouse event");
743 return wxString::Format(wxT("%s mouse button %s"),
745 dbl
? wxT("double clicked")
746 : up
? wxT("released") : wxT("clicked"));
749 void MyTextCtrl::OnMouseEvent(wxMouseEvent
& ev
)
761 msg
= wxT("Mouse entered the window");
763 else if ( ev
.Leaving() )
765 msg
= wxT("Mouse left the window");
769 msg
= GetMouseEventDesc(ev
);
772 msg
<< wxT(" at (") << ev
.GetX() << wxT(", ") << ev
.GetY() << wxT(") ");
775 wxTextCtrlHitTestResult rc
= HitTest(ev
.GetPosition(), &pos
);
776 if ( rc
!= wxTE_HT_UNKNOWN
)
778 msg
<< wxT("at position ") << pos
<< wxT(' ');
781 msg
<< wxT("[Flags: ")
782 << GetChar( ev
.LeftIsDown(), wxT('1') )
783 << GetChar( ev
.MiddleIsDown(), wxT('2') )
784 << GetChar( ev
.RightIsDown(), wxT('3') )
785 << GetChar( ev
.ControlDown(), wxT('C') )
786 << GetChar( ev
.AltDown(), wxT('A') )
787 << GetChar( ev
.ShiftDown(), wxT('S') )
788 << GetChar( ev
.MetaDown(), wxT('M') )
793 //else: we're not interested in mouse move events
796 void MyTextCtrl::OnSetFocus(wxFocusEvent
& event
)
800 wxLogMessage( wxT("%p got focus."), this);
806 void MyTextCtrl::OnKillFocus(wxFocusEvent
& event
)
810 wxLogMessage( wxT("%p lost focus"), this);
816 void MyTextCtrl::OnText(wxCommandEvent
& event
)
821 MyTextCtrl
*win
= (MyTextCtrl
*)event
.GetEventObject();
822 const wxChar
*changeVerb
= win
->IsModified() ? wxT("changed")
823 : wxT("set by program");
824 const wxChar
*data
= (const wxChar
*)(win
->GetClientData());
827 wxLogMessage(wxT("Text %s in control \"%s\""), changeVerb
, data
);
831 wxLogMessage(wxT("Text %s in some control"), changeVerb
);
835 void MyTextCtrl::OnTextEnter(wxCommandEvent
& event
)
840 MyTextCtrl
*win
= (MyTextCtrl
*)event
.GetEventObject();
841 const wxChar
*data
= (const wxChar
*)(win
->GetClientData());
844 wxLogMessage(wxT("Enter pressed in control '%s'"), data
);
848 wxLogMessage(wxT("Enter pressed in some control"));
852 void MyTextCtrl::OnTextMaxLen(wxCommandEvent
& WXUNUSED(event
))
854 wxLogMessage(wxT("You can't enter more characters into this control."));
858 void MyTextCtrl::OnTextCut(wxClipboardTextEvent
& event
)
860 LogClipEvent(wxT("cut to"), event
);
863 void MyTextCtrl::OnTextCopy(wxClipboardTextEvent
& event
)
865 LogClipEvent(wxT("copied to"), event
);
868 void MyTextCtrl::OnTextPaste(wxClipboardTextEvent
& event
)
870 LogClipEvent(wxT("pasted from"), event
);
873 void MyTextCtrl::LogClipEvent(const wxChar
*what
, wxClipboardTextEvent
& event
)
875 wxFrame
*frame
= wxDynamicCast(wxGetTopLevelParent(this), wxFrame
);
876 wxCHECK_RET( frame
, wxT("no parent frame?") );
878 const bool veto
= frame
->GetMenuBar()->IsChecked(TEXT_CLIPBOARD_VETO
);
884 wxLogMessage(wxT("Text %s%s the clipboard."),
885 veto
? wxT("not ") : wxT(""), what
);
890 void MyTextCtrl::OnTextURL(wxTextUrlEvent
& event
)
892 const wxMouseEvent
& ev
= event
.GetMouseEvent();
894 // filter out mouse moves, too many of them
898 long start
= event
.GetURLStart(),
899 end
= event
.GetURLEnd();
901 wxLogMessage(wxT("Mouse event over URL '%s': %s"),
902 GetValue().Mid(start
, end
- start
).c_str(),
903 GetMouseEventDesc(ev
).c_str());
906 void MyTextCtrl::OnChar(wxKeyEvent
& event
)
909 LogKeyEvent( wxT("Char"), event
);
914 void MyTextCtrl::OnKeyUp(wxKeyEvent
& event
)
917 LogKeyEvent( wxT("Key up"), event
);
922 void MyTextCtrl::OnKeyDown(wxKeyEvent
& event
)
924 switch ( event
.GetKeyCode() )
927 // show current position and text length
929 long line
, column
, pos
= GetInsertionPoint();
930 PositionToXY(pos
, &column
, &line
);
932 wxLogMessage(wxT("Current position: %ld\nCurrent line, column: (%ld, %ld)\nNumber of lines: %ld\nCurrent line length: %ld\nTotal text length: %u (%ld)"),
935 (long) GetNumberOfLines(),
936 (long) GetLineLength(line
),
937 (unsigned int) GetValue().length(),
941 GetSelection(&from
, &to
);
943 wxString sel
= GetStringSelection();
945 wxLogMessage(wxT("Selection: from %ld to %ld."), from
, to
);
946 wxLogMessage(wxT("Selection = '%s' (len = %u)"),
948 (unsigned int) sel
.length());
950 const wxString text
= GetLineText(line
);
951 wxLogMessage(wxT("Current line: \"%s\"; length = %lu"),
952 text
.c_str(), text
.length());
958 SetInsertionPointEnd();
963 SetInsertionPoint(10);
969 wxLogDebug( wxT("Now capturing mouse and events.") );
975 wxLogDebug( wxT("Stopped capturing mouse and events.") );
976 m_hasCapture
= false;
982 // insert a blank line
983 WriteText(wxT("\n"));
987 wxLogMessage(wxT("IsModified() before SetValue(): %d"),
989 ChangeValue(wxT("ChangeValue() has been called"));
990 wxLogMessage(wxT("IsModified() after SetValue(): %d"),
995 wxLogMessage(wxT("Position 10 should be now visible."));
1000 wxLogMessage(wxT("Control has been cleared"));
1005 WriteText(wxT("WriteText() has been called"));
1009 AppendText(wxT("AppendText() has been called"));
1014 wxLogMessage(wxT("Control marked as non modified"));
1019 LogKeyEvent( wxT("Key down"), event
);
1024 //----------------------------------------------------------------------
1026 //----------------------------------------------------------------------
1028 MyPanel::MyPanel( wxFrame
*frame
, int x
, int y
, int w
, int h
)
1029 : wxPanel( frame
, wxID_ANY
, wxPoint(x
, y
), wxSize(w
, h
) )
1032 m_log
= new wxTextCtrl( this, wxID_ANY
, wxT("This is the log window.\n"),
1033 wxPoint(5,260), wxSize(630,100),
1034 wxTE_MULTILINE
| wxTE_READONLY
| wxTE_RICH
);
1036 m_logOld
= wxLog::SetActiveTarget( new wxLogTextCtrl( m_log
) );
1039 // single line text controls
1041 m_text
= new MyTextCtrl( this, wxID_ANY
, wxT("Single line."),
1042 wxDefaultPosition
, wxDefaultSize
,
1043 wxTE_PROCESS_ENTER
);
1044 m_text
->SetForegroundColour(*wxBLUE
);
1045 m_text
->SetBackgroundColour(*wxLIGHT_GREY
);
1046 (*m_text
) << wxT(" Appended.");
1047 m_text
->SetInsertionPoint(0);
1048 m_text
->WriteText( wxT("Prepended. ") );
1050 m_password
= new MyTextCtrl( this, wxID_ANY
, wxT(""),
1051 wxPoint(10,50), wxSize(140,wxDefaultCoord
), wxTE_PASSWORD
);
1053 m_readonly
= new MyTextCtrl( this, wxID_ANY
, wxT("Read only"),
1054 wxPoint(10,90), wxSize(140,wxDefaultCoord
), wxTE_READONLY
);
1056 m_limited
= new MyTextCtrl(this, wxID_ANY
, wxT("Max 8 ch"),
1057 wxPoint(10, 130), wxSize(140, wxDefaultCoord
));
1058 m_limited
->SetMaxLength(8);
1060 // multi line text controls
1062 m_horizontal
= new MyTextCtrl( this, wxID_ANY
, wxT("Multiline text control with a horizontal scrollbar.\n"),
1063 wxPoint(10,170), wxSize(140,70), wxTE_MULTILINE
| wxHSCROLL
);
1065 // a little hack to use the command line argument for encoding testing
1066 if ( wxTheApp
->argc
== 2 )
1068 switch ( (wxChar
)wxTheApp
->argv
[1][0] )
1071 m_horizontal
->SetFont(wxFont(18, wxSWISS
, wxNORMAL
, wxNORMAL
,
1073 wxFONTENCODING_ISO8859_2
));
1074 m_horizontal
->AppendText(wxT("\256lu\273ou\350k\375 k\371\362 zb\354sile \350e\271tina \253\273"));
1078 m_horizontal
->SetFont(wxFont(18, wxSWISS
, wxNORMAL
, wxNORMAL
,
1080 wxFONTENCODING_CP1251
));
1081 m_horizontal
->AppendText(wxT("\317\360\350\342\345\362!"));
1085 m_horizontal
->SetFont(wxFont(18, wxSWISS
, wxNORMAL
, wxNORMAL
,
1087 wxFONTENCODING_CP1251
));
1089 m_horizontal
->AppendText(L
"\x0412\x0430\x0434\x0438\x043c \x0426");
1091 m_horizontal
->AppendText("\313\301\326\305\324\323\321 \325\304\301\336\316\331\315");
1097 m_horizontal
->AppendText(wxT("Text in default encoding"));
1100 m_multitext
= new MyTextCtrl( this, wxID_ANY
,
1101 wxT("Multi line without vertical scrollbar."),
1102 wxPoint(180,10), wxSize(200,70), wxTE_MULTILINE
| wxTE_NO_VSCROLL
);
1103 m_multitext
->SetFont(*wxITALIC_FONT
);
1104 (*m_multitext
) << wxT(" Appended.");
1105 m_multitext
->SetInsertionPoint(0);
1106 m_multitext
->WriteText( wxT("Prepended. ") );
1107 m_multitext
->SetForegroundColour(*wxYELLOW
);
1108 m_multitext
->SetBackgroundColour(*wxLIGHT_GREY
);
1111 m_multitext
->SetToolTip(wxT("Press Fn function keys here"));
1114 m_tab
= new MyTextCtrl( this, 100, wxT("Multiline, allow <TAB> processing."),
1115 wxPoint(180,90), wxSize(200,70), wxTE_MULTILINE
| wxTE_PROCESS_TAB
);
1116 m_tab
->SetClientData((void *)wxT("tab"));
1118 m_enter
= new MyTextCtrl( this, 100, wxT("Multiline, allow <ENTER> processing."),
1119 wxPoint(180,170), wxSize(200,70), wxTE_MULTILINE
);
1120 m_enter
->SetClientData((void *)wxT("enter"));
1122 m_textrich
= new MyTextCtrl(this, wxID_ANY
, wxT("Allows more than 30Kb of text\n")
1123 wxT("(even under broken Win9x)\n")
1124 wxT("and a very very very very very ")
1125 wxT("very very very long line to test ")
1126 wxT("wxHSCROLL style\n")
1127 wxT("\nAnd here is a link in quotation marks to ")
1128 wxT("test wxTE_AUTO_URL: \"http://www.wxwidgets.org\""),
1129 wxPoint(450, 10), wxSize(200, 230),
1130 wxTE_RICH
| wxTE_MULTILINE
| wxTE_AUTO_URL
);
1131 m_textrich
->SetStyle(0, 10, *wxRED
);
1132 m_textrich
->SetStyle(10, 20, *wxBLUE
);
1133 m_textrich
->SetStyle(30, 40,
1134 wxTextAttr(*wxGREEN
, wxNullColour
, *wxITALIC_FONT
));
1135 m_textrich
->SetDefaultStyle(wxTextAttr());
1136 m_textrich
->AppendText(wxT("\n\nFirst 10 characters should be in red\n"));
1137 m_textrich
->AppendText(wxT("Next 10 characters should be in blue\n"));
1138 m_textrich
->AppendText(wxT("Next 10 characters should be normal\n"));
1139 m_textrich
->AppendText(wxT("And the next 10 characters should be green and italic\n"));
1140 m_textrich
->SetDefaultStyle(wxTextAttr(*wxCYAN
, *wxBLUE
));
1141 m_textrich
->AppendText(wxT("This text should be cyan on blue\n"));
1142 m_textrich
->SetDefaultStyle(wxTextAttr(*wxBLUE
, *wxWHITE
));
1143 m_textrich
->AppendText(wxT("And this should be in blue and the text you ")
1144 wxT("type should be in blue as well"));
1147 // lay out the controls
1148 wxBoxSizer
*column1
= new wxBoxSizer(wxVERTICAL
);
1149 column1
->Add( m_text
, 0, wxALL
| wxEXPAND
, 10 );
1150 column1
->Add( m_password
, 0, wxALL
| wxEXPAND
, 10 );
1151 column1
->Add( m_readonly
, 0, wxALL
| wxEXPAND
, 10 );
1152 column1
->Add( m_limited
, 0, wxALL
| wxEXPAND
, 10 );
1153 column1
->Add( m_horizontal
, 1, wxALL
| wxEXPAND
, 10 );
1155 wxBoxSizer
*column2
= new wxBoxSizer(wxVERTICAL
);
1156 column2
->Add( m_multitext
, 1, wxALL
| wxEXPAND
, 10 );
1157 column2
->Add( m_tab
, 1, wxALL
| wxEXPAND
, 10 );
1158 column2
->Add( m_enter
, 1, wxALL
| wxEXPAND
, 10 );
1160 wxBoxSizer
*row1
= new wxBoxSizer(wxHORIZONTAL
);
1161 row1
->Add( column1
, 0, wxALL
| wxEXPAND
, 10 );
1162 row1
->Add( column2
, 1, wxALL
| wxEXPAND
, 10 );
1163 row1
->Add( m_textrich
, 1, wxALL
| wxEXPAND
, 10 );
1165 wxBoxSizer
*topSizer
= new wxBoxSizer(wxVERTICAL
);
1166 topSizer
->Add( row1
, 2, wxALL
| wxEXPAND
, 10 );
1169 topSizer
->Add( m_log
, 1, wxALL
| wxEXPAND
, 10 );
1175 wxTextCtrl
*MyPanel::GetFocusedText() const
1177 wxWindow
*win
= FindFocus();
1179 wxTextCtrl
*text
= win
? wxDynamicCast(win
, wxTextCtrl
) : NULL
;
1180 return text
? text
: m_multitext
;
1184 void MyPanel::DoPasteFromClipboard()
1186 // On X11, we want to get the data from the primary selection instead
1187 // of the normal clipboard (which isn't normal under X11 at all). This
1188 // call has no effect under MSW.
1189 wxTheClipboard
->UsePrimarySelection();
1191 if (!wxTheClipboard
->Open())
1194 *m_log
<< wxT("Error opening the clipboard.\n");
1201 *m_log
<< wxT("Successfully opened the clipboard.\n");
1205 wxTextDataObject data
;
1207 if (wxTheClipboard
->IsSupported( data
.GetFormat() ))
1210 *m_log
<< wxT("Clipboard supports requested format.\n");
1213 if (wxTheClipboard
->GetData( data
))
1216 *m_log
<< wxT("Successfully retrieved data from the clipboard.\n");
1218 GetFocusedText()->AppendText(data
.GetText());
1223 *m_log
<< wxT("Error getting data from the clipboard.\n");
1230 *m_log
<< wxT("Clipboard doesn't support requested format.\n");
1234 wxTheClipboard
->Close();
1237 *m_log
<< wxT("Closed the clipboard.\n");
1241 void MyPanel::DoCopyToClipboard()
1243 // On X11, we want to get the data from the primary selection instead
1244 // of the normal clipboard (which isn't normal under X11 at all). This
1245 // call has no effect under MSW.
1246 wxTheClipboard
->UsePrimarySelection();
1248 wxString
text( GetFocusedText()->GetStringSelection() );
1253 *m_log
<< wxT("No text to copy.\n");
1259 if (!wxTheClipboard
->Open())
1262 *m_log
<< wxT("Error opening the clipboard.\n");
1270 *m_log
<< wxT("Successfully opened the clipboard.\n");
1274 wxTextDataObject
*data
= new wxTextDataObject( text
);
1276 if (!wxTheClipboard
->SetData( data
))
1279 *m_log
<< wxT("Error while copying to the clipboard.\n");
1285 *m_log
<< wxT("Successfully copied data to the clipboard.\n");
1289 wxTheClipboard
->Close();
1292 *m_log
<< wxT("Closed the clipboard.\n");
1296 #endif // wxUSE_CLIPBOARD
1298 void MyPanel::DoMoveToEndOfText()
1300 m_multitext
->SetInsertionPointEnd();
1301 m_multitext
->SetFocus();
1304 void MyPanel::DoMoveToEndOfEntry()
1306 m_text
->SetInsertionPointEnd();
1310 void MyPanel::DoRemoveText()
1312 GetFocusedText()->Remove(0, 10);
1315 void MyPanel::DoReplaceText()
1317 GetFocusedText()->Replace(3, 8, wxT("ABC"));
1320 void MyPanel::DoSelectText()
1322 GetFocusedText()->SetSelection(3, 8);
1325 //----------------------------------------------------------------------
1327 //----------------------------------------------------------------------
1329 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
1330 EVT_MENU(TEXT_QUIT
, MyFrame::OnQuit
)
1331 EVT_MENU(TEXT_ABOUT
, MyFrame::OnAbout
)
1332 EVT_MENU(TEXT_SAVE
, MyFrame::OnFileSave
)
1333 EVT_MENU(TEXT_LOAD
, MyFrame::OnFileLoad
)
1334 EVT_MENU(TEXT_RICH_TEXT_TEST
, MyFrame::OnRichTextTest
)
1336 EVT_MENU(TEXT_LOG_KEY
, MyFrame::OnLogKey
)
1337 EVT_MENU(TEXT_LOG_CHAR
, MyFrame::OnLogChar
)
1338 EVT_MENU(TEXT_LOG_MOUSE
,MyFrame::OnLogMouse
)
1339 EVT_MENU(TEXT_LOG_TEXT
, MyFrame::OnLogText
)
1340 EVT_MENU(TEXT_LOG_FOCUS
,MyFrame::OnLogFocus
)
1341 EVT_MENU(TEXT_LOG_CLIP
, MyFrame::OnLogClip
)
1343 EVT_MENU(TEXT_CLEAR
, MyFrame::OnLogClear
)
1347 EVT_MENU(TEXT_TOOLTIPS_SETDELAY
, MyFrame::OnSetTooltipDelay
)
1348 EVT_MENU(TEXT_TOOLTIPS_ENABLE
, MyFrame::OnToggleTooltips
)
1349 #endif // wxUSE_TOOLTIPS
1352 EVT_MENU(TEXT_CLIPBOARD_PASTE
, MyFrame::OnPasteFromClipboard
)
1353 EVT_MENU(TEXT_CLIPBOARD_COPY
, MyFrame::OnCopyToClipboard
)
1355 EVT_UPDATE_UI(TEXT_CLIPBOARD_PASTE
, MyFrame::OnUpdatePasteFromClipboard
)
1356 EVT_UPDATE_UI(TEXT_CLIPBOARD_COPY
, MyFrame::OnUpdateCopyToClipboard
)
1357 #endif // wxUSE_CLIPBOARD
1359 EVT_MENU(TEXT_REMOVE
, MyFrame::OnRemoveText
)
1360 EVT_MENU(TEXT_REPLACE
, MyFrame::OnReplaceText
)
1361 EVT_MENU(TEXT_SELECT
, MyFrame::OnSelectText
)
1362 EVT_MENU(TEXT_ADD_SOME
, MyFrame::OnAddText
)
1363 EVT_MENU(TEXT_ADD_FREEZE
, MyFrame::OnAddTextFreeze
)
1364 EVT_MENU(TEXT_ADD_LINE
, MyFrame::OnAddTextLine
)
1365 EVT_MENU(TEXT_MOVE_ENDTEXT
, MyFrame::OnMoveToEndOfText
)
1366 EVT_MENU(TEXT_MOVE_ENDENTRY
, MyFrame::OnMoveToEndOfEntry
)
1368 EVT_MENU(TEXT_SET_EDITABLE
, MyFrame::OnSetEditable
)
1369 EVT_MENU(TEXT_SET_ENABLED
, MyFrame::OnSetEnabled
)
1371 EVT_MENU(TEXT_LINE_DOWN
, MyFrame::OnScrollLineDown
)
1372 EVT_MENU(TEXT_LINE_UP
, MyFrame::OnScrollLineUp
)
1373 EVT_MENU(TEXT_PAGE_DOWN
, MyFrame::OnScrollPageDown
)
1374 EVT_MENU(TEXT_PAGE_UP
, MyFrame::OnScrollPageUp
)
1376 EVT_MENU(TEXT_GET_LINE
, MyFrame::OnGetLine
)
1377 EVT_MENU(TEXT_GET_LINELENGTH
, MyFrame::OnGetLineLength
)
1379 EVT_MENU(TEXT_SET
, MyFrame::OnSetText
)
1380 EVT_MENU(TEXT_CHANGE
, MyFrame::OnChangeText
)
1382 EVT_IDLE(MyFrame::OnIdle
)
1385 MyFrame::MyFrame(wxFrame
*frame
, const wxChar
*title
, int x
, int y
, int w
, int h
)
1386 : wxFrame(frame
, wxID_ANY
, title
, wxPoint(x
, y
), wxSize(w
, h
) )
1388 SetIcon(wxICON(sample
));
1392 #endif // wxUSE_STATUSBAR
1394 m_panel
= new MyPanel( this, 10, 10, 300, 100 );
1397 void MyFrame::OnQuit (wxCommandEvent
& WXUNUSED(event
) )
1402 void MyFrame::OnAbout( wxCommandEvent
& WXUNUSED(event
) )
1404 wxBeginBusyCursor();
1406 wxMessageDialog
dialog(this,
1407 wxT("This is a text control sample. It demonstrates the many different\n")
1408 wxT("text control styles, the use of the clipboard, setting and handling\n")
1409 wxT("tooltips and intercepting key and char events.\n")
1411 wxT("Copyright (c) 1999, Robert Roebling, Julian Smart, Vadim Zeitlin"),
1412 wxT("About wxTextCtrl Sample"),
1413 wxOK
| wxICON_INFORMATION
);
1422 void MyFrame::OnSetTooltipDelay(wxCommandEvent
& WXUNUSED(event
))
1424 static long s_delay
= 5000;
1427 delay
.Printf( wxT("%ld"), s_delay
);
1429 delay
= wxGetTextFromUser(wxT("Enter delay (in milliseconds)"),
1430 wxT("Set tooltip delay"),
1434 return; // cancelled
1436 wxSscanf(delay
, wxT("%ld"), &s_delay
);
1438 wxToolTip::SetDelay(s_delay
);
1440 wxLogStatus(this, wxT("Tooltip delay set to %ld milliseconds"), s_delay
);
1443 void MyFrame::OnToggleTooltips(wxCommandEvent
& WXUNUSED(event
))
1445 static bool s_enabled
= true;
1447 s_enabled
= !s_enabled
;
1449 wxToolTip::Enable(s_enabled
);
1451 wxLogStatus(this, wxT("Tooltips %sabled"), s_enabled
? wxT("en") : wxT("dis") );
1456 void MyFrame::OnLogClear(wxCommandEvent
& WXUNUSED(event
))
1458 m_panel
->m_log
->Clear();
1462 void MyFrame::OnSetEditable(wxCommandEvent
& WXUNUSED(event
))
1464 static bool s_editable
= true;
1466 s_editable
= !s_editable
;
1467 m_panel
->m_text
->SetEditable(s_editable
);
1468 m_panel
->m_password
->SetEditable(s_editable
);
1469 m_panel
->m_multitext
->SetEditable(s_editable
);
1470 m_panel
->m_textrich
->SetEditable(s_editable
);
1473 void MyFrame::OnSetEnabled(wxCommandEvent
& WXUNUSED(event
))
1475 bool enabled
= m_panel
->m_text
->IsEnabled();
1478 m_panel
->m_text
->Enable(enabled
);
1479 m_panel
->m_password
->Enable(enabled
);
1480 m_panel
->m_multitext
->Enable(enabled
);
1481 m_panel
->m_readonly
->Enable(enabled
);
1482 m_panel
->m_limited
->Enable(enabled
);
1483 m_panel
->m_textrich
->Enable(enabled
);
1486 void MyFrame::OnFileSave(wxCommandEvent
& WXUNUSED(event
))
1488 if ( m_panel
->m_textrich
->SaveFile(wxT("dummy.txt")) )
1491 // verify that the fil length is correct (it wasn't under Win95)
1492 wxFile
file(wxT("dummy.txt"));
1494 wxT("Successfully saved file (text len = %lu, file size = %ld)"),
1495 (unsigned long)m_panel
->m_textrich
->GetValue().length(),
1496 (long) file
.Length());
1500 wxLogStatus(this, wxT("Couldn't save the file"));
1503 void MyFrame::OnFileLoad(wxCommandEvent
& WXUNUSED(event
))
1505 if ( m_panel
->m_textrich
->LoadFile(wxT("dummy.txt")) )
1507 wxLogStatus(this, wxT("Successfully loaded file"));
1511 wxLogStatus(this, wxT("Couldn't load the file"));
1515 void MyFrame::OnRichTextTest(wxCommandEvent
& WXUNUSED(event
))
1517 RichTextFrame
* frame
= new RichTextFrame(this, wxT("Rich Text Editor"));
1521 void MyFrame::OnIdle( wxIdleEvent
& event
)
1523 // track the window which has the focus in the status bar
1524 static wxWindow
*s_windowFocus
= (wxWindow
*)NULL
;
1525 wxWindow
*focus
= wxWindow::FindFocus();
1526 if ( focus
&& (focus
!= s_windowFocus
) )
1528 s_windowFocus
= focus
;
1533 wxT("Focus: wxWindow = %p, HWND = %p"),
1535 wxT("Focus: wxWindow = %p"),
1539 , s_windowFocus
->GetHWND()
1545 #endif // wxUSE_STATUSBAR
1551 * RichTextFrame is used to demonstrate rich text behaviour
1556 RICHTEXT_CLOSE
= 1000,
1557 RICHTEXT_LEFT_ALIGN
,
1558 RICHTEXT_RIGHT_ALIGN
,
1561 RICHTEXT_CHANGE_FONT
,
1562 RICHTEXT_CHANGE_TEXT_COLOUR
,
1563 RICHTEXT_CHANGE_BACKGROUND_COLOUR
,
1564 RICHTEXT_LEFT_INDENT
,
1565 RICHTEXT_RIGHT_INDENT
,
1569 BEGIN_EVENT_TABLE(RichTextFrame
, wxFrame
)
1570 EVT_IDLE(RichTextFrame::OnIdle
)
1571 EVT_MENU(RICHTEXT_CLOSE
, RichTextFrame::OnClose
)
1572 EVT_MENU(RICHTEXT_LEFT_ALIGN
, RichTextFrame::OnLeftAlign
)
1573 EVT_MENU(RICHTEXT_RIGHT_ALIGN
, RichTextFrame::OnRightAlign
)
1574 EVT_MENU(RICHTEXT_CENTRE
, RichTextFrame::OnCentre
)
1575 EVT_MENU(RICHTEXT_JUSTIFY
, RichTextFrame::OnJustify
)
1576 EVT_MENU(RICHTEXT_CHANGE_FONT
, RichTextFrame::OnChangeFont
)
1577 EVT_MENU(RICHTEXT_CHANGE_TEXT_COLOUR
, RichTextFrame::OnChangeTextColour
)
1578 EVT_MENU(RICHTEXT_CHANGE_BACKGROUND_COLOUR
, RichTextFrame::OnChangeBackgroundColour
)
1579 EVT_MENU(RICHTEXT_LEFT_INDENT
, RichTextFrame::OnLeftIndent
)
1580 EVT_MENU(RICHTEXT_RIGHT_INDENT
, RichTextFrame::OnRightIndent
)
1581 EVT_MENU(RICHTEXT_TAB_STOPS
, RichTextFrame::OnTabStops
)
1584 RichTextFrame::RichTextFrame(wxWindow
* parent
, const wxString
& title
):
1585 wxFrame(parent
, wxID_ANY
, title
, wxDefaultPosition
, wxSize(300, 400))
1587 m_currentPosition
= -1;
1588 m_textCtrl
= new wxTextCtrl(this, wxID_ANY
, wxEmptyString
, wxDefaultPosition
,
1589 wxDefaultSize
, wxTE_MULTILINE
|wxTE_RICH2
);
1593 for (i
= 0; i
< 10; i
++)
1596 for (j
= 0; j
< 10; j
++)
1598 value
<< wxT("Hello, welcome to a very simple rich text editor. You can set some character and paragraph styles from the Edit menu. ");
1600 value
<< wxT("\n\n");
1602 m_textCtrl
->SetValue(value
);
1604 wxMenuBar
* menuBar
= new wxMenuBar
;
1605 wxMenu
* fileMenu
= new wxMenu
;
1606 fileMenu
->Append(RICHTEXT_CLOSE
, _("Close\tCtrl+W"));
1607 menuBar
->Append(fileMenu
, _("File"));
1609 wxMenu
* editMenu
= new wxMenu
;
1610 editMenu
->Append(RICHTEXT_LEFT_ALIGN
, _("Left Align"));
1611 editMenu
->Append(RICHTEXT_RIGHT_ALIGN
, _("Right Align"));
1612 editMenu
->Append(RICHTEXT_CENTRE
, _("Centre"));
1613 editMenu
->Append(RICHTEXT_JUSTIFY
, _("Justify"));
1614 editMenu
->AppendSeparator();
1615 editMenu
->Append(RICHTEXT_CHANGE_FONT
, _("Change Font"));
1616 editMenu
->Append(RICHTEXT_CHANGE_TEXT_COLOUR
, _("Change Text Colour"));
1617 editMenu
->Append(RICHTEXT_CHANGE_BACKGROUND_COLOUR
, _("Change Background Colour"));
1618 editMenu
->AppendSeparator();
1619 editMenu
->Append(RICHTEXT_LEFT_INDENT
, _("Left Indent"));
1620 editMenu
->Append(RICHTEXT_RIGHT_INDENT
, _("Right Indent"));
1621 editMenu
->Append(RICHTEXT_TAB_STOPS
, _("Tab Stops"));
1622 menuBar
->Append(editMenu
, _("Edit"));
1624 SetMenuBar(menuBar
);
1627 #endif // wxUSE_STATUSBAR
1632 void RichTextFrame::OnClose(wxCommandEvent
& WXUNUSED(event
))
1637 void RichTextFrame::OnLeftAlign(wxCommandEvent
& WXUNUSED(event
))
1640 attr
.SetAlignment(wxTEXT_ALIGNMENT_LEFT
);
1643 m_textCtrl
->GetSelection(& start
, & end
);
1644 m_textCtrl
->SetStyle(start
, end
, attr
);
1646 m_currentPosition
= -1;
1649 void RichTextFrame::OnRightAlign(wxCommandEvent
& WXUNUSED(event
))
1652 attr
.SetAlignment(wxTEXT_ALIGNMENT_RIGHT
);
1655 m_textCtrl
->GetSelection(& start
, & end
);
1656 m_textCtrl
->SetStyle(start
, end
, attr
);
1658 m_currentPosition
= -1;
1661 void RichTextFrame::OnJustify(wxCommandEvent
& WXUNUSED(event
))
1664 attr
.SetAlignment(wxTEXT_ALIGNMENT_JUSTIFIED
);
1667 m_textCtrl
->GetSelection(& start
, & end
);
1668 m_textCtrl
->SetStyle(start
, end
, attr
);
1670 m_currentPosition
= -1;
1673 void RichTextFrame::OnCentre(wxCommandEvent
& WXUNUSED(event
))
1676 attr
.SetAlignment(wxTEXT_ALIGNMENT_CENTRE
);
1679 m_textCtrl
->GetSelection(& start
, & end
);
1680 m_textCtrl
->SetStyle(start
, end
, attr
);
1682 m_currentPosition
= -1;
1685 void RichTextFrame::OnChangeFont(wxCommandEvent
& WXUNUSED(event
))
1689 wxFontDialog
dialog(this, data
);
1691 if (dialog
.ShowModal() == wxID_OK
)
1693 wxFontData retData
= dialog
.GetFontData();
1694 wxFont font
= retData
.GetChosenFont();
1700 m_textCtrl
->GetSelection(& start
, & end
);
1701 m_textCtrl
->SetStyle(start
, end
, attr
);
1703 m_currentPosition
= -1;
1707 void RichTextFrame::OnChangeTextColour(wxCommandEvent
& WXUNUSED(event
))
1710 data
.SetColour(* wxBLACK
);
1711 data
.SetChooseFull(true);
1712 for (int i
= 0; i
< 16; i
++)
1714 wxColour
colour((unsigned char)(i
*16), (unsigned char)(i
*16), (unsigned char)(i
*16));
1715 data
.SetCustomColour(i
, colour
);
1718 wxColourDialog
dialog(this, &data
);
1719 dialog
.SetTitle(wxT("Choose the text colour"));
1720 if (dialog
.ShowModal() == wxID_OK
)
1722 wxColourData retData
= dialog
.GetColourData();
1723 wxColour col
= retData
.GetColour();
1726 attr
.SetTextColour(col
);
1729 m_textCtrl
->GetSelection(& start
, & end
);
1730 m_textCtrl
->SetStyle(start
, end
, attr
);
1732 m_currentPosition
= -1;
1736 void RichTextFrame::OnChangeBackgroundColour(wxCommandEvent
& WXUNUSED(event
))
1739 data
.SetColour(* wxWHITE
);
1740 data
.SetChooseFull(true);
1741 for (int i
= 0; i
< 16; i
++)
1743 wxColour
colour((unsigned char)(i
*16), (unsigned char)(i
*16), (unsigned char)(i
*16));
1744 data
.SetCustomColour(i
, colour
);
1747 wxColourDialog
dialog(this, &data
);
1748 dialog
.SetTitle(wxT("Choose the text background colour"));
1749 if (dialog
.ShowModal() == wxID_OK
)
1751 wxColourData retData
= dialog
.GetColourData();
1752 wxColour col
= retData
.GetColour();
1755 attr
.SetBackgroundColour(col
);
1758 m_textCtrl
->GetSelection(& start
, & end
);
1759 m_textCtrl
->SetStyle(start
, end
, attr
);
1761 m_currentPosition
= -1;
1765 void RichTextFrame::OnLeftIndent(wxCommandEvent
& WXUNUSED(event
))
1767 wxString indentStr
= wxGetTextFromUser
1769 _("Please enter the left indent in tenths of a millimetre."),
1774 if (!indentStr
.IsEmpty())
1776 int indent
= wxAtoi(indentStr
);
1779 attr
.SetLeftIndent(indent
);
1782 m_textCtrl
->GetSelection(& start
, & end
);
1783 m_textCtrl
->SetStyle(start
, end
, attr
);
1785 m_currentPosition
= -1;
1789 void RichTextFrame::OnRightIndent(wxCommandEvent
& WXUNUSED(event
))
1791 wxString indentStr
= wxGetTextFromUser
1793 _("Please enter the right indent in tenths of a millimetre."),
1798 if (!indentStr
.IsEmpty())
1800 int indent
= wxAtoi(indentStr
);
1803 attr
.SetRightIndent(indent
);
1806 m_textCtrl
->GetSelection(& start
, & end
);
1807 m_textCtrl
->SetStyle(start
, end
, attr
);
1809 m_currentPosition
= -1;
1813 void RichTextFrame::OnTabStops(wxCommandEvent
& WXUNUSED(event
))
1815 wxString tabsStr
= wxGetTextFromUser
1817 _("Please enter the tab stop positions in tenths of a millimetre, separated by spaces.\nLeave empty to reset tab stops."),
1825 wxStringTokenizer
tokens(tabsStr
, wxT(" "));
1826 while (tokens
.HasMoreTokens())
1828 wxString token
= tokens
.GetNextToken();
1829 tabs
.Add(wxAtoi(token
));
1836 m_textCtrl
->GetSelection(& start
, & end
);
1837 m_textCtrl
->SetStyle(start
, end
, attr
);
1839 m_currentPosition
= -1;
1842 void RichTextFrame::OnIdle(wxIdleEvent
& WXUNUSED(event
))
1844 long insertionPoint
= m_textCtrl
->GetInsertionPoint();
1845 if (insertionPoint
!= m_currentPosition
)
1849 if (m_textCtrl
->GetStyle(insertionPoint
, attr
))
1852 wxString
facename(wxT("unknown"));
1853 if (attr
.GetFont().Ok())
1855 facename
= attr
.GetFont().GetFaceName();
1857 wxString
alignment(wxT("unknown alignment"));
1858 if (attr
.GetAlignment() == wxTEXT_ALIGNMENT_CENTRE
)
1859 alignment
= wxT("centred");
1860 else if (attr
.GetAlignment() == wxTEXT_ALIGNMENT_RIGHT
)
1861 alignment
= wxT("right-aligned");
1862 else if (attr
.GetAlignment() == wxTEXT_ALIGNMENT_LEFT
)
1863 alignment
= wxT("left-aligned");
1864 else if (attr
.GetAlignment() == wxTEXT_ALIGNMENT_JUSTIFIED
)
1865 alignment
= wxT("justified");
1866 msg
.Printf( "Facename: %s, wxColour(%d, %d, %d), %s", facename
,
1867 attr
.GetTextColour().Red(), attr
.GetTextColour().Green(), attr
.GetTextColour().Blue(),
1872 if (attr
.GetFont().GetWeight() == wxBOLD
)
1873 msg
+= wxT(" BOLD");
1874 else if (attr
.GetFont().GetWeight() == wxNORMAL
)
1875 msg
+= wxT(" NORMAL");
1877 if (attr
.GetFont().GetStyle() == wxITALIC
)
1878 msg
+= wxT(" ITALIC");
1880 if (attr
.GetFont().GetUnderlined())
1881 msg
+= wxT(" UNDERLINED");
1886 #endif // wxUSE_STATUSBAR
1887 m_currentPosition
= insertionPoint
;