]> git.saurik.com Git - wxWidgets.git/commitdiff
More attempts to better support theme borders
authorRobert Roebling <robert@roebling.de>
Fri, 9 Nov 2007 20:57:39 +0000 (20:57 +0000)
committerRobert Roebling <robert@roebling.de>
Fri, 9 Nov 2007 20:57:39 +0000 (20:57 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49790 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

samples/toolbar/toolbar.cpp
src/gtk/renderer.cpp
src/gtk/win_gtk.cpp
src/gtk/window.cpp

index 829d6020863fdde89777971108e75e0b95f7ab55..98cf74b127f2553eca0844e7408779595ba6d9d7 100644 (file)
@@ -88,21 +88,40 @@ class MyMiniControl: public wxControl
 {
 public:
     MyMiniControl( wxWindow *parent ) :
-      wxControl( parent, -1, wxDefaultPosition, wxSize(70,22), wxBORDER_SUNKEN, wxDefaultValidator, "MyMiniControl" )
+      wxControl( parent, -1, wxDefaultPosition, wxSize(80,22), wxBORDER_SUNKEN, wxDefaultValidator, "MyMiniControl" )
     {
+        m_hasFocus = false;
     }
     void OnPaint(wxPaintEvent &WXUNUSED(event))
     {
        wxPaintDC dc(this);
-       dc.SetPen( *wxWHITE_PEN );
-       dc.SetBrush( *wxGREEN_BRUSH );
+       dc.SetPen( *wxTRANSPARENT_PEN );
+       dc.SetBrush( *wxWHITE_BRUSH );
        wxSize size = GetClientSize();
        dc.DrawRectangle( 0,0,size.x,size.y );
+       if (m_hasFocus)
+          dc.DrawText( "Focussed", 1,1 );
+    }
+    void OnSetFocus(wxFocusEvent &WXUNUSED(event))
+    {
+       m_hasFocus = true;
+       Refresh();
+    }
+    void OnKillFocus(wxFocusEvent &WXUNUSED(event))
+    {
+       m_hasFocus = false;
+       Refresh();
     }
     virtual wxSize GetBestSize()
     {
-        return wxSize(70,22);
+        return wxSize(80,22);
     }
+    virtual bool AcceptsFocus()
+    {
+        return true;
+    }
+    
+    bool m_hasFocus;
 
 private:
     DECLARE_EVENT_TABLE()
@@ -110,6 +129,8 @@ private:
 
 BEGIN_EVENT_TABLE(MyMiniControl, wxControl)
     EVT_PAINT(MyMiniControl::OnPaint)
+    EVT_SET_FOCUS(MyMiniControl::OnSetFocus)
+    EVT_KILL_FOCUS(MyMiniControl::OnKillFocus)
 END_EVENT_TABLE()
 
 
@@ -318,7 +339,7 @@ bool MyApp::OnInit()
     // Create the main frame window
     MyFrame* frame = new MyFrame((wxFrame *) NULL, wxID_ANY,
                                  _T("wxToolBar Sample"),
-                                  wxPoint(100, 100), wxSize(550, 300));
+                                  wxPoint(100, 100), wxSize(550, 500));
 
     frame->Show(true);
 
@@ -656,7 +677,25 @@ MyFrame::MyFrame(wxFrame* parent,
     m_panel->SetSizer(sizer);
     if (m_extraToolBar)
         sizer->Add(m_extraToolBar, 0, wxEXPAND, 0);
+    sizer->Add(0,0,6);
     sizer->Add(m_textWindow, 1, wxEXPAND, 0);
+
+    wxControl *control;    
+    control = new wxControl( m_panel, -1, wxPoint(30,20), wxSize(50,50), wxBORDER_SUNKEN );
+    control = new wxControl( m_panel, -1, wxPoint(130,20), wxSize(50,50), wxBORDER_SIMPLE );
+    control = new wxControl( m_panel, -1, wxPoint(230,20), wxSize(50,50), wxBORDER_RAISED );
+    control = new wxControl( m_panel, -1, wxPoint(330,20), wxSize(50,50), wxBORDER_THEME );
+    
+    wxScrolledWindow *scrolled;
+    scrolled = new wxScrolledWindow( m_panel, -1, wxPoint(30,120), wxSize(80,80), wxHSCROLL|wxVSCROLL | wxBORDER_SUNKEN );
+    scrolled->SetVirtualSize(400,400);
+    scrolled->SetScrollRate(10,10);
+    scrolled = new wxScrolledWindow( m_panel, -1, wxPoint(130,120), wxSize(80,80), wxHSCROLL|wxVSCROLL | wxBORDER_SIMPLE );
+    scrolled->SetVirtualSize(400,400);
+    scrolled->SetScrollRate(10,10);
+    scrolled = new wxScrolledWindow( m_panel, -1, wxPoint(230,120), wxSize(80,80), wxHSCROLL|wxVSCROLL | wxBORDER_RAISED );
+    scrolled->SetVirtualSize(400,400);
+    scrolled->SetScrollRate(10,10);
 }
 
 void MyFrame::LayoutChildren()
index 4eec03a12e3bbc0fd4f6365694d70b47369c422f..fa562f68c609927078e011212c7c7b644c1a3b42 100644 (file)
@@ -181,6 +181,41 @@ wxRendererGTK::GetTreeWidget()
     return s_tree;
 }
 
+// used elsewhere
+GtkWidget *GetEntryWidget()
+{
+    static GtkWidget *s_entry = NULL;
+    static GtkWidget *s_window = NULL;
+
+    if ( !s_entry )
+    {
+        s_window = gtk_window_new( GTK_WINDOW_POPUP );
+        gtk_widget_realize( s_window );
+        s_entry = gtk_entry_new();
+        gtk_container_add( GTK_CONTAINER(s_window), s_entry );
+        gtk_widget_realize( s_entry );
+    }
+
+    return s_entry;
+}
+
+// used elsewhere
+GtkWidget *GetScrolledWidget()
+{
+    static GtkWidget *s_entry = NULL;
+    static GtkWidget *s_window = NULL;
+
+    if ( !s_entry )
+    {
+        s_window = gtk_window_new( GTK_WINDOW_POPUP );
+        gtk_widget_realize( s_window );
+        s_entry = gtk_scrolled_window_new( NULL, NULL);
+        gtk_container_add( GTK_CONTAINER(s_window), s_entry );
+        gtk_widget_realize( s_entry );
+    }
+
+    return s_entry;
+}
 
 // This one just gets the button used by the column header.  Although it's
 // still a gtk_button the themes will typically differentiate and draw them
index 12b5be929084db33f682d2fb087e7cd40b123014..de389d621173ae449c8e3789449fc87c5993212a 100644 (file)
@@ -9,6 +9,7 @@
 
 #include "wx/defs.h"
 #include "wx/gtk/win_gtk.h"
+#include "gtk/gtk.h"
 
 /*
 wxPizza is a custom GTK+ widget derived from GtkFixed.  A custom widget
@@ -166,6 +167,9 @@ static void realize(GtkWidget* widget)
         else
             gdk_window_reparent(widget->window, pizza->m_backing_window, border_x, border_y);
         gdk_window_resize(widget->window, w, h);
+        
+        widget->style = gtk_style_attach (widget->style, pizza->m_backing_window);
+        gtk_style_set_background (widget->style, pizza->m_backing_window, GTK_STATE_NORMAL);
     }
 }
 
@@ -356,6 +360,8 @@ void wxPizza::scroll(int dx, int dy)
     }
 }
 
+extern GtkWidget *GetEntryWidget();
+
 void wxPizza::get_border_widths(int& x, int& y)
 {
     x = y = 0;
@@ -363,13 +369,11 @@ void wxPizza::get_border_widths(int& x, int& y)
         x = y = 1;
     else if (m_border_style)
     {
-        GtkWidget* widget = GTK_WIDGET(this);
-        if (widget->style)
+        GtkWidget *entry_widget = GetEntryWidget();
+        if (entry_widget->style)
         {
-            x = widget->style->xthickness;
-            y = widget->style->ythickness;
-            x = 1;
-            y = 1;
+            x = entry_widget->style->xthickness;
+            y = entry_widget->style->ythickness;
         }
     }
 }
index ff1855a5471476d9585500eece5c971ee94e49a2..21eaaf3f96ac9780aa38fce7678479c63b59fda3 100644 (file)
@@ -330,6 +330,9 @@ void wxgtk_window_size_request_callback(GtkWidget * WXUNUSED(widget),
 // "expose_event" of m_wxwindow
 //-----------------------------------------------------------------------------
 
+
+extern GtkWidget *GetEntryWidget();
+
 extern "C" {
 static gboolean
 gtk_window_expose_callback( GtkWidget *widget,
@@ -360,10 +363,10 @@ gtk_window_expose_callback( GtkWidget *widget,
             if (win->HasFlag(wxBORDER_RAISED))
                 shadow = GTK_SHADOW_OUT;
             gtk_paint_shadow(
-                widget->style, gdk_event->window, GTK_STATE_NORMAL,
-                shadow, NULL, widget, "viewport", 0, 0, w, h);
+                GetEntryWidget()->style, gdk_event->window, GTK_STATE_NORMAL,
+                shadow, NULL, GetEntryWidget(), "entry", 0, 0, w, h);
         }
-        
+   
         return TRUE;
     }
 
@@ -405,14 +408,13 @@ gtk_window_expose_callback( GtkWidget *widget,
 // "expose_event" from m_widget, for drawing border
 //-----------------------------------------------------------------------------
 
-#if 0
-ndef __WXUNIVERSAL__
+#ifndef __WXUNIVERSAL__
 extern "C" {
 static gboolean
-expose_event_border(GtkWidget* widget, GdkEventExpose* event, wxWindow* win)
+expose_event_border(GtkWidget* widget, GdkEventExpose* gdk_event, wxWindow* win)
 {
     // if this event is not for the GdkWindow the border is drawn on
-    if (win->m_wxwindow == win->m_widget && event->window == widget->window)
+    if (win->m_wxwindow == win->m_widget && gdk_event->window == widget->window)
         return false;
 
     int x = 0;
@@ -428,9 +430,9 @@ expose_event_border(GtkWidget* widget, GdkEventExpose* event, wxWindow* win)
     if (win->HasFlag(wxBORDER_SIMPLE))
     {
         GdkGC* gc;
-        gc = gdk_gc_new(event->window);
+        gc = gdk_gc_new(gdk_event->window);
         gdk_gc_set_foreground(gc, &widget->style->black);
-        gdk_draw_rectangle(event->window, gc, false, x, y, w - 1, h - 1);
+        gdk_draw_rectangle(gdk_event->window, gc, false, x, y, w - 1, h - 1);
         g_object_unref(gc);
     }
     else
@@ -439,8 +441,8 @@ expose_event_border(GtkWidget* widget, GdkEventExpose* event, wxWindow* win)
         if (win->HasFlag(wxBORDER_RAISED))
             shadow = GTK_SHADOW_OUT;
         gtk_paint_shadow(
-            widget->style, event->window, GTK_STATE_NORMAL,
-            shadow, &event->area, widget, "entry", x, y, w, h);
+           GetEntryWidget()->style, gdk_event->window, GTK_STATE_NORMAL,
+           shadow, NULL, GetEntryWidget(), "viewport", x, y, w, h);
     }
 
     // no further painting is needed for border-only GdkWindow
@@ -2439,8 +2441,7 @@ void wxWindowGTK::PostCreation()
                           G_CALLBACK (gtk_wxwindow_commit_cb), this);
 
         // border drawing
-#if 0
-ndef __WXUNIVERSAL__
+#ifndef __WXUNIVERSAL__
         if (HasFlag(wxBORDER_SIMPLE | wxBORDER_RAISED | wxBORDER_SUNKEN))
         {
             g_signal_connect(m_widget, "expose_event",
@@ -3649,7 +3650,6 @@ void wxWindowGTK::GtkSendPaintEvents()
         }
     }
 
-#if 0
     if (GetThemeEnabled() && (GetBackgroundStyle() == wxBG_STYLE_SYSTEM))
     {
         // find ancestor from which to steal background
@@ -3703,11 +3703,7 @@ void wxWindowGTK::GtkSendPaintEvents()
     wxNcPaintEvent nc_paint_event( GetId() );
     nc_paint_event.SetEventObject( this );
     GetEventHandler()->ProcessEvent( nc_paint_event );
-#endif
  
-    if (GetName() == "MyMiniControl")
-       wxPrintf( "MyMini paint\n" );
-
     wxPaintEvent paint_event( GetId() );
     paint_event.SetEventObject( this );
     GetEventHandler()->ProcessEvent( paint_event );