]> git.saurik.com Git - wxWidgets.git/blame - samples/text/text.cpp
Change a Popup menu from using a callback to using events. Can't test
[wxWidgets.git] / samples / text / text.cpp
CommitLineData
02e8b87f
RR
1/////////////////////////////////////////////////////////////////////////////
2// Name: controls.cpp
3// Purpose: TextCtrl wxWindows sample
4// Author: Robert Roebling
5// Modified by:
6// RCS-ID: $Id$
7// Copyright: (c) Robert Roebling, Julian Smart
8// Licence: wxWindows license
9/////////////////////////////////////////////////////////////////////////////
10
11#ifdef __GNUG__
12 #pragma implementation "controls.h"
13#endif
14
15// For compilers that support precompilation, includes "wx/wx.h".
16#include "wx/wxprec.h"
17
18#ifdef __BORLANDC__
19 #pragma hdrstop
20#endif
21
22#ifndef WX_PRECOMP
23 #include "wx/wx.h"
24#endif
25
26#if wxUSE_CLIPBOARD
27 #include "wx/dataobj.h"
28 #include "wx/clipbrd.h"
29#endif
30
31#if wxUSE_TOOLTIPS
32 #include "wx/tooltip.h"
33#endif
34
b6a0d8a2
VZ
35// We test for wxUSE_DRAG_AND_DROP also, because data objects may not be
36// implemented for compilers that can't cope with the OLE parts in
37// wxUSE_DRAG_AND_DROP.
38#if !wxUSE_DRAG_AND_DROP
39 #undef wxUSE_CLIPBOARD
40 #define wxUSE_CLIPBOARD 0
41#endif
42
02e8b87f
RR
43//----------------------------------------------------------------------
44// class definitions
45//----------------------------------------------------------------------
46
47class MyApp: public wxApp
48{
49public:
50 bool OnInit();
51};
52
53// a text ctrl which allows to call different wxTextCtrl functions
54// interactively by pressing function keys in it
55class MyTextCtrl : public wxTextCtrl
56{
57public:
58 MyTextCtrl(wxWindow *parent, wxWindowID id, const wxString &value,
59 const wxPoint &pos, const wxSize &size, int style = 0)
f152cf5a 60 : wxTextCtrl(parent, id, value, pos, size, style) { m_hasCapture = FALSE; }
02e8b87f
RR
61
62 void OnKeyDown(wxKeyEvent& event);
63 void OnKeyUp(wxKeyEvent& event);
64 void OnChar(wxKeyEvent& event);
65
f152cf5a
RR
66 bool m_hasCapture;
67
02e8b87f
RR
68private:
69 static inline wxChar GetChar(bool on, wxChar c) { return on ? c : _T('-'); }
70 void LogEvent(const wxChar *name, wxKeyEvent& event) const;
71
72 DECLARE_EVENT_TABLE()
73};
74
75class MyPanel: public wxPanel
76{
77public:
78 MyPanel(wxFrame *frame, int x, int y, int w, int h);
79
b6a0d8a2
VZ
80#if wxUSE_CLIPBOARD
81 void DoPasteFromClipboard();
82 void DoCopyToClipboard();
83#endif // wxUSE_CLIPBOARD
84
85 void DoMoveToEndOfText();
86 void DoMoveToEndOfEntry();
02e8b87f 87
89124b1a
RR
88 void OnSize( wxSizeEvent &event );
89
02e8b87f
RR
90 MyTextCtrl *m_text;
91 MyTextCtrl *m_password;
92 MyTextCtrl *m_enter;
93 MyTextCtrl *m_tab;
02e8b87f 94 MyTextCtrl *m_readonly;
bb69661b 95
02e8b87f
RR
96 MyTextCtrl *m_multitext;
97 MyTextCtrl *m_horizontal;
02e8b87f
RR
98
99 wxTextCtrl *m_log;
89124b1a
RR
100
101private:
102 DECLARE_EVENT_TABLE()
02e8b87f
RR
103};
104
105class MyFrame: public wxFrame
106{
107public:
b6a0d8a2 108 MyFrame(wxFrame *frame, const char *title, int x, int y, int w, int h);
02e8b87f
RR
109
110 void OnQuit(wxCommandEvent& event);
111 void OnAbout(wxCommandEvent& event);
112#if wxUSE_TOOLTIPS
113 void OnSetTooltipDelay(wxCommandEvent& event);
114 void OnToggleTooltips(wxCommandEvent& event);
115#endif // wxUSE_TOOLTIPS
b6a0d8a2
VZ
116
117#if wxUSE_CLIPBOARD
118 void OnPasteFromClipboard( wxCommandEvent &event )
119 { m_panel->DoPasteFromClipboard(); }
120 void OnCopyToClipboard( wxCommandEvent &event )
121 { m_panel->DoCopyToClipboard(); }
122#endif // wxUSE_CLIPBOARD
123
124 void OnMoveToEndOfText( wxCommandEvent &event )
125 { m_panel->DoMoveToEndOfText(); }
126 void OnMoveToEndOfEntry( wxCommandEvent &event )
127 { m_panel->DoMoveToEndOfEntry(); }
128
129 void OnFileLoad(wxCommandEvent& event);
130
02e8b87f
RR
131 void OnIdle( wxIdleEvent& event );
132
133private:
b6a0d8a2
VZ
134 MyPanel *m_panel;
135
02e8b87f
RR
136 DECLARE_EVENT_TABLE()
137};
138
139//----------------------------------------------------------------------
140// main()
141//----------------------------------------------------------------------
142
143IMPLEMENT_APP(MyApp)
144
145//----------------------------------------------------------------------
146// MyApp
147//----------------------------------------------------------------------
148
149enum
150{
b6a0d8a2
VZ
151 TEXT_QUIT = 100,
152 TEXT_ABOUT,
153 TEXT_LOAD,
154
155 // clipboard menu
156 TEXT_CLIPBOARD_COPY = 200,
157 TEXT_CLIPBOARD_PASTE,
02e8b87f
RR
158
159 // tooltip menu
b6a0d8a2
VZ
160 TEXT_TOOLTIPS_SETDELAY = 300,
161 TEXT_TOOLTIPS_ENABLE,
162
163 // move menu
164 TEXT_MOVE_ENDTEXT = 400,
165 TEXT_MOVE_ENDENTRY
02e8b87f
RR
166};
167
168bool MyApp::OnInit()
169{
170 // Create the main frame window
171 MyFrame *frame = new MyFrame((wxFrame *) NULL,
ddc8c2e3 172 "Text wxWindows sample", 50, 50, 640, 420);
89124b1a 173 frame->SetSizeHints( 500, 400 );
02e8b87f 174
02e8b87f 175 wxMenu *file_menu = new wxMenu;
b6a0d8a2
VZ
176 file_menu->Append(TEXT_LOAD, "&Load file\tCtrl-O",
177 "Load the sample file into text control");
178 file_menu->AppendSeparator();
179 file_menu->Append(TEXT_ABOUT, "&About\tAlt-A");
180 file_menu->AppendSeparator();
181 file_menu->Append(TEXT_QUIT, "E&xit\tAlt-X", "Quit controls sample");
02e8b87f
RR
182
183 wxMenuBar *menu_bar = new wxMenuBar( wxMB_DOCKABLE );
184 menu_bar->Append(file_menu, "&File");
185
186#if wxUSE_TOOLTIPS
187 wxMenu *tooltip_menu = new wxMenu;
b6a0d8a2 188 tooltip_menu->Append(TEXT_TOOLTIPS_SETDELAY, "Set &delay\tCtrl-D");
02e8b87f 189 tooltip_menu->AppendSeparator();
b6a0d8a2 190 tooltip_menu->Append(TEXT_TOOLTIPS_ENABLE, "&Toggle tooltips\tCtrl-T",
02e8b87f 191 "enable/disable tooltips", TRUE);
b6a0d8a2 192 tooltip_menu->Check(TEXT_TOOLTIPS_ENABLE, TRUE);
02e8b87f
RR
193 menu_bar->Append(tooltip_menu, "&Tooltips");
194#endif // wxUSE_TOOLTIPS
195
b6a0d8a2
VZ
196#if wxUSE_CLIPBOARD
197 wxMenu *menuClipboard = new wxMenu;
198 menuClipboard->Append(TEXT_CLIPBOARD_COPY, "&Copy\tCtrl-C",
199 "Copy the first line to the clipboard");
200 menuClipboard->Append(TEXT_CLIPBOARD_PASTE, "&Paste\tCtrl-V",
201 "Paste from clipboard to the text control");
202 menu_bar->Append(menuClipboard, "&Clipboard");
203#endif // wxUSE_CLIPBOARD
204
205 wxMenu *menuMove = new wxMenu;
206 menuMove->Append(TEXT_MOVE_ENDTEXT, "To the end of &text");
207 menuMove->Append(TEXT_MOVE_ENDENTRY, "To the end of &entry");
208 menu_bar->Append(menuMove, "&Move");
209
02e8b87f
RR
210 frame->SetMenuBar(menu_bar);
211
212 frame->Show(TRUE);
213
214 SetTopWindow(frame);
215
216 // report success
217 return TRUE;
218}
219
220//----------------------------------------------------------------------
221// MyTextCtrl
222//----------------------------------------------------------------------
223
224BEGIN_EVENT_TABLE(MyTextCtrl, wxTextCtrl)
225 EVT_KEY_DOWN(MyTextCtrl::OnKeyDown)
226 EVT_KEY_UP(MyTextCtrl::OnKeyUp)
227 EVT_CHAR(MyTextCtrl::OnChar)
228END_EVENT_TABLE()
229
230void MyTextCtrl::LogEvent(const wxChar *name, wxKeyEvent& event) const
231{
232 wxString key;
233 long keycode = event.KeyCode();
02e8b87f
RR
234 {
235 switch ( keycode )
236 {
237 case WXK_BACK: key = "BACK"; break;
238 case WXK_TAB: key = "TAB"; break;
239 case WXK_RETURN: key = "RETURN"; break;
240 case WXK_ESCAPE: key = "ESCAPE"; break;
241 case WXK_SPACE: key = "SPACE"; break;
242 case WXK_DELETE: key = "DELETE"; break;
243 case WXK_START: key = "START"; break;
244 case WXK_LBUTTON: key = "LBUTTON"; break;
245 case WXK_RBUTTON: key = "RBUTTON"; break;
246 case WXK_CANCEL: key = "CANCEL"; break;
247 case WXK_MBUTTON: key = "MBUTTON"; break;
248 case WXK_CLEAR: key = "CLEAR"; break;
249 case WXK_SHIFT: key = "SHIFT"; break;
250 case WXK_ALT: key = "ALT"; break;
251 case WXK_CONTROL: key = "CONTROL"; break;
252 case WXK_MENU: key = "MENU"; break;
253 case WXK_PAUSE: key = "PAUSE"; break;
254 case WXK_CAPITAL: key = "CAPITAL"; break;
255 case WXK_PRIOR: key = "PRIOR"; break;
256 case WXK_NEXT: key = "NEXT"; break;
257 case WXK_END: key = "END"; break;
258 case WXK_HOME: key = "HOME"; break;
259 case WXK_LEFT: key = "LEFT"; break;
260 case WXK_UP: key = "UP"; break;
261 case WXK_RIGHT: key = "RIGHT"; break;
262 case WXK_DOWN: key = "DOWN"; break;
263 case WXK_SELECT: key = "SELECT"; break;
264 case WXK_PRINT: key = "PRINT"; break;
265 case WXK_EXECUTE: key = "EXECUTE"; break;
266 case WXK_SNAPSHOT: key = "SNAPSHOT"; break;
267 case WXK_INSERT: key = "INSERT"; break;
268 case WXK_HELP: key = "HELP"; break;
269 case WXK_NUMPAD0: key = "NUMPAD0"; break;
270 case WXK_NUMPAD1: key = "NUMPAD1"; break;
271 case WXK_NUMPAD2: key = "NUMPAD2"; break;
272 case WXK_NUMPAD3: key = "NUMPAD3"; break;
273 case WXK_NUMPAD4: key = "NUMPAD4"; break;
274 case WXK_NUMPAD5: key = "NUMPAD5"; break;
275 case WXK_NUMPAD6: key = "NUMPAD6"; break;
276 case WXK_NUMPAD7: key = "NUMPAD7"; break;
277 case WXK_NUMPAD8: key = "NUMPAD8"; break;
278 case WXK_NUMPAD9: key = "NUMPAD9"; break;
279 case WXK_MULTIPLY: key = "MULTIPLY"; break;
280 case WXK_ADD: key = "ADD"; break;
281 case WXK_SEPARATOR: key = "SEPARATOR"; break;
282 case WXK_SUBTRACT: key = "SUBTRACT"; break;
283 case WXK_DECIMAL: key = "DECIMAL"; break;
284 case WXK_DIVIDE: key = "DIVIDE"; break;
285 case WXK_F1: key = "F1"; break;
286 case WXK_F2: key = "F2"; break;
287 case WXK_F3: key = "F3"; break;
288 case WXK_F4: key = "F4"; break;
289 case WXK_F5: key = "F5"; break;
290 case WXK_F6: key = "F6"; break;
291 case WXK_F7: key = "F7"; break;
292 case WXK_F8: key = "F8"; break;
293 case WXK_F9: key = "F9"; break;
294 case WXK_F10: key = "F10"; break;
295 case WXK_F11: key = "F11"; break;
296 case WXK_F12: key = "F12"; break;
297 case WXK_F13: key = "F13"; break;
298 case WXK_F14: key = "F14"; break;
299 case WXK_F15: key = "F15"; break;
300 case WXK_F16: key = "F16"; break;
301 case WXK_F17: key = "F17"; break;
302 case WXK_F18: key = "F18"; break;
303 case WXK_F19: key = "F19"; break;
304 case WXK_F20: key = "F20"; break;
305 case WXK_F21: key = "F21"; break;
306 case WXK_F22: key = "F22"; break;
307 case WXK_F23: key = "F23"; break;
308 case WXK_F24: key = "F24"; break;
309 case WXK_NUMLOCK: key = "NUMLOCK"; break;
310 case WXK_SCROLL: key = "SCROLL"; break;
311 case WXK_PAGEUP: key = "PAGEUP"; break;
312 case WXK_PAGEDOWN: key = "PAGEDOWN"; break;
313 case WXK_NUMPAD_SPACE: key = "NUMPAD_SPACE"; break;
314 case WXK_NUMPAD_TAB: key = "NUMPAD_TAB"; break;
315 case WXK_NUMPAD_ENTER: key = "NUMPAD_ENTER"; break;
316 case WXK_NUMPAD_F1: key = "NUMPAD_F1"; break;
317 case WXK_NUMPAD_F2: key = "NUMPAD_F2"; break;
318 case WXK_NUMPAD_F3: key = "NUMPAD_F3"; break;
319 case WXK_NUMPAD_F4: key = "NUMPAD_F4"; break;
320 case WXK_NUMPAD_HOME: key = "NUMPAD_HOME"; break;
321 case WXK_NUMPAD_LEFT: key = "NUMPAD_LEFT"; break;
322 case WXK_NUMPAD_UP: key = "NUMPAD_UP"; break;
323 case WXK_NUMPAD_RIGHT: key = "NUMPAD_RIGHT"; break;
324 case WXK_NUMPAD_DOWN: key = "NUMPAD_DOWN"; break;
325 case WXK_NUMPAD_PRIOR: key = "NUMPAD_PRIOR"; break;
326 case WXK_NUMPAD_PAGEUP: key = "NUMPAD_PAGEUP"; break;
327 case WXK_NUMPAD_PAGEDOWN: key = "NUMPAD_PAGEDOWN"; break;
328 case WXK_NUMPAD_END: key = "NUMPAD_END"; break;
329 case WXK_NUMPAD_BEGIN: key = "NUMPAD_BEGIN"; break;
330 case WXK_NUMPAD_INSERT: key = "NUMPAD_INSERT"; break;
331 case WXK_NUMPAD_DELETE: key = "NUMPAD_DELETE"; break;
332 case WXK_NUMPAD_EQUAL: key = "NUMPAD_EQUAL"; break;
333 case WXK_NUMPAD_MULTIPLY: key = "NUMPAD_MULTIPLY"; break;
334 case WXK_NUMPAD_ADD: key = "NUMPAD_ADD"; break;
335 case WXK_NUMPAD_SEPARATOR: key = "NUMPAD_SEPARATOR"; break;
336 case WXK_NUMPAD_SUBTRACT: key = "NUMPAD_SUBTRACT"; break;
337 case WXK_NUMPAD_DECIMAL: key = "NUMPAD_DECIMAL"; break;
338
89124b1a
RR
339 default:
340 {
341 if ( wxIsprint((int)keycode) )
342 key.Printf( _T("'%c'") , (char)keycode);
343 else
344 key.Printf( _T("unknown (%ld)"), keycode);
345 }
02e8b87f
RR
346 }
347 }
348
349 wxLogMessage( _T("%s event: %s (flags = %c%c%c%c)"),
350 name,
351 key.c_str(),
352 GetChar( event.ControlDown(), _T('C') ),
353 GetChar( event.AltDown(), _T('A') ),
354 GetChar( event.ShiftDown(), _T('S') ),
355 GetChar( event.MetaDown(), _T('M') ) );
356
357}
358
359void MyTextCtrl::OnChar(wxKeyEvent& event)
360{
361 LogEvent( _T("Char"), event);
362
3017f78d
RR
363/* How are we supposed to test wxTE_PROCESS_TAB with this code?
364
b6a0d8a2
VZ
365 if ( event.KeyCode() == WXK_TAB )
366 {
367 WriteText("\t");
368 }
369 else
370 {
371 event.Skip();
372 }
3017f78d
RR
373*/
374 event.Skip();
02e8b87f
RR
375}
376
377void MyTextCtrl::OnKeyUp(wxKeyEvent& event)
378{
379 LogEvent( _("Key up"), event);
380
381 event.Skip();
382}
383
384void MyTextCtrl::OnKeyDown(wxKeyEvent& event)
385{
386 switch ( event.KeyCode() )
387 {
388 case WXK_F1:
389 // show current position and text length
390 {
391 long line, column, pos = GetInsertionPoint();
392 PositionToXY(pos, &column, &line);
393
394 wxLogMessage( _T("Current position: %ld\n"
395 "Current line, column: (%ld, %ld)\n"
396 "Number of lines: %ld\n"
397 "Current line length: %ld\n"
398 "Total text length: %ld"),
399 pos,
400 line, column,
401 GetNumberOfLines(),
402 GetLineLength(line),
403 GetLastPosition());
404 }
405 break;
406
407 case WXK_F2:
408 // go to the end
409 SetInsertionPointEnd();
410 break;
411
412 case WXK_F3:
413 // go to position 10
414 SetInsertionPoint(10);
415 break;
f152cf5a
RR
416
417 case WXK_F4:
418 if (!m_hasCapture)
419 {
420 wxLogDebug( wxT("Now capturing mouse and events.") );
421 m_hasCapture = TRUE;
422 CaptureMouse();
423 }
424 else
425 {
426 wxLogDebug( wxT("Stopped capturing mouse and events.") );
427 m_hasCapture = TRUE;
428 ReleaseMouse();
429 }
430 break;
02e8b87f
RR
431 }
432
433 LogEvent( _("Key down"), event);
434
435 event.Skip();
436}
437
438//----------------------------------------------------------------------
439// MyPanel
440//----------------------------------------------------------------------
441
89124b1a
RR
442BEGIN_EVENT_TABLE(MyPanel, wxPanel)
443 EVT_SIZE(MyPanel::OnSize)
444END_EVENT_TABLE()
445
02e8b87f
RR
446MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
447 : wxPanel( frame, -1, wxPoint(x, y), wxSize(w, h) )
448{
449 m_log = new wxTextCtrl( this, -1, "This is the log window.\n", wxPoint(5,260), wxSize(630,100), wxTE_MULTILINE );
450
89124b1a
RR
451 wxLog *old_log = wxLog::SetActiveTarget( new wxLogTextCtrl( m_log ) );
452
453 delete old_log;
02e8b87f
RR
454
455 // single line text controls
456
bb69661b 457 m_text = new MyTextCtrl( this, -1, "Single line.",
02e8b87f
RR
458 wxPoint(10,10), wxSize(140,-1), 0);
459 (*m_text) << " Appended.";
460 m_text->SetInsertionPoint(0);
461 m_text->WriteText( "Prepended. " );
bb69661b
VZ
462
463 m_password = new MyTextCtrl( this, -1, "",
02e8b87f 464 wxPoint(10,50), wxSize(140,-1), wxTE_PASSWORD );
bb69661b
VZ
465
466 m_readonly = new MyTextCtrl( this, -1, "Read only",
02e8b87f 467 wxPoint(10,90), wxSize(140,-1), wxTE_READONLY );
bb69661b 468
02e8b87f
RR
469 // multi line text controls
470
bb69661b
VZ
471 m_horizontal = new MyTextCtrl( this, -1, "Multiline text control with a horizontal scrollbar.",
472 wxPoint(10,170), wxSize(140,70), wxTE_MULTILINE | wxHSCROLL );
ddc8c2e3
VZ
473 m_horizontal->SetFont(wxFont(18, wxSWISS, wxNORMAL, wxNORMAL,
474 FALSE, "", wxFONTENCODING_KOI8));
bb69661b 475
5e3dad49 476 m_multitext = new MyTextCtrl( this, -1, "Multi line.",
02e8b87f
RR
477 wxPoint(180,10), wxSize(240,70), wxTE_MULTILINE );
478 (*m_multitext) << " Appended.";
479 m_multitext->SetInsertionPoint(0);
480 m_multitext->WriteText( "Prepended. " );
bb69661b 481
02e8b87f 482#if wxUSE_TOOLTIPS
f152cf5a 483 m_multitext->SetToolTip("Press F1 here for statitics, F4 for capture and uncapture mouse.");
02e8b87f
RR
484#endif
485
bb69661b 486 m_tab = new MyTextCtrl( this, -1, "Multiline, allow <TAB> processing.",
02e8b87f
RR
487 wxPoint(180,90), wxSize(240,70), wxTE_MULTILINE | wxTE_PROCESS_TAB );
488
b6a0d8a2
VZ
489 m_enter = new MyTextCtrl( this, -1, "Multiline, allow <ENTER> processing.",
490 wxPoint(180,170), wxSize(240,70), wxTE_MULTILINE);
02e8b87f
RR
491}
492
89124b1a
RR
493void MyPanel::OnSize( wxSizeEvent &event )
494{
495 wxSize client_area( GetClientSize() );
496 m_log->SetSize( 0, 260, client_area.x, client_area.y - 260 );
497 event.Skip();
498}
499
b6a0d8a2
VZ
500#if wxUSE_CLIPBOARD
501void MyPanel::DoPasteFromClipboard()
02e8b87f 502{
7e2c43b8
RR
503 // On X11, we want to get the data from the primary selection instead
504 // of the normal clipboard (which isn't normal under X11 at all). This
505 // call has no effect under MSW.
506 wxTheClipboard->UsePrimarySelection();
507
02e8b87f
RR
508 if (!wxTheClipboard->Open())
509 {
510 *m_log << "Error opening the clipboard.\n";
02e8b87f
RR
511 return;
512 }
513 else
514 {
515 *m_log << "Successfully opened the clipboard.\n";
516 }
517
518 wxTextDataObject data;
519
520 if (wxTheClipboard->IsSupported( data.GetFormat() ))
521 {
522 *m_log << "Clipboard supports requested format.\n";
523
11e1c70d 524 if (wxTheClipboard->GetData( data ))
02e8b87f
RR
525 {
526 *m_log << "Successfully retrieved data from the clipboard.\n";
527 *m_multitext << data.GetText() << "\n";
528 }
529 else
530 {
531 *m_log << "Error getting data from the clipboard.\n";
532 }
533 }
534 else
535 {
536 *m_log << "Clipboard doesn't support requested format.\n";
537 }
538
539 wxTheClipboard->Close();
540
541 *m_log << "Closed the clipboard.\n";
02e8b87f
RR
542}
543
b6a0d8a2 544void MyPanel::DoCopyToClipboard()
02e8b87f 545{
02e8b87f
RR
546 wxString text( m_multitext->GetLineText(0) );
547
548 if (text.IsEmpty())
549 {
550 *m_log << "No text to copy.\n";
551
552 return;
553 }
554
555 if (!wxTheClipboard->Open())
556 {
557 *m_log << "Error opening the clipboard.\n";
558
559 return;
560 }
561 else
562 {
563 *m_log << "Successfully opened the clipboard.\n";
564 }
565
566 wxTextDataObject *data = new wxTextDataObject( text );
567
568 if (!wxTheClipboard->SetData( data ))
569 {
570 *m_log << "Error while copying to the clipboard.\n";
571 }
572 else
573 {
574 *m_log << "Successfully copied data to the clipboard.\n";
575 }
576
577 wxTheClipboard->Close();
578
579 *m_log << "Closed the clipboard.\n";
02e8b87f
RR
580}
581
b6a0d8a2
VZ
582#endif // wxUSE_CLIPBOARD
583
584void MyPanel::DoMoveToEndOfText()
02e8b87f
RR
585{
586 m_multitext->SetInsertionPointEnd();
587 m_multitext->SetFocus();
588}
589
b6a0d8a2 590void MyPanel::DoMoveToEndOfEntry()
02e8b87f
RR
591{
592 m_text->SetInsertionPointEnd();
593 m_text->SetFocus();
594}
595
596//----------------------------------------------------------------------
597// MyFrame
598//----------------------------------------------------------------------
599
600BEGIN_EVENT_TABLE(MyFrame, wxFrame)
b6a0d8a2
VZ
601 EVT_MENU(TEXT_QUIT, MyFrame::OnQuit)
602 EVT_MENU(TEXT_ABOUT, MyFrame::OnAbout)
603 EVT_MENU(TEXT_LOAD, MyFrame::OnFileLoad)
604
02e8b87f 605#if wxUSE_TOOLTIPS
b6a0d8a2
VZ
606 EVT_MENU(TEXT_TOOLTIPS_SETDELAY, MyFrame::OnSetTooltipDelay)
607 EVT_MENU(TEXT_TOOLTIPS_ENABLE, MyFrame::OnToggleTooltips)
02e8b87f 608#endif // wxUSE_TOOLTIPS
b6a0d8a2 609
ee31c392 610#if wxUSE_CLIPBOARD
b6a0d8a2
VZ
611 EVT_MENU(TEXT_CLIPBOARD_PASTE, MyFrame::OnPasteFromClipboard)
612 EVT_MENU(TEXT_CLIPBOARD_COPY, MyFrame::OnCopyToClipboard)
ee31c392
VZ
613#endif // wxUSE_CLIPBOARD
614
b6a0d8a2
VZ
615 EVT_MENU(TEXT_MOVE_ENDTEXT, MyFrame::OnMoveToEndOfText)
616 EVT_MENU(TEXT_MOVE_ENDENTRY, MyFrame::OnMoveToEndOfEntry)
617
618 EVT_IDLE(MyFrame::OnIdle)
02e8b87f
RR
619END_EVENT_TABLE()
620
b6a0d8a2
VZ
621MyFrame::MyFrame(wxFrame *frame, const char *title, int x, int y, int w, int h)
622 : wxFrame(frame, -1, title, wxPoint(x, y), wxSize(w, h) )
02e8b87f
RR
623{
624 CreateStatusBar(2);
625
b6a0d8a2 626 m_panel = new MyPanel( this, 10, 10, 300, 100 );
02e8b87f
RR
627}
628
629void MyFrame::OnQuit (wxCommandEvent& WXUNUSED(event) )
630{
631 Close(TRUE);
632}
633
634void MyFrame::OnAbout( wxCommandEvent& WXUNUSED(event) )
635{
636 wxBeginBusyCursor();
637
b6a0d8a2
VZ
638 wxMessageDialog dialog(this,
639 "This is a text control sample. It demonstrates the many different\n"
640 "text control styles, the use of the clipboard, setting and handling\n"
641 "tooltips and intercepting key and char events.\n"
642 "\n"
643 "Copyright (c) 1999, Robert Roebling, Julian Smart, Vadim Zeitlin",
644 "About Text Controls",
645 wxOK | wxICON_INFORMATION);
646
02e8b87f
RR
647 dialog.ShowModal();
648
649 wxEndBusyCursor();
650}
651
652#if wxUSE_TOOLTIPS
653void MyFrame::OnSetTooltipDelay(wxCommandEvent& event)
654{
655 static long s_delay = 5000;
656
657 wxString delay;
658 delay.Printf( _T("%ld"), s_delay);
659
660 delay = wxGetTextFromUser("Enter delay (in milliseconds)",
bb69661b
VZ
661 "Set tooltip delay",
662 delay,
663 this);
02e8b87f
RR
664 if ( !delay )
665 return; // cancelled
666
667 wxSscanf(delay, _T("%ld"), &s_delay);
668
669 wxToolTip::SetDelay(s_delay);
670
671 wxLogStatus(this, _T("Tooltip delay set to %ld milliseconds"), s_delay);
672}
673
674void MyFrame::OnToggleTooltips(wxCommandEvent& event)
675{
676 static bool s_enabled = TRUE;
677
678 s_enabled = !s_enabled;
679
680 wxToolTip::Enable(s_enabled);
681
682 wxLogStatus(this, _T("Tooltips %sabled"), s_enabled ? _T("en") : _T("dis") );
683}
684#endif // tooltips
685
b6a0d8a2
VZ
686void MyFrame::OnFileLoad(wxCommandEvent& event)
687{
ddc8c2e3 688 if ( m_panel->m_multitext->LoadFile("text.rc") )
5e3dad49
VZ
689 wxLogStatus(this, _T("Successfully loaded file"));
690 else
691 wxLogStatus(this, _T("Couldn't load the file"));
b6a0d8a2
VZ
692}
693
02e8b87f
RR
694void MyFrame::OnIdle( wxIdleEvent& event )
695{
696 // track the window which has the focus in the status bar
697 static wxWindow *s_windowFocus = (wxWindow *)NULL;
698 wxWindow *focus = wxWindow::FindFocus();
699 if ( focus && (focus != s_windowFocus) )
700 {
701 s_windowFocus = focus;
702
703 wxString msg;
704 msg.Printf(
705#ifdef __WXMSW__
706 _T("Focus: wxWindow = %p, HWND = %08x"),
707#else
708 _T("Focus: wxWindow = %p"),
709#endif
710 s_windowFocus
711#ifdef __WXMSW__
712 , s_windowFocus->GetHWND()
713#endif
714 );
715
716 SetStatusText(msg);
717 }
718 event.Skip();
719}