]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/text/text.cpp
ensure all topic overviews have an horizontal rule with the list of the sections...
[wxWidgets.git] / samples / text / text.cpp
index ce6f36985adc9b3eeab95bae12540e30499bff86..bf9b9dc253e61d77ddd97de0fc5ace51af8c8fe5 100644 (file)
@@ -43,6 +43,7 @@
 #include "wx/colordlg.h"
 #include "wx/fontdlg.h"
 #include "wx/numdlg.h"
+#include "wx/tokenzr.h"
 
 //----------------------------------------------------------------------
 // class definitions
@@ -71,9 +72,14 @@ public:
     void OnChar(wxKeyEvent& event);
 
     void OnText(wxCommandEvent& event);
+    void OnTextEnter(wxCommandEvent& event);
     void OnTextURL(wxTextUrlEvent& event);
     void OnTextMaxLen(wxCommandEvent& event);
 
+    void OnTextCut(wxClipboardTextEvent & event);
+    void OnTextCopy(wxClipboardTextEvent & event);
+    void OnTextPaste(wxClipboardTextEvent & event);
+
     void OnMouseEvent(wxMouseEvent& event);
 
     void OnSetFocus(wxFocusEvent& event);
@@ -84,10 +90,13 @@ public:
     static bool ms_logMouse;
     static bool ms_logText;
     static bool ms_logFocus;
+    static bool ms_logClip;
 
 private:
     static inline wxChar GetChar(bool on, wxChar c) { return on ? c : _T('-'); }
+
     void LogKeyEvent(const wxChar *name, wxKeyEvent& event) const;
+    void LogClipEvent(const wxChar *what, wxClipboardTextEvent& event);
 
     bool m_hasCapture;
 
@@ -281,9 +290,19 @@ public:
         MyTextCtrl::ms_logFocus = event.IsChecked();
     }
 
+    void OnLogClip(wxCommandEvent& event)
+    {
+        MyTextCtrl::ms_logClip = event.IsChecked();
+    }
+
     void OnSetText(wxCommandEvent& WXUNUSED(event))
     {
-        m_panel->m_text->SetValue(_T("Hello, world (what else did you expect)?"));
+        m_panel->m_text->SetValue(_T("Hello, world! (what else did you expect?)"));
+    }
+
+    void OnChangeText(wxCommandEvent& WXUNUSED(event))
+    {
+        m_panel->m_text->ChangeValue(_T("Changed, not set: no event"));
     }
 
     void OnIdle( wxIdleEvent& event );
@@ -335,6 +354,7 @@ public:
     void OnChangeBackgroundColour(wxCommandEvent& event);
     void OnLeftIndent(wxCommandEvent& event);
     void OnRightIndent(wxCommandEvent& event);
+    void OnTabStops(wxCommandEvent& event);
 
 private:
     wxTextCtrl *m_textCtrl;
@@ -365,6 +385,7 @@ enum
     // clipboard menu
     TEXT_CLIPBOARD_COPY = 200,
     TEXT_CLIPBOARD_PASTE,
+    TEXT_CLIPBOARD_VETO,
 
     // tooltip menu
     TEXT_TOOLTIPS_SETDELAY = 300,
@@ -389,6 +410,7 @@ enum
     TEXT_REPLACE,
     TEXT_SELECT,
     TEXT_SET,
+    TEXT_CHANGE,
 
     // log menu
     TEXT_LOG_KEY,
@@ -396,12 +418,16 @@ enum
     TEXT_LOG_MOUSE,
     TEXT_LOG_TEXT,
     TEXT_LOG_FOCUS,
+    TEXT_LOG_CLIP,
 
     TEXT_END
 };
 
 bool MyApp::OnInit()
 {
+    if ( !wxApp::OnInit() )
+        return false;
+
     // Create the main frame window
     MyFrame *frame = new MyFrame((wxFrame *) NULL,
             _T("Text wxWidgets sample"), 50, 50, 700, 550);
@@ -440,6 +466,9 @@ bool MyApp::OnInit()
                           _T("Copy the selection to the clipboard"));
     menuClipboard->Append(TEXT_CLIPBOARD_PASTE, _T("&Paste\tCtrl-Shift-V"),
                           _T("Paste from clipboard to the text control"));
+    menuClipboard->AppendSeparator();
+    menuClipboard->AppendCheckItem(TEXT_CLIPBOARD_VETO, _T("Vet&o\tCtrl-Shift-O"),
+                                   _T("Veto all clipboard operations"));
     menu_bar->Append(menuClipboard, _T("&Clipboard"));
 #endif // wxUSE_CLIPBOARD
 
@@ -450,6 +479,7 @@ bool MyApp::OnInit()
     menuText->Append(TEXT_REPLACE, _T("&Replace characters 4 to 8 with ABC\tCtrl-R"));
     menuText->Append(TEXT_SELECT, _T("&Select characters 4 to 8\tCtrl-I"));
     menuText->Append(TEXT_SET, _T("&Set the first text zone value\tCtrl-E"));
+    menuText->Append(TEXT_CHANGE, _T("&Change the first text zone value\tShift-Ctrl-E"));
     menuText->AppendSeparator();
     menuText->Append(TEXT_MOVE_ENDTEXT, _T("Move cursor to the end of &text"));
     menuText->Append(TEXT_MOVE_ENDENTRY, _T("Move cursor to the end of &entry"));
@@ -474,13 +504,13 @@ bool MyApp::OnInit()
     menuLog->AppendCheckItem(TEXT_LOG_MOUSE, _T("Log &mouse events"));
     menuLog->AppendCheckItem(TEXT_LOG_TEXT, _T("Log &text events"));
     menuLog->AppendCheckItem(TEXT_LOG_FOCUS, _T("Log &focus events"));
+    menuLog->AppendCheckItem(TEXT_LOG_CLIP, _T("Log clip&board events"));
     menuLog->AppendSeparator();
     menuLog->Append(TEXT_CLEAR, _T("&Clear the log\tCtrl-L"),
                     _T("Clear the log window contents"));
 
     // select only the interesting events by default
-    MyTextCtrl::ms_logKey =
-    MyTextCtrl::ms_logChar = false;
+    MyTextCtrl::ms_logClip =
     MyTextCtrl::ms_logText = true;
 
     menuLog->Check(TEXT_LOG_KEY, MyTextCtrl::ms_logKey);
@@ -510,8 +540,12 @@ BEGIN_EVENT_TABLE(MyTextCtrl, wxTextCtrl)
     EVT_CHAR(MyTextCtrl::OnChar)
 
     EVT_TEXT(wxID_ANY, MyTextCtrl::OnText)
+    EVT_TEXT_ENTER(wxID_ANY, MyTextCtrl::OnTextEnter)
     EVT_TEXT_URL(wxID_ANY, MyTextCtrl::OnTextURL)
     EVT_TEXT_MAXLEN(wxID_ANY, MyTextCtrl::OnTextMaxLen)
+    EVT_TEXT_CUT(wxID_ANY,   MyTextCtrl::OnTextCut)
+    EVT_TEXT_COPY(wxID_ANY,  MyTextCtrl::OnTextCopy)
+    EVT_TEXT_PASTE(wxID_ANY, MyTextCtrl::OnTextPaste)
 
     EVT_MOUSE_EVENTS(MyTextCtrl::OnMouseEvent)
 
@@ -524,6 +558,7 @@ bool MyTextCtrl::ms_logChar = false;
 bool MyTextCtrl::ms_logMouse = false;
 bool MyTextCtrl::ms_logText = false;
 bool MyTextCtrl::ms_logFocus = false;
+bool MyTextCtrl::ms_logClip = false;
 
 void MyTextCtrl::LogKeyEvent(const wxChar *name, wxKeyEvent& event) const
 {
@@ -550,8 +585,6 @@ void MyTextCtrl::LogKeyEvent(const wxChar *name, wxKeyEvent& event) const
             case WXK_MENU: key = _T("MENU"); break;
             case WXK_PAUSE: key = _T("PAUSE"); break;
             case WXK_CAPITAL: key = _T("CAPITAL"); break;
-            case WXK_PRIOR: key = _T("PRIOR"); break;
-            case WXK_NEXT: key = _T("NEXT"); break;
             case WXK_END: key = _T("END"); break;
             case WXK_HOME: key = _T("HOME"); break;
             case WXK_LEFT: key = _T("LEFT"); break;
@@ -620,7 +653,6 @@ void MyTextCtrl::LogKeyEvent(const wxChar *name, wxKeyEvent& event) const
             case WXK_NUMPAD_UP: key = _T("NUMPAD_UP"); break;
             case WXK_NUMPAD_RIGHT: key = _T("NUMPAD_RIGHT"); break;
             case WXK_NUMPAD_DOWN: key = _T("NUMPAD_DOWN"); break;
-            case WXK_NUMPAD_PRIOR: key = _T("NUMPAD_PRIOR"); break;
             case WXK_NUMPAD_PAGEUP: key = _T("NUMPAD_PAGEUP"); break;
             case WXK_NUMPAD_PAGEDOWN: key = _T("NUMPAD_PAGEDOWN"); break;
             case WXK_NUMPAD_END: key = _T("NUMPAD_END"); break;
@@ -757,6 +789,25 @@ void MyTextCtrl::OnKillFocus(wxFocusEvent& event)
 }
 
 void MyTextCtrl::OnText(wxCommandEvent& event)
+{
+    if ( !ms_logText )
+        return;
+
+    MyTextCtrl *win = (MyTextCtrl *)event.GetEventObject();
+    const wxChar *changeVerb = win->IsModified() ? _T("changed")
+                                                 : _T("set by program");
+    const wxChar *data = (const wxChar *)(win->GetClientData());
+    if ( data )
+    {
+        wxLogMessage(_T("Text %s in control \"%s\""), changeVerb, data);
+    }
+    else
+    {
+        wxLogMessage(_T("Text %s in some control"), changeVerb);
+    }
+}
+
+void MyTextCtrl::OnTextEnter(wxCommandEvent& event)
 {
     if ( !ms_logText )
         return;
@@ -765,12 +816,11 @@ void MyTextCtrl::OnText(wxCommandEvent& event)
     const wxChar *data = (const wxChar *)(win->GetClientData());
     if ( data )
     {
-        wxLogMessage(_T("Text changed in control '%s'"), data);
+        wxLogMessage(_T("Enter pressed in control '%s'"), data);
     }
     else
     {
-        // wxLogMessage( event.GetString() );
-        wxLogMessage(_T("Text changed in some control"));
+        wxLogMessage(_T("Enter pressed in some control"));
     }
 }
 
@@ -779,6 +829,39 @@ void MyTextCtrl::OnTextMaxLen(wxCommandEvent& WXUNUSED(event))
     wxLogMessage(_T("You can't enter more characters into this control."));
 }
 
+
+void MyTextCtrl::OnTextCut(wxClipboardTextEvent& event)
+{
+    LogClipEvent(_T("cut to"), event);
+}
+
+void MyTextCtrl::OnTextCopy(wxClipboardTextEvent& event)
+{
+    LogClipEvent(_T("copied to"), event);
+}
+
+void MyTextCtrl::OnTextPaste(wxClipboardTextEvent& event)
+{
+    LogClipEvent(_T("pasted from"), event);
+}
+
+void MyTextCtrl::LogClipEvent(const wxChar *what, wxClipboardTextEvent& event)
+{
+    wxFrame *frame = wxDynamicCast(wxGetTopLevelParent(this), wxFrame);
+    wxCHECK_RET( frame, _T("no parent frame?") );
+
+    const bool veto = frame->GetMenuBar()->IsChecked(TEXT_CLIPBOARD_VETO);
+    if ( !veto )
+        event.Skip();
+
+    if ( ms_logClip )
+    {
+        wxLogMessage(_T("Text %s%s the clipboard."),
+                     veto ? _T("not ") : _T(""), what);
+    }
+}
+
+
 void MyTextCtrl::OnTextURL(wxTextUrlEvent& event)
 {
     const wxMouseEvent& ev = event.GetMouseEvent();
@@ -838,6 +921,10 @@ void MyTextCtrl::OnKeyDown(wxKeyEvent& event)
                 wxLogMessage(_T("Selection = '%s' (len = %u)"),
                              sel.c_str(),
                              (unsigned int) sel.length());
+
+                const wxString text = GetLineText(line);
+                wxLogMessage(_T("Current line: \"%s\"; length = %lu"),
+                             text.c_str(), text.length());
             }
             break;
 
@@ -874,7 +961,7 @@ void MyTextCtrl::OnKeyDown(wxKeyEvent& event)
         case WXK_F6:
             wxLogMessage(_T("IsModified() before SetValue(): %d"),
                          IsModified());
-            SetValue(_T("SetValue() has been called"));
+            ChangeValue(_T("ChangeValue() has been called"));
             wxLogMessage(_T("IsModified() after SetValue(): %d"),
                          IsModified());
             break;
@@ -896,6 +983,11 @@ void MyTextCtrl::OnKeyDown(wxKeyEvent& event)
         case WXK_F10:
             AppendText(_T("AppendText() has been called"));
             break;
+
+        case WXK_F11:
+            DiscardEdits();
+            wxLogMessage(_T("Control marked as non modified"));
+            break;
     }
 
     if ( ms_logKey )
@@ -948,7 +1040,7 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
     // a little hack to use the command line argument for encoding testing
     if ( wxTheApp->argc == 2 )
     {
-        switch ( wxTheApp->argv[1][0] )
+        switch ( (wxChar)wxTheApp->argv[1][0] )
         {
             case '2':
                 m_horizontal->SetFont(wxFont(18, wxSWISS, wxNORMAL, wxNORMAL,
@@ -980,8 +1072,9 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
         m_horizontal->AppendText(_T("Text in default encoding"));
     }
 
-    m_multitext = new MyTextCtrl( this, wxID_ANY, _T("Multi line."),
-      wxPoint(180,10), wxSize(200,70), wxTE_MULTILINE );
+    m_multitext = new MyTextCtrl( this, wxID_ANY,
+                                  _T("Multi line without vertical scrollbar."),
+      wxPoint(180,10), wxSize(200,70), wxTE_MULTILINE | wxTE_NO_VSCROLL );
     m_multitext->SetFont(*wxITALIC_FONT);
     (*m_multitext) << _T(" Appended.");
     m_multitext->SetInsertionPoint(0);
@@ -1221,6 +1314,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_MENU(TEXT_LOG_MOUSE,MyFrame::OnLogMouse)
     EVT_MENU(TEXT_LOG_TEXT, MyFrame::OnLogText)
     EVT_MENU(TEXT_LOG_FOCUS,MyFrame::OnLogFocus)
+    EVT_MENU(TEXT_LOG_CLIP, MyFrame::OnLogClip)
 #if wxUSE_LOG
     EVT_MENU(TEXT_CLEAR,    MyFrame::OnLogClear)
 #endif // wxUSE_LOG
@@ -1254,10 +1348,11 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_MENU(TEXT_PAGE_DOWN,          MyFrame::OnScrollPageDown)
     EVT_MENU(TEXT_PAGE_UP,            MyFrame::OnScrollPageUp)
 
-    EVT_MENU(TEXT_GET_LINE,            MyFrame::OnGetLine)
-    EVT_MENU(TEXT_GET_LINELENGTH,            MyFrame::OnGetLineLength)
+    EVT_MENU(TEXT_GET_LINE,           MyFrame::OnGetLine)
+    EVT_MENU(TEXT_GET_LINELENGTH,     MyFrame::OnGetLineLength)
 
     EVT_MENU(TEXT_SET,                MyFrame::OnSetText)
+    EVT_MENU(TEXT_CHANGE,             MyFrame::OnChangeText)
 
     EVT_IDLE(MyFrame::OnIdle)
 END_EVENT_TABLE()
@@ -1436,7 +1531,8 @@ enum
     RICHTEXT_CHANGE_TEXT_COLOUR,
     RICHTEXT_CHANGE_BACKGROUND_COLOUR,
     RICHTEXT_LEFT_INDENT,
-    RICHTEXT_RIGHT_INDENT
+    RICHTEXT_RIGHT_INDENT,
+    RICHTEXT_TAB_STOPS
 };
 
 BEGIN_EVENT_TABLE(RichTextFrame, wxFrame)
@@ -1451,6 +1547,7 @@ BEGIN_EVENT_TABLE(RichTextFrame, wxFrame)
     EVT_MENU(RICHTEXT_CHANGE_BACKGROUND_COLOUR, RichTextFrame::OnChangeBackgroundColour)
     EVT_MENU(RICHTEXT_LEFT_INDENT, RichTextFrame::OnLeftIndent)
     EVT_MENU(RICHTEXT_RIGHT_INDENT, RichTextFrame::OnRightIndent)
+    EVT_MENU(RICHTEXT_TAB_STOPS, RichTextFrame::OnTabStops)
 END_EVENT_TABLE()
 
 RichTextFrame::RichTextFrame(wxWindow* parent, const wxString& title):
@@ -1489,7 +1586,8 @@ RichTextFrame::RichTextFrame(wxWindow* parent, const wxString& title):
     editMenu->Append(RICHTEXT_CHANGE_BACKGROUND_COLOUR, _("Change Background Colour"));
     editMenu->AppendSeparator();
     editMenu->Append(RICHTEXT_LEFT_INDENT, _("Left Indent"));
-    editMenu->Append(RICHTEXT_RIGHT_INDENT, _("Right indent"));
+    editMenu->Append(RICHTEXT_RIGHT_INDENT, _("Right Indent"));
+    editMenu->Append(RICHTEXT_TAB_STOPS, _("Tab Stops"));
     menuBar->Append(editMenu, _("Edit"));
 
     SetMenuBar(menuBar);
@@ -1681,6 +1779,35 @@ void RichTextFrame::OnRightIndent(wxCommandEvent& WXUNUSED(event))
     }
 }
 
+void RichTextFrame::OnTabStops(wxCommandEvent& WXUNUSED(event))
+{
+    wxString tabsStr = wxGetTextFromUser
+                         (
+                            _("Please enter the tab stop positions in tenths of a millimetre, separated by spaces.\nLeave empty to reset tab stops."),
+                            _("Tab Stops"),
+                            wxEmptyString,
+                            this
+                         );
+
+    wxArrayInt tabs;
+
+    wxStringTokenizer tokens(tabsStr, _T(" "));
+    while (tokens.HasMoreTokens())
+    {
+        wxString token = tokens.GetNextToken();
+        tabs.Add(wxAtoi(token));
+    }
+
+    wxTextAttr attr;
+    attr.SetTabs(tabs);
+
+    long start, end;
+    m_textCtrl->GetSelection(& start, & end);
+    m_textCtrl->SetStyle(start, end, attr);
+
+    m_currentPosition = -1;
+}
+
 void RichTextFrame::OnIdle(wxIdleEvent& WXUNUSED(event))
 {
     long insertionPoint = m_textCtrl->GetInsertionPoint();
@@ -1705,10 +1832,9 @@ void RichTextFrame::OnIdle(wxIdleEvent& WXUNUSED(event))
                 alignment = wxT("left-aligned");
             else if (attr.GetAlignment() == wxTEXT_ALIGNMENT_JUSTIFIED)
                 alignment = wxT("justified");
-            msg.Printf(wxT("Facename: %s, wxColour(%d, %d, %d), %s"),
-                (const wxChar*) facename,
+            msg.Printf( "Facename: %s, wxColour(%d, %d, %d), %s", facename,
                 attr.GetTextColour().Red(), attr.GetTextColour().Green(), attr.GetTextColour().Blue(),
-                (const wxChar*) alignment);
+                alignment );
 
             if (attr.HasFont())
             {