]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/text/text.cpp
Fixed sashwin events
[wxWidgets.git] / samples / text / text.cpp
index d592388bf4480386dd284a16f62b7e6e5b9bdf0a..03895e1d11359a95d9a499391227bdd99bba2e99 100644 (file)
@@ -1,15 +1,16 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        controls.cpp
+// Name:        text.cpp
 // Purpose:     TextCtrl wxWindows sample
 // Author:      Robert Roebling
 // Modified by:
 // RCS-ID:      $Id$
 // Purpose:     TextCtrl wxWindows sample
 // Author:      Robert Roebling
 // Modified by:
 // RCS-ID:      $Id$
-// Copyright:   (c) Robert Roebling, Julian Smart
+// Copyright:   (c) Robert Roebling, Julian Smart, Vadim Zeitlin
 // Licence:     wxWindows license
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
 // Licence:     wxWindows license
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
-    #pragma implementation "controls.h"
+    #pragma interface "text.cpp"
+    #pragma implementation "text.cpp"
 #endif
 
 // For compilers that support precompilation, includes "wx/wx.h".
 #endif
 
 // For compilers that support precompilation, includes "wx/wx.h".
     #include "wx/clipbrd.h"
 #endif
 
     #include "wx/clipbrd.h"
 #endif
 
+#if wxUSE_FILE
+    #include "wx/file.h"
+#endif
+
 #if wxUSE_TOOLTIPS
     #include "wx/tooltip.h"
 #endif
 #if wxUSE_TOOLTIPS
     #include "wx/tooltip.h"
 #endif
@@ -62,8 +67,10 @@ public:
     void OnKeyDown(wxKeyEvent& event);
     void OnKeyUp(wxKeyEvent& event);
     void OnChar(wxKeyEvent& event);
     void OnKeyDown(wxKeyEvent& event);
     void OnKeyUp(wxKeyEvent& event);
     void OnChar(wxKeyEvent& event);
+    void OnText(wxCommandEvent& event);
+    void OnMouseEvent(wxMouseEvent& event);
 
 
-    bool  m_hasCapture;
+    bool m_hasCapture;
 
 private:
     static inline wxChar GetChar(bool on, wxChar c) { return on ? c : _T('-'); }
 
 private:
     static inline wxChar GetChar(bool on, wxChar c) { return on ? c : _T('-'); }
@@ -96,6 +103,8 @@ public:
     MyTextCtrl    *m_multitext;
     MyTextCtrl    *m_horizontal;
 
     MyTextCtrl    *m_multitext;
     MyTextCtrl    *m_horizontal;
 
+    MyTextCtrl    *m_textrich;
+
     wxTextCtrl    *m_log;
 
 private:
     wxTextCtrl    *m_log;
 
 private:
@@ -127,8 +136,12 @@ public:
         { m_panel->DoMoveToEndOfEntry(); }
 
     void OnLogClear(wxCommandEvent& event);
         { m_panel->DoMoveToEndOfEntry(); }
 
     void OnLogClear(wxCommandEvent& event);
+    void OnFileSave(wxCommandEvent& event);
     void OnFileLoad(wxCommandEvent& event);
 
     void OnFileLoad(wxCommandEvent& event);
 
+    void OnSetEditable(wxCommandEvent& event);
+    void OnSetEnabled(wxCommandEvent& event);
+
     void OnIdle( wxIdleEvent& event );
 
 private:
     void OnIdle( wxIdleEvent& event );
 
 private:
@@ -152,6 +165,7 @@ enum
     TEXT_QUIT = 100,
     TEXT_ABOUT,
     TEXT_LOAD,
     TEXT_QUIT = 100,
     TEXT_ABOUT,
     TEXT_LOAD,
+    TEXT_SAVE,
     TEXT_CLEAR,
 
     // clipboard menu
     TEXT_CLEAR,
 
     // clipboard menu
@@ -162,27 +176,31 @@ enum
     TEXT_TOOLTIPS_SETDELAY = 300,
     TEXT_TOOLTIPS_ENABLE,
 
     TEXT_TOOLTIPS_SETDELAY = 300,
     TEXT_TOOLTIPS_ENABLE,
 
-    // move menu
+    // text menu
     TEXT_MOVE_ENDTEXT = 400,
     TEXT_MOVE_ENDTEXT = 400,
-    TEXT_MOVE_ENDENTRY
+    TEXT_MOVE_ENDENTRY,
+    TEXT_SET_EDITABLE,
+    TEXT_SET_ENABLED
 };
 
 bool MyApp::OnInit()
 {
     // Create the main frame window
     MyFrame *frame = new MyFrame((wxFrame *) NULL,
 };
 
 bool MyApp::OnInit()
 {
     // Create the main frame window
     MyFrame *frame = new MyFrame((wxFrame *) NULL,
-            "Text wxWindows sample", 50, 50, 640, 420);
+            "Text wxWindows sample", 50, 50, 660, 420);
     frame->SetSizeHints( 500, 400 );
 
     wxMenu *file_menu = new wxMenu;
     file_menu->Append(TEXT_CLEAR, "&Clear the log\tCtrl-C",
                       "Clear the log window contents");
     frame->SetSizeHints( 500, 400 );
 
     wxMenu *file_menu = new wxMenu;
     file_menu->Append(TEXT_CLEAR, "&Clear the log\tCtrl-C",
                       "Clear the log window contents");
+    file_menu->Append(TEXT_SAVE, "&Save file\tCtrl-S",
+                      "Save the text control contents to file");
     file_menu->Append(TEXT_LOAD, "&Load file\tCtrl-O",
                       "Load the sample file into text control");
     file_menu->AppendSeparator();
     file_menu->Append(TEXT_ABOUT, "&About\tAlt-A");
     file_menu->AppendSeparator();
     file_menu->Append(TEXT_LOAD, "&Load file\tCtrl-O",
                       "Load the sample file into text control");
     file_menu->AppendSeparator();
     file_menu->Append(TEXT_ABOUT, "&About\tAlt-A");
     file_menu->AppendSeparator();
-    file_menu->Append(TEXT_QUIT, "E&xit\tAlt-X", "Quit controls sample");
+    file_menu->Append(TEXT_QUIT, "E&xit\tAlt-X", "Quit this sample");
 
     wxMenuBar *menu_bar = new wxMenuBar( wxMB_DOCKABLE );
     menu_bar->Append(file_menu, "&File");
 
     wxMenuBar *menu_bar = new wxMenuBar( wxMB_DOCKABLE );
     menu_bar->Append(file_menu, "&File");
@@ -206,10 +224,14 @@ bool MyApp::OnInit()
     menu_bar->Append(menuClipboard, "&Clipboard");
 #endif // wxUSE_CLIPBOARD
 
     menu_bar->Append(menuClipboard, "&Clipboard");
 #endif // wxUSE_CLIPBOARD
 
-    wxMenu *menuMove = new wxMenu;
-    menuMove->Append(TEXT_MOVE_ENDTEXT, "To the end of &text");
-    menuMove->Append(TEXT_MOVE_ENDENTRY, "To the end of &entry");
-    menu_bar->Append(menuMove, "&Move");
+    wxMenu *menuText = new wxMenu;
+    menuText->Append(TEXT_MOVE_ENDTEXT, "Move cursor to the end of &text");
+    menuText->Append(TEXT_MOVE_ENDENTRY, "Move cursor to the end of &entry");
+    menuText->Append(TEXT_SET_EDITABLE, "Toggle &editable state", "", TRUE);
+    menuText->Append(TEXT_SET_ENABLED, "Toggle e&nabled state", "", TRUE);
+    menuText->Check(TEXT_SET_EDITABLE, TRUE);
+    menuText->Check(TEXT_SET_ENABLED, TRUE);
+    menu_bar->Append(menuText, "&Text");
 
     frame->SetMenuBar(menu_bar);
 
 
     frame->SetMenuBar(menu_bar);
 
@@ -229,6 +251,8 @@ BEGIN_EVENT_TABLE(MyTextCtrl, wxTextCtrl)
     EVT_KEY_DOWN(MyTextCtrl::OnKeyDown)
     EVT_KEY_UP(MyTextCtrl::OnKeyUp)
     EVT_CHAR(MyTextCtrl::OnChar)
     EVT_KEY_DOWN(MyTextCtrl::OnKeyDown)
     EVT_KEY_UP(MyTextCtrl::OnKeyUp)
     EVT_CHAR(MyTextCtrl::OnChar)
+    EVT_TEXT(-1, MyTextCtrl::OnText)
+    EVT_MOUSE_EVENTS(MyTextCtrl::OnMouseEvent)
 END_EVENT_TABLE()
 
 void MyTextCtrl::LogEvent(const wxChar *name, wxKeyEvent& event) const
 END_EVENT_TABLE()
 
 void MyTextCtrl::LogEvent(const wxChar *name, wxKeyEvent& event) const
@@ -357,7 +381,85 @@ void MyTextCtrl::LogEvent(const wxChar *name, wxKeyEvent& event) const
                   GetChar( event.AltDown(), _T('A') ),
                   GetChar( event.ShiftDown(), _T('S') ),
                   GetChar( event.MetaDown(), _T('M') ) );
                   GetChar( event.AltDown(), _T('A') ),
                   GetChar( event.ShiftDown(), _T('S') ),
                   GetChar( event.MetaDown(), _T('M') ) );
+}
 
 
+void MyTextCtrl::OnMouseEvent(wxMouseEvent& ev)
+{
+    if ( !ev.Moving() )
+    {
+        wxString msg;
+        if ( ev.Entering() )
+        {
+            msg = _T("Mouse entered the window");
+        }
+        else if ( ev.Leaving() )
+        {
+            msg = _T("Mouse left the window");
+        }
+        else
+        {
+            // click event
+            wxString button;
+            bool dbl, up;
+            if ( ev.LeftDown() || ev.LeftUp() || ev.LeftDClick() )
+            {
+                button = _T("Left");
+                dbl = ev.LeftDClick();
+                up = ev.LeftUp();
+            }
+            else if ( ev.MiddleDown() || ev.MiddleUp() || ev.MiddleDClick() )
+            {
+                button = _T("Middle");
+                dbl = ev.MiddleDClick();
+                up = ev.MiddleUp();
+            }
+            else if ( ev.RightDown() || ev.RightUp() || ev.RightDClick() )
+            {
+                button = _T("Right");
+                dbl = ev.RightDClick();
+                up = ev.RightUp();
+            }
+            else
+            {
+                wxLogStatus(_T("Unknown mouse event"));
+                return;
+            }
+
+            msg.Printf(_T("%s mouse button %s"),
+                        button.c_str(),
+                        dbl ? _T("double clicked")
+                            : up ? _T("released") : _T("clicked"));
+        }
+
+        msg << _T(" at (") << ev.GetX() << _T(", ") << ev.GetY() << _T(") ")
+            << _T("Flags: ")
+            << GetChar( ev.LeftIsDown(), _T('1') )
+            << GetChar( ev.MiddleIsDown(), _T('2') )
+            << GetChar( ev.RightIsDown(), _T('3') )
+            << GetChar( ev.ControlDown(), _T('C') )
+            << GetChar( ev.AltDown(), _T('A') )
+            << GetChar( ev.ShiftDown(), _T('S') )
+            << GetChar( ev.MetaDown(), _T('M') );
+
+        wxLogMessage(msg);
+    }
+    //else: we're not interested in mouse move events
+
+    ev.Skip();
+}
+
+void MyTextCtrl::OnText(wxCommandEvent& event)
+{
+    MyTextCtrl *win = (MyTextCtrl *)event.GetEventObject();
+    const wxChar *data = (const wxChar *)(win->GetClientData());
+    if ( data )
+    {
+        wxLogMessage(_T("Text changed in control '%s'"), data);
+    }
+    else
+    {
+        wxLogMessage(_T("Text changed in some control"));
+    }
 }
 
 void MyTextCtrl::OnChar(wxKeyEvent& event)
 }
 
 void MyTextCtrl::OnChar(wxKeyEvent& event)
@@ -380,7 +482,7 @@ void MyTextCtrl::OnChar(wxKeyEvent& event)
 
 void MyTextCtrl::OnKeyUp(wxKeyEvent& event)
 {
 
 void MyTextCtrl::OnKeyUp(wxKeyEvent& event)
 {
-    LogEvent( _("Key up"), event);
+    LogEvent( _T("Key up"), event);
 
     event.Skip();
 }
 
     event.Skip();
 }
@@ -399,11 +501,12 @@ void MyTextCtrl::OnKeyDown(wxKeyEvent& event)
                         "Current line, column: (%ld, %ld)\n"
                         "Number of lines: %ld\n"
                         "Current line length: %ld\n"
                         "Current line, column: (%ld, %ld)\n"
                         "Number of lines: %ld\n"
                         "Current line length: %ld\n"
-                        "Total text length: %ld"),
+                        "Total text length: %u (%ld)"),
                         pos,
                         line, column,
                         GetNumberOfLines(),
                         GetLineLength(line),
                         pos,
                         line, column,
                         GetNumberOfLines(),
                         GetLineLength(line),
+                        GetValue().length(),
                         GetLastPosition());
             }
             break;
                         GetLastPosition());
             }
             break;
@@ -436,9 +539,18 @@ void MyTextCtrl::OnKeyDown(wxKeyEvent& event)
         case WXK_F5:
             // insert a blank line
             WriteText("\n");
         case WXK_F5:
             // insert a blank line
             WriteText("\n");
+            break;
+
+        case WXK_F6:
+            SetValue("F6 was just pressed.");
+            break;
+
+        case WXK_F7:
+            ShowPosition(10);
+            break;
     }
 
     }
 
-    LogEvent( _("Key down"), event);
+    LogEvent( wxT("Key down"), event);
 
     event.Skip();
 }
 
     event.Skip();
 }
@@ -463,7 +575,10 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
     // single line text controls
 
     m_text = new MyTextCtrl( this, -1, "Single line.",
     // single line text controls
 
     m_text = new MyTextCtrl( this, -1, "Single line.",
-      wxPoint(10,10), wxSize(140,-1), 0);
+                             wxPoint(10,10), wxSize(140,-1),
+                             wxTE_PROCESS_ENTER);
+    m_text->SetForegroundColour(*wxBLUE);
+    m_text->SetBackgroundColour(*wxLIGHT_GREY);
     (*m_text) << " Appended.";
     m_text->SetInsertionPoint(0);
     m_text->WriteText( "Prepended. " );
     (*m_text) << " Appended.";
     m_text->SetInsertionPoint(0);
     m_text->WriteText( "Prepended. " );
@@ -478,24 +593,61 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
 
     m_horizontal = new MyTextCtrl( this, -1, "Multiline text control with a horizontal scrollbar.",
       wxPoint(10,170), wxSize(140,70), wxTE_MULTILINE | wxHSCROLL );
 
     m_horizontal = new MyTextCtrl( this, -1, "Multiline text control with a horizontal scrollbar.",
       wxPoint(10,170), wxSize(140,70), wxTE_MULTILINE | wxHSCROLL );
-    m_horizontal->SetFont(wxFont(18, wxSWISS, wxNORMAL, wxNORMAL,
-                                 FALSE, "", wxFONTENCODING_KOI8));
+
+    // a little hack to use the command line argument for encoding testing
+    if ( wxTheApp->argc == 2 )
+    {
+        switch ( wxTheApp->argv[1][0] )
+        {
+            case '2':
+                m_horizontal->SetFont(wxFont(18, wxSWISS, wxNORMAL, wxNORMAL,
+                                             FALSE, "",
+                                             wxFONTENCODING_ISO8859_2));
+                m_horizontal->SetValue("®lu»ouèký kùò zbìsile èe¹tina «»");
+                break;
+
+            default:
+                m_horizontal->SetFont(wxFont(18, wxSWISS, wxNORMAL, wxNORMAL,
+                                             FALSE, "",
+                                             wxFONTENCODING_KOI8));
+                m_horizontal->SetValue("ËÁÖÅÔÓÑ ÕÄÁÞÎÙÍ");
+        }
+    }
+    else
+    {
+        m_horizontal->SetValue("Text in default encoding");
+    }
 
     m_multitext = new MyTextCtrl( this, -1, "Multi line.",
       wxPoint(180,10), wxSize(240,70), wxTE_MULTILINE );
 
     m_multitext = new MyTextCtrl( this, -1, "Multi line.",
       wxPoint(180,10), wxSize(240,70), wxTE_MULTILINE );
+    m_multitext->SetFont(*wxITALIC_FONT);
     (*m_multitext) << " Appended.";
     m_multitext->SetInsertionPoint(0);
     m_multitext->WriteText( "Prepended. " );
     (*m_multitext) << " Appended.";
     m_multitext->SetInsertionPoint(0);
     m_multitext->WriteText( "Prepended. " );
+    m_multitext->SetForegroundColour(*wxRED);
+    m_multitext->SetBackgroundColour(*wxLIGHT_GREY);
 
 #if wxUSE_TOOLTIPS
     m_multitext->SetToolTip("Press F1 here for statitics, F4 for capture and uncapture mouse.");
 #endif
 
 
 #if wxUSE_TOOLTIPS
     m_multitext->SetToolTip("Press F1 here for statitics, F4 for capture and uncapture mouse.");
 #endif
 
-    m_tab = new MyTextCtrl( this, -1, "Multiline, allow <TAB> processing.",
+    m_tab = new MyTextCtrl( this, 100, "Multiline, allow <TAB> processing.",
       wxPoint(180,90), wxSize(240,70), wxTE_MULTILINE |  wxTE_PROCESS_TAB );
       wxPoint(180,90), wxSize(240,70), wxTE_MULTILINE |  wxTE_PROCESS_TAB );
+    m_tab->SetClientData((void *)_T("tab"));
 
 
-    m_enter = new MyTextCtrl( this, -1, "Multiline, allow <ENTER> processing.",
+    m_enter = new MyTextCtrl( this, 100, "Multiline, allow <ENTER> processing.",
       wxPoint(180,170), wxSize(240,70), wxTE_MULTILINE);
       wxPoint(180,170), wxSize(240,70), wxTE_MULTILINE);
+    m_enter->SetClientData((void *)_T("enter"));
+
+    m_textrich = new MyTextCtrl(this, -1, "Allows more than 30Kb of text\n"
+                                "(even under broken Win9x)\n"
+                                "and a very very very very very "
+                                "very very very long line to test"
+                                "wxHSCROLL style",
+                                wxPoint(450, 10), wxSize(200, 230),
+                                wxTE_RICH | wxTE_MULTILINE | wxHSCROLL);
+    m_textrich->SetForegroundColour(wxColour(0, 255, 255));
+    m_textrich->SetBackgroundColour(*wxBLUE);
 }
 
 void MyPanel::OnSize( wxSizeEvent &event )
 }
 
 void MyPanel::OnSize( wxSizeEvent &event )
@@ -613,6 +765,7 @@ void MyPanel::DoMoveToEndOfEntry()
 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_MENU(TEXT_QUIT,   MyFrame::OnQuit)
     EVT_MENU(TEXT_ABOUT,  MyFrame::OnAbout)
 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_MENU(TEXT_QUIT,   MyFrame::OnQuit)
     EVT_MENU(TEXT_ABOUT,  MyFrame::OnAbout)
+    EVT_MENU(TEXT_SAVE,   MyFrame::OnFileSave)
     EVT_MENU(TEXT_LOAD,   MyFrame::OnFileLoad)
     EVT_MENU(TEXT_CLEAR,  MyFrame::OnLogClear)
 
     EVT_MENU(TEXT_LOAD,   MyFrame::OnFileLoad)
     EVT_MENU(TEXT_CLEAR,  MyFrame::OnLogClear)
 
@@ -629,6 +782,9 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_MENU(TEXT_MOVE_ENDTEXT,       MyFrame::OnMoveToEndOfText)
     EVT_MENU(TEXT_MOVE_ENDENTRY,      MyFrame::OnMoveToEndOfEntry)
 
     EVT_MENU(TEXT_MOVE_ENDTEXT,       MyFrame::OnMoveToEndOfText)
     EVT_MENU(TEXT_MOVE_ENDENTRY,      MyFrame::OnMoveToEndOfEntry)
 
+    EVT_MENU(TEXT_SET_EDITABLE,       MyFrame::OnSetEditable)
+    EVT_MENU(TEXT_SET_ENABLED,        MyFrame::OnSetEnabled)
+
     EVT_IDLE(MyFrame::OnIdle)
 END_EVENT_TABLE()
 
     EVT_IDLE(MyFrame::OnIdle)
 END_EVENT_TABLE()
 
@@ -655,7 +811,7 @@ void MyFrame::OnAbout( wxCommandEvent& WXUNUSED(event) )
         "tooltips and intercepting key and char events.\n"
         "\n"
         "Copyright (c) 1999, Robert Roebling, Julian Smart, Vadim Zeitlin",
         "tooltips and intercepting key and char events.\n"
         "\n"
         "Copyright (c) 1999, Robert Roebling, Julian Smart, Vadim Zeitlin",
-        "About Text Controls",
+        "About wxTextCtrl Sample",
         wxOK | wxICON_INFORMATION);
 
     dialog.ShowModal();
         wxOK | wxICON_INFORMATION);
 
     dialog.ShowModal();
@@ -702,9 +858,49 @@ void MyFrame::OnLogClear(wxCommandEvent& WXUNUSED(event))
     m_panel->m_log->Clear();
 }
 
     m_panel->m_log->Clear();
 }
 
+void MyFrame::OnSetEditable(wxCommandEvent& WXUNUSED(event))
+{
+    static bool s_editable = TRUE;
+
+    s_editable = !s_editable;
+    m_panel->m_text->SetEditable(s_editable);
+    m_panel->m_password->SetEditable(s_editable);
+    m_panel->m_multitext->SetEditable(s_editable);
+    m_panel->m_textrich->SetEditable(s_editable);
+}
+
+void MyFrame::OnSetEnabled(wxCommandEvent& WXUNUSED(event))
+{
+    bool enabled = m_panel->m_text->IsEnabled();
+    enabled = !enabled;
+
+    m_panel->m_text->Enable(enabled);
+    m_panel->m_password->Enable(enabled);
+    m_panel->m_multitext->Enable(enabled);
+    m_panel->m_readonly->Enable(enabled);
+    m_panel->m_textrich->Enable(enabled);
+}
+
+void MyFrame::OnFileSave(wxCommandEvent& event)
+{
+    if ( m_panel->m_textrich->SaveFile("dummy.txt") )
+    {
+#if wxUSE_FILE
+        // verify that the fil length is correct (it wasn't under Win95)
+        wxFile file("dummy.txt");
+        wxLogStatus(this, _T("Successfully saved file "
+                             "(text len = %ld, file size = %ld)"),
+                    m_panel->m_textrich->GetValue().length(),
+                    file.Length());
+#endif
+    }
+    else
+        wxLogStatus(this, _T("Couldn't save the file"));
+}
+
 void MyFrame::OnFileLoad(wxCommandEvent& event)
 {
 void MyFrame::OnFileLoad(wxCommandEvent& event)
 {
-    if ( m_panel->m_multitext->LoadFile("text.rc") )
+    if ( m_panel->m_textrich->LoadFile("dummy.txt") )
         wxLogStatus(this, _T("Successfully loaded file"));
     else
         wxLogStatus(this, _T("Couldn't load the file"));
         wxLogStatus(this, _T("Successfully loaded file"));
     else
         wxLogStatus(this, _T("Couldn't load the file"));