]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk1/tbargtk.cpp
fixed compilation under Unix where SQL_DATETIME is not defined
[wxWidgets.git] / src / gtk1 / tbargtk.cpp
index aa7574fecaec1668cfba3abdf8003e3834d2086e..1a23a850402f52429783fb89efba65413c8cc080 100644 (file)
 
 #include "wx/frame.h"
 
-#include "glib.h"
-#include "gdk/gdk.h"
-#include "gtk/gtk.h"
+#include <glib.h>
+#include "wx/gtk/private.h"
+
+extern GdkFont *GtkGetDefaultGuiFont();
 
 // ----------------------------------------------------------------------------
 // globals
@@ -80,7 +81,7 @@ protected:
 // wxWin macros
 // ----------------------------------------------------------------------------
 
-IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxControl)
+IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxToolBarBase)
 
 // ============================================================================
 // implementation
@@ -97,11 +98,8 @@ static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget),
         wxapp_install_idle_handler();
 
     wxToolBar *tbar = (wxToolBar *)tool->GetToolBar();
-    if ( tbar->m_blockNextEvent )
-    { 
-        tbar->m_blockNextEvent = FALSE;
-        return;
-    }
+    
+    if (tbar->m_blockEvent) return;
 
     if (g_blockEventsOnDrag) return;
     if (!tool->IsEnabled()) return;
@@ -126,12 +124,12 @@ static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget),
 }
 
 //-----------------------------------------------------------------------------
-// "enter_notify_event"
+// "enter_notify_event" / "leave_notify_event"
 //-----------------------------------------------------------------------------
 
-static gint gtk_toolbar_enter_callback( GtkWidget *WXUNUSED(widget), 
-                                        GdkEventCrossing *WXUNUSED(gdk_event),
-                                        wxToolBarTool *tool )
+static gint gtk_toolbar_tool_callback( GtkWidget *WXUNUSED(widget), 
+                                       GdkEventCrossing *gdk_event,
+                                       wxToolBarTool *tool )
 {
     if (g_isIdle) wxapp_install_idle_handler();
 
@@ -139,36 +137,11 @@ static gint gtk_toolbar_enter_callback( GtkWidget *WXUNUSED(widget),
     
     wxToolBar *tb = (wxToolBar *)tool->GetToolBar();
     
-#if (GTK_MINOR_VERSION == 0)
-    /* we grey-out the tip text of disabled tool in GTK 1.0 */
-    if (tool->IsEnabled())
-    {
-        if (tb->m_fg->red != 0)
-        {
-            tb->m_fg->red = 0;
-            tb->m_fg->green = 0;
-            tb->m_fg->blue = 0;
-            gdk_color_alloc( gtk_widget_get_colormap( GTK_WIDGET(tb->m_toolbar) ), tb->m_fg );
-            
-            gtk_tooltips_set_colors( GTK_TOOLBAR(tb->m_toolbar)->tooltips, tb->m_bg, tb->m_fg );
-        }
-    }
+    // emit the event
+    if( gdk_event->type == GDK_ENTER_NOTIFY )
+        tb->OnMouseEnter( tool->GetId() );
     else
-    {
-        if (tb->m_fg->red == 0)
-        {
-            tb->m_fg->red = 33000;
-            tb->m_fg->green = 33000;
-            tb->m_fg->blue = 33000;
-            gdk_color_alloc( gtk_widget_get_colormap( GTK_WIDGET(tb->m_toolbar) ), tb->m_fg );
-            gtk_tooltips_set_colors( GTK_TOOLBAR(tb->m_toolbar)->tooltips, tb->m_bg, tb->m_fg );
-        }
-    }
-#endif
-    
-    /* emit the event */
-  
-    tb->OnMouseEnter( tool->GetId() );
+        tb->OnMouseEnter( -1 );
   
     return FALSE;
 }
@@ -180,7 +153,7 @@ static gint gtk_toolbar_enter_callback( GtkWidget *WXUNUSED(widget),
 static void wxInsertChildInToolBar( wxToolBar* WXUNUSED(parent),
                                     wxWindow* WXUNUSED(child) )
 {
-    /* we don't do anything here but pray */
+    // we don't do anything here
 }
 
 // ----------------------------------------------------------------------------
@@ -218,10 +191,8 @@ void wxToolBar::Init()
 {
     m_fg =
     m_bg = (GdkColor *)NULL;
-
     m_toolbar = (GtkToolbar *)NULL;
-
-    m_blockNextEvent = FALSE;
+    m_blockEvent = FALSE;
 }
 
 wxToolBar::~wxToolBar()
@@ -250,7 +221,14 @@ bool wxToolBar::Create( wxWindow *parent,
 
     GtkOrientation orient = style & wxTB_VERTICAL ? GTK_ORIENTATION_VERTICAL
                                                   : GTK_ORIENTATION_HORIZONTAL;
+
+#ifdef __WXGTK20__
+    m_toolbar = GTK_TOOLBAR( gtk_toolbar_new() );
+    gtk_toolbar_set_orientation(m_toolbar, orient);
+    gtk_toolbar_set_style(m_toolbar, GTK_TOOLBAR_ICONS);
+#else
     m_toolbar = GTK_TOOLBAR( gtk_toolbar_new( orient, GTK_TOOLBAR_ICONS ) );
+#endif
 
     SetToolSeparation(7);
 
@@ -260,10 +238,8 @@ bool wxToolBar::Create( wxWindow *parent,
         gtk_container_add( GTK_CONTAINER(m_widget), GTK_WIDGET(m_toolbar) );
         gtk_widget_show( GTK_WIDGET(m_toolbar) );
 
-#if (GTK_MINOR_VERSION > 0)
         if (style & wxTB_FLAT)
             gtk_handle_box_set_shadow_type( GTK_HANDLE_BOX(m_widget), GTK_SHADOW_NONE );
-#endif
     }
     else
     {     
@@ -272,24 +248,29 @@ bool wxToolBar::Create( wxWindow *parent,
 
     gtk_toolbar_set_tooltips( GTK_TOOLBAR(m_toolbar), TRUE );
 
-#if (GTK_MINOR_VERSION > 0)
+    // FIXME: there is no such function for toolbars in 2.0
+#ifndef __WXGTK20__
     if (style & wxTB_FLAT)
         gtk_toolbar_set_button_relief( GTK_TOOLBAR(m_toolbar), GTK_RELIEF_NONE );
 #endif
 
+
     m_fg = new GdkColor;
-    m_fg->red = 0;
-    m_fg->green = 0;
+    m_fg->red = 0; 
+    m_fg->green = 0; 
     m_fg->blue = 0;
-    gdk_color_alloc( gtk_widget_get_colormap( GTK_WIDGET(m_toolbar) ), m_fg );
-
+    wxColour fg(0,0,0);
+    fg.CalcPixel( gtk_widget_get_colormap( GTK_WIDGET(m_toolbar) ) );
+    m_fg->pixel = fg.GetPixel();
+    
     m_bg = new GdkColor;
     m_bg->red = 65535;
     m_bg->green = 65535;
-    m_bg->blue = 50000;
-    gdk_color_alloc( gtk_widget_get_colormap( GTK_WIDGET(m_toolbar) ), m_bg );
-
-#if (GTK_MINOR_VERSION > 0)
+    m_bg->blue = 49980;
+    wxColour bg(255,255,196);
+    bg.CalcPixel( gtk_widget_get_colormap( GTK_WIDGET(m_toolbar) ) );
+    m_bg->pixel = bg.GetPixel();
+    
     gtk_tooltips_force_window( GTK_TOOLBAR(m_toolbar)->tooltips );
 
     GtkStyle *g_style = 
@@ -298,10 +279,10 @@ bool wxToolBar::Create( wxWindow *parent,
                     GTK_TOOLBAR(m_toolbar)->tooltips->tip_window ) );
 
     g_style->bg[GTK_STATE_NORMAL] = *m_bg;
+
+    SET_STYLE_FONT(g_style, GtkGetDefaultGuiFont());
+
     gtk_widget_set_style( GTK_TOOLBAR(m_toolbar)->tooltips->tip_window, g_style );
-#else
-    gtk_tooltips_set_colors( GTK_TOOLBAR(m_toolbar)->tooltips, m_bg, m_fg );
-#endif
 
     m_parent->DoAddChild( this );
 
@@ -316,9 +297,12 @@ bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase)
 {
     wxToolBarTool *tool = (wxToolBarTool *)toolBase;
 
+    // we have inserted a space before all the tools
+    if (m_xMargin > 1) pos++;
+    
     if ( tool->IsButton() )
     {
-        wxBitmap bitmap = tool->GetBitmap1();
+        wxBitmap bitmap = tool->GetNormalBitmap();
 
         wxCHECK_MSG( bitmap.Ok(), FALSE,
                      wxT("invalid bitmap for wxToolBar icon") );
@@ -375,12 +359,16 @@ bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase)
 
             gtk_signal_connect( GTK_OBJECT(tool->m_item),
                                 "enter_notify_event", 
-                                GTK_SIGNAL_FUNC(gtk_toolbar_enter_callback),
+                                GTK_SIGNAL_FUNC(gtk_toolbar_tool_callback),
+                                (gpointer)tool );
+            gtk_signal_connect( GTK_OBJECT(tool->m_item),
+                                "leave_notify_event", 
+                                GTK_SIGNAL_FUNC(gtk_toolbar_tool_callback),
                                 (gpointer)tool );
             break;
 
         case wxTOOL_STYLE_SEPARATOR:
-            gtk_toolbar_append_space( m_toolbar );
+            gtk_toolbar_insert_space( m_toolbar, pos );
 
             // skip the rest
             return TRUE;
@@ -397,14 +385,15 @@ bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase)
     }
 
     GtkRequisition req;
-    (* GTK_WIDGET_CLASS( GTK_OBJECT(m_widget)->klass )->size_request ) (m_widget, &req );
+    (* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(m_widget) )->size_request )
+        (m_widget, &req );
     m_width = req.width + m_xMargin;
-    m_height = req.height + 2*m_yMargin + 4;
+    m_height = req.height + 2*m_yMargin;
 
     return TRUE;
 }
 
-bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *toolBase)
+bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
 {
     wxToolBarTool *tool = (wxToolBarTool *)toolBase;
 
@@ -458,9 +447,11 @@ void wxToolBar::DoToggleTool( wxToolBarToolBase *toolBase, bool toggle )
             gtk_pixmap_set( pixmap, bitmap.GetPixmap(), mask );
         }
 
-        m_blockNextEvent = TRUE;  // we cannot use gtk_signal_disconnect here
+        m_blockEvent = TRUE;
 
         gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(item), toggle );
+        
+        m_blockEvent = FALSE;
     }
 }
 
@@ -497,10 +488,26 @@ void wxToolBar::SetMargins( int x, int y )
 
 void wxToolBar::SetToolSeparation( int separation )
 {
+    // FIXME: this function disappeared
+#ifndef __WXGTK20__
     gtk_toolbar_set_space_size( m_toolbar, separation );
+#endif
+
     m_toolSeparation = separation;
 }
 
+void wxToolBar::SetToolShortHelp( int id, const wxString& helpString )
+{
+    wxToolBarTool *tool = (wxToolBarTool *)FindById(id);
+
+    if ( tool )
+    {
+        (void)tool->SetShortHelp(helpString);
+        gtk_tooltips_set_tip(m_toolbar->tooltips, tool->m_item,
+                             helpString.mbc_str(), "");
+    }
+}
+
 // ----------------------------------------------------------------------------
 // wxToolBar idle handling
 // ----------------------------------------------------------------------------
@@ -550,4 +557,4 @@ void wxToolBar::OnInternalIdle()
     UpdateWindowUI();
 }
 
-#endif
+#endif // wxUSE_TOOLBAR_NATIVE