X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5b2acc3a4f02058e76cdcbfad5d57a0988bbb138..beed4c4b53365c8b4841e913e371184b805a42c2:/src/msw/tbar95.cpp diff --git a/src/msw/tbar95.cpp b/src/msw/tbar95.cpp index 9b9436d81f..f2c24ec171 100644 --- a/src/msw/tbar95.cpp +++ b/src/msw/tbar95.cpp @@ -40,6 +40,7 @@ #include "wx/control.h" #include "wx/app.h" // for GetComCtl32Version #include "wx/image.h" + #include "wx/stattext.h" #endif #include "wx/sysopt.h" @@ -148,14 +149,38 @@ public: clientData, shortHelp, longHelp) { m_nSepCount = 0; + m_staticText = 0; } - wxToolBarTool(wxToolBar *tbar, wxControl *control) - : wxToolBarToolBase(tbar, control) + wxToolBarTool(wxToolBar *tbar, wxControl *control, const wxString& label) + : wxToolBarToolBase(tbar, control, label) { + if ( IsControl() && !m_label.empty() ) + { + // create a control to render the control's label + m_staticText = new wxStaticText + ( + m_tbar, + wxID_ANY, + m_label, + wxDefaultPosition, + wxDefaultSize, + wxALIGN_CENTRE | wxST_NO_AUTORESIZE + ); + } + else // no label + { + m_staticText = NULL; + } + m_nSepCount = 1; } + virtual ~wxToolBarTool() + { + delete m_staticText; + } + virtual void SetLabel(const wxString& label) { if ( label == m_label ) @@ -163,12 +188,23 @@ public: wxToolBarToolBase::SetLabel(label); + if ( m_staticText ) + m_staticText->SetLabel(label); + // we need to update the label shown in the toolbar because it has a // pointer to the internal buffer of the old label // // TODO: use TB_SETBUTTONINFO } + wxStaticText* GetStaticText() + { + wxASSERT_MSG( IsControl(), + _T("only makes sense for embedded control tools") ); + + return m_staticText; + } + // set/get the number of separators which we use to cover the space used by // a control in the toolbar void SetSeparatorsCount(size_t count) { m_nSepCount = count; } @@ -176,6 +212,7 @@ public: private: size_t m_nSepCount; + wxStaticText *m_staticText; DECLARE_NO_COPY_CLASS(wxToolBarTool) }; @@ -201,9 +238,10 @@ wxToolBarToolBase *wxToolBar::CreateTool(int id, clientData, shortHelp, longHelp); } -wxToolBarToolBase *wxToolBar::CreateTool(wxControl *control) +wxToolBarToolBase * +wxToolBar::CreateTool(wxControl *control, const wxString& label) { - return new wxToolBarTool(this, control); + return new wxToolBarTool(this, control, label); } // ---------------------------------------------------------------------------- @@ -220,7 +258,7 @@ void wxToolBar::Init() m_defaultWidth = DEFAULTBITMAPX; m_defaultHeight = DEFAULTBITMAPY; - m_pInTool = 0; + m_pInTool = NULL; } bool wxToolBar::Create(wxWindow *parent, @@ -234,6 +272,8 @@ bool wxToolBar::Create(wxWindow *parent, if ( !CreateControl(parent, id, pos, size, style, wxDefaultValidator, name) ) return false; + FixupStyle(); + // MSW-specific initialisation if ( !MSWCreateToolbar(pos, size) ) return false; @@ -347,7 +387,7 @@ wxSize wxToolBar::DoGetBestSize() const sizeBest.x *= GetToolsCount(); // reverse horz and vertical components if necessary - if ( HasFlag(wxTB_VERTICAL) ) + if ( IsVertical() ) { int t = sizeBest.x; sizeBest.x = sizeBest.y; @@ -360,6 +400,9 @@ wxSize wxToolBar::DoGetBestSize() const sizeBest.y = size.cy; } + if (!IsVertical() && !(GetWindowStyle() & wxTB_NODIVIDER)) + sizeBest.y += 1; + CacheBestSize(sizeBest); return sizeBest; @@ -405,6 +448,9 @@ WXDWORD wxToolBar::MSWGetStyle(long style, WXDWORD *exstyle) const if( style & wxTB_BOTTOM ) msStyle |= CCS_BOTTOM; + if ( style & wxTB_RIGHT ) + msStyle |= CCS_RIGHT; + return msStyle; } @@ -484,13 +530,16 @@ bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool) // takes care of all normal items) for ( /* node -> first after deleted */ ; node; node = node->GetNext() ) { - wxToolBarToolBase *tool2 = node->GetData(); + wxToolBarTool *tool2 = (wxToolBarTool*)node->GetData(); if ( tool2->IsControl() ) { int x; wxControl *control = tool2->GetControl(); control->GetPosition(&x, NULL); control->Move(x - width, wxDefaultCoord); + + wxStaticText* staticText = tool2->GetStaticText(); + staticText->Move(x - width, wxDefaultCoord); } } @@ -541,8 +590,6 @@ bool wxToolBar::Realize() // nothing to do return true; - const bool isVertical = HasFlag(wxTB_VERTICAL); - #ifdef wxREMAP_BUTTON_COLOURS // don't change the values of these constants, they can be set from the // user code via wxSystemOptions @@ -677,8 +724,8 @@ bool wxToolBar::Realize() // no disabled bitmap specified but we still need to // fill the space in the image list with something, so // we grey out the normal bitmap - wxImage imgGreyed; - wxCreateGreyedImage(bmp.ConvertToImage(), imgGreyed); + wxImage + imgGreyed = bmp.ConvertToImage().ConvertToGreyscale(); #ifdef wxREMAP_BUTTON_COLOURS if ( remapValue == Remap_Buttons ) @@ -781,17 +828,21 @@ bool wxToolBar::Realize() } } - if ( m_disabledImgList ) + // disable image lists are only supported in comctl32.dll 4.70+ + if ( wxApp::GetComCtl32Version() >= 470 ) { + HIMAGELIST hil = m_disabledImgList + ? GetHimagelistOf(m_disabledImgList) + : 0; + + // notice that we set the image list even if don't have one right + // now as we could have it before and need to reset it in this case HIMAGELIST oldImageList = (HIMAGELIST) - ::SendMessage(GetHwnd(), - TB_SETDISABLEDIMAGELIST, - 0, - (LPARAM)GetHimagelistOf(m_disabledImgList)); + ::SendMessage(GetHwnd(), TB_SETDISABLEDIMAGELIST, 0, (LPARAM)hil); // delete previous image list if any if ( oldImageList ) - ::DeleteObject( oldImageList ); + ::DeleteObject(oldImageList); } } @@ -819,7 +870,7 @@ bool wxToolBar::Realize() // don't add separators to the vertical toolbar with old comctl32.dll // versions as they didn't handle this properly - if ( isVertical && tool->IsSeparator() && + if ( IsVertical() && tool->IsSeparator() && wxApp::GetComCtl32Version() <= 472 ) { continue; @@ -849,7 +900,7 @@ bool wxToolBar::Realize() { const wxString& label = tool->GetLabel(); if ( !label.empty() ) - button.iString = (int)label.c_str(); + button.iString = (int)label.wx_str(); } button.idCommand = tool->GetId(); @@ -937,13 +988,13 @@ bool wxToolBar::Realize() size_t index = 0; for ( node = m_tools.GetFirst(); node; node = node->GetNext(), index++ ) { - wxToolBarToolBase *tool = node->GetData(); + wxToolBarTool *tool = (wxToolBarTool*)node->GetData(); // we calculate the running y coord for vertical toolbars so we need to // get the items size for all items but for the horizontal ones we // don't need to deal with the non controls bool isControl = tool->IsControl(); - if ( !isControl && !isVertical ) + if ( !isControl && !IsVertical() ) continue; // note that we use TB_GETITEMRECT and not TB_GETRECT because the @@ -964,7 +1015,15 @@ bool wxToolBar::Realize() } wxControl *control = tool->GetControl(); + wxStaticText * const staticText = tool->GetStaticText(); + wxSize size = control->GetSize(); + wxSize staticTextSize; + if ( staticText ) + { + staticTextSize = staticText->GetSize(); + staticTextSize.y += 3; // margin between control and its label + } // the position of the leftmost controls corner int left = wxDefaultCoord; @@ -1019,22 +1078,40 @@ bool wxToolBar::Realize() ((wxToolBarTool *)tool)->SetSeparatorsCount(nSeparators); // adjust the controls width to exactly cover the separators - control->SetSize((nSeparators + 1)*widthSep, wxDefaultCoord); + size.x = (nSeparators + 1)*widthSep; + control->SetSize(size.x, wxDefaultCoord); } - // position the control itself correctly vertically - int height = r.bottom - r.top; + // position the control itself correctly vertically centering it on the + // icon area of the toolbar + int height = r.bottom - r.top - staticTextSize.y; + int diff = height - size.y; - if ( diff < 0 ) + if ( diff < 0 || !HasFlag(wxTB_TEXT) ) { - // the control is too high, resize to fit - control->SetSize(wxDefaultCoord, height - 2); + // not enough room for the static text + if ( staticText ) + staticText->Hide(); + + // recalculate height & diff without the staticText control + height = r.bottom - r.top; + diff = height - size.y; + if ( diff < 0 ) + { + // the control is too high, resize to fit + control->SetSize(wxDefaultCoord, height - 2); - diff = 2; + diff = 2; + } + } + else // enough space for both the control and the label + { + if ( staticText ) + staticText->Show(); } int top; - if ( isVertical ) + if ( IsVertical() ) { left = 0; top = y; @@ -1050,13 +1127,18 @@ bool wxToolBar::Realize() } control->Move(left, top + (diff + 1) / 2); + if ( staticText ) + { + staticText->Move(left + (size.x - staticTextSize.x)/2, + r.bottom - staticTextSize.y); + } } // the max index is the "real" number of buttons - i.e. counting even the // separators which we added just for aligning the controls m_nButtons = index; - if ( !isVertical ) + if ( !IsVertical() ) { if ( m_maxRows == 0 ) // if not set yet, only one row @@ -1064,9 +1146,9 @@ bool wxToolBar::Realize() } else if ( m_nButtons > 0 ) // vertical non empty toolbar { - if ( m_maxRows == 0 ) - // if not set yet, have one column - SetRows(m_nButtons); + // if not set yet, have one column + m_maxRows = 1; + SetRows(m_nButtons); } InvalidateBestSize(); @@ -1324,6 +1406,30 @@ void wxToolBar::DoSetToggle(wxToolBarToolBase *WXUNUSED(tool), bool WXUNUSED(tog wxFAIL_MSG( _T("not implemented") ); } +void wxToolBar::SetToolNormalBitmap( int id, const wxBitmap& bitmap ) +{ + wxToolBarTool* tool = wx_static_cast(wxToolBarTool*, FindById(id)); + if ( tool ) + { + wxCHECK_RET( tool->IsButton(), wxT("Can only set bitmap on button tools.")); + + tool->SetNormalBitmap(bitmap); + Realize(); + } +} + +void wxToolBar::SetToolDisabledBitmap( int id, const wxBitmap& bitmap ) +{ + wxToolBarTool* tool = wx_static_cast(wxToolBarTool*, FindById(id)); + if ( tool ) + { + wxCHECK_RET( tool->IsButton(), wxT("Can only set bitmap on button tools.")); + + tool->SetDisabledBitmap(bitmap); + Realize(); + } +} + // ---------------------------------------------------------------------------- // event handlers // ---------------------------------------------------------------------------- @@ -1349,9 +1455,14 @@ void wxToolBar::OnSysColourChanged(wxSysColourChangedEvent& event) void wxToolBar::OnMouseEvent(wxMouseEvent& event) { - if (event.Leaving() && m_pInTool) + if ( event.Leaving() ) { - OnMouseEnter( -1 ); + if ( m_pInTool ) + { + OnMouseEnter(wxID_ANY); + m_pInTool = NULL; + } + event.Skip(); return; } @@ -1428,7 +1539,7 @@ bool wxToolBar::HandleSize(WXWPARAM WXUNUSED(wParam), WXLPARAM lParam) { int w, h; - if ( GetWindowStyle() & wxTB_VERTICAL ) + if ( IsVertical() ) { w = r.right - r.left; if ( m_maxRows ) @@ -1508,12 +1619,18 @@ bool wxToolBar::HandlePaint(WXWPARAM wParam, WXLPARAM lParam) // otherwise for ( node = m_tools.GetFirst(); node; node = node->GetNext() ) { - wxToolBarToolBase *tool = node->GetData(); + wxToolBarTool *tool = (wxToolBarTool*)node->GetData(); if ( tool->IsControl() ) { // get the control rect in our client coords wxControl *control = tool->GetControl(); + wxStaticText *staticText = tool->GetStaticText(); wxRect rectCtrl = control->GetRect(); + wxRect rectStaticText(0,0,0,0); + if ( staticText ) + { + rectStaticText = staticText->GetRect(); + } // iterate over all buttons TBBUTTON tbb; @@ -1554,6 +1671,15 @@ bool wxToolBar::HandlePaint(WXWPARAM wParam, WXLPARAM lParam) // style in the parent: the controls can disappear control->Refresh(false); } + if ( staticText && rectStaticText.Intersects(rectItem) ) + { + // yes, do erase it! + dc.DrawRectangle(rectItem); + + // Necessary in case we use a no-paint-on-size + // style in the parent: the controls can disappear + staticText->Refresh(false); + } } } } @@ -1567,18 +1693,11 @@ void wxToolBar::HandleMouseMove(WXWPARAM WXUNUSED(wParam), WXLPARAM lParam) y = GET_Y_LPARAM(lParam); wxToolBarToolBase* tool = FindToolForPosition( x, y ); - // cursor left current tool - if ( tool != m_pInTool && !tool ) - { - m_pInTool = 0; - OnMouseEnter( -1 ); - } - - // cursor entered a tool - if ( tool != m_pInTool && tool ) + // has the current tool changed? + if ( tool != m_pInTool ) { m_pInTool = tool; - OnMouseEnter( tool->GetId() ); + OnMouseEnter(tool ? tool->GetId() : wxID_ANY); } }