1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: TextCtrl wxWidgets sample
4 // Author: Robert Roebling
7 // Copyright: (c) Robert Roebling, Julian Smart, Vadim Zeitlin
8 // Licence: wxWindows licence
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
);
552 //----------------------------------------------------------------------
554 //----------------------------------------------------------------------
556 BEGIN_EVENT_TABLE(MyTextCtrl
, wxTextCtrl
)
557 EVT_KEY_DOWN(MyTextCtrl::OnKeyDown
)
558 EVT_KEY_UP(MyTextCtrl::OnKeyUp
)
559 EVT_CHAR(MyTextCtrl::OnChar
)
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
)
569 EVT_MOUSE_EVENTS(MyTextCtrl::OnMouseEvent
)
571 EVT_SET_FOCUS(MyTextCtrl::OnSetFocus
)
572 EVT_KILL_FOCUS(MyTextCtrl::OnKillFocus
)
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;
582 void MyTextCtrl::LogKeyEvent(const wxChar
*name
, wxKeyEvent
& event
) const
585 long keycode
= event
.GetKeyCode();
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;
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);
695 key
.Printf(wxT("unknown (%ld)"), keycode
);
701 key
+= wxString::Format(wxT(" (Unicode: %#04x)"), event
.GetUnicodeKey());
702 #endif // wxUSE_UNICODE
704 wxLogMessage( wxT("%s event: %s (flags = %c%c%c%c)"),
707 GetChar( event
.ControlDown(), wxT('C') ),
708 GetChar( event
.AltDown(), wxT('A') ),
709 GetChar( event
.ShiftDown(), wxT('S') ),
710 GetChar( event
.MetaDown(), wxT('M') ) );
713 static wxString
GetMouseEventDesc(const wxMouseEvent
& ev
)
718 if ( ev
.LeftDown() || ev
.LeftUp() || ev
.LeftDClick() )
720 button
= wxT("Left");
721 dbl
= ev
.LeftDClick();
724 else if ( ev
.MiddleDown() || ev
.MiddleUp() || ev
.MiddleDClick() )
726 button
= wxT("Middle");
727 dbl
= ev
.MiddleDClick();
730 else if ( ev
.RightDown() || ev
.RightUp() || ev
.RightDClick() )
732 button
= wxT("Right");
733 dbl
= ev
.RightDClick();
736 else if ( ev
.Aux1Down() || ev
.Aux1Up() || ev
.Aux1DClick() )
738 button
= wxT("Aux1");
739 dbl
= ev
.Aux1DClick();
742 else if ( ev
.Aux2Down() || ev
.Aux2Up() || ev
.Aux2DClick() )
744 button
= wxT("Aux2");
745 dbl
= ev
.Aux2DClick();
748 else if ( ev
.GetWheelRotation() )
750 return wxString::Format("Wheel rotation %+d", ev
.GetWheelRotation());
754 return wxT("Unknown mouse event");
756 wxASSERT(!(dbl
&& up
));
758 return wxString::Format(wxT("%s mouse button %s"),
760 dbl
? wxT("double clicked")
761 : up
? wxT("released") : wxT("clicked"));
764 void MyTextCtrl::OnMouseEvent(wxMouseEvent
& ev
)
776 msg
= wxT("Mouse entered the window");
778 else if ( ev
.Leaving() )
780 msg
= wxT("Mouse left the window");
784 msg
= GetMouseEventDesc(ev
);
787 msg
<< wxT(" at (") << ev
.GetX() << wxT(", ") << ev
.GetY() << wxT(") ");
790 wxTextCtrlHitTestResult rc
= HitTest(ev
.GetPosition(), &pos
);
791 if ( rc
!= wxTE_HT_UNKNOWN
)
793 msg
<< wxT("at position ") << pos
<< wxT(' ');
796 msg
<< wxT("[Flags: ")
797 << GetChar( ev
.LeftIsDown(), wxT('1') )
798 << GetChar( ev
.MiddleIsDown(), wxT('2') )
799 << GetChar( ev
.RightIsDown(), wxT('3') )
800 << GetChar( ev
.Aux1IsDown(), wxT('x') )
801 << GetChar( ev
.Aux2IsDown(), wxT('X') )
802 << GetChar( ev
.ControlDown(), wxT('C') )
803 << GetChar( ev
.AltDown(), wxT('A') )
804 << GetChar( ev
.ShiftDown(), wxT('S') )
805 << GetChar( ev
.MetaDown(), wxT('M') )
810 //else: we're not interested in mouse move events
813 void MyTextCtrl::OnSetFocus(wxFocusEvent
& event
)
817 wxLogMessage( wxT("%p got focus."), this);
823 void MyTextCtrl::OnKillFocus(wxFocusEvent
& event
)
827 wxLogMessage( wxT("%p lost focus"), this);
833 void MyTextCtrl::OnText(wxCommandEvent
& event
)
838 MyTextCtrl
*win
= (MyTextCtrl
*)event
.GetEventObject();
839 const wxChar
*changeVerb
= win
->IsModified() ? wxT("changed")
840 : wxT("set by program");
841 const wxChar
*data
= (const wxChar
*)(win
->GetClientData());
844 wxLogMessage(wxT("Text %s in control \"%s\""), changeVerb
, data
);
848 wxLogMessage(wxT("Text %s in some control"), changeVerb
);
852 void MyTextCtrl::OnTextEnter(wxCommandEvent
& event
)
857 MyTextCtrl
*win
= (MyTextCtrl
*)event
.GetEventObject();
858 const wxChar
*data
= (const wxChar
*)(win
->GetClientData());
861 wxLogMessage(wxT("Enter pressed in control '%s'"), data
);
865 wxLogMessage(wxT("Enter pressed in some control"));
869 void MyTextCtrl::OnTextMaxLen(wxCommandEvent
& WXUNUSED(event
))
871 wxLogMessage(wxT("You can't enter more characters into this control."));
875 void MyTextCtrl::OnTextCut(wxClipboardTextEvent
& event
)
877 LogClipEvent(wxT("cut to"), event
);
880 void MyTextCtrl::OnTextCopy(wxClipboardTextEvent
& event
)
882 LogClipEvent(wxT("copied to"), event
);
885 void MyTextCtrl::OnTextPaste(wxClipboardTextEvent
& event
)
887 LogClipEvent(wxT("pasted from"), event
);
890 void MyTextCtrl::LogClipEvent(const wxChar
*what
, wxClipboardTextEvent
& event
)
892 wxFrame
*frame
= wxDynamicCast(wxGetTopLevelParent(this), wxFrame
);
893 wxCHECK_RET( frame
, wxT("no parent frame?") );
895 const bool veto
= frame
->GetMenuBar()->IsChecked(TEXT_CLIPBOARD_VETO
);
901 wxLogMessage(wxT("Text %s%s the clipboard."),
902 veto
? wxT("not ") : wxT(""), what
);
907 void MyTextCtrl::OnTextURL(wxTextUrlEvent
& event
)
909 const wxMouseEvent
& ev
= event
.GetMouseEvent();
911 // filter out mouse moves, too many of them
915 long start
= event
.GetURLStart(),
916 end
= event
.GetURLEnd();
918 wxLogMessage(wxT("Mouse event over URL '%s': %s"),
919 GetValue().Mid(start
, end
- start
).c_str(),
920 GetMouseEventDesc(ev
).c_str());
923 void MyTextCtrl::OnChar(wxKeyEvent
& event
)
926 LogKeyEvent( wxT("Char"), event
);
931 void MyTextCtrl::OnKeyUp(wxKeyEvent
& event
)
934 LogKeyEvent( wxT("Key up"), event
);
939 void MyTextCtrl::OnKeyDown(wxKeyEvent
& event
)
941 switch ( event
.GetKeyCode() )
944 // show current position and text length
946 long line
, column
, pos
= GetInsertionPoint();
947 PositionToXY(pos
, &column
, &line
);
949 wxLogMessage(wxT("Current position: %ld\nCurrent line, column: (%ld, %ld)\nNumber of lines: %ld\nCurrent line length: %ld\nTotal text length: %u (%ld)"),
952 (long) GetNumberOfLines(),
953 (long) GetLineLength(line
),
954 (unsigned int) GetValue().length(),
958 GetSelection(&from
, &to
);
960 wxString sel
= GetStringSelection();
962 wxLogMessage(wxT("Selection: from %ld to %ld."), from
, to
);
963 wxLogMessage(wxT("Selection = '%s' (len = %u)"),
965 (unsigned int) sel
.length());
967 const wxString text
= GetLineText(line
);
968 wxLogMessage(wxT("Current line: \"%s\"; length = %lu"),
969 text
.c_str(), text
.length());
975 SetInsertionPointEnd();
980 SetInsertionPoint(10);
986 wxLogDebug( wxT("Now capturing mouse and events.") );
992 wxLogDebug( wxT("Stopped capturing mouse and events.") );
993 m_hasCapture
= false;
999 // insert a blank line
1000 WriteText(wxT("\n"));
1004 wxLogMessage(wxT("IsModified() before SetValue(): %d"),
1006 ChangeValue(wxT("ChangeValue() has been called"));
1007 wxLogMessage(wxT("IsModified() after SetValue(): %d"),
1012 wxLogMessage(wxT("Position 10 should be now visible."));
1017 wxLogMessage(wxT("Control has been cleared"));
1022 WriteText(wxT("WriteText() has been called"));
1026 AppendText(wxT("AppendText() has been called"));
1031 wxLogMessage(wxT("Control marked as non modified"));
1036 LogKeyEvent( wxT("Key down"), event
);
1041 //----------------------------------------------------------------------
1043 //----------------------------------------------------------------------
1045 MyPanel::MyPanel( wxFrame
*frame
, int x
, int y
, int w
, int h
)
1046 : wxPanel( frame
, wxID_ANY
, wxPoint(x
, y
), wxSize(w
, h
) )
1049 m_log
= new wxTextCtrl( this, wxID_ANY
, wxT("This is the log window.\n"),
1050 wxPoint(5,260), wxSize(630,100),
1051 wxTE_MULTILINE
| wxTE_READONLY
);
1053 m_logOld
= wxLog::SetActiveTarget( new wxLogTextCtrl( m_log
) );
1056 // single line text controls
1058 m_text
= new MyTextCtrl( this, wxID_ANY
, wxT("Single line."),
1059 wxDefaultPosition
, wxDefaultSize
,
1060 wxTE_PROCESS_ENTER
);
1061 m_text
->SetForegroundColour(*wxBLUE
);
1062 m_text
->SetBackgroundColour(*wxLIGHT_GREY
);
1063 (*m_text
) << wxT(" Appended.");
1064 m_text
->SetInsertionPoint(0);
1065 m_text
->WriteText( wxT("Prepended. ") );
1067 m_password
= new MyTextCtrl( this, wxID_ANY
, wxT(""),
1068 wxPoint(10,50), wxSize(140,wxDefaultCoord
), wxTE_PASSWORD
);
1070 m_readonly
= new MyTextCtrl( this, wxID_ANY
, wxT("Read only"),
1071 wxPoint(10,90), wxSize(140,wxDefaultCoord
), wxTE_READONLY
);
1073 m_limited
= new MyTextCtrl(this, wxID_ANY
, wxT("Max 8 ch"),
1074 wxPoint(10, 130), wxSize(140, wxDefaultCoord
));
1075 m_limited
->SetMaxLength(8);
1077 // multi line text controls
1079 m_horizontal
= new MyTextCtrl( this, wxID_ANY
, wxT("Multiline text control with a horizontal scrollbar.\n"),
1080 wxPoint(10,170), wxSize(140,70), wxTE_MULTILINE
| wxHSCROLL
);
1082 // a little hack to use the command line argument for encoding testing
1083 if ( wxTheApp
->argc
== 2 )
1085 switch ( (wxChar
)wxTheApp
->argv
[1][0] )
1088 m_horizontal
->SetFont(wxFont(18, wxSWISS
, wxNORMAL
, wxNORMAL
,
1090 wxFONTENCODING_ISO8859_2
));
1091 m_horizontal
->AppendText(wxT("\256lu\273ou\350k\375 k\371\362 zb\354sile \350e\271tina \253\273"));
1095 m_horizontal
->SetFont(wxFont(18, wxSWISS
, wxNORMAL
, wxNORMAL
,
1097 wxFONTENCODING_CP1251
));
1098 m_horizontal
->AppendText(wxT("\317\360\350\342\345\362!"));
1102 m_horizontal
->SetFont(wxFont(18, wxSWISS
, wxNORMAL
, wxNORMAL
,
1104 wxFONTENCODING_CP1251
));
1106 m_horizontal
->AppendText(L
"\x0412\x0430\x0434\x0438\x043c \x0426");
1108 m_horizontal
->AppendText("\313\301\326\305\324\323\321 \325\304\301\336\316\331\315");
1114 m_horizontal
->AppendText(wxT("Text in default encoding"));
1117 m_multitext
= new MyTextCtrl( this, wxID_ANY
,
1118 wxT("Multi line without vertical scrollbar."),
1119 wxPoint(180,10), wxSize(200,70), wxTE_MULTILINE
| wxTE_NO_VSCROLL
);
1120 m_multitext
->SetFont(*wxITALIC_FONT
);
1121 (*m_multitext
) << wxT(" Appended.");
1122 m_multitext
->SetInsertionPoint(0);
1123 m_multitext
->WriteText( wxT("Prepended. ") );
1124 m_multitext
->SetForegroundColour(*wxYELLOW
);
1125 m_multitext
->SetBackgroundColour(*wxLIGHT_GREY
);
1128 m_multitext
->SetToolTip(wxT("Press Fn function keys here"));
1131 m_tab
= new MyTextCtrl( this, 100, wxT("Multiline, allow <TAB> processing."),
1132 wxPoint(180,90), wxSize(200,70), wxTE_MULTILINE
| wxTE_PROCESS_TAB
);
1133 m_tab
->SetClientData((void *)wxT("tab"));
1135 m_enter
= new MyTextCtrl( this, 100, wxT("Multiline, allow <ENTER> processing."),
1136 wxPoint(180,170), wxSize(200,70), wxTE_MULTILINE
);
1137 m_enter
->SetClientData((void *)wxT("enter"));
1139 m_textrich
= new MyTextCtrl(this, wxID_ANY
, wxT("Allows more than 30Kb of text\n")
1140 wxT("(even under broken Win9x)\n")
1141 wxT("and a very very very very very ")
1142 wxT("very very very long line to test ")
1143 wxT("wxHSCROLL style\n")
1144 wxT("\nAnd here is a link in quotation marks to ")
1145 wxT("test wxTE_AUTO_URL: \"http://www.wxwidgets.org\""),
1146 wxPoint(450, 10), wxSize(200, 230),
1147 wxTE_RICH
| wxTE_MULTILINE
| wxTE_AUTO_URL
);
1148 m_textrich
->SetStyle(0, 10, *wxRED
);
1149 m_textrich
->SetStyle(10, 20, *wxBLUE
);
1150 m_textrich
->SetStyle(30, 40,
1151 wxTextAttr(*wxGREEN
, wxNullColour
, *wxITALIC_FONT
));
1152 m_textrich
->SetDefaultStyle(wxTextAttr());
1153 m_textrich
->AppendText(wxT("\n\nFirst 10 characters should be in red\n"));
1154 m_textrich
->AppendText(wxT("Next 10 characters should be in blue\n"));
1155 m_textrich
->AppendText(wxT("Next 10 characters should be normal\n"));
1156 m_textrich
->AppendText(wxT("And the next 10 characters should be green and italic\n"));
1157 m_textrich
->SetDefaultStyle(wxTextAttr(*wxCYAN
, *wxBLUE
));
1158 m_textrich
->AppendText(wxT("This text should be cyan on blue\n"));
1159 m_textrich
->SetDefaultStyle(wxTextAttr(*wxBLUE
, *wxWHITE
));
1160 m_textrich
->AppendText(wxT("And this should be in blue and the text you ")
1161 wxT("type should be in blue as well"));
1164 // lay out the controls
1165 wxBoxSizer
*column1
= new wxBoxSizer(wxVERTICAL
);
1166 column1
->Add( m_text
, 0, wxALL
| wxEXPAND
, 10 );
1167 column1
->Add( m_password
, 0, wxALL
| wxEXPAND
, 10 );
1168 column1
->Add( m_readonly
, 0, wxALL
| wxEXPAND
, 10 );
1169 column1
->Add( m_limited
, 0, wxALL
| wxEXPAND
, 10 );
1170 column1
->Add( m_horizontal
, 1, wxALL
| wxEXPAND
, 10 );
1172 wxBoxSizer
*column2
= new wxBoxSizer(wxVERTICAL
);
1173 column2
->Add( m_multitext
, 1, wxALL
| wxEXPAND
, 10 );
1174 column2
->Add( m_tab
, 1, wxALL
| wxEXPAND
, 10 );
1175 column2
->Add( m_enter
, 1, wxALL
| wxEXPAND
, 10 );
1177 wxBoxSizer
*row1
= new wxBoxSizer(wxHORIZONTAL
);
1178 row1
->Add( column1
, 0, wxALL
| wxEXPAND
, 10 );
1179 row1
->Add( column2
, 1, wxALL
| wxEXPAND
, 10 );
1180 row1
->Add( m_textrich
, 1, wxALL
| wxEXPAND
, 10 );
1182 wxBoxSizer
*topSizer
= new wxBoxSizer(wxVERTICAL
);
1183 topSizer
->Add( row1
, 2, wxALL
| wxEXPAND
, 10 );
1186 topSizer
->Add( m_log
, 1, wxALL
| wxEXPAND
, 10 );
1192 wxTextCtrl
*MyPanel::GetFocusedText() const
1194 wxWindow
*win
= FindFocus();
1196 wxTextCtrl
*text
= win
? wxDynamicCast(win
, wxTextCtrl
) : NULL
;
1197 return text
? text
: m_multitext
;
1201 void MyPanel::DoPasteFromClipboard()
1203 // On X11, we want to get the data from the primary selection instead
1204 // of the normal clipboard (which isn't normal under X11 at all). This
1205 // call has no effect under MSW.
1206 wxTheClipboard
->UsePrimarySelection();
1208 if (!wxTheClipboard
->Open())
1211 *m_log
<< wxT("Error opening the clipboard.\n");
1218 *m_log
<< wxT("Successfully opened the clipboard.\n");
1222 wxTextDataObject data
;
1224 if (wxTheClipboard
->IsSupported( data
.GetFormat() ))
1227 *m_log
<< wxT("Clipboard supports requested format.\n");
1230 if (wxTheClipboard
->GetData( data
))
1233 *m_log
<< wxT("Successfully retrieved data from the clipboard.\n");
1235 GetFocusedText()->AppendText(data
.GetText());
1240 *m_log
<< wxT("Error getting data from the clipboard.\n");
1247 *m_log
<< wxT("Clipboard doesn't support requested format.\n");
1251 wxTheClipboard
->Close();
1254 *m_log
<< wxT("Closed the clipboard.\n");
1258 void MyPanel::DoCopyToClipboard()
1260 // On X11, we want to get the data from the primary selection instead
1261 // of the normal clipboard (which isn't normal under X11 at all). This
1262 // call has no effect under MSW.
1263 wxTheClipboard
->UsePrimarySelection();
1265 wxString
text( GetFocusedText()->GetStringSelection() );
1270 *m_log
<< wxT("No text to copy.\n");
1276 if (!wxTheClipboard
->Open())
1279 *m_log
<< wxT("Error opening the clipboard.\n");
1287 *m_log
<< wxT("Successfully opened the clipboard.\n");
1291 wxTextDataObject
*data
= new wxTextDataObject( text
);
1293 if (!wxTheClipboard
->SetData( data
))
1296 *m_log
<< wxT("Error while copying to the clipboard.\n");
1302 *m_log
<< wxT("Successfully copied data to the clipboard.\n");
1306 wxTheClipboard
->Close();
1309 *m_log
<< wxT("Closed the clipboard.\n");
1313 #endif // wxUSE_CLIPBOARD
1315 void MyPanel::DoMoveToEndOfText()
1317 m_multitext
->SetInsertionPointEnd();
1318 m_multitext
->SetFocus();
1321 void MyPanel::DoMoveToEndOfEntry()
1323 m_text
->SetInsertionPointEnd();
1327 void MyPanel::DoRemoveText()
1329 GetFocusedText()->Remove(0, 10);
1332 void MyPanel::DoReplaceText()
1334 GetFocusedText()->Replace(3, 8, wxT("ABC"));
1337 void MyPanel::DoSelectText()
1339 GetFocusedText()->SetSelection(3, 8);
1342 //----------------------------------------------------------------------
1344 //----------------------------------------------------------------------
1346 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
1347 EVT_MENU(TEXT_QUIT
, MyFrame::OnQuit
)
1348 EVT_MENU(TEXT_ABOUT
, MyFrame::OnAbout
)
1349 EVT_MENU(TEXT_SAVE
, MyFrame::OnFileSave
)
1350 EVT_MENU(TEXT_LOAD
, MyFrame::OnFileLoad
)
1351 EVT_MENU(TEXT_RICH_TEXT_TEST
, MyFrame::OnRichTextTest
)
1353 EVT_MENU(TEXT_LOG_KEY
, MyFrame::OnLogKey
)
1354 EVT_MENU(TEXT_LOG_CHAR
, MyFrame::OnLogChar
)
1355 EVT_MENU(TEXT_LOG_MOUSE
,MyFrame::OnLogMouse
)
1356 EVT_MENU(TEXT_LOG_TEXT
, MyFrame::OnLogText
)
1357 EVT_MENU(TEXT_LOG_FOCUS
,MyFrame::OnLogFocus
)
1358 EVT_MENU(TEXT_LOG_CLIP
, MyFrame::OnLogClip
)
1360 EVT_MENU(TEXT_CLEAR
, MyFrame::OnLogClear
)
1364 EVT_MENU(TEXT_TOOLTIPS_SETDELAY
, MyFrame::OnSetTooltipDelay
)
1365 EVT_MENU(TEXT_TOOLTIPS_ENABLE
, MyFrame::OnToggleTooltips
)
1366 #endif // wxUSE_TOOLTIPS
1369 EVT_MENU(TEXT_CLIPBOARD_PASTE
, MyFrame::OnPasteFromClipboard
)
1370 EVT_MENU(TEXT_CLIPBOARD_COPY
, MyFrame::OnCopyToClipboard
)
1372 EVT_UPDATE_UI(TEXT_CLIPBOARD_PASTE
, MyFrame::OnUpdatePasteFromClipboard
)
1373 EVT_UPDATE_UI(TEXT_CLIPBOARD_COPY
, MyFrame::OnUpdateCopyToClipboard
)
1374 #endif // wxUSE_CLIPBOARD
1376 EVT_MENU(TEXT_REMOVE
, MyFrame::OnRemoveText
)
1377 EVT_MENU(TEXT_REPLACE
, MyFrame::OnReplaceText
)
1378 EVT_MENU(TEXT_SELECT
, MyFrame::OnSelectText
)
1379 EVT_MENU(TEXT_ADD_SOME
, MyFrame::OnAddText
)
1380 EVT_MENU(TEXT_ADD_FREEZE
, MyFrame::OnAddTextFreeze
)
1381 EVT_MENU(TEXT_ADD_LINE
, MyFrame::OnAddTextLine
)
1382 EVT_MENU(TEXT_MOVE_ENDTEXT
, MyFrame::OnMoveToEndOfText
)
1383 EVT_MENU(TEXT_MOVE_ENDENTRY
, MyFrame::OnMoveToEndOfEntry
)
1385 EVT_MENU(TEXT_SET_EDITABLE
, MyFrame::OnSetEditable
)
1386 EVT_MENU(TEXT_SET_ENABLED
, MyFrame::OnSetEnabled
)
1388 EVT_MENU(TEXT_LINE_DOWN
, MyFrame::OnScrollLineDown
)
1389 EVT_MENU(TEXT_LINE_UP
, MyFrame::OnScrollLineUp
)
1390 EVT_MENU(TEXT_PAGE_DOWN
, MyFrame::OnScrollPageDown
)
1391 EVT_MENU(TEXT_PAGE_UP
, MyFrame::OnScrollPageUp
)
1393 EVT_MENU(TEXT_GET_LINE
, MyFrame::OnGetLine
)
1394 EVT_MENU(TEXT_GET_LINELENGTH
, MyFrame::OnGetLineLength
)
1396 EVT_MENU(TEXT_SET
, MyFrame::OnSetText
)
1397 EVT_MENU(TEXT_CHANGE
, MyFrame::OnChangeText
)
1399 EVT_IDLE(MyFrame::OnIdle
)
1402 MyFrame::MyFrame(wxFrame
*frame
, const wxChar
*title
, int x
, int y
, int w
, int h
)
1403 : wxFrame(frame
, wxID_ANY
, title
, wxPoint(x
, y
), wxSize(w
, h
) )
1405 SetIcon(wxICON(sample
));
1409 #endif // wxUSE_STATUSBAR
1411 m_panel
= new MyPanel( this, 10, 10, 300, 100 );
1414 void MyFrame::OnQuit (wxCommandEvent
& WXUNUSED(event
) )
1419 void MyFrame::OnAbout( wxCommandEvent
& WXUNUSED(event
) )
1421 wxBeginBusyCursor();
1423 wxMessageDialog
dialog(this,
1424 wxT("This is a text control sample. It demonstrates the many different\n")
1425 wxT("text control styles, the use of the clipboard, setting and handling\n")
1426 wxT("tooltips and intercepting key and char events.\n")
1428 wxT("Copyright (c) 1999, Robert Roebling, Julian Smart, Vadim Zeitlin"),
1429 wxT("About wxTextCtrl Sample"),
1430 wxOK
| wxICON_INFORMATION
);
1439 void MyFrame::OnSetTooltipDelay(wxCommandEvent
& WXUNUSED(event
))
1441 static long s_delay
= 5000;
1444 delay
.Printf( wxT("%ld"), s_delay
);
1446 delay
= wxGetTextFromUser(wxT("Enter delay (in milliseconds)"),
1447 wxT("Set tooltip delay"),
1451 return; // cancelled
1453 wxSscanf(delay
, wxT("%ld"), &s_delay
);
1455 wxToolTip::SetDelay(s_delay
);
1457 wxLogStatus(this, wxT("Tooltip delay set to %ld milliseconds"), s_delay
);
1460 void MyFrame::OnToggleTooltips(wxCommandEvent
& WXUNUSED(event
))
1462 static bool s_enabled
= true;
1464 s_enabled
= !s_enabled
;
1466 wxToolTip::Enable(s_enabled
);
1468 wxLogStatus(this, wxT("Tooltips %sabled"), s_enabled
? wxT("en") : wxT("dis") );
1473 void MyFrame::OnLogClear(wxCommandEvent
& WXUNUSED(event
))
1475 m_panel
->m_log
->Clear();
1479 void MyFrame::OnSetEditable(wxCommandEvent
& WXUNUSED(event
))
1481 static bool s_editable
= true;
1483 s_editable
= !s_editable
;
1484 m_panel
->m_text
->SetEditable(s_editable
);
1485 m_panel
->m_password
->SetEditable(s_editable
);
1486 m_panel
->m_multitext
->SetEditable(s_editable
);
1487 m_panel
->m_textrich
->SetEditable(s_editable
);
1490 void MyFrame::OnSetEnabled(wxCommandEvent
& WXUNUSED(event
))
1492 bool enabled
= m_panel
->m_text
->IsEnabled();
1495 m_panel
->m_text
->Enable(enabled
);
1496 m_panel
->m_password
->Enable(enabled
);
1497 m_panel
->m_multitext
->Enable(enabled
);
1498 m_panel
->m_readonly
->Enable(enabled
);
1499 m_panel
->m_limited
->Enable(enabled
);
1500 m_panel
->m_textrich
->Enable(enabled
);
1503 void MyFrame::OnFileSave(wxCommandEvent
& WXUNUSED(event
))
1505 if ( m_panel
->m_textrich
->SaveFile(wxT("dummy.txt")) )
1508 // verify that the fil length is correct (it wasn't under Win95)
1509 wxFile
file(wxT("dummy.txt"));
1511 wxT("Successfully saved file (text len = %lu, file size = %ld)"),
1512 (unsigned long)m_panel
->m_textrich
->GetValue().length(),
1513 (long) file
.Length());
1517 wxLogStatus(this, wxT("Couldn't save the file"));
1520 void MyFrame::OnFileLoad(wxCommandEvent
& WXUNUSED(event
))
1522 if ( m_panel
->m_textrich
->LoadFile(wxT("dummy.txt")) )
1524 wxLogStatus(this, wxT("Successfully loaded file"));
1528 wxLogStatus(this, wxT("Couldn't load the file"));
1532 void MyFrame::OnRichTextTest(wxCommandEvent
& WXUNUSED(event
))
1534 RichTextFrame
* frame
= new RichTextFrame(this, wxT("Rich Text Editor"));
1538 void MyFrame::OnIdle( wxIdleEvent
& event
)
1540 // track the window which has the focus in the status bar
1541 static wxWindow
*s_windowFocus
= (wxWindow
*)NULL
;
1542 wxWindow
*focus
= wxWindow::FindFocus();
1543 if ( focus
&& (focus
!= s_windowFocus
) )
1545 s_windowFocus
= focus
;
1550 wxT("Focus: wxWindow = %p, HWND = %p"),
1552 wxT("Focus: wxWindow = %p"),
1556 , s_windowFocus
->GetHWND()
1562 #endif // wxUSE_STATUSBAR
1568 * RichTextFrame is used to demonstrate rich text behaviour
1573 RICHTEXT_CLOSE
= 1000,
1574 RICHTEXT_LEFT_ALIGN
,
1575 RICHTEXT_RIGHT_ALIGN
,
1578 RICHTEXT_CHANGE_FONT
,
1579 RICHTEXT_CHANGE_TEXT_COLOUR
,
1580 RICHTEXT_CHANGE_BACKGROUND_COLOUR
,
1581 RICHTEXT_LEFT_INDENT
,
1582 RICHTEXT_RIGHT_INDENT
,
1586 BEGIN_EVENT_TABLE(RichTextFrame
, wxFrame
)
1587 EVT_IDLE(RichTextFrame::OnIdle
)
1588 EVT_MENU(RICHTEXT_CLOSE
, RichTextFrame::OnClose
)
1589 EVT_MENU(RICHTEXT_LEFT_ALIGN
, RichTextFrame::OnLeftAlign
)
1590 EVT_MENU(RICHTEXT_RIGHT_ALIGN
, RichTextFrame::OnRightAlign
)
1591 EVT_MENU(RICHTEXT_CENTRE
, RichTextFrame::OnCentre
)
1592 EVT_MENU(RICHTEXT_JUSTIFY
, RichTextFrame::OnJustify
)
1593 EVT_MENU(RICHTEXT_CHANGE_FONT
, RichTextFrame::OnChangeFont
)
1594 EVT_MENU(RICHTEXT_CHANGE_TEXT_COLOUR
, RichTextFrame::OnChangeTextColour
)
1595 EVT_MENU(RICHTEXT_CHANGE_BACKGROUND_COLOUR
, RichTextFrame::OnChangeBackgroundColour
)
1596 EVT_MENU(RICHTEXT_LEFT_INDENT
, RichTextFrame::OnLeftIndent
)
1597 EVT_MENU(RICHTEXT_RIGHT_INDENT
, RichTextFrame::OnRightIndent
)
1598 EVT_MENU(RICHTEXT_TAB_STOPS
, RichTextFrame::OnTabStops
)
1601 RichTextFrame::RichTextFrame(wxWindow
* parent
, const wxString
& title
):
1602 wxFrame(parent
, wxID_ANY
, title
, wxDefaultPosition
, wxSize(300, 400))
1604 m_currentPosition
= -1;
1605 m_textCtrl
= new wxTextCtrl(this, wxID_ANY
, wxEmptyString
, wxDefaultPosition
,
1606 wxDefaultSize
, wxTE_MULTILINE
|wxTE_RICH2
);
1610 for (i
= 0; i
< 10; i
++)
1613 for (j
= 0; j
< 10; j
++)
1615 value
<< wxT("Hello, welcome to a very simple rich text editor. You can set some character and paragraph styles from the Edit menu. ");
1617 value
<< wxT("\n\n");
1619 m_textCtrl
->SetValue(value
);
1621 wxMenuBar
* menuBar
= new wxMenuBar
;
1622 wxMenu
* fileMenu
= new wxMenu
;
1623 fileMenu
->Append(RICHTEXT_CLOSE
, _("Close\tCtrl+W"));
1624 menuBar
->Append(fileMenu
, _("File"));
1626 wxMenu
* editMenu
= new wxMenu
;
1627 editMenu
->Append(RICHTEXT_LEFT_ALIGN
, _("Left Align"));
1628 editMenu
->Append(RICHTEXT_RIGHT_ALIGN
, _("Right Align"));
1629 editMenu
->Append(RICHTEXT_CENTRE
, _("Centre"));
1630 editMenu
->Append(RICHTEXT_JUSTIFY
, _("Justify"));
1631 editMenu
->AppendSeparator();
1632 editMenu
->Append(RICHTEXT_CHANGE_FONT
, _("Change Font"));
1633 editMenu
->Append(RICHTEXT_CHANGE_TEXT_COLOUR
, _("Change Text Colour"));
1634 editMenu
->Append(RICHTEXT_CHANGE_BACKGROUND_COLOUR
, _("Change Background Colour"));
1635 editMenu
->AppendSeparator();
1636 editMenu
->Append(RICHTEXT_LEFT_INDENT
, _("Left Indent"));
1637 editMenu
->Append(RICHTEXT_RIGHT_INDENT
, _("Right Indent"));
1638 editMenu
->Append(RICHTEXT_TAB_STOPS
, _("Tab Stops"));
1639 menuBar
->Append(editMenu
, _("Edit"));
1641 SetMenuBar(menuBar
);
1644 #endif // wxUSE_STATUSBAR
1649 void RichTextFrame::OnClose(wxCommandEvent
& WXUNUSED(event
))
1654 void RichTextFrame::OnLeftAlign(wxCommandEvent
& WXUNUSED(event
))
1657 attr
.SetAlignment(wxTEXT_ALIGNMENT_LEFT
);
1660 m_textCtrl
->GetSelection(& start
, & end
);
1661 m_textCtrl
->SetStyle(start
, end
, attr
);
1663 m_currentPosition
= -1;
1666 void RichTextFrame::OnRightAlign(wxCommandEvent
& WXUNUSED(event
))
1669 attr
.SetAlignment(wxTEXT_ALIGNMENT_RIGHT
);
1672 m_textCtrl
->GetSelection(& start
, & end
);
1673 m_textCtrl
->SetStyle(start
, end
, attr
);
1675 m_currentPosition
= -1;
1678 void RichTextFrame::OnJustify(wxCommandEvent
& WXUNUSED(event
))
1681 attr
.SetAlignment(wxTEXT_ALIGNMENT_JUSTIFIED
);
1684 m_textCtrl
->GetSelection(& start
, & end
);
1685 m_textCtrl
->SetStyle(start
, end
, attr
);
1687 m_currentPosition
= -1;
1690 void RichTextFrame::OnCentre(wxCommandEvent
& WXUNUSED(event
))
1693 attr
.SetAlignment(wxTEXT_ALIGNMENT_CENTRE
);
1696 m_textCtrl
->GetSelection(& start
, & end
);
1697 m_textCtrl
->SetStyle(start
, end
, attr
);
1699 m_currentPosition
= -1;
1702 void RichTextFrame::OnChangeFont(wxCommandEvent
& WXUNUSED(event
))
1706 wxFontDialog
dialog(this, data
);
1708 if (dialog
.ShowModal() == wxID_OK
)
1710 wxFontData retData
= dialog
.GetFontData();
1711 wxFont font
= retData
.GetChosenFont();
1717 m_textCtrl
->GetSelection(& start
, & end
);
1718 m_textCtrl
->SetStyle(start
, end
, attr
);
1720 m_currentPosition
= -1;
1724 void RichTextFrame::OnChangeTextColour(wxCommandEvent
& WXUNUSED(event
))
1727 data
.SetColour(* wxBLACK
);
1728 data
.SetChooseFull(true);
1729 for (int i
= 0; i
< 16; i
++)
1731 wxColour
colour((unsigned char)(i
*16), (unsigned char)(i
*16), (unsigned char)(i
*16));
1732 data
.SetCustomColour(i
, colour
);
1735 wxColourDialog
dialog(this, &data
);
1736 dialog
.SetTitle(wxT("Choose the text colour"));
1737 if (dialog
.ShowModal() == wxID_OK
)
1739 wxColourData retData
= dialog
.GetColourData();
1740 wxColour col
= retData
.GetColour();
1743 attr
.SetTextColour(col
);
1746 m_textCtrl
->GetSelection(& start
, & end
);
1747 m_textCtrl
->SetStyle(start
, end
, attr
);
1749 m_currentPosition
= -1;
1753 void RichTextFrame::OnChangeBackgroundColour(wxCommandEvent
& WXUNUSED(event
))
1756 data
.SetColour(* wxWHITE
);
1757 data
.SetChooseFull(true);
1758 for (int i
= 0; i
< 16; i
++)
1760 wxColour
colour((unsigned char)(i
*16), (unsigned char)(i
*16), (unsigned char)(i
*16));
1761 data
.SetCustomColour(i
, colour
);
1764 wxColourDialog
dialog(this, &data
);
1765 dialog
.SetTitle(wxT("Choose the text background colour"));
1766 if (dialog
.ShowModal() == wxID_OK
)
1768 wxColourData retData
= dialog
.GetColourData();
1769 wxColour col
= retData
.GetColour();
1772 attr
.SetBackgroundColour(col
);
1775 m_textCtrl
->GetSelection(& start
, & end
);
1776 m_textCtrl
->SetStyle(start
, end
, attr
);
1778 m_currentPosition
= -1;
1782 void RichTextFrame::OnLeftIndent(wxCommandEvent
& WXUNUSED(event
))
1784 wxString indentStr
= wxGetTextFromUser
1786 _("Please enter the left indent in tenths of a millimetre."),
1791 if (!indentStr
.IsEmpty())
1793 int indent
= wxAtoi(indentStr
);
1796 attr
.SetLeftIndent(indent
);
1799 m_textCtrl
->GetSelection(& start
, & end
);
1800 m_textCtrl
->SetStyle(start
, end
, attr
);
1802 m_currentPosition
= -1;
1806 void RichTextFrame::OnRightIndent(wxCommandEvent
& WXUNUSED(event
))
1808 wxString indentStr
= wxGetTextFromUser
1810 _("Please enter the right indent in tenths of a millimetre."),
1815 if (!indentStr
.IsEmpty())
1817 int indent
= wxAtoi(indentStr
);
1820 attr
.SetRightIndent(indent
);
1823 m_textCtrl
->GetSelection(& start
, & end
);
1824 m_textCtrl
->SetStyle(start
, end
, attr
);
1826 m_currentPosition
= -1;
1830 void RichTextFrame::OnTabStops(wxCommandEvent
& WXUNUSED(event
))
1832 wxString tabsStr
= wxGetTextFromUser
1834 _("Please enter the tab stop positions in tenths of a millimetre, separated by spaces.\nLeave empty to reset tab stops."),
1842 wxStringTokenizer
tokens(tabsStr
, wxT(" "));
1843 while (tokens
.HasMoreTokens())
1845 wxString token
= tokens
.GetNextToken();
1846 tabs
.Add(wxAtoi(token
));
1853 m_textCtrl
->GetSelection(& start
, & end
);
1854 m_textCtrl
->SetStyle(start
, end
, attr
);
1856 m_currentPosition
= -1;
1859 void RichTextFrame::OnIdle(wxIdleEvent
& WXUNUSED(event
))
1861 long insertionPoint
= m_textCtrl
->GetInsertionPoint();
1862 if (insertionPoint
!= m_currentPosition
)
1866 if (m_textCtrl
->GetStyle(insertionPoint
, attr
))
1869 wxString
facename(wxT("unknown"));
1870 if (attr
.GetFont().IsOk())
1872 facename
= attr
.GetFont().GetFaceName();
1874 wxString
alignment(wxT("unknown alignment"));
1875 if (attr
.GetAlignment() == wxTEXT_ALIGNMENT_CENTRE
)
1876 alignment
= wxT("centred");
1877 else if (attr
.GetAlignment() == wxTEXT_ALIGNMENT_RIGHT
)
1878 alignment
= wxT("right-aligned");
1879 else if (attr
.GetAlignment() == wxTEXT_ALIGNMENT_LEFT
)
1880 alignment
= wxT("left-aligned");
1881 else if (attr
.GetAlignment() == wxTEXT_ALIGNMENT_JUSTIFIED
)
1882 alignment
= wxT("justified");
1884 msg
.Printf("Facename: %s", facename
);
1886 if (attr
.HasTextColour())
1888 msg
+= wxString::Format(", colour: %s",
1889 attr
.GetTextColour().GetAsString());
1893 msg
+= ", no colour";
1896 msg
<< ", " << alignment
;
1900 if (attr
.GetFont().GetWeight() == wxBOLD
)
1901 msg
+= wxT(" BOLD");
1902 else if (attr
.GetFont().GetWeight() == wxNORMAL
)
1903 msg
+= wxT(" NORMAL");
1905 if (attr
.GetFont().GetStyle() == wxITALIC
)
1906 msg
+= wxT(" ITALIC");
1908 if (attr
.GetFont().GetUnderlined())
1909 msg
+= wxT(" UNDERLINED");
1914 #endif // wxUSE_STATUSBAR
1915 m_currentPosition
= insertionPoint
;