// Created: 04/01/98
// RCS-ID: $Id$
// Copyright: (c) Julian Smart and Markus Holzem
-// Licence: wxWindows license
+// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#include "wx/wx.h"
#endif
+#include "wx/frame.h"
+
// For ::UpdateWindow
#ifdef __WXMSW__
#include <windows.h>
#endif
-#if USE_TOOLBAR
+#if wxUSE_TOOLBAR
#include "wx/tbarbase.h"
#if !USE_SHARED_LIBRARY
-IMPLEMENT_DYNAMIC_CLASS(wxToolBarBase, wxControl)
+IMPLEMENT_ABSTRACT_CLASS(wxToolBarBase, wxControl)
IMPLEMENT_DYNAMIC_CLASS(wxToolBarTool, wxObject)
BEGIN_EVENT_TABLE(wxToolBarBase, wxControl)
// is still valid: a tool may have quit the toolbar.
static wxList gs_ToolBars;
+#ifdef __WXGTK__
+wxToolBarTool::wxToolBarTool(wxToolBar *owner, int theIndex,
+ const wxBitmap& theBitmap1, const wxBitmap& theBitmap2,
+ bool toggle, wxObject *clientData,
+ const wxString& helpS1, const wxString& helpS2,
+ GtkWidget *pixmap )
+#else
wxToolBarTool::wxToolBarTool(int theIndex,
const wxBitmap& theBitmap1, const wxBitmap& theBitmap2, bool toggle,
long xPos, long yPos, const wxString& helpS1, const wxString& helpS2)
+#endif
{
m_toolStyle = wxTOOL_STYLE_BUTTON;
+#ifdef __WXGTK__
+ m_owner = owner;
+ m_pixmap = pixmap;
+ m_item = (GtkWidget*) NULL;
+ m_clientData = clientData;
+ m_x = 0;
+ m_y = 0;
+#else
m_clientData = NULL;
+ m_x = xPos;
+ m_y = yPos;
+#endif
m_index = theIndex;
m_isToggle = toggle;
m_toggleState = FALSE;
m_enabled = TRUE;
m_bitmap1 = theBitmap1;
m_bitmap2 = theBitmap2;
- m_x = xPos;
- m_y = yPos;
m_width = m_height = 0;
m_deleteSecondBitmap = FALSE;
if (m_bitmap1.Ok())
m_longHelpString = helpS2;
}
-wxToolBarTool::~wxToolBarTool(void)
+wxToolBarTool::~wxToolBarTool()
{
/*
if (m_deleteSecondBitmap && m_bitmap2)
{
gs_ToolBars.Append(this);
- m_tilingDirection = wxVERTICAL;
- m_rowsOrColumns = 0;
+ m_maxRows = 1;
+ m_maxCols = 32000;
m_maxWidth = 0;
m_maxHeight = 0;
m_defaultWidth = 16;
event.SetEventObject(this);
event.SetExtraLong((long) toggleDown);
+ // Send events to this toolbar instead (and thence up the window hierarchy)
GetEventHandler()->ProcessEvent(event);
return TRUE;
}
// Call when right button down.
-void wxToolBarBase::OnRightClick(int toolIndex, long x, long y)
+void wxToolBarBase::OnRightClick(int toolIndex,
+ long WXUNUSED(x),
+ long WXUNUSED(y))
{
wxCommandEvent event(wxEVT_COMMAND_TOOL_RCLICKED, toolIndex);
event.SetEventObject(this);
+ event.SetInt(toolIndex);
GetEventHandler()->ProcessEvent(event);
}
// Called when the mouse cursor enters a tool bitmap (no button pressed).
// Argument is -1 if mouse is exiting the toolbar.
+// Note that for this event, the id of the window is used,
+// and the integer parameter of wxCommandEvent is used to retrieve
+// the tool id.
void wxToolBarBase::OnMouseEnter ( int toolIndex )
{
- wxCommandEvent event(wxEVT_COMMAND_TOOL_ENTER, toolIndex);
+ wxCommandEvent event(wxEVT_COMMAND_TOOL_ENTER, GetId());
event.SetEventObject(this);
+ event.SetInt(toolIndex);
GetEventHandler()->ProcessEvent(event);
}
bool toggle, long xPos, long yPos, wxObject *clientData,
const wxString& helpString1, const wxString& helpString2)
{
+#ifdef __WXGTK__
+ wxToolBarTool *tool = new wxToolBarTool( (wxToolBar*)this, index, bitmap, pushedBitmap, toggle,
+ (wxObject*) NULL, helpString1, helpString2);
+#else
wxToolBarTool *tool = new wxToolBarTool(index, bitmap, pushedBitmap, toggle, xPos, yPos, helpString1, helpString2);
+#endif
tool->m_clientData = clientData;
if (xPos > -1)
tool->m_y = yPos;
else
tool->m_y = m_yMargin;
-
+
// Calculate reasonable max size in case Layout() not called
if ((tool->m_x + bitmap.GetWidth() + m_xMargin) > m_maxWidth)
m_maxWidth = (tool->m_x + bitmap.GetWidth() + m_xMargin);
void wxToolBarBase::AddSeparator ()
{
wxToolBarTool *tool = new wxToolBarTool;
+ tool->m_index = -1;
tool->m_toolStyle = wxTOOL_STYLE_SEPARATOR;
- m_tools.Append(tool);
+ m_tools.Append(-1, tool);
}
-void wxToolBarBase::ClearTools(void)
+void wxToolBarBase::ClearTools()
{
m_pressedTool = m_currentTool = -1;
wxNode *node = m_tools.First();
}
}
-void wxToolBarBase::ToggleTool(int index, bool toggle)
+void wxToolBarBase::ToggleTool(int WXUNUSED(index),
+ bool WXUNUSED(toggle))
{
}
m_toolSeparation = separation;
}
-void wxToolBarBase::Command(wxCommandEvent& event)
+void wxToolBarBase::Command(wxCommandEvent& WXUNUSED(event))
{
}
-void wxToolBarBase::Layout(void)
+void wxToolBarBase::LayoutTools()
{
- 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
- 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();
- }
-
- int separatorSize = m_toolSeparation;
-
- node = m_tools.First();
- while (node)
- {
- wxToolBarTool *tool = (wxToolBarTool *)node->Data();
- if (tool->m_toolStyle == wxTOOL_STYLE_SEPARATOR)
- {
- if (m_tilingDirection == wxHORIZONTAL)
- {
- if (m_currentRowsOrColumns >= m_rowsOrColumns)
- m_lastY += separatorSize;
- else
- m_lastX += separatorSize;
- }
- else
- {
- if (m_currentRowsOrColumns >= m_rowsOrColumns)
- m_lastX += separatorSize;
- else
- m_lastY += separatorSize;
- }
- }
- else if (tool->m_toolStyle == wxTOOL_STYLE_BUTTON)
- {
- if (m_tilingDirection == wxHORIZONTAL)
- {
- if (m_currentRowsOrColumns >= m_rowsOrColumns)
- {
- 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_rowsOrColumns)
- {
- 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 ++;
- }
-
- if (m_lastX > m_maxWidth)
- m_maxWidth = m_lastX;
- if (m_lastY > m_maxHeight)
- m_maxHeight = m_lastY;
-
- node = node->Next();
- }
- if (m_tilingDirection == wxVERTICAL)
- m_maxWidth += maxToolWidth;
- else
- m_maxHeight += maxToolHeight;
-
- m_maxWidth += m_xMargin;
- m_maxHeight += m_yMargin;
}
* noUnitsX/noUnitsY: : no. units per scrollbar
*/
void wxToolBarBase::SetScrollbars (int pixelsPerUnitX, int pixelsPerUnitY,
- int noUnitsX, int noUnitsY,
- int xPos, int yPos)
+ int noUnitsX, int noUnitsY,
+ int xPos, int yPos)
{
m_xScrollPixelsPerLine = pixelsPerUnitX;
m_yScrollPixelsPerLine = pixelsPerUnitY;
// Recalculate scroll bar range and position
if (m_xScrollLines > 0)
- {
- m_xScrollPosition = xPos;
- SetScrollPos (wxHORIZONTAL, m_xScrollPosition, TRUE);
- }
+ {
+ m_xScrollPosition = xPos;
+ SetScrollPos (wxHORIZONTAL, m_xScrollPosition, TRUE);
+ }
else
{
- SetScrollbar(wxHORIZONTAL, 0, 0, 0, FALSE);
+ SetScrollbar(wxHORIZONTAL, 0, 0, 0, FALSE);
m_xScrollPosition = 0;
}
if (m_yScrollLines > 0)
- {
- m_yScrollPosition = yPos;
- SetScrollPos (wxVERTICAL, m_yScrollPosition, TRUE);
- }
+ {
+ m_yScrollPosition = yPos;
+ SetScrollPos (wxVERTICAL, m_yScrollPosition, TRUE);
+ }
else
{
- SetScrollbar(wxVERTICAL, 0, 0, 0, FALSE);
+ SetScrollbar(wxVERTICAL, 0, 0, 0, FALSE);
m_yScrollPosition = 0;
}
- AdjustScrollbars();
+ AdjustScrollbars();
Refresh();
#ifdef __WXMSW__
::UpdateWindow ((HWND) GetHWND());
int nScrollInc = 0;
switch (event.GetEventType())
{
- case wxEVENT_TYPE_SCROLL_TOP:
+ case wxEVT_SCROLL_TOP:
{
if (orient == wxHORIZONTAL)
nScrollInc = - m_xScrollPosition;
nScrollInc = - m_yScrollPosition;
break;
}
- case wxEVENT_TYPE_SCROLL_BOTTOM:
+ case wxEVT_SCROLL_BOTTOM:
{
if (orient == wxHORIZONTAL)
nScrollInc = m_xScrollLines - m_xScrollPosition;
nScrollInc = m_yScrollLines - m_yScrollPosition;
break;
}
- case wxEVENT_TYPE_SCROLL_LINEUP:
+ case wxEVT_SCROLL_LINEUP:
{
nScrollInc = -1;
break;
}
- case wxEVENT_TYPE_SCROLL_LINEDOWN:
+ case wxEVT_SCROLL_LINEDOWN:
{
nScrollInc = 1;
break;
}
- case wxEVENT_TYPE_SCROLL_PAGEUP:
+ case wxEVT_SCROLL_PAGEUP:
{
if (orient == wxHORIZONTAL)
nScrollInc = -GetScrollPageSize(wxHORIZONTAL);
nScrollInc = -GetScrollPageSize(wxVERTICAL);
break;
}
- case wxEVENT_TYPE_SCROLL_PAGEDOWN:
+ case wxEVT_SCROLL_PAGEDOWN:
{
if (orient == wxHORIZONTAL)
nScrollInc = GetScrollPageSize(wxHORIZONTAL);
nScrollInc = GetScrollPageSize(wxVERTICAL);
break;
}
- case wxEVENT_TYPE_SCROLL_THUMBTRACK:
+ case wxEVT_SCROLL_THUMBTRACK:
{
if (orient == wxHORIZONTAL)
nScrollInc = pos - m_xScrollPosition;
if (orient == wxHORIZONTAL)
{
int w, h;
- GetClientSize(&w, &h);
+ GetClientSize(&w, &h);
- int nMaxWidth = m_xScrollLines*m_xScrollPixelsPerLine;
- int noPositions = (int) ( ((nMaxWidth - w)/(float)m_xScrollPixelsPerLine) + 0.5 );
- if (noPositions < 0)
- noPositions = 0;
+ int nMaxWidth = m_xScrollLines*m_xScrollPixelsPerLine;
+ int noPositions = (int) ( ((nMaxWidth - w)/(float)m_xScrollPixelsPerLine) + 0.5 );
+ if (noPositions < 0)
+ noPositions = 0;
- if ( (m_xScrollPosition + nScrollInc) < 0 )
- nScrollInc = -m_xScrollPosition; // As -ve as we can go
- else if ( (m_xScrollPosition + nScrollInc) > noPositions )
- nScrollInc = noPositions - m_xScrollPosition; // As +ve as we can go
+ if ( (m_xScrollPosition + nScrollInc) < 0 )
+ nScrollInc = -m_xScrollPosition; // As -ve as we can go
+ else if ( (m_xScrollPosition + nScrollInc) > noPositions )
+ nScrollInc = noPositions - m_xScrollPosition; // As +ve as we can go
return nScrollInc;
}
else
{
int w, h;
- GetClientSize(&w, &h);
+ GetClientSize(&w, &h);
- int nMaxHeight = m_yScrollLines*m_yScrollPixelsPerLine;
- int noPositions = (int) ( ((nMaxHeight - h)/(float)m_yScrollPixelsPerLine) + 0.5 );
- if (noPositions < 0)
- noPositions = 0;
+ int nMaxHeight = m_yScrollLines*m_yScrollPixelsPerLine;
+ int noPositions = (int) ( ((nMaxHeight - h)/(float)m_yScrollPixelsPerLine) + 0.5 );
+ if (noPositions < 0)
+ noPositions = 0;
- if ( (m_yScrollPosition + nScrollInc) < 0 )
- nScrollInc = -m_yScrollPosition; // As -ve as we can go
- else if ( (m_yScrollPosition + nScrollInc) > noPositions )
- nScrollInc = noPositions - m_yScrollPosition; // As +ve as we can go
+ if ( (m_yScrollPosition + nScrollInc) < 0 )
+ nScrollInc = -m_yScrollPosition; // As -ve as we can go
+ else if ( (m_yScrollPosition + nScrollInc) > noPositions )
+ nScrollInc = noPositions - m_yScrollPosition; // As +ve as we can go
return nScrollInc;
}
}
// Adjust the scrollbars - new version.
-void wxToolBarBase::AdjustScrollbars(void)
+void wxToolBarBase::AdjustScrollbars()
{
int w, h;
GetClientSize(&w, &h);
m_xScrollPosition = wxMin(newRange, m_xScrollPosition);
- // Calculate page size i.e. number of scroll units you get on the
- // current client window
+ // Calculate page size i.e. number of scroll units you get on the
+ // current client window
int noPagePositions = (int) ( (w/(float)m_xScrollPixelsPerLine) + 0.5 );
if (noPagePositions < 1)
noPagePositions = 1;
m_yScrollPosition = wxMin(newRange, m_yScrollPosition);
- // Calculate page size i.e. number of scroll units you get on the
- // current client window
+ // Calculate page size i.e. number of scroll units you get on the
+ // current client window
int noPagePositions = (int) ( (h/(float)m_yScrollPixelsPerLine) + 0.5 );
if (noPagePositions < 1)
noPagePositions = 1;
}
// Default OnSize resets scrollbars, if any
-void wxToolBarBase::OnSize(wxSizeEvent& event)
+void wxToolBarBase::OnSize(wxSizeEvent& WXUNUSED(event))
{
-#if USE_CONSTRAINTS
+#if wxUSE_CONSTRAINTS
if (GetAutoLayout())
Layout();
#endif
// Prepare the DC by translating it according to the current scroll position
void wxToolBarBase::PrepareDC(wxDC& dc)
{
- dc.SetDeviceOrigin(- m_xScrollPosition * m_xScrollPixelsPerLine, - m_yScrollPosition * m_yScrollPixelsPerLine);
+ dc.SetDeviceOrigin(- m_xScrollPosition * m_xScrollPixelsPerLine, - m_yScrollPosition * m_yScrollPixelsPerLine);
}
void wxToolBarBase::GetScrollPixelsPerUnit (int *x_unit, int *y_unit) const
*y = m_yScrollPosition;
}
-/*
-void wxToolBarBase::CalcScrolledPosition(int x, int y, int *xx, int *yy) const
+void wxToolBarBase::OnIdle(wxIdleEvent&
+#ifdef __WXGTK__
+ WXUNUSED(event)
+#else
+ event
+#endif
+ )
{
- *xx = (m_calcScrolledOffset ? (x - m_xScrollPosition * m_xScrollPixelsPerLine) : x);
- *yy = (m_calcScrolledOffset ? (y - m_yScrollPosition * m_yScrollPixelsPerLine) : y);
-}
+#ifndef __WXGTK__
+ wxWindow::OnIdle(event);
+#endif
-void wxToolBarBase::CalcUnscrolledPosition(int x, int y, float *xx, float *yy) const
-{
- *xx = (float)(m_calcScrolledOffset ? (x + m_xScrollPosition * m_xScrollPixelsPerLine) : x);
- *yy = (float)(m_calcScrolledOffset ? (y + m_yScrollPosition * m_yScrollPixelsPerLine) : y);
+ DoToolbarUpdates();
}
-*/
-void wxToolBarBase::OnIdle(wxIdleEvent& event)
+// Do the toolbar button updates (check for EVT_UPDATE_UI handlers)
+void wxToolBarBase::DoToolbarUpdates()
{
- wxWindow::OnIdle(event);
+ wxEvtHandler* evtHandler = GetEventHandler() ;
- DoToolbarUpdates();
-}
+ wxNode* node = GetTools().First();
+ while (node)
+ {
+ wxToolBarTool* tool = (wxToolBarTool* ) node->Data();
-// Do the toolbar button updates (check for EVT_UPDATE_UI handlers)
-void wxToolBarBase::DoToolbarUpdates(void)
-{
- wxNode* node = GetTools().First();
- while (node)
- {
- wxToolBarTool* tool = (wxToolBarTool* ) node->Data();
-
- wxUpdateUIEvent event(tool->m_index);
- event.SetEventObject(this);
-
- if (GetEventHandler()->ProcessEvent(event))
- {
- if (event.GetSetEnabled())
- EnableTool(tool->m_index, event.GetEnabled());
- if (event.GetSetChecked())
- ToggleTool(tool->m_index, event.GetChecked());
+ wxUpdateUIEvent event(tool->m_index);
+ event.SetEventObject(this);
+
+ if (evtHandler->ProcessEvent(event))
+ {
+ if (event.GetSetEnabled())
+ EnableTool(tool->m_index, event.GetEnabled());
+ if (event.GetSetChecked())
+ ToggleTool(tool->m_index, event.GetChecked());
/*
- if (event.GetSetText())
- // Set tooltip?
+ if (event.GetSetText())
+ // Set tooltip?
*/
- }
-
- node = node->Next();
- }
-}
+ }
-#ifdef __WXMSW__
-// Circumvent wxControl::MSWOnMouseMove which doesn't set the cursor.
-void wxToolBarBase::MSWOnMouseMove(int x, int y, const WXUINT flags)
-{
- wxWindow::MSWOnMouseMove(x, y, flags);
+ node = node->Next();
+ }
}
-#endif
#endif