#define DEFAULTBITMAPX 16
#define DEFAULTBITMAPY 15
#define DEFAULTBUTTONX 24
#define DEFAULTBUTTONY 22
#define DEFAULTBARHEIGHT 27
#define DEFAULTBITMAPX 16
#define DEFAULTBITMAPY 15
#define DEFAULTBUTTONX 24
#define DEFAULTBUTTONY 22
#define DEFAULTBARHEIGHT 27
-#if !wxUSE_IMAGE_LOADING_IN_MSW
-#error If wxUSE_IMAGE_LOADING_IN_MSW is set to 0, then wxUSE_BUTTONBAR must be set to 0 too.
-#endif
+// ----------------------------------------------------------------------------
+// private classes
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxToolBarTool : public wxToolBarToolBase
+{
+public:
+ wxToolBarTool(wxToolBar *tbar,
+ int id,
+ const wxBitmap& bmpNormal,
+ const wxBitmap& bmpDisabled,
+ bool toggle,
+ wxObject *clientData,
+ const wxString& shortHelp,
+ const wxString& longHelp)
+ : wxToolBarToolBase(tbar, id, bmpNormal, bmpDisabled, toggle,
+ clientData, shortHelp, longHelp)
+ {
+ }
+
+ wxToolBarTool(wxToolBar *tbar, wxControl *control)
+ : wxToolBarToolBase(tbar, control)
+ {
+ }
+
+ void SetSize(const wxSize& size)
+ {
+ m_width = size.x;
+ m_height = size.y;
+ }
+
+ long GetWidth() const { return m_width; }
+ long GetHeight() const { return m_height; }
+
+ wxCoord m_x;
+ wxCoord m_y;
+ wxCoord m_width;
+ wxCoord m_height;
+};
+
+// ----------------------------------------------------------------------------
+// wxWin macros
+// ----------------------------------------------------------------------------
-wxToolBarMSW::wxToolBarMSW(void)
+// ============================================================================
+// implementation
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// wxToolBarTool
+// ----------------------------------------------------------------------------
+
+wxToolBarToolBase *wxToolBar::CreateTool(int id,
+ const wxString& label,
+ const wxBitmap& bmpNormal,
+ const wxBitmap& bmpDisabled,
+ wxItemKind kind,
+ wxObject *clientData,
+ const wxString& shortHelp,
+ const wxString& longHelp)
- // Set it to grey
- SetBackgroundColour(wxColour(192, 192, 192));
+void wxToolBar::Init()
+{
+ m_hbrDither = 0;
+ m_rgbFace = 0;
+ m_rgbShadow = 0;
+ m_rgbHilight = 0;
+ m_rgbFrame = 0;
+ m_hdcMono = 0;
+ m_hbmMono = 0;
+ m_hbmDefault = 0;
+
+ m_defaultWidth = DEFAULTBITMAPX;
+ m_defaultHeight = DEFAULTBITMAPY;
+
+ m_xPos =
+ m_yPos = -1;
+
+ m_maxWidth = m_maxHeight = 0;
+ m_pressedTool = m_currentTool = -1;
+ m_toolPacking = 1;
+ m_toolSeparation = 5;
+}
+
+bool wxToolBar::Create(wxWindow *parent,
+ wxWindowID id,
+ const wxPoint& pos,
+ const wxSize& size,
+ long style,
+ const wxString& name)
+{
+ if ( !wxWindow::Create(parent, id, pos, size, style, name) )
+ return FALSE;
+
+ if ( style & wxTB_HORIZONTAL )
+ {
+ m_lastX = 3;
+ m_lastY = 7;
+ }
+ else
+ {
+ m_lastX = 7;
+ m_lastY = 3;
+ }
- wxNode *node = m_tools.First();
- while (node)
- {
- wxToolBarTool *tool = (wxToolBarTool *)node->Data();
- if (tool->m_toolStyle != wxTOOL_STYLE_SEPARATOR)
- {
- int state = wxTBSTATE_ENABLED;
- if (!tool->m_enabled)
- state = 0;
- if (tool->m_isToggle && tool->m_toggleState)
- state |= wxTBSTATE_CHECKED;
- DrawTool(dc, tool, state);
- }
- node = node->Next();
- }
- wxOnPaintCount --;
+wxToolBarToolBase *wxToolBar::AddTool(int id,
+ const wxBitmap& bitmap,
+ const wxBitmap& pushedBitmap,
+ bool toggle,
+ wxCoord xPos,
+ wxCoord yPos,
+ wxObject *clientData,
+ const wxString& helpString1,
+ const wxString& helpString2)
+{
+ // rememeber the position for DoInsertTool()
+ m_xPos = xPos;
+ m_yPos = yPos;
+
+ return wxToolBarBase::AddTool(id, bitmap, pushedBitmap, toggle,
+ xPos, yPos, clientData,
+ helpString1, helpString2);
- wxToolBarBase::OnSize(event);
+ wxPaintDC dc(this);
+
+ static int wxOnPaintCount = 0;
+
+ // Prevent reentry of OnPaint which would cause
+ // wxMemoryDC errors.
+ if (wxOnPaintCount > 0)
+ return;
+ wxOnPaintCount++;
+
+ wxToolBarToolsList::Node *node = m_tools.GetFirst();
+ while (node)
+ {
+ wxToolBarToolBase *tool = node->GetData();
+ if ( tool->GetStyle()!= wxTOOL_STYLE_BUTTON )
+ {
+ int state = tool->IsEnabled() ? wxTBSTATE_ENABLED : 0;
+ if ( tool->IsToggled() )
+ state |= wxTBSTATE_CHECKED;
+
+ DrawTool(dc, tool, state);
+ }
+
+ node = node->GetNext();
+ }
+
+ wxOnPaintCount--;
- ::ReleaseCapture();
- int state = wxTBSTATE_ENABLED;
- if (eventCurrentTool->m_toggleState)
- state |= wxTBSTATE_CHECKED;
- DrawTool(dc, eventCurrentTool, state);
- eventCurrentTool = NULL;
+ m_currentTool = -1;
+ if (eventCurrentTool && eventCurrentTool->IsEnabled())
+ {
+ ::ReleaseCapture();
+ int state = wxTBSTATE_ENABLED;
+ if (eventCurrentTool->IsToggled())
+ state |= wxTBSTATE_CHECKED;
+ DrawTool(dc, eventCurrentTool, state);
+ eventCurrentTool = NULL;
+ }
+ OnMouseEnter(-1);
+ return;
- // Might have dragged outside tool
- if (eventCurrentTool != tool)
- {
- int state = wxTBSTATE_ENABLED;
- if (tool->m_toggleState)
- state |= wxTBSTATE_CHECKED;
- DrawTool(dc, tool, state);
- eventCurrentTool = NULL;
- return;
- }
+ if (eventCurrentTool)
+ {
+ // Might have dragged outside tool
+ if (eventCurrentTool != tool)
+ {
+ int state = wxTBSTATE_ENABLED;
+ if (tool->IsToggled())
+ state |= wxTBSTATE_CHECKED;
+ DrawTool(dc, tool, state);
+ eventCurrentTool = NULL;
+ return;
+ }
+ }
+ else
+ {
+ if (tool && event.LeftIsDown() && tool->IsEnabled())
+ {
+ eventCurrentTool = tool;
+ ::SetCapture((HWND) GetHWND());
+ int state = wxTBSTATE_ENABLED|wxTBSTATE_PRESSED;
+ if (tool->IsToggled())
+ state |= wxTBSTATE_CHECKED;
+ DrawTool(dc, tool, state);
+ }
+ }
- }
- if (event.LeftDown() && tool->m_enabled)
- {
- eventCurrentTool = tool;
- ::SetCapture((HWND) GetHWND());
- int state = wxTBSTATE_ENABLED|wxTBSTATE_PRESSED;
- if (tool->m_toggleState)
- state |= wxTBSTATE_CHECKED;
- DrawTool(dc, tool, state);
- }
- else if (event.LeftUp() && tool->m_enabled)
- {
- if (eventCurrentTool)
- ::ReleaseCapture();
- if (eventCurrentTool == tool)
+ else if (event.LeftUp() && tool->IsEnabled())
- tool->m_toggleState = !tool->m_toggleState;
+ if (tool->CanBeToggled())
+ {
+ tool->Toggle();
+ if (!OnLeftClick(tool->GetId(), tool->IsToggled()))
+ {
+ tool->Toggle();
+ }
+ int state = wxTBSTATE_ENABLED;
+ if (tool->IsToggled())
+ state |= wxTBSTATE_CHECKED;
+ DrawTool(dc, tool, state);
+ }
+ else
+ {
+ int state = wxTBSTATE_ENABLED;
+ if (tool->IsToggled())
+ state |= wxTBSTATE_CHECKED;
+ DrawTool(dc, tool, state);
+ OnLeftClick(tool->GetId(), tool->IsToggled());
+ }
- int state = wxTBSTATE_ENABLED;
- if (tool->m_toggleState)
- state |= wxTBSTATE_CHECKED;
- DrawTool(dc, tool, state);
- }
- else
- {
- int state = wxTBSTATE_ENABLED;
- if (tool->m_toggleState)
- state |= wxTBSTATE_CHECKED;
- DrawTool(dc, tool, state);
- OnLeftClick(tool->m_index, tool->m_toggleState);
- }
+ eventCurrentTool = NULL;
+ }
+ else if (event.RightDown() && tool->IsEnabled())
+ {
+ OnRightClick(tool->GetId(), x, y);
- wxNode *node = m_tools.Find((long)toolIndex);
- if (node)
- {
- wxClientDC dc(this);
-
- // at first do the enabling/disabling in the base class
- wxToolBarBase::EnableTool(toolIndex,enable);
- // then calculate the state of the tool and draw it
- wxToolBarTool *tool = (wxToolBarTool *)node->Data();
- int state = 0;
- if(tool->m_toggleState) state |= wxTBSTATE_CHECKED;
- if(tool->m_enabled) state |= wxTBSTATE_ENABLED;
- // how can i access the PRESSED state???
- DrawTool(dc, tool,state);
- }
-// If pushedBitmap is NULL, a reversed version of bitmap is
-// created and used as the pushed/toggled image.
-// If toggle is TRUE, the button toggles between the two states.
-wxToolBarTool *wxToolBarMSW::AddTool(int index, const wxBitmap& bitmap, const wxBitmap& pushedBitmap,
- bool toggle, long xPos, long yPos, wxObject *clientData, const wxString& helpString1, const wxString& helpString2)
+void wxToolBar::DoRedrawTool(wxToolBarToolBase *tool)
- wxToolBarTool *tool = new wxToolBarTool(index, bitmap, bitmap2, toggle, xPos, yPos, helpString1, helpString2);
-#else
- wxToolBarTool *tool = new wxToolBarTool(index, bitmap, wxNullBitmap, toggle, xPos, yPos, helpString1, helpString2);
-#endif
+void wxToolBar::DrawTool(wxDC& dc, wxToolBarToolBase *toolBase, int state)
+{
+ wxToolBarTool *tool = (wxToolBarTool *)toolBase;
- tool->m_deleteSecondBitmap = TRUE;
- tool->SetSize(GetToolSize().x, GetToolSize().y);
-
- // Calculate reasonable max size in case Layout() not called
- if ((tool->m_x + bitmap.GetWidth() + m_xMargin) > m_maxWidth)
- m_maxWidth = (tool->m_x + tool->GetWidth() + m_xMargin);
+bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos),
+ wxToolBarToolBase *tool)
+{
+ // VZ: didn't test whether it works, but why not...
+ tool->Detach();
- // Find the maximum tool width and height
- wxNode *node = m_tools.First();
- while (node)
- {
- wxToolBarTool *tool = (wxToolBarTool *)node->Data();
- if (tool->GetWidth() > maxToolWidth)
- maxToolWidth = (int)tool->GetWidth();
- if (tool->GetHeight() > maxToolHeight)
- maxToolHeight = (int)tool->GetHeight();
- node = node->Next();
- }
+ wxCHECK_MSG( !tool->IsControl(), FALSE,
+ _T("generic wxToolBar doesn't support controls") );
- if ( GetWindowStyleFlag() & wxTB_HORIZONTAL )
- {
- if (m_currentRowsOrColumns >= m_maxCols)
- m_lastY += separatorSize;
- else
- m_lastX += separatorSize;
- }
- else
- {
- if (m_currentRowsOrColumns >= m_maxRows)
- m_lastX += separatorSize;
- else
- m_lastY += separatorSize;
- }
+ // Calculate reasonable max size in case Layout() not called
+ if ((tool->m_x + tool->GetBitmap1().GetWidth() + m_xMargin) > m_maxWidth)
+ m_maxWidth = (tool->m_x + tool->GetWidth() + m_xMargin);
+
+ if ((tool->m_y + tool->GetBitmap1().GetHeight() + m_yMargin) > m_maxHeight)
+ m_maxHeight = (tool->m_y + tool->GetHeight() + m_yMargin);
- else if (tool->m_toolStyle == wxTOOL_STYLE_BUTTON)
+
+ return TRUE;
+}
+
+bool wxToolBar::Realize()
+{
+ m_currentRowsOrColumns = 0;
+ m_lastX = m_xMargin;
+ m_lastY = m_yMargin;
+ int maxToolWidth = 0;
+ int maxToolHeight = 0;
+ m_maxWidth = 0;
+ m_maxHeight = 0;
+
+ // Find the maximum tool width and height
+ wxToolBarToolsList::Node *node = m_tools.GetFirst();
+ while (node)
+ {
+ wxToolBarTool *tool = (wxToolBarTool *)node->GetData();
+ if (tool->GetWidth() > maxToolWidth)
+ maxToolWidth = tool->GetWidth();
+ if (tool->GetHeight() > maxToolHeight)
+ maxToolHeight = tool->GetHeight();
+ node = node->GetNext();
+ }
+
+ int separatorSize = m_toolSeparation;
+
+ node = m_tools.GetFirst();
+ while (node)
- m_currentRowsOrColumns = 0;
- m_lastX += (maxToolWidth + m_toolPacking);
- m_lastY = m_yMargin;
+ if ( GetWindowStyleFlag() & wxTB_HORIZONTAL )
+ {
+ if (m_currentRowsOrColumns >= m_maxCols)
+ {
+ m_currentRowsOrColumns = 0;
+ m_lastX = m_xMargin;
+ m_lastY += maxToolHeight + m_toolPacking;
+ }
+ tool->m_x = (long) (m_lastX + (maxToolWidth - tool->GetWidth())/2.0);
+ tool->m_y = (long) (m_lastY + (maxToolHeight - tool->GetHeight())/2.0);
+
+ m_lastX += maxToolWidth + m_toolPacking;
+ }
+ else
+ {
+ if (m_currentRowsOrColumns >= m_maxRows)
+ {
+ m_currentRowsOrColumns = 0;
+ m_lastX += (maxToolWidth + m_toolPacking);
+ m_lastY = m_yMargin;
+ }
+ tool->m_x = (long) (m_lastX + (maxToolWidth - tool->GetWidth())/2.0);
+ tool->m_y = (long) (m_lastY + (maxToolHeight - tool->GetHeight())/2.0);
+
+ m_lastY += maxToolHeight + m_toolPacking;
+ }
+ m_currentRowsOrColumns ++;
- PatB(hdc, x + 1, y, dx - 2, 1, m_rgbFrame);
- PatB(hdc, x + 1, y + dy - 1, dx - 2, 1, m_rgbFrame);
- PatB(hdc, x, y + 1, 1, dy - 2, m_rgbFrame);
- PatB(hdc, x + dx - 1, y +1, 1, dy - 2, m_rgbFrame);
- PatB(hdc, x + 1, y + 1, 1, dy-2, m_rgbShadow);
- PatB(hdc, x + 1, y + 1, dx-2, 1, m_rgbShadow);
+ PatB(hdc, x + 1, y, dx - 2, 1, m_rgbFrame);
+ PatB(hdc, x + 1, y + dy - 1, dx - 2, 1, m_rgbFrame);
+ PatB(hdc, x, y + 1, 1, dy - 2, m_rgbFrame);
+ PatB(hdc, x + dx - 1, y +1, 1, dy - 2, m_rgbFrame);
+ PatB(hdc, x + 1, y + 1, 1, dy-2, m_rgbShadow);
+ PatB(hdc, x + 1, y + 1, dx-2, 1, m_rgbShadow);
- PatB(hdc, x + 1, y, dx - 2, 1, m_rgbFrame);
- PatB(hdc, x + 1, y + dy - 1, dx - 2, 1, m_rgbFrame);
- PatB(hdc, x, y + 1, 1, dy - 2, m_rgbFrame);
- PatB(hdc, x + dx - 1, y + 1, 1, dy - 2, m_rgbFrame);
- dx -= 2;
- dy -= 2;
- PatB(hdc, x + 1, y + 1, 1, dy - 1, m_rgbHilight);
- PatB(hdc, x + 1, y + 1, dx - 1, 1, m_rgbHilight);
- PatB(hdc, x + dx, y + 1, 1, dy, m_rgbShadow);
- PatB(hdc, x + 1, y + dy, dx, 1, m_rgbShadow);
- PatB(hdc, x + dx - 1, y + 2, 1, dy - 2, m_rgbShadow);
- PatB(hdc, x + 2, y + dy - 1, dx - 2, 1, m_rgbShadow);
+ PatB(hdc, x + 1, y, dx - 2, 1, m_rgbFrame);
+ PatB(hdc, x + 1, y + dy - 1, dx - 2, 1, m_rgbFrame);
+ PatB(hdc, x, y + 1, 1, dy - 2, m_rgbFrame);
+ PatB(hdc, x + dx - 1, y + 1, 1, dy - 2, m_rgbFrame);
+ dx -= 2;
+ dy -= 2;
+ PatB(hdc, x + 1, y + 1, 1, dy - 1, m_rgbHilight);
+ PatB(hdc, x + 1, y + 1, dx - 1, 1, m_rgbHilight);
+ PatB(hdc, x + dx, y + 1, 1, dy, m_rgbShadow);
+ PatB(hdc, x + 1, y + dy, dx, 1, m_rgbShadow);
+ PatB(hdc, x + dx - 1, y + 2, 1, dy - 2, m_rgbShadow);
+ PatB(hdc, x + 2, y + dy - 1, dx - 2, 1, m_rgbShadow);