From a8f4cabe1ea3d5390f1353c0bf5649fa1476e08b Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Tue, 18 Feb 2003 09:38:02 +0000 Subject: [PATCH] Applied patch [ 681893 ] Combobox in toolbar This patch adds controls (i.e. combobox) to toolbars. It also changes the toolbar sample so the combobox is actually shown. Otto Wyss git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@19243 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/univ/renderer.h | 8 ++-- samples/toolbar/toolbar.cpp | 2 +- src/univ/themes/gtk.cpp | 6 ++- src/univ/themes/win32.cpp | 11 +++-- src/univ/toolbar.cpp | 94 ++++++++++++++++++++++++++++++++----- 5 files changed, 99 insertions(+), 22 deletions(-) diff --git a/include/wx/univ/renderer.h b/include/wx/univ/renderer.h index e11bf8c883..93760cbaf7 100644 --- a/include/wx/univ/renderer.h +++ b/include/wx/univ/renderer.h @@ -203,7 +203,8 @@ public: const wxString& label, const wxBitmap& bitmap, const wxRect& rect, - int flags = 0) = 0; + int flags = 0, + long style = 0) = 0; // draw a (part of) line in the text control virtual void DrawTextLine(wxDC& dc, @@ -621,8 +622,9 @@ public: const wxString& label, const wxBitmap& bitmap, const wxRect& rect, - int flags = 0) - { m_renderer->DrawToolBarButton(dc, label, bitmap, rect, flags); } + int flags = 0, + long style = 0) + { m_renderer->DrawToolBarButton(dc, label, bitmap, rect, flags, style); } virtual void DrawTextLine(wxDC& dc, const wxString& text, const wxRect& rect, diff --git a/samples/toolbar/toolbar.cpp b/samples/toolbar/toolbar.cpp index a862b1e378..1dd8595958 100644 --- a/samples/toolbar/toolbar.cpp +++ b/samples/toolbar/toolbar.cpp @@ -299,7 +299,7 @@ void MyFrame::RecreateToolbar() toolBar->AddTool(wxID_OPEN, _T("Open"), toolBarBitmaps[1], _T("Open file")); // neither the generic nor Motif native toolbars really support this -#if (wxUSE_TOOLBAR_NATIVE && !USE_GENERIC_TBAR) && !defined(__WXMOTIF__) && !defined(__WXX11__) +#if (wxUSE_TOOLBAR_NATIVE && !USE_GENERIC_TBAR) && !defined(__WXMOTIF__) && !defined(__WXX11__) || defined(__WXUNIVERSAL__) // adding a combo to a vertical toolbar is not very smart if ( m_horzToolbar ) { diff --git a/src/univ/themes/gtk.cpp b/src/univ/themes/gtk.cpp index 9ad98cbcd5..344f10d0d3 100644 --- a/src/univ/themes/gtk.cpp +++ b/src/univ/themes/gtk.cpp @@ -165,7 +165,8 @@ public: const wxString& label, const wxBitmap& bitmap, const wxRect& rect, - int flags); + int flags = 0, + long style = 0); virtual void DrawTextLine(wxDC& dc, const wxString& text, @@ -1632,7 +1633,8 @@ void wxGTKRenderer::DrawToolBarButton(wxDC& dc, const wxString& label, const wxBitmap& bitmap, const wxRect& rectOrig, - int flags) + int flags, + long style) { // we don't draw the separators at all if ( !label.empty() || bitmap.Ok() ) diff --git a/src/univ/themes/win32.cpp b/src/univ/themes/win32.cpp index 9dfdf2fc88..b8d40da389 100644 --- a/src/univ/themes/win32.cpp +++ b/src/univ/themes/win32.cpp @@ -239,7 +239,8 @@ public: const wxString& label, const wxBitmap& bitmap, const wxRect& rect, - int flags); + int flags = 0, + long style = 0); virtual void DrawTextLine(wxDC& dc, const wxString& text, const wxRect& rect, @@ -2407,9 +2408,10 @@ void wxWin32Renderer::DrawToolBarButton(wxDC& dc, const wxString& label, const wxBitmap& bitmap, const wxRect& rectOrig, - int flags) + int flags, + long style) { - if ( !label.empty() || bitmap.Ok() ) + if (style == wxTOOL_STYLE_BUTTON) { wxRect rect = rectOrig; rect.Deflate(BORDER_THICKNESS); @@ -2425,7 +2427,7 @@ void wxWin32Renderer::DrawToolBarButton(wxDC& dc, dc.DrawLabel(label, bitmap, rect, wxALIGN_CENTRE); } - else // a separator + else if (style == wxTOOL_STYLE_SEPARATOR) { // leave a small gap aroudn the line, also account for the toolbar // border itself @@ -2433,6 +2435,7 @@ void wxWin32Renderer::DrawToolBarButton(wxDC& dc, rectOrig.y + 2*BORDER_THICKNESS, rectOrig.GetBottom() - BORDER_THICKNESS); } + // don't draw wxTOOL_STYLE_CONTROL } // ---------------------------------------------------------------------------- diff --git a/src/univ/toolbar.cpp b/src/univ/toolbar.cpp index f8e1944a72..e3d2377750 100644 --- a/src/univ/toolbar.cpp +++ b/src/univ/toolbar.cpp @@ -72,6 +72,24 @@ public: // no position yet m_x = m_y = -1; + m_width = + m_height = 0; + + // not pressed yet + m_isInverted = FALSE; + + // mouse not here yet + m_underMouse = FALSE; + } + + wxToolBarTool(wxToolBar *tbar, wxControl *control) + : wxToolBarToolBase(tbar, control) + { + // no position yet + m_x = + m_y = -1; + m_width = + m_height = 0; // not pressed yet m_isInverted = FALSE; @@ -96,9 +114,11 @@ public: bool IsUnderMouse() { return m_underMouse; } public: - // the tool position (the size is known by the toolbar itself) - int m_x, - m_y; + // the tool position (for controls) + wxCoord m_x; + wxCoord m_y; + wxCoord m_width; + wxCoord m_height; private: // TRUE if the tool is pressed @@ -330,9 +350,7 @@ wxToolBarToolBase *wxToolBar::CreateTool(int id, wxToolBarToolBase *wxToolBar::CreateTool(wxControl *control) { - wxFAIL_MSG( wxT("Toolbar doesn't support controls yet (TODO)") ); - - return NULL; + return new wxToolBarTool(this, control); } // ---------------------------------------------------------------------------- @@ -358,13 +376,39 @@ wxRect wxToolBar::GetToolRect(wxToolBarToolBase *toolBase) const if ( IsVertical() ) { - rect.width = m_defaultWidth; - rect.height = tool->IsSeparator() ? m_widthSeparator : m_defaultHeight; + if (tool->IsButton()) + { + rect.width = m_defaultWidth; + rect.height = m_defaultHeight; + } + else if (tool->IsSeparator()) + { + rect.width = m_defaultWidth; + rect.height = m_widthSeparator; + } + else // control + { + rect.width = tool->m_width; + rect.height = tool->m_height; + } } else // horizontal { - rect.width = tool->IsSeparator() ? m_widthSeparator : m_defaultWidth; - rect.height = m_defaultHeight; + if (tool->IsButton()) + { + rect.width = m_defaultWidth; + rect.height = m_defaultHeight; + } + else if (tool->IsSeparator()) + { + rect.width = m_widthSeparator; + rect.height = m_defaultHeight; + } + else // control + { + rect.width = tool->m_width; + rect.height = tool->m_height; + } } rect.width += 2*m_xMargin; @@ -410,7 +454,25 @@ void wxToolBar::DoLayout() tool->m_y = y; // TODO ugly number fiddling - *pCur += ( tool->IsSeparator() ? m_widthSeparator : (widthTool+2) ) + margin; + if (tool->IsButton()) + { + *pCur += widthTool; + } + else if (tool->IsSeparator()) + { + *pCur += m_widthSeparator; + } + else if (!IsVertical()) // horizontal control + { + wxControl *control = tool->GetControl(); + wxSize size = control->GetSize(); + tool->m_y += (m_defaultHeight - size.y)/2; + tool->m_width = size.x; + tool->m_height = size.y; + + *pCur += tool->m_width; + } + *pCur += margin; } // calculate the total toolbar size @@ -562,7 +624,15 @@ void wxToolBar::DoDraw(wxControlRenderer *renderer) } //else: leave both the label and the bitmap invalid to draw a separator - rend->DrawToolBarButton(dc, label, bitmap, rectTool, flags); + if ( !tool->IsControl() ) + { + rend->DrawToolBarButton(dc, label, bitmap, rectTool, flags, tool->GetStyle()); + } + else // control + { + wxControl *control = tool->GetControl(); + control->Move(tool->m_x, tool->m_y); + } } } -- 2.45.2