]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/toolbar.cpp
1. wxMenu{Item|Bar} modifications for wxMotif
[wxWidgets.git] / src / motif / toolbar.cpp
index 071f4f030b5816b427d309ebd82c249a4645ee44..194d90ddd73c05b847370dd6ea84793e23026b3a 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,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);