]>
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
8 // Licence: wxWindows license
9 /////////////////////////////////////////////////////////////////////////////
12 #pragma implementation "controls.h"
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"
32 #include "wx/tooltip.h"
35 #if defined(__WXGTK__) || defined(__WXMOTIF__)
36 #include "mondrian.xpm"
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
) { }
66 void OnKeyDown(wxKeyEvent
& event
);
67 void OnKeyUp(wxKeyEvent
& event
);
68 void OnChar(wxKeyEvent
& event
);
71 static inline wxChar
GetChar(bool on
, wxChar c
) { return on
? c
: _T('-'); }
72 void LogEvent(const wxChar
*name
, wxKeyEvent
& event
) const;
77 class MyPanel
: public wxPanel
80 MyPanel(wxFrame
*frame
, int x
, int y
, int w
, int h
);
83 void DoPasteFromClipboard();
84 void DoCopyToClipboard();
85 #endif // wxUSE_CLIPBOARD
87 void DoMoveToEndOfText();
88 void DoMoveToEndOfEntry();
90 void OnSize( wxSizeEvent
&event
);
93 MyTextCtrl
*m_password
;
96 MyTextCtrl
*m_readonly
;
98 MyTextCtrl
*m_multitext
;
99 MyTextCtrl
*m_horizontal
;
104 DECLARE_EVENT_TABLE()
107 class MyFrame
: public wxFrame
110 MyFrame(wxFrame
*frame
, const char *title
, int x
, int y
, int w
, int h
);
112 void OnQuit(wxCommandEvent
& event
);
113 void OnAbout(wxCommandEvent
& event
);
115 void OnSetTooltipDelay(wxCommandEvent
& event
);
116 void OnToggleTooltips(wxCommandEvent
& event
);
117 #endif // wxUSE_TOOLTIPS
120 void OnPasteFromClipboard( wxCommandEvent
&event
)
121 { m_panel
->DoPasteFromClipboard(); }
122 void OnCopyToClipboard( wxCommandEvent
&event
)
123 { m_panel
->DoCopyToClipboard(); }
124 #endif // wxUSE_CLIPBOARD
126 void OnMoveToEndOfText( wxCommandEvent
&event
)
127 { m_panel
->DoMoveToEndOfText(); }
128 void OnMoveToEndOfEntry( wxCommandEvent
&event
)
129 { m_panel
->DoMoveToEndOfEntry(); }
131 void OnFileLoad(wxCommandEvent
& event
);
133 void OnIdle( wxIdleEvent
& event
);
138 DECLARE_EVENT_TABLE()
141 //----------------------------------------------------------------------
143 //----------------------------------------------------------------------
147 //----------------------------------------------------------------------
149 //----------------------------------------------------------------------
158 TEXT_CLIPBOARD_COPY
= 200,
159 TEXT_CLIPBOARD_PASTE
,
162 TEXT_TOOLTIPS_SETDELAY
= 300,
163 TEXT_TOOLTIPS_ENABLE
,
166 TEXT_MOVE_ENDTEXT
= 400,
172 // Create the main frame window
173 MyFrame
*frame
= new MyFrame((wxFrame
*) NULL
,
174 "Text wxWindows App",
176 frame
->SetSizeHints( 500, 400 );
178 wxMenu
*file_menu
= new wxMenu
;
179 file_menu
->Append(TEXT_LOAD
, "&Load file\tCtrl-O",
180 "Load the sample file into text control");
181 file_menu
->AppendSeparator();
182 file_menu
->Append(TEXT_ABOUT
, "&About\tAlt-A");
183 file_menu
->AppendSeparator();
184 file_menu
->Append(TEXT_QUIT
, "E&xit\tAlt-X", "Quit controls sample");
186 wxMenuBar
*menu_bar
= new wxMenuBar( wxMB_DOCKABLE
);
187 menu_bar
->Append(file_menu
, "&File");
190 wxMenu
*tooltip_menu
= new wxMenu
;
191 tooltip_menu
->Append(TEXT_TOOLTIPS_SETDELAY
, "Set &delay\tCtrl-D");
192 tooltip_menu
->AppendSeparator();
193 tooltip_menu
->Append(TEXT_TOOLTIPS_ENABLE
, "&Toggle tooltips\tCtrl-T",
194 "enable/disable tooltips", TRUE
);
195 tooltip_menu
->Check(TEXT_TOOLTIPS_ENABLE
, TRUE
);
196 menu_bar
->Append(tooltip_menu
, "&Tooltips");
197 #endif // wxUSE_TOOLTIPS
200 wxMenu
*menuClipboard
= new wxMenu
;
201 menuClipboard
->Append(TEXT_CLIPBOARD_COPY
, "&Copy\tCtrl-C",
202 "Copy the first line to the clipboard");
203 menuClipboard
->Append(TEXT_CLIPBOARD_PASTE
, "&Paste\tCtrl-V",
204 "Paste from clipboard to the text control");
205 menu_bar
->Append(menuClipboard
, "&Clipboard");
206 #endif // wxUSE_CLIPBOARD
208 wxMenu
*menuMove
= new wxMenu
;
209 menuMove
->Append(TEXT_MOVE_ENDTEXT
, "To the end of &text");
210 menuMove
->Append(TEXT_MOVE_ENDENTRY
, "To the end of &entry");
211 menu_bar
->Append(menuMove
, "&Move");
213 frame
->SetMenuBar(menu_bar
);
223 //----------------------------------------------------------------------
225 //----------------------------------------------------------------------
227 BEGIN_EVENT_TABLE(MyTextCtrl
, wxTextCtrl
)
228 EVT_KEY_DOWN(MyTextCtrl::OnKeyDown
)
229 EVT_KEY_UP(MyTextCtrl::OnKeyUp
)
230 EVT_CHAR(MyTextCtrl::OnChar
)
233 void MyTextCtrl::LogEvent(const wxChar
*name
, wxKeyEvent
& event
) const
236 long keycode
= event
.KeyCode();
240 case WXK_BACK
: key
= "BACK"; break;
241 case WXK_TAB
: key
= "TAB"; break;
242 case WXK_RETURN
: key
= "RETURN"; break;
243 case WXK_ESCAPE
: key
= "ESCAPE"; break;
244 case WXK_SPACE
: key
= "SPACE"; break;
245 case WXK_DELETE
: key
= "DELETE"; break;
246 case WXK_START
: key
= "START"; break;
247 case WXK_LBUTTON
: key
= "LBUTTON"; break;
248 case WXK_RBUTTON
: key
= "RBUTTON"; break;
249 case WXK_CANCEL
: key
= "CANCEL"; break;
250 case WXK_MBUTTON
: key
= "MBUTTON"; break;
251 case WXK_CLEAR
: key
= "CLEAR"; break;
252 case WXK_SHIFT
: key
= "SHIFT"; break;
253 case WXK_ALT
: key
= "ALT"; break;
254 case WXK_CONTROL
: key
= "CONTROL"; break;
255 case WXK_MENU
: key
= "MENU"; break;
256 case WXK_PAUSE
: key
= "PAUSE"; break;
257 case WXK_CAPITAL
: key
= "CAPITAL"; break;
258 case WXK_PRIOR
: key
= "PRIOR"; break;
259 case WXK_NEXT
: key
= "NEXT"; break;
260 case WXK_END
: key
= "END"; break;
261 case WXK_HOME
: key
= "HOME"; break;
262 case WXK_LEFT
: key
= "LEFT"; break;
263 case WXK_UP
: key
= "UP"; break;
264 case WXK_RIGHT
: key
= "RIGHT"; break;
265 case WXK_DOWN
: key
= "DOWN"; break;
266 case WXK_SELECT
: key
= "SELECT"; break;
267 case WXK_PRINT
: key
= "PRINT"; break;
268 case WXK_EXECUTE
: key
= "EXECUTE"; break;
269 case WXK_SNAPSHOT
: key
= "SNAPSHOT"; break;
270 case WXK_INSERT
: key
= "INSERT"; break;
271 case WXK_HELP
: key
= "HELP"; break;
272 case WXK_NUMPAD0
: key
= "NUMPAD0"; break;
273 case WXK_NUMPAD1
: key
= "NUMPAD1"; break;
274 case WXK_NUMPAD2
: key
= "NUMPAD2"; break;
275 case WXK_NUMPAD3
: key
= "NUMPAD3"; break;
276 case WXK_NUMPAD4
: key
= "NUMPAD4"; break;
277 case WXK_NUMPAD5
: key
= "NUMPAD5"; break;
278 case WXK_NUMPAD6
: key
= "NUMPAD6"; break;
279 case WXK_NUMPAD7
: key
= "NUMPAD7"; break;
280 case WXK_NUMPAD8
: key
= "NUMPAD8"; break;
281 case WXK_NUMPAD9
: key
= "NUMPAD9"; break;
282 case WXK_MULTIPLY
: key
= "MULTIPLY"; break;
283 case WXK_ADD
: key
= "ADD"; break;
284 case WXK_SEPARATOR
: key
= "SEPARATOR"; break;
285 case WXK_SUBTRACT
: key
= "SUBTRACT"; break;
286 case WXK_DECIMAL
: key
= "DECIMAL"; break;
287 case WXK_DIVIDE
: key
= "DIVIDE"; break;
288 case WXK_F1
: key
= "F1"; break;
289 case WXK_F2
: key
= "F2"; break;
290 case WXK_F3
: key
= "F3"; break;
291 case WXK_F4
: key
= "F4"; break;
292 case WXK_F5
: key
= "F5"; break;
293 case WXK_F6
: key
= "F6"; break;
294 case WXK_F7
: key
= "F7"; break;
295 case WXK_F8
: key
= "F8"; break;
296 case WXK_F9
: key
= "F9"; break;
297 case WXK_F10
: key
= "F10"; break;
298 case WXK_F11
: key
= "F11"; break;
299 case WXK_F12
: key
= "F12"; break;
300 case WXK_F13
: key
= "F13"; break;
301 case WXK_F14
: key
= "F14"; break;
302 case WXK_F15
: key
= "F15"; break;
303 case WXK_F16
: key
= "F16"; break;
304 case WXK_F17
: key
= "F17"; break;
305 case WXK_F18
: key
= "F18"; break;
306 case WXK_F19
: key
= "F19"; break;
307 case WXK_F20
: key
= "F20"; break;
308 case WXK_F21
: key
= "F21"; break;
309 case WXK_F22
: key
= "F22"; break;
310 case WXK_F23
: key
= "F23"; break;
311 case WXK_F24
: key
= "F24"; break;
312 case WXK_NUMLOCK
: key
= "NUMLOCK"; break;
313 case WXK_SCROLL
: key
= "SCROLL"; break;
314 case WXK_PAGEUP
: key
= "PAGEUP"; break;
315 case WXK_PAGEDOWN
: key
= "PAGEDOWN"; break;
316 case WXK_NUMPAD_SPACE
: key
= "NUMPAD_SPACE"; break;
317 case WXK_NUMPAD_TAB
: key
= "NUMPAD_TAB"; break;
318 case WXK_NUMPAD_ENTER
: key
= "NUMPAD_ENTER"; break;
319 case WXK_NUMPAD_F1
: key
= "NUMPAD_F1"; break;
320 case WXK_NUMPAD_F2
: key
= "NUMPAD_F2"; break;
321 case WXK_NUMPAD_F3
: key
= "NUMPAD_F3"; break;
322 case WXK_NUMPAD_F4
: key
= "NUMPAD_F4"; break;
323 case WXK_NUMPAD_HOME
: key
= "NUMPAD_HOME"; break;
324 case WXK_NUMPAD_LEFT
: key
= "NUMPAD_LEFT"; break;
325 case WXK_NUMPAD_UP
: key
= "NUMPAD_UP"; break;
326 case WXK_NUMPAD_RIGHT
: key
= "NUMPAD_RIGHT"; break;
327 case WXK_NUMPAD_DOWN
: key
= "NUMPAD_DOWN"; break;
328 case WXK_NUMPAD_PRIOR
: key
= "NUMPAD_PRIOR"; break;
329 case WXK_NUMPAD_PAGEUP
: key
= "NUMPAD_PAGEUP"; break;
330 case WXK_NUMPAD_PAGEDOWN
: key
= "NUMPAD_PAGEDOWN"; break;
331 case WXK_NUMPAD_END
: key
= "NUMPAD_END"; break;
332 case WXK_NUMPAD_BEGIN
: key
= "NUMPAD_BEGIN"; break;
333 case WXK_NUMPAD_INSERT
: key
= "NUMPAD_INSERT"; break;
334 case WXK_NUMPAD_DELETE
: key
= "NUMPAD_DELETE"; break;
335 case WXK_NUMPAD_EQUAL
: key
= "NUMPAD_EQUAL"; break;
336 case WXK_NUMPAD_MULTIPLY
: key
= "NUMPAD_MULTIPLY"; break;
337 case WXK_NUMPAD_ADD
: key
= "NUMPAD_ADD"; break;
338 case WXK_NUMPAD_SEPARATOR
: key
= "NUMPAD_SEPARATOR"; break;
339 case WXK_NUMPAD_SUBTRACT
: key
= "NUMPAD_SUBTRACT"; break;
340 case WXK_NUMPAD_DECIMAL
: key
= "NUMPAD_DECIMAL"; break;
344 if ( wxIsprint((int)keycode
) )
345 key
.Printf( _T("'%c'") , (char)keycode
);
347 key
.Printf( _T("unknown (%ld)"), keycode
);
352 wxLogMessage( _T("%s event: %s (flags = %c%c%c%c)"),
355 GetChar( event
.ControlDown(), _T('C') ),
356 GetChar( event
.AltDown(), _T('A') ),
357 GetChar( event
.ShiftDown(), _T('S') ),
358 GetChar( event
.MetaDown(), _T('M') ) );
362 void MyTextCtrl::OnChar(wxKeyEvent
& event
)
364 LogEvent( _T("Char"), event
);
366 if ( event
.KeyCode() == WXK_TAB
)
376 void MyTextCtrl::OnKeyUp(wxKeyEvent
& event
)
378 LogEvent( _("Key up"), event
);
383 void MyTextCtrl::OnKeyDown(wxKeyEvent
& event
)
385 switch ( event
.KeyCode() )
388 // show current position and text length
390 long line
, column
, pos
= GetInsertionPoint();
391 PositionToXY(pos
, &column
, &line
);
393 wxLogMessage( _T("Current position: %ld\n"
394 "Current line, column: (%ld, %ld)\n"
395 "Number of lines: %ld\n"
396 "Current line length: %ld\n"
397 "Total text length: %ld"),
408 SetInsertionPointEnd();
413 SetInsertionPoint(10);
417 LogEvent( _("Key down"), event
);
422 //----------------------------------------------------------------------
424 //----------------------------------------------------------------------
426 BEGIN_EVENT_TABLE(MyPanel
, wxPanel
)
427 EVT_SIZE(MyPanel::OnSize
)
430 MyPanel::MyPanel( wxFrame
*frame
, int x
, int y
, int w
, int h
)
431 : wxPanel( frame
, -1, wxPoint(x
, y
), wxSize(w
, h
) )
433 m_log
= new wxTextCtrl( this, -1, "This is the log window.\n", wxPoint(5,260), wxSize(630,100), wxTE_MULTILINE
);
435 wxLog
*old_log
= wxLog::SetActiveTarget( new wxLogTextCtrl( m_log
) );
439 // single line text controls
441 m_text
= new MyTextCtrl( this, -1, "Single line.",
442 wxPoint(10,10), wxSize(140,-1), 0);
443 (*m_text
) << " Appended.";
444 m_text
->SetInsertionPoint(0);
445 m_text
->WriteText( "Prepended. " );
447 m_password
= new MyTextCtrl( this, -1, "",
448 wxPoint(10,50), wxSize(140,-1), wxTE_PASSWORD
);
450 m_readonly
= new MyTextCtrl( this, -1, "Read only",
451 wxPoint(10,90), wxSize(140,-1), wxTE_READONLY
);
453 // multi line text controls
455 m_horizontal
= new MyTextCtrl( this, -1, "Multiline text control with a horizontal scrollbar.",
456 wxPoint(10,170), wxSize(140,70), wxTE_MULTILINE
| wxHSCROLL
);
457 m_horizontal
->SetFont(wxFont(18, wxSWISS
, wxNORMAL
, wxBOLD
));
459 m_multitext
= new MyTextCtrl( this, -1, "Multi line.",
460 wxPoint(180,10), wxSize(240,70), wxTE_MULTILINE
);
461 (*m_multitext
) << " Appended.";
462 m_multitext
->SetInsertionPoint(0);
463 m_multitext
->WriteText( "Prepended. " );
466 m_multitext
->SetToolTip("Press F1 here.");
469 m_tab
= new MyTextCtrl( this, -1, "Multiline, allow <TAB> processing.",
470 wxPoint(180,90), wxSize(240,70), wxTE_MULTILINE
| wxTE_PROCESS_TAB
);
472 m_enter
= new MyTextCtrl( this, -1, "Multiline, allow <ENTER> processing.",
473 wxPoint(180,170), wxSize(240,70), wxTE_MULTILINE
);
476 void MyPanel::OnSize( wxSizeEvent
&event
)
478 wxSize
client_area( GetClientSize() );
479 m_log
->SetSize( 0, 260, client_area
.x
, client_area
.y
- 260 );
484 void MyPanel::DoPasteFromClipboard()
486 // On X11, we want to get the data from the primary selection instead
487 // of the normal clipboard (which isn't normal under X11 at all). This
488 // call has no effect under MSW.
489 wxTheClipboard
->UsePrimarySelection();
491 if (!wxTheClipboard
->Open())
493 *m_log
<< "Error opening the clipboard.\n";
498 *m_log
<< "Successfully opened the clipboard.\n";
501 wxTextDataObject data
;
503 if (wxTheClipboard
->IsSupported( data
.GetFormat() ))
505 *m_log
<< "Clipboard supports requested format.\n";
507 if (wxTheClipboard
->GetData( &data
))
509 *m_log
<< "Successfully retrieved data from the clipboard.\n";
510 *m_multitext
<< data
.GetText() << "\n";
514 *m_log
<< "Error getting data from the clipboard.\n";
519 *m_log
<< "Clipboard doesn't support requested format.\n";
522 wxTheClipboard
->Close();
524 *m_log
<< "Closed the clipboard.\n";
527 void MyPanel::DoCopyToClipboard()
529 wxString
text( m_multitext
->GetLineText(0) );
533 *m_log
<< "No text to copy.\n";
538 if (!wxTheClipboard
->Open())
540 *m_log
<< "Error opening the clipboard.\n";
546 *m_log
<< "Successfully opened the clipboard.\n";
549 wxTextDataObject
*data
= new wxTextDataObject( text
);
551 if (!wxTheClipboard
->SetData( data
))
553 *m_log
<< "Error while copying to the clipboard.\n";
557 *m_log
<< "Successfully copied data to the clipboard.\n";
560 wxTheClipboard
->Close();
562 *m_log
<< "Closed the clipboard.\n";
565 #endif // wxUSE_CLIPBOARD
567 void MyPanel::DoMoveToEndOfText()
569 m_multitext
->SetInsertionPointEnd();
570 m_multitext
->SetFocus();
573 void MyPanel::DoMoveToEndOfEntry()
575 m_text
->SetInsertionPointEnd();
579 //----------------------------------------------------------------------
581 //----------------------------------------------------------------------
583 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
584 EVT_MENU(TEXT_QUIT
, MyFrame::OnQuit
)
585 EVT_MENU(TEXT_ABOUT
, MyFrame::OnAbout
)
586 EVT_MENU(TEXT_LOAD
, MyFrame::OnFileLoad
)
589 EVT_MENU(TEXT_TOOLTIPS_SETDELAY
, MyFrame::OnSetTooltipDelay
)
590 EVT_MENU(TEXT_TOOLTIPS_ENABLE
, MyFrame::OnToggleTooltips
)
591 #endif // wxUSE_TOOLTIPS
594 EVT_MENU(TEXT_CLIPBOARD_PASTE
, MyFrame::OnPasteFromClipboard
)
595 EVT_MENU(TEXT_CLIPBOARD_COPY
, MyFrame::OnCopyToClipboard
)
596 #endif // wxUSE_CLIPBOARD
598 EVT_MENU(TEXT_MOVE_ENDTEXT
, MyFrame::OnMoveToEndOfText
)
599 EVT_MENU(TEXT_MOVE_ENDENTRY
, MyFrame::OnMoveToEndOfEntry
)
601 EVT_IDLE(MyFrame::OnIdle
)
604 MyFrame::MyFrame(wxFrame
*frame
, const char *title
, int x
, int y
, int w
, int h
)
605 : wxFrame(frame
, -1, title
, wxPoint(x
, y
), wxSize(w
, h
) )
609 m_panel
= new MyPanel( this, 10, 10, 300, 100 );
612 void MyFrame::OnQuit (wxCommandEvent
& WXUNUSED(event
) )
617 void MyFrame::OnAbout( wxCommandEvent
& WXUNUSED(event
) )
621 wxMessageDialog
dialog(this,
622 "This is a text control sample. It demonstrates the many different\n"
623 "text control styles, the use of the clipboard, setting and handling\n"
624 "tooltips and intercepting key and char events.\n"
626 "Copyright (c) 1999, Robert Roebling, Julian Smart, Vadim Zeitlin",
627 "About Text Controls",
628 wxOK
| wxICON_INFORMATION
);
636 void MyFrame::OnSetTooltipDelay(wxCommandEvent
& event
)
638 static long s_delay
= 5000;
641 delay
.Printf( _T("%ld"), s_delay
);
643 delay
= wxGetTextFromUser("Enter delay (in milliseconds)",
650 wxSscanf(delay
, _T("%ld"), &s_delay
);
652 wxToolTip::SetDelay(s_delay
);
654 wxLogStatus(this, _T("Tooltip delay set to %ld milliseconds"), s_delay
);
657 void MyFrame::OnToggleTooltips(wxCommandEvent
& event
)
659 static bool s_enabled
= TRUE
;
661 s_enabled
= !s_enabled
;
663 wxToolTip::Enable(s_enabled
);
665 wxLogStatus(this, _T("Tooltips %sabled"), s_enabled
? _T("en") : _T("dis") );
669 void MyFrame::OnFileLoad(wxCommandEvent
& event
)
671 if ( m_panel
->m_multitext
->LoadFile("text.cpp") )
672 wxLogStatus(this, _T("Successfully loaded file"));
674 wxLogStatus(this, _T("Couldn't load the file"));
677 void MyFrame::OnIdle( wxIdleEvent
& event
)
679 // track the window which has the focus in the status bar
680 static wxWindow
*s_windowFocus
= (wxWindow
*)NULL
;
681 wxWindow
*focus
= wxWindow::FindFocus();
682 if ( focus
&& (focus
!= s_windowFocus
) )
684 s_windowFocus
= focus
;
689 _T("Focus: wxWindow = %p, HWND = %08x"),
691 _T("Focus: wxWindow = %p"),
695 , s_windowFocus
->GetHWND()