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();
738 return wxT("Unknown mouse event");
741 return wxString::Format(wxT("%s mouse button %s"),
743 dbl
? wxT("double clicked")
744 : up
? wxT("released") : wxT("clicked"));
747 void MyTextCtrl::OnMouseEvent(wxMouseEvent
& ev
)
759 msg
= wxT("Mouse entered the window");
761 else if ( ev
.Leaving() )
763 msg
= wxT("Mouse left the window");
767 msg
= GetMouseEventDesc(ev
);
770 msg
<< wxT(" at (") << ev
.GetX() << wxT(", ") << ev
.GetY() << wxT(") ");
773 wxTextCtrlHitTestResult rc
= HitTest(ev
.GetPosition(), &pos
);
774 if ( rc
!= wxTE_HT_UNKNOWN
)
776 msg
<< wxT("at position ") << pos
<< wxT(' ');
779 msg
<< wxT("[Flags: ")
780 << GetChar( ev
.LeftIsDown(), wxT('1') )
781 << GetChar( ev
.MiddleIsDown(), wxT('2') )
782 << GetChar( ev
.RightIsDown(), wxT('3') )
783 << GetChar( ev
.ControlDown(), wxT('C') )
784 << GetChar( ev
.AltDown(), wxT('A') )
785 << GetChar( ev
.ShiftDown(), wxT('S') )
786 << GetChar( ev
.MetaDown(), wxT('M') )
791 //else: we're not interested in mouse move events
794 void MyTextCtrl::OnSetFocus(wxFocusEvent
& event
)
798 wxLogMessage( wxT("%p got focus."), this);
804 void MyTextCtrl::OnKillFocus(wxFocusEvent
& event
)
808 wxLogMessage( wxT("%p lost focus"), this);
814 void MyTextCtrl::OnText(wxCommandEvent
& event
)
819 MyTextCtrl
*win
= (MyTextCtrl
*)event
.GetEventObject();
820 const wxChar
*changeVerb
= win
->IsModified() ? wxT("changed")
821 : wxT("set by program");
822 const wxChar
*data
= (const wxChar
*)(win
->GetClientData());
825 wxLogMessage(wxT("Text %s in control \"%s\""), changeVerb
, data
);
829 wxLogMessage(wxT("Text %s in some control"), changeVerb
);
833 void MyTextCtrl::OnTextEnter(wxCommandEvent
& event
)
838 MyTextCtrl
*win
= (MyTextCtrl
*)event
.GetEventObject();
839 const wxChar
*data
= (const wxChar
*)(win
->GetClientData());
842 wxLogMessage(wxT("Enter pressed in control '%s'"), data
);
846 wxLogMessage(wxT("Enter pressed in some control"));
850 void MyTextCtrl::OnTextMaxLen(wxCommandEvent
& WXUNUSED(event
))
852 wxLogMessage(wxT("You can't enter more characters into this control."));
856 void MyTextCtrl::OnTextCut(wxClipboardTextEvent
& event
)
858 LogClipEvent(wxT("cut to"), event
);
861 void MyTextCtrl::OnTextCopy(wxClipboardTextEvent
& event
)
863 LogClipEvent(wxT("copied to"), event
);
866 void MyTextCtrl::OnTextPaste(wxClipboardTextEvent
& event
)
868 LogClipEvent(wxT("pasted from"), event
);
871 void MyTextCtrl::LogClipEvent(const wxChar
*what
, wxClipboardTextEvent
& event
)
873 wxFrame
*frame
= wxDynamicCast(wxGetTopLevelParent(this), wxFrame
);
874 wxCHECK_RET( frame
, wxT("no parent frame?") );
876 const bool veto
= frame
->GetMenuBar()->IsChecked(TEXT_CLIPBOARD_VETO
);
882 wxLogMessage(wxT("Text %s%s the clipboard."),
883 veto
? wxT("not ") : wxT(""), what
);
888 void MyTextCtrl::OnTextURL(wxTextUrlEvent
& event
)
890 const wxMouseEvent
& ev
= event
.GetMouseEvent();
892 // filter out mouse moves, too many of them
896 long start
= event
.GetURLStart(),
897 end
= event
.GetURLEnd();
899 wxLogMessage(wxT("Mouse event over URL '%s': %s"),
900 GetValue().Mid(start
, end
- start
).c_str(),
901 GetMouseEventDesc(ev
).c_str());
904 void MyTextCtrl::OnChar(wxKeyEvent
& event
)
907 LogKeyEvent( wxT("Char"), event
);
912 void MyTextCtrl::OnKeyUp(wxKeyEvent
& event
)
915 LogKeyEvent( wxT("Key up"), event
);
920 void MyTextCtrl::OnKeyDown(wxKeyEvent
& event
)
922 switch ( event
.GetKeyCode() )
925 // show current position and text length
927 long line
, column
, pos
= GetInsertionPoint();
928 PositionToXY(pos
, &column
, &line
);
930 wxLogMessage(wxT("Current position: %ld\nCurrent line, column: (%ld, %ld)\nNumber of lines: %ld\nCurrent line length: %ld\nTotal text length: %u (%ld)"),
933 (long) GetNumberOfLines(),
934 (long) GetLineLength(line
),
935 (unsigned int) GetValue().length(),
939 GetSelection(&from
, &to
);
941 wxString sel
= GetStringSelection();
943 wxLogMessage(wxT("Selection: from %ld to %ld."), from
, to
);
944 wxLogMessage(wxT("Selection = '%s' (len = %u)"),
946 (unsigned int) sel
.length());
948 const wxString text
= GetLineText(line
);
949 wxLogMessage(wxT("Current line: \"%s\"; length = %lu"),
950 text
.c_str(), text
.length());
956 SetInsertionPointEnd();
961 SetInsertionPoint(10);
967 wxLogDebug( wxT("Now capturing mouse and events.") );
973 wxLogDebug( wxT("Stopped capturing mouse and events.") );
974 m_hasCapture
= false;
980 // insert a blank line
981 WriteText(wxT("\n"));
985 wxLogMessage(wxT("IsModified() before SetValue(): %d"),
987 ChangeValue(wxT("ChangeValue() has been called"));
988 wxLogMessage(wxT("IsModified() after SetValue(): %d"),
993 wxLogMessage(wxT("Position 10 should be now visible."));
998 wxLogMessage(wxT("Control has been cleared"));
1003 WriteText(wxT("WriteText() has been called"));
1007 AppendText(wxT("AppendText() has been called"));
1012 wxLogMessage(wxT("Control marked as non modified"));
1017 LogKeyEvent( wxT("Key down"), event
);
1022 //----------------------------------------------------------------------
1024 //----------------------------------------------------------------------
1026 MyPanel::MyPanel( wxFrame
*frame
, int x
, int y
, int w
, int h
)
1027 : wxPanel( frame
, wxID_ANY
, wxPoint(x
, y
), wxSize(w
, h
) )
1030 m_log
= new wxTextCtrl( this, wxID_ANY
, wxT("This is the log window.\n"),
1031 wxPoint(5,260), wxSize(630,100),
1032 wxTE_MULTILINE
| wxTE_READONLY
);
1034 m_logOld
= wxLog::SetActiveTarget( new wxLogTextCtrl( m_log
) );
1037 // single line text controls
1039 m_text
= new MyTextCtrl( this, wxID_ANY
, wxT("Single line."),
1040 wxDefaultPosition
, wxDefaultSize
,
1041 wxTE_PROCESS_ENTER
);
1042 m_text
->SetForegroundColour(*wxBLUE
);
1043 m_text
->SetBackgroundColour(*wxLIGHT_GREY
);
1044 (*m_text
) << wxT(" Appended.");
1045 m_text
->SetInsertionPoint(0);
1046 m_text
->WriteText( wxT("Prepended. ") );
1048 m_password
= new MyTextCtrl( this, wxID_ANY
, wxT(""),
1049 wxPoint(10,50), wxSize(140,wxDefaultCoord
), wxTE_PASSWORD
);
1051 m_readonly
= new MyTextCtrl( this, wxID_ANY
, wxT("Read only"),
1052 wxPoint(10,90), wxSize(140,wxDefaultCoord
), wxTE_READONLY
);
1054 m_limited
= new MyTextCtrl(this, wxID_ANY
, wxT("Max 8 ch"),
1055 wxPoint(10, 130), wxSize(140, wxDefaultCoord
));
1056 m_limited
->SetMaxLength(8);
1058 // multi line text controls
1060 m_horizontal
= new MyTextCtrl( this, wxID_ANY
, wxT("Multiline text control with a horizontal scrollbar.\n"),
1061 wxPoint(10,170), wxSize(140,70), wxTE_MULTILINE
| wxHSCROLL
);
1063 // a little hack to use the command line argument for encoding testing
1064 if ( wxTheApp
->argc
== 2 )
1066 switch ( (wxChar
)wxTheApp
->argv
[1][0] )
1069 m_horizontal
->SetFont(wxFont(18, wxSWISS
, wxNORMAL
, wxNORMAL
,
1071 wxFONTENCODING_ISO8859_2
));
1072 m_horizontal
->AppendText(wxT("\256lu\273ou\350k\375 k\371\362 zb\354sile \350e\271tina \253\273"));
1076 m_horizontal
->SetFont(wxFont(18, wxSWISS
, wxNORMAL
, wxNORMAL
,
1078 wxFONTENCODING_CP1251
));
1079 m_horizontal
->AppendText(wxT("\317\360\350\342\345\362!"));
1083 m_horizontal
->SetFont(wxFont(18, wxSWISS
, wxNORMAL
, wxNORMAL
,
1085 wxFONTENCODING_CP1251
));
1087 m_horizontal
->AppendText(L
"\x0412\x0430\x0434\x0438\x043c \x0426");
1089 m_horizontal
->AppendText("\313\301\326\305\324\323\321 \325\304\301\336\316\331\315");
1095 m_horizontal
->AppendText(wxT("Text in default encoding"));
1098 m_multitext
= new MyTextCtrl( this, wxID_ANY
,
1099 wxT("Multi line without vertical scrollbar."),
1100 wxPoint(180,10), wxSize(200,70), wxTE_MULTILINE
| wxTE_NO_VSCROLL
);
1101 m_multitext
->SetFont(*wxITALIC_FONT
);
1102 (*m_multitext
) << wxT(" Appended.");
1103 m_multitext
->SetInsertionPoint(0);
1104 m_multitext
->WriteText( wxT("Prepended. ") );
1105 m_multitext
->SetForegroundColour(*wxYELLOW
);
1106 m_multitext
->SetBackgroundColour(*wxLIGHT_GREY
);
1109 m_multitext
->SetToolTip(wxT("Press Fn function keys here"));
1112 m_tab
= new MyTextCtrl( this, 100, wxT("Multiline, allow <TAB> processing."),
1113 wxPoint(180,90), wxSize(200,70), wxTE_MULTILINE
| wxTE_PROCESS_TAB
);
1114 m_tab
->SetClientData((void *)wxT("tab"));
1116 m_enter
= new MyTextCtrl( this, 100, wxT("Multiline, allow <ENTER> processing."),
1117 wxPoint(180,170), wxSize(200,70), wxTE_MULTILINE
);
1118 m_enter
->SetClientData((void *)wxT("enter"));
1120 m_textrich
= new MyTextCtrl(this, wxID_ANY
, wxT("Allows more than 30Kb of text\n")
1121 wxT("(even under broken Win9x)\n")
1122 wxT("and a very very very very very ")
1123 wxT("very very very long line to test ")
1124 wxT("wxHSCROLL style\n")
1125 wxT("\nAnd here is a link in quotation marks to ")
1126 wxT("test wxTE_AUTO_URL: \"http://www.wxwidgets.org\""),
1127 wxPoint(450, 10), wxSize(200, 230),
1128 wxTE_RICH
| wxTE_MULTILINE
| wxTE_AUTO_URL
);
1129 m_textrich
->SetStyle(0, 10, *wxRED
);
1130 m_textrich
->SetStyle(10, 20, *wxBLUE
);
1131 m_textrich
->SetStyle(30, 40,
1132 wxTextAttr(*wxGREEN
, wxNullColour
, *wxITALIC_FONT
));
1133 m_textrich
->SetDefaultStyle(wxTextAttr());
1134 m_textrich
->AppendText(wxT("\n\nFirst 10 characters should be in red\n"));
1135 m_textrich
->AppendText(wxT("Next 10 characters should be in blue\n"));
1136 m_textrich
->AppendText(wxT("Next 10 characters should be normal\n"));
1137 m_textrich
->AppendText(wxT("And the next 10 characters should be green and italic\n"));
1138 m_textrich
->SetDefaultStyle(wxTextAttr(*wxCYAN
, *wxBLUE
));
1139 m_textrich
->AppendText(wxT("This text should be cyan on blue\n"));
1140 m_textrich
->SetDefaultStyle(wxTextAttr(*wxBLUE
, *wxWHITE
));
1141 m_textrich
->AppendText(wxT("And this should be in blue and the text you ")
1142 wxT("type should be in blue as well"));
1145 // lay out the controls
1146 wxBoxSizer
*column1
= new wxBoxSizer(wxVERTICAL
);
1147 column1
->Add( m_text
, 0, wxALL
| wxEXPAND
, 10 );
1148 column1
->Add( m_password
, 0, wxALL
| wxEXPAND
, 10 );
1149 column1
->Add( m_readonly
, 0, wxALL
| wxEXPAND
, 10 );
1150 column1
->Add( m_limited
, 0, wxALL
| wxEXPAND
, 10 );
1151 column1
->Add( m_horizontal
, 1, wxALL
| wxEXPAND
, 10 );
1153 wxBoxSizer
*column2
= new wxBoxSizer(wxVERTICAL
);
1154 column2
->Add( m_multitext
, 1, wxALL
| wxEXPAND
, 10 );
1155 column2
->Add( m_tab
, 1, wxALL
| wxEXPAND
, 10 );
1156 column2
->Add( m_enter
, 1, wxALL
| wxEXPAND
, 10 );
1158 wxBoxSizer
*row1
= new wxBoxSizer(wxHORIZONTAL
);
1159 row1
->Add( column1
, 0, wxALL
| wxEXPAND
, 10 );
1160 row1
->Add( column2
, 1, wxALL
| wxEXPAND
, 10 );
1161 row1
->Add( m_textrich
, 1, wxALL
| wxEXPAND
, 10 );
1163 wxBoxSizer
*topSizer
= new wxBoxSizer(wxVERTICAL
);
1164 topSizer
->Add( row1
, 2, wxALL
| wxEXPAND
, 10 );
1167 topSizer
->Add( m_log
, 1, wxALL
| wxEXPAND
, 10 );
1173 wxTextCtrl
*MyPanel::GetFocusedText() const
1175 wxWindow
*win
= FindFocus();
1177 wxTextCtrl
*text
= win
? wxDynamicCast(win
, wxTextCtrl
) : NULL
;
1178 return text
? text
: m_multitext
;
1182 void MyPanel::DoPasteFromClipboard()
1184 // On X11, we want to get the data from the primary selection instead
1185 // of the normal clipboard (which isn't normal under X11 at all). This
1186 // call has no effect under MSW.
1187 wxTheClipboard
->UsePrimarySelection();
1189 if (!wxTheClipboard
->Open())
1192 *m_log
<< wxT("Error opening the clipboard.\n");
1199 *m_log
<< wxT("Successfully opened the clipboard.\n");
1203 wxTextDataObject data
;
1205 if (wxTheClipboard
->IsSupported( data
.GetFormat() ))
1208 *m_log
<< wxT("Clipboard supports requested format.\n");
1211 if (wxTheClipboard
->GetData( data
))
1214 *m_log
<< wxT("Successfully retrieved data from the clipboard.\n");
1216 GetFocusedText()->AppendText(data
.GetText());
1221 *m_log
<< wxT("Error getting data from the clipboard.\n");
1228 *m_log
<< wxT("Clipboard doesn't support requested format.\n");
1232 wxTheClipboard
->Close();
1235 *m_log
<< wxT("Closed the clipboard.\n");
1239 void MyPanel::DoCopyToClipboard()
1241 // On X11, we want to get the data from the primary selection instead
1242 // of the normal clipboard (which isn't normal under X11 at all). This
1243 // call has no effect under MSW.
1244 wxTheClipboard
->UsePrimarySelection();
1246 wxString
text( GetFocusedText()->GetStringSelection() );
1251 *m_log
<< wxT("No text to copy.\n");
1257 if (!wxTheClipboard
->Open())
1260 *m_log
<< wxT("Error opening the clipboard.\n");
1268 *m_log
<< wxT("Successfully opened the clipboard.\n");
1272 wxTextDataObject
*data
= new wxTextDataObject( text
);
1274 if (!wxTheClipboard
->SetData( data
))
1277 *m_log
<< wxT("Error while copying to the clipboard.\n");
1283 *m_log
<< wxT("Successfully copied data to the clipboard.\n");
1287 wxTheClipboard
->Close();
1290 *m_log
<< wxT("Closed the clipboard.\n");
1294 #endif // wxUSE_CLIPBOARD
1296 void MyPanel::DoMoveToEndOfText()
1298 m_multitext
->SetInsertionPointEnd();
1299 m_multitext
->SetFocus();
1302 void MyPanel::DoMoveToEndOfEntry()
1304 m_text
->SetInsertionPointEnd();
1308 void MyPanel::DoRemoveText()
1310 GetFocusedText()->Remove(0, 10);
1313 void MyPanel::DoReplaceText()
1315 GetFocusedText()->Replace(3, 8, wxT("ABC"));
1318 void MyPanel::DoSelectText()
1320 GetFocusedText()->SetSelection(3, 8);
1323 //----------------------------------------------------------------------
1325 //----------------------------------------------------------------------
1327 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
1328 EVT_MENU(TEXT_QUIT
, MyFrame::OnQuit
)
1329 EVT_MENU(TEXT_ABOUT
, MyFrame::OnAbout
)
1330 EVT_MENU(TEXT_SAVE
, MyFrame::OnFileSave
)
1331 EVT_MENU(TEXT_LOAD
, MyFrame::OnFileLoad
)
1332 EVT_MENU(TEXT_RICH_TEXT_TEST
, MyFrame::OnRichTextTest
)
1334 EVT_MENU(TEXT_LOG_KEY
, MyFrame::OnLogKey
)
1335 EVT_MENU(TEXT_LOG_CHAR
, MyFrame::OnLogChar
)
1336 EVT_MENU(TEXT_LOG_MOUSE
,MyFrame::OnLogMouse
)
1337 EVT_MENU(TEXT_LOG_TEXT
, MyFrame::OnLogText
)
1338 EVT_MENU(TEXT_LOG_FOCUS
,MyFrame::OnLogFocus
)
1339 EVT_MENU(TEXT_LOG_CLIP
, MyFrame::OnLogClip
)
1341 EVT_MENU(TEXT_CLEAR
, MyFrame::OnLogClear
)
1345 EVT_MENU(TEXT_TOOLTIPS_SETDELAY
, MyFrame::OnSetTooltipDelay
)
1346 EVT_MENU(TEXT_TOOLTIPS_ENABLE
, MyFrame::OnToggleTooltips
)
1347 #endif // wxUSE_TOOLTIPS
1350 EVT_MENU(TEXT_CLIPBOARD_PASTE
, MyFrame::OnPasteFromClipboard
)
1351 EVT_MENU(TEXT_CLIPBOARD_COPY
, MyFrame::OnCopyToClipboard
)
1353 EVT_UPDATE_UI(TEXT_CLIPBOARD_PASTE
, MyFrame::OnUpdatePasteFromClipboard
)
1354 EVT_UPDATE_UI(TEXT_CLIPBOARD_COPY
, MyFrame::OnUpdateCopyToClipboard
)
1355 #endif // wxUSE_CLIPBOARD
1357 EVT_MENU(TEXT_REMOVE
, MyFrame::OnRemoveText
)
1358 EVT_MENU(TEXT_REPLACE
, MyFrame::OnReplaceText
)
1359 EVT_MENU(TEXT_SELECT
, MyFrame::OnSelectText
)
1360 EVT_MENU(TEXT_ADD_SOME
, MyFrame::OnAddText
)
1361 EVT_MENU(TEXT_ADD_FREEZE
, MyFrame::OnAddTextFreeze
)
1362 EVT_MENU(TEXT_ADD_LINE
, MyFrame::OnAddTextLine
)
1363 EVT_MENU(TEXT_MOVE_ENDTEXT
, MyFrame::OnMoveToEndOfText
)
1364 EVT_MENU(TEXT_MOVE_ENDENTRY
, MyFrame::OnMoveToEndOfEntry
)
1366 EVT_MENU(TEXT_SET_EDITABLE
, MyFrame::OnSetEditable
)
1367 EVT_MENU(TEXT_SET_ENABLED
, MyFrame::OnSetEnabled
)
1369 EVT_MENU(TEXT_LINE_DOWN
, MyFrame::OnScrollLineDown
)
1370 EVT_MENU(TEXT_LINE_UP
, MyFrame::OnScrollLineUp
)
1371 EVT_MENU(TEXT_PAGE_DOWN
, MyFrame::OnScrollPageDown
)
1372 EVT_MENU(TEXT_PAGE_UP
, MyFrame::OnScrollPageUp
)
1374 EVT_MENU(TEXT_GET_LINE
, MyFrame::OnGetLine
)
1375 EVT_MENU(TEXT_GET_LINELENGTH
, MyFrame::OnGetLineLength
)
1377 EVT_MENU(TEXT_SET
, MyFrame::OnSetText
)
1378 EVT_MENU(TEXT_CHANGE
, MyFrame::OnChangeText
)
1380 EVT_IDLE(MyFrame::OnIdle
)
1383 MyFrame::MyFrame(wxFrame
*frame
, const wxChar
*title
, int x
, int y
, int w
, int h
)
1384 : wxFrame(frame
, wxID_ANY
, title
, wxPoint(x
, y
), wxSize(w
, h
) )
1386 SetIcon(wxICON(sample
));
1390 #endif // wxUSE_STATUSBAR
1392 m_panel
= new MyPanel( this, 10, 10, 300, 100 );
1395 void MyFrame::OnQuit (wxCommandEvent
& WXUNUSED(event
) )
1400 void MyFrame::OnAbout( wxCommandEvent
& WXUNUSED(event
) )
1402 wxBeginBusyCursor();
1404 wxMessageDialog
dialog(this,
1405 wxT("This is a text control sample. It demonstrates the many different\n")
1406 wxT("text control styles, the use of the clipboard, setting and handling\n")
1407 wxT("tooltips and intercepting key and char events.\n")
1409 wxT("Copyright (c) 1999, Robert Roebling, Julian Smart, Vadim Zeitlin"),
1410 wxT("About wxTextCtrl Sample"),
1411 wxOK
| wxICON_INFORMATION
);
1420 void MyFrame::OnSetTooltipDelay(wxCommandEvent
& WXUNUSED(event
))
1422 static long s_delay
= 5000;
1425 delay
.Printf( wxT("%ld"), s_delay
);
1427 delay
= wxGetTextFromUser(wxT("Enter delay (in milliseconds)"),
1428 wxT("Set tooltip delay"),
1432 return; // cancelled
1434 wxSscanf(delay
, wxT("%ld"), &s_delay
);
1436 wxToolTip::SetDelay(s_delay
);
1438 wxLogStatus(this, wxT("Tooltip delay set to %ld milliseconds"), s_delay
);
1441 void MyFrame::OnToggleTooltips(wxCommandEvent
& WXUNUSED(event
))
1443 static bool s_enabled
= true;
1445 s_enabled
= !s_enabled
;
1447 wxToolTip::Enable(s_enabled
);
1449 wxLogStatus(this, wxT("Tooltips %sabled"), s_enabled
? wxT("en") : wxT("dis") );
1454 void MyFrame::OnLogClear(wxCommandEvent
& WXUNUSED(event
))
1456 m_panel
->m_log
->Clear();
1460 void MyFrame::OnSetEditable(wxCommandEvent
& WXUNUSED(event
))
1462 static bool s_editable
= true;
1464 s_editable
= !s_editable
;
1465 m_panel
->m_text
->SetEditable(s_editable
);
1466 m_panel
->m_password
->SetEditable(s_editable
);
1467 m_panel
->m_multitext
->SetEditable(s_editable
);
1468 m_panel
->m_textrich
->SetEditable(s_editable
);
1471 void MyFrame::OnSetEnabled(wxCommandEvent
& WXUNUSED(event
))
1473 bool enabled
= m_panel
->m_text
->IsEnabled();
1476 m_panel
->m_text
->Enable(enabled
);
1477 m_panel
->m_password
->Enable(enabled
);
1478 m_panel
->m_multitext
->Enable(enabled
);
1479 m_panel
->m_readonly
->Enable(enabled
);
1480 m_panel
->m_limited
->Enable(enabled
);
1481 m_panel
->m_textrich
->Enable(enabled
);
1484 void MyFrame::OnFileSave(wxCommandEvent
& WXUNUSED(event
))
1486 if ( m_panel
->m_textrich
->SaveFile(wxT("dummy.txt")) )
1489 // verify that the fil length is correct (it wasn't under Win95)
1490 wxFile
file(wxT("dummy.txt"));
1492 wxT("Successfully saved file (text len = %lu, file size = %ld)"),
1493 (unsigned long)m_panel
->m_textrich
->GetValue().length(),
1494 (long) file
.Length());
1498 wxLogStatus(this, wxT("Couldn't save the file"));
1501 void MyFrame::OnFileLoad(wxCommandEvent
& WXUNUSED(event
))
1503 if ( m_panel
->m_textrich
->LoadFile(wxT("dummy.txt")) )
1505 wxLogStatus(this, wxT("Successfully loaded file"));
1509 wxLogStatus(this, wxT("Couldn't load the file"));
1513 void MyFrame::OnRichTextTest(wxCommandEvent
& WXUNUSED(event
))
1515 RichTextFrame
* frame
= new RichTextFrame(this, wxT("Rich Text Editor"));
1519 void MyFrame::OnIdle( wxIdleEvent
& event
)
1521 // track the window which has the focus in the status bar
1522 static wxWindow
*s_windowFocus
= (wxWindow
*)NULL
;
1523 wxWindow
*focus
= wxWindow::FindFocus();
1524 if ( focus
&& (focus
!= s_windowFocus
) )
1526 s_windowFocus
= focus
;
1531 wxT("Focus: wxWindow = %p, HWND = %p"),
1533 wxT("Focus: wxWindow = %p"),
1537 , s_windowFocus
->GetHWND()
1543 #endif // wxUSE_STATUSBAR
1549 * RichTextFrame is used to demonstrate rich text behaviour
1554 RICHTEXT_CLOSE
= 1000,
1555 RICHTEXT_LEFT_ALIGN
,
1556 RICHTEXT_RIGHT_ALIGN
,
1559 RICHTEXT_CHANGE_FONT
,
1560 RICHTEXT_CHANGE_TEXT_COLOUR
,
1561 RICHTEXT_CHANGE_BACKGROUND_COLOUR
,
1562 RICHTEXT_LEFT_INDENT
,
1563 RICHTEXT_RIGHT_INDENT
,
1567 BEGIN_EVENT_TABLE(RichTextFrame
, wxFrame
)
1568 EVT_IDLE(RichTextFrame::OnIdle
)
1569 EVT_MENU(RICHTEXT_CLOSE
, RichTextFrame::OnClose
)
1570 EVT_MENU(RICHTEXT_LEFT_ALIGN
, RichTextFrame::OnLeftAlign
)
1571 EVT_MENU(RICHTEXT_RIGHT_ALIGN
, RichTextFrame::OnRightAlign
)
1572 EVT_MENU(RICHTEXT_CENTRE
, RichTextFrame::OnCentre
)
1573 EVT_MENU(RICHTEXT_JUSTIFY
, RichTextFrame::OnJustify
)
1574 EVT_MENU(RICHTEXT_CHANGE_FONT
, RichTextFrame::OnChangeFont
)
1575 EVT_MENU(RICHTEXT_CHANGE_TEXT_COLOUR
, RichTextFrame::OnChangeTextColour
)
1576 EVT_MENU(RICHTEXT_CHANGE_BACKGROUND_COLOUR
, RichTextFrame::OnChangeBackgroundColour
)
1577 EVT_MENU(RICHTEXT_LEFT_INDENT
, RichTextFrame::OnLeftIndent
)
1578 EVT_MENU(RICHTEXT_RIGHT_INDENT
, RichTextFrame::OnRightIndent
)
1579 EVT_MENU(RICHTEXT_TAB_STOPS
, RichTextFrame::OnTabStops
)
1582 RichTextFrame::RichTextFrame(wxWindow
* parent
, const wxString
& title
):
1583 wxFrame(parent
, wxID_ANY
, title
, wxDefaultPosition
, wxSize(300, 400))
1585 m_currentPosition
= -1;
1586 m_textCtrl
= new wxTextCtrl(this, wxID_ANY
, wxEmptyString
, wxDefaultPosition
,
1587 wxDefaultSize
, wxTE_MULTILINE
|wxTE_RICH2
);
1591 for (i
= 0; i
< 10; i
++)
1594 for (j
= 0; j
< 10; j
++)
1596 value
<< wxT("Hello, welcome to a very simple rich text editor. You can set some character and paragraph styles from the Edit menu. ");
1598 value
<< wxT("\n\n");
1600 m_textCtrl
->SetValue(value
);
1602 wxMenuBar
* menuBar
= new wxMenuBar
;
1603 wxMenu
* fileMenu
= new wxMenu
;
1604 fileMenu
->Append(RICHTEXT_CLOSE
, _("Close\tCtrl+W"));
1605 menuBar
->Append(fileMenu
, _("File"));
1607 wxMenu
* editMenu
= new wxMenu
;
1608 editMenu
->Append(RICHTEXT_LEFT_ALIGN
, _("Left Align"));
1609 editMenu
->Append(RICHTEXT_RIGHT_ALIGN
, _("Right Align"));
1610 editMenu
->Append(RICHTEXT_CENTRE
, _("Centre"));
1611 editMenu
->Append(RICHTEXT_JUSTIFY
, _("Justify"));
1612 editMenu
->AppendSeparator();
1613 editMenu
->Append(RICHTEXT_CHANGE_FONT
, _("Change Font"));
1614 editMenu
->Append(RICHTEXT_CHANGE_TEXT_COLOUR
, _("Change Text Colour"));
1615 editMenu
->Append(RICHTEXT_CHANGE_BACKGROUND_COLOUR
, _("Change Background Colour"));
1616 editMenu
->AppendSeparator();
1617 editMenu
->Append(RICHTEXT_LEFT_INDENT
, _("Left Indent"));
1618 editMenu
->Append(RICHTEXT_RIGHT_INDENT
, _("Right Indent"));
1619 editMenu
->Append(RICHTEXT_TAB_STOPS
, _("Tab Stops"));
1620 menuBar
->Append(editMenu
, _("Edit"));
1622 SetMenuBar(menuBar
);
1625 #endif // wxUSE_STATUSBAR
1630 void RichTextFrame::OnClose(wxCommandEvent
& WXUNUSED(event
))
1635 void RichTextFrame::OnLeftAlign(wxCommandEvent
& WXUNUSED(event
))
1638 attr
.SetAlignment(wxTEXT_ALIGNMENT_LEFT
);
1641 m_textCtrl
->GetSelection(& start
, & end
);
1642 m_textCtrl
->SetStyle(start
, end
, attr
);
1644 m_currentPosition
= -1;
1647 void RichTextFrame::OnRightAlign(wxCommandEvent
& WXUNUSED(event
))
1650 attr
.SetAlignment(wxTEXT_ALIGNMENT_RIGHT
);
1653 m_textCtrl
->GetSelection(& start
, & end
);
1654 m_textCtrl
->SetStyle(start
, end
, attr
);
1656 m_currentPosition
= -1;
1659 void RichTextFrame::OnJustify(wxCommandEvent
& WXUNUSED(event
))
1662 attr
.SetAlignment(wxTEXT_ALIGNMENT_JUSTIFIED
);
1665 m_textCtrl
->GetSelection(& start
, & end
);
1666 m_textCtrl
->SetStyle(start
, end
, attr
);
1668 m_currentPosition
= -1;
1671 void RichTextFrame::OnCentre(wxCommandEvent
& WXUNUSED(event
))
1674 attr
.SetAlignment(wxTEXT_ALIGNMENT_CENTRE
);
1677 m_textCtrl
->GetSelection(& start
, & end
);
1678 m_textCtrl
->SetStyle(start
, end
, attr
);
1680 m_currentPosition
= -1;
1683 void RichTextFrame::OnChangeFont(wxCommandEvent
& WXUNUSED(event
))
1687 wxFontDialog
dialog(this, data
);
1689 if (dialog
.ShowModal() == wxID_OK
)
1691 wxFontData retData
= dialog
.GetFontData();
1692 wxFont font
= retData
.GetChosenFont();
1698 m_textCtrl
->GetSelection(& start
, & end
);
1699 m_textCtrl
->SetStyle(start
, end
, attr
);
1701 m_currentPosition
= -1;
1705 void RichTextFrame::OnChangeTextColour(wxCommandEvent
& WXUNUSED(event
))
1708 data
.SetColour(* wxBLACK
);
1709 data
.SetChooseFull(true);
1710 for (int i
= 0; i
< 16; i
++)
1712 wxColour
colour((unsigned char)(i
*16), (unsigned char)(i
*16), (unsigned char)(i
*16));
1713 data
.SetCustomColour(i
, colour
);
1716 wxColourDialog
dialog(this, &data
);
1717 dialog
.SetTitle(wxT("Choose the text colour"));
1718 if (dialog
.ShowModal() == wxID_OK
)
1720 wxColourData retData
= dialog
.GetColourData();
1721 wxColour col
= retData
.GetColour();
1724 attr
.SetTextColour(col
);
1727 m_textCtrl
->GetSelection(& start
, & end
);
1728 m_textCtrl
->SetStyle(start
, end
, attr
);
1730 m_currentPosition
= -1;
1734 void RichTextFrame::OnChangeBackgroundColour(wxCommandEvent
& WXUNUSED(event
))
1737 data
.SetColour(* wxWHITE
);
1738 data
.SetChooseFull(true);
1739 for (int i
= 0; i
< 16; i
++)
1741 wxColour
colour((unsigned char)(i
*16), (unsigned char)(i
*16), (unsigned char)(i
*16));
1742 data
.SetCustomColour(i
, colour
);
1745 wxColourDialog
dialog(this, &data
);
1746 dialog
.SetTitle(wxT("Choose the text background colour"));
1747 if (dialog
.ShowModal() == wxID_OK
)
1749 wxColourData retData
= dialog
.GetColourData();
1750 wxColour col
= retData
.GetColour();
1753 attr
.SetBackgroundColour(col
);
1756 m_textCtrl
->GetSelection(& start
, & end
);
1757 m_textCtrl
->SetStyle(start
, end
, attr
);
1759 m_currentPosition
= -1;
1763 void RichTextFrame::OnLeftIndent(wxCommandEvent
& WXUNUSED(event
))
1765 wxString indentStr
= wxGetTextFromUser
1767 _("Please enter the left indent in tenths of a millimetre."),
1772 if (!indentStr
.IsEmpty())
1774 int indent
= wxAtoi(indentStr
);
1777 attr
.SetLeftIndent(indent
);
1780 m_textCtrl
->GetSelection(& start
, & end
);
1781 m_textCtrl
->SetStyle(start
, end
, attr
);
1783 m_currentPosition
= -1;
1787 void RichTextFrame::OnRightIndent(wxCommandEvent
& WXUNUSED(event
))
1789 wxString indentStr
= wxGetTextFromUser
1791 _("Please enter the right indent in tenths of a millimetre."),
1796 if (!indentStr
.IsEmpty())
1798 int indent
= wxAtoi(indentStr
);
1801 attr
.SetRightIndent(indent
);
1804 m_textCtrl
->GetSelection(& start
, & end
);
1805 m_textCtrl
->SetStyle(start
, end
, attr
);
1807 m_currentPosition
= -1;
1811 void RichTextFrame::OnTabStops(wxCommandEvent
& WXUNUSED(event
))
1813 wxString tabsStr
= wxGetTextFromUser
1815 _("Please enter the tab stop positions in tenths of a millimetre, separated by spaces.\nLeave empty to reset tab stops."),
1823 wxStringTokenizer
tokens(tabsStr
, wxT(" "));
1824 while (tokens
.HasMoreTokens())
1826 wxString token
= tokens
.GetNextToken();
1827 tabs
.Add(wxAtoi(token
));
1834 m_textCtrl
->GetSelection(& start
, & end
);
1835 m_textCtrl
->SetStyle(start
, end
, attr
);
1837 m_currentPosition
= -1;
1840 void RichTextFrame::OnIdle(wxIdleEvent
& WXUNUSED(event
))
1842 long insertionPoint
= m_textCtrl
->GetInsertionPoint();
1843 if (insertionPoint
!= m_currentPosition
)
1847 if (m_textCtrl
->GetStyle(insertionPoint
, attr
))
1850 wxString
facename(wxT("unknown"));
1851 if (attr
.GetFont().IsOk())
1853 facename
= attr
.GetFont().GetFaceName();
1855 wxString
alignment(wxT("unknown alignment"));
1856 if (attr
.GetAlignment() == wxTEXT_ALIGNMENT_CENTRE
)
1857 alignment
= wxT("centred");
1858 else if (attr
.GetAlignment() == wxTEXT_ALIGNMENT_RIGHT
)
1859 alignment
= wxT("right-aligned");
1860 else if (attr
.GetAlignment() == wxTEXT_ALIGNMENT_LEFT
)
1861 alignment
= wxT("left-aligned");
1862 else if (attr
.GetAlignment() == wxTEXT_ALIGNMENT_JUSTIFIED
)
1863 alignment
= wxT("justified");
1865 msg
.Printf("Facename: %s", facename
);
1867 if (attr
.HasTextColour())
1869 msg
+= wxString::Format(", colour: %s",
1870 attr
.GetTextColour().GetAsString());
1874 msg
+= ", no colour";
1877 msg
<< ", " << alignment
;
1881 if (attr
.GetFont().GetWeight() == wxBOLD
)
1882 msg
+= wxT(" BOLD");
1883 else if (attr
.GetFont().GetWeight() == wxNORMAL
)
1884 msg
+= wxT(" NORMAL");
1886 if (attr
.GetFont().GetStyle() == wxITALIC
)
1887 msg
+= wxT(" ITALIC");
1889 if (attr
.GetFont().GetUnderlined())
1890 msg
+= wxT(" UNDERLINED");
1895 #endif // wxUSE_STATUSBAR
1896 m_currentPosition
= insertionPoint
;