]>
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
;
84 static inline wxChar
GetChar(bool on
, wxChar c
) { return on
? c
: _T('-'); }
85 void LogEvent(const wxChar
*name
, wxKeyEvent
& event
) const;
92 class MyPanel
: public wxPanel
95 MyPanel(wxFrame
*frame
, int x
, int y
, int w
, int h
);
98 void DoPasteFromClipboard();
99 void DoCopyToClipboard();
100 #endif // wxUSE_CLIPBOARD
102 void DoMoveToEndOfText();
103 void DoMoveToEndOfEntry();
105 void OnSize( wxSizeEvent
&event
);
108 MyTextCtrl
*m_password
;
111 MyTextCtrl
*m_readonly
;
112 MyTextCtrl
*m_limited
;
114 MyTextCtrl
*m_multitext
;
115 MyTextCtrl
*m_horizontal
;
117 MyTextCtrl
*m_textrich
;
122 DECLARE_EVENT_TABLE()
125 class MyFrame
: public wxFrame
128 MyFrame(wxFrame
*frame
, const char *title
, int x
, int y
, int w
, int h
);
130 void OnQuit(wxCommandEvent
& event
);
131 void OnAbout(wxCommandEvent
& event
);
133 void OnSetTooltipDelay(wxCommandEvent
& event
);
134 void OnToggleTooltips(wxCommandEvent
& event
);
135 #endif // wxUSE_TOOLTIPS
138 void OnPasteFromClipboard( wxCommandEvent
&event
)
139 { m_panel
->DoPasteFromClipboard(); }
140 void OnCopyToClipboard( wxCommandEvent
&event
)
141 { m_panel
->DoCopyToClipboard(); }
142 #endif // wxUSE_CLIPBOARD
144 void OnAddTextFreeze( wxCommandEvent
& event
)
146 void OnAddText( wxCommandEvent
& event
)
147 { DoAddText(false); }
149 void OnMoveToEndOfText( wxCommandEvent
&event
)
150 { m_panel
->DoMoveToEndOfText(); }
151 void OnMoveToEndOfEntry( wxCommandEvent
&event
)
152 { m_panel
->DoMoveToEndOfEntry(); }
154 void OnScrollLineDown(wxCommandEvent
& event
)
156 if ( !m_panel
->m_textrich
->LineDown() )
157 wxLogMessage(_T("Already at the bottom"));
160 void OnScrollLineUp(wxCommandEvent
& event
)
162 if ( !m_panel
->m_textrich
->LineUp() )
163 wxLogMessage(_T("Already at the top"));
166 void OnScrollPageDown(wxCommandEvent
& event
)
168 if ( !m_panel
->m_textrich
->PageDown() )
169 wxLogMessage(_T("Already at the bottom"));
172 void OnScrollPageUp(wxCommandEvent
& event
)
174 if ( !m_panel
->m_textrich
->PageUp() )
175 wxLogMessage(_T("Already at the top"));
178 void OnLogClear(wxCommandEvent
& event
);
179 void OnFileSave(wxCommandEvent
& event
);
180 void OnFileLoad(wxCommandEvent
& event
);
182 void OnSetEditable(wxCommandEvent
& event
);
183 void OnSetEnabled(wxCommandEvent
& event
);
185 void OnLogKey(wxCommandEvent
& event
)
187 MyTextCtrl::ms_logKey
= event
.IsChecked();
190 void OnLogChar(wxCommandEvent
& event
)
192 MyTextCtrl::ms_logChar
= event
.IsChecked();
195 void OnLogMouse(wxCommandEvent
& event
)
197 MyTextCtrl::ms_logMouse
= event
.IsChecked();
200 void OnIdle( wxIdleEvent
& event
);
203 void DoAddText(bool freeze
)
205 wxTextCtrl
*text
= m_panel
->m_textrich
;
209 for ( int i
= 0; i
< 100; i
++ )
210 text
->AppendText(wxString::Format(wxT("Line %i\n"), i
));
212 text
->SetInsertionPoint(0);
220 DECLARE_EVENT_TABLE()
223 //----------------------------------------------------------------------
225 //----------------------------------------------------------------------
229 //----------------------------------------------------------------------
231 //----------------------------------------------------------------------
242 TEXT_CLIPBOARD_COPY
= 200,
243 TEXT_CLIPBOARD_PASTE
,
246 TEXT_TOOLTIPS_SETDELAY
= 300,
247 TEXT_TOOLTIPS_ENABLE
,
271 // Create the main frame window
272 MyFrame
*frame
= new MyFrame((wxFrame
*) NULL
,
273 "Text wxWindows sample", 50, 50, 700, 420);
274 frame
->SetSizeHints( 500, 400 );
276 wxMenu
*file_menu
= new wxMenu
;
277 file_menu
->Append(TEXT_SAVE
, "&Save file\tCtrl-S",
278 "Save the text control contents to file");
279 file_menu
->Append(TEXT_LOAD
, "&Load file\tCtrl-O",
280 "Load the sample file into text control");
281 file_menu
->AppendSeparator();
282 file_menu
->Append(TEXT_ABOUT
, "&About\tAlt-A");
283 file_menu
->AppendSeparator();
284 file_menu
->Append(TEXT_QUIT
, "E&xit\tAlt-X", "Quit this sample");
286 wxMenuBar
*menu_bar
= new wxMenuBar( wxMB_DOCKABLE
);
287 menu_bar
->Append(file_menu
, "&File");
290 wxMenu
*tooltip_menu
= new wxMenu
;
291 tooltip_menu
->Append(TEXT_TOOLTIPS_SETDELAY
, "Set &delay\tCtrl-D");
292 tooltip_menu
->AppendSeparator();
293 tooltip_menu
->Append(TEXT_TOOLTIPS_ENABLE
, "&Toggle tooltips\tCtrl-T",
294 "enable/disable tooltips", TRUE
);
295 tooltip_menu
->Check(TEXT_TOOLTIPS_ENABLE
, TRUE
);
296 menu_bar
->Append(tooltip_menu
, "&Tooltips");
297 #endif // wxUSE_TOOLTIPS
300 wxMenu
*menuClipboard
= new wxMenu
;
301 menuClipboard
->Append(TEXT_CLIPBOARD_COPY
, "&Copy\tCtrl-C",
302 "Copy the first line to the clipboard");
303 menuClipboard
->Append(TEXT_CLIPBOARD_PASTE
, "&Paste\tCtrl-V",
304 "Paste from clipboard to the text control");
305 menu_bar
->Append(menuClipboard
, "&Clipboard");
306 #endif // wxUSE_CLIPBOARD
308 wxMenu
*menuText
= new wxMenu
;
309 menuText
->Append(TEXT_ADD_SOME
, "&Append some text\tCtrl-A");
310 menuText
->Append(TEXT_ADD_FREEZE
, "&Append text with freeze/thaw\tShift-Ctrl-A");
311 menuText
->Append(TEXT_MOVE_ENDTEXT
, "Move cursor to the end of &text");
312 menuText
->Append(TEXT_MOVE_ENDENTRY
, "Move cursor to the end of &entry");
313 menuText
->Append(TEXT_SET_EDITABLE
, "Toggle &editable state", "", TRUE
);
314 menuText
->Append(TEXT_SET_ENABLED
, "Toggle e&nabled state", "", TRUE
);
315 menuText
->Check(TEXT_SET_EDITABLE
, TRUE
);
316 menuText
->Check(TEXT_SET_ENABLED
, TRUE
);
317 menuText
->AppendSeparator();
318 menuText
->Append(TEXT_LINE_DOWN
, "Scroll text one line down");
319 menuText
->Append(TEXT_LINE_UP
, "Scroll text one line up");
320 menuText
->Append(TEXT_PAGE_DOWN
, "Scroll text one page down");
321 menuText
->Append(TEXT_PAGE_DOWN
, "Scroll text one page up");
322 menu_bar
->Append(menuText
, "Te&xt");
324 wxMenu
*menuLog
= new wxMenu
;
325 menuLog
->Append(TEXT_LOG_KEY
, "Log &key events", "", TRUE
);
326 menuLog
->Append(TEXT_LOG_CHAR
, "Log &char events", "", TRUE
);
327 menuLog
->Append(TEXT_LOG_MOUSE
, "Log &mouse events", "", TRUE
);
328 menuLog
->AppendSeparator();
329 menuLog
->Append(TEXT_CLEAR
, "&Clear the log\tCtrl-C",
330 "Clear the log window contents");
331 menuLog
->Check(TEXT_LOG_KEY
, TRUE
);
332 menuLog
->Check(TEXT_LOG_CHAR
, TRUE
);
333 menuLog
->Check(TEXT_LOG_MOUSE
, TRUE
);
334 menu_bar
->Append(menuLog
, "&Log");
336 frame
->SetMenuBar(menu_bar
);
346 //----------------------------------------------------------------------
348 //----------------------------------------------------------------------
350 BEGIN_EVENT_TABLE(MyTextCtrl
, wxTextCtrl
)
351 EVT_KEY_DOWN(MyTextCtrl::OnKeyDown
)
352 EVT_KEY_UP(MyTextCtrl::OnKeyUp
)
353 EVT_CHAR(MyTextCtrl::OnChar
)
355 EVT_TEXT(-1, MyTextCtrl::OnText
)
356 EVT_TEXT_URL(-1, MyTextCtrl::OnTextURL
)
357 EVT_TEXT_MAXLEN(-1, MyTextCtrl::OnTextMaxLen
)
359 EVT_MOUSE_EVENTS(MyTextCtrl::OnMouseEvent
)
362 bool MyTextCtrl::ms_logKey
= TRUE
;
363 bool MyTextCtrl::ms_logChar
= TRUE
;
364 bool MyTextCtrl::ms_logMouse
= TRUE
;
366 void MyTextCtrl::LogEvent(const wxChar
*name
, wxKeyEvent
& event
) const
369 long keycode
= event
.KeyCode();
373 case WXK_BACK
: key
= "BACK"; break;
374 case WXK_TAB
: key
= "TAB"; break;
375 case WXK_RETURN
: key
= "RETURN"; break;
376 case WXK_ESCAPE
: key
= "ESCAPE"; break;
377 case WXK_SPACE
: key
= "SPACE"; break;
378 case WXK_DELETE
: key
= "DELETE"; break;
379 case WXK_START
: key
= "START"; break;
380 case WXK_LBUTTON
: key
= "LBUTTON"; break;
381 case WXK_RBUTTON
: key
= "RBUTTON"; break;
382 case WXK_CANCEL
: key
= "CANCEL"; break;
383 case WXK_MBUTTON
: key
= "MBUTTON"; break;
384 case WXK_CLEAR
: key
= "CLEAR"; break;
385 case WXK_SHIFT
: key
= "SHIFT"; break;
386 case WXK_ALT
: key
= "ALT"; break;
387 case WXK_CONTROL
: key
= "CONTROL"; break;
388 case WXK_MENU
: key
= "MENU"; break;
389 case WXK_PAUSE
: key
= "PAUSE"; break;
390 case WXK_CAPITAL
: key
= "CAPITAL"; break;
391 case WXK_PRIOR
: key
= "PRIOR"; break;
392 case WXK_NEXT
: key
= "NEXT"; break;
393 case WXK_END
: key
= "END"; break;
394 case WXK_HOME
: key
= "HOME"; break;
395 case WXK_LEFT
: key
= "LEFT"; break;
396 case WXK_UP
: key
= "UP"; break;
397 case WXK_RIGHT
: key
= "RIGHT"; break;
398 case WXK_DOWN
: key
= "DOWN"; break;
399 case WXK_SELECT
: key
= "SELECT"; break;
400 case WXK_PRINT
: key
= "PRINT"; break;
401 case WXK_EXECUTE
: key
= "EXECUTE"; break;
402 case WXK_SNAPSHOT
: key
= "SNAPSHOT"; break;
403 case WXK_INSERT
: key
= "INSERT"; break;
404 case WXK_HELP
: key
= "HELP"; break;
405 case WXK_NUMPAD0
: key
= "NUMPAD0"; break;
406 case WXK_NUMPAD1
: key
= "NUMPAD1"; break;
407 case WXK_NUMPAD2
: key
= "NUMPAD2"; break;
408 case WXK_NUMPAD3
: key
= "NUMPAD3"; break;
409 case WXK_NUMPAD4
: key
= "NUMPAD4"; break;
410 case WXK_NUMPAD5
: key
= "NUMPAD5"; break;
411 case WXK_NUMPAD6
: key
= "NUMPAD6"; break;
412 case WXK_NUMPAD7
: key
= "NUMPAD7"; break;
413 case WXK_NUMPAD8
: key
= "NUMPAD8"; break;
414 case WXK_NUMPAD9
: key
= "NUMPAD9"; break;
415 case WXK_MULTIPLY
: key
= "MULTIPLY"; break;
416 case WXK_ADD
: key
= "ADD"; break;
417 case WXK_SEPARATOR
: key
= "SEPARATOR"; break;
418 case WXK_SUBTRACT
: key
= "SUBTRACT"; break;
419 case WXK_DECIMAL
: key
= "DECIMAL"; break;
420 case WXK_DIVIDE
: key
= "DIVIDE"; break;
421 case WXK_F1
: key
= "F1"; break;
422 case WXK_F2
: key
= "F2"; break;
423 case WXK_F3
: key
= "F3"; break;
424 case WXK_F4
: key
= "F4"; break;
425 case WXK_F5
: key
= "F5"; break;
426 case WXK_F6
: key
= "F6"; break;
427 case WXK_F7
: key
= "F7"; break;
428 case WXK_F8
: key
= "F8"; break;
429 case WXK_F9
: key
= "F9"; break;
430 case WXK_F10
: key
= "F10"; break;
431 case WXK_F11
: key
= "F11"; break;
432 case WXK_F12
: key
= "F12"; break;
433 case WXK_F13
: key
= "F13"; break;
434 case WXK_F14
: key
= "F14"; break;
435 case WXK_F15
: key
= "F15"; break;
436 case WXK_F16
: key
= "F16"; break;
437 case WXK_F17
: key
= "F17"; break;
438 case WXK_F18
: key
= "F18"; break;
439 case WXK_F19
: key
= "F19"; break;
440 case WXK_F20
: key
= "F20"; break;
441 case WXK_F21
: key
= "F21"; break;
442 case WXK_F22
: key
= "F22"; break;
443 case WXK_F23
: key
= "F23"; break;
444 case WXK_F24
: key
= "F24"; break;
445 case WXK_NUMLOCK
: key
= "NUMLOCK"; break;
446 case WXK_SCROLL
: key
= "SCROLL"; break;
447 case WXK_PAGEUP
: key
= "PAGEUP"; break;
448 case WXK_PAGEDOWN
: key
= "PAGEDOWN"; break;
449 case WXK_NUMPAD_SPACE
: key
= "NUMPAD_SPACE"; break;
450 case WXK_NUMPAD_TAB
: key
= "NUMPAD_TAB"; break;
451 case WXK_NUMPAD_ENTER
: key
= "NUMPAD_ENTER"; break;
452 case WXK_NUMPAD_F1
: key
= "NUMPAD_F1"; break;
453 case WXK_NUMPAD_F2
: key
= "NUMPAD_F2"; break;
454 case WXK_NUMPAD_F3
: key
= "NUMPAD_F3"; break;
455 case WXK_NUMPAD_F4
: key
= "NUMPAD_F4"; break;
456 case WXK_NUMPAD_HOME
: key
= "NUMPAD_HOME"; break;
457 case WXK_NUMPAD_LEFT
: key
= "NUMPAD_LEFT"; break;
458 case WXK_NUMPAD_UP
: key
= "NUMPAD_UP"; break;
459 case WXK_NUMPAD_RIGHT
: key
= "NUMPAD_RIGHT"; break;
460 case WXK_NUMPAD_DOWN
: key
= "NUMPAD_DOWN"; break;
461 case WXK_NUMPAD_PRIOR
: key
= "NUMPAD_PRIOR"; break;
462 case WXK_NUMPAD_PAGEUP
: key
= "NUMPAD_PAGEUP"; break;
463 case WXK_NUMPAD_PAGEDOWN
: key
= "NUMPAD_PAGEDOWN"; break;
464 case WXK_NUMPAD_END
: key
= "NUMPAD_END"; break;
465 case WXK_NUMPAD_BEGIN
: key
= "NUMPAD_BEGIN"; break;
466 case WXK_NUMPAD_INSERT
: key
= "NUMPAD_INSERT"; break;
467 case WXK_NUMPAD_DELETE
: key
= "NUMPAD_DELETE"; break;
468 case WXK_NUMPAD_EQUAL
: key
= "NUMPAD_EQUAL"; break;
469 case WXK_NUMPAD_MULTIPLY
: key
= "NUMPAD_MULTIPLY"; break;
470 case WXK_NUMPAD_ADD
: key
= "NUMPAD_ADD"; break;
471 case WXK_NUMPAD_SEPARATOR
: key
= "NUMPAD_SEPARATOR"; break;
472 case WXK_NUMPAD_SUBTRACT
: key
= "NUMPAD_SUBTRACT"; break;
473 case WXK_NUMPAD_DECIMAL
: key
= "NUMPAD_DECIMAL"; break;
477 if ( wxIsprint((int)keycode
) )
478 key
.Printf( _T("'%c'") , (char)keycode
);
480 key
.Printf( _T("unknown (%ld)"), keycode
);
485 wxLogMessage( _T("%s event: %s (flags = %c%c%c%c)"),
488 GetChar( event
.ControlDown(), _T('C') ),
489 GetChar( event
.AltDown(), _T('A') ),
490 GetChar( event
.ShiftDown(), _T('S') ),
491 GetChar( event
.MetaDown(), _T('M') ) );
494 static wxString
GetMouseEventDesc(const wxMouseEvent
& ev
)
499 if ( ev
.LeftDown() || ev
.LeftUp() || ev
.LeftDClick() )
502 dbl
= ev
.LeftDClick();
505 else if ( ev
.MiddleDown() || ev
.MiddleUp() || ev
.MiddleDClick() )
507 button
= _T("Middle");
508 dbl
= ev
.MiddleDClick();
511 else if ( ev
.RightDown() || ev
.RightUp() || ev
.RightDClick() )
513 button
= _T("Right");
514 dbl
= ev
.RightDClick();
519 return _T("Unknown mouse event");
522 return wxString::Format(_T("%s mouse button %s"),
524 dbl
? _T("double clicked")
525 : up
? _T("released") : _T("clicked"));
528 void MyTextCtrl::OnMouseEvent(wxMouseEvent
& ev
)
532 if ( !MyTextCtrl::ms_logMouse
)
540 msg
= _T("Mouse entered the window");
542 else if ( ev
.Leaving() )
544 msg
= _T("Mouse left the window");
548 msg
= GetMouseEventDesc(ev
);
551 msg
<< _T(" at (") << ev
.GetX() << _T(", ") << ev
.GetY() << _T(") ")
553 << GetChar( ev
.LeftIsDown(), _T('1') )
554 << GetChar( ev
.MiddleIsDown(), _T('2') )
555 << GetChar( ev
.RightIsDown(), _T('3') )
556 << GetChar( ev
.ControlDown(), _T('C') )
557 << GetChar( ev
.AltDown(), _T('A') )
558 << GetChar( ev
.ShiftDown(), _T('S') )
559 << GetChar( ev
.MetaDown(), _T('M') );
563 //else: we're not interested in mouse move events
566 void MyTextCtrl::OnText(wxCommandEvent
& event
)
568 MyTextCtrl
*win
= (MyTextCtrl
*)event
.GetEventObject();
569 const wxChar
*data
= (const wxChar
*)(win
->GetClientData());
572 wxLogMessage(_T("Text changed in control '%s'"), data
);
576 wxLogMessage(_T("Text changed in some control"));
580 void MyTextCtrl::OnTextMaxLen(wxCommandEvent
& event
)
582 wxLogMessage(_T("You can't enter more characters into this control."));
585 void MyTextCtrl::OnTextURL(wxTextUrlEvent
& event
)
587 const wxMouseEvent
& ev
= event
.GetMouseEvent();
589 // filter out mouse moves, too many of them
593 long start
= event
.GetURLStart(),
594 end
= event
.GetURLEnd();
596 wxLogMessage(_T("Mouse event over URL '%s': %s"),
597 GetValue().Mid(start
, end
- start
).c_str(),
598 GetMouseEventDesc(ev
).c_str());
601 void MyTextCtrl::OnChar(wxKeyEvent
& event
)
603 if ( MyTextCtrl::ms_logChar
)
604 LogEvent( _T("Char"), event
);
609 void MyTextCtrl::OnKeyUp(wxKeyEvent
& event
)
611 if ( MyTextCtrl::ms_logKey
)
612 LogEvent( _T("Key up"), event
);
617 void MyTextCtrl::OnKeyDown(wxKeyEvent
& event
)
619 switch ( event
.KeyCode() )
622 // show current position and text length
624 long line
, column
, pos
= GetInsertionPoint();
625 PositionToXY(pos
, &column
, &line
);
627 wxLogMessage( _T("Current position: %ld\nCurrent line, column: (%ld, %ld)\nNumber of lines: %ld\nCurrent line length: %ld\nTotal text length: %u (%ld)"),
639 SetInsertionPointEnd();
644 SetInsertionPoint(10);
650 wxLogDebug( wxT("Now capturing mouse and events.") );
656 wxLogDebug( wxT("Stopped capturing mouse and events.") );
663 // insert a blank line
668 SetValue("F6 was just pressed.");
676 if ( MyTextCtrl::ms_logKey
)
677 LogEvent( wxT("Key down"), event
);
682 //----------------------------------------------------------------------
684 //----------------------------------------------------------------------
686 BEGIN_EVENT_TABLE(MyPanel
, wxPanel
)
687 EVT_SIZE(MyPanel::OnSize
)
690 MyPanel::MyPanel( wxFrame
*frame
, int x
, int y
, int w
, int h
)
691 : wxPanel( frame
, -1, wxPoint(x
, y
), wxSize(w
, h
) )
693 m_log
= new wxTextCtrl( this, -1, "This is the log window.\n", wxPoint(5,260), wxSize(630,100), wxTE_MULTILINE
);
695 wxLog
*old_log
= wxLog::SetActiveTarget( new wxLogTextCtrl( m_log
) );
699 // single line text controls
701 m_text
= new MyTextCtrl( this, -1, "Single line.",
702 wxPoint(10,10), wxSize(140,-1),
704 m_text
->SetForegroundColour(*wxBLUE
);
705 m_text
->SetBackgroundColour(*wxLIGHT_GREY
);
706 (*m_text
) << " Appended.";
707 m_text
->SetInsertionPoint(0);
708 m_text
->WriteText( "Prepended. " );
710 m_password
= new MyTextCtrl( this, -1, "",
711 wxPoint(10,50), wxSize(140,-1), wxTE_PASSWORD
);
713 m_readonly
= new MyTextCtrl( this, -1, "Read only",
714 wxPoint(10,90), wxSize(140,-1), wxTE_READONLY
);
716 m_limited
= new MyTextCtrl(this, -1, "Max 8 ch",
717 wxPoint(10, 130), wxSize(140, -1));
718 m_limited
->SetMaxLength(8);
720 // multi line text controls
722 m_horizontal
= new MyTextCtrl( this, -1, "Multiline text control with a horizontal scrollbar.",
723 wxPoint(10,170), wxSize(140,70), wxTE_MULTILINE
| wxHSCROLL
);
725 // a little hack to use the command line argument for encoding testing
726 if ( wxTheApp
->argc
== 2 )
728 switch ( wxTheApp
->argv
[1][0] )
731 m_horizontal
->SetFont(wxFont(18, wxSWISS
, wxNORMAL
, wxNORMAL
,
733 wxFONTENCODING_ISO8859_2
));
734 m_horizontal
->SetValue("®lu»ouèký kùò zbìsile èe¹tina «»");
738 m_horizontal
->SetFont(wxFont(18, wxSWISS
, wxNORMAL
, wxNORMAL
,
740 wxFONTENCODING_KOI8
));
741 m_horizontal
->SetValue("ËÁÖÅÔÓÑ ÕÄÁÞÎÙÍ");
746 m_horizontal
->SetValue("Text in default encoding");
749 m_multitext
= new MyTextCtrl( this, -1, "Multi line.",
750 wxPoint(180,10), wxSize(240,70), wxTE_MULTILINE
);
751 m_multitext
->SetFont(*wxITALIC_FONT
);
752 (*m_multitext
) << " Appended.";
753 m_multitext
->SetInsertionPoint(0);
754 m_multitext
->WriteText( "Prepended. " );
755 m_multitext
->SetForegroundColour(*wxRED
);
756 m_multitext
->SetBackgroundColour(*wxLIGHT_GREY
);
759 m_multitext
->SetToolTip("Press F1 here for statitics, F4 for capture and uncapture mouse.");
762 m_tab
= new MyTextCtrl( this, 100, "Multiline, allow <TAB> processing.",
763 wxPoint(180,90), wxSize(240,70), wxTE_MULTILINE
| wxTE_PROCESS_TAB
);
764 m_tab
->SetClientData((void *)_T("tab"));
766 m_enter
= new MyTextCtrl( this, 100, "Multiline, allow <ENTER> processing.",
767 wxPoint(180,170), wxSize(240,70), wxTE_MULTILINE
);
768 m_enter
->SetClientData((void *)_T("enter"));
770 m_textrich
= new MyTextCtrl(this, -1, "Allows more than 30Kb of text\n"
771 "(even under broken Win9x)\n"
772 "and a very very very very very "
773 "very very very long line to test "
775 wxPoint(450, 10), wxSize(230, 230),
782 m_textrich
->SetStyle(0, 10, *wxRED
);
783 m_textrich
->SetStyle(10, 20, *wxBLUE
);
784 m_textrich
->SetStyle(30, 40,
785 wxTextAttr(*wxGREEN
, wxNullColour
, *wxITALIC_FONT
));
786 m_textrich
->SetDefaultStyle(wxTextAttr());
787 m_textrich
->AppendText(_T("\n\nFirst 10 characters should be in red\n"));
788 m_textrich
->AppendText(_T("Next 10 characters should be in blue\n"));
789 m_textrich
->AppendText(_T("Next 10 characters should be normal\n"));
790 m_textrich
->AppendText(_T("And the next 10 characters should be green and italic\n"));
791 m_textrich
->SetDefaultStyle(wxTextAttr(*wxCYAN
, *wxBLUE
));
792 m_textrich
->AppendText(_T("This text should be cyan on blue\n"));
793 m_textrich
->SetDefaultStyle(*wxBLUE
);
794 m_textrich
->AppendText(_T("And this should be in blue and the text you ")
795 _T("type should be in blue as well"));
797 m_textrich
->SetFont(wxFont(12, wxFONTFAMILY_TELETYPE
,
798 wxFONTSTYLE_NORMAL
, wxFONTWEIGHT_NORMAL
));
799 m_textrich
->SetDefaultStyle(wxTextAttr(*wxRED
));
800 m_textrich
->AppendText(_T("Red text\n"));
801 m_textrich
->SetDefaultStyle(wxTextAttr(wxNullColour
, *wxLIGHT_GREY
));
802 m_textrich
->AppendText(_T("Red on grey text\n"));
803 m_textrich
->SetDefaultStyle(wxTextAttr(*wxBLUE
));
804 m_textrich
->AppendText(_T("Blue on grey text\n"));
808 void MyPanel::OnSize( wxSizeEvent
&event
)
810 wxSize
client_area( GetClientSize() );
811 m_log
->SetSize( 0, 260, client_area
.x
, client_area
.y
- 260 );
816 void MyPanel::DoPasteFromClipboard()
818 // On X11, we want to get the data from the primary selection instead
819 // of the normal clipboard (which isn't normal under X11 at all). This
820 // call has no effect under MSW.
821 wxTheClipboard
->UsePrimarySelection();
823 if (!wxTheClipboard
->Open())
825 *m_log
<< "Error opening the clipboard.\n";
830 *m_log
<< "Successfully opened the clipboard.\n";
833 wxTextDataObject data
;
835 if (wxTheClipboard
->IsSupported( data
.GetFormat() ))
837 *m_log
<< "Clipboard supports requested format.\n";
839 if (wxTheClipboard
->GetData( data
))
841 *m_log
<< "Successfully retrieved data from the clipboard.\n";
842 *m_multitext
<< data
.GetText() << "\n";
846 *m_log
<< "Error getting data from the clipboard.\n";
851 *m_log
<< "Clipboard doesn't support requested format.\n";
854 wxTheClipboard
->Close();
856 *m_log
<< "Closed the clipboard.\n";
859 void MyPanel::DoCopyToClipboard()
861 // On X11, we want to get the data from the primary selection instead
862 // of the normal clipboard (which isn't normal under X11 at all). This
863 // call has no effect under MSW.
864 wxTheClipboard
->UsePrimarySelection();
866 wxString
text( m_multitext
->GetLineText(0) );
870 *m_log
<< "No text to copy.\n";
875 if (!wxTheClipboard
->Open())
877 *m_log
<< "Error opening the clipboard.\n";
883 *m_log
<< "Successfully opened the clipboard.\n";
886 wxTextDataObject
*data
= new wxTextDataObject( text
);
888 if (!wxTheClipboard
->SetData( data
))
890 *m_log
<< "Error while copying to the clipboard.\n";
894 *m_log
<< "Successfully copied data to the clipboard.\n";
897 wxTheClipboard
->Close();
899 *m_log
<< "Closed the clipboard.\n";
902 #endif // wxUSE_CLIPBOARD
904 void MyPanel::DoMoveToEndOfText()
906 m_multitext
->SetInsertionPointEnd();
907 m_multitext
->SetFocus();
910 void MyPanel::DoMoveToEndOfEntry()
912 m_text
->SetInsertionPointEnd();
916 //----------------------------------------------------------------------
918 //----------------------------------------------------------------------
920 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
921 EVT_MENU(TEXT_QUIT
, MyFrame::OnQuit
)
922 EVT_MENU(TEXT_ABOUT
, MyFrame::OnAbout
)
923 EVT_MENU(TEXT_SAVE
, MyFrame::OnFileSave
)
924 EVT_MENU(TEXT_LOAD
, MyFrame::OnFileLoad
)
926 EVT_MENU(TEXT_LOG_KEY
, MyFrame::OnLogKey
)
927 EVT_MENU(TEXT_LOG_CHAR
, MyFrame::OnLogChar
)
928 EVT_MENU(TEXT_LOG_MOUSE
, MyFrame::OnLogMouse
)
929 EVT_MENU(TEXT_CLEAR
, MyFrame::OnLogClear
)
932 EVT_MENU(TEXT_TOOLTIPS_SETDELAY
, MyFrame::OnSetTooltipDelay
)
933 EVT_MENU(TEXT_TOOLTIPS_ENABLE
, MyFrame::OnToggleTooltips
)
934 #endif // wxUSE_TOOLTIPS
937 EVT_MENU(TEXT_CLIPBOARD_PASTE
, MyFrame::OnPasteFromClipboard
)
938 EVT_MENU(TEXT_CLIPBOARD_COPY
, MyFrame::OnCopyToClipboard
)
939 #endif // wxUSE_CLIPBOARD
941 EVT_MENU(TEXT_ADD_SOME
, MyFrame::OnAddText
)
942 EVT_MENU(TEXT_ADD_FREEZE
, MyFrame::OnAddTextFreeze
)
943 EVT_MENU(TEXT_MOVE_ENDTEXT
, MyFrame::OnMoveToEndOfText
)
944 EVT_MENU(TEXT_MOVE_ENDENTRY
, MyFrame::OnMoveToEndOfEntry
)
946 EVT_MENU(TEXT_SET_EDITABLE
, MyFrame::OnSetEditable
)
947 EVT_MENU(TEXT_SET_ENABLED
, MyFrame::OnSetEnabled
)
949 EVT_MENU(TEXT_LINE_DOWN
, MyFrame::OnScrollLineDown
)
950 EVT_MENU(TEXT_LINE_UP
, MyFrame::OnScrollLineUp
)
951 EVT_MENU(TEXT_PAGE_DOWN
, MyFrame::OnScrollPageDown
)
952 EVT_MENU(TEXT_PAGE_UP
, MyFrame::OnScrollPageUp
)
954 EVT_IDLE(MyFrame::OnIdle
)
957 MyFrame::MyFrame(wxFrame
*frame
, const char *title
, int x
, int y
, int w
, int h
)
958 : wxFrame(frame
, -1, title
, wxPoint(x
, y
), wxSize(w
, h
) )
962 m_panel
= new MyPanel( this, 10, 10, 300, 100 );
965 void MyFrame::OnQuit (wxCommandEvent
& WXUNUSED(event
) )
970 void MyFrame::OnAbout( wxCommandEvent
& WXUNUSED(event
) )
974 wxMessageDialog
dialog(this,
975 "This is a text control sample. It demonstrates the many different\n"
976 "text control styles, the use of the clipboard, setting and handling\n"
977 "tooltips and intercepting key and char events.\n"
979 "Copyright (c) 1999, Robert Roebling, Julian Smart, Vadim Zeitlin",
980 "About wxTextCtrl Sample",
981 wxOK
| wxICON_INFORMATION
);
989 void MyFrame::OnSetTooltipDelay(wxCommandEvent
& event
)
991 static long s_delay
= 5000;
994 delay
.Printf( _T("%ld"), s_delay
);
996 delay
= wxGetTextFromUser("Enter delay (in milliseconds)",
1001 return; // cancelled
1003 wxSscanf(delay
, _T("%ld"), &s_delay
);
1005 wxToolTip::SetDelay(s_delay
);
1007 wxLogStatus(this, _T("Tooltip delay set to %ld milliseconds"), s_delay
);
1010 void MyFrame::OnToggleTooltips(wxCommandEvent
& event
)
1012 static bool s_enabled
= TRUE
;
1014 s_enabled
= !s_enabled
;
1016 wxToolTip::Enable(s_enabled
);
1018 wxLogStatus(this, _T("Tooltips %sabled"), s_enabled
? _T("en") : _T("dis") );
1022 void MyFrame::OnLogClear(wxCommandEvent
& WXUNUSED(event
))
1024 m_panel
->m_log
->Clear();
1027 void MyFrame::OnSetEditable(wxCommandEvent
& WXUNUSED(event
))
1029 static bool s_editable
= TRUE
;
1031 s_editable
= !s_editable
;
1032 m_panel
->m_text
->SetEditable(s_editable
);
1033 m_panel
->m_password
->SetEditable(s_editable
);
1034 m_panel
->m_multitext
->SetEditable(s_editable
);
1035 m_panel
->m_textrich
->SetEditable(s_editable
);
1038 void MyFrame::OnSetEnabled(wxCommandEvent
& WXUNUSED(event
))
1040 bool enabled
= m_panel
->m_text
->IsEnabled();
1043 m_panel
->m_text
->Enable(enabled
);
1044 m_panel
->m_password
->Enable(enabled
);
1045 m_panel
->m_multitext
->Enable(enabled
);
1046 m_panel
->m_readonly
->Enable(enabled
);
1047 m_panel
->m_limited
->Enable(enabled
);
1048 m_panel
->m_textrich
->Enable(enabled
);
1051 void MyFrame::OnFileSave(wxCommandEvent
& event
)
1053 if ( m_panel
->m_textrich
->SaveFile("dummy.txt") )
1056 // verify that the fil length is correct (it wasn't under Win95)
1057 wxFile
file(wxT("dummy.txt"));
1058 wxLogStatus(this, _T("Successfully saved file (text len = %ld, file size = %ld)"),
1059 m_panel
->m_textrich
->GetValue().length(),
1064 wxLogStatus(this, _T("Couldn't save the file"));
1067 void MyFrame::OnFileLoad(wxCommandEvent
& event
)
1069 if ( m_panel
->m_textrich
->LoadFile("dummy.txt") )
1070 wxLogStatus(this, _T("Successfully loaded file"));
1072 wxLogStatus(this, _T("Couldn't load the file"));
1075 void MyFrame::OnIdle( wxIdleEvent
& event
)
1077 // track the window which has the focus in the status bar
1078 static wxWindow
*s_windowFocus
= (wxWindow
*)NULL
;
1079 wxWindow
*focus
= wxWindow::FindFocus();
1080 if ( focus
&& (focus
!= s_windowFocus
) )
1082 s_windowFocus
= focus
;
1087 _T("Focus: wxWindow = %p, HWND = %08x"),
1089 _T("Focus: wxWindow = %p"),
1093 , s_windowFocus
->GetHWND()