X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/321db4b6bf15df209942b9c0e6c744c8e7074d1b..4438caf41af49f00f3c8137ac801871f59cce386:/src/motif/toolbar.cpp diff --git a/src/motif/toolbar.cpp b/src/motif/toolbar.cpp index 163f7fd4cf..51bcf4efb4 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); @@ -71,7 +71,7 @@ bool wxToolBar::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, cons { m_maxWidth = -1; m_maxHeight = -1; - + m_defaultWidth = 24; m_defaultHeight = 22; SetName(name); @@ -86,7 +86,14 @@ bool wxToolBar::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, cons Widget parentWidget = (Widget) parent->GetClientWidget(); Widget toolbar = XtVaCreateManagedWidget("toolbar", - xmFormWidgetClass, parentWidget, + xmBulletinBoardWidgetClass, (Widget) parentWidget, + XmNmarginWidth, 0, + XmNmarginHeight, 0, + XmNresizePolicy, XmRESIZE_NONE, + NULL); +/* + Widget toolbar = XtVaCreateManagedWidget("toolbar", + xmFormWidgetClass, (Widget) m_clientWidget, XmNtraversalOn, False, XmNhorizontalSpacing, 0, XmNverticalSpacing, 0, @@ -95,15 +102,18 @@ bool wxToolBar::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, cons XmNmarginWidth, 0, XmNmarginHeight, 0, NULL); +*/ m_mainWidget = (WXWidget) toolbar; + m_font = parent->GetFont(); + ChangeFont(FALSE); + SetCanAddEventHandler(TRUE); AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y); - SetFont(* parent->GetFont()); ChangeBackgroundColour(); - + return TRUE; } @@ -122,6 +132,14 @@ bool wxToolBar::CreateTools() // Separator spacing const int separatorSize = GetToolSeparation(); // 8; + wxSize margins = GetToolMargins(); + int marginX = margins.x; + int marginY = margins.y; + + int currentX = marginX; + int currentY = marginY; + + int buttonHeight = 0; int currentSpacing = 0; @@ -133,34 +151,32 @@ bool wxToolBar::CreateTools() wxToolBarTool *tool = (wxToolBarTool *)node->Data(); if (tool->m_toolStyle == wxTOOL_STYLE_SEPARATOR) - currentSpacing = separatorSize; + currentX += separatorSize; else if (tool->m_bitmap1.Ok()) { Widget button = (Widget) 0; if (tool->m_isToggle) { - button = XtVaCreateManagedWidget("toggleButton", + button = XtVaCreateWidget("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, + XmNx, currentX, XmNy, currentY, + // 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 = XtVaCreateManagedWidget("button", + button = XtVaCreateWidget("button", xmPushButtonWidgetClass, (Widget) m_mainWidget, - XmNleftAttachment, (prevButton == (Widget) 0) ? XmATTACH_FORM : XmATTACH_WIDGET, - XmNleftWidget, (prevButton == (Widget) 0) ? NULL : prevButton, - XmNleftOffset, currentSpacing, - XmNtopAttachment, XmATTACH_FORM, + XmNx, currentX, XmNy, currentY, XmNpushButtonEnabled, True, XmNmultiClick, XmMULTICLICK_KEEP, XmNlabelType, XmPIXMAP, @@ -170,6 +186,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 @@ -180,12 +198,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; @@ -196,10 +214,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); @@ -217,7 +235,7 @@ bool wxToolBar::CreateTools() { wxBitmap newBitmap = wxCreateMaskedBitmap(originalBitmap, col); tool->m_bitmap2 = newBitmap; - } + } else tool->m_bitmap2 = tool->m_bitmap1; } @@ -246,11 +264,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, @@ -281,8 +299,15 @@ bool wxToolBar::CreateTools() XmNarmPixmap, pixmap2, NULL); } + XtManageChild(button); - XtAddEventHandler (button, EnterWindowMask | LeaveWindowMask, + Dimension width, height; + XtVaGetValues(button, XmNwidth, & width, XmNheight, & height, + NULL); + currentX += width + marginX; + buttonHeight = wxMax(buttonHeight, height); + + XtAddEventHandler (button, EnterWindowMask | LeaveWindowMask, False, wxToolButtonPopupCallback, (XtPointer) this); m_widgets.Append(tool->m_index, (wxObject*) button); @@ -292,25 +317,29 @@ bool wxToolBar::CreateTools() node = node->Next(); } + SetSize(-1, -1, currentX, buttonHeight + 2*marginY); + return TRUE; } void wxToolBar::SetToolBitmapSize(const wxSize& size) { + // TODO not necessary? m_defaultWidth = size.x; m_defaultHeight = size.y; - // TODO } wxSize wxToolBar::GetMaxSize() const { - // TODO - return wxSize(0, 0); + int w, h; + GetSize(& w, & h); + + return wxSize(w, h); } // The button size is bigger than the bitmap size wxSize wxToolBar::GetToolSize() const { - // TODO + // TODO not necessary? return wxSize(m_defaultWidth + 8, m_defaultHeight + 7); } @@ -383,7 +412,7 @@ void wxToolBar::DestroyPixmaps() wxToolBarTool *wxToolBar::AddTool(int index, const wxBitmap& bitmap, const wxBitmap& 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) @@ -396,7 +425,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; @@ -409,7 +439,7 @@ int wxToolBar::FindIndexForWidget(WXWidget w) { WXWidget widget = (WXWidget) node->Data(); if (widget == w) - return (int) node->key.integer; + return (int) node->GetKeyInteger(); node = node->Next(); } return -1; @@ -424,8 +454,24 @@ WXWidget wxToolBar::FindWidgetForIndex(int index) return (WXWidget) node->Data(); } +WXWidget wxToolBar::GetTopWidget() const +{ + return m_mainWidget; +} + +WXWidget wxToolBar::GetClientWidget() const +{ + return m_mainWidget; +} + +WXWidget wxToolBar::GetMainWidget() const +{ + return m_mainWidget; +} + + void wxToolButtonCallback (Widget w, XtPointer clientData, - XtPointer ptr) + XtPointer ptr) { wxToolBar *toolBar = (wxToolBar *) clientData; int index = toolBar->FindIndexForWidget((WXWidget) w); @@ -437,7 +483,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); } @@ -459,7 +505,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; @@ -467,8 +512,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; /************************************************************/ @@ -480,7 +525,7 @@ static void wxToolButtonPopupCallback (Widget w, XtPointer client_data, { XtDestroyWidget (wxToolBarTimer::help_popup); XtPopdown (wxToolBarTimer::help_popup); - } + } wxToolBarTimer::help_popup = (Widget) 0; // One shot @@ -498,7 +543,7 @@ static void wxToolButtonPopupCallback (Widget w, XtPointer client_data, { XtDestroyWidget (wxToolBarTimer::help_popup); XtPopdown (wxToolBarTimer::help_popup); - } + } wxToolBarTimer::help_popup = (Widget) 0; } } @@ -511,16 +556,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 @@ -531,24 +576,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);