]>
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
) { m_hasCapture
= FALSE
; }
66 void OnKeyDown(wxKeyEvent
& event
);
67 void OnKeyUp(wxKeyEvent
& event
);
68 void OnChar(wxKeyEvent
& event
);
70 void OnText(wxCommandEvent
& event
);
71 void OnTextURL(wxTextUrlEvent
& event
);
72 void OnTextMaxLen(wxCommandEvent
& event
);
74 void OnMouseEvent(wxMouseEvent
& event
);
79 static inline wxChar
GetChar(bool on
, wxChar c
) { return on
? c
: _T('-'); }
80 void LogEvent(const wxChar
*name
, wxKeyEvent
& event
) const;
85 class MyPanel
: public wxPanel
88 MyPanel(wxFrame
*frame
, int x
, int y
, int w
, int h
);
91 void DoPasteFromClipboard();
92 void DoCopyToClipboard();
93 #endif // wxUSE_CLIPBOARD
95 void DoMoveToEndOfText();
96 void DoMoveToEndOfEntry();
98 void OnSize( wxSizeEvent
&event
);
101 MyTextCtrl
*m_password
;
104 MyTextCtrl
*m_readonly
;
105 MyTextCtrl
*m_limited
;
107 MyTextCtrl
*m_multitext
;
108 MyTextCtrl
*m_horizontal
;
110 MyTextCtrl
*m_textrich
;
115 DECLARE_EVENT_TABLE()
118 class MyFrame
: public wxFrame
121 MyFrame(wxFrame
*frame
, const char *title
, int x
, int y
, int w
, int h
);
123 void OnQuit(wxCommandEvent
& event
);
124 void OnAbout(wxCommandEvent
& event
);
126 void OnSetTooltipDelay(wxCommandEvent
& event
);
127 void OnToggleTooltips(wxCommandEvent
& event
);
128 #endif // wxUSE_TOOLTIPS
131 void OnPasteFromClipboard( wxCommandEvent
&event
)
132 { m_panel
->DoPasteFromClipboard(); }
133 void OnCopyToClipboard( wxCommandEvent
&event
)
134 { m_panel
->DoCopyToClipboard(); }
135 #endif // wxUSE_CLIPBOARD
137 void OnAddTextFreeze( wxCommandEvent
& event
)
139 void OnAddText( wxCommandEvent
& event
)
140 { DoAddText(false); }
142 void OnMoveToEndOfText( wxCommandEvent
&event
)
143 { m_panel
->DoMoveToEndOfText(); }
144 void OnMoveToEndOfEntry( wxCommandEvent
&event
)
145 { m_panel
->DoMoveToEndOfEntry(); }
147 void OnScrollLineDown(wxCommandEvent
& event
)
149 if ( !m_panel
->m_textrich
->LineDown() )
150 wxLogMessage(_T("Already at the bottom"));
153 void OnScrollLineUp(wxCommandEvent
& event
)
155 if ( !m_panel
->m_textrich
->LineUp() )
156 wxLogMessage(_T("Already at the top"));
159 void OnScrollPageDown(wxCommandEvent
& event
)
161 if ( !m_panel
->m_textrich
->PageDown() )
162 wxLogMessage(_T("Already at the bottom"));
165 void OnScrollPageUp(wxCommandEvent
& event
)
167 if ( !m_panel
->m_textrich
->PageUp() )
168 wxLogMessage(_T("Already at the top"));
171 void OnLogClear(wxCommandEvent
& event
);
172 void OnFileSave(wxCommandEvent
& event
);
173 void OnFileLoad(wxCommandEvent
& event
);
175 void OnSetEditable(wxCommandEvent
& event
);
176 void OnSetEnabled(wxCommandEvent
& event
);
178 void OnIdle( wxIdleEvent
& event
);
181 void DoAddText(bool freeze
)
183 wxTextCtrl
*text
= m_panel
->m_textrich
;
187 for ( int i
= 0; i
< 100; i
++ )
188 text
->AppendText(wxString::Format("Line %i\n", i
));
190 text
->SetInsertionPoint(0);
198 DECLARE_EVENT_TABLE()
201 //----------------------------------------------------------------------
203 //----------------------------------------------------------------------
207 //----------------------------------------------------------------------
209 //----------------------------------------------------------------------
220 TEXT_CLIPBOARD_COPY
= 200,
221 TEXT_CLIPBOARD_PASTE
,
224 TEXT_TOOLTIPS_SETDELAY
= 300,
225 TEXT_TOOLTIPS_ENABLE
,
242 // Create the main frame window
243 MyFrame
*frame
= new MyFrame((wxFrame
*) NULL
,
244 "Text wxWindows sample", 50, 50, 700, 420);
245 frame
->SetSizeHints( 500, 400 );
247 wxMenu
*file_menu
= new wxMenu
;
248 file_menu
->Append(TEXT_CLEAR
, "&Clear the log\tCtrl-C",
249 "Clear the log window contents");
250 file_menu
->Append(TEXT_SAVE
, "&Save file\tCtrl-S",
251 "Save the text control contents to file");
252 file_menu
->Append(TEXT_LOAD
, "&Load file\tCtrl-O",
253 "Load the sample file into text control");
254 file_menu
->AppendSeparator();
255 file_menu
->Append(TEXT_ABOUT
, "&About\tAlt-A");
256 file_menu
->AppendSeparator();
257 file_menu
->Append(TEXT_QUIT
, "E&xit\tAlt-X", "Quit this sample");
259 wxMenuBar
*menu_bar
= new wxMenuBar( wxMB_DOCKABLE
);
260 menu_bar
->Append(file_menu
, "&File");
263 wxMenu
*tooltip_menu
= new wxMenu
;
264 tooltip_menu
->Append(TEXT_TOOLTIPS_SETDELAY
, "Set &delay\tCtrl-D");
265 tooltip_menu
->AppendSeparator();
266 tooltip_menu
->Append(TEXT_TOOLTIPS_ENABLE
, "&Toggle tooltips\tCtrl-T",
267 "enable/disable tooltips", TRUE
);
268 tooltip_menu
->Check(TEXT_TOOLTIPS_ENABLE
, TRUE
);
269 menu_bar
->Append(tooltip_menu
, "&Tooltips");
270 #endif // wxUSE_TOOLTIPS
273 wxMenu
*menuClipboard
= new wxMenu
;
274 menuClipboard
->Append(TEXT_CLIPBOARD_COPY
, "&Copy\tCtrl-C",
275 "Copy the first line to the clipboard");
276 menuClipboard
->Append(TEXT_CLIPBOARD_PASTE
, "&Paste\tCtrl-V",
277 "Paste from clipboard to the text control");
278 menu_bar
->Append(menuClipboard
, "&Clipboard");
279 #endif // wxUSE_CLIPBOARD
281 wxMenu
*menuText
= new wxMenu
;
282 menuText
->Append(TEXT_ADD_SOME
, "&Append some text\tCtrl-A");
283 menuText
->Append(TEXT_ADD_FREEZE
, "&Append text with freeze/thaw\tShift-Ctrl-A");
284 menuText
->Append(TEXT_MOVE_ENDTEXT
, "Move cursor to the end of &text");
285 menuText
->Append(TEXT_MOVE_ENDENTRY
, "Move cursor to the end of &entry");
286 menuText
->Append(TEXT_SET_EDITABLE
, "Toggle &editable state", "", TRUE
);
287 menuText
->Append(TEXT_SET_ENABLED
, "Toggle e&nabled state", "", TRUE
);
288 menuText
->Check(TEXT_SET_EDITABLE
, TRUE
);
289 menuText
->Check(TEXT_SET_ENABLED
, TRUE
);
290 menuText
->AppendSeparator();
291 menuText
->Append(TEXT_LINE_DOWN
, "Scroll text one line down");
292 menuText
->Append(TEXT_LINE_UP
, "Scroll text one line up");
293 menuText
->Append(TEXT_PAGE_DOWN
, "Scroll text one page down");
294 menuText
->Append(TEXT_PAGE_DOWN
, "Scroll text one page up");
295 menu_bar
->Append(menuText
, "&Text");
297 frame
->SetMenuBar(menu_bar
);
307 //----------------------------------------------------------------------
309 //----------------------------------------------------------------------
311 BEGIN_EVENT_TABLE(MyTextCtrl
, wxTextCtrl
)
312 EVT_KEY_DOWN(MyTextCtrl::OnKeyDown
)
313 EVT_KEY_UP(MyTextCtrl::OnKeyUp
)
314 EVT_CHAR(MyTextCtrl::OnChar
)
316 EVT_TEXT(-1, MyTextCtrl::OnText
)
317 EVT_TEXT_URL(-1, MyTextCtrl::OnTextURL
)
318 EVT_TEXT_MAXLEN(-1, MyTextCtrl::OnTextMaxLen
)
320 EVT_MOUSE_EVENTS(MyTextCtrl::OnMouseEvent
)
323 void MyTextCtrl::LogEvent(const wxChar
*name
, wxKeyEvent
& event
) const
326 long keycode
= event
.KeyCode();
330 case WXK_BACK
: key
= "BACK"; break;
331 case WXK_TAB
: key
= "TAB"; break;
332 case WXK_RETURN
: key
= "RETURN"; break;
333 case WXK_ESCAPE
: key
= "ESCAPE"; break;
334 case WXK_SPACE
: key
= "SPACE"; break;
335 case WXK_DELETE
: key
= "DELETE"; break;
336 case WXK_START
: key
= "START"; break;
337 case WXK_LBUTTON
: key
= "LBUTTON"; break;
338 case WXK_RBUTTON
: key
= "RBUTTON"; break;
339 case WXK_CANCEL
: key
= "CANCEL"; break;
340 case WXK_MBUTTON
: key
= "MBUTTON"; break;
341 case WXK_CLEAR
: key
= "CLEAR"; break;
342 case WXK_SHIFT
: key
= "SHIFT"; break;
343 case WXK_ALT
: key
= "ALT"; break;
344 case WXK_CONTROL
: key
= "CONTROL"; break;
345 case WXK_MENU
: key
= "MENU"; break;
346 case WXK_PAUSE
: key
= "PAUSE"; break;
347 case WXK_CAPITAL
: key
= "CAPITAL"; break;
348 case WXK_PRIOR
: key
= "PRIOR"; break;
349 case WXK_NEXT
: key
= "NEXT"; break;
350 case WXK_END
: key
= "END"; break;
351 case WXK_HOME
: key
= "HOME"; break;
352 case WXK_LEFT
: key
= "LEFT"; break;
353 case WXK_UP
: key
= "UP"; break;
354 case WXK_RIGHT
: key
= "RIGHT"; break;
355 case WXK_DOWN
: key
= "DOWN"; break;
356 case WXK_SELECT
: key
= "SELECT"; break;
357 case WXK_PRINT
: key
= "PRINT"; break;
358 case WXK_EXECUTE
: key
= "EXECUTE"; break;
359 case WXK_SNAPSHOT
: key
= "SNAPSHOT"; break;
360 case WXK_INSERT
: key
= "INSERT"; break;
361 case WXK_HELP
: key
= "HELP"; break;
362 case WXK_NUMPAD0
: key
= "NUMPAD0"; break;
363 case WXK_NUMPAD1
: key
= "NUMPAD1"; break;
364 case WXK_NUMPAD2
: key
= "NUMPAD2"; break;
365 case WXK_NUMPAD3
: key
= "NUMPAD3"; break;
366 case WXK_NUMPAD4
: key
= "NUMPAD4"; break;
367 case WXK_NUMPAD5
: key
= "NUMPAD5"; break;
368 case WXK_NUMPAD6
: key
= "NUMPAD6"; break;
369 case WXK_NUMPAD7
: key
= "NUMPAD7"; break;
370 case WXK_NUMPAD8
: key
= "NUMPAD8"; break;
371 case WXK_NUMPAD9
: key
= "NUMPAD9"; break;
372 case WXK_MULTIPLY
: key
= "MULTIPLY"; break;
373 case WXK_ADD
: key
= "ADD"; break;
374 case WXK_SEPARATOR
: key
= "SEPARATOR"; break;
375 case WXK_SUBTRACT
: key
= "SUBTRACT"; break;
376 case WXK_DECIMAL
: key
= "DECIMAL"; break;
377 case WXK_DIVIDE
: key
= "DIVIDE"; break;
378 case WXK_F1
: key
= "F1"; break;
379 case WXK_F2
: key
= "F2"; break;
380 case WXK_F3
: key
= "F3"; break;
381 case WXK_F4
: key
= "F4"; break;
382 case WXK_F5
: key
= "F5"; break;
383 case WXK_F6
: key
= "F6"; break;
384 case WXK_F7
: key
= "F7"; break;
385 case WXK_F8
: key
= "F8"; break;
386 case WXK_F9
: key
= "F9"; break;
387 case WXK_F10
: key
= "F10"; break;
388 case WXK_F11
: key
= "F11"; break;
389 case WXK_F12
: key
= "F12"; break;
390 case WXK_F13
: key
= "F13"; break;
391 case WXK_F14
: key
= "F14"; break;
392 case WXK_F15
: key
= "F15"; break;
393 case WXK_F16
: key
= "F16"; break;
394 case WXK_F17
: key
= "F17"; break;
395 case WXK_F18
: key
= "F18"; break;
396 case WXK_F19
: key
= "F19"; break;
397 case WXK_F20
: key
= "F20"; break;
398 case WXK_F21
: key
= "F21"; break;
399 case WXK_F22
: key
= "F22"; break;
400 case WXK_F23
: key
= "F23"; break;
401 case WXK_F24
: key
= "F24"; break;
402 case WXK_NUMLOCK
: key
= "NUMLOCK"; break;
403 case WXK_SCROLL
: key
= "SCROLL"; break;
404 case WXK_PAGEUP
: key
= "PAGEUP"; break;
405 case WXK_PAGEDOWN
: key
= "PAGEDOWN"; break;
406 case WXK_NUMPAD_SPACE
: key
= "NUMPAD_SPACE"; break;
407 case WXK_NUMPAD_TAB
: key
= "NUMPAD_TAB"; break;
408 case WXK_NUMPAD_ENTER
: key
= "NUMPAD_ENTER"; break;
409 case WXK_NUMPAD_F1
: key
= "NUMPAD_F1"; break;
410 case WXK_NUMPAD_F2
: key
= "NUMPAD_F2"; break;
411 case WXK_NUMPAD_F3
: key
= "NUMPAD_F3"; break;
412 case WXK_NUMPAD_F4
: key
= "NUMPAD_F4"; break;
413 case WXK_NUMPAD_HOME
: key
= "NUMPAD_HOME"; break;
414 case WXK_NUMPAD_LEFT
: key
= "NUMPAD_LEFT"; break;
415 case WXK_NUMPAD_UP
: key
= "NUMPAD_UP"; break;
416 case WXK_NUMPAD_RIGHT
: key
= "NUMPAD_RIGHT"; break;
417 case WXK_NUMPAD_DOWN
: key
= "NUMPAD_DOWN"; break;
418 case WXK_NUMPAD_PRIOR
: key
= "NUMPAD_PRIOR"; break;
419 case WXK_NUMPAD_PAGEUP
: key
= "NUMPAD_PAGEUP"; break;
420 case WXK_NUMPAD_PAGEDOWN
: key
= "NUMPAD_PAGEDOWN"; break;
421 case WXK_NUMPAD_END
: key
= "NUMPAD_END"; break;
422 case WXK_NUMPAD_BEGIN
: key
= "NUMPAD_BEGIN"; break;
423 case WXK_NUMPAD_INSERT
: key
= "NUMPAD_INSERT"; break;
424 case WXK_NUMPAD_DELETE
: key
= "NUMPAD_DELETE"; break;
425 case WXK_NUMPAD_EQUAL
: key
= "NUMPAD_EQUAL"; break;
426 case WXK_NUMPAD_MULTIPLY
: key
= "NUMPAD_MULTIPLY"; break;
427 case WXK_NUMPAD_ADD
: key
= "NUMPAD_ADD"; break;
428 case WXK_NUMPAD_SEPARATOR
: key
= "NUMPAD_SEPARATOR"; break;
429 case WXK_NUMPAD_SUBTRACT
: key
= "NUMPAD_SUBTRACT"; break;
430 case WXK_NUMPAD_DECIMAL
: key
= "NUMPAD_DECIMAL"; break;
434 if ( wxIsprint((int)keycode
) )
435 key
.Printf( _T("'%c'") , (char)keycode
);
437 key
.Printf( _T("unknown (%ld)"), keycode
);
442 wxLogMessage( _T("%s event: %s (flags = %c%c%c%c)"),
445 GetChar( event
.ControlDown(), _T('C') ),
446 GetChar( event
.AltDown(), _T('A') ),
447 GetChar( event
.ShiftDown(), _T('S') ),
448 GetChar( event
.MetaDown(), _T('M') ) );
451 static wxString
GetMouseEventDesc(const wxMouseEvent
& ev
)
456 if ( ev
.LeftDown() || ev
.LeftUp() || ev
.LeftDClick() )
459 dbl
= ev
.LeftDClick();
462 else if ( ev
.MiddleDown() || ev
.MiddleUp() || ev
.MiddleDClick() )
464 button
= _T("Middle");
465 dbl
= ev
.MiddleDClick();
468 else if ( ev
.RightDown() || ev
.RightUp() || ev
.RightDClick() )
470 button
= _T("Right");
471 dbl
= ev
.RightDClick();
476 return _T("Unknown mouse event");
479 return wxString::Format(_T("%s mouse button %s"),
481 dbl
? _T("double clicked")
482 : up
? _T("released") : _T("clicked"));
485 void MyTextCtrl::OnMouseEvent(wxMouseEvent
& ev
)
492 msg
= _T("Mouse entered the window");
494 else if ( ev
.Leaving() )
496 msg
= _T("Mouse left the window");
500 msg
= GetMouseEventDesc(ev
);
503 msg
<< _T(" at (") << ev
.GetX() << _T(", ") << ev
.GetY() << _T(") ")
505 << GetChar( ev
.LeftIsDown(), _T('1') )
506 << GetChar( ev
.MiddleIsDown(), _T('2') )
507 << GetChar( ev
.RightIsDown(), _T('3') )
508 << GetChar( ev
.ControlDown(), _T('C') )
509 << GetChar( ev
.AltDown(), _T('A') )
510 << GetChar( ev
.ShiftDown(), _T('S') )
511 << GetChar( ev
.MetaDown(), _T('M') );
515 //else: we're not interested in mouse move events
520 void MyTextCtrl::OnText(wxCommandEvent
& event
)
522 MyTextCtrl
*win
= (MyTextCtrl
*)event
.GetEventObject();
523 const wxChar
*data
= (const wxChar
*)(win
->GetClientData());
526 wxLogMessage(_T("Text changed in control '%s'"), data
);
530 wxLogMessage(_T("Text changed in some control"));
534 void MyTextCtrl::OnTextMaxLen(wxCommandEvent
& event
)
536 wxLogMessage(_T("You can't enter more characters into this control."));
539 void MyTextCtrl::OnTextURL(wxTextUrlEvent
& event
)
541 const wxMouseEvent
& ev
= event
.GetMouseEvent();
543 // filter out mouse moves, too many of them
547 long start
= event
.GetURLStart(),
548 end
= event
.GetURLEnd();
550 wxLogMessage(_T("Mouse event over URL '%s': %s"),
551 GetValue().Mid(start
, end
- start
).c_str(),
552 GetMouseEventDesc(ev
).c_str());
555 void MyTextCtrl::OnChar(wxKeyEvent
& event
)
557 LogEvent( _T("Char"), event
);
559 /* How are we supposed to test wxTE_PROCESS_TAB with this code?
561 if ( event.KeyCode() == WXK_TAB )
573 void MyTextCtrl::OnKeyUp(wxKeyEvent
& event
)
575 LogEvent( _T("Key up"), event
);
580 void MyTextCtrl::OnKeyDown(wxKeyEvent
& event
)
582 switch ( event
.KeyCode() )
585 // show current position and text length
587 long line
, column
, pos
= GetInsertionPoint();
588 PositionToXY(pos
, &column
, &line
);
590 wxLogMessage( _T("Current position: %ld\n"
591 "Current line, column: (%ld, %ld)\n"
592 "Number of lines: %ld\n"
593 "Current line length: %ld\n"
594 "Total text length: %u (%ld)"),
606 SetInsertionPointEnd();
611 SetInsertionPoint(10);
617 wxLogDebug( wxT("Now capturing mouse and events.") );
623 wxLogDebug( wxT("Stopped capturing mouse and events.") );
630 // insert a blank line
635 SetValue("F6 was just pressed.");
643 LogEvent( wxT("Key down"), event
);
648 //----------------------------------------------------------------------
650 //----------------------------------------------------------------------
652 BEGIN_EVENT_TABLE(MyPanel
, wxPanel
)
653 EVT_SIZE(MyPanel::OnSize
)
656 MyPanel::MyPanel( wxFrame
*frame
, int x
, int y
, int w
, int h
)
657 : wxPanel( frame
, -1, wxPoint(x
, y
), wxSize(w
, h
) )
659 m_log
= new wxTextCtrl( this, -1, "This is the log window.\n", wxPoint(5,260), wxSize(630,100), wxTE_MULTILINE
);
661 wxLog
*old_log
= wxLog::SetActiveTarget( new wxLogTextCtrl( m_log
) );
665 // single line text controls
667 m_text
= new MyTextCtrl( this, -1, "Single line.",
668 wxPoint(10,10), wxSize(140,-1),
670 m_text
->SetForegroundColour(*wxBLUE
);
671 m_text
->SetBackgroundColour(*wxLIGHT_GREY
);
672 (*m_text
) << " Appended.";
673 m_text
->SetInsertionPoint(0);
674 m_text
->WriteText( "Prepended. " );
676 m_password
= new MyTextCtrl( this, -1, "",
677 wxPoint(10,50), wxSize(140,-1), wxTE_PASSWORD
);
679 m_readonly
= new MyTextCtrl( this, -1, "Read only",
680 wxPoint(10,90), wxSize(140,-1), wxTE_READONLY
);
682 m_limited
= new MyTextCtrl(this, -1, "Max 8 ch",
683 wxPoint(10, 130), wxSize(140, -1));
684 m_limited
->SetMaxLength(8);
686 // multi line text controls
688 m_horizontal
= new MyTextCtrl( this, -1, "Multiline text control with a horizontal scrollbar.",
689 wxPoint(10,170), wxSize(140,70), wxTE_MULTILINE
| wxHSCROLL
);
691 // a little hack to use the command line argument for encoding testing
692 if ( wxTheApp
->argc
== 2 )
694 switch ( wxTheApp
->argv
[1][0] )
697 m_horizontal
->SetFont(wxFont(18, wxSWISS
, wxNORMAL
, wxNORMAL
,
699 wxFONTENCODING_ISO8859_2
));
700 m_horizontal
->SetValue("®lu»ouèký kùò zbìsile èe¹tina «»");
704 m_horizontal
->SetFont(wxFont(18, wxSWISS
, wxNORMAL
, wxNORMAL
,
706 wxFONTENCODING_KOI8
));
707 m_horizontal
->SetValue("ËÁÖÅÔÓÑ ÕÄÁÞÎÙÍ");
712 m_horizontal
->SetValue("Text in default encoding");
715 m_multitext
= new MyTextCtrl( this, -1, "Multi line.",
716 wxPoint(180,10), wxSize(240,70), wxTE_MULTILINE
);
717 m_multitext
->SetFont(*wxITALIC_FONT
);
718 (*m_multitext
) << " Appended.";
719 m_multitext
->SetInsertionPoint(0);
720 m_multitext
->WriteText( "Prepended. " );
721 m_multitext
->SetForegroundColour(*wxRED
);
722 m_multitext
->SetBackgroundColour(*wxLIGHT_GREY
);
725 m_multitext
->SetToolTip("Press F1 here for statitics, F4 for capture and uncapture mouse.");
728 m_tab
= new MyTextCtrl( this, 100, "Multiline, allow <TAB> processing.",
729 wxPoint(180,90), wxSize(240,70), wxTE_MULTILINE
| wxTE_PROCESS_TAB
);
730 m_tab
->SetClientData((void *)_T("tab"));
732 m_enter
= new MyTextCtrl( this, 100, "Multiline, allow <ENTER> processing.",
733 wxPoint(180,170), wxSize(240,70), wxTE_MULTILINE
);
734 m_enter
->SetClientData((void *)_T("enter"));
736 m_textrich
= new MyTextCtrl(this, -1, "Allows more than 30Kb of text\n"
737 "(even under broken Win9x)\n"
738 "and a very very very very very "
739 "very very very long line to test "
741 wxPoint(450, 10), wxSize(230, 230),
748 m_textrich
->SetFont(wxFont(12, wxFONTFAMILY_TELETYPE
,
749 wxFONTSTYLE_NORMAL
, wxFONTWEIGHT_NORMAL
));
750 m_textrich
->SetStyle(0, 10, *wxRED
);
751 m_textrich
->SetStyle(10, 20, *wxBLUE
);
752 m_textrich
->SetStyle(30, 40,
753 wxTextAttr(*wxGREEN
, wxNullColour
, *wxITALIC_FONT
));
754 m_textrich
->SetDefaultStyle(wxTextAttr());
755 m_textrich
->AppendText(_T("\n\nFirst 10 characters should be in red\n"));
756 m_textrich
->AppendText(_T("Next 10 characters should be in blue\n"));
757 m_textrich
->AppendText(_T("Next 10 characters should be normal\n"));
758 m_textrich
->AppendText(_T("And the next 10 characters should be green and italic\n"));
759 m_textrich
->SetDefaultStyle(wxTextAttr(*wxCYAN
, *wxBLUE
));
760 m_textrich
->AppendText(_T("This text should be cyan on blue\n"));
761 m_textrich
->SetDefaultStyle(*wxBLUE
);
762 m_textrich
->AppendText(_T("And this should be in blue and the text you ")
763 _T("type should be in blue as well"));
765 m_textrich
->SetDefaultStyle(wxTextAttr(*wxRED
));
766 m_textrich
->AppendText(_T("Red text\n"));
767 m_textrich
->SetDefaultStyle(wxTextAttr(wxNullColour
, *wxLIGHT_GREY
));
768 m_textrich
->AppendText(_T("Red on grey text\n"));
769 m_textrich
->SetDefaultStyle(wxTextAttr(*wxBLUE
));
770 m_textrich
->AppendText(_T("Blue on grey text\n"));
774 void MyPanel::OnSize( wxSizeEvent
&event
)
776 wxSize
client_area( GetClientSize() );
777 m_log
->SetSize( 0, 260, client_area
.x
, client_area
.y
- 260 );
782 void MyPanel::DoPasteFromClipboard()
784 // On X11, we want to get the data from the primary selection instead
785 // of the normal clipboard (which isn't normal under X11 at all). This
786 // call has no effect under MSW.
787 wxTheClipboard
->UsePrimarySelection();
789 if (!wxTheClipboard
->Open())
791 *m_log
<< "Error opening the clipboard.\n";
796 *m_log
<< "Successfully opened the clipboard.\n";
799 wxTextDataObject data
;
801 if (wxTheClipboard
->IsSupported( data
.GetFormat() ))
803 *m_log
<< "Clipboard supports requested format.\n";
805 if (wxTheClipboard
->GetData( data
))
807 *m_log
<< "Successfully retrieved data from the clipboard.\n";
808 *m_multitext
<< data
.GetText() << "\n";
812 *m_log
<< "Error getting data from the clipboard.\n";
817 *m_log
<< "Clipboard doesn't support requested format.\n";
820 wxTheClipboard
->Close();
822 *m_log
<< "Closed the clipboard.\n";
825 void MyPanel::DoCopyToClipboard()
827 // On X11, we want to get the data from the primary selection instead
828 // of the normal clipboard (which isn't normal under X11 at all). This
829 // call has no effect under MSW.
830 wxTheClipboard
->UsePrimarySelection();
832 wxString
text( m_multitext
->GetLineText(0) );
836 *m_log
<< "No text to copy.\n";
841 if (!wxTheClipboard
->Open())
843 *m_log
<< "Error opening the clipboard.\n";
849 *m_log
<< "Successfully opened the clipboard.\n";
852 wxTextDataObject
*data
= new wxTextDataObject( text
);
854 if (!wxTheClipboard
->SetData( data
))
856 *m_log
<< "Error while copying to the clipboard.\n";
860 *m_log
<< "Successfully copied data to the clipboard.\n";
863 wxTheClipboard
->Close();
865 *m_log
<< "Closed the clipboard.\n";
868 #endif // wxUSE_CLIPBOARD
870 void MyPanel::DoMoveToEndOfText()
872 m_multitext
->SetInsertionPointEnd();
873 m_multitext
->SetFocus();
876 void MyPanel::DoMoveToEndOfEntry()
878 m_text
->SetInsertionPointEnd();
882 //----------------------------------------------------------------------
884 //----------------------------------------------------------------------
886 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
887 EVT_MENU(TEXT_QUIT
, MyFrame::OnQuit
)
888 EVT_MENU(TEXT_ABOUT
, MyFrame::OnAbout
)
889 EVT_MENU(TEXT_SAVE
, MyFrame::OnFileSave
)
890 EVT_MENU(TEXT_LOAD
, MyFrame::OnFileLoad
)
891 EVT_MENU(TEXT_CLEAR
, MyFrame::OnLogClear
)
894 EVT_MENU(TEXT_TOOLTIPS_SETDELAY
, MyFrame::OnSetTooltipDelay
)
895 EVT_MENU(TEXT_TOOLTIPS_ENABLE
, MyFrame::OnToggleTooltips
)
896 #endif // wxUSE_TOOLTIPS
899 EVT_MENU(TEXT_CLIPBOARD_PASTE
, MyFrame::OnPasteFromClipboard
)
900 EVT_MENU(TEXT_CLIPBOARD_COPY
, MyFrame::OnCopyToClipboard
)
901 #endif // wxUSE_CLIPBOARD
903 EVT_MENU(TEXT_ADD_SOME
, MyFrame::OnAddText
)
904 EVT_MENU(TEXT_ADD_FREEZE
, MyFrame::OnAddTextFreeze
)
905 EVT_MENU(TEXT_MOVE_ENDTEXT
, MyFrame::OnMoveToEndOfText
)
906 EVT_MENU(TEXT_MOVE_ENDENTRY
, MyFrame::OnMoveToEndOfEntry
)
908 EVT_MENU(TEXT_SET_EDITABLE
, MyFrame::OnSetEditable
)
909 EVT_MENU(TEXT_SET_ENABLED
, MyFrame::OnSetEnabled
)
911 EVT_MENU(TEXT_LINE_DOWN
, MyFrame::OnScrollLineDown
)
912 EVT_MENU(TEXT_LINE_UP
, MyFrame::OnScrollLineUp
)
913 EVT_MENU(TEXT_PAGE_DOWN
, MyFrame::OnScrollPageDown
)
914 EVT_MENU(TEXT_PAGE_UP
, MyFrame::OnScrollPageUp
)
916 EVT_IDLE(MyFrame::OnIdle
)
919 MyFrame::MyFrame(wxFrame
*frame
, const char *title
, int x
, int y
, int w
, int h
)
920 : wxFrame(frame
, -1, title
, wxPoint(x
, y
), wxSize(w
, h
) )
924 m_panel
= new MyPanel( this, 10, 10, 300, 100 );
927 void MyFrame::OnQuit (wxCommandEvent
& WXUNUSED(event
) )
932 void MyFrame::OnAbout( wxCommandEvent
& WXUNUSED(event
) )
936 wxMessageDialog
dialog(this,
937 "This is a text control sample. It demonstrates the many different\n"
938 "text control styles, the use of the clipboard, setting and handling\n"
939 "tooltips and intercepting key and char events.\n"
941 "Copyright (c) 1999, Robert Roebling, Julian Smart, Vadim Zeitlin",
942 "About wxTextCtrl Sample",
943 wxOK
| wxICON_INFORMATION
);
951 void MyFrame::OnSetTooltipDelay(wxCommandEvent
& event
)
953 static long s_delay
= 5000;
956 delay
.Printf( _T("%ld"), s_delay
);
958 delay
= wxGetTextFromUser("Enter delay (in milliseconds)",
965 wxSscanf(delay
, _T("%ld"), &s_delay
);
967 wxToolTip::SetDelay(s_delay
);
969 wxLogStatus(this, _T("Tooltip delay set to %ld milliseconds"), s_delay
);
972 void MyFrame::OnToggleTooltips(wxCommandEvent
& event
)
974 static bool s_enabled
= TRUE
;
976 s_enabled
= !s_enabled
;
978 wxToolTip::Enable(s_enabled
);
980 wxLogStatus(this, _T("Tooltips %sabled"), s_enabled
? _T("en") : _T("dis") );
984 void MyFrame::OnLogClear(wxCommandEvent
& WXUNUSED(event
))
986 m_panel
->m_log
->Clear();
989 void MyFrame::OnSetEditable(wxCommandEvent
& WXUNUSED(event
))
991 static bool s_editable
= TRUE
;
993 s_editable
= !s_editable
;
994 m_panel
->m_text
->SetEditable(s_editable
);
995 m_panel
->m_password
->SetEditable(s_editable
);
996 m_panel
->m_multitext
->SetEditable(s_editable
);
997 m_panel
->m_textrich
->SetEditable(s_editable
);
1000 void MyFrame::OnSetEnabled(wxCommandEvent
& WXUNUSED(event
))
1002 bool enabled
= m_panel
->m_text
->IsEnabled();
1005 m_panel
->m_text
->Enable(enabled
);
1006 m_panel
->m_password
->Enable(enabled
);
1007 m_panel
->m_multitext
->Enable(enabled
);
1008 m_panel
->m_readonly
->Enable(enabled
);
1009 m_panel
->m_limited
->Enable(enabled
);
1010 m_panel
->m_textrich
->Enable(enabled
);
1013 void MyFrame::OnFileSave(wxCommandEvent
& event
)
1015 if ( m_panel
->m_textrich
->SaveFile("dummy.txt") )
1018 // verify that the fil length is correct (it wasn't under Win95)
1019 wxFile
file("dummy.txt");
1020 wxLogStatus(this, _T("Successfully saved file "
1021 "(text len = %ld, file size = %ld)"),
1022 m_panel
->m_textrich
->GetValue().length(),
1027 wxLogStatus(this, _T("Couldn't save the file"));
1030 void MyFrame::OnFileLoad(wxCommandEvent
& event
)
1032 if ( m_panel
->m_textrich
->LoadFile("dummy.txt") )
1033 wxLogStatus(this, _T("Successfully loaded file"));
1035 wxLogStatus(this, _T("Couldn't load the file"));
1038 void MyFrame::OnIdle( wxIdleEvent
& event
)
1040 // track the window which has the focus in the status bar
1041 static wxWindow
*s_windowFocus
= (wxWindow
*)NULL
;
1042 wxWindow
*focus
= wxWindow::FindFocus();
1043 if ( focus
&& (focus
!= s_windowFocus
) )
1045 s_windowFocus
= focus
;
1050 _T("Focus: wxWindow = %p, HWND = %08x"),
1052 _T("Focus: wxWindow = %p"),
1056 , s_windowFocus
->GetHWND()