]>
git.saurik.com Git - wxWidgets.git/blob - samples/text/text.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: TextCtrl wxWindows sample
4 // Author: Robert Roebling
7 // Copyright: (c) Robert Roebling, Julian Smart, Vadim Zeitlin
8 // Licence: wxWindows license
9 /////////////////////////////////////////////////////////////////////////////
12 #pragma implementation "text.cpp"
15 // For compilers that support precompilation, includes "wx/wx.h".
16 #include "wx/wxprec.h"
27 #include "wx/dataobj.h"
28 #include "wx/clipbrd.h"
36 #include "wx/tooltip.h"
39 // We test for wxUSE_DRAG_AND_DROP also, because data objects may not be
40 // implemented for compilers that can't cope with the OLE parts in
41 // wxUSE_DRAG_AND_DROP.
42 #if !wxUSE_DRAG_AND_DROP
43 #undef wxUSE_CLIPBOARD
44 #define wxUSE_CLIPBOARD 0
47 //----------------------------------------------------------------------
49 //----------------------------------------------------------------------
51 class MyApp
: public wxApp
57 // a text ctrl which allows to call different wxTextCtrl functions
58 // interactively by pressing function keys in it
59 class MyTextCtrl
: public wxTextCtrl
62 MyTextCtrl(wxWindow
*parent
, wxWindowID id
, const wxString
&value
,
63 const wxPoint
&pos
, const wxSize
&size
, int style
= 0)
64 : wxTextCtrl(parent
, id
, value
, pos
, size
, style
)
69 void OnKeyDown(wxKeyEvent
& event
);
70 void OnKeyUp(wxKeyEvent
& event
);
71 void OnChar(wxKeyEvent
& event
);
73 void OnText(wxCommandEvent
& event
);
74 void OnTextURL(wxTextUrlEvent
& event
);
75 void OnTextMaxLen(wxCommandEvent
& event
);
77 void OnMouseEvent(wxMouseEvent
& event
);
79 static bool ms_logKey
;
80 static bool ms_logChar
;
81 static bool ms_logMouse
;
82 static bool ms_logText
;
85 static inline wxChar
GetChar(bool on
, wxChar c
) { return on
? c
: _T('-'); }
86 void LogEvent(const wxChar
*name
, wxKeyEvent
& event
) const;
93 class MyPanel
: public wxPanel
96 MyPanel(wxFrame
*frame
, int x
, int y
, int w
, int h
);
99 void DoPasteFromClipboard();
100 void DoCopyToClipboard();
101 #endif // wxUSE_CLIPBOARD
104 void DoMoveToEndOfText();
105 void DoMoveToEndOfEntry();
107 void OnSize( wxSizeEvent
&event
);
110 MyTextCtrl
*m_password
;
113 MyTextCtrl
*m_readonly
;
114 MyTextCtrl
*m_limited
;
116 MyTextCtrl
*m_multitext
;
117 MyTextCtrl
*m_horizontal
;
119 MyTextCtrl
*m_textrich
;
124 // get the currently focused text control or return the default one is no
125 // text ctrl has focus
126 wxTextCtrl
*GetFocusedText(wxTextCtrl
*textDef
);
128 DECLARE_EVENT_TABLE()
131 class MyFrame
: public wxFrame
134 MyFrame(wxFrame
*frame
, const char *title
, int x
, int y
, int w
, int h
);
136 void OnQuit(wxCommandEvent
& event
);
137 void OnAbout(wxCommandEvent
& event
);
139 void OnSetTooltipDelay(wxCommandEvent
& event
);
140 void OnToggleTooltips(wxCommandEvent
& event
);
141 #endif // wxUSE_TOOLTIPS
144 void OnPasteFromClipboard( wxCommandEvent
&event
)
145 { m_panel
->DoPasteFromClipboard(); }
146 void OnCopyToClipboard( wxCommandEvent
&event
)
147 { m_panel
->DoCopyToClipboard(); }
148 #endif // wxUSE_CLIPBOARD
150 void OnAddTextFreeze( wxCommandEvent
& event
)
152 void OnAddText( wxCommandEvent
& event
)
153 { DoAddText(false); }
154 void OnRemoveText( wxCommandEvent
& event
)
155 { m_panel
->DoRemoveText(); }
157 void OnMoveToEndOfText( wxCommandEvent
&event
)
158 { m_panel
->DoMoveToEndOfText(); }
159 void OnMoveToEndOfEntry( wxCommandEvent
&event
)
160 { m_panel
->DoMoveToEndOfEntry(); }
162 void OnScrollLineDown(wxCommandEvent
& event
)
164 if ( !m_panel
->m_textrich
->LineDown() )
165 wxLogMessage(_T("Already at the bottom"));
168 void OnScrollLineUp(wxCommandEvent
& event
)
170 if ( !m_panel
->m_textrich
->LineUp() )
171 wxLogMessage(_T("Already at the top"));
174 void OnScrollPageDown(wxCommandEvent
& event
)
176 if ( !m_panel
->m_textrich
->PageDown() )
177 wxLogMessage(_T("Already at the bottom"));
180 void OnScrollPageUp(wxCommandEvent
& event
)
182 if ( !m_panel
->m_textrich
->PageUp() )
183 wxLogMessage(_T("Already at the top"));
186 void OnLogClear(wxCommandEvent
& event
);
187 void OnFileSave(wxCommandEvent
& event
);
188 void OnFileLoad(wxCommandEvent
& event
);
190 void OnSetEditable(wxCommandEvent
& event
);
191 void OnSetEnabled(wxCommandEvent
& event
);
193 void OnLogKey(wxCommandEvent
& event
)
195 MyTextCtrl::ms_logKey
= event
.IsChecked();
198 void OnLogChar(wxCommandEvent
& event
)
200 MyTextCtrl::ms_logChar
= event
.IsChecked();
203 void OnLogMouse(wxCommandEvent
& event
)
205 MyTextCtrl::ms_logMouse
= event
.IsChecked();
208 void OnLogText(wxCommandEvent
& event
)
210 MyTextCtrl::ms_logText
= event
.IsChecked();
213 void OnSetText(wxCommandEvent
& event
)
215 m_panel
->m_text
->SetValue(_T("Hello, world (what else did you expect)?"));
218 void OnIdle( wxIdleEvent
& event
);
221 void DoAddText(bool freeze
)
223 wxTextCtrl
*text
= m_panel
->m_textrich
;
227 for ( int i
= 0; i
< 100; i
++ )
228 text
->AppendText(wxString::Format(wxT("Line %i\n"), i
));
230 text
->SetInsertionPoint(0);
238 DECLARE_EVENT_TABLE()
241 //----------------------------------------------------------------------
243 //----------------------------------------------------------------------
247 //----------------------------------------------------------------------
249 //----------------------------------------------------------------------
260 TEXT_CLIPBOARD_COPY
= 200,
261 TEXT_CLIPBOARD_PASTE
,
264 TEXT_TOOLTIPS_SETDELAY
= 300,
265 TEXT_TOOLTIPS_ENABLE
,
292 // Create the main frame window
293 MyFrame
*frame
= new MyFrame((wxFrame
*) NULL
,
294 "Text wxWindows sample", 50, 50, 700, 420);
295 frame
->SetSizeHints( 500, 400 );
297 wxMenu
*file_menu
= new wxMenu
;
298 file_menu
->Append(TEXT_SAVE
, "&Save file\tCtrl-S",
299 "Save the text control contents to file");
300 file_menu
->Append(TEXT_LOAD
, "&Load file\tCtrl-O",
301 "Load the sample file into text control");
302 file_menu
->AppendSeparator();
303 file_menu
->Append(TEXT_ABOUT
, "&About\tAlt-A");
304 file_menu
->AppendSeparator();
305 file_menu
->Append(TEXT_QUIT
, "E&xit\tAlt-X", "Quit this sample");
307 wxMenuBar
*menu_bar
= new wxMenuBar( wxMB_DOCKABLE
);
308 menu_bar
->Append(file_menu
, "&File");
311 wxMenu
*tooltip_menu
= new wxMenu
;
312 tooltip_menu
->Append(TEXT_TOOLTIPS_SETDELAY
, "Set &delay\tCtrl-D");
313 tooltip_menu
->AppendSeparator();
314 tooltip_menu
->Append(TEXT_TOOLTIPS_ENABLE
, "&Toggle tooltips\tCtrl-T",
315 "enable/disable tooltips", TRUE
);
316 tooltip_menu
->Check(TEXT_TOOLTIPS_ENABLE
, TRUE
);
317 menu_bar
->Append(tooltip_menu
, "&Tooltips");
318 #endif // wxUSE_TOOLTIPS
321 wxMenu
*menuClipboard
= new wxMenu
;
322 menuClipboard
->Append(TEXT_CLIPBOARD_COPY
, "&Copy\tCtrl-C",
323 "Copy the first line to the clipboard");
324 menuClipboard
->Append(TEXT_CLIPBOARD_PASTE
, "&Paste\tCtrl-V",
325 "Paste from clipboard to the text control");
326 menu_bar
->Append(menuClipboard
, "&Clipboard");
327 #endif // wxUSE_CLIPBOARD
329 wxMenu
*menuText
= new wxMenu
;
330 menuText
->Append(TEXT_ADD_SOME
, "&Append some text\tCtrl-A");
331 menuText
->Append(TEXT_ADD_FREEZE
, "&Append text with freeze/thaw\tShift-Ctrl-A");
332 menuText
->Append(TEXT_REMOVE
, "&Remove first 10 characters\tCtrl-X");
333 menuText
->Append(TEXT_SET
, "&Set the first text zone value\tCtrl-E");
334 menuText
->AppendSeparator();
335 menuText
->Append(TEXT_MOVE_ENDTEXT
, "Move cursor to the end of &text");
336 menuText
->Append(TEXT_MOVE_ENDENTRY
, "Move cursor to the end of &entry");
337 menuText
->Append(TEXT_SET_EDITABLE
, "Toggle &editable state", "", TRUE
);
338 menuText
->Append(TEXT_SET_ENABLED
, "Toggle e&nabled state", "", TRUE
);
339 menuText
->Check(TEXT_SET_EDITABLE
, TRUE
);
340 menuText
->Check(TEXT_SET_ENABLED
, TRUE
);
341 menuText
->AppendSeparator();
342 menuText
->Append(TEXT_LINE_DOWN
, "Scroll text one line down");
343 menuText
->Append(TEXT_LINE_UP
, "Scroll text one line up");
344 menuText
->Append(TEXT_PAGE_DOWN
, "Scroll text one page down");
345 menuText
->Append(TEXT_PAGE_DOWN
, "Scroll text one page up");
346 menu_bar
->Append(menuText
, "Te&xt");
348 wxMenu
*menuLog
= new wxMenu
;
349 menuLog
->Append(TEXT_LOG_KEY
, "Log &key events", "", TRUE
);
350 menuLog
->Append(TEXT_LOG_CHAR
, "Log &char events", "", TRUE
);
351 menuLog
->Append(TEXT_LOG_MOUSE
, "Log &mouse events", "", TRUE
);
352 menuLog
->Append(TEXT_LOG_TEXT
, "Log &text events", "", TRUE
);
353 menuLog
->AppendSeparator();
354 menuLog
->Append(TEXT_CLEAR
, "&Clear the log\tCtrl-C",
355 "Clear the log window contents");
356 menuLog
->Check(TEXT_LOG_KEY
, TRUE
);
357 menuLog
->Check(TEXT_LOG_CHAR
, TRUE
);
358 menuLog
->Check(TEXT_LOG_TEXT
, TRUE
);
359 menu_bar
->Append(menuLog
, "&Log");
361 frame
->SetMenuBar(menu_bar
);
371 //----------------------------------------------------------------------
373 //----------------------------------------------------------------------
375 BEGIN_EVENT_TABLE(MyTextCtrl
, wxTextCtrl
)
376 EVT_KEY_DOWN(MyTextCtrl::OnKeyDown
)
377 EVT_KEY_UP(MyTextCtrl::OnKeyUp
)
378 EVT_CHAR(MyTextCtrl::OnChar
)
380 EVT_TEXT(-1, MyTextCtrl::OnText
)
381 EVT_TEXT_URL(-1, MyTextCtrl::OnTextURL
)
382 EVT_TEXT_MAXLEN(-1, MyTextCtrl::OnTextMaxLen
)
384 EVT_MOUSE_EVENTS(MyTextCtrl::OnMouseEvent
)
387 bool MyTextCtrl::ms_logKey
= TRUE
;
388 bool MyTextCtrl::ms_logChar
= TRUE
;
389 bool MyTextCtrl::ms_logMouse
= FALSE
;
390 bool MyTextCtrl::ms_logText
= TRUE
;
392 void MyTextCtrl::LogEvent(const wxChar
*name
, wxKeyEvent
& event
) const
395 long keycode
= event
.KeyCode();
399 case WXK_BACK
: key
= "BACK"; break;
400 case WXK_TAB
: key
= "TAB"; break;
401 case WXK_RETURN
: key
= "RETURN"; break;
402 case WXK_ESCAPE
: key
= "ESCAPE"; break;
403 case WXK_SPACE
: key
= "SPACE"; break;
404 case WXK_DELETE
: key
= "DELETE"; break;
405 case WXK_START
: key
= "START"; break;
406 case WXK_LBUTTON
: key
= "LBUTTON"; break;
407 case WXK_RBUTTON
: key
= "RBUTTON"; break;
408 case WXK_CANCEL
: key
= "CANCEL"; break;
409 case WXK_MBUTTON
: key
= "MBUTTON"; break;
410 case WXK_CLEAR
: key
= "CLEAR"; break;
411 case WXK_SHIFT
: key
= "SHIFT"; break;
412 case WXK_ALT
: key
= "ALT"; break;
413 case WXK_CONTROL
: key
= "CONTROL"; break;
414 case WXK_MENU
: key
= "MENU"; break;
415 case WXK_PAUSE
: key
= "PAUSE"; break;
416 case WXK_CAPITAL
: key
= "CAPITAL"; break;
417 case WXK_PRIOR
: key
= "PRIOR"; break;
418 case WXK_NEXT
: key
= "NEXT"; break;
419 case WXK_END
: key
= "END"; break;
420 case WXK_HOME
: key
= "HOME"; break;
421 case WXK_LEFT
: key
= "LEFT"; break;
422 case WXK_UP
: key
= "UP"; break;
423 case WXK_RIGHT
: key
= "RIGHT"; break;
424 case WXK_DOWN
: key
= "DOWN"; break;
425 case WXK_SELECT
: key
= "SELECT"; break;
426 case WXK_PRINT
: key
= "PRINT"; break;
427 case WXK_EXECUTE
: key
= "EXECUTE"; break;
428 case WXK_SNAPSHOT
: key
= "SNAPSHOT"; break;
429 case WXK_INSERT
: key
= "INSERT"; break;
430 case WXK_HELP
: key
= "HELP"; break;
431 case WXK_NUMPAD0
: key
= "NUMPAD0"; break;
432 case WXK_NUMPAD1
: key
= "NUMPAD1"; break;
433 case WXK_NUMPAD2
: key
= "NUMPAD2"; break;
434 case WXK_NUMPAD3
: key
= "NUMPAD3"; break;
435 case WXK_NUMPAD4
: key
= "NUMPAD4"; break;
436 case WXK_NUMPAD5
: key
= "NUMPAD5"; break;
437 case WXK_NUMPAD6
: key
= "NUMPAD6"; break;
438 case WXK_NUMPAD7
: key
= "NUMPAD7"; break;
439 case WXK_NUMPAD8
: key
= "NUMPAD8"; break;
440 case WXK_NUMPAD9
: key
= "NUMPAD9"; break;
441 case WXK_MULTIPLY
: key
= "MULTIPLY"; break;
442 case WXK_ADD
: key
= "ADD"; break;
443 case WXK_SEPARATOR
: key
= "SEPARATOR"; break;
444 case WXK_SUBTRACT
: key
= "SUBTRACT"; break;
445 case WXK_DECIMAL
: key
= "DECIMAL"; break;
446 case WXK_DIVIDE
: key
= "DIVIDE"; break;
447 case WXK_F1
: key
= "F1"; break;
448 case WXK_F2
: key
= "F2"; break;
449 case WXK_F3
: key
= "F3"; break;
450 case WXK_F4
: key
= "F4"; break;
451 case WXK_F5
: key
= "F5"; break;
452 case WXK_F6
: key
= "F6"; break;
453 case WXK_F7
: key
= "F7"; break;
454 case WXK_F8
: key
= "F8"; break;
455 case WXK_F9
: key
= "F9"; break;
456 case WXK_F10
: key
= "F10"; break;
457 case WXK_F11
: key
= "F11"; break;
458 case WXK_F12
: key
= "F12"; break;
459 case WXK_F13
: key
= "F13"; break;
460 case WXK_F14
: key
= "F14"; break;
461 case WXK_F15
: key
= "F15"; break;
462 case WXK_F16
: key
= "F16"; break;
463 case WXK_F17
: key
= "F17"; break;
464 case WXK_F18
: key
= "F18"; break;
465 case WXK_F19
: key
= "F19"; break;
466 case WXK_F20
: key
= "F20"; break;
467 case WXK_F21
: key
= "F21"; break;
468 case WXK_F22
: key
= "F22"; break;
469 case WXK_F23
: key
= "F23"; break;
470 case WXK_F24
: key
= "F24"; break;
471 case WXK_NUMLOCK
: key
= "NUMLOCK"; break;
472 case WXK_SCROLL
: key
= "SCROLL"; break;
473 case WXK_PAGEUP
: key
= "PAGEUP"; break;
474 case WXK_PAGEDOWN
: key
= "PAGEDOWN"; break;
475 case WXK_NUMPAD_SPACE
: key
= "NUMPAD_SPACE"; break;
476 case WXK_NUMPAD_TAB
: key
= "NUMPAD_TAB"; break;
477 case WXK_NUMPAD_ENTER
: key
= "NUMPAD_ENTER"; break;
478 case WXK_NUMPAD_F1
: key
= "NUMPAD_F1"; break;
479 case WXK_NUMPAD_F2
: key
= "NUMPAD_F2"; break;
480 case WXK_NUMPAD_F3
: key
= "NUMPAD_F3"; break;
481 case WXK_NUMPAD_F4
: key
= "NUMPAD_F4"; break;
482 case WXK_NUMPAD_HOME
: key
= "NUMPAD_HOME"; break;
483 case WXK_NUMPAD_LEFT
: key
= "NUMPAD_LEFT"; break;
484 case WXK_NUMPAD_UP
: key
= "NUMPAD_UP"; break;
485 case WXK_NUMPAD_RIGHT
: key
= "NUMPAD_RIGHT"; break;
486 case WXK_NUMPAD_DOWN
: key
= "NUMPAD_DOWN"; break;
487 case WXK_NUMPAD_PRIOR
: key
= "NUMPAD_PRIOR"; break;
488 case WXK_NUMPAD_PAGEUP
: key
= "NUMPAD_PAGEUP"; break;
489 case WXK_NUMPAD_PAGEDOWN
: key
= "NUMPAD_PAGEDOWN"; break;
490 case WXK_NUMPAD_END
: key
= "NUMPAD_END"; break;
491 case WXK_NUMPAD_BEGIN
: key
= "NUMPAD_BEGIN"; break;
492 case WXK_NUMPAD_INSERT
: key
= "NUMPAD_INSERT"; break;
493 case WXK_NUMPAD_DELETE
: key
= "NUMPAD_DELETE"; break;
494 case WXK_NUMPAD_EQUAL
: key
= "NUMPAD_EQUAL"; break;
495 case WXK_NUMPAD_MULTIPLY
: key
= "NUMPAD_MULTIPLY"; break;
496 case WXK_NUMPAD_ADD
: key
= "NUMPAD_ADD"; break;
497 case WXK_NUMPAD_SEPARATOR
: key
= "NUMPAD_SEPARATOR"; break;
498 case WXK_NUMPAD_SUBTRACT
: key
= "NUMPAD_SUBTRACT"; break;
499 case WXK_NUMPAD_DECIMAL
: key
= "NUMPAD_DECIMAL"; break;
503 if ( wxIsprint((int)keycode
) )
504 key
.Printf(_T("'%c'"), (char)keycode
);
505 else if ( keycode
> 0 && keycode
< 27 )
506 key
.Printf(_("Ctrl-%c"), _T('A') + keycode
- 1);
508 key
.Printf(_T("unknown (%ld)"), keycode
);
513 wxLogMessage( _T("%s event: %s (flags = %c%c%c%c)"),
516 GetChar( event
.ControlDown(), _T('C') ),
517 GetChar( event
.AltDown(), _T('A') ),
518 GetChar( event
.ShiftDown(), _T('S') ),
519 GetChar( event
.MetaDown(), _T('M') ) );
522 static wxString
GetMouseEventDesc(const wxMouseEvent
& ev
)
527 if ( ev
.LeftDown() || ev
.LeftUp() || ev
.LeftDClick() )
530 dbl
= ev
.LeftDClick();
533 else if ( ev
.MiddleDown() || ev
.MiddleUp() || ev
.MiddleDClick() )
535 button
= _T("Middle");
536 dbl
= ev
.MiddleDClick();
539 else if ( ev
.RightDown() || ev
.RightUp() || ev
.RightDClick() )
541 button
= _T("Right");
542 dbl
= ev
.RightDClick();
547 return _T("Unknown mouse event");
550 return wxString::Format(_T("%s mouse button %s"),
552 dbl
? _T("double clicked")
553 : up
? _T("released") : _T("clicked"));
556 void MyTextCtrl::OnMouseEvent(wxMouseEvent
& ev
)
568 msg
= _T("Mouse entered the window");
570 else if ( ev
.Leaving() )
572 msg
= _T("Mouse left the window");
576 msg
= GetMouseEventDesc(ev
);
579 msg
<< _T(" at (") << ev
.GetX() << _T(", ") << ev
.GetY() << _T(") ")
581 << GetChar( ev
.LeftIsDown(), _T('1') )
582 << GetChar( ev
.MiddleIsDown(), _T('2') )
583 << GetChar( ev
.RightIsDown(), _T('3') )
584 << GetChar( ev
.ControlDown(), _T('C') )
585 << GetChar( ev
.AltDown(), _T('A') )
586 << GetChar( ev
.ShiftDown(), _T('S') )
587 << GetChar( ev
.MetaDown(), _T('M') );
591 //else: we're not interested in mouse move events
594 void MyTextCtrl::OnText(wxCommandEvent
& event
)
599 MyTextCtrl
*win
= (MyTextCtrl
*)event
.GetEventObject();
600 const wxChar
*data
= (const wxChar
*)(win
->GetClientData());
603 wxLogMessage(_T("Text changed in control '%s'"), data
);
607 wxLogMessage(_T("Text changed in some control"));
611 void MyTextCtrl::OnTextMaxLen(wxCommandEvent
& event
)
613 wxLogMessage(_T("You can't enter more characters into this control."));
616 void MyTextCtrl::OnTextURL(wxTextUrlEvent
& event
)
618 const wxMouseEvent
& ev
= event
.GetMouseEvent();
620 // filter out mouse moves, too many of them
624 long start
= event
.GetURLStart(),
625 end
= event
.GetURLEnd();
627 wxLogMessage(_T("Mouse event over URL '%s': %s"),
628 GetValue().Mid(start
, end
- start
).c_str(),
629 GetMouseEventDesc(ev
).c_str());
632 void MyTextCtrl::OnChar(wxKeyEvent
& event
)
635 LogEvent( _T("Char"), event
);
640 void MyTextCtrl::OnKeyUp(wxKeyEvent
& event
)
643 LogEvent( _T("Key up"), event
);
648 void MyTextCtrl::OnKeyDown(wxKeyEvent
& event
)
650 switch ( event
.KeyCode() )
653 // show current position and text length
655 long line
, column
, pos
= GetInsertionPoint();
656 PositionToXY(pos
, &column
, &line
);
658 wxLogMessage( _T("Current position: %ld\nCurrent line, column: (%ld, %ld)\nNumber of lines: %ld\nCurrent line length: %ld\nTotal text length: %u (%ld)"),
670 SetInsertionPointEnd();
675 SetInsertionPoint(10);
681 wxLogDebug( wxT("Now capturing mouse and events.") );
687 wxLogDebug( wxT("Stopped capturing mouse and events.") );
694 // insert a blank line
699 SetValue("F6 was just pressed.");
709 GetSelection(&from
, &to
);
711 wxString sel
= GetStringSelection();
713 wxLogMessage(_T("Selection: from %ld to %ld."), from
, to
);
714 wxLogMessage(_T("Selection = '%s' (len = %u)"),
715 sel
.c_str(), sel
.length());
720 LogEvent( wxT("Key down"), event
);
725 //----------------------------------------------------------------------
727 //----------------------------------------------------------------------
729 BEGIN_EVENT_TABLE(MyPanel
, wxPanel
)
730 EVT_SIZE(MyPanel::OnSize
)
733 MyPanel::MyPanel( wxFrame
*frame
, int x
, int y
, int w
, int h
)
734 : wxPanel( frame
, -1, wxPoint(x
, y
), wxSize(w
, h
) )
736 m_log
= new wxTextCtrl( this, -1, "This is the log window.\n", wxPoint(5,260), wxSize(630,100), wxTE_MULTILINE
);
738 wxLog
*old_log
= wxLog::SetActiveTarget( new wxLogTextCtrl( m_log
) );
742 // single line text controls
744 m_text
= new MyTextCtrl( this, -1, "Single line.",
745 wxPoint(10,10), wxSize(140,-1),
747 m_text
->SetForegroundColour(*wxBLUE
);
748 m_text
->SetBackgroundColour(*wxLIGHT_GREY
);
749 (*m_text
) << " Appended.";
750 m_text
->SetInsertionPoint(0);
751 m_text
->WriteText( "Prepended. " );
753 m_password
= new MyTextCtrl( this, -1, "",
754 wxPoint(10,50), wxSize(140,-1), wxTE_PASSWORD
);
756 m_readonly
= new MyTextCtrl( this, -1, "Read only",
757 wxPoint(10,90), wxSize(140,-1), wxTE_READONLY
);
759 m_limited
= new MyTextCtrl(this, -1, "Max 8 ch",
760 wxPoint(10, 130), wxSize(140, -1));
761 m_limited
->SetMaxLength(8);
763 // multi line text controls
765 m_horizontal
= new MyTextCtrl( this, -1, "Multiline text control with a horizontal scrollbar.",
766 wxPoint(10,170), wxSize(140,70), wxTE_MULTILINE
| wxHSCROLL
);
768 // a little hack to use the command line argument for encoding testing
769 if ( wxTheApp
->argc
== 2 )
771 switch ( wxTheApp
->argv
[1][0] )
774 m_horizontal
->SetFont(wxFont(18, wxSWISS
, wxNORMAL
, wxNORMAL
,
776 wxFONTENCODING_ISO8859_2
));
777 m_horizontal
->SetValue("®lu»ouèký kùò zbìsile èe¹tina «»");
781 m_horizontal
->SetFont(wxFont(18, wxSWISS
, wxNORMAL
, wxNORMAL
,
783 wxFONTENCODING_CP1251
));
784 m_horizontal
->SetValue("Ïðèâåò!");
788 m_horizontal
->SetFont(wxFont(18, wxSWISS
, wxNORMAL
, wxNORMAL
,
790 wxFONTENCODING_CP1251
));
792 m_horizontal
->SetValue(L
"\x0412\x0430\x0434\x0438\x043c \x0426");
794 m_horizontal
->SetValue("ËÁÖÅÔÓÑ ÕÄÁÞÎÙÍ");
800 m_horizontal
->SetValue("Text in default encoding");
803 m_multitext
= new MyTextCtrl( this, -1, "Multi line.",
804 wxPoint(180,10), wxSize(240,70), wxTE_MULTILINE
);
805 m_multitext
->SetFont(*wxITALIC_FONT
);
806 (*m_multitext
) << " Appended.";
807 m_multitext
->SetInsertionPoint(0);
808 m_multitext
->WriteText( "Prepended. " );
809 m_multitext
->SetForegroundColour(*wxRED
);
810 m_multitext
->SetBackgroundColour(*wxLIGHT_GREY
);
813 m_multitext
->SetToolTip("Press F1 here for statitics, F4 for capture and uncapture mouse.");
816 m_tab
= new MyTextCtrl( this, 100, "Multiline, allow <TAB> processing.",
817 wxPoint(180,90), wxSize(240,70), wxTE_MULTILINE
| wxTE_PROCESS_TAB
);
818 m_tab
->SetClientData((void *)_T("tab"));
820 m_enter
= new MyTextCtrl( this, 100, "Multiline, allow <ENTER> processing.",
821 wxPoint(180,170), wxSize(240,70), wxTE_MULTILINE
);
822 m_enter
->SetClientData((void *)_T("enter"));
824 m_textrich
= new MyTextCtrl(this, -1, "Allows more than 30Kb of text\n"
825 "(even under broken Win9x)\n"
826 "and a very very very very very "
827 "very very very long line to test "
829 wxPoint(450, 10), wxSize(230, 230),
836 m_textrich
->SetStyle(0, 10, *wxRED
);
837 m_textrich
->SetStyle(10, 20, *wxBLUE
);
838 m_textrich
->SetStyle(30, 40,
839 wxTextAttr(*wxGREEN
, wxNullColour
, *wxITALIC_FONT
));
840 m_textrich
->SetDefaultStyle(wxTextAttr());
841 m_textrich
->AppendText(_T("\n\nFirst 10 characters should be in red\n"));
842 m_textrich
->AppendText(_T("Next 10 characters should be in blue\n"));
843 m_textrich
->AppendText(_T("Next 10 characters should be normal\n"));
844 m_textrich
->AppendText(_T("And the next 10 characters should be green and italic\n"));
845 m_textrich
->SetDefaultStyle(wxTextAttr(*wxCYAN
, *wxBLUE
));
846 m_textrich
->AppendText(_T("This text should be cyan on blue\n"));
847 m_textrich
->SetDefaultStyle(wxTextAttr(*wxBLUE
, *wxWHITE
));
848 m_textrich
->AppendText(_T("And this should be in blue and the text you ")
849 _T("type should be in blue as well"));
851 m_textrich
->SetFont(wxFont(12, wxFONTFAMILY_TELETYPE
,
852 wxFONTSTYLE_NORMAL
, wxFONTWEIGHT_NORMAL
));
853 m_textrich
->SetDefaultStyle(wxTextAttr(*wxRED
));
854 m_textrich
->AppendText(_T("Red text\n"));
855 m_textrich
->SetDefaultStyle(wxTextAttr(wxNullColour
, *wxLIGHT_GREY
));
856 m_textrich
->AppendText(_T("Red on grey text\n"));
857 m_textrich
->SetDefaultStyle(wxTextAttr(*wxBLUE
));
858 m_textrich
->AppendText(_T("Blue on grey text\n"));
862 void MyPanel::OnSize( wxSizeEvent
&event
)
864 wxSize
client_area( GetClientSize() );
865 m_log
->SetSize( 0, 260, client_area
.x
, client_area
.y
- 260 );
869 wxTextCtrl
*MyPanel::GetFocusedText(wxTextCtrl
*textDef
)
871 wxWindow
*win
= FindFocus();
873 wxTextCtrl
*text
= win
? wxDynamicCast(win
, wxTextCtrl
) : NULL
;
874 return text
? text
: textDef
;
878 void MyPanel::DoPasteFromClipboard()
880 // On X11, we want to get the data from the primary selection instead
881 // of the normal clipboard (which isn't normal under X11 at all). This
882 // call has no effect under MSW.
883 wxTheClipboard
->UsePrimarySelection();
885 if (!wxTheClipboard
->Open())
887 *m_log
<< "Error opening the clipboard.\n";
892 *m_log
<< "Successfully opened the clipboard.\n";
895 wxTextDataObject data
;
897 if (wxTheClipboard
->IsSupported( data
.GetFormat() ))
899 *m_log
<< "Clipboard supports requested format.\n";
901 if (wxTheClipboard
->GetData( data
))
903 *m_log
<< "Successfully retrieved data from the clipboard.\n";
904 *m_multitext
<< data
.GetText() << "\n";
908 *m_log
<< "Error getting data from the clipboard.\n";
913 *m_log
<< "Clipboard doesn't support requested format.\n";
916 wxTheClipboard
->Close();
918 *m_log
<< "Closed the clipboard.\n";
921 void MyPanel::DoCopyToClipboard()
923 // On X11, we want to get the data from the primary selection instead
924 // of the normal clipboard (which isn't normal under X11 at all). This
925 // call has no effect under MSW.
926 wxTheClipboard
->UsePrimarySelection();
928 wxString
text( m_multitext
->GetLineText(0) );
932 *m_log
<< "No text to copy.\n";
937 if (!wxTheClipboard
->Open())
939 *m_log
<< "Error opening the clipboard.\n";
945 *m_log
<< "Successfully opened the clipboard.\n";
948 wxTextDataObject
*data
= new wxTextDataObject( text
);
950 if (!wxTheClipboard
->SetData( data
))
952 *m_log
<< "Error while copying to the clipboard.\n";
956 *m_log
<< "Successfully copied data to the clipboard.\n";
959 wxTheClipboard
->Close();
961 *m_log
<< "Closed the clipboard.\n";
964 #endif // wxUSE_CLIPBOARD
966 void MyPanel::DoMoveToEndOfText()
968 m_multitext
->SetInsertionPointEnd();
969 m_multitext
->SetFocus();
972 void MyPanel::DoMoveToEndOfEntry()
974 m_text
->SetInsertionPointEnd();
978 void MyPanel::DoRemoveText()
980 GetFocusedText(m_multitext
)->Remove(0, 10);
983 //----------------------------------------------------------------------
985 //----------------------------------------------------------------------
987 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
988 EVT_MENU(TEXT_QUIT
, MyFrame::OnQuit
)
989 EVT_MENU(TEXT_ABOUT
, MyFrame::OnAbout
)
990 EVT_MENU(TEXT_SAVE
, MyFrame::OnFileSave
)
991 EVT_MENU(TEXT_LOAD
, MyFrame::OnFileLoad
)
993 EVT_MENU(TEXT_LOG_KEY
, MyFrame::OnLogKey
)
994 EVT_MENU(TEXT_LOG_CHAR
, MyFrame::OnLogChar
)
995 EVT_MENU(TEXT_LOG_MOUSE
,MyFrame::OnLogMouse
)
996 EVT_MENU(TEXT_LOG_TEXT
, MyFrame::OnLogText
)
997 EVT_MENU(TEXT_CLEAR
, MyFrame::OnLogClear
)
1000 EVT_MENU(TEXT_TOOLTIPS_SETDELAY
, MyFrame::OnSetTooltipDelay
)
1001 EVT_MENU(TEXT_TOOLTIPS_ENABLE
, MyFrame::OnToggleTooltips
)
1002 #endif // wxUSE_TOOLTIPS
1005 EVT_MENU(TEXT_CLIPBOARD_PASTE
, MyFrame::OnPasteFromClipboard
)
1006 EVT_MENU(TEXT_CLIPBOARD_COPY
, MyFrame::OnCopyToClipboard
)
1007 #endif // wxUSE_CLIPBOARD
1009 EVT_MENU(TEXT_REMOVE
, MyFrame::OnRemoveText
)
1010 EVT_MENU(TEXT_ADD_SOME
, MyFrame::OnAddText
)
1011 EVT_MENU(TEXT_ADD_FREEZE
, MyFrame::OnAddTextFreeze
)
1012 EVT_MENU(TEXT_MOVE_ENDTEXT
, MyFrame::OnMoveToEndOfText
)
1013 EVT_MENU(TEXT_MOVE_ENDENTRY
, MyFrame::OnMoveToEndOfEntry
)
1015 EVT_MENU(TEXT_SET_EDITABLE
, MyFrame::OnSetEditable
)
1016 EVT_MENU(TEXT_SET_ENABLED
, MyFrame::OnSetEnabled
)
1018 EVT_MENU(TEXT_LINE_DOWN
, MyFrame::OnScrollLineDown
)
1019 EVT_MENU(TEXT_LINE_UP
, MyFrame::OnScrollLineUp
)
1020 EVT_MENU(TEXT_PAGE_DOWN
, MyFrame::OnScrollPageDown
)
1021 EVT_MENU(TEXT_PAGE_UP
, MyFrame::OnScrollPageUp
)
1023 EVT_MENU(TEXT_SET
, MyFrame::OnSetText
)
1025 EVT_IDLE(MyFrame::OnIdle
)
1028 MyFrame::MyFrame(wxFrame
*frame
, const char *title
, int x
, int y
, int w
, int h
)
1029 : wxFrame(frame
, -1, title
, wxPoint(x
, y
), wxSize(w
, h
) )
1033 m_panel
= new MyPanel( this, 10, 10, 300, 100 );
1036 void MyFrame::OnQuit (wxCommandEvent
& WXUNUSED(event
) )
1041 void MyFrame::OnAbout( wxCommandEvent
& WXUNUSED(event
) )
1043 wxBeginBusyCursor();
1045 wxMessageDialog
dialog(this,
1046 "This is a text control sample. It demonstrates the many different\n"
1047 "text control styles, the use of the clipboard, setting and handling\n"
1048 "tooltips and intercepting key and char events.\n"
1050 "Copyright (c) 1999, Robert Roebling, Julian Smart, Vadim Zeitlin",
1051 "About wxTextCtrl Sample",
1052 wxOK
| wxICON_INFORMATION
);
1060 void MyFrame::OnSetTooltipDelay(wxCommandEvent
& event
)
1062 static long s_delay
= 5000;
1065 delay
.Printf( _T("%ld"), s_delay
);
1067 delay
= wxGetTextFromUser("Enter delay (in milliseconds)",
1068 "Set tooltip delay",
1072 return; // cancelled
1074 wxSscanf(delay
, _T("%ld"), &s_delay
);
1076 wxToolTip::SetDelay(s_delay
);
1078 wxLogStatus(this, _T("Tooltip delay set to %ld milliseconds"), s_delay
);
1081 void MyFrame::OnToggleTooltips(wxCommandEvent
& event
)
1083 static bool s_enabled
= TRUE
;
1085 s_enabled
= !s_enabled
;
1087 wxToolTip::Enable(s_enabled
);
1089 wxLogStatus(this, _T("Tooltips %sabled"), s_enabled
? _T("en") : _T("dis") );
1093 void MyFrame::OnLogClear(wxCommandEvent
& WXUNUSED(event
))
1095 m_panel
->m_log
->Clear();
1098 void MyFrame::OnSetEditable(wxCommandEvent
& WXUNUSED(event
))
1100 static bool s_editable
= TRUE
;
1102 s_editable
= !s_editable
;
1103 m_panel
->m_text
->SetEditable(s_editable
);
1104 m_panel
->m_password
->SetEditable(s_editable
);
1105 m_panel
->m_multitext
->SetEditable(s_editable
);
1106 m_panel
->m_textrich
->SetEditable(s_editable
);
1109 void MyFrame::OnSetEnabled(wxCommandEvent
& WXUNUSED(event
))
1111 bool enabled
= m_panel
->m_text
->IsEnabled();
1114 m_panel
->m_text
->Enable(enabled
);
1115 m_panel
->m_password
->Enable(enabled
);
1116 m_panel
->m_multitext
->Enable(enabled
);
1117 m_panel
->m_readonly
->Enable(enabled
);
1118 m_panel
->m_limited
->Enable(enabled
);
1119 m_panel
->m_textrich
->Enable(enabled
);
1122 void MyFrame::OnFileSave(wxCommandEvent
& event
)
1124 if ( m_panel
->m_textrich
->SaveFile("dummy.txt") )
1127 // verify that the fil length is correct (it wasn't under Win95)
1128 wxFile
file(wxT("dummy.txt"));
1129 wxLogStatus(this, _T("Successfully saved file (text len = %ld, file size = %ld)"),
1130 m_panel
->m_textrich
->GetValue().length(),
1135 wxLogStatus(this, _T("Couldn't save the file"));
1138 void MyFrame::OnFileLoad(wxCommandEvent
& event
)
1140 if ( m_panel
->m_textrich
->LoadFile("dummy.txt") )
1141 wxLogStatus(this, _T("Successfully loaded file"));
1143 wxLogStatus(this, _T("Couldn't load the file"));
1146 void MyFrame::OnIdle( wxIdleEvent
& event
)
1148 // track the window which has the focus in the status bar
1149 static wxWindow
*s_windowFocus
= (wxWindow
*)NULL
;
1150 wxWindow
*focus
= wxWindow::FindFocus();
1151 if ( focus
&& (focus
!= s_windowFocus
) )
1153 s_windowFocus
= focus
;
1158 _T("Focus: wxWindow = %p, HWND = %08x"),
1160 _T("Focus: wxWindow = %p"),
1164 , s_windowFocus
->GetHWND()