From 5ef2e6333e6355ac6c925b07909408a631c5ee26 Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Tue, 14 Dec 1999 02:02:09 +0000
Subject: [PATCH] added support for vertical toolbars for MSW - seems to work
 more or less

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4936 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/latex/wx/toolbar.tex           | 177 ++++++++++++++----------
 docs/latex/wx/tsamples.tex          |  21 +++
 samples/controls/controls.cpp       |   5 +
 samples/toolbar/bitmaps/preview.xpm |   2 +-
 samples/toolbar/toolbar.cpp         | 206 +++++++++++++++-------------
 samples/toolbar/toolbar.rc          |  17 ++-
 6 files changed, 250 insertions(+), 178 deletions(-)

diff --git a/docs/latex/wx/toolbar.tex b/docs/latex/wx/toolbar.tex
index 1c4942264c..39465088d1 100644
--- a/docs/latex/wx/toolbar.tex
+++ b/docs/latex/wx/toolbar.tex
@@ -168,7 +168,7 @@ Adds a separator for spacing groups of tools.
 
 \membersection{wxToolBar::AddTool}\label{wxtoolbaraddtool}
 
-\func{wxToolBarTool*}{AddTool}{\param{int}{ toolIndex}, \param{const wxBitmap\&}{ bitmap1},\rtfsp
+\func{wxToolBarTool*}{AddTool}{\param{int}{ toolId}, \param{const wxBitmap\&}{ bitmap1},\rtfsp
 \param{const wxBitmap\&}{ bitmap2 = wxNullBitmap}, \param{bool}{ isToggle = FALSE},\rtfsp
 \param{long}{ xPos = -1}, \param{long}{ yPos = -1},\rtfsp
 \param{wxObject* }{clientData = NULL}, \param{const wxString\& }{shortHelpString = ""}, \param{const wxString\& }{longHelpString = ""}}
@@ -177,7 +177,7 @@ Adds a tool to the toolbar.
 
 \wxheading{Parameters}
 
-\docparam{toolIndex}{An integer by which
+\docparam{toolId}{An integer by which
 the tool may be identified in subsequent operations.}
 
 \docparam{isToggle}{Specifies whether the tool is a toggle or not: a toggle tool may be in
@@ -198,11 +198,10 @@ as a pressed button (GTK). }
 \docparam{clientData}{An optional pointer to client data which can be
 retrieved later using \helpref{wxToolBar::GetToolClientData}{wxtoolbargettoolclientdata}.}
 
-\docparam{shortHelpString}{Used for displaying a tooltip for the tool in the
-Windows 95 implementation of wxButtonBar. Pass the empty string if this is not required.}
+\docparam{shortHelpString}{This string is used for the tools tooltip}
 
-\docparam{longHelpString}{Used to displayer longer help, such as status line help.
-Pass the empty string if this is not required.}
+\docparam{longHelpString}{This string is shown in the statusbar (if any) of the
+parent frame when the mouse pointer is inside the tool}
 
 \wxheading{Remarks}
 
@@ -212,45 +211,43 @@ order to have the tools appear.
 \wxheading{See also}
 
 \helpref{wxToolBar::AddSeparator}{wxtoolbaraddseparator},
+\helpref{wxToolBar::InsertTool}{wxtoolbarinserttool},
+\helpref{wxToolBar::DeleteTool}{wxtoolbardeletetool},
 \helpref{wxToolBar::Realize}{wxtoolbarrealize},
 
-\membersection{wxToolBar::CreateTools}\label{wxtoolbarcreatetools}
+\membersection{wxToolBar::DeleteTool}\label{wxtoolbardeletetool}
 
-\func{bool}{CreateTools}{\void}
+\func{bool}{DeleteTool}{\param{int }{toolId}}
 
-This function is implemented for some toolbar classes to create the tools and display them.
-The portable way of calling it is to call \helpref{wxToolBar::Realize}{wxtoolbarrealize} after
-you have added tools and separators.
+Removes the specified tool from the toolbar and deletes it. If you don't want
+to delete the tool, but just to remove it from the toolbar (to possibly add it
+back later), you may use \helpref{RemoveTool}{wxtoolbarremovetool} instead.
 
-\wxheading{See also}
-
-\helpref{wxToolBar::AddTool}{wxtoolbaraddtool}, \helpref{wxToolBar::Realize}{wxtoolbarrealize}
-
-\membersection{wxToolBar::DrawTool}\label{wxtoolbardrawtool}
+Note that it is unnecessary to call \helpref{Realize}{wxtoolbarrealize} for the
+change to take place, it will happen immediately.
 
-\func{void}{DrawTool}{\param{wxMemoryDC\& }{memDC}, \param{wxToolBarTool* }{tool}}
+Returns TRUE if the tool was deleted, FALSE otherwise.
 
-Draws the specified tool onto the window using the given memory device context.
-
-\wxheading{Parameters}
+\wxheading{See also}
 
-\docparam{memDC}{A memory DC to be used for drawing the tool.}
+\helpref{DeleteToolByPos}{wxtoolbardeletetoolbypos}
 
-\docparam{tool}{Tool to be drawn.}
+\membersection{wxToolBar::DeleteToolByPos}\label{wxtoolbardeletetoolbypos}
 
-\wxheading{Remarks}
+\func{bool}{DeleteToolByPos}{\param{size\_t }{pos}}
 
-For internal use only.
+This function behaves like \helpref{DeleteTool}{wxtoolbardeletetool} but it
+deletes the tool at the specified position and not the one with the given id.
 
 \membersection{wxToolBar::EnableTool}\label{wxtoolbarenabletool}
 
-\func{void}{EnableTool}{\param{int }{toolIndex}, \param{const bool}{ enable}}
+\func{void}{EnableTool}{\param{int }{toolId}, \param{const bool}{ enable}}
 
 Enables or disables the tool.
 
 \wxheading{Parameters}
 
-\docparam{toolIndex}{Tool to enable or disable.}
+\docparam{toolId}{Tool to enable or disable.}
 
 \docparam{enable}{If TRUE, enables the tool, otherwise disables it.}
 
@@ -262,7 +259,6 @@ will change the visible state of the tool to indicate that it is disabled.
 \wxheading{See also}
 
 \helpref{wxToolBar::GetToolEnabled}{wxtoolbargettoolenabled},\rtfsp
-%\helpref{wxToolBar::SetToolState}{wxtoolbarsettoolstate},\rtfsp
 \helpref{wxToolBar::ToggleTool}{wxtoolbartoggletool}
 
 \membersection{wxToolBar::FindToolForPosition}\label{wxtoolbarfindtoolforposition}
@@ -323,22 +319,15 @@ Returns the left/right and top/bottom margins, which are also used for inter-too
 
 \helpref{wxToolBar::SetMargins}{wxtoolbarsetmargins}
 
-\membersection{wxToolBar::GetMaxSize}\label{wxtoolbargetmaxsize}
-
-\constfunc{wxSize}{GetMaxSize}{\void}
-
-Gets the maximum size taken up by the tools after layout, including margins.
-This can be used to size a frame around the toolbar window.
-
 \membersection{wxToolBar::GetToolClientData}\label{wxtoolbargettoolclientdata}
 
-\constfunc{wxObject*}{GetToolClientData}{\param{int }{toolIndex}}
+\constfunc{wxObject*}{GetToolClientData}{\param{int }{toolId}}
 
 Get any client data associated with the tool.
 
 \wxheading{Parameters}
 
-\docparam{toolIndex}{Index of the tool, as passed to \helpref{wxToolBar::AddTool}{wxtoolbaraddtool}.}
+\docparam{toolId}{Id of the tool, as passed to \helpref{wxToolBar::AddTool}{wxtoolbaraddtool}.}
 
 \wxheading{Return value}
 
@@ -346,31 +335,31 @@ Client data, or NULL if there is none.
 
 \membersection{wxToolBar::GetToolEnabled}\label{wxtoolbargettoolenabled}
 
-\constfunc{bool}{GetToolEnabled}{\param{int }{toolIndex}}
+\constfunc{bool}{GetToolEnabled}{\param{int }{toolId}}
 
 Called to determine whether a tool is enabled (responds to user input).
 
 \wxheading{Parameters}
 
-\docparam{toolIndex}{Index of the tool in question.}
+\docparam{toolId}{Id of the tool in question.}
 
 \wxheading{Return value}
 
 TRUE if the tool is enabled, FALSE otherwise.
 
-%\wxheading{See also}
-%
-%\helpref{wxToolBar::SetToolEnabled}{wxtoolbarsettoolenabled}
-%
+\wxheading{See also}
+
+\helpref{wxToolBar::EnableTool}{wxtoolbarenabletool}
+
 \membersection{wxToolBar::GetToolLongHelp}\label{wxtoolbargettoollonghelp}
 
-\constfunc{wxString}{GetToolLongHelp}{\param{int }{toolIndex}}
+\constfunc{wxString}{GetToolLongHelp}{\param{int }{toolId}}
 
 Returns the long help for the given tool.
 
 \wxheading{Parameters}
 
-\docparam{toolIndex}{The tool in question.}
+\docparam{toolId}{The tool in question.}
 
 \wxheading{See also}
 
@@ -399,7 +388,7 @@ Returns the default separator size.
 
 \membersection{wxToolBar::GetToolShortHelp}\label{wxtoolbargettoolshorthelp}
 
-\constfunc{wxString}{GetToolShortHelp}{\param{int }{toolIndex}}
+\constfunc{wxString}{GetToolShortHelp}{\param{int }{toolId}}
 
 Returns the short help for the given tool.
 
@@ -407,7 +396,7 @@ Returns the long help for the given tool.
 
 \wxheading{Parameters}
 
-\docparam{toolIndex}{The tool in question.}
+\docparam{toolId}{The tool in question.}
 
 \wxheading{See also}
 
@@ -416,41 +405,69 @@ Returns the long help for the given tool.
 
 \membersection{wxToolBar::GetToolState}\label{wxtoolbargettoolstate}
 
-\constfunc{bool}{GetToolState}{\param{int }{toolIndex}}
+\constfunc{bool}{GetToolState}{\param{int }{toolId}}
 
 Gets the on/off state of a toggle tool.
 
 \wxheading{Parameters}
 
-\docparam{toolIndex}{The tool in question.}
+\docparam{toolId}{The tool in question.}
 
 \wxheading{Return value}
 
 TRUE if the tool is toggled on, FALSE otherwise.
 
-%\wxheading{See also}
-%
-%\helpref{wxToolBar::SetToolState}{wxtoolbarsettoolstate}
-%
-\membersection{wxToolBar::Layout}\label{wxtoolbarlayout}
+\wxheading{See also}
+
+\helpref{wxToolBar::ToggleTool}{wxtoolbartoggletool}
+
+\membersection{wxToolBar::InsertControl}\label{wxtoolbarinsertcontrol}
+
+\func{wxToolBarTool *}{InsertControl}{\param{size\_t }{pos}, \param{wxControl *}{control}}
+
+Inserts the control into the toolbar at the given position.
+
+You must call \helpref{Realize}{wxtoolbarrealize} for the change to take place.
 
-\func{void}{Layout}{\void}
+\wxheading{See also}
+
+\helpref{AddControl}{wxtoolbaraddcontrol},\\
+\helpref{InsertTool}{wxtoolbarinserttool}
+
+\membersection{wxToolBar::InsertSeparator}\label{wxtoolbarinsertseparator}
+
+\func{wxToolBarTool *}{InsertSeparator}{\param{size\_t }{pos}}
+
+Inserts the separator into the toolbar at the given position.
+
+You must call \helpref{Realize}{wxtoolbarrealize} for the change to take place.
+
+\wxheading{See also}
+
+\helpref{AddSeparator}{wxtoolbaraddseparator},\\
+\helpref{InsertTool}{wxtoolbarinserttool}
+
+\membersection{wxToolBar::InsertTool}\label{wxtoolbarinserttool}
 
-Called by the application after the tools have been added to
-automatically lay the tools out on the window. If you have given
-absolute positions when adding the tools, do not call this.
+\func{wxToolBarTool *}{InsertTool}{\param{size\_t }{pos},\rtfsp
+{\param{int}{ toolId}, \param{const wxBitmap\&}{ bitmap1},\rtfsp
+\param{const wxBitmap\&}{ bitmap2 = wxNullBitmap}, \param{bool}{ isToggle = FALSE},\rtfsp
+\param{wxObject* }{clientData = NULL}, \param{const wxString\& }{shortHelpString = ""}, \param{const wxString\& }{longHelpString = ""}}
+
+Inserts the tool with the specified attributes into the toolbar at the given
+position.
 
-This function is only implemented for some toolbar classes.
-The portable way of calling it is to call \helpref{wxToolBar::Realize}{wxtoolbarrealize} after
-you have added tools and separators.
+You must call \helpref{Realize}{wxtoolbarrealize} for the change to take place.
 
 \wxheading{See also}
 
-\helpref{wxToolBar::AddTool}{wxtoolbaraddtool}, \helpref{wxToolBar::Realize}{wxtoolbarrealize}
+\helpref{AddTool}{wxtoolbaraddtool},\\
+\helpref{InsertControl}{wxtoolbarinsertcontrol},\\
+\helpref{InsertSeparator}{wxtoolbarinsertseparator}
 
 \membersection{wxToolBar::OnLeftClick}\label{wxtoolbaronleftclick}
 
-\func{bool}{OnLeftClick}{\param{int}{ toolIndex}, \param{bool}{ toggleDown}}
+\func{bool}{OnLeftClick}{\param{int}{ toolId}, \param{bool}{ toggleDown}}
 
 Called when the user clicks on a tool with the left mouse button.
 
@@ -459,7 +476,7 @@ you should use the EVT\_MENU or EVT\_TOOL macro instead.
 
 \wxheading{Parameters}
 
-\docparam{toolIndex}{The identifier passed to \helpref{wxToolBar::AddTool}{wxtoolbaraddtool}.}
+\docparam{toolId}{The identifier passed to \helpref{wxToolBar::AddTool}{wxtoolbaraddtool}.}
 
 \docparam{toggleDown}{TRUE if the tool is a toggle and the toggle is down, otherwise is FALSE.}
 
@@ -476,7 +493,7 @@ specifying that toggle operations are not permitted in some circumstances.
 
 \membersection{wxToolBar::OnMouseEnter}\label{wxtoolbaronmouseenter}
 
-\func{void}{OnMouseEnter}{\param{int}{ toolIndex}}
+\func{void}{OnMouseEnter}{\param{int}{ toolId}}
 
 This is called when the mouse cursor moves into a tool or out of
 the toolbar.
@@ -486,7 +503,7 @@ you should use the EVT\_TOOL\_ENTER macro instead.
 
 \wxheading{Parameters}
 
-\docparam{toolIndex}{Greater than -1 if the mouse cursor has moved into the tool,
+\docparam{toolId}{Greater than -1 if the mouse cursor has moved into the tool,
 or -1 if the mouse cursor has moved. The
 programmer can override this to provide extra information about the tool,
 such as a short description on the status line.}
@@ -498,7 +515,7 @@ detect it. Therefore this function may not always be called when expected.
 
 \membersection{wxToolBar::OnRightClick}\label{wxtoolbaronrightclick}
 
-\func{void}{OnRightClick}{\param{int}{ toolIndex}, \param{float}{ x}, \param{float}{ y}}
+\func{void}{OnRightClick}{\param{int}{ toolId}, \param{float}{ x}, \param{float}{ y}}
 
 Called when the user clicks on a tool with the right mouse button. The
 programmer should override this function to detect right tool clicks.
@@ -508,7 +525,7 @@ you should use the EVT\_TOOL\_RCLICKED macro instead.
 
 \wxheading{Parameters}
 
-\docparam{toolIndex}{The identifier passed to \helpref{wxToolBar::AddTool}{wxtoolbaraddtool}.}
+\docparam{toolId}{The identifier passed to \helpref{wxToolBar::AddTool}{wxtoolbaraddtool}.}
 
 \docparam{x}{The x position of the mouse cursor.}
 
@@ -535,6 +552,20 @@ either \helpref{wxToolBar::CreateTools}{wxtoolbarcreatetools} or
 If you are using absolute positions for your tools when using a wxToolBarSimple object,
 do not call this function. You must call it at all other times.
 
+\membersection{wxToolBar::RemoveTool}\label{wxtoolbarremovetool}
+
+\func{wxToolBarTool *}{RemoveTool}{\param{int }{id}}
+
+Removes the given tool from the toolbar but doesn't delete it. This allows to
+insert/add this tool back to this (or another) toolbar later.
+
+Note that it is unnecessary to call \helpref{Realize}{wxtoolbarrealize} for the
+change to take place, it will happen immediately.
+
+\wxheading{See also}
+
+\helpref{DeleteTool}{wxtoolbardeletetool}
+
 \membersection{wxToolBar::SetToolBitmapSize}\label{wxtoolbarsettoolbitmapsize}
 
 \func{void}{SetToolBitmapSize}{\param{const wxSize\&}{ size}}
@@ -585,13 +616,13 @@ default (zero-size) margins are to be overridden.
 
 \membersection{wxToolBar::SetToolLongHelp}\label{wxtoolbarsettoollonghelp}
 
-\func{void}{SetToolLongHelp}{\param{int }{toolIndex}, \param{const wxString\& }{helpString}}
+\func{void}{SetToolLongHelp}{\param{int }{toolId}, \param{const wxString\& }{helpString}}
 
 Sets the long help for the given tool.
 
 \wxheading{Parameters}
 
-\docparam{toolIndex}{The tool in question.}
+\docparam{toolId}{The tool in question.}
 
 \docparam{helpString}{A string for the long help.}
 
@@ -625,13 +656,13 @@ and for spacing in the horizontal direction if the toolbar is vertical.
 
 \membersection{wxToolBar::SetToolShortHelp}\label{wxtoolbarsettoolshorthelp}
 
-\func{void}{SetToolShortHelp}{\param{int }{toolIndex}, \param{const wxString\& }{helpString}}
+\func{void}{SetToolShortHelp}{\param{int }{toolId}, \param{const wxString\& }{helpString}}
 
 Sets the short help for the given tool.
 
 \wxheading{Parameters}
 
-\docparam{toolIndex}{The tool in question.}
+\docparam{toolId}{The tool in question.}
 
 \docparam{helpString}{The string for the short help.}
 
@@ -659,13 +690,13 @@ Sets the default separator size. The default value is 5.
 
 \membersection{wxToolBar::ToggleTool}\label{wxtoolbartoggletool}
 
-\func{void}{ToggleTool}{\param{int }{toolIndex}, \param{const bool}{ toggle}}
+\func{void}{ToggleTool}{\param{int }{toolId}, \param{const bool}{ toggle}}
 
 Toggles a tool on or off. This does not cause any event to get emitted.
 
 \wxheading{Parameters}
 
-\docparam{toolIndex}{Tool in question.}
+\docparam{toolId}{Tool in question.}
 
 \docparam{toggle}{If TRUE, toggles the tool on, otherwise toggles it off.}
 
diff --git a/docs/latex/wx/tsamples.tex b/docs/latex/wx/tsamples.tex
index 226c1ed8ff..13bae978f2 100644
--- a/docs/latex/wx/tsamples.tex
+++ b/docs/latex/wx/tsamples.tex
@@ -93,3 +93,24 @@ documents without much work. In fact, only few function calls are sufficient.
 while {\it Helpview} is simple tool that only pops up help window and
 displays help books given at command line.
 
+\subsection{Toolbar sample}\label{sampletoolbar}
+
+The toolbar sample shows the \helpref{wxToolBar}{wxtoolbar} class in action.
+
+The following things are demonstrated:
+
+\begin{itemize}
+
+\item Creating the toolbar using \helpref{wxToolBar::AddTool}{wxtoolbaraddtool}
+and \helpref{wxToolBar::AddControl}{wxtoolbaraddcontrol}: see
+MyApp::InitToolbar in the sample.
+
+\item Using {\tt EVT\_UPDATE\_UI} handler for automatically enabling/disabling
+toolbar buttons without having to explicitly call EnableTool. This is is done
+in MyFrame::OnUpdateCopyAndCut.
+
+\item Using \helpref{wxToolBar::DeleteTool}{wxtoolbardeletetool} and 
+\helpref{wxToolBar::InsertTool}{wxtoolbarinserttool} to dynamically update the
+toolbar.
+
+\end{itemize}
diff --git a/samples/controls/controls.cpp b/samples/controls/controls.cpp
index 6429aa80dd..b15eda6ee5 100644
--- a/samples/controls/controls.cpp
+++ b/samples/controls/controls.cpp
@@ -610,6 +610,11 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
 
     (void)new wxBitmapButton(panel, -1, bitmap, wxPoint(100, 20));
 
+    bitmap = wxBitmap("../../utils/wxPython/tests/bitmaps/test2.bmp",
+                      wxBITMAP_TYPE_BMP);
+    bitmap.SetMask(new wxMask(bitmap, *wxBLUE));
+    (void)new wxBitmapButton(panel, -1, bitmap, wxPoint(300, 120));
+
     wxBitmap bmp1(wxTheApp->GetStdIcon(wxICON_INFORMATION)),
              bmp2(wxTheApp->GetStdIcon(wxICON_WARNING)),
              bmp3(wxTheApp->GetStdIcon(wxICON_QUESTION));
diff --git a/samples/toolbar/bitmaps/preview.xpm b/samples/toolbar/bitmaps/preview.xpm
index 0dfdca46e1..7e5e9cd06e 100644
--- a/samples/toolbar/bitmaps/preview.xpm
+++ b/samples/toolbar/bitmaps/preview.xpm
@@ -1,5 +1,5 @@
 /* XPM */
-static char *preview_xpm[] = {
+static char *paste_xpm[] = {
 /* columns rows colors chars-per-pixel */
 "16 15 5 1",
 "  c Black",
diff --git a/samples/toolbar/toolbar.cpp b/samples/toolbar/toolbar.cpp
index 623e503e5c..e7feb997ea 100644
--- a/samples/toolbar/toolbar.cpp
+++ b/samples/toolbar/toolbar.cpp
@@ -42,9 +42,8 @@
     #include "bitmaps/save.xpm"
     #include "bitmaps/copy.xpm"
     #include "bitmaps/cut.xpm"
-    // #include "bitmaps/paste.xpm"
+    #include "bitmaps/preview.xpm"  // paste XPM
     #include "bitmaps/print.xpm"
-    #include "bitmaps/preview.xpm"
     #include "bitmaps/help.xpm"
 #endif // GTK or Motif
 
@@ -53,11 +52,10 @@
 // ----------------------------------------------------------------------------
 
 // Define a new application
-class MyApp: public wxApp
+class MyApp : public wxApp
 {
 public:
     bool OnInit();
-    bool InitToolbar(wxToolBar* toolBar, bool smallicons = FALSE);
 };
 
 // Define a new frame
@@ -71,10 +69,14 @@ public:
             const wxSize& size = wxDefaultSize,
             long style = wxDEFAULT_FRAME_STYLE);
 
+    void RecreateToolbar();
+
     void OnQuit(wxCommandEvent& event);
     void OnAbout(wxCommandEvent& event);
 
-    void OnToggleToolbar(wxCommandEvent& event);
+    void OnToggleToolbarSize(wxCommandEvent& event);
+    void OnToggleToolbarOrient(wxCommandEvent& event);
+
     void OnEnablePrint(wxCommandEvent& event) { DoEnablePrint(); }
     void OnDeletePrint(wxCommandEvent& event) { DoDeletePrint(); }
     void OnInsertPrint(wxCommandEvent& event);
@@ -85,12 +87,15 @@ public:
 
     void OnCombo(wxCommandEvent& event);
 
+    void OnUpdateCopyAndCut(wxUpdateUIEvent& event);
+
 private:
     void DoEnablePrint();
     void DoDeletePrint();
     void DoToggleHelp();
 
-    bool                m_smallToolbar;
+    bool                m_smallToolbar,
+                        m_horzToolbar;
     wxTextCtrl*         m_textWindow;
 
     DECLARE_EVENT_TABLE()
@@ -104,7 +109,8 @@ const int ID_TOOLBAR = 500;
 
 enum
 {
-    IDM_TOOLBAR_TOGGLETOOLBAR = 200,
+    IDM_TOOLBAR_TOGGLETOOLBARSIZE = 200,
+    IDM_TOOLBAR_TOGGLETOOLBARORIENT,
     IDM_TOOLBAR_ENABLEPRINT,
     IDM_TOOLBAR_DELETEPRINT,
     IDM_TOOLBAR_INSERTPRINT,
@@ -124,7 +130,9 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_MENU(wxID_EXIT, MyFrame::OnQuit)
     EVT_MENU(wxID_HELP, MyFrame::OnAbout)
 
-    EVT_MENU(IDM_TOOLBAR_TOGGLETOOLBAR, MyFrame::OnToggleToolbar)
+    EVT_MENU(IDM_TOOLBAR_TOGGLETOOLBARSIZE, MyFrame::OnToggleToolbarSize)
+    EVT_MENU(IDM_TOOLBAR_TOGGLETOOLBARORIENT, MyFrame::OnToggleToolbarOrient)
+
     EVT_MENU(IDM_TOOLBAR_ENABLEPRINT, MyFrame::OnEnablePrint)
     EVT_MENU(IDM_TOOLBAR_DELETEPRINT, MyFrame::OnDeletePrint)
     EVT_MENU(IDM_TOOLBAR_INSERTPRINT, MyFrame::OnInsertPrint)
@@ -135,6 +143,9 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_COMBOBOX(ID_COMBO, MyFrame::OnCombo)
 
     EVT_TOOL_ENTER(ID_TOOLBAR, MyFrame::OnToolEnter)
+
+    EVT_UPDATE_UI(wxID_COPY, MyFrame::OnUpdateCopyAndCut)
+    EVT_UPDATE_UI(wxID_CUT, MyFrame::OnUpdateCopyAndCut)
 END_EVENT_TABLE()
 
 // ============================================================================
@@ -173,81 +184,79 @@ bool MyApp::OnInit()
     return TRUE;
 }
 
-bool MyApp::InitToolbar(wxToolBar* toolBar, bool smallicons)
+void MyFrame::RecreateToolbar()
 {
-  // Set up toolbar
-  wxBitmap* toolBarBitmaps[8];
+    // delete and recreate the toolbar
+    wxToolBar *toolBar = GetToolBar();
+    delete toolBar;
 
-#ifdef __WXMSW__
-  toolBarBitmaps[0] = new wxBitmap("icon1");
-  toolBarBitmaps[1] = new wxBitmap("icon2");
-  if ( !smallicons )
-  {
-      toolBarBitmaps[2] = new wxBitmap("icon3");
-      toolBarBitmaps[3] = new wxBitmap("icon4");
-      toolBarBitmaps[4] = new wxBitmap("icon5");
-      toolBarBitmaps[5] = new wxBitmap("icon6");
-      toolBarBitmaps[6] = new wxBitmap("icon7");
-      toolBarBitmaps[7] = new wxBitmap("icon8");
-  }
-#else
-  toolBarBitmaps[0] = new wxBitmap( new_xpm );
-  toolBarBitmaps[1] = new wxBitmap( open_xpm );
-  if ( !smallicons )
-  {
-      toolBarBitmaps[2] = new wxBitmap( save_xpm );
-      toolBarBitmaps[3] = new wxBitmap( copy_xpm );
-      toolBarBitmaps[4] = new wxBitmap( cut_xpm );
-      toolBarBitmaps[5] = new wxBitmap( preview_xpm );
-      toolBarBitmaps[6] = new wxBitmap( print_xpm );
-      toolBarBitmaps[7] = new wxBitmap( help_xpm );
-  }
-#endif
+    SetToolBar(NULL);
+
+    long style = wxNO_BORDER | wxTB_FLAT | wxTB_DOCKABLE;
+    style |= m_horzToolbar ? wxTB_HORIZONTAL : wxTB_VERTICAL;
+
+    toolBar = CreateToolBar(style, ID_TOOLBAR);
+    toolBar->SetMargins( 4, 4 );
+
+    // Set up toolbar
+    wxBitmap toolBarBitmaps[8];
+
+    toolBarBitmaps[0] = wxBITMAP(new);
+    toolBarBitmaps[1] = wxBITMAP(open);
+    if ( !m_smallToolbar )
+    {
+        toolBarBitmaps[2] = wxBITMAP(save);
+        toolBarBitmaps[3] = wxBITMAP(copy);
+        toolBarBitmaps[4] = wxBITMAP(cut);
+        toolBarBitmaps[5] = wxBITMAP(paste);
+        toolBarBitmaps[6] = wxBITMAP(print);
+        toolBarBitmaps[7] = wxBITMAP(help);
+    }
 
 #ifdef __WXMSW__
-  int width = 24;
+    int width = 24;
 #else
-  int width = 16;
+    int width = 16;
 #endif
-  int currentX = 5;
-
-  toolBar->AddTool(wxID_NEW, *(toolBarBitmaps[0]), wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, "New file");
-  currentX += width + 5;
-  toolBar->AddTool(wxID_OPEN, *(toolBarBitmaps[1]), wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, "Open file");
 
-  wxComboBox *combo = new wxComboBox(toolBar, ID_COMBO);
-  combo->Append("This");
-  combo->Append("is a");
-  combo->Append("combobox");
-  combo->Append("in a");
-  combo->Append("toolbar");
-  toolBar->AddControl(combo);
+    int currentX = 5;
 
-  if ( !smallicons )
-  {
-      currentX += width + 5;
-      toolBar->AddTool(wxID_SAVE, *(toolBarBitmaps[2]), wxNullBitmap, TRUE, currentX, -1, (wxObject *) NULL, "Toggle button 1");
-      currentX += width + 5;
-      toolBar->AddTool(wxID_COPY, *(toolBarBitmaps[3]), wxNullBitmap, TRUE, currentX, -1, (wxObject *) NULL, "Toggle button 2");
-      currentX += width + 5;
-      toolBar->AddTool(wxID_CUT, *(toolBarBitmaps[4]), wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, "Toggle/Untoggle help button");
-      currentX += width + 5;
-      toolBar->AddTool(wxID_PASTE, *(toolBarBitmaps[5]), wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, "Paste");
-      currentX += width + 5;
-      toolBar->AddTool(wxID_PRINT, *(toolBarBitmaps[6]), wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, "Delete this tool");
-      currentX += width + 5;
-      toolBar->AddSeparator();
-      toolBar->AddTool(wxID_HELP, *(toolBarBitmaps[7]), wxNullBitmap, TRUE, currentX, -1, (wxObject *) NULL, "Help button");
-  }
+    toolBar->AddTool(wxID_NEW, toolBarBitmaps[0], wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, "New file");
+    currentX += width + 5;
+    toolBar->AddTool(wxID_OPEN, toolBarBitmaps[1], wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, "Open file");
 
-  toolBar->Realize();
+    // adding a combo to a vertical toolbar is not very smart
+    if ( m_horzToolbar )
+    {
+        wxComboBox *combo = new wxComboBox(toolBar, ID_COMBO);
+        combo->Append("This");
+        combo->Append("is a");
+        combo->Append("combobox");
+        combo->Append("in a");
+        combo->Append("toolbar");
+        toolBar->AddControl(combo);
+    }
 
-  // Can delete the bitmaps since they're reference counted
-  int i, max = smallicons ? 2 : WXSIZEOF(toolBarBitmaps);
-  for (i = 0; i < max; i++)
-    delete toolBarBitmaps[i];
+    if ( !m_smallToolbar )
+    {
+        currentX += width + 5;
+        toolBar->AddTool(wxID_SAVE, toolBarBitmaps[2], wxNullBitmap, TRUE, currentX, -1, (wxObject *) NULL, "Toggle button 1");
+        currentX += width + 5;
+        toolBar->AddTool(wxID_COPY, toolBarBitmaps[3], wxNullBitmap, TRUE, currentX, -1, (wxObject *) NULL, "Toggle button 2");
+        currentX += width + 5;
+        toolBar->AddTool(wxID_CUT, toolBarBitmaps[4], wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, "Toggle/Untoggle help button");
+        currentX += width + 5;
+        toolBar->AddTool(wxID_PASTE, toolBarBitmaps[5], wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, "Paste");
+        currentX += width + 5;
+        toolBar->AddTool(wxID_PRINT, toolBarBitmaps[6], wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, "Delete this tool");
+        currentX += width + 5;
+        toolBar->AddSeparator();
+        toolBar->AddTool(wxID_HELP, toolBarBitmaps[7], wxNullBitmap, TRUE, currentX, -1, (wxObject *) NULL, "Help button");
+    }
 
-  return TRUE;
+    // after adding the buttons to the toolbar, must call Realize() to reflect
+    // the changes
+    toolBar->Realize();
 }
 
 // ----------------------------------------------------------------------------
@@ -265,6 +274,7 @@ MyFrame::MyFrame(wxFrame* parent,
 {
     m_textWindow = new wxTextCtrl(this, -1, "", wxPoint(0, 0), wxSize(-1, -1), wxTE_MULTILINE);
     m_smallToolbar = FALSE;
+    m_horzToolbar = FALSE;
 
     // Give it a status line
     CreateStatusBar();
@@ -274,7 +284,17 @@ MyFrame::MyFrame(wxFrame* parent,
 
     // Make a menubar
     wxMenu *tbarMenu = new wxMenu;
-    tbarMenu->Append(IDM_TOOLBAR_TOGGLETOOLBAR, "&Toggle toolbar\tCtrl-T", "Change the toolbar kind");
+    tbarMenu->Append(IDM_TOOLBAR_TOGGLETOOLBARSIZE,
+                     "&Toggle toolbar size\tCtrl-S",
+                     "Toggle between big/small toolbar",
+                     TRUE);
+    tbarMenu->Append(IDM_TOOLBAR_TOGGLETOOLBARORIENT,
+                     "Toggle toolbar &orientation\tCtrl-O",
+                     "Toggle toolbar orientation",
+                     TRUE);
+
+    tbarMenu->AppendSeparator();
+
     tbarMenu->Append(IDM_TOOLBAR_ENABLEPRINT, "&Enable print button\tCtrl-E", "");
     tbarMenu->Append(IDM_TOOLBAR_DELETEPRINT, "&Delete print button\tCtrl-D", "");
     tbarMenu->Append(IDM_TOOLBAR_INSERTPRINT, "&Insert print button\tCtrl-I", "");
@@ -296,28 +316,21 @@ MyFrame::MyFrame(wxFrame* parent,
     SetMenuBar(menuBar);
 
     // Create the toolbar
-    wxToolBar *tbar = CreateToolBar(wxNO_BORDER | wxTB_HORIZONTAL |
-                                    wxTB_FLAT | wxTB_DOCKABLE,
-                                    ID_TOOLBAR);
+    RecreateToolbar();
+}
 
-    tbar->SetMargins( 4, 4 );
+void MyFrame::OnToggleToolbarSize(wxCommandEvent& WXUNUSED(event))
+{
+    m_smallToolbar = !m_smallToolbar;
 
-    wxGetApp().InitToolbar(tbar);
+    RecreateToolbar();
 }
 
-void MyFrame::OnToggleToolbar(wxCommandEvent& WXUNUSED(event))
+void MyFrame::OnToggleToolbarOrient(wxCommandEvent& WXUNUSED(event))
 {
-    // delete and recreate the toolbar
-    wxToolBar *tbar = GetToolBar();
-    delete tbar;
-
-    SetToolBar(NULL);
-    tbar = CreateToolBar(wxNO_BORDER | wxTB_HORIZONTAL |
-                         wxTB_FLAT | wxTB_DOCKABLE,
-                         ID_TOOLBAR);
+    m_horzToolbar = !m_horzToolbar;
 
-    m_smallToolbar = !m_smallToolbar;
-    wxGetApp().InitToolbar(tbar, m_smallToolbar);
+    RecreateToolbar();
 }
 
 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
@@ -387,16 +400,19 @@ void MyFrame::DoToggleHelp()
     tb->ToggleTool( wxID_HELP, !tb->GetToolState( wxID_HELP ) );
 }
 
+void MyFrame::OnUpdateCopyAndCut(wxUpdateUIEvent& event)
+{
+    event.Enable( m_textWindow->CanCopy() );
+}
+
 void MyFrame::OnInsertPrint(wxCommandEvent& WXUNUSED(event))
 {
-#ifdef __WXMSW__
-    wxBitmap bmp("icon7");
-#else
-    wxBitmap bmp(print_xpm);
-#endif
+    wxBitmap bmp = wxBITMAP(print);
 
     GetToolBar()->InsertTool(0, wxID_PRINT, bmp, wxNullBitmap,
-                              FALSE, (wxObject *) NULL, "Delete this tool");
+                             FALSE, (wxObject *) NULL,
+                             "Delete this tool",
+                             "This button was inserted into the toolbar");
 
     GetToolBar()->Realize();
 }
diff --git a/samples/toolbar/toolbar.rc b/samples/toolbar/toolbar.rc
index 6c9086d0c6..42bb7cb984 100644
--- a/samples/toolbar/toolbar.rc
+++ b/samples/toolbar/toolbar.rc
@@ -1,13 +1,12 @@
 mondrian ICON "mondrian.ico"
 #include "wx/msw/wx.rc"
 
-icon1 BITMAP "bitmaps/new.bmp"
-icon2 BITMAP "bitmaps/open.bmp"
-icon3 BITMAP "bitmaps/save.bmp"
-icon4 BITMAP "bitmaps/copy.bmp"
-icon5 BITMAP "bitmaps/cut.bmp"
-icon6 BITMAP "bitmaps/paste.bmp"
-icon7 BITMAP "bitmaps/print.bmp"
-
-icon8 BITMAP "bitmaps/help.bmp"
+new BITMAP "bitmaps/new.bmp"
+open BITMAP "bitmaps/open.bmp"
+save BITMAP "bitmaps/save.bmp"
+copy BITMAP "bitmaps/copy.bmp"
+cut BITMAP "bitmaps/cut.bmp"
+paste BITMAP "bitmaps/paste.bmp"
+print BITMAP "bitmaps/print.bmp"
+help BITMAP "bitmaps/help.bmp"
 
-- 
2.45.2

