X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4fabb57533169f2f75367e0d120c762518548890..9874b4ee8308b8989c5df7db4f3559625299d0a4:/src/motif/toolbar.cpp diff --git a/src/motif/toolbar.cpp b/src/motif/toolbar.cpp index 071f4f030b..194d90ddd7 100644 --- a/src/motif/toolbar.cpp +++ b/src/motif/toolbar.cpp @@ -6,7 +6,7 @@ // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ @@ -16,7 +16,7 @@ #include "wx/wx.h" #include "wx/app.h" #include "wx/timer.h" -#include "wx/motif/toolbar.h" +#include "wx/toolbar.h" #include #include @@ -36,7 +36,7 @@ END_EVENT_TABLE() #endif static void wxToolButtonCallback (Widget w, XtPointer clientData, - XtPointer ptr); + XtPointer ptr); static void wxToolButtonPopupCallback (Widget w, XtPointer client_data, XEvent *event, Boolean *continue_to_dispatch); @@ -69,9 +69,10 @@ wxToolBar::wxToolBar(): bool wxToolBar::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name) { + m_windowId = id; m_maxWidth = -1; m_maxHeight = -1; - + m_defaultWidth = 24; m_defaultHeight = 22; SetName(name); @@ -106,14 +107,14 @@ bool wxToolBar::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, cons m_mainWidget = (WXWidget) toolbar; - m_windowFont = parent->GetFont(); + m_font = parent->GetFont(); ChangeFont(FALSE); SetCanAddEventHandler(TRUE); AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y); ChangeBackgroundColour(); - + return TRUE; } @@ -158,19 +159,23 @@ bool wxToolBar::CreateTools() if (tool->m_isToggle) { - button = XtVaCreateWidget("toggleButton", + button = XtVaCreateWidget("toggleButton", xmToggleButtonWidgetClass, (Widget) m_mainWidget, XmNx, currentX, XmNy, currentY, - // XmNpushButtonEnabled, True, + // XmNpushButtonEnabled, True, XmNmultiClick, XmMULTICLICK_KEEP, XmNlabelType, XmPIXMAP, NULL); XtAddCallback ((Widget) button, XmNvalueChangedCallback, (XtCallbackProc) wxToolButtonCallback, - (XtPointer) this); + (XtPointer) this); + + XtVaSetValues ((Widget) button, + XmNselectColor, m_backgroundColour.AllocColour(XtDisplay((Widget) button)), + NULL); } else { - button = XtVaCreateWidget("button", + button = XtVaCreateWidget("button", xmPushButtonWidgetClass, (Widget) m_mainWidget, XmNx, currentX, XmNy, currentY, XmNpushButtonEnabled, True, @@ -182,6 +187,8 @@ bool wxToolBar::CreateTools() (XtPointer) this); } + DoChangeBackgroundColour((WXWidget) button, m_backgroundColour, TRUE); + // For each button, if there is a mask, we must create // a new wxBitmap that has the correct background colour // for the button. Otherwise the background will just be @@ -192,12 +199,12 @@ bool wxToolBar::CreateTools() { int backgroundPixel; XtVaGetValues(button, XmNbackground, &backgroundPixel, - NULL); + NULL); wxColour col; col.SetPixel(backgroundPixel); - + wxBitmap newBitmap = wxCreateMaskedBitmap(tool->m_bitmap1, col); tool->m_bitmap1 = newBitmap; @@ -208,10 +215,10 @@ bool wxToolBar::CreateTools() int backgroundPixel; if (tool->m_isToggle) XtVaGetValues(button, XmNselectColor, &backgroundPixel, - NULL); + NULL); else XtVaGetValues(button, XmNarmColor, &backgroundPixel, - NULL); + NULL); wxColour col; col.SetPixel(backgroundPixel); @@ -229,7 +236,7 @@ bool wxToolBar::CreateTools() { wxBitmap newBitmap = wxCreateMaskedBitmap(originalBitmap, col); tool->m_bitmap2 = newBitmap; - } + } else tool->m_bitmap2 = tool->m_bitmap1; } @@ -258,11 +265,11 @@ bool wxToolBar::CreateTools() } XtVaSetValues (button, XmNindicatorOn, False, - XmNshadowThickness, 2, - // XmNborderWidth, 0, - // XmNspacing, 0, - XmNmarginWidth, 0, - XmNmarginHeight, 0, + XmNshadowThickness, 2, + // XmNborderWidth, 0, + // XmNspacing, 0, + XmNmarginWidth, 0, + XmNmarginHeight, 0, XmNfillOnSelect, True, XmNlabelPixmap, pixmap, XmNselectPixmap, pixmap2, @@ -297,11 +304,11 @@ bool wxToolBar::CreateTools() Dimension width, height; XtVaGetValues(button, XmNwidth, & width, XmNheight, & height, - NULL); + NULL); currentX += width + marginX; buttonHeight = wxMax(buttonHeight, height); - XtAddEventHandler (button, EnterWindowMask | LeaveWindowMask, + XtAddEventHandler (button, EnterWindowMask | LeaveWindowMask, False, wxToolButtonPopupCallback, (XtPointer) this); m_widgets.Append(tool->m_index, (wxObject*) button); @@ -316,190 +323,6 @@ bool wxToolBar::CreateTools() return TRUE; } -// Old version, assuming we use a form. Now we use -// a bulletin board, so we can create controls on the toolbar. -#if 0 -bool wxToolBar::CreateTools() -{ - if (m_tools.Number() == 0) - return FALSE; - - // Separator spacing - const int separatorSize = GetToolSeparation(); // 8; - - int currentSpacing = 0; - - m_widgets.Clear(); - Widget prevButton = (Widget) 0; - wxNode* node = m_tools.First(); - while (node) - { - wxToolBarTool *tool = (wxToolBarTool *)node->Data(); - - if (tool->m_toolStyle == wxTOOL_STYLE_SEPARATOR) - currentSpacing = separatorSize; - else if (tool->m_bitmap1.Ok()) - { - Widget button = (Widget) 0; - - if (tool->m_isToggle) - { - button = XtVaCreateManagedWidget("toggleButton", - xmToggleButtonWidgetClass, (Widget) m_mainWidget, - XmNleftAttachment, (prevButton == (Widget) 0) ? XmATTACH_FORM : XmATTACH_WIDGET, - XmNleftWidget, (prevButton == (Widget) 0) ? NULL : prevButton, - XmNleftOffset, currentSpacing, - XmNtopAttachment, XmATTACH_FORM, - // XmNpushButtonEnabled, True, - XmNmultiClick, XmMULTICLICK_KEEP, - XmNlabelType, XmPIXMAP, - NULL); - XtAddCallback ((Widget) button, XmNvalueChangedCallback, (XtCallbackProc) wxToolButtonCallback, - (XtPointer) this); - } - else - { - button = XtVaCreateManagedWidget("button", - xmPushButtonWidgetClass, (Widget) m_mainWidget, - XmNleftAttachment, (prevButton == (Widget) 0) ? XmATTACH_FORM : XmATTACH_WIDGET, - XmNleftWidget, (prevButton == (Widget) 0) ? NULL : prevButton, - XmNleftOffset, currentSpacing, - XmNtopAttachment, XmATTACH_FORM, - XmNpushButtonEnabled, True, - XmNmultiClick, XmMULTICLICK_KEEP, - XmNlabelType, XmPIXMAP, - NULL); - XtAddCallback (button, - XmNactivateCallback, (XtCallbackProc) wxToolButtonCallback, - (XtPointer) this); - } - - // For each button, if there is a mask, we must create - // a new wxBitmap that has the correct background colour - // for the button. Otherwise the background will just be - // e.g. black if a transparent XPM has been loaded. - wxBitmap originalBitmap = tool->m_bitmap1; - - if (tool->m_bitmap1.GetMask()) - { - int backgroundPixel; - XtVaGetValues(button, XmNbackground, &backgroundPixel, - NULL); - - - wxColour col; - col.SetPixel(backgroundPixel); - - wxBitmap newBitmap = wxCreateMaskedBitmap(tool->m_bitmap1, col); - - tool->m_bitmap1 = newBitmap; - } - - // Create a selected/toggled bitmap. If there isn't a m_bitmap2, - // we need to create it (with a darker, selected background) - int backgroundPixel; - if (tool->m_isToggle) - XtVaGetValues(button, XmNselectColor, &backgroundPixel, - NULL); - else - XtVaGetValues(button, XmNarmColor, &backgroundPixel, - NULL); - - wxColour col; - col.SetPixel(backgroundPixel); - - if (tool->m_bitmap2.Ok() && tool->m_bitmap2.GetMask()) - { - // Use what's there - wxBitmap newBitmap = wxCreateMaskedBitmap(tool->m_bitmap2, col); - tool->m_bitmap2 = newBitmap; - } - else - { - // Use unselected bitmap - if (originalBitmap.GetMask()) - { - wxBitmap newBitmap = wxCreateMaskedBitmap(originalBitmap, col); - tool->m_bitmap2 = newBitmap; - } - else - tool->m_bitmap2 = tool->m_bitmap1; - } - - Pixmap pixmap = (Pixmap) tool->m_bitmap1.GetPixmap(); - Pixmap insensPixmap = (Pixmap) tool->m_bitmap1.GetInsensPixmap(); - - if (tool->m_isToggle) - { - // Toggle button - Pixmap pixmap2 = (Pixmap) 0; - Pixmap insensPixmap2 = (Pixmap) 0; - - // If there's a bitmap for the toggled state, use it, - // otherwise generate one. - if (tool->m_bitmap2.Ok()) - { - pixmap2 = (Pixmap) tool->m_bitmap2.GetPixmap(); - insensPixmap2 = (Pixmap) tool->m_bitmap2.GetInsensPixmap(); - } - else - { - pixmap2 = (Pixmap) tool->m_bitmap1.GetArmPixmap(button); - insensPixmap2 = XCreateInsensitivePixmap((Display*) wxGetDisplay(), pixmap2); - m_pixmaps.Append((wxObject*) insensPixmap2); // Store for later deletion - } - XtVaSetValues (button, - XmNindicatorOn, False, - XmNshadowThickness, 2, - // XmNborderWidth, 0, - // XmNspacing, 0, - XmNmarginWidth, 0, - XmNmarginHeight, 0, - XmNfillOnSelect, True, - XmNlabelPixmap, pixmap, - XmNselectPixmap, pixmap2, - XmNlabelInsensitivePixmap, insensPixmap, - XmNselectInsensitivePixmap, insensPixmap2, - XmNlabelType, XmPIXMAP, - NULL); - } - else - { - Pixmap pixmap2 = (Pixmap) 0; - - // If there's a bitmap for the armed state, use it, - // otherwise generate one. - if (tool->m_bitmap2.Ok()) - { - pixmap2 = (Pixmap) tool->m_bitmap2.GetPixmap(); - } - else - { - pixmap2 = (Pixmap) tool->m_bitmap1.GetArmPixmap(button); - - } - // Normal button - XtVaSetValues(button, - XmNlabelPixmap, pixmap, - XmNlabelInsensitivePixmap, insensPixmap, - XmNarmPixmap, pixmap2, - NULL); - } - - XtAddEventHandler (button, EnterWindowMask | LeaveWindowMask, - False, wxToolButtonPopupCallback, (XtPointer) this); - m_widgets.Append(tool->m_index, (wxObject*) button); - - prevButton = button; - currentSpacing = 0; - } - node = node->Next(); - } - - return TRUE; -} -#endif - void wxToolBar::SetToolBitmapSize(const wxSize& size) { // TODO not necessary? @@ -587,10 +410,10 @@ void wxToolBar::DestroyPixmaps() // created and used as the pushed/toggled image. // If toggle is TRUE, the button toggles between the two states. -wxToolBarTool *wxToolBar::AddTool(int index, const wxBitmap& bitmap, const wxBitmap& pushedBitmap, +wxToolBarTool *wxToolBar::AddTool(int index, const wxBitmap& bitmap, const wxBitmap& WXUNUSED(pushedBitmap), bool toggle, long xPos, long yPos, wxObject *clientData, const wxString& helpString1, const wxString& helpString2) { - wxToolBarTool *tool = new wxToolBarTool(index, bitmap, (wxBitmap *)NULL, toggle, xPos, yPos, helpString1, helpString2); + wxToolBarTool *tool = new wxToolBarTool(index, bitmap, wxNullBitmap, toggle, xPos, yPos, helpString1, helpString2); tool->m_clientData = clientData; if (xPos > -1) @@ -603,7 +426,8 @@ wxToolBarTool *wxToolBar::AddTool(int index, const wxBitmap& bitmap, const wxBit else tool->m_y = m_yMargin; - tool->SetSize(GetDefaultButtonWidth(), GetDefaultButtonHeight()); + wxSize size = GetToolSize(); + tool->SetSize(size.x, size.y); m_tools.Append((long)index, tool); return tool; @@ -648,7 +472,7 @@ WXWidget wxToolBar::GetMainWidget() const void wxToolButtonCallback (Widget w, XtPointer clientData, - XtPointer ptr) + XtPointer WXUNUSED(ptr)) { wxToolBar *toolBar = (wxToolBar *) clientData; int index = toolBar->FindIndexForWidget((WXWidget) w); @@ -660,7 +484,7 @@ void wxToolButtonCallback (Widget w, XtPointer clientData, return; wxToolBarTool *tool = (wxToolBarTool *)node->Data(); if (tool->m_isToggle) - tool->m_toggleState = toolBar->GetToolState(index); + tool->m_toggleState = !tool->m_toggleState; (void) toolBar->OnLeftClick(index, tool->m_toggleState); } @@ -669,7 +493,7 @@ void wxToolButtonCallback (Widget w, XtPointer clientData, static void wxToolButtonPopupCallback (Widget w, XtPointer client_data, - XEvent *event, Boolean *continue_to_dispatch) + XEvent *event, Boolean *WXUNUSED(continue_to_dispatch)) { // TODO: retrieve delay before popping up tooltip from wxSystemSettings. int delayMilli = 800; @@ -682,7 +506,6 @@ static void wxToolButtonPopupCallback (Widget w, XtPointer client_data, wxNode *node = toolBar->GetTools().Find((long)index); if (!node) return; - wxToolBarTool *tool = (wxToolBarTool *)node->Data(); wxString str(toolBar->GetToolShortHelp(index)); if (str.IsNull() || str == "") return; @@ -690,8 +513,8 @@ static void wxToolButtonPopupCallback (Widget w, XtPointer client_data, if (!wxTheToolBarTimer) wxTheToolBarTimer = new wxToolBarTimer; - wxToolBarTimer::buttonWidget = w; - wxToolBarTimer::helpString = str; + wxToolBarTimer::buttonWidget = w; + wxToolBarTimer::helpString = str; /************************************************************/ @@ -703,7 +526,7 @@ static void wxToolButtonPopupCallback (Widget w, XtPointer client_data, { XtDestroyWidget (wxToolBarTimer::help_popup); XtPopdown (wxToolBarTimer::help_popup); - } + } wxToolBarTimer::help_popup = (Widget) 0; // One shot @@ -721,7 +544,7 @@ static void wxToolButtonPopupCallback (Widget w, XtPointer client_data, { XtDestroyWidget (wxToolBarTimer::help_popup); XtPopdown (wxToolBarTimer::help_popup); - } + } wxToolBarTimer::help_popup = (Widget) 0; } } @@ -734,16 +557,16 @@ void wxToolBarTimer::Notify() /************************************************************/ /* Create shell without window decorations */ /************************************************************/ - help_popup = XtVaCreatePopupShell ("shell", - overrideShellWidgetClass, (Widget) wxTheApp->GetTopLevelWidget(), + help_popup = XtVaCreatePopupShell ("shell", + overrideShellWidgetClass, (Widget) wxTheApp->GetTopLevelWidget(), NULL); /************************************************************/ /* Get absolute position on display of toolbar button */ /************************************************************/ XtTranslateCoords (buttonWidget, - (Position) 0, - (Position) 0, + (Position) 0, + (Position) 0, &x, &y); // Move the tooltip more or less above the button @@ -754,24 +577,24 @@ void wxToolBarTimer::Notify() /************************************************************/ /* Set the position of the help popup */ /************************************************************/ - XtVaSetValues (help_popup, - XmNx, (Position) x, - XmNy, (Position) y, + XtVaSetValues (help_popup, + XmNx, (Position) x, + XmNy, (Position) y, NULL); - + /************************************************************/ /* Create help label */ /************************************************************/ XmString text = XmStringCreateSimple ((char*) (const char*) helpString); - XtVaCreateManagedWidget ("help_label", - xmLabelWidgetClass, help_popup, + XtVaCreateManagedWidget ("help_label", + xmLabelWidgetClass, help_popup, XmNlabelString, text, - XtVaTypedArg, - XmNforeground, XtRString, "black", - strlen("black")+1, - XtVaTypedArg, - XmNbackground, XtRString, "LightGoldenrod", - strlen("LightGoldenrod")+1, + XtVaTypedArg, + XmNforeground, XtRString, "black", + strlen("black")+1, + XtVaTypedArg, + XmNbackground, XtRString, "LightGoldenrod", + strlen("LightGoldenrod")+1, NULL); XmStringFree (text);