]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/controls/controls.cpp
1. Harm's patch for AppendText()
[wxWidgets.git] / samples / controls / controls.cpp
index a824a9a84a0100ba9ef7e6e84752e7fd2c01abf7..2fe910ca8b77d068e41b50f12c27c5835768d590 100644 (file)
@@ -5,46 +5,43 @@
 // Modified by:
 // RCS-ID:      $Id$
 // Copyright:   (c) Robert Roebling, Julian Smart
 // Modified by:
 // RCS-ID:      $Id$
 // Copyright:   (c) Robert Roebling, Julian Smart
-// Licence:    wxWindows license
+// Licence:     wxWindows license
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
-#pragma implementation "controls.h"
+    #pragma implementation "controls.h"
 #endif
 
 // For compilers that support precompilation, includes "wx/wx.h".
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
 #endif
 
 // For compilers that support precompilation, includes "wx/wx.h".
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
 #ifndef WX_PRECOMP
 #endif
 
 #ifndef WX_PRECOMP
-#include "wx/wx.h"
+    #include "wx/wx.h"
 #endif
 
 #include "wx/spinbutt.h"
 #include "wx/notebook.h"
 #include "wx/imaglist.h"
 #endif
 
 #include "wx/spinbutt.h"
 #include "wx/notebook.h"
 #include "wx/imaglist.h"
+#include "wx/spinbutt.h"
 #include "wx/clipbrd.h"
 #include "wx/clipbrd.h"
-#include "wx/checklst.h"
+#include "wx/tooltip.h"
 
 
-// XPM doesn't seem to work under Windows at present. Or, wxNotebook images
-// aren't working.
-// Uncomment this line and comment out the next to try it.
-// #if defined(__WXGTK__) || defined(__WXMOTIF__) || (defined(__WXMSW__) && wxUSE_XPM_IN_MSW)
 #if defined(__WXGTK__) || defined(__WXMOTIF__)
 #if defined(__WXGTK__) || defined(__WXMOTIF__)
-#define USE_XPM
+    #define USE_XPM
 #endif
 
 #ifdef USE_XPM
 #endif
 
 #ifdef USE_XPM
-#include "mondrian.xpm"
-#include "icons/choice.xpm"
-#include "icons/combo.xpm"
-#include "icons/list.xpm"
-#include "icons/radio.xpm"
-#include "icons/text.xpm"
-#include "icons/gauge.xpm"
+    #include "mondrian.xpm"
+    #include "icons/choice.xpm"
+    #include "icons/combo.xpm"
+    #include "icons/list.xpm"
+    #include "icons/radio.xpm"
+    #include "icons/text.xpm"
+    #include "icons/gauge.xpm"
 #endif
 
 //----------------------------------------------------------------------
 #endif
 
 //----------------------------------------------------------------------
 //----------------------------------------------------------------------
 
 class MyApp: public wxApp
 //----------------------------------------------------------------------
 
 class MyApp: public wxApp
-{ 
+{
   public:
     bool OnInit(void);
 };
 
   public:
     bool OnInit(void);
 };
 
+// a text ctrl which allows to call different wxTextCtrl functions
+// interactively by pressing function keys in it
+class MyTextCtrl : public wxTextCtrl
+{
+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) { }
+
+    void OnKeyDown(wxKeyEvent& event);
+
+private:
+    DECLARE_EVENT_TABLE()
+};
+
 class MyPanel: public wxPanel
 {
   public:
 class MyPanel: public wxPanel
 {
   public:
+
     MyPanel(wxFrame *frame, int x, int y, int w, int h);
     virtual ~MyPanel();
     MyPanel(wxFrame *frame, int x, int y, int w, int h);
     virtual ~MyPanel();
-    
+
     void OnSize( wxSizeEvent& event );
     void OnListBox( wxCommandEvent &event );
     void OnSize( wxSizeEvent& event );
     void OnListBox( wxCommandEvent &event );
+    void OnListBoxDoubleClick( wxCommandEvent &event );
     void OnListBoxButtons( wxCommandEvent &event );
     void OnChoice( wxCommandEvent &event );
     void OnChoiceButtons( wxCommandEvent &event );
     void OnListBoxButtons( wxCommandEvent &event );
     void OnChoice( wxCommandEvent &event );
     void OnChoiceButtons( wxCommandEvent &event );
@@ -79,7 +92,9 @@ class MyPanel: public wxPanel
     void OnSpinUpdate( wxSpinEvent &event );
     void OnPasteFromClipboard( wxCommandEvent &event );
     void OnCopyToClipboard( wxCommandEvent &event );
     void OnSpinUpdate( wxSpinEvent &event );
     void OnPasteFromClipboard( wxCommandEvent &event );
     void OnCopyToClipboard( wxCommandEvent &event );
-    
+    void OnMoveToEndOfText( wxCommandEvent &event );
+    void OnMoveToEndOfEntry( wxCommandEvent &event );
+
     wxListBox     *m_listbox;
     wxChoice      *m_choice;
     wxComboBox    *m_combo;
     wxListBox     *m_listbox;
     wxChoice      *m_choice;
     wxComboBox    *m_combo;
@@ -89,35 +104,37 @@ class MyPanel: public wxPanel
     wxButton      *m_fontButton;
     wxSpinButton  *m_spinbutton;
     wxTextCtrl    *m_spintext;
     wxButton      *m_fontButton;
     wxSpinButton  *m_spinbutton;
     wxTextCtrl    *m_spintext;
-    wxTextCtrl    *m_multitext;
+    MyTextCtrl    *m_multitext;
+    MyTextCtrl    *m_textentry;
     wxCheckBox    *m_checkbox;
     wxCheckBox    *m_checkbox;
-    
+
     wxTextCtrl    *m_text;
     wxTextCtrl    *m_text;
-    wxNotebook    *m_notebook;    
-  
-  DECLARE_EVENT_TABLE() 
+    wxNotebook    *m_notebook;
+
+  DECLARE_EVENT_TABLE()
 };
 
 class MyFrame: public wxFrame
 {
   public:
 };
 
 class MyFrame: public wxFrame
 {
   public:
-  
+
     MyFrame(wxFrame *frame, char *title, int x, int y, int w, int h);
     MyFrame(wxFrame *frame, char *title, int x, int y, int w, int h);
-    
+
   public:
   public:
-  
+
     void OnQuit(wxCommandEvent& event);
     void OnAbout(wxCommandEvent& event);
     void OnQuit(wxCommandEvent& event);
     void OnAbout(wxCommandEvent& event);
-    bool OnClose(void) { return TRUE; }
-    
-  DECLARE_EVENT_TABLE()    
+    void OnIdle( wxIdleEvent& event );
+    void OnSize( wxSizeEvent& event );
+
+  DECLARE_EVENT_TABLE()
 };
 
 //----------------------------------------------------------------------
 // main()
 //----------------------------------------------------------------------
 
 };
 
 //----------------------------------------------------------------------
 // main()
 //----------------------------------------------------------------------
 
-IMPLEMENT_APP  (MyApp)
+IMPLEMENT_APP(MyApp)
 
 //----------------------------------------------------------------------
 // MyApp
 
 //----------------------------------------------------------------------
 // MyApp
@@ -130,12 +147,14 @@ const   int MINIMAL_ABOUT  = 102;
 bool MyApp::OnInit(void)
 {
   // Create the main frame window
 bool MyApp::OnInit(void)
 {
   // Create the main frame window
-  MyFrame *frame = new MyFrame((wxFrame *) NULL, (char *) "Controls wxWindows App", 50, 50, 530, 420 );
-  
+  MyFrame *frame = new MyFrame((wxFrame *) NULL,
+                               "Controls wxWindows App",
+                               50, 50, 530, 420);
+
   // Give it an icon
   // The wxICON() macros loads an icon from a resource under Windows
   // and uses an #included XPM image under GTK+ and Motif
   // Give it an icon
   // The wxICON() macros loads an icon from a resource under Windows
   // and uses an #included XPM image under GTK+ and Motif
-  
+
   frame->SetIcon( wxICON(mondrian) );
 
   wxMenu *file_menu = new wxMenu;
   frame->SetIcon( wxICON(mondrian) );
 
   wxMenu *file_menu = new wxMenu;
@@ -147,12 +166,58 @@ bool MyApp::OnInit(void)
   frame->SetMenuBar(menu_bar);
 
   frame->Show(TRUE);
   frame->SetMenuBar(menu_bar);
 
   frame->Show(TRUE);
-  
+
   SetTopWindow(frame);
 
   return TRUE;
 }
 
   SetTopWindow(frame);
 
   return TRUE;
 }
 
+//----------------------------------------------------------------------
+// MyTextCtrl
+//----------------------------------------------------------------------
+
+BEGIN_EVENT_TABLE(MyTextCtrl, wxTextCtrl)
+    EVT_KEY_DOWN(MyTextCtrl::OnKeyDown)
+END_EVENT_TABLE()
+
+void MyTextCtrl::OnKeyDown(wxKeyEvent& event)
+{
+    switch ( event.KeyCode() )
+    {
+        case WXK_F1:
+            // show current position and text length
+            {
+                long line, column, pos = GetInsertionPoint();
+                PositionToXY(pos, &column, &line);
+
+                wxLogMessage("Current position: %ld\n"
+                             "Current line, column: (%ld, %ld)\n"
+                             "Number of lines: %ld\n"
+                             "Current line length: %ld\n"
+                             "Total text length: %ld",
+                             pos,
+                             line, column,
+                             GetNumberOfLines(),
+                             GetLineLength(line),
+                             GetLastPosition());
+            }
+            break;
+
+        case WXK_F2:
+            // go to the end
+            SetInsertionPointEnd();
+            break;
+
+        case WXK_F3:
+            // go to position 10
+            SetInsertionPoint(10);
+            break;
+
+        default:
+            event.Skip();
+    }
+}
+
 //----------------------------------------------------------------------
 // MyPanel
 //----------------------------------------------------------------------
 //----------------------------------------------------------------------
 // MyPanel
 //----------------------------------------------------------------------
@@ -189,6 +254,8 @@ const int  ID_COMBO_ENABLE      = 147;
 const int  ID_TEXT              = 150;
 const int  ID_PASTE_TEXT        = 151;
 const int  ID_COPY_TEXT         = 152;
 const int  ID_TEXT              = 150;
 const int  ID_PASTE_TEXT        = 151;
 const int  ID_COPY_TEXT         = 152;
+const int  ID_MOVE_END_ENTRY    = 153;
+const int  ID_MOVE_END_ZONE     = 154;
 
 const int  ID_RADIOBOX          = 160;
 const int  ID_RADIOBOX_SEL_NUM  = 161;
 
 const int  ID_RADIOBOX          = 160;
 const int  ID_RADIOBOX_SEL_NUM  = 161;
@@ -206,13 +273,11 @@ const int  ID_SLIDER            = 181;
 
 const int  ID_SPIN              = 182;
 
 
 const int  ID_SPIN              = 182;
 
-const int  ID_CHECKLIST         = 190;
-
-
 BEGIN_EVENT_TABLE(MyPanel, wxPanel)
   EVT_SIZE      (                         MyPanel::OnSize)
 BEGIN_EVENT_TABLE(MyPanel, wxPanel)
   EVT_SIZE      (                         MyPanel::OnSize)
-  EVT_NOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK,  MyPanel::OnPageChanged)  
+  EVT_NOTEBOOK_PAGE_CHANGED(ID_NOTEBOOK,  MyPanel::OnPageChanged)
   EVT_LISTBOX   (ID_LISTBOX,              MyPanel::OnListBox)
   EVT_LISTBOX   (ID_LISTBOX,              MyPanel::OnListBox)
+  EVT_LISTBOX_DCLICK(ID_LISTBOX,          MyPanel::OnListBoxDoubleClick)
   EVT_BUTTON    (ID_LISTBOX_SEL_NUM,      MyPanel::OnListBoxButtons)
   EVT_BUTTON    (ID_LISTBOX_SEL_STR,      MyPanel::OnListBoxButtons)
   EVT_BUTTON    (ID_LISTBOX_CLEAR,        MyPanel::OnListBoxButtons)
   EVT_BUTTON    (ID_LISTBOX_SEL_NUM,      MyPanel::OnListBoxButtons)
   EVT_BUTTON    (ID_LISTBOX_SEL_STR,      MyPanel::OnListBoxButtons)
   EVT_BUTTON    (ID_LISTBOX_CLEAR,        MyPanel::OnListBoxButtons)
@@ -228,7 +293,7 @@ BEGIN_EVENT_TABLE(MyPanel, wxPanel)
   EVT_BUTTON    (ID_CHOICE_DELETE,        MyPanel::OnChoiceButtons)
   EVT_BUTTON    (ID_CHOICE_FONT,          MyPanel::OnChoiceButtons)
   EVT_CHECKBOX  (ID_CHOICE_ENABLE,        MyPanel::OnChoiceButtons)
   EVT_BUTTON    (ID_CHOICE_DELETE,        MyPanel::OnChoiceButtons)
   EVT_BUTTON    (ID_CHOICE_FONT,          MyPanel::OnChoiceButtons)
   EVT_CHECKBOX  (ID_CHOICE_ENABLE,        MyPanel::OnChoiceButtons)
-  EVT_CHOICE    (ID_COMBO,                MyPanel::OnCombo)
+  EVT_COMBOBOX  (ID_COMBO,                MyPanel::OnCombo)
   EVT_BUTTON    (ID_COMBO_SEL_NUM,        MyPanel::OnComboButtons)
   EVT_BUTTON    (ID_COMBO_SEL_STR,        MyPanel::OnComboButtons)
   EVT_BUTTON    (ID_COMBO_CLEAR,          MyPanel::OnComboButtons)
   EVT_BUTTON    (ID_COMBO_SEL_NUM,        MyPanel::OnComboButtons)
   EVT_BUTTON    (ID_COMBO_SEL_STR,        MyPanel::OnComboButtons)
   EVT_BUTTON    (ID_COMBO_CLEAR,          MyPanel::OnComboButtons)
@@ -246,34 +311,37 @@ BEGIN_EVENT_TABLE(MyPanel, wxPanel)
   EVT_SPIN      (ID_SPIN,                 MyPanel::OnSpinUpdate)
   EVT_BUTTON    (ID_PASTE_TEXT,           MyPanel::OnPasteFromClipboard)
   EVT_BUTTON    (ID_COPY_TEXT,            MyPanel::OnCopyToClipboard)
   EVT_SPIN      (ID_SPIN,                 MyPanel::OnSpinUpdate)
   EVT_BUTTON    (ID_PASTE_TEXT,           MyPanel::OnPasteFromClipboard)
   EVT_BUTTON    (ID_COPY_TEXT,            MyPanel::OnCopyToClipboard)
+  EVT_BUTTON    (ID_MOVE_END_ZONE,        MyPanel::OnMoveToEndOfText)
+  EVT_BUTTON    (ID_MOVE_END_ENTRY,       MyPanel::OnMoveToEndOfEntry)
 END_EVENT_TABLE()
 
 END_EVENT_TABLE()
 
-MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) :
-  wxPanel( frame, -1, wxPoint(x, y), wxSize(w, h) )
+MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
+       : m_notebook(NULL), m_text(NULL),
+         wxPanel( frame, -1, wxPoint(x, y), wxSize(w, h) )
 {
 //  SetBackgroundColour("cadet blue");
 
   m_text = new wxTextCtrl( this, -1, "This is the log window.\n", wxPoint(0,50), wxSize(100,50), wxTE_MULTILINE );
 //  m_text->SetBackgroundColour("wheat");
 {
 //  SetBackgroundColour("cadet blue");
 
   m_text = new wxTextCtrl( this, -1, "This is the log window.\n", wxPoint(0,50), wxSize(100,50), wxTE_MULTILINE );
 //  m_text->SetBackgroundColour("wheat");
-  
+
   m_notebook = new wxNotebook( this, ID_NOTEBOOK, wxPoint(0,0), wxSize(200,150) );
   m_notebook = new wxNotebook( this, ID_NOTEBOOK, wxPoint(0,0), wxSize(200,150) );
-  
+
   wxString choices[] =
   {
     "This",
     "is one of my",
     "really",
     "wonderful",
   wxString choices[] =
   {
     "This",
     "is one of my",
     "really",
     "wonderful",
-    "examples.",
+    "examples."
   };
   };
-  
+
 #ifdef USE_XPM
 #ifdef USE_XPM
-  // image ids and names
+  // image ids
   enum
   {
     Image_List, Image_Choice, Image_Combo, Image_Text, Image_Radio, Image_Gauge, Image_Max
   };
   enum
   {
     Image_List, Image_Choice, Image_Combo, Image_Text, Image_Radio, Image_Gauge, Image_Max
   };
-  
+
   // fill the image list
   wxImageList *imagelist = new wxImageList(32, 32);
 
   // fill the image list
   wxImageList *imagelist = new wxImageList(32, 32);
 
@@ -283,6 +351,30 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) :
   imagelist-> Add( wxBitmap( text_xpm ));
   imagelist-> Add( wxBitmap( radio_xpm ));
   imagelist-> Add( wxBitmap( gauge_xpm ));
   imagelist-> Add( wxBitmap( text_xpm ));
   imagelist-> Add( wxBitmap( radio_xpm ));
   imagelist-> Add( wxBitmap( gauge_xpm ));
+  m_notebook->SetImageList(imagelist);
+#elif defined(__WXMSW__)
+  // load images from resources
+  enum
+  {
+    Image_List, Image_Choice, Image_Combo, Image_Text, Image_Radio, Image_Gauge, Image_Max
+  };
+  wxImageList *imagelist = new wxImageList(32, 32, FALSE, Image_Max);
+
+  static const char *s_iconNames[Image_Max] =
+  {
+      "list", "choice", "combo", "text", "radio", "gauge"
+  };
+
+  for ( size_t n = 0; n < Image_Max; n++ )
+  {
+      wxBitmap bmp(s_iconNames[n]);
+      if ( !bmp.Ok() || (imagelist->Add(bmp) == -1) )
+      {
+          wxLogWarning("Couldn't load the image '%s' for the notebook page %d.",
+                       s_iconNames[n], n);
+      }
+  }
+
   m_notebook->SetImageList(imagelist);
 #else
 
   m_notebook->SetImageList(imagelist);
 #else
 
@@ -297,31 +389,28 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) :
 
 #endif
 
 
 #endif
 
-  wxButton *button = (wxButton*)NULL;
-
-//  m_notebook->SetBackgroundColour("cadet blue");
-
+  wxButton *button = (wxButton*) NULL;  /* who did this ? */
   wxPanel *panel = (wxPanel*) NULL;
   wxPanel *panel = (wxPanel*) NULL;
+
   panel = new wxPanel(m_notebook);
   panel = new wxPanel(m_notebook);
-//  panel->SetBackgroundColour("cadet blue");
-//  panel->SetForegroundColour("blue");
   m_listbox = new wxListBox( panel, ID_LISTBOX, wxPoint(10,10), wxSize(120,70), 5, choices );
   m_listbox = new wxListBox( panel, ID_LISTBOX, wxPoint(10,10), wxSize(120,70), 5, choices );
-//  m_listbox->SetBackgroundColour("wheat");
+  m_listbox->SetToolTip( "This is a list box" );
+
   (void)new wxButton( panel, ID_LISTBOX_SEL_NUM, "Select #2", wxPoint(180,30), wxSize(140,30) );
   (void)new wxButton( panel, ID_LISTBOX_SEL_STR, "Select 'This'", wxPoint(340,30), wxSize(140,30) );
   (void)new wxButton( panel, ID_LISTBOX_CLEAR, "Clear", wxPoint(180,80), wxSize(140,30) );
   (void)new wxButton( panel, ID_LISTBOX_APPEND, "Append 'Hi!'", wxPoint(340,80), wxSize(140,30) );
   (void)new wxButton( panel, ID_LISTBOX_DELETE, "Delete selected item", wxPoint(180,130), wxSize(140,30) );
   button = new wxButton( panel, ID_LISTBOX_FONT, "Set Italic font", wxPoint(340,130), wxSize(140,30) );
   (void)new wxButton( panel, ID_LISTBOX_SEL_NUM, "Select #2", wxPoint(180,30), wxSize(140,30) );
   (void)new wxButton( panel, ID_LISTBOX_SEL_STR, "Select 'This'", wxPoint(340,30), wxSize(140,30) );
   (void)new wxButton( panel, ID_LISTBOX_CLEAR, "Clear", wxPoint(180,80), wxSize(140,30) );
   (void)new wxButton( panel, ID_LISTBOX_APPEND, "Append 'Hi!'", wxPoint(340,80), wxSize(140,30) );
   (void)new wxButton( panel, ID_LISTBOX_DELETE, "Delete selected item", wxPoint(180,130), wxSize(140,30) );
   button = new wxButton( panel, ID_LISTBOX_FONT, "Set Italic font", wxPoint(340,130), wxSize(140,30) );
-//  button->SetForegroundColour( "red" );
+  button->SetToolTip( "Press here to set italic font" );
+
   m_checkbox = new wxCheckBox( panel, ID_LISTBOX_ENABLE, "Disable", wxPoint(20,130), wxSize(140,30) );
   m_checkbox = new wxCheckBox( panel, ID_LISTBOX_ENABLE, "Disable", wxPoint(20,130), wxSize(140,30) );
-  m_notebook->AddPage(panel, "wxList", FALSE, Image_List);
-  
+  m_checkbox->SetValue(FALSE);
+  m_checkbox->SetToolTip( "Click here to disable the listbox" );
+  m_notebook->AddPage(panel, "wxList", TRUE, Image_List);
+
   panel = new wxPanel(m_notebook);
   panel = new wxPanel(m_notebook);
-//  panel->SetBackgroundColour("cadet blue");
-//  panel->SetForegroundColour("blue");
   m_choice = new wxChoice( panel, ID_CHOICE, wxPoint(10,10), wxSize(120,-1), 5, choices );
   m_choice = new wxChoice( panel, ID_CHOICE, wxPoint(10,10), wxSize(120,-1), 5, choices );
-//  m_choice->SetBackgroundColour("wheat");
   (void)new wxButton( panel, ID_CHOICE_SEL_NUM, "Select #2", wxPoint(180,30), wxSize(140,30) );
   (void)new wxButton( panel, ID_CHOICE_SEL_STR, "Select 'This'", wxPoint(340,30), wxSize(140,30) );
   (void)new wxButton( panel, ID_CHOICE_CLEAR, "Clear", wxPoint(180,80), wxSize(140,30) );
   (void)new wxButton( panel, ID_CHOICE_SEL_NUM, "Select #2", wxPoint(180,30), wxSize(140,30) );
   (void)new wxButton( panel, ID_CHOICE_SEL_STR, "Select 'This'", wxPoint(340,30), wxSize(140,30) );
   (void)new wxButton( panel, ID_CHOICE_CLEAR, "Clear", wxPoint(180,80), wxSize(140,30) );
@@ -330,12 +419,9 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) :
   (void)new wxButton( panel, ID_CHOICE_FONT, "Set Italic font", wxPoint(340,130), wxSize(140,30) );
   (void)new wxCheckBox( panel, ID_CHOICE_ENABLE, "Disable", wxPoint(20,130), wxSize(140,30) );
   m_notebook->AddPage(panel, "wxChoice", FALSE, Image_Choice);
   (void)new wxButton( panel, ID_CHOICE_FONT, "Set Italic font", wxPoint(340,130), wxSize(140,30) );
   (void)new wxCheckBox( panel, ID_CHOICE_ENABLE, "Disable", wxPoint(20,130), wxSize(140,30) );
   m_notebook->AddPage(panel, "wxChoice", FALSE, Image_Choice);
-  
+
   panel = new wxPanel(m_notebook);
   panel = new wxPanel(m_notebook);
-//  panel->SetBackgroundColour("cadet blue");
-//  panel->SetForegroundColour("blue");
   m_combo = new wxComboBox( panel, ID_COMBO, "This", wxPoint(10,10), wxSize(120,-1), 5, choices );
   m_combo = new wxComboBox( panel, ID_COMBO, "This", wxPoint(10,10), wxSize(120,-1), 5, choices );
-//  m_combo->SetBackgroundColour("wheat");
   (void)new wxButton( panel, ID_COMBO_SEL_NUM, "Select #2", wxPoint(180,30), wxSize(140,30) );
   (void)new wxButton( panel, ID_COMBO_SEL_STR, "Select 'This'", wxPoint(340,30), wxSize(140,30) );
   (void)new wxButton( panel, ID_COMBO_CLEAR, "Clear", wxPoint(180,80), wxSize(140,30) );
   (void)new wxButton( panel, ID_COMBO_SEL_NUM, "Select #2", wxPoint(180,30), wxSize(140,30) );
   (void)new wxButton( panel, ID_COMBO_SEL_STR, "Select 'This'", wxPoint(340,30), wxSize(140,30) );
   (void)new wxButton( panel, ID_COMBO_CLEAR, "Clear", wxPoint(180,80), wxSize(140,30) );
@@ -344,93 +430,88 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h ) :
   (void)new wxButton( panel, ID_COMBO_FONT, "Set Italic font", wxPoint(340,130), wxSize(140,30) );
   (void)new wxCheckBox( panel, ID_COMBO_ENABLE, "Disable", wxPoint(20,130), wxSize(140,30) );
   m_notebook->AddPage(panel, "wxComboBox", FALSE, Image_Combo);
   (void)new wxButton( panel, ID_COMBO_FONT, "Set Italic font", wxPoint(340,130), wxSize(140,30) );
   (void)new wxCheckBox( panel, ID_COMBO_ENABLE, "Disable", wxPoint(20,130), wxSize(140,30) );
   m_notebook->AddPage(panel, "wxComboBox", FALSE, Image_Combo);
-  
+
   panel = new wxPanel(m_notebook);
   panel = new wxPanel(m_notebook);
-//  panel->SetBackgroundColour("cadet blue");
-//  panel->SetForegroundColour("blue");
-  wxTextCtrl *tc = new wxTextCtrl( panel, ID_TEXT, "Write text here.", wxPoint(10,10), wxSize(320,28));
-  (*tc) << " More text.";
-//  tc->SetBackgroundColour("wheat");
-  m_multitext = new wxTextCtrl( panel, ID_TEXT, "And here.", wxPoint(10,50), wxSize(320,160), wxTE_MULTILINE  );
-  (*m_multitext) << " More text.";
-//  m_multitext->SetBackgroundColour("wheat");
-  (void)new wxStaticBox( panel, -1, "wxClipboard", wxPoint(345,50), wxSize(160,145) );
-  (void)new wxButton( panel, ID_COPY_TEXT, "Copy line 1", wxPoint(370,80), wxSize(110,30) );
-  (void)new wxButton( panel, ID_PASTE_TEXT, "Paste text", wxPoint(370,140), wxSize(110,30) );
+  m_textentry = new MyTextCtrl( panel, -1, "Write text here.", wxPoint(10,10), wxSize(320,28),
+                                wxTE_PROCESS_ENTER);
+  (*m_textentry) << " More text.";          // this text is appended
+  m_textentry->SetInsertionPoint(0);
+  m_textentry->WriteText("Less text.");     // this text is prepended
+
+  m_multitext = new MyTextCtrl( panel, ID_TEXT, "And here.", wxPoint(10,50), wxSize(320,70),
+                                wxTE_MULTILINE );
+  (*m_multitext) << " More text.\nPress function keys to test different \nwxTextCtrl functions.";
+  new MyTextCtrl( panel, -1, "This one is with wxTE_PROCESS_TAB style.",
+                             wxPoint(10,120), wxSize(320,70), wxTE_MULTILINE | wxTE_PROCESS_TAB);
+
+  (void)new wxStaticBox( panel, -1, "&Move cursor to the end of:",
+                         wxPoint(345, 0), wxSize(160, 100) );
+  (void)new wxButton(panel, ID_MOVE_END_ENTRY, "Text &entry",
+                     wxPoint(370, 20), wxSize(110, 30));
+  (void)new wxButton(panel, ID_MOVE_END_ZONE, "Text &zone",
+                     wxPoint(370, 60), wxSize(110, 30));
+  (void)new wxStaticBox( panel, -1, "wx&Clipboard", wxPoint(338,120), wxSize(160,100) );
+  (void)new wxButton( panel, ID_COPY_TEXT, "C&opy line 1", wxPoint(362,140), wxSize(110,30) );
+  (void)new wxButton( panel, ID_PASTE_TEXT, "&Paste text", wxPoint(362,180), wxSize(110,30) );
   m_notebook->AddPage(panel, "wxTextCtrl" , FALSE, Image_Text);
   m_notebook->AddPage(panel, "wxTextCtrl" , FALSE, Image_Text);
-  
+
   wxString choices2[] =
   {
     "Wonderful",
     "examples.",
   };
   wxString choices2[] =
   {
     "Wonderful",
     "examples.",
   };
-  
+
   panel = new wxPanel(m_notebook);
   panel = new wxPanel(m_notebook);
-//  panel->SetBackgroundColour("cadet blue");
-//  panel->SetForegroundColour("blue");
-  m_radio = new wxRadioBox( panel, ID_RADIOBOX, "That", wxPoint(10,160), wxSize(-1,-1), 2, choices2, 1, wxRA_VERTICAL );
-//  m_radio->SetBackgroundColour("wheat");
-  m_radio = new wxRadioBox( panel, ID_RADIOBOX, "This", wxPoint(10,10), wxSize(-1,-1), 5, choices, 1, wxRA_HORIZONTAL );
-//  m_radio->SetBackgroundColour("wheat");
+  (void)new wxRadioBox( panel, ID_RADIOBOX, "That", wxPoint(10,160), wxSize(-1,-1), 2, choices2, 1, wxRA_SPECIFY_ROWS );
+  m_radio = new wxRadioBox( panel, ID_RADIOBOX, "This", wxPoint(10,10), wxSize(-1,-1), 5, choices, 1, wxRA_SPECIFY_COLS );
   (void)new wxButton( panel, ID_RADIOBOX_SEL_NUM, "Select #2", wxPoint(180,30), wxSize(140,30) );
   (void)new wxButton( panel, ID_RADIOBOX_SEL_STR, "Select 'This'", wxPoint(180,80), wxSize(140,30) );
   m_fontButton = new wxButton( panel, ID_SET_FONT, "Set more Italic font", wxPoint(340,30), wxSize(140,30) );
   (void)new wxButton( panel, ID_RADIOBOX_SEL_NUM, "Select #2", wxPoint(180,30), wxSize(140,30) );
   (void)new wxButton( panel, ID_RADIOBOX_SEL_STR, "Select 'This'", wxPoint(180,80), wxSize(140,30) );
   m_fontButton = new wxButton( panel, ID_SET_FONT, "Set more Italic font", wxPoint(340,30), wxSize(140,30) );
-  m_fontButton->SetForegroundColour("blue");
   (void)new wxButton( panel, ID_RADIOBOX_FONT, "Set Italic font", wxPoint(340,80), wxSize(140,30) );
   (void)new wxCheckBox( panel, ID_RADIOBOX_ENABLE, "Disable", wxPoint(340,130), wxSize(140,30) );
   wxRadioButton *rb = new wxRadioButton( panel, ID_RADIOBUTTON_1, "Radiobutton1", wxPoint(210,170), wxSize(110,30) );
   rb->SetValue( FALSE );
   (void)new wxRadioButton( panel, ID_RADIOBUTTON_2, "Radiobutton2", wxPoint(340,170), wxSize(110,30) );
   m_notebook->AddPage(panel, "wxRadioBox", FALSE, Image_Radio);
   (void)new wxButton( panel, ID_RADIOBOX_FONT, "Set Italic font", wxPoint(340,80), wxSize(140,30) );
   (void)new wxCheckBox( panel, ID_RADIOBOX_ENABLE, "Disable", wxPoint(340,130), wxSize(140,30) );
   wxRadioButton *rb = new wxRadioButton( panel, ID_RADIOBUTTON_1, "Radiobutton1", wxPoint(210,170), wxSize(110,30) );
   rb->SetValue( FALSE );
   (void)new wxRadioButton( panel, ID_RADIOBUTTON_2, "Radiobutton2", wxPoint(340,170), wxSize(110,30) );
   m_notebook->AddPage(panel, "wxRadioBox", FALSE, Image_Radio);
-  
+
   panel = new wxPanel(m_notebook);
   panel = new wxPanel(m_notebook);
-//  panel->SetBackgroundColour("cadet blue");
-//  panel->SetForegroundColour("blue");
   (void)new wxStaticBox( panel, -1, "wxGauge and wxSlider", wxPoint(10,10), wxSize(180,130) );
   (void)new wxStaticBox( panel, -1, "wxGauge and wxSlider", wxPoint(10,10), wxSize(180,130) );
-  m_gauge = new wxGauge( panel, -1, 200, wxPoint(18,50), wxSize(155,-1) );
-//  m_gauge->SetBackgroundColour("wheat");
+  m_gauge = new wxGauge( panel, -1, 200, wxPoint(18,50), wxSize(155, 30) );
   m_slider = new wxSlider( panel, ID_SLIDER, 0, 0, 200, wxPoint(18,90), wxSize(155,-1) );
   m_slider = new wxSlider( panel, ID_SLIDER, 0, 0, 200, wxPoint(18,90), wxSize(155,-1) );
-//  m_slider->SetBackgroundColour("wheat");
   (void)new wxStaticBox( panel, -1, "Explanation", wxPoint(200,10), wxSize(290,130) );
   (void)new wxStaticBox( panel, -1, "Explanation", wxPoint(200,10), wxSize(290,130) );
-  (void)new wxStaticText( panel, -1, 
-    "In order see the gauge (aka progress bar)\n" 
-    "control do something you have to drag the\n" 
+#ifdef __WXMOTIF__
+  // No wrapping text in wxStaticText yet :-(
+  (void)new wxStaticText( panel, -1,
+    "Drag the slider!",
+    wxPoint(208,30),
+    wxSize(210, -1)
+    );
+#else
+  (void)new wxStaticText( panel, -1,
+    "In order see the gauge (aka progress bar)\n"
+    "control do something you have to drag the\n"
     "handle of the slider to the right.\n"
     "\n"
     "This is also supposed to demonstrate how\n"
     "to use static controls.\n",
     "handle of the slider to the right.\n"
     "\n"
     "This is also supposed to demonstrate how\n"
     "to use static controls.\n",
-    wxPoint(208,25) );
+    wxPoint(208,25),
+    wxSize(250, 110)
+    );
+#endif
   m_spintext = new wxTextCtrl( panel, -1, "0", wxPoint(20,160), wxSize(80,-1) );
   m_spintext = new wxTextCtrl( panel, -1, "0", wxPoint(20,160), wxSize(80,-1) );
-//  m_spintext->SetBackgroundColour("wheat");
   m_spinbutton = new wxSpinButton( panel, ID_SPIN, wxPoint(103,159), wxSize(-1,-1) );
   m_spinbutton = new wxSpinButton( panel, ID_SPIN, wxPoint(103,159), wxSize(-1,-1) );
-//  m_spinbutton->SetBackgroundColour("wheat");
-  m_spinbutton->SetRange(0,100); 
+  m_spinbutton->SetRange(0,100);
   m_notebook->AddPage(panel, "wxGauge", FALSE, Image_Gauge);
   m_notebook->AddPage(panel, "wxGauge", FALSE, Image_Gauge);
-  
-  panel = new wxPanel(m_notebook);
-//  panel->SetBackgroundColour("cadet blue");
-//  panel->SetForegroundColour("blue");
-  m_listbox = new wxCheckListBox( panel, ID_CHECKLIST, wxPoint(10,10), wxSize(160,70), 5, choices );
-//  m_listbox->SetBackgroundColour("wheat");
-  button = new wxButton( panel, ID_LISTBOX_FONT, "Set Italic font", wxPoint(340,130), wxSize(140,30) );
-  m_notebook->AddPage(panel, "wxCheckListBox", FALSE, Image_List);
 }
 
 void MyPanel::OnPasteFromClipboard( wxCommandEvent &WXUNUSED(event) )
 {
 #ifdef __WXGTK__
 
 }
 
 void MyPanel::OnPasteFromClipboard( wxCommandEvent &WXUNUSED(event) )
 {
 #ifdef __WXGTK__
 
-  if (!wxTheClipboard->IsSupportedFormat( wxDF_TEXT ))
-  {
-     *m_text << "The clipboard doesn't contain any data in the requested format." << "\n";
-     
-     return;
-  }
-
   if (!wxTheClipboard->Open())
   {
      *m_text << "Error opening the clipboard." << "\n";
   if (!wxTheClipboard->Open())
   {
      *m_text << "Error opening the clipboard." << "\n";
-     
+
      return;
   }
   else
      return;
   }
   else
@@ -438,23 +519,30 @@ void MyPanel::OnPasteFromClipboard( wxCommandEvent &WXUNUSED(event) )
      *m_text << "Successfully opened the clipboard." << "\n";
   }
 
      *m_text << "Successfully opened the clipboard." << "\n";
   }
 
-  wxTextDataObject *data = new wxTextDataObject();
-  
-  if (wxTheClipboard->GetData( data ))
+  wxTextDataObject data;
+
+  if (wxTheClipboard->IsSupported( data ))
   {
   {
-     *m_text << "Successfully retrieved data from the clipboard." << "\n";
-     *m_multitext << data->GetText() << "\n";
+     *m_text << "Clipboard supports requested format." << "\n";
+     
+     if (wxTheClipboard->GetData( data ))
+     {
+         *m_text << "Successfully retrieved data from the clipboard." << "\n";
+         *m_multitext << data.GetText() << "\n";
+     }
+     else
+     {
+        *m_text << "Error getting data from the clipboard." << "\n";
+     }
   }
   else
   {
   }
   else
   {
-     *m_text << "Error getting data from the clipboard." << "\n";
+     *m_text << "Clipboard doesn't support requested format." << "\n";
   }
   }
-     
+
   wxTheClipboard->Close();
   wxTheClipboard->Close();
-  
+
   *m_text << "Closed the clipboard." << "\n";
   *m_text << "Closed the clipboard." << "\n";
-  
-  delete data;
 
 #endif
 }
 
 #endif
 }
@@ -462,17 +550,15 @@ void MyPanel::OnPasteFromClipboard( wxCommandEvent &WXUNUSED(event) )
 void MyPanel::OnCopyToClipboard( wxCommandEvent &WXUNUSED(event) )
 {
 #ifdef __WXGTK__
 void MyPanel::OnCopyToClipboard( wxCommandEvent &WXUNUSED(event) )
 {
 #ifdef __WXGTK__
-  
+
   wxString text( m_multitext->GetLineText(0) );
 
   if (text.IsEmpty()) return;
   wxString text( m_multitext->GetLineText(0) );
 
   if (text.IsEmpty()) return;
-  
-  wxTextDataObject *data = new wxTextDataObject( text );
-  
+
   if (!wxTheClipboard->Open())
   {
      *m_text << "Error opening the clipboard." << "\n";
   if (!wxTheClipboard->Open())
   {
      *m_text << "Error opening the clipboard." << "\n";
-     
+
      return;
   }
   else
      return;
   }
   else
@@ -480,6 +566,8 @@ void MyPanel::OnCopyToClipboard( wxCommandEvent &WXUNUSED(event) )
      *m_text << "Successfully opened the clipboard." << "\n";
   }
 
      *m_text << "Successfully opened the clipboard." << "\n";
   }
 
+  wxTextDataObject *data = new wxTextDataObject( text );
+
   if (!wxTheClipboard->SetData( data ))
   {
      *m_text << "Error while copying to the clipboard." << "\n";
   if (!wxTheClipboard->SetData( data ))
   {
      *m_text << "Error while copying to the clipboard." << "\n";
@@ -490,18 +578,30 @@ void MyPanel::OnCopyToClipboard( wxCommandEvent &WXUNUSED(event) )
   }
 
   wxTheClipboard->Close();
   }
 
   wxTheClipboard->Close();
-  
+
   *m_text << "Closed the clipboard." << "\n";
   *m_text << "Closed the clipboard." << "\n";
-  
+
 #endif
 }
 
 #endif
 }
 
+void MyPanel::OnMoveToEndOfText( wxCommandEvent &event )
+{
+    m_multitext->SetInsertionPointEnd();
+    m_multitext->SetFocus();
+}
+
+void MyPanel::OnMoveToEndOfEntry( wxCommandEvent &event )
+{
+    m_textentry->SetInsertionPointEnd();
+    m_textentry->SetFocus();
+}
+
 void MyPanel::OnSize( wxSizeEvent& WXUNUSED(event) )
 {
   int x = 0;
   int y = 0;
   GetClientSize( &x, &y );
 void MyPanel::OnSize( wxSizeEvent& WXUNUSED(event) )
 {
   int x = 0;
   int y = 0;
   GetClientSize( &x, &y );
-  
+
   if (m_notebook) m_notebook->SetSize( 2, 2, x-4, y*2/3-4 );
   if (m_text) m_text->SetSize( 2, y*2/3+2, x-4, y/3-4 );
 }
   if (m_notebook) m_notebook->SetSize( 2, 2, x-4, y*2/3-4 );
   if (m_text) m_text->SetSize( 2, y*2/3+2, x-4, y/3-4 );
 }
@@ -513,9 +613,16 @@ void MyPanel::OnPageChanged( wxNotebookEvent &event )
 
 void MyPanel::OnListBox( wxCommandEvent &event )
 {
 
 void MyPanel::OnListBox( wxCommandEvent &event )
 {
-  m_text->WriteText( "ListBox selection string is: " );
-  m_text->WriteText( event.GetString() );
-  m_text->WriteText( "\n" );
+  m_text->AppendText( "ListBox selection string is: " );
+  m_text->AppendText( event.GetString() );
+  m_text->AppendText( "\n" );
+}
+
+void MyPanel::OnListBoxDoubleClick( wxCommandEvent &event )
+{
+  m_text->AppendText( "ListBox double click string is: " );
+  m_text->AppendText( event.GetString() );
+  m_text->AppendText( "\n" );
 }
 
 void MyPanel::OnListBoxButtons( wxCommandEvent &event )
 }
 
 void MyPanel::OnListBoxButtons( wxCommandEvent &event )
@@ -524,7 +631,13 @@ void MyPanel::OnListBoxButtons( wxCommandEvent &event )
   {
     case ID_LISTBOX_ENABLE:
     {
   {
     case ID_LISTBOX_ENABLE:
     {
-      m_listbox->Enable( !((bool)event.GetInt()) );
+      m_text->AppendText("Checkbox clicked.\n");
+      wxCheckBox *cb = (wxCheckBox*)event.GetEventObject();
+      if (event.GetInt())
+        cb->SetToolTip( "Click to enable listbox" );
+      else
+        cb->SetToolTip( "Click to disable listbox" );
+      m_listbox->Enable( event.GetInt() == 0 );
       break;
     }
     case ID_LISTBOX_SEL_NUM:
       break;
     }
     case ID_LISTBOX_SEL_NUM:
@@ -564,9 +677,9 @@ void MyPanel::OnListBoxButtons( wxCommandEvent &event )
 
 void MyPanel::OnChoice( wxCommandEvent &event )
 {
 
 void MyPanel::OnChoice( wxCommandEvent &event )
 {
-  m_text->WriteText( "Choice selection string is: " );
-  m_text->WriteText( event.GetString() );
-  m_text->WriteText( "\n" );
+  m_text->AppendText( "Choice selection string is: " );
+  m_text->AppendText( event.GetString() );
+  m_text->AppendText( "\n" );
 }
 
 void MyPanel::OnChoiceButtons( wxCommandEvent &event )
 }
 
 void MyPanel::OnChoiceButtons( wxCommandEvent &event )
@@ -575,7 +688,7 @@ void MyPanel::OnChoiceButtons( wxCommandEvent &event )
   {
     case ID_CHOICE_ENABLE:
     {
   {
     case ID_CHOICE_ENABLE:
     {
-      m_choice->Enable( !((bool)event.GetInt()) );
+      m_choice->Enable( event.GetInt() == 0 );
       break;
     }
     case ID_CHOICE_SEL_NUM:
       break;
     }
     case ID_CHOICE_SEL_NUM:
@@ -614,9 +727,9 @@ void MyPanel::OnChoiceButtons( wxCommandEvent &event )
 
 void MyPanel::OnCombo( wxCommandEvent &event )
 {
 
 void MyPanel::OnCombo( wxCommandEvent &event )
 {
-  m_text->WriteText( "ComboBox selection string is: " );
-  m_text->WriteText( event.GetString() );
-  m_text->WriteText( "\n" );
+  m_text->AppendText( "ComboBox selection string is: " );
+  m_text->AppendText( event.GetString() );
+  m_text->AppendText( "\n" );
 }
 
 void MyPanel::OnComboButtons( wxCommandEvent &event )
 }
 
 void MyPanel::OnComboButtons( wxCommandEvent &event )
@@ -625,7 +738,7 @@ void MyPanel::OnComboButtons( wxCommandEvent &event )
   {
     case ID_COMBO_ENABLE:
     {
   {
     case ID_COMBO_ENABLE:
     {
-      m_combo->Enable( !((bool)event.GetInt()) );
+      m_combo->Enable( event.GetInt() == 0 );
       break;
     }
     case ID_COMBO_SEL_NUM:
       break;
     }
     case ID_COMBO_SEL_NUM:
@@ -664,9 +777,9 @@ void MyPanel::OnComboButtons( wxCommandEvent &event )
 
 void MyPanel::OnRadio( wxCommandEvent &event )
 {
 
 void MyPanel::OnRadio( wxCommandEvent &event )
 {
-  m_text->WriteText( "RadioBox selection string is: " );
-  m_text->WriteText( event.GetString() );
-  m_text->WriteText( "\n" );
+  m_text->AppendText( "RadioBox selection string is: " );
+  m_text->AppendText( event.GetString() );
+  m_text->AppendText( "\n" );
 }
 
 void MyPanel::OnRadioButtons( wxCommandEvent &event )
 }
 
 void MyPanel::OnRadioButtons( wxCommandEvent &event )
@@ -675,7 +788,7 @@ void MyPanel::OnRadioButtons( wxCommandEvent &event )
   {
     case ID_RADIOBOX_ENABLE:
     {
   {
     case ID_RADIOBOX_ENABLE:
     {
-      m_radio->Enable( !((bool)event.GetInt()) );
+      m_radio->Enable( event.GetInt() == 0 );
       break;
     }
     case ID_RADIOBOX_SEL_NUM:
       break;
     }
     case ID_RADIOBOX_SEL_NUM:
@@ -726,12 +839,16 @@ MyPanel::~MyPanel()
 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_MENU(MINIMAL_QUIT,   MyFrame::OnQuit)
     EVT_MENU(MINIMAL_ABOUT,  MyFrame::OnAbout)
 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_MENU(MINIMAL_QUIT,   MyFrame::OnQuit)
     EVT_MENU(MINIMAL_ABOUT,  MyFrame::OnAbout)
+    EVT_SIZE(MyFrame::OnSize)
+    EVT_IDLE(MyFrame::OnIdle)
 END_EVENT_TABLE()
 
 END_EVENT_TABLE()
 
-MyFrame::MyFrame(wxFrame *frame, char *title, int x, int y, int w, int h):
-  wxFrame(frame, -1, title, wxPoint(x, y), wxSize(w, h))
+MyFrame::MyFrame(wxFrame *frame, char *title, int x, int y, int w, int h)
+       : wxFrame(frame, -1, title, wxPoint(x, y), wxSize(w, h))
 {
 {
-  (void)new MyPanel( this, 10, 10, 300, 100 );
+    CreateStatusBar(2);
+
+    (void)new MyPanel( this, 10, 10, 300, 100 );
 }
 
 void MyFrame::OnQuit (wxCommandEvent& WXUNUSED(event) )
 }
 
 void MyFrame::OnQuit (wxCommandEvent& WXUNUSED(event) )
@@ -744,3 +861,36 @@ void MyFrame::OnAbout( wxCommandEvent& WXUNUSED(event) )
   wxMessageDialog dialog(this, "This is a control sample", "About Controls", wxOK );
   dialog.ShowModal();
 }
   wxMessageDialog dialog(this, "This is a control sample", "About Controls", wxOK );
   dialog.ShowModal();
 }
+
+void MyFrame::OnSize( wxSizeEvent& event )
+{
+    wxString msg;
+    msg.Printf("%dx%d", event.GetSize().x, event.GetSize().y);
+    SetStatusText(msg, 1);
+
+    event.Skip();
+}
+
+void MyFrame::OnIdle( wxIdleEvent& WXUNUSED(event) )
+{
+    // track the window which has the focus in the status bar
+    static wxWindow *s_windowFocus = (wxWindow *)NULL;
+    wxWindow *focus = wxWindow::FindFocus();
+    if ( focus && (focus != s_windowFocus) )
+    {
+        s_windowFocus = focus;
+
+        wxString msg;
+        msg.Printf("Focus: wxWindow = %p"
+#ifdef __WXMSW__
+                   ", HWND = %08x"
+#endif // wxMSW
+                   , s_windowFocus
+#ifdef __WXMSW__
+                   , s_windowFocus->GetHWND()
+#endif // wxMSW
+                  );
+
+        SetStatusText(msg);
+    }
+}
\ No newline at end of file