]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/text/text.cpp
added a few encoding convenience methods for pc-mac encoding and string handling...
[wxWidgets.git] / samples / text / text.cpp
index 575c1c4f482be5f5b2035010ba40b514597a137d..ac11396a01b66fd50bcd97acb15fae9fff095291 100644 (file)
@@ -1,15 +1,15 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// 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 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_TOOLTIPS
-    #include "wx/tooltip.h"
+#if wxUSE_FILE
+    #include "wx/file.h"
 #endif
 
 #endif
 
-#if defined(__WXGTK__) || defined(__WXMOTIF__)
-    #include "mondrian.xpm"
+#if wxUSE_TOOLTIPS
+    #include "wx/tooltip.h"
 #endif
 
 // We test for wxUSE_DRAG_AND_DROP also, because data objects may not be
 #endif
 
 // We test for wxUSE_DRAG_AND_DROP also, because data objects may not be
@@ -61,12 +61,20 @@ class MyTextCtrl : public wxTextCtrl
 public:
     MyTextCtrl(wxWindow *parent, wxWindowID id, const wxString &value,
                const wxPoint &pos, const wxSize &size, int style = 0)
 public:
     MyTextCtrl(wxWindow *parent, wxWindowID id, const wxString &value,
                const wxPoint &pos, const wxSize &size, int style = 0)
-        : wxTextCtrl(parent, id, value, pos, size, style) { }
+        : wxTextCtrl(parent, id, value, pos, size, style) { m_hasCapture = FALSE; }
 
     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 OnTextURL(wxTextUrlEvent& event);
+    void OnTextMaxLen(wxCommandEvent& event);
+
+    void OnMouseEvent(wxMouseEvent& event);
+
+    bool m_hasCapture;
+
 private:
     static inline wxChar GetChar(bool on, wxChar c) { return on ? c : _T('-'); }
     void LogEvent(const wxChar *name, wxKeyEvent& event) const;
 private:
     static inline wxChar GetChar(bool on, wxChar c) { return on ? c : _T('-'); }
     void LogEvent(const wxChar *name, wxKeyEvent& event) const;
@@ -87,16 +95,24 @@ public:
     void DoMoveToEndOfText();
     void DoMoveToEndOfEntry();
 
     void DoMoveToEndOfText();
     void DoMoveToEndOfEntry();
 
+    void OnSize( wxSizeEvent &event );
+
     MyTextCtrl    *m_text;
     MyTextCtrl    *m_password;
     MyTextCtrl    *m_enter;
     MyTextCtrl    *m_tab;
     MyTextCtrl    *m_readonly;
     MyTextCtrl    *m_text;
     MyTextCtrl    *m_password;
     MyTextCtrl    *m_enter;
     MyTextCtrl    *m_tab;
     MyTextCtrl    *m_readonly;
+    MyTextCtrl    *m_limited;
 
     MyTextCtrl    *m_multitext;
     MyTextCtrl    *m_horizontal;
 
 
     MyTextCtrl    *m_multitext;
     MyTextCtrl    *m_horizontal;
 
+    MyTextCtrl    *m_textrich;
+
     wxTextCtrl    *m_log;
     wxTextCtrl    *m_log;
+
+private:
+    DECLARE_EVENT_TABLE()
 };
 
 class MyFrame: public wxFrame
 };
 
 class MyFrame: public wxFrame
@@ -118,16 +134,65 @@ public:
         { m_panel->DoCopyToClipboard(); }
 #endif // wxUSE_CLIPBOARD
 
         { m_panel->DoCopyToClipboard(); }
 #endif // wxUSE_CLIPBOARD
 
+    void OnAddTextFreeze( wxCommandEvent& event )
+        { DoAddText(true); }
+    void OnAddText( wxCommandEvent& event )
+        { DoAddText(false); }
+
     void OnMoveToEndOfText( wxCommandEvent &event )
         { m_panel->DoMoveToEndOfText(); }
     void OnMoveToEndOfEntry( wxCommandEvent &event )
         { m_panel->DoMoveToEndOfEntry(); }
 
     void OnMoveToEndOfText( wxCommandEvent &event )
         { m_panel->DoMoveToEndOfText(); }
     void OnMoveToEndOfEntry( wxCommandEvent &event )
         { m_panel->DoMoveToEndOfEntry(); }
 
+    void OnScrollLineDown(wxCommandEvent& event)
+    {
+        if ( !m_panel->m_textrich->LineDown() )
+            wxLogMessage(_T("Already at the bottom"));
+    }
+
+    void OnScrollLineUp(wxCommandEvent& event)
+    {
+        if ( !m_panel->m_textrich->LineUp() )
+            wxLogMessage(_T("Already at the top"));
+    }
+
+    void OnScrollPageDown(wxCommandEvent& event)
+    {
+        if ( !m_panel->m_textrich->PageDown() )
+            wxLogMessage(_T("Already at the bottom"));
+    }
+
+    void OnScrollPageUp(wxCommandEvent& event)
+    {
+        if ( !m_panel->m_textrich->PageUp() )
+            wxLogMessage(_T("Already at the top"));
+    }
+
+    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:
+    void DoAddText(bool freeze)
+    {
+        wxTextCtrl *text = m_panel->m_textrich;
+        if ( freeze )
+            text->Freeze();
+
+        for ( int i = 0; i < 100; i++ )
+            text->AppendText(wxString::Format("Line %i\n", i));
+
+        text->SetInsertionPoint(0);
+
+        if ( freeze )
+            text->Thaw();
+    }
+
     MyPanel *m_panel;
 
     DECLARE_EVENT_TABLE()
     MyPanel *m_panel;
 
     DECLARE_EVENT_TABLE()
@@ -148,6 +213,8 @@ enum
     TEXT_QUIT = 100,
     TEXT_ABOUT,
     TEXT_LOAD,
     TEXT_QUIT = 100,
     TEXT_ABOUT,
     TEXT_LOAD,
+    TEXT_SAVE,
+    TEXT_CLEAR,
 
     // clipboard menu
     TEXT_CLIPBOARD_COPY = 200,
 
     // clipboard menu
     TEXT_CLIPBOARD_COPY = 200,
@@ -157,25 +224,37 @@ enum
     TEXT_TOOLTIPS_SETDELAY = 300,
     TEXT_TOOLTIPS_ENABLE,
 
     TEXT_TOOLTIPS_SETDELAY = 300,
     TEXT_TOOLTIPS_ENABLE,
 
-    // move menu
-    TEXT_MOVE_ENDTEXT = 400,
-    TEXT_MOVE_ENDENTRY
+    // text menu
+    TEXT_ADD_SOME = 400,
+    TEXT_ADD_FREEZE,
+    TEXT_MOVE_ENDTEXT,
+    TEXT_MOVE_ENDENTRY,
+    TEXT_SET_EDITABLE,
+    TEXT_SET_ENABLED,
+    TEXT_LINE_DOWN,
+    TEXT_LINE_UP,
+    TEXT_PAGE_DOWN,
+    TEXT_PAGE_UP,
 };
 
 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 App",
-            50, 50, 640, 420);
+            "Text wxWindows sample", 50, 50, 700, 420);
+    frame->SetSizeHints( 500, 400 );
 
     wxMenu *file_menu = new wxMenu;
 
     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");
@@ -199,10 +278,21 @@ 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_ADD_SOME, "&Append some text\tCtrl-A");
+    menuText->Append(TEXT_ADD_FREEZE, "&Append text with freeze/thaw\tShift-Ctrl-A");
+    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);
+    menuText->AppendSeparator();
+    menuText->Append(TEXT_LINE_DOWN, "Scroll text one line down");
+    menuText->Append(TEXT_LINE_UP, "Scroll text one line up");
+    menuText->Append(TEXT_PAGE_DOWN, "Scroll text one page down");
+    menuText->Append(TEXT_PAGE_DOWN, "Scroll text one page up");
+    menu_bar->Append(menuText, "&Text");
 
     frame->SetMenuBar(menu_bar);
 
 
     frame->SetMenuBar(menu_bar);
 
@@ -222,15 +312,18 @@ 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_TEXT_URL(-1, MyTextCtrl::OnTextURL)
+    EVT_TEXT_MAXLEN(-1, MyTextCtrl::OnTextMaxLen)
+
+    EVT_MOUSE_EVENTS(MyTextCtrl::OnMouseEvent)
 END_EVENT_TABLE()
 
 void MyTextCtrl::LogEvent(const wxChar *name, wxKeyEvent& event) const
 {
     wxString key;
     long keycode = event.KeyCode();
 END_EVENT_TABLE()
 
 void MyTextCtrl::LogEvent(const wxChar *name, wxKeyEvent& event) const
 {
     wxString key;
     long keycode = event.KeyCode();
-    if ( wxIsprint((int)keycode) )
-        key.Printf( _T("'%c'") , (char)keycode);
-    else
     {
         switch ( keycode )
         {
     {
         switch ( keycode )
         {
@@ -337,7 +430,12 @@ void MyTextCtrl::LogEvent(const wxChar *name, wxKeyEvent& event) const
             case WXK_NUMPAD_DECIMAL: key = "NUMPAD_DECIMAL"; break;
 
             default:
             case WXK_NUMPAD_DECIMAL: key = "NUMPAD_DECIMAL"; break;
 
             default:
-                key.Printf( _T("unknown (%ld)"), keycode);
+            {
+               if ( wxIsprint((int)keycode) )
+                   key.Printf( _T("'%c'") , (char)keycode);
+               else
+                   key.Printf( _T("unknown (%ld)"), keycode);
+            }
         }
     }
 
         }
     }
 
@@ -348,13 +446,118 @@ 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') ) );
+}
+
+static wxString GetMouseEventDesc(const wxMouseEvent& ev)
+{
+    // 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
+    {
+        return _T("Unknown mouse event");
+    }
+
+    return wxString::Format(_T("%s mouse button %s"),
+                            button.c_str(),
+                            dbl ? _T("double clicked")
+                                : up ? _T("released") : _T("clicked"));
+}
+
+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
+        {
+            msg = GetMouseEventDesc(ev);
+        }
+
+        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::OnTextMaxLen(wxCommandEvent& event)
+{
+    wxLogMessage(_T("You can't enter more characters into this control."));
+}
 
 
+void MyTextCtrl::OnTextURL(wxTextUrlEvent& event)
+{
+    const wxMouseEvent& ev = event.GetMouseEvent();
+
+    // filter out mouse moves, too many of them
+    if ( ev.Moving() )
+        return;
+
+    long start = event.GetURLStart(),
+         end = event.GetURLEnd();
+
+    wxLogMessage(_T("Mouse event over URL '%s': %s"),
+                 GetValue().Mid(start, end - start).c_str(),
+                 GetMouseEventDesc(ev).c_str());
 }
 
 void MyTextCtrl::OnChar(wxKeyEvent& event)
 {
     LogEvent( _T("Char"), event);
 
 }
 
 void MyTextCtrl::OnChar(wxKeyEvent& event)
 {
     LogEvent( _T("Char"), event);
 
+/*  How are we supposed to test wxTE_PROCESS_TAB with this code?
+
     if ( event.KeyCode() == WXK_TAB )
     {
         WriteText("\t");
     if ( event.KeyCode() == WXK_TAB )
     {
         WriteText("\t");
@@ -363,11 +566,13 @@ void MyTextCtrl::OnChar(wxKeyEvent& event)
     {
         event.Skip();
     }
     {
         event.Skip();
     }
+*/
+    event.Skip();
 }
 
 void MyTextCtrl::OnKeyUp(wxKeyEvent& event)
 {
 }
 
 void MyTextCtrl::OnKeyUp(wxKeyEvent& event)
 {
-    LogEvent( _("Key up"), event);
+    LogEvent( _T("Key up"), event);
 
     event.Skip();
 }
 
     event.Skip();
 }
@@ -386,11 +591,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;
@@ -404,9 +610,37 @@ void MyTextCtrl::OnKeyDown(wxKeyEvent& event)
             // go to position 10
             SetInsertionPoint(10);
             break;
             // go to position 10
             SetInsertionPoint(10);
             break;
+
+        case WXK_F4:
+            if (!m_hasCapture)
+            {
+                wxLogDebug( wxT("Now capturing mouse and events.") );
+                m_hasCapture = TRUE;
+                CaptureMouse();
+            }
+            else
+            {
+                wxLogDebug( wxT("Stopped capturing mouse and events.") );
+                m_hasCapture = TRUE;
+                ReleaseMouse();
+            }
+            break;
+
+        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();
 }
@@ -415,17 +649,26 @@ void MyTextCtrl::OnKeyDown(wxKeyEvent& event)
 // MyPanel
 //----------------------------------------------------------------------
 
 // MyPanel
 //----------------------------------------------------------------------
 
+BEGIN_EVENT_TABLE(MyPanel, wxPanel)
+    EVT_SIZE(MyPanel::OnSize)
+END_EVENT_TABLE()
+
 MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
        : wxPanel( frame, -1, wxPoint(x, y), wxSize(w, h) )
 {
     m_log = new wxTextCtrl( this, -1, "This is the log window.\n", wxPoint(5,260), wxSize(630,100), wxTE_MULTILINE );
 
 MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
        : wxPanel( frame, -1, wxPoint(x, y), wxSize(w, h) )
 {
     m_log = new wxTextCtrl( this, -1, "This is the log window.\n", wxPoint(5,260), wxSize(630,100), wxTE_MULTILINE );
 
-    delete wxLog::SetActiveTarget(new wxLogStderr);
+    wxLog *old_log = wxLog::SetActiveTarget( new wxLogTextCtrl( m_log ) );
+
+    delete old_log;
 
     // 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. " );
@@ -436,61 +679,103 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
     m_readonly = new MyTextCtrl( this, -1, "Read only",
       wxPoint(10,90), wxSize(140,-1), wxTE_READONLY );
 
     m_readonly = new MyTextCtrl( this, -1, "Read only",
       wxPoint(10,90), wxSize(140,-1), wxTE_READONLY );
 
+    m_limited = new MyTextCtrl(this, -1, "Max 8 ch",
+                              wxPoint(10, 130), wxSize(140, -1));
+    m_limited->SetMaxLength(8);
+
     // multi line text controls
 
     // multi line text controls
 
-<<<<<<< controls.cpp
     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_multitext = new MyTextCtrl( this, -1, "Multi line.",
-=======
-    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, wxBOLD));
+    // 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;
 
 
-    m_multitext = new MyTextCtrl( this, ID_TEXT, "Multi line.",
->>>>>>> 1.3
+            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 );
       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
 
 #if wxUSE_TOOLTIPS
-    m_multitext->SetToolTip("Press F1 here.");
+    m_multitext->SetToolTip("Press F1 here for statitics, F4 for capture and uncapture mouse.");
 #endif
 
 #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"));
 
 
-<<<<<<< controls.cpp
-    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 = new MyTextCtrl( this, -1, "Multiline, allow <ENTER> processing.",
-      wxPoint(180,170), wxSize(240,70), wxTE_MULTILINE |  wxTE_PROCESS_ENTER );
-
-    wxButton *button;
-
-    (void)new wxStaticBox( this, -1, "&Move cursor to the end of:", wxPoint(445, 10), wxSize(160, 100) );
-    button = new wxButton( this, ID_MOVE_END_ENTRY, "&Single-line", wxPoint(470, 30), wxSize(110, 30) );
-#if wxUSE_TOOLTIPS
-    button->SetToolTip("Move cursor in single-line text control to end of line.");
-#endif
-    button = new wxButton( this, ID_MOVE_END_ZONE, "&Multi-line", wxPoint(470, 70), wxSize(110, 30) );
-#if wxUSE_TOOLTIPS
-    button->SetToolTip("Move cursor in multi-line text control to end of first line.");
+    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(230, 230),
+                                wxTE_RICH |
+                                wxTE_MULTILINE |
+                                wxTE_AUTO_URL |
+                                wxHSCROLL);
+
+#if 0
+    m_textrich->SetFont(wxFont(12, wxFONTFAMILY_TELETYPE,
+                               wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL));
+    m_textrich->SetStyle(0, 10, *wxRED);
+    m_textrich->SetStyle(10, 20, *wxBLUE);
+    m_textrich->SetStyle(30, 40,
+                         wxTextAttr(*wxGREEN, wxNullColour, *wxITALIC_FONT));
+    m_textrich->SetDefaultStyle(wxTextAttr());
+    m_textrich->AppendText(_T("\n\nFirst 10 characters should be in red\n"));
+    m_textrich->AppendText(_T("Next 10 characters should be in blue\n"));
+    m_textrich->AppendText(_T("Next 10 characters should be normal\n"));
+    m_textrich->AppendText(_T("And the next 10 characters should be green and italic\n"));
+    m_textrich->SetDefaultStyle(wxTextAttr(*wxCYAN, *wxBLUE));
+    m_textrich->AppendText(_T("This text should be cyan on blue\n"));
+    m_textrich->SetDefaultStyle(*wxBLUE);
+    m_textrich->AppendText(_T("And this should be in blue and the text you ")
+                           _T("type should be in blue as well"));
+#else
+    m_textrich->SetDefaultStyle(wxTextAttr(*wxRED));
+    m_textrich->AppendText(_T("Red text\n"));
+    m_textrich->SetDefaultStyle(wxTextAttr(wxNullColour, *wxLIGHT_GREY));
+    m_textrich->AppendText(_T("Red on grey text\n"));
+    m_textrich->SetDefaultStyle(wxTextAttr(*wxBLUE));
+    m_textrich->AppendText(_T("Blue on grey text\n"));
 #endif
 #endif
+}
 
 
-    (void)new wxStaticBox( this, -1, "wx&Clipboard", wxPoint(445,130), wxSize(160,100) );
-    button = new wxButton( this, ID_COPY_TEXT, "C&opy line 1", wxPoint(470,150), wxSize(110,30) );
-#if wxUSE_TOOLTIPS
-    button->SetToolTip("Copy first line of the multi-line text control to the clipboard");
-#endif
-    button = new wxButton( this, ID_PASTE_TEXT, "&Paste text", wxPoint(470,190), wxSize(110,30) );
-#if wxUSE_TOOLTIPS
-    button->SetToolTip("Paste text from clipboard to the end of the multi-line text control.");
-#endif
->>>>>>> 1.3
+void MyPanel::OnSize( wxSizeEvent &event )
+{
+    wxSize client_area( GetClientSize() );
+    m_log->SetSize( 0, 260, client_area.x, client_area.y - 260 );
+    event.Skip();
 }
 
 #if wxUSE_CLIPBOARD
 }
 
 #if wxUSE_CLIPBOARD
@@ -517,7 +802,7 @@ void MyPanel::DoPasteFromClipboard()
     {
         *m_log << "Clipboard supports requested format.\n";
 
     {
         *m_log << "Clipboard supports requested format.\n";
 
-        if (wxTheClipboard->GetData( &data ))
+        if (wxTheClipboard->GetData( data ))
         {
             *m_log << "Successfully retrieved data from the clipboard.\n";
             *m_multitext << data.GetText() << "\n";
         {
             *m_log << "Successfully retrieved data from the clipboard.\n";
             *m_multitext << data.GetText() << "\n";
@@ -539,6 +824,11 @@ void MyPanel::DoPasteFromClipboard()
 
 void MyPanel::DoCopyToClipboard()
 {
 
 void MyPanel::DoCopyToClipboard()
 {
+    // On X11, we want to get the data from the primary selection instead
+    // of the normal clipboard (which isn't normal under X11 at all). This
+    // call has no effect under MSW.
+    wxTheClipboard->UsePrimarySelection();
+
     wxString text( m_multitext->GetLineText(0) );
 
     if (text.IsEmpty())
     wxString text( m_multitext->GetLineText(0) );
 
     if (text.IsEmpty())
@@ -596,18 +886,33 @@ 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_LOAD,   MyFrame::OnFileLoad)
+    EVT_MENU(TEXT_CLEAR,  MyFrame::OnLogClear)
 
 #if wxUSE_TOOLTIPS
     EVT_MENU(TEXT_TOOLTIPS_SETDELAY,  MyFrame::OnSetTooltipDelay)
     EVT_MENU(TEXT_TOOLTIPS_ENABLE,    MyFrame::OnToggleTooltips)
 #endif // wxUSE_TOOLTIPS
 
 
 #if wxUSE_TOOLTIPS
     EVT_MENU(TEXT_TOOLTIPS_SETDELAY,  MyFrame::OnSetTooltipDelay)
     EVT_MENU(TEXT_TOOLTIPS_ENABLE,    MyFrame::OnToggleTooltips)
 #endif // wxUSE_TOOLTIPS
 
+#if wxUSE_CLIPBOARD
     EVT_MENU(TEXT_CLIPBOARD_PASTE,    MyFrame::OnPasteFromClipboard)
     EVT_MENU(TEXT_CLIPBOARD_COPY,     MyFrame::OnCopyToClipboard)
     EVT_MENU(TEXT_CLIPBOARD_PASTE,    MyFrame::OnPasteFromClipboard)
     EVT_MENU(TEXT_CLIPBOARD_COPY,     MyFrame::OnCopyToClipboard)
+#endif // wxUSE_CLIPBOARD
+
+    EVT_MENU(TEXT_ADD_SOME,           MyFrame::OnAddText)
+    EVT_MENU(TEXT_ADD_FREEZE,         MyFrame::OnAddTextFreeze)
     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_MENU(TEXT_LINE_DOWN,          MyFrame::OnScrollLineDown)
+    EVT_MENU(TEXT_LINE_UP,            MyFrame::OnScrollLineUp)
+    EVT_MENU(TEXT_PAGE_DOWN,          MyFrame::OnScrollPageDown)
+    EVT_MENU(TEXT_PAGE_UP,            MyFrame::OnScrollPageUp)
+
     EVT_IDLE(MyFrame::OnIdle)
 END_EVENT_TABLE()
 
     EVT_IDLE(MyFrame::OnIdle)
 END_EVENT_TABLE()
 
@@ -634,18 +939,9 @@ 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);
 
         wxOK | wxICON_INFORMATION);
 
-<<<<<<< controls.cpp
-=======
-    wxMessageDialog dialog(this, "This is a text control sample. It demonstrates the many different text control\n"
-                                 "styles, the use of the clipboard, setting and handling tooltips and intercepting\n"
-                                 "key and char events.\n"
-                                 "\n"
-                                 "Copyright (c) 1999, Robert Roebling, Julian Smart, Vadim Zeitlin",
-                                 "About Text Controls", wxOK );
->>>>>>> 1.3
     dialog.ShowModal();
 
     wxEndBusyCursor();
     dialog.ShowModal();
 
     wxEndBusyCursor();
@@ -685,9 +981,58 @@ void MyFrame::OnToggleTooltips(wxCommandEvent& event)
 }
 #endif // tooltips
 
 }
 #endif // tooltips
 
+void MyFrame::OnLogClear(wxCommandEvent& WXUNUSED(event))
+{
+    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_limited->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)
 {
-    m_panel->m_multitext->LoadFile("controls.cpp");
+    if ( m_panel->m_textrich->LoadFile("dummy.txt") )
+        wxLogStatus(this, _T("Successfully loaded file"));
+    else
+        wxLogStatus(this, _T("Couldn't load the file"));
 }
 
 void MyFrame::OnIdle( wxIdleEvent& event )
 }
 
 void MyFrame::OnIdle( wxIdleEvent& event )