X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8a0681f9338345d0ef32b2ad809d49fd20861119..f68c6b523c1117c90c1cf690745c807bc024789d:/src/motif/toolbar.cpp?ds=sidebyside diff --git a/src/motif/toolbar.cpp b/src/motif/toolbar.cpp index 56c79abbcc..a96885dd6c 100644 --- a/src/motif/toolbar.cpp +++ b/src/motif/toolbar.cpp @@ -21,10 +21,15 @@ #pragma implementation "toolbar.h" #endif +#ifdef __VMS +#define XtDisplay XTDISPLAY +#endif + #include "wx/wx.h" #include "wx/app.h" #include "wx/timer.h" #include "wx/toolbar.h" +#include "wx/frame.h" #ifdef __VMS__ #pragma message disable nosimpint @@ -47,7 +52,7 @@ // ---------------------------------------------------------------------------- #if !USE_SHARED_LIBRARY -IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxControl) +IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxToolBarBase) #endif // ---------------------------------------------------------------------------- @@ -78,14 +83,15 @@ class wxToolBarTool : public wxToolBarToolBase public: wxToolBarTool(wxToolBar *tbar, int id, - const wxBitmap& bitmap1, - const wxBitmap& bitmap2, - bool toggle, + const wxString& label, + const wxBitmap& bmpNormal, + const wxBitmap& bmpToggled, + wxItemKind kind, wxObject *clientData, - const wxString& shortHelpString, - const wxString& longHelpString) - : wxToolBarToolBase(tbar, id, bitmap1, bitmap2, toggle, - clientData, shortHelpString, longHelpString) + const wxString& shortHelp, + const wxString& longHelp) + : wxToolBarToolBase(tbar, id, label, bmpNormal, bmpToggled, kind, + clientData, shortHelp, longHelp) { Init(); } @@ -130,22 +136,23 @@ wxString wxToolBarTimer::helpString; // wxToolBarTool // ---------------------------------------------------------------------------- -wxToolBarToolBase *wxToolBarToolBase::New(wxToolBar *tbar, - int id, - const wxBitmap& bitmap1, - const wxBitmap& bitmap2, - bool toggle, - wxObject *clientData, - const wxString& shortHelpString, - const wxString& longHelpString) +wxToolBarToolBase *wxToolBar::CreateTool(int id, + const wxString& label, + const wxBitmap& bmpNormal, + const wxBitmap& bmpToggled, + wxItemKind kind, + wxObject *clientData, + const wxString& shortHelp, + const wxString& longHelp) { - return new wxToolBarTool(tbar, id, bitmap1, bitmap2, toggle, - clientData, shortHelpString, longHelpString); + return new wxToolBarTool(this, id, label, bmpNormal, bmpToggled, kind, + clientData, shortHelp, longHelp); } -wxToolBarToolBase *wxToolBarToolBase::New(wxToolBar *tbar, wxControl *control) + +wxToolBarToolBase *wxToolBar::CreateTool(wxControl *control) { - return new wxToolBarTool(tbar, control); + return new wxToolBarTool(this, control); } void wxToolBarTool::Init() @@ -156,8 +163,10 @@ void wxToolBarTool::Init() wxToolBarTool::~wxToolBarTool() { - XtDestroyWidget(m_widget); - XmDestroyPixmap(DefaultScreenOfDisplay((Display*)wxGetDisplay()), m_pixmap); + if ( m_widget ) + XtDestroyWidget(m_widget); + // note: do not delete m_pixmap here because it will be deleted + // by the base class when the bitmap is destroyed. } // ---------------------------------------------------------------------------- @@ -170,6 +179,12 @@ void wxToolBar::Init() m_maxHeight = -1; m_defaultWidth = 24; m_defaultHeight = 22; + m_toolPacking = 2; + m_toolSeparation = 8; + m_xMargin = 2; + m_yMargin = 2; + m_maxRows = 100; + m_maxCols = 100; } bool wxToolBar::Create(wxWindow *parent, @@ -179,18 +194,11 @@ bool wxToolBar::Create(wxWindow *parent, long style, const wxString& name) { - Init(); - - m_windowId = id; - - SetName(name); - m_backgroundColour = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE); - m_foregroundColour = parent->GetForegroundColour(); - m_windowStyle = style; - - SetParent(parent); + if( !wxControl::CreateControl( parent, id, pos, size, style, + wxDefaultValidator, name ) ) + return FALSE; - if (parent) parent->AddChild(this); + m_backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); Widget parentWidget = (Widget) parent->GetClientWidget(); @@ -215,11 +223,19 @@ bool wxToolBar::Create(wxWindow *parent, m_mainWidget = (WXWidget) toolbar; - m_font = parent->GetFont(); ChangeFont(FALSE); + wxPoint rPos = pos; + wxSize rSize = size; + + if( rPos.x == -1 ) rPos.x = 0; + if( rPos.y == -1 ) rPos.y = 0; + if( rSize.x == -1 && GetParent() ) + rSize.x = GetParent()->GetSize().x; + SetCanAddEventHandler(TRUE); - AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y); + AttachWidget (parent, m_mainWidget, (WXWidget) NULL, + rPos.x, rPos.y, rSize.x, rSize.y); ChangeBackgroundColour(); @@ -240,16 +256,19 @@ bool wxToolBar::Realize() return TRUE; } + bool isVertical = GetWindowStyle() & wxTB_VERTICAL; + // Separator spacing const int separatorSize = GetToolSeparation(); // 8; wxSize margins = GetToolMargins(); + int packing = GetToolPacking(); int marginX = margins.x; int marginY = margins.y; int currentX = marginX; int currentY = marginY; - int buttonHeight = 0; + int buttonHeight = 0, buttonWidth = 0; int currentSpacing = 0; @@ -265,10 +284,27 @@ bool wxToolBar::Realize() switch ( tool->GetStyle() ) { case wxTOOL_STYLE_CONTROL: - wxFAIL_MSG( _T("not implemented") ); - break; + { + wxControl* control = tool->GetControl(); + wxSize sz = control->GetSize(); + wxPoint pos = control->GetPosition(); + // Allow a control to specify a y[x]-offset by setting + // its initial position, but still don't allow it to + // position itself above the top[left] margin. + int controlY = (pos.y > 0) ? currentY + pos.y : currentY; + int controlX = (pos.x > 0) ? currentX + pos.x : currentX; + control->Move( isVertical ? controlX : currentX, + isVertical ? currentY : controlY ); + if ( isVertical ) + currentY += sz.y + packing; + else + currentX += sz.x + packing; + break; + } case wxTOOL_STYLE_SEPARATOR: + // skip separators for vertical toolbars + if( isVertical ) break; currentX += separatorSize; break; @@ -280,7 +316,12 @@ bool wxToolBar::Realize() button = XtVaCreateWidget("toggleButton", xmToggleButtonWidgetClass, (Widget) m_mainWidget, XmNx, currentX, XmNy, currentY, - // XmNpushButtonEnabled, True, + XmNindicatorOn, False, + XmNshadowThickness, 2, + XmNborderWidth, 0, + XmNspacing, 0, + XmNmarginWidth, 0, + XmNmarginHeight, 0, XmNmultiClick, XmMULTICLICK_KEEP, XmNlabelType, XmPIXMAP, NULL); @@ -313,7 +354,7 @@ bool wxToolBar::Realize() // 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. - bmp = tool->GetBitmap1(); + bmp = tool->GetNormalBitmap(); if ( bmp.GetMask() ) { int backgroundPixel; @@ -322,10 +363,9 @@ bool wxToolBar::Realize() wxColour col; col.SetPixel(backgroundPixel); + bmp = wxCreateMaskedBitmap(bmp, col); - wxBitmap newBitmap = wxCreateMaskedBitmap(bmp, col); - - tool->SetBitmap1(newBitmap); + tool->SetNormalBitmap(bmp); } // Create a selected/toggled bitmap. If there isn't a 2nd @@ -338,15 +378,17 @@ bool wxToolBar::Realize() else XtVaGetValues(button, XmNarmColor, &backgroundPixel, NULL); - wxColour col; col.SetPixel(backgroundPixel); - if (tool->GetBitmap2().Ok() && tool->GetBitmap2().GetMask()) + // FIXME: we use disabled bitmap as the bitmap for the toggled + // state, we probably need a GetToggledBitmap() instead + wxBitmap bmpToggled = tool->GetDisabledBitmap(); + if ( bmpToggled.Ok() && bmpToggled.GetMask()) { // Use what's there - wxBitmap newBitmap = wxCreateMaskedBitmap(tool->GetBitmap2(), col); - tool->SetBitmap2(newBitmap); + wxBitmap newBitmap = wxCreateMaskedBitmap(bmpToggled, col); + tool->SetDisabledBitmap(newBitmap); } else { @@ -354,12 +396,13 @@ bool wxToolBar::Realize() if ( bmp.GetMask() ) { wxBitmap newBitmap = wxCreateMaskedBitmap(bmp, col); - tool->SetBitmap2(newBitmap); + tool->SetDisabledBitmap(newBitmap); } else - tool->SetBitmap2(bmp); + tool->SetDisabledBitmap(bmp); } + // FIXME: and here we should use GetDisabledBitmap()... pixmap = (Pixmap) bmp.GetPixmap(); insensPixmap = (Pixmap) bmp.GetInsensPixmap(); @@ -371,11 +414,12 @@ bool wxToolBar::Realize() // If there's a bitmap for the toggled state, use it, // otherwise generate one. - if (tool->GetBitmap2().Ok()) + // + // FIXME: see above + if ( bmpToggled.Ok() ) { - wxBitmap bmp2 = tool->GetBitmap2(); - pixmap2 = (Pixmap) bmp2.GetPixmap(); - insensPixmap2 = (Pixmap) bmp2.GetInsensPixmap(); + pixmap2 = (Pixmap) bmpToggled.GetPixmap(); + insensPixmap2 = (Pixmap) bmpToggled.GetInsensPixmap(); } else { @@ -383,13 +427,9 @@ bool wxToolBar::Realize() insensPixmap2 = XCreateInsensitivePixmap((Display*) wxGetDisplay(), pixmap2); } + tool->SetPixmap(pixmap2); + XtVaSetValues (button, - XmNindicatorOn, False, - XmNshadowThickness, 2, - // XmNborderWidth, 0, - // XmNspacing, 0, - XmNmarginWidth, 0, - XmNmarginHeight, 0, XmNfillOnSelect, True, XmNlabelPixmap, pixmap, XmNselectPixmap, pixmap2, @@ -404,15 +444,18 @@ bool wxToolBar::Realize() // If there's a bitmap for the armed state, use it, // otherwise generate one. - if (tool->GetBitmap2().Ok()) + if ( bmpToggled.Ok() ) { - pixmap2 = (Pixmap) tool->GetBitmap2().GetPixmap(); + pixmap2 = (Pixmap) bmpToggled.GetPixmap(); } else { pixmap2 = (Pixmap) bmp.GetArmPixmap(button); } + + tool->SetPixmap(pixmap2); + // Normal button XtVaSetValues(button, XmNlabelPixmap, pixmap, @@ -420,6 +463,7 @@ bool wxToolBar::Realize() XmNarmPixmap, pixmap2, NULL); } + XtManageChild(button); { @@ -428,8 +472,12 @@ bool wxToolBar::Realize() XmNwidth, &width, XmNheight, & height, NULL); - currentX += width + marginX; + if ( isVertical ) + currentY += height + packing; + else + currentX += width + packing; buttonHeight = wxMax(buttonHeight, height); + buttonWidth = wxMax(buttonWidth, width); } XtAddEventHandler (button, EnterWindowMask | LeaveWindowMask, @@ -442,53 +490,93 @@ bool wxToolBar::Realize() node = node->GetNext(); } - SetSize(-1, -1, currentX, buttonHeight + 2*marginY); + SetSize( -1, -1, + isVertical ? buttonWidth + 2 * marginX : currentX, + isVertical ? currentY : buttonHeight + 2*marginY ); return TRUE; } -wxToolBarTool *wxToolBar::FindToolForPosition(wxCoord WXUNUSED(x), - wxCoord WXUNUSED(y)) const +wxToolBarToolBase *wxToolBar::FindToolForPosition(wxCoord WXUNUSED(x), + wxCoord WXUNUSED(y)) const { wxFAIL_MSG( _T("TODO") ); - return (wxToolBarTool *)NULL; + return (wxToolBarToolBase *)NULL; } -bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarTool *tool) +bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *tool) { tool->Attach(this); return TRUE; } -bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarTool *tool) +bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *tool) { tool->Detach(); return TRUE; } -void wxToolBar::DoEnableTool(wxToolBarTool *tool, bool enable) +void wxToolBar::DoEnableTool(wxToolBarToolBase *toolBase, bool enable) { + wxToolBarTool *tool = (wxToolBarTool *)toolBase; + XtSetSensitive(tool->GetButtonWidget(), (Boolean) enable); } -void wxToolBar::DoToggleTool(wxToolBarTool *tool, bool toggle) +void wxToolBar::DoToggleTool(wxToolBarToolBase *toolBase, bool toggle) { + wxToolBarTool *tool = (wxToolBarTool *)toolBase; + XmToggleButtonSetState(tool->GetButtonWidget(), (Boolean) toggle, False); } -void wxToolBar::DoSetToggle(wxToolBarTool *tool, bool toggle) +void wxToolBar::DoSetToggle(wxToolBarToolBase * WXUNUSED(tool), + bool WXUNUSED(toggle)) { - wxFAIL_MSG( _T("TODO") ); + // nothing to do +} + +void wxToolBar::DoSetSize(int x, int y, int width, int height, int sizeFlags) +{ + int old_width, old_height; + GetSize(&old_width, &old_height); + + wxToolBarBase::DoSetSize(x, y, width, height, sizeFlags); + + // Correct width and height if needed. + if ( width == -1 || height == -1 ) + { + int tmp_width, tmp_height; + GetSize(&tmp_width, &tmp_height); + + if ( width == -1 ) + width = tmp_width; + if ( height == -1 ) + height = tmp_height; + } + + // We must refresh the frame size when the toolbar changes size + // otherwise the toolbar can be shown incorrectly + if ( old_width != width || old_height != height ) + { + // But before we send the size event check it + // we have a frame that is not being deleted. + wxFrame *frame = wxDynamicCast(GetParent(), wxFrame); + if ( frame && !frame->IsBeingDeleted() ) + { + frame->SendSizeEvent(); + } + } } // ---------------------------------------------------------------------------- // Motif callbacks // ---------------------------------------------------------------------------- -wxToolBarTool *wxToolBar::FindToolByWidget(WXWidget w) const +wxToolBarToolBase *wxToolBar::FindToolByWidget(WXWidget w) const { wxToolBarToolsList::Node* node = m_tools.GetFirst(); while ( node ) @@ -502,7 +590,7 @@ wxToolBarTool *wxToolBar::FindToolByWidget(WXWidget w) const node = node->GetNext(); } - return (wxToolBarTool *)NULL; + return (wxToolBarToolBase *)NULL; } static void wxToolButtonCallback(Widget w, @@ -510,7 +598,7 @@ static void wxToolButtonCallback(Widget w, XtPointer WXUNUSED(ptr)) { wxToolBar *toolBar = (wxToolBar *) clientData; - wxToolBarTool *tool = toolBar->FindToolByWidget((WXWidget) w); + wxToolBarToolBase *tool = toolBar->FindToolByWidget((WXWidget) w); if ( !tool ) return; @@ -534,7 +622,7 @@ static void wxToolButtonPopupCallback(Widget w, static const int delayMilli = 800; wxToolBar* toolBar = (wxToolBar*) client_data; - wxToolBarTool *tool = toolBar->FindToolByWidget((WXWidget) w); + wxToolBarToolBase *tool = toolBar->FindToolByWidget((WXWidget) w); if ( !tool ) return;