]>
git.saurik.com Git - wxWidgets.git/blob - samples/text/text.cpp
fc7716f5a5ebe14e1f7fb017ce9c3d4569ae7c5b
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
);
69 void OnText(wxCommandEvent
& event
);
70 void OnTextURL(wxTextUrlEvent
& event
);
71 void OnMouseEvent(wxMouseEvent
& event
);
76 static inline wxChar
GetChar(bool on
, wxChar c
) { return on
? c
: _T('-'); }
77 void LogEvent(const wxChar
*name
, wxKeyEvent
& event
) const;
82 class MyPanel
: public wxPanel
85 MyPanel(wxFrame
*frame
, int x
, int y
, int w
, int h
);
88 void DoPasteFromClipboard();
89 void DoCopyToClipboard();
90 #endif // wxUSE_CLIPBOARD
92 void DoMoveToEndOfText();
93 void DoMoveToEndOfEntry();
95 void OnSize( wxSizeEvent
&event
);
98 MyTextCtrl
*m_password
;
101 MyTextCtrl
*m_readonly
;
103 MyTextCtrl
*m_multitext
;
104 MyTextCtrl
*m_horizontal
;
106 MyTextCtrl
*m_textrich
;
111 DECLARE_EVENT_TABLE()
114 class MyFrame
: public wxFrame
117 MyFrame(wxFrame
*frame
, const char *title
, int x
, int y
, int w
, int h
);
119 void OnQuit(wxCommandEvent
& event
);
120 void OnAbout(wxCommandEvent
& event
);
122 void OnSetTooltipDelay(wxCommandEvent
& event
);
123 void OnToggleTooltips(wxCommandEvent
& event
);
124 #endif // wxUSE_TOOLTIPS
127 void OnPasteFromClipboard( wxCommandEvent
&event
)
128 { m_panel
->DoPasteFromClipboard(); }
129 void OnCopyToClipboard( wxCommandEvent
&event
)
130 { m_panel
->DoCopyToClipboard(); }
131 #endif // wxUSE_CLIPBOARD
133 void OnAddTextFreeze( wxCommandEvent
& event
)
135 void OnAddText( wxCommandEvent
& event
)
136 { DoAddText(false); }
138 void OnMoveToEndOfText( wxCommandEvent
&event
)
139 { m_panel
->DoMoveToEndOfText(); }
140 void OnMoveToEndOfEntry( wxCommandEvent
&event
)
141 { m_panel
->DoMoveToEndOfEntry(); }
143 void OnLogClear(wxCommandEvent
& event
);
144 void OnFileSave(wxCommandEvent
& event
);
145 void OnFileLoad(wxCommandEvent
& event
);
147 void OnSetEditable(wxCommandEvent
& event
);
148 void OnSetEnabled(wxCommandEvent
& event
);
150 void OnIdle( wxIdleEvent
& event
);
153 void DoAddText(bool freeze
)
155 wxTextCtrl
*text
= m_panel
->m_textrich
;
159 for ( int i
= 0; i
< 100; i
++ )
160 text
->AppendText(wxString::Format("Line %i\n", i
));
162 text
->SetInsertionPoint(0);
170 DECLARE_EVENT_TABLE()
173 //----------------------------------------------------------------------
175 //----------------------------------------------------------------------
179 //----------------------------------------------------------------------
181 //----------------------------------------------------------------------
192 TEXT_CLIPBOARD_COPY
= 200,
193 TEXT_CLIPBOARD_PASTE
,
196 TEXT_TOOLTIPS_SETDELAY
= 300,
197 TEXT_TOOLTIPS_ENABLE
,
210 // Create the main frame window
211 MyFrame
*frame
= new MyFrame((wxFrame
*) NULL
,
212 "Text wxWindows sample", 50, 50, 700, 420);
213 frame
->SetSizeHints( 500, 400 );
215 wxMenu
*file_menu
= new wxMenu
;
216 file_menu
->Append(TEXT_CLEAR
, "&Clear the log\tCtrl-C",
217 "Clear the log window contents");
218 file_menu
->Append(TEXT_SAVE
, "&Save file\tCtrl-S",
219 "Save the text control contents to file");
220 file_menu
->Append(TEXT_LOAD
, "&Load file\tCtrl-O",
221 "Load the sample file into text control");
222 file_menu
->AppendSeparator();
223 file_menu
->Append(TEXT_ABOUT
, "&About\tAlt-A");
224 file_menu
->AppendSeparator();
225 file_menu
->Append(TEXT_QUIT
, "E&xit\tAlt-X", "Quit this sample");
227 wxMenuBar
*menu_bar
= new wxMenuBar( wxMB_DOCKABLE
);
228 menu_bar
->Append(file_menu
, "&File");
231 wxMenu
*tooltip_menu
= new wxMenu
;
232 tooltip_menu
->Append(TEXT_TOOLTIPS_SETDELAY
, "Set &delay\tCtrl-D");
233 tooltip_menu
->AppendSeparator();
234 tooltip_menu
->Append(TEXT_TOOLTIPS_ENABLE
, "&Toggle tooltips\tCtrl-T",
235 "enable/disable tooltips", TRUE
);
236 tooltip_menu
->Check(TEXT_TOOLTIPS_ENABLE
, TRUE
);
237 menu_bar
->Append(tooltip_menu
, "&Tooltips");
238 #endif // wxUSE_TOOLTIPS
241 wxMenu
*menuClipboard
= new wxMenu
;
242 menuClipboard
->Append(TEXT_CLIPBOARD_COPY
, "&Copy\tCtrl-C",
243 "Copy the first line to the clipboard");
244 menuClipboard
->Append(TEXT_CLIPBOARD_PASTE
, "&Paste\tCtrl-V",
245 "Paste from clipboard to the text control");
246 menu_bar
->Append(menuClipboard
, "&Clipboard");
247 #endif // wxUSE_CLIPBOARD
249 wxMenu
*menuText
= new wxMenu
;
250 menuText
->Append(TEXT_ADD_SOME
, "&Append some text\tCtrl-A");
251 menuText
->Append(TEXT_ADD_FREEZE
, "&Append text with freeze/thaw\tShift-Ctrl-A");
252 menuText
->Append(TEXT_MOVE_ENDTEXT
, "Move cursor to the end of &text");
253 menuText
->Append(TEXT_MOVE_ENDENTRY
, "Move cursor to the end of &entry");
254 menuText
->Append(TEXT_SET_EDITABLE
, "Toggle &editable state", "", TRUE
);
255 menuText
->Append(TEXT_SET_ENABLED
, "Toggle e&nabled state", "", TRUE
);
256 menuText
->Check(TEXT_SET_EDITABLE
, TRUE
);
257 menuText
->Check(TEXT_SET_ENABLED
, TRUE
);
258 menu_bar
->Append(menuText
, "&Text");
260 frame
->SetMenuBar(menu_bar
);
270 //----------------------------------------------------------------------
272 //----------------------------------------------------------------------
274 BEGIN_EVENT_TABLE(MyTextCtrl
, wxTextCtrl
)
275 EVT_KEY_DOWN(MyTextCtrl::OnKeyDown
)
276 EVT_KEY_UP(MyTextCtrl::OnKeyUp
)
277 EVT_CHAR(MyTextCtrl::OnChar
)
278 EVT_TEXT(-1, MyTextCtrl::OnText
)
279 EVT_TEXT_URL(-1, MyTextCtrl::OnTextURL
)
280 EVT_MOUSE_EVENTS(MyTextCtrl::OnMouseEvent
)
283 void MyTextCtrl::LogEvent(const wxChar
*name
, wxKeyEvent
& event
) const
286 long keycode
= event
.KeyCode();
290 case WXK_BACK
: key
= "BACK"; break;
291 case WXK_TAB
: key
= "TAB"; break;
292 case WXK_RETURN
: key
= "RETURN"; break;
293 case WXK_ESCAPE
: key
= "ESCAPE"; break;
294 case WXK_SPACE
: key
= "SPACE"; break;
295 case WXK_DELETE
: key
= "DELETE"; break;
296 case WXK_START
: key
= "START"; break;
297 case WXK_LBUTTON
: key
= "LBUTTON"; break;
298 case WXK_RBUTTON
: key
= "RBUTTON"; break;
299 case WXK_CANCEL
: key
= "CANCEL"; break;
300 case WXK_MBUTTON
: key
= "MBUTTON"; break;
301 case WXK_CLEAR
: key
= "CLEAR"; break;
302 case WXK_SHIFT
: key
= "SHIFT"; break;
303 case WXK_ALT
: key
= "ALT"; break;
304 case WXK_CONTROL
: key
= "CONTROL"; break;
305 case WXK_MENU
: key
= "MENU"; break;
306 case WXK_PAUSE
: key
= "PAUSE"; break;
307 case WXK_CAPITAL
: key
= "CAPITAL"; break;
308 case WXK_PRIOR
: key
= "PRIOR"; break;
309 case WXK_NEXT
: key
= "NEXT"; break;
310 case WXK_END
: key
= "END"; break;
311 case WXK_HOME
: key
= "HOME"; break;
312 case WXK_LEFT
: key
= "LEFT"; break;
313 case WXK_UP
: key
= "UP"; break;
314 case WXK_RIGHT
: key
= "RIGHT"; break;
315 case WXK_DOWN
: key
= "DOWN"; break;
316 case WXK_SELECT
: key
= "SELECT"; break;
317 case WXK_PRINT
: key
= "PRINT"; break;
318 case WXK_EXECUTE
: key
= "EXECUTE"; break;
319 case WXK_SNAPSHOT
: key
= "SNAPSHOT"; break;
320 case WXK_INSERT
: key
= "INSERT"; break;
321 case WXK_HELP
: key
= "HELP"; break;
322 case WXK_NUMPAD0
: key
= "NUMPAD0"; break;
323 case WXK_NUMPAD1
: key
= "NUMPAD1"; break;
324 case WXK_NUMPAD2
: key
= "NUMPAD2"; break;
325 case WXK_NUMPAD3
: key
= "NUMPAD3"; break;
326 case WXK_NUMPAD4
: key
= "NUMPAD4"; break;
327 case WXK_NUMPAD5
: key
= "NUMPAD5"; break;
328 case WXK_NUMPAD6
: key
= "NUMPAD6"; break;
329 case WXK_NUMPAD7
: key
= "NUMPAD7"; break;
330 case WXK_NUMPAD8
: key
= "NUMPAD8"; break;
331 case WXK_NUMPAD9
: key
= "NUMPAD9"; break;
332 case WXK_MULTIPLY
: key
= "MULTIPLY"; break;
333 case WXK_ADD
: key
= "ADD"; break;
334 case WXK_SEPARATOR
: key
= "SEPARATOR"; break;
335 case WXK_SUBTRACT
: key
= "SUBTRACT"; break;
336 case WXK_DECIMAL
: key
= "DECIMAL"; break;
337 case WXK_DIVIDE
: key
= "DIVIDE"; break;
338 case WXK_F1
: key
= "F1"; break;
339 case WXK_F2
: key
= "F2"; break;
340 case WXK_F3
: key
= "F3"; break;
341 case WXK_F4
: key
= "F4"; break;
342 case WXK_F5
: key
= "F5"; break;
343 case WXK_F6
: key
= "F6"; break;
344 case WXK_F7
: key
= "F7"; break;
345 case WXK_F8
: key
= "F8"; break;
346 case WXK_F9
: key
= "F9"; break;
347 case WXK_F10
: key
= "F10"; break;
348 case WXK_F11
: key
= "F11"; break;
349 case WXK_F12
: key
= "F12"; break;
350 case WXK_F13
: key
= "F13"; break;
351 case WXK_F14
: key
= "F14"; break;
352 case WXK_F15
: key
= "F15"; break;
353 case WXK_F16
: key
= "F16"; break;
354 case WXK_F17
: key
= "F17"; break;
355 case WXK_F18
: key
= "F18"; break;
356 case WXK_F19
: key
= "F19"; break;
357 case WXK_F20
: key
= "F20"; break;
358 case WXK_F21
: key
= "F21"; break;
359 case WXK_F22
: key
= "F22"; break;
360 case WXK_F23
: key
= "F23"; break;
361 case WXK_F24
: key
= "F24"; break;
362 case WXK_NUMLOCK
: key
= "NUMLOCK"; break;
363 case WXK_SCROLL
: key
= "SCROLL"; break;
364 case WXK_PAGEUP
: key
= "PAGEUP"; break;
365 case WXK_PAGEDOWN
: key
= "PAGEDOWN"; break;
366 case WXK_NUMPAD_SPACE
: key
= "NUMPAD_SPACE"; break;
367 case WXK_NUMPAD_TAB
: key
= "NUMPAD_TAB"; break;
368 case WXK_NUMPAD_ENTER
: key
= "NUMPAD_ENTER"; break;
369 case WXK_NUMPAD_F1
: key
= "NUMPAD_F1"; break;
370 case WXK_NUMPAD_F2
: key
= "NUMPAD_F2"; break;
371 case WXK_NUMPAD_F3
: key
= "NUMPAD_F3"; break;
372 case WXK_NUMPAD_F4
: key
= "NUMPAD_F4"; break;
373 case WXK_NUMPAD_HOME
: key
= "NUMPAD_HOME"; break;
374 case WXK_NUMPAD_LEFT
: key
= "NUMPAD_LEFT"; break;
375 case WXK_NUMPAD_UP
: key
= "NUMPAD_UP"; break;
376 case WXK_NUMPAD_RIGHT
: key
= "NUMPAD_RIGHT"; break;
377 case WXK_NUMPAD_DOWN
: key
= "NUMPAD_DOWN"; break;
378 case WXK_NUMPAD_PRIOR
: key
= "NUMPAD_PRIOR"; break;
379 case WXK_NUMPAD_PAGEUP
: key
= "NUMPAD_PAGEUP"; break;
380 case WXK_NUMPAD_PAGEDOWN
: key
= "NUMPAD_PAGEDOWN"; break;
381 case WXK_NUMPAD_END
: key
= "NUMPAD_END"; break;
382 case WXK_NUMPAD_BEGIN
: key
= "NUMPAD_BEGIN"; break;
383 case WXK_NUMPAD_INSERT
: key
= "NUMPAD_INSERT"; break;
384 case WXK_NUMPAD_DELETE
: key
= "NUMPAD_DELETE"; break;
385 case WXK_NUMPAD_EQUAL
: key
= "NUMPAD_EQUAL"; break;
386 case WXK_NUMPAD_MULTIPLY
: key
= "NUMPAD_MULTIPLY"; break;
387 case WXK_NUMPAD_ADD
: key
= "NUMPAD_ADD"; break;
388 case WXK_NUMPAD_SEPARATOR
: key
= "NUMPAD_SEPARATOR"; break;
389 case WXK_NUMPAD_SUBTRACT
: key
= "NUMPAD_SUBTRACT"; break;
390 case WXK_NUMPAD_DECIMAL
: key
= "NUMPAD_DECIMAL"; break;
394 if ( wxIsprint((int)keycode
) )
395 key
.Printf( _T("'%c'") , (char)keycode
);
397 key
.Printf( _T("unknown (%ld)"), keycode
);
402 wxLogMessage( _T("%s event: %s (flags = %c%c%c%c)"),
405 GetChar( event
.ControlDown(), _T('C') ),
406 GetChar( event
.AltDown(), _T('A') ),
407 GetChar( event
.ShiftDown(), _T('S') ),
408 GetChar( event
.MetaDown(), _T('M') ) );
411 static wxString
GetMouseEventDesc(const wxMouseEvent
& ev
)
416 if ( ev
.LeftDown() || ev
.LeftUp() || ev
.LeftDClick() )
419 dbl
= ev
.LeftDClick();
422 else if ( ev
.MiddleDown() || ev
.MiddleUp() || ev
.MiddleDClick() )
424 button
= _T("Middle");
425 dbl
= ev
.MiddleDClick();
428 else if ( ev
.RightDown() || ev
.RightUp() || ev
.RightDClick() )
430 button
= _T("Right");
431 dbl
= ev
.RightDClick();
436 return _T("Unknown mouse event");
439 return wxString::Format(_T("%s mouse button %s"),
441 dbl
? _T("double clicked")
442 : up
? _T("released") : _T("clicked"));
445 void MyTextCtrl::OnMouseEvent(wxMouseEvent
& ev
)
452 msg
= _T("Mouse entered the window");
454 else if ( ev
.Leaving() )
456 msg
= _T("Mouse left the window");
460 msg
= GetMouseEventDesc(ev
);
463 msg
<< _T(" at (") << ev
.GetX() << _T(", ") << ev
.GetY() << _T(") ")
465 << GetChar( ev
.LeftIsDown(), _T('1') )
466 << GetChar( ev
.MiddleIsDown(), _T('2') )
467 << GetChar( ev
.RightIsDown(), _T('3') )
468 << GetChar( ev
.ControlDown(), _T('C') )
469 << GetChar( ev
.AltDown(), _T('A') )
470 << GetChar( ev
.ShiftDown(), _T('S') )
471 << GetChar( ev
.MetaDown(), _T('M') );
475 //else: we're not interested in mouse move events
480 void MyTextCtrl::OnText(wxCommandEvent
& event
)
482 MyTextCtrl
*win
= (MyTextCtrl
*)event
.GetEventObject();
483 const wxChar
*data
= (const wxChar
*)(win
->GetClientData());
486 wxLogMessage(_T("Text changed in control '%s'"), data
);
490 wxLogMessage(_T("Text changed in some control"));
494 void MyTextCtrl::OnTextURL(wxTextUrlEvent
& event
)
496 const wxMouseEvent
& ev
= event
.GetMouseEvent();
498 // filter out mouse moves, too many of them
502 long start
= event
.GetURLStart(),
503 end
= event
.GetURLEnd();
505 wxLogMessage(_T("Mouse event over URL '%s': %s"),
506 GetValue().Mid(start
, end
- start
).c_str(),
507 GetMouseEventDesc(ev
).c_str());
510 void MyTextCtrl::OnChar(wxKeyEvent
& event
)
512 LogEvent( _T("Char"), event
);
514 /* How are we supposed to test wxTE_PROCESS_TAB with this code?
516 if ( event.KeyCode() == WXK_TAB )
528 void MyTextCtrl::OnKeyUp(wxKeyEvent
& event
)
530 LogEvent( _T("Key up"), event
);
535 void MyTextCtrl::OnKeyDown(wxKeyEvent
& event
)
537 switch ( event
.KeyCode() )
540 // show current position and text length
542 long line
, column
, pos
= GetInsertionPoint();
543 PositionToXY(pos
, &column
, &line
);
545 wxLogMessage( _T("Current position: %ld\n"
546 "Current line, column: (%ld, %ld)\n"
547 "Number of lines: %ld\n"
548 "Current line length: %ld\n"
549 "Total text length: %u (%ld)"),
561 SetInsertionPointEnd();
566 SetInsertionPoint(10);
572 wxLogDebug( wxT("Now capturing mouse and events.") );
578 wxLogDebug( wxT("Stopped capturing mouse and events.") );
585 // insert a blank line
590 SetValue("F6 was just pressed.");
598 LogEvent( wxT("Key down"), event
);
603 //----------------------------------------------------------------------
605 //----------------------------------------------------------------------
607 BEGIN_EVENT_TABLE(MyPanel
, wxPanel
)
608 EVT_SIZE(MyPanel::OnSize
)
611 MyPanel::MyPanel( wxFrame
*frame
, int x
, int y
, int w
, int h
)
612 : wxPanel( frame
, -1, wxPoint(x
, y
), wxSize(w
, h
) )
614 m_log
= new wxTextCtrl( this, -1, "This is the log window.\n", wxPoint(5,260), wxSize(630,100), wxTE_MULTILINE
);
616 wxLog
*old_log
= wxLog::SetActiveTarget( new wxLogTextCtrl( m_log
) );
620 // single line text controls
622 m_text
= new MyTextCtrl( this, -1, "Single line.",
623 wxPoint(10,10), wxSize(140,-1),
625 m_text
->SetForegroundColour(*wxBLUE
);
626 m_text
->SetBackgroundColour(*wxLIGHT_GREY
);
627 (*m_text
) << " Appended.";
628 m_text
->SetInsertionPoint(0);
629 m_text
->WriteText( "Prepended. " );
631 m_password
= new MyTextCtrl( this, -1, "",
632 wxPoint(10,50), wxSize(140,-1), wxTE_PASSWORD
);
634 m_readonly
= new MyTextCtrl( this, -1, "Read only",
635 wxPoint(10,90), wxSize(140,-1), wxTE_READONLY
);
637 // multi line text controls
639 m_horizontal
= new MyTextCtrl( this, -1, "Multiline text control with a horizontal scrollbar.",
640 wxPoint(10,170), wxSize(140,70), wxTE_MULTILINE
| wxHSCROLL
);
642 // a little hack to use the command line argument for encoding testing
643 if ( wxTheApp
->argc
== 2 )
645 switch ( wxTheApp
->argv
[1][0] )
648 m_horizontal
->SetFont(wxFont(18, wxSWISS
, wxNORMAL
, wxNORMAL
,
650 wxFONTENCODING_ISO8859_2
));
651 m_horizontal
->SetValue("®lu»ouèký kùò zbìsile èe¹tina «»");
655 m_horizontal
->SetFont(wxFont(18, wxSWISS
, wxNORMAL
, wxNORMAL
,
657 wxFONTENCODING_KOI8
));
658 m_horizontal
->SetValue("ËÁÖÅÔÓÑ ÕÄÁÞÎÙÍ");
663 m_horizontal
->SetValue("Text in default encoding");
666 m_multitext
= new MyTextCtrl( this, -1, "Multi line.",
667 wxPoint(180,10), wxSize(240,70), wxTE_MULTILINE
);
668 m_multitext
->SetFont(*wxITALIC_FONT
);
669 (*m_multitext
) << " Appended.";
670 m_multitext
->SetInsertionPoint(0);
671 m_multitext
->WriteText( "Prepended. " );
672 m_multitext
->SetForegroundColour(*wxRED
);
673 m_multitext
->SetBackgroundColour(*wxLIGHT_GREY
);
676 m_multitext
->SetToolTip("Press F1 here for statitics, F4 for capture and uncapture mouse.");
679 m_tab
= new MyTextCtrl( this, 100, "Multiline, allow <TAB> processing.",
680 wxPoint(180,90), wxSize(240,70), wxTE_MULTILINE
| wxTE_PROCESS_TAB
);
681 m_tab
->SetClientData((void *)_T("tab"));
683 m_enter
= new MyTextCtrl( this, 100, "Multiline, allow <ENTER> processing.",
684 wxPoint(180,170), wxSize(240,70), wxTE_MULTILINE
);
685 m_enter
->SetClientData((void *)_T("enter"));
687 m_textrich
= new MyTextCtrl(this, -1, "Allows more than 30Kb of text\n"
688 "(even under broken Win9x)\n"
689 "and a very very very very very "
690 "very very very long line to test"
692 wxPoint(450, 10), wxSize(230, 230),
698 m_textrich
->SetStyle(0, 10, *wxRED
);
699 m_textrich
->SetStyle(10, 20, *wxBLUE
);
700 m_textrich
->SetStyle(30, 40,
701 wxTextAttr(*wxGREEN
, wxNullColour
, *wxITALIC_FONT
));
702 m_textrich
->SetDefaultStyle(wxTextAttr());
703 m_textrich
->AppendText(_T("\n\nFirst 10 characters should be in red\n"));
704 m_textrich
->AppendText(_T("Next 10 characters should be in blue\n"));
705 m_textrich
->AppendText(_T("Next 10 characters should be normal\n"));
706 m_textrich
->AppendText(_T("And the next 10 characters should be green and italic\n"));
707 m_textrich
->SetDefaultStyle(wxTextAttr(*wxCYAN
, *wxBLUE
));
708 m_textrich
->AppendText(_T("This text should be cyan on blue\n"));
709 m_textrich
->SetDefaultStyle(*wxBLUE
);
710 m_textrich
->AppendText(_T("And this should be in blue and the text you ")
711 _T("type should be in blue as well"));
714 void MyPanel::OnSize( wxSizeEvent
&event
)
716 wxSize
client_area( GetClientSize() );
717 m_log
->SetSize( 0, 260, client_area
.x
, client_area
.y
- 260 );
722 void MyPanel::DoPasteFromClipboard()
724 // On X11, we want to get the data from the primary selection instead
725 // of the normal clipboard (which isn't normal under X11 at all). This
726 // call has no effect under MSW.
727 wxTheClipboard
->UsePrimarySelection();
729 if (!wxTheClipboard
->Open())
731 *m_log
<< "Error opening the clipboard.\n";
736 *m_log
<< "Successfully opened the clipboard.\n";
739 wxTextDataObject data
;
741 if (wxTheClipboard
->IsSupported( data
.GetFormat() ))
743 *m_log
<< "Clipboard supports requested format.\n";
745 if (wxTheClipboard
->GetData( data
))
747 *m_log
<< "Successfully retrieved data from the clipboard.\n";
748 *m_multitext
<< data
.GetText() << "\n";
752 *m_log
<< "Error getting data from the clipboard.\n";
757 *m_log
<< "Clipboard doesn't support requested format.\n";
760 wxTheClipboard
->Close();
762 *m_log
<< "Closed the clipboard.\n";
765 void MyPanel::DoCopyToClipboard()
767 // On X11, we want to get the data from the primary selection instead
768 // of the normal clipboard (which isn't normal under X11 at all). This
769 // call has no effect under MSW.
770 wxTheClipboard
->UsePrimarySelection();
772 wxString
text( m_multitext
->GetLineText(0) );
776 *m_log
<< "No text to copy.\n";
781 if (!wxTheClipboard
->Open())
783 *m_log
<< "Error opening the clipboard.\n";
789 *m_log
<< "Successfully opened the clipboard.\n";
792 wxTextDataObject
*data
= new wxTextDataObject( text
);
794 if (!wxTheClipboard
->SetData( data
))
796 *m_log
<< "Error while copying to the clipboard.\n";
800 *m_log
<< "Successfully copied data to the clipboard.\n";
803 wxTheClipboard
->Close();
805 *m_log
<< "Closed the clipboard.\n";
808 #endif // wxUSE_CLIPBOARD
810 void MyPanel::DoMoveToEndOfText()
812 m_multitext
->SetInsertionPointEnd();
813 m_multitext
->SetFocus();
816 void MyPanel::DoMoveToEndOfEntry()
818 m_text
->SetInsertionPointEnd();
822 //----------------------------------------------------------------------
824 //----------------------------------------------------------------------
826 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
827 EVT_MENU(TEXT_QUIT
, MyFrame::OnQuit
)
828 EVT_MENU(TEXT_ABOUT
, MyFrame::OnAbout
)
829 EVT_MENU(TEXT_SAVE
, MyFrame::OnFileSave
)
830 EVT_MENU(TEXT_LOAD
, MyFrame::OnFileLoad
)
831 EVT_MENU(TEXT_CLEAR
, MyFrame::OnLogClear
)
834 EVT_MENU(TEXT_TOOLTIPS_SETDELAY
, MyFrame::OnSetTooltipDelay
)
835 EVT_MENU(TEXT_TOOLTIPS_ENABLE
, MyFrame::OnToggleTooltips
)
836 #endif // wxUSE_TOOLTIPS
839 EVT_MENU(TEXT_CLIPBOARD_PASTE
, MyFrame::OnPasteFromClipboard
)
840 EVT_MENU(TEXT_CLIPBOARD_COPY
, MyFrame::OnCopyToClipboard
)
841 #endif // wxUSE_CLIPBOARD
843 EVT_MENU(TEXT_ADD_SOME
, MyFrame::OnAddText
)
844 EVT_MENU(TEXT_ADD_FREEZE
, MyFrame::OnAddTextFreeze
)
845 EVT_MENU(TEXT_MOVE_ENDTEXT
, MyFrame::OnMoveToEndOfText
)
846 EVT_MENU(TEXT_MOVE_ENDENTRY
, MyFrame::OnMoveToEndOfEntry
)
848 EVT_MENU(TEXT_SET_EDITABLE
, MyFrame::OnSetEditable
)
849 EVT_MENU(TEXT_SET_ENABLED
, MyFrame::OnSetEnabled
)
851 EVT_IDLE(MyFrame::OnIdle
)
854 MyFrame::MyFrame(wxFrame
*frame
, const char *title
, int x
, int y
, int w
, int h
)
855 : wxFrame(frame
, -1, title
, wxPoint(x
, y
), wxSize(w
, h
) )
859 m_panel
= new MyPanel( this, 10, 10, 300, 100 );
862 void MyFrame::OnQuit (wxCommandEvent
& WXUNUSED(event
) )
867 void MyFrame::OnAbout( wxCommandEvent
& WXUNUSED(event
) )
871 wxMessageDialog
dialog(this,
872 "This is a text control sample. It demonstrates the many different\n"
873 "text control styles, the use of the clipboard, setting and handling\n"
874 "tooltips and intercepting key and char events.\n"
876 "Copyright (c) 1999, Robert Roebling, Julian Smart, Vadim Zeitlin",
877 "About wxTextCtrl Sample",
878 wxOK
| wxICON_INFORMATION
);
886 void MyFrame::OnSetTooltipDelay(wxCommandEvent
& event
)
888 static long s_delay
= 5000;
891 delay
.Printf( _T("%ld"), s_delay
);
893 delay
= wxGetTextFromUser("Enter delay (in milliseconds)",
900 wxSscanf(delay
, _T("%ld"), &s_delay
);
902 wxToolTip::SetDelay(s_delay
);
904 wxLogStatus(this, _T("Tooltip delay set to %ld milliseconds"), s_delay
);
907 void MyFrame::OnToggleTooltips(wxCommandEvent
& event
)
909 static bool s_enabled
= TRUE
;
911 s_enabled
= !s_enabled
;
913 wxToolTip::Enable(s_enabled
);
915 wxLogStatus(this, _T("Tooltips %sabled"), s_enabled
? _T("en") : _T("dis") );
919 void MyFrame::OnLogClear(wxCommandEvent
& WXUNUSED(event
))
921 m_panel
->m_log
->Clear();
924 void MyFrame::OnSetEditable(wxCommandEvent
& WXUNUSED(event
))
926 static bool s_editable
= TRUE
;
928 s_editable
= !s_editable
;
929 m_panel
->m_text
->SetEditable(s_editable
);
930 m_panel
->m_password
->SetEditable(s_editable
);
931 m_panel
->m_multitext
->SetEditable(s_editable
);
932 m_panel
->m_textrich
->SetEditable(s_editable
);
935 void MyFrame::OnSetEnabled(wxCommandEvent
& WXUNUSED(event
))
937 bool enabled
= m_panel
->m_text
->IsEnabled();
940 m_panel
->m_text
->Enable(enabled
);
941 m_panel
->m_password
->Enable(enabled
);
942 m_panel
->m_multitext
->Enable(enabled
);
943 m_panel
->m_readonly
->Enable(enabled
);
944 m_panel
->m_textrich
->Enable(enabled
);
947 void MyFrame::OnFileSave(wxCommandEvent
& event
)
949 if ( m_panel
->m_textrich
->SaveFile("dummy.txt") )
952 // verify that the fil length is correct (it wasn't under Win95)
953 wxFile
file("dummy.txt");
954 wxLogStatus(this, _T("Successfully saved file "
955 "(text len = %ld, file size = %ld)"),
956 m_panel
->m_textrich
->GetValue().length(),
961 wxLogStatus(this, _T("Couldn't save the file"));
964 void MyFrame::OnFileLoad(wxCommandEvent
& event
)
966 if ( m_panel
->m_textrich
->LoadFile("dummy.txt") )
967 wxLogStatus(this, _T("Successfully loaded file"));
969 wxLogStatus(this, _T("Couldn't load the file"));
972 void MyFrame::OnIdle( wxIdleEvent
& event
)
974 // track the window which has the focus in the status bar
975 static wxWindow
*s_windowFocus
= (wxWindow
*)NULL
;
976 wxWindow
*focus
= wxWindow::FindFocus();
977 if ( focus
&& (focus
!= s_windowFocus
) )
979 s_windowFocus
= focus
;
984 _T("Focus: wxWindow = %p, HWND = %08x"),
986 _T("Focus: wxWindow = %p"),
990 , s_windowFocus
->GetHWND()