]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/toolbar.cpp
1. DoSetSize() simplified, DoGetBestSize() introduced
[wxWidgets.git] / src / motif / toolbar.cpp
index 903b69be330ddd3d88b34089d50c8216c4598e2f..51bcf4efb44b2f903dc536224a65015ea445d373 100644 (file)
@@ -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 <Xm/Xm.h>
 #include <Xm/PushBG.h>
@@ -36,12 +36,10 @@ 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);
 
-wxBitmap wxCreateMaskedBitmap(wxBitmap& bitmap, wxColour& colour);
-
 class wxToolBarTimer: public wxTimer
 {
 public:
@@ -73,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);
@@ -88,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,
@@ -97,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;
 }
 
@@ -124,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;
 
@@ -135,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,
@@ -172,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
@@ -182,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;
@@ -198,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);
@@ -219,7 +235,7 @@ bool wxToolBar::CreateTools()
                 {
                     wxBitmap newBitmap = wxCreateMaskedBitmap(originalBitmap, col);
                     tool->m_bitmap2 = newBitmap;
-               }
+                }
                 else
                     tool->m_bitmap2 = tool->m_bitmap1;
             }
@@ -248,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,
@@ -283,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);
 
@@ -294,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);
 }
 
@@ -385,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)
@@ -398,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;
@@ -411,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;
@@ -426,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);
@@ -439,34 +483,13 @@ 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);
     }
 
 }
 
-// Creates a bitmap with transparent areas drawn in
-// the given colour.
-wxBitmap wxCreateMaskedBitmap(wxBitmap& bitmap, wxColour& colour)
-{
-    wxBitmap newBitmap(bitmap.GetWidth(),
-                       bitmap.GetHeight(),
-                       bitmap.GetDepth());
-    wxMemoryDC destDC;
-    wxMemoryDC srcDC;
-    srcDC.SelectObject(bitmap);
-    destDC.SelectObject(newBitmap);
-
-    wxBrush brush(colour, wxSOLID);
-    destDC.SetOptimization(FALSE);
-    destDC.SetBackground(brush);
-    destDC.Clear();
-    destDC.Blit(0, 0, bitmap.GetWidth(), bitmap.GetHeight(), & srcDC, 0, 0, wxCOPY, TRUE);
-
-    return newBitmap;
-}
-
 
 static void wxToolButtonPopupCallback (Widget w, XtPointer client_data,
                      XEvent *event, Boolean *continue_to_dispatch)
@@ -482,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;
@@ -490,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;
 
 
     /************************************************************/
@@ -503,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
@@ -521,7 +543,7 @@ static void wxToolButtonPopupCallback (Widget w, XtPointer client_data,
         {
             XtDestroyWidget (wxToolBarTimer::help_popup);
             XtPopdown (wxToolBarTimer::help_popup);
-       }
+        }
         wxToolBarTimer::help_popup = (Widget) 0;
     }
     }
@@ -534,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
@@ -554,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);