X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/47d67540a017101b3e46abe9ef0f55914d8de37e..270a909e20a2c652fd816ad14407113ad0319c9d:/src/common/tbarbase.cpp diff --git a/src/common/tbarbase.cpp b/src/common/tbarbase.cpp index dedda6cf6b..615d76c560 100644 --- a/src/common/tbarbase.cpp +++ b/src/common/tbarbase.cpp @@ -6,7 +6,7 @@ // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ @@ -24,6 +24,8 @@ #include "wx/wx.h" #endif +#include "wx/frame.h" + // For ::UpdateWindow #ifdef __WXMSW__ #include @@ -48,20 +50,37 @@ END_EVENT_TABLE() // 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()) @@ -71,9 +90,17 @@ wxToolBarTool::wxToolBarTool(int theIndex, } m_shortHelpString = helpS1; m_longHelpString = helpS2; + m_control = (wxControl*) NULL; } -wxToolBarTool::~wxToolBarTool(void) +wxToolBarTool::wxToolBarTool(wxControl *control) +{ + m_toolStyle = wxTOOL_STYLE_CONTROL; + m_control = control; + m_index = control->GetId(); +} + +wxToolBarTool::~wxToolBarTool() { /* if (m_deleteSecondBitmap && m_bitmap2) @@ -131,13 +158,16 @@ bool wxToolBarBase::OnLeftClick(int toolIndex, bool toggleDown) 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); @@ -164,10 +194,15 @@ void wxToolBarBase::OnMouseEnter ( int toolIndex ) // created and used as the pushed/toggled image. // If toggle is TRUE, the button toggles between the two states. wxToolBarTool *wxToolBarBase::AddTool(int index, const wxBitmap& bitmap, const wxBitmap& pushedBitmap, - bool toggle, long xPos, long yPos, wxObject *clientData, + bool toggle, wxCoord xPos, wxCoord 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) @@ -179,7 +214,7 @@ wxToolBarTool *wxToolBarBase::AddTool(int index, const wxBitmap& bitmap, const w 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); @@ -194,11 +229,12 @@ wxToolBarTool *wxToolBarBase::AddTool(int index, const wxBitmap& bitmap, const w 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(); @@ -223,7 +259,8 @@ void wxToolBarBase::EnableTool(int index, bool enable) } } -void wxToolBarBase::ToggleTool(int index, bool toggle) +void wxToolBarBase::ToggleTool(int WXUNUSED(index), + bool WXUNUSED(toggle)) { } @@ -366,11 +403,11 @@ void wxToolBarBase::SetToolSeparation(int separation) m_toolSeparation = separation; } -void wxToolBarBase::Command(wxCommandEvent& event) +void wxToolBarBase::Command(wxCommandEvent& WXUNUSED(event)) { } -void wxToolBarBase::Layout(void) +void wxToolBarBase::LayoutTools() { } @@ -382,8 +419,8 @@ void wxToolBarBase::Layout(void) * 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; @@ -395,27 +432,27 @@ void wxToolBarBase::SetScrollbars (int pixelsPerUnitX, int 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()); @@ -534,41 +571,41 @@ int wxToolBarBase::CalcScrollInc(wxScrollEvent& event) 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); @@ -583,8 +620,8 @@ void wxToolBarBase::AdjustScrollbars(void) 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; @@ -601,8 +638,8 @@ void wxToolBarBase::AdjustScrollbars(void) 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; @@ -613,7 +650,7 @@ void wxToolBarBase::AdjustScrollbars(void) } // Default OnSize resets scrollbars, if any -void wxToolBarBase::OnSize(wxSizeEvent& event) +void wxToolBarBase::OnSize(wxSizeEvent& WXUNUSED(event)) { #if wxUSE_CONSTRAINTS if (GetAutoLayout()) @@ -626,7 +663,7 @@ void wxToolBarBase::OnSize(wxSizeEvent& event) // 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 @@ -696,46 +733,48 @@ void wxToolBarBase::ViewStart (int *x, int *y) const *y = m_yScrollPosition; } -void wxToolBarBase::OnIdle(wxIdleEvent& event) +void wxToolBarBase::OnIdle(wxIdleEvent& +#ifdef __WXGTK__ + WXUNUSED(event) +#else + event +#endif + ) { +#ifndef __WXGTK__ wxWindow::OnIdle(event); +#endif - DoToolbarUpdates(); + DoToolbarUpdates(); } // 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()); +void wxToolBarBase::DoToolbarUpdates() +{ + wxEvtHandler* evtHandler = GetEventHandler() ; + + wxNode* node = GetTools().First(); + while (node) + { + wxToolBarTool* tool = (wxToolBarTool* ) node->Data(); + + 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, WXUINT flags) -{ - wxWindow::MSWOnMouseMove(x, y, flags); + node = node->Next(); + } } -#endif #endif