]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk1/window.cpp
All functionality I know hot implement already implemented.
[wxWidgets.git] / src / gtk1 / window.cpp
index 1e6c3b6b9208c62452c874d27b8a4346a38a7dfa..995e34d9fb849139ba9ca41c70e9cc068d48509d 100644 (file)
@@ -2,9 +2,8 @@
 // Name:        window.cpp
 // Purpose:
 // Author:      Robert Roebling
 // Name:        window.cpp
 // Purpose:
 // Author:      Robert Roebling
-// Created:     01/02/97
-// Id:
-// Copyright:   (c) 1998 Robert Roebling, Julian Smart and Markus Holzem
+// Id:          $Id$
+// Copyright:   (c) 1998 Robert Roebling, Julian Smart
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
@@ -139,7 +138,7 @@ static void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExp
   if (gdk_event->count > 0) return;
 
 /*
   if (gdk_event->count > 0) return;
 
 /*
-  printf( "OnExpose from " );
+      printf( "OnExpose from " );
   if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
     printf( win->GetClassInfo()->GetClassName() );
   printf( ".\n" );
   if (win->GetClassInfo() && win->GetClassInfo()->GetClassName())
     printf( win->GetClassInfo()->GetClassName() );
   printf( ".\n" );
@@ -842,7 +841,7 @@ static gint gtk_scrollbar_button_release_callback( GtkRange *widget, GdkEventBut
 // "drop_data_available_event"
 //-----------------------------------------------------------------------------
 
 // "drop_data_available_event"
 //-----------------------------------------------------------------------------
 
-static void gtk_window_drop_callback( GtkWidget *widget, GdkEvent *event, wxWindow *win )
+static void gtk_window_drop_callback( GtkWidget *widget, GdkEventDropDataAvailable *event, wxWindow *win )
 {
   if (!win->HasVMT()) return;
 
 {
   if (!win->HasVMT()) return;
 
@@ -851,6 +850,7 @@ static void gtk_window_drop_callback( GtkWidget *widget, GdkEvent *event, wxWind
     int x = 0;
     int y = 0;
     gdk_window_get_pointer( widget->window, &x, &y, (GdkModifierType *) NULL );
     int x = 0;
     int y = 0;
     gdk_window_get_pointer( widget->window, &x, &y, (GdkModifierType *) NULL );
+    win->GetDropTarget()->m_size = event->data_numbytes;
     win->GetDropTarget()->Drop( event, x, y );
   }
 
     win->GetDropTarget()->Drop( event, x, y );
   }
 
@@ -913,7 +913,8 @@ wxWindow::wxWindow()
   m_isEnabled = TRUE;
   m_pDropTarget = (wxDropTarget *) NULL;
   m_resizing = FALSE;
   m_isEnabled = TRUE;
   m_pDropTarget = (wxDropTarget *) NULL;
   m_resizing = FALSE;
-  m_hasOwnStyle = FALSE;
+  m_scrollGC = (GdkGC*) NULL;
+  m_widgetStyle = (GtkStyle*) NULL;
 }
 
 bool wxWindow::Create( wxWindow *parent, wxWindowID id,
 }
 
 bool wxWindow::Create( wxWindow *parent, wxWindowID id,
@@ -983,7 +984,7 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id,
 
   m_wxwindow = gtk_myfixed_new();
 
 
   m_wxwindow = gtk_myfixed_new();
 
-  if (m_wxwindow) GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
+  GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
 
   if (m_windowStyle & wxTAB_TRAVERSAL == wxTAB_TRAVERSAL)
     GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
 
   if (m_windowStyle & wxTAB_TRAVERSAL == wxTAB_TRAVERSAL)
     GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
@@ -1015,7 +1016,7 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id,
   gtk_widget_show( m_wxwindow );
 
   PostCreation();
   gtk_widget_show( m_wxwindow );
 
   PostCreation();
-
+  
   Show( TRUE );
 
   return TRUE;
   Show( TRUE );
 
   return TRUE;
@@ -1032,6 +1033,10 @@ wxWindow::~wxWindow()
 
   DestroyChildren();
 
 
   DestroyChildren();
 
+  if (m_widgetStyle) gtk_style_unref( m_widgetStyle );
+  
+  if (m_scrollGC) gdk_gc_unref( m_scrollGC );
+    
   if (m_wxwindow) gtk_widget_destroy( m_wxwindow );
 
   if (m_widget) gtk_widget_destroy( m_widget );
   if (m_wxwindow) gtk_widget_destroy( m_wxwindow );
 
   if (m_widget) gtk_widget_destroy( m_widget );
@@ -1097,7 +1102,7 @@ void wxWindow::PreCreation( wxWindow *parent, wxWindowID id,
     m_cursor = new wxCursor( wxCURSOR_ARROW );
   m_font = *wxSWISS_FONT;
 //  m_backgroundColour = wxWHITE;
     m_cursor = new wxCursor( wxCURSOR_ARROW );
   m_font = *wxSWISS_FONT;
 //  m_backgroundColour = wxWHITE;
-  m_foregroundColour = wxBLACK;
+//  m_foregroundColour = wxBLACK;
   m_windowStyle = style;
   m_windowName = name;
   m_constraints = (wxLayoutConstraints *) NULL;
   m_windowStyle = style;
   m_windowName = name;
   m_constraints = (wxLayoutConstraints *) NULL;
@@ -1110,7 +1115,8 @@ void wxWindow::PreCreation( wxWindow *parent, wxWindowID id,
   m_pDropTarget = (wxDropTarget *) NULL;
   m_resizing = FALSE;
   m_windowValidator = (wxValidator *) NULL;
   m_pDropTarget = (wxDropTarget *) NULL;
   m_resizing = FALSE;
   m_windowValidator = (wxValidator *) NULL;
-  m_hasOwnStyle = FALSE;
+  m_scrollGC = (GdkGC*) NULL;
+  m_widgetStyle = (GtkStyle*) NULL;
 }
 
 void wxWindow::PostCreation()
 }
 
 void wxWindow::PostCreation()
@@ -1130,11 +1136,7 @@ void wxWindow::PostCreation()
 
   if (m_widget && m_parent) gtk_widget_realize( m_widget );
 
 
   if (m_widget && m_parent) gtk_widget_realize( m_widget );
 
-  if (m_wxwindow)
-  {
-    gtk_widget_realize( m_wxwindow );
-    gdk_gc_set_exposures( m_wxwindow->style->fg_gc[0], TRUE );
-  }
+  if (m_wxwindow) gtk_widget_realize( m_wxwindow );
 
   SetCursor( *wxSTANDARD_CURSOR );
 
 
   SetCursor( *wxSTANDARD_CURSOR );
 
@@ -1949,23 +1951,22 @@ wxColour wxWindow::GetBackgroundColour() const
   return m_backgroundColour;
 }
 
   return m_backgroundColour;
 }
 
-void wxWindow::SetBackgroundColourHelper( GdkWindow *window )
-{
-  if (!m_backgroundColour.Ok()) return;
-  
-  m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) );
-  gdk_window_set_background( window, m_backgroundColour.GetColor() );
-  gdk_window_clear( window );
-}
-
 void wxWindow::SetBackgroundColour( const wxColour &colour )
 {
   wxCHECK_RET( m_widget != NULL, "invalid window" );
 
   m_backgroundColour = colour;
 void wxWindow::SetBackgroundColour( const wxColour &colour )
 {
   wxCHECK_RET( m_widget != NULL, "invalid window" );
 
   m_backgroundColour = colour;
+  if (!m_backgroundColour.Ok()) return;
+  
+  if (m_wxwindow)
+  {
+    GdkWindow *window = m_wxwindow->window;
+    m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) );
+    gdk_window_set_background( window, m_backgroundColour.GetColor() );
+    gdk_window_clear( window );
+  }
   
   
-  GtkWidget *widget = m_wxwindow == NULL ? m_widget : m_wxwindow;
-  SetBackgroundColourHelper( widget->window );
+  ApplyWidgetStyle();
 }
 
 wxColour wxWindow::GetForegroundColour() const
 }
 
 wxColour wxWindow::GetForegroundColour() const
@@ -1975,7 +1976,56 @@ wxColour wxWindow::GetForegroundColour() const
 
 void wxWindow::SetForegroundColour( const wxColour &colour )
 {
 
 void wxWindow::SetForegroundColour( const wxColour &colour )
 {
+  wxCHECK_RET( m_widget != NULL, "invalid window" );
+
   m_foregroundColour = colour;
   m_foregroundColour = colour;
+  if (!m_foregroundColour.Ok()) return;
+  
+  ApplyWidgetStyle();
+}
+
+GtkStyle *wxWindow::GetWidgetStyle()
+{
+  if (m_widgetStyle) gtk_style_unref( m_widgetStyle );
+  
+  m_widgetStyle = 
+    gtk_style_copy( 
+      gtk_widget_get_style( m_widget ) );
+      
+  return m_widgetStyle;
+}
+
+void wxWindow::SetWidgetStyle()
+{
+  GtkStyle *style = GetWidgetStyle();
+  
+  gdk_font_unref( style->font );
+  style->font = gdk_font_ref( m_font.GetInternalFont( 1.0 ) );
+  
+  if (m_foregroundColour.Ok())
+  {
+    m_foregroundColour.CalcPixel( gdk_window_get_colormap( m_widget->window ) );
+    style->fg[GTK_STATE_NORMAL] = *m_foregroundColour.GetColor();
+    style->fg[GTK_STATE_PRELIGHT] = *m_foregroundColour.GetColor();
+    style->fg[GTK_STATE_ACTIVE] = *m_foregroundColour.GetColor();
+  }
+  
+  if (m_backgroundColour.Ok())
+  {
+    m_backgroundColour.CalcPixel( gdk_window_get_colormap( m_widget->window ) );
+    style->bg[GTK_STATE_NORMAL] = *m_backgroundColour.GetColor();
+    style->base[GTK_STATE_NORMAL] = *m_backgroundColour.GetColor();
+    style->bg[GTK_STATE_PRELIGHT] = *m_backgroundColour.GetColor();
+    style->base[GTK_STATE_PRELIGHT] = *m_backgroundColour.GetColor();
+    style->bg[GTK_STATE_ACTIVE] = *m_backgroundColour.GetColor();
+    style->base[GTK_STATE_ACTIVE] = *m_backgroundColour.GetColor();
+    style->bg[GTK_STATE_INSENSITIVE] = *m_backgroundColour.GetColor();
+    style->base[GTK_STATE_INSENSITIVE] = *m_backgroundColour.GetColor();
+  }
+}
+
+void wxWindow::ApplyWidgetStyle()
+{
 }
 
 bool wxWindow::Validate()
 }
 
 bool wxWindow::Validate()
@@ -2039,7 +2089,7 @@ void wxWindow::OnInitDialog( wxInitDialogEvent &WXUNUSED(event) )
 
 void wxWindow::InitDialog()
 {
 
 void wxWindow::InitDialog()
 {
-  wxASSERT_MSG( (m_widget != NULL), "invalid window" );
+  wxCHECK_RET( m_widget != NULL, "invalid window" );
 
   wxInitDialogEvent event(GetId());
   event.SetEventObject( this );
 
   wxInitDialogEvent event(GetId());
   event.SetEventObject( this );
@@ -2061,8 +2111,10 @@ static void SetInvokingWindow( wxMenu *menu, wxWindow *win )
 
 bool wxWindow::PopupMenu( wxMenu *menu, int WXUNUSED(x), int WXUNUSED(y) )
 {
 
 bool wxWindow::PopupMenu( wxMenu *menu, int WXUNUSED(x), int WXUNUSED(y) )
 {
-  wxASSERT_MSG( (m_widget != NULL), "invalid window" );
+  wxCHECK_MSG( m_widget != NULL, FALSE, "invalid window" );
 
 
+  wxCHECK_MSG( menu != NULL, FALSE, "invalid popup-menu" );
+  
   SetInvokingWindow( menu, this );
   gtk_menu_popup(
                   GTK_MENU(menu->m_menu),
   SetInvokingWindow( menu, this );
   gtk_menu_popup(
                   GTK_MENU(menu->m_menu),
@@ -2078,7 +2130,7 @@ bool wxWindow::PopupMenu( wxMenu *menu, int WXUNUSED(x), int WXUNUSED(y) )
 
 void wxWindow::SetDropTarget( wxDropTarget *dropTarget )
 {
 
 void wxWindow::SetDropTarget( wxDropTarget *dropTarget )
 {
-  wxASSERT_MSG( (m_widget != NULL), "invalid window" );
+  wxCHECK_RET( m_widget != NULL, "invalid window" );
 
   GtkWidget *dnd_widget = GetConnectWidget();
 
 
   GtkWidget *dnd_widget = GetConnectWidget();
 
@@ -2131,28 +2183,14 @@ bool wxWindow::IsOwnGtkWindow( GdkWindow *window )
 
 void wxWindow::SetFont( const wxFont &font )
 {
 
 void wxWindow::SetFont( const wxFont &font )
 {
-  wxASSERT_MSG( (m_widget != NULL), "invalid window" );
+  wxCHECK_RET( m_widget != NULL, "invalid window" );
 
   if (((wxFont*)&font)->Ok())
     m_font = font;
   else
     m_font = *wxSWISS_FONT;
 
   if (((wxFont*)&font)->Ok())
     m_font = font;
   else
     m_font = *wxSWISS_FONT;
-
-  GtkStyle *style = (GtkStyle*) NULL;
-  if (!m_hasOwnStyle)
-  {
-    m_hasOwnStyle = TRUE;
-    style = gtk_style_copy( gtk_widget_get_style( m_widget ) );
-  }
-  else
-  {
-    style = gtk_widget_get_style( m_widget );
-  }
-
-  gdk_font_unref( style->font );
-  style->font = gdk_font_ref( m_font.GetInternalFont( 1.0 ) );
-
-  gtk_widget_set_style( m_widget, style );
+    
+  ApplyWidgetStyle();
 }
 
 wxFont *wxWindow::GetFont()
 }
 
 wxFont *wxWindow::GetFont()
@@ -2172,9 +2210,9 @@ long wxWindow::GetWindowStyleFlag() const
 
 void wxWindow::CaptureMouse()
 {
 
 void wxWindow::CaptureMouse()
 {
-  wxASSERT_MSG( (m_widget != NULL), "invalid window" );
+  wxCHECK_RET( m_widget != NULL, "invalid window" );
 
 
-  wxASSERT_MSG( (g_capturing == FALSE), "CaptureMouse called twice" );
+  wxCHECK_RET( g_capturing == FALSE, "CaptureMouse called twice" );
 
   GtkWidget *connect_widget = GetConnectWidget();
   gtk_grab_add( connect_widget );
 
   GtkWidget *connect_widget = GetConnectWidget();
   gtk_grab_add( connect_widget );
@@ -2189,9 +2227,9 @@ void wxWindow::CaptureMouse()
 
 void wxWindow::ReleaseMouse()
 {
 
 void wxWindow::ReleaseMouse()
 {
-  wxASSERT_MSG( (m_widget != NULL), "invalid window" );
+  wxCHECK_RET( m_widget != NULL, "invalid window" );
 
 
-  wxASSERT_MSG( (g_capturing == TRUE), "ReleaseMouse called twice" );
+  wxCHECK_RET( g_capturing == TRUE, "ReleaseMouse called twice" );
 
   GtkWidget *connect_widget = GetConnectWidget();
   gtk_grab_remove( connect_widget );
 
   GtkWidget *connect_widget = GetConnectWidget();
   gtk_grab_remove( connect_widget );
@@ -2431,7 +2469,14 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) )
     int d_y = 0;
     if (dx > 0) d_x = dx;
     if (dy > 0) d_y = dy;
     int d_y = 0;
     if (dx > 0) d_x = dx;
     if (dy > 0) d_y = dy;
-    gdk_window_copy_area( m_wxwindow->window, m_wxwindow->style->fg_gc[0], d_x, d_y,
+    
+    if (!m_scrollGC)
+    {
+      m_scrollGC = gdk_gc_new( m_wxwindow->window );
+      gdk_gc_set_exposures( m_scrollGC, TRUE );
+    }
+    
+    gdk_window_copy_area( m_wxwindow->window, m_scrollGC, d_x, d_y,
       m_wxwindow->window, s_x, s_y, w, h );
 
     wxRect rect;
       m_wxwindow->window, s_x, s_y, w, h );
 
     wxRect rect;