]> 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 a76a068ebde04772b779e9b28080b4106a050225..995e34d9fb849139ba9ca41c70e9cc068d48509d 100644 (file)
@@ -2,9 +2,8 @@
 // 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
 /////////////////////////////////////////////////////////////////////////////
 
@@ -139,7 +138,7 @@ static void gtk_window_expose_callback( GtkWidget *WXUNUSED(widget), GdkEventExp
   if (gdk_event->count > 0) return;
 
 /*
-  printf( "OnExpose from " );
+      printf( "OnExpose from " );
   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"
 //-----------------------------------------------------------------------------
 
-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;
 
@@ -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 );
+    win->GetDropTarget()->m_size = event->data_numbytes;
     win->GetDropTarget()->Drop( event, x, y );
   }
 
@@ -913,7 +913,8 @@ wxWindow::wxWindow()
   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,
@@ -983,7 +984,7 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id,
 
   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 );
@@ -1015,13 +1016,13 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id,
   gtk_widget_show( m_wxwindow );
 
   PostCreation();
-
+  
   Show( TRUE );
 
   return TRUE;
 }
 
-wxWindow::~wxWindow(void)
+wxWindow::~wxWindow()
 {
   m_hasVMT = FALSE;
 
@@ -1032,6 +1033,10 @@ wxWindow::~wxWindow(void)
 
   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 );
@@ -1096,8 +1101,8 @@ void wxWindow::PreCreation( wxWindow *parent, wxWindowID id,
   if (m_cursor == NULL)
     m_cursor = new wxCursor( wxCURSOR_ARROW );
   m_font = *wxSWISS_FONT;
-  m_backgroundColour = wxWHITE;
-  m_foregroundColour = wxBLACK;
+//  m_backgroundColour = wxWHITE;
+//  m_foregroundColour = wxBLACK;
   m_windowStyle = style;
   m_windowName = name;
   m_constraints = (wxLayoutConstraints *) NULL;
@@ -1110,10 +1115,11 @@ void wxWindow::PreCreation( wxWindow *parent, wxWindowID id,
   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)
+void wxWindow::PostCreation()
 {
   if (m_parent) m_parent->AddChild( this );
 
@@ -1130,11 +1136,7 @@ void wxWindow::PostCreation(void)
 
   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 );
 
@@ -1168,7 +1170,7 @@ void wxWindow::ConnectWidget( GtkWidget *widget )
     GTK_SIGNAL_FUNC(gtk_window_leave_callback), (gpointer)this );
 }
 
-bool wxWindow::HasVMT(void)
+bool wxWindow::HasVMT()
 {
   return m_hasVMT;
 }
@@ -1184,7 +1186,7 @@ bool wxWindow::Close( bool force )
   return GetEventHandler()->ProcessEvent(event);
 }
 
-bool wxWindow::Destroy(void)
+bool wxWindow::Destroy()
 {
   wxASSERT_MSG( (m_widget != NULL), "invalid window" );
 
@@ -1193,7 +1195,7 @@ bool wxWindow::Destroy(void)
   return TRUE;
 }
 
-bool wxWindow::DestroyChildren(void)
+bool wxWindow::DestroyChildren()
 {
   if (GetChildren())
   {
@@ -1216,7 +1218,7 @@ void wxWindow::PrepareDC( wxDC &WXUNUSED(dc) )
   // are we to set fonts here ?
 }
 
-void wxWindow::ImplementSetSize(void)
+void wxWindow::ImplementSetSize()
 {
   if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth;
   if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight;
@@ -1225,7 +1227,7 @@ void wxWindow::ImplementSetSize(void)
   gtk_widget_set_usize( m_widget, m_width, m_height );
 }
 
-void wxWindow::ImplementSetPosition(void)
+void wxWindow::ImplementSetPosition()
 {
   if (IS_KIND_OF(this,wxFrame) || IS_KIND_OF(this,wxDialog))
   {
@@ -1523,7 +1525,7 @@ void wxWindow::Centre( int direction )
   }
 }
 
-void wxWindow::Fit(void)
+void wxWindow::Fit()
 {
   wxASSERT_MSG( (m_widget != NULL), "invalid window" );
 
@@ -1582,7 +1584,7 @@ void wxWindow::Enable( bool enable )
   if (m_wxwindow) gtk_widget_set_sensitive( m_wxwindow, enable );
 }
 
-int wxWindow::GetCharHeight(void) const
+int wxWindow::GetCharHeight() const
 {
   wxASSERT_MSG( (m_widget != NULL), "invalid window" );
 
@@ -1596,7 +1598,7 @@ int wxWindow::GetCharHeight(void) const
   return font->ascent + font->descent;
 }
 
-int wxWindow::GetCharWidth(void) const
+int wxWindow::GetCharWidth() const
 {
   wxASSERT_MSG( (m_widget != NULL), "invalid window" );
 
@@ -1650,7 +1652,7 @@ void wxWindow::MakeModal( bool modal )
   }
 }
 
-void wxWindow::SetFocus(void)
+void wxWindow::SetFocus()
 {
   wxASSERT_MSG( (m_widget != NULL), "invalid window" );
 
@@ -1664,7 +1666,7 @@ void wxWindow::SetFocus(void)
   }
 }
 
-bool wxWindow::OnClose(void)
+bool wxWindow::OnClose()
 {
   return TRUE;
 }
@@ -1740,7 +1742,7 @@ void wxWindow::AddChild( wxWindow *child )
   gtk_widget_set_usize( child->m_widget, child->m_width, child->m_height );
 }
 
-wxList *wxWindow::GetChildren(void)
+wxList *wxWindow::GetChildren()
 {
   return (&m_children);
 }
@@ -1757,26 +1759,26 @@ void wxWindow::SetReturnCode( int retCode )
   m_retCode = retCode;
 }
 
-int wxWindow::GetReturnCode(void)
+int wxWindow::GetReturnCode()
 {
   return m_retCode;
 }
 
-void wxWindow::Raise(void)
+void wxWindow::Raise()
 {
   wxASSERT_MSG( (m_widget != NULL), "invalid window" );
 
   if (m_widget) gdk_window_raise( m_widget->window );
 }
 
-void wxWindow::Lower(void)
+void wxWindow::Lower()
 {
   wxASSERT_MSG( (m_widget != NULL), "invalid window" );
 
   if (m_widget) gdk_window_lower( m_widget->window );
 }
 
-wxEvtHandler *wxWindow::GetEventHandler(void)
+wxEvtHandler *wxWindow::GetEventHandler()
 {
   return m_eventHandler;
 }
@@ -1812,7 +1814,7 @@ wxEvtHandler *wxWindow::PopEventHandler(bool deleteHandler)
    return (wxEvtHandler *) NULL;
 }
 
-wxValidator *wxWindow::GetValidator(void)
+wxValidator *wxWindow::GetValidator()
 {
   return m_windowValidator;
 }
@@ -1824,7 +1826,7 @@ void wxWindow::SetValidator( const wxValidator& validator )
   if (m_windowValidator) m_windowValidator->SetWindow(this);
 }
 
-bool wxWindow::IsBeingDeleted(void)
+bool wxWindow::IsBeingDeleted()
 {
   return FALSE;
 }
@@ -1834,7 +1836,7 @@ void wxWindow::SetId( wxWindowID id )
   m_windowId = id;
 }
 
-wxWindowID wxWindow::GetId(void)
+wxWindowID wxWindow::GetId()
 {
   return m_windowId;
 }
@@ -1937,45 +1939,98 @@ bool wxWindow::IsExposed( const wxRect& rect ) const
   return (m_updateRegion.Contains( rect.x, rect.y, rect.width, rect.height ) != wxOutRegion );
 }
 
-void wxWindow::Clear(void)
+void wxWindow::Clear()
 {
-  wxASSERT_MSG( (m_widget != NULL), "invalid window" );
+  wxCHECK_RET( m_widget != NULL, "invalid window" );
 
   if (m_wxwindow && m_wxwindow->window) gdk_window_clear( m_wxwindow->window );
 }
 
-wxColour wxWindow::GetBackgroundColour(void) const
+wxColour wxWindow::GetBackgroundColour() const
 {
   return m_backgroundColour;
 }
 
 void wxWindow::SetBackgroundColour( const wxColour &colour )
 {
-  wxASSERT_MSG( (m_widget != NULL), "invalid window" );
+  wxCHECK_RET( m_widget != NULL, "invalid window" );
 
   m_backgroundColour = colour;
+  if (!m_backgroundColour.Ok()) return;
+  
   if (m_wxwindow)
   {
-    m_backgroundColour.CalcPixel( m_wxwindow->style->colormap );
-    gdk_window_set_background( m_wxwindow->window, m_backgroundColour.GetColor() );
-    gdk_window_clear( m_wxwindow->window );
+    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 );
   }
-  // do something ?
+  
+  ApplyWidgetStyle();
 }
 
-wxColour wxWindow::GetForegroundColour(void) const
+wxColour wxWindow::GetForegroundColour() const
 {
   return m_foregroundColour;
 }
 
 void wxWindow::SetForegroundColour( const wxColour &colour )
 {
+  wxCHECK_RET( m_widget != NULL, "invalid window" );
+
   m_foregroundColour = colour;
+  if (!m_foregroundColour.Ok()) return;
+  
+  ApplyWidgetStyle();
 }
 
-bool wxWindow::Validate(void)
+GtkStyle *wxWindow::GetWidgetStyle()
 {
-  wxASSERT_MSG( (m_widget != NULL), "invalid window" );
+  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()
+{
+  wxCHECK_MSG( m_widget != NULL, FALSE, "invalid window" );
 
   wxNode *node = GetChildren()->First();
   while (node)
@@ -1988,9 +2043,9 @@ bool wxWindow::Validate(void)
   return TRUE;
 }
 
-bool wxWindow::TransferDataToWindow(void)
+bool wxWindow::TransferDataToWindow()
 {
-  wxASSERT_MSG( (m_widget != NULL), "invalid window" );
+  wxCHECK_MSG( m_widget != NULL, FALSE, "invalid window" );
 
   wxNode *node = GetChildren()->First();
   while (node)
@@ -2007,7 +2062,7 @@ bool wxWindow::TransferDataToWindow(void)
   return TRUE;
 }
 
-bool wxWindow::TransferDataFromWindow(void)
+bool wxWindow::TransferDataFromWindow()
 {
   wxASSERT_MSG( (m_widget != NULL), "invalid window" );
 
@@ -2032,9 +2087,9 @@ void wxWindow::OnInitDialog( wxInitDialogEvent &WXUNUSED(event) )
   TransferDataToWindow();
 }
 
-void wxWindow::InitDialog(void)
+void wxWindow::InitDialog()
 {
-  wxASSERT_MSG( (m_widget != NULL), "invalid window" );
+  wxCHECK_RET( m_widget != NULL, "invalid window" );
 
   wxInitDialogEvent event(GetId());
   event.SetEventObject( this );
@@ -2056,8 +2111,10 @@ static void SetInvokingWindow( wxMenu *menu, wxWindow *win )
 
 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),
@@ -2073,7 +2130,7 @@ bool wxWindow::PopupMenu( wxMenu *menu, int WXUNUSED(x), int WXUNUSED(y) )
 
 void wxWindow::SetDropTarget( wxDropTarget *dropTarget )
 {
-  wxASSERT_MSG( (m_widget != NULL), "invalid window" );
+  wxCHECK_RET( m_widget != NULL, "invalid window" );
 
   GtkWidget *dnd_widget = GetConnectWidget();
 
@@ -2110,7 +2167,7 @@ void wxWindow::DisconnectDnDWidget( GtkWidget *widget )
   m_pDropTarget->UnregisterWidget( widget );
 }
 
-GtkWidget* wxWindow::GetConnectWidget(void)
+GtkWidget* wxWindow::GetConnectWidget()
 {
   GtkWidget *connect_widget = m_widget;
   if (m_wxwindow) connect_widget = m_wxwindow;
@@ -2126,31 +2183,17 @@ bool wxWindow::IsOwnGtkWindow( GdkWindow *window )
 
 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;
-
-  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(void)
+wxFont *wxWindow::GetFont()
 {
   return &m_font;
 }
@@ -2160,16 +2203,16 @@ void wxWindow::SetWindowStyleFlag( long flag )
   m_windowStyle = flag;
 }
 
-long wxWindow::GetWindowStyleFlag(void) const
+long wxWindow::GetWindowStyleFlag() const
 {
   return m_windowStyle;
 }
 
-void wxWindow::CaptureMouse(void)
+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 );
@@ -2182,11 +2225,11 @@ void wxWindow::CaptureMouse(void)
   g_capturing = TRUE;
 }
 
-void wxWindow::ReleaseMouse(void)
+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 );
@@ -2198,12 +2241,12 @@ void wxWindow::SetTitle( const wxString &WXUNUSED(title) )
 {
 }
 
-wxString wxWindow::GetTitle(void) const
+wxString wxWindow::GetTitle() const
 {
   return (wxString&)m_windowName;
 }
 
-wxString wxWindow::GetLabel(void) const
+wxString wxWindow::GetLabel() const
 {
   return GetTitle();
 }
@@ -2213,17 +2256,17 @@ void wxWindow::SetName( const wxString &name )
   m_windowName = name;
 }
 
-wxString wxWindow::GetName(void) const
+wxString wxWindow::GetName() const
 {
   return (wxString&)m_windowName;
 }
 
-bool wxWindow::IsShown(void) const
+bool wxWindow::IsShown() const
 {
   return m_isShown;
 }
 
-bool wxWindow::IsRetained(void)
+bool wxWindow::IsRetained()
 {
   return FALSE;
 }
@@ -2426,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;
-    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;
@@ -2442,7 +2492,7 @@ void wxWindow::ScrollWindow( int dx, int dy, const wxRect* WXUNUSED(rect) )
 //          Layout
 //-------------------------------------------------------------------------------------
 
-wxLayoutConstraints *wxWindow::GetConstraints(void) const
+wxLayoutConstraints *wxWindow::GetConstraints() const
 {
   return m_constraints;
 }
@@ -2484,12 +2534,12 @@ void wxWindow::SetAutoLayout( bool autoLayout )
   m_autoLayout = autoLayout;
 }
 
-bool wxWindow::GetAutoLayout(void) const
+bool wxWindow::GetAutoLayout() const
 {
   return m_autoLayout;
 }
 
-wxSizer *wxWindow::GetSizer(void) const
+wxSizer *wxWindow::GetSizer() const
 {
   return m_windowSizer;
 }
@@ -2499,7 +2549,7 @@ void wxWindow::SetSizerParent( wxWindow *win )
   m_sizerParent = win;
 }
 
-wxWindow *wxWindow::GetSizerParent(void) const
+wxWindow *wxWindow::GetSizerParent() const
 {
   return m_sizerParent;
 }
@@ -2547,7 +2597,7 @@ void wxWindow::RemoveConstraintReference(wxWindow *otherWin)
 }
 
 // Reset any constraints that mention this window
-void wxWindow::DeleteRelatedConstraints(void)
+void wxWindow::DeleteRelatedConstraints()
 {
   if (m_constraintsInvolvedIn)
   {
@@ -2589,7 +2639,7 @@ void wxWindow::SetSizer(wxSizer *sizer)
  * New version
  */
 
-bool wxWindow::Layout(void)
+bool wxWindow::Layout()
 {
   if (GetConstraints())
   {
@@ -2689,7 +2739,7 @@ bool wxWindow::DoPhase(int phase)
   return TRUE;
 }
 
-void wxWindow::ResetConstraints(void)
+void wxWindow::ResetConstraints()
 {
   wxLayoutConstraints *constr = GetConstraints();
   if (constr)