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