More attempts to better support theme borders

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49790 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2007-11-09 20:57:39 +00:00
parent 8b71ebada4
commit 6de67633bd
4 changed files with 103 additions and 29 deletions

View File

@@ -88,21 +88,40 @@ class MyMiniControl: public wxControl
{ {
public: public:
MyMiniControl( wxWindow *parent ) : 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)) void OnPaint(wxPaintEvent &WXUNUSED(event))
{ {
wxPaintDC dc(this); wxPaintDC dc(this);
dc.SetPen( *wxWHITE_PEN ); dc.SetPen( *wxTRANSPARENT_PEN );
dc.SetBrush( *wxGREEN_BRUSH ); dc.SetBrush( *wxWHITE_BRUSH );
wxSize size = GetClientSize(); wxSize size = GetClientSize();
dc.DrawRectangle( 0,0,size.x,size.y ); 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() virtual wxSize GetBestSize()
{ {
return wxSize(70,22); return wxSize(80,22);
} }
virtual bool AcceptsFocus()
{
return true;
}
bool m_hasFocus;
private: private:
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
@@ -110,6 +129,8 @@ private:
BEGIN_EVENT_TABLE(MyMiniControl, wxControl) BEGIN_EVENT_TABLE(MyMiniControl, wxControl)
EVT_PAINT(MyMiniControl::OnPaint) EVT_PAINT(MyMiniControl::OnPaint)
EVT_SET_FOCUS(MyMiniControl::OnSetFocus)
EVT_KILL_FOCUS(MyMiniControl::OnKillFocus)
END_EVENT_TABLE() END_EVENT_TABLE()
@@ -318,7 +339,7 @@ bool MyApp::OnInit()
// Create the main frame window // Create the main frame window
MyFrame* frame = new MyFrame((wxFrame *) NULL, wxID_ANY, MyFrame* frame = new MyFrame((wxFrame *) NULL, wxID_ANY,
_T("wxToolBar Sample"), _T("wxToolBar Sample"),
wxPoint(100, 100), wxSize(550, 300)); wxPoint(100, 100), wxSize(550, 500));
frame->Show(true); frame->Show(true);
@@ -656,7 +677,25 @@ MyFrame::MyFrame(wxFrame* parent,
m_panel->SetSizer(sizer); m_panel->SetSizer(sizer);
if (m_extraToolBar) if (m_extraToolBar)
sizer->Add(m_extraToolBar, 0, wxEXPAND, 0); sizer->Add(m_extraToolBar, 0, wxEXPAND, 0);
sizer->Add(0,0,6);
sizer->Add(m_textWindow, 1, wxEXPAND, 0); 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() void MyFrame::LayoutChildren()

View File

@@ -181,6 +181,41 @@ wxRendererGTK::GetTreeWidget()
return s_tree; 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 // 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 // still a gtk_button the themes will typically differentiate and draw them

View File

@@ -9,6 +9,7 @@
#include "wx/defs.h" #include "wx/defs.h"
#include "wx/gtk/win_gtk.h" #include "wx/gtk/win_gtk.h"
#include "gtk/gtk.h"
/* /*
wxPizza is a custom GTK+ widget derived from GtkFixed. A custom widget wxPizza is a custom GTK+ widget derived from GtkFixed. A custom widget
@@ -166,6 +167,9 @@ static void realize(GtkWidget* widget)
else else
gdk_window_reparent(widget->window, pizza->m_backing_window, border_x, border_y); gdk_window_reparent(widget->window, pizza->m_backing_window, border_x, border_y);
gdk_window_resize(widget->window, w, h); 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) void wxPizza::get_border_widths(int& x, int& y)
{ {
x = y = 0; x = y = 0;
@@ -363,13 +369,11 @@ void wxPizza::get_border_widths(int& x, int& y)
x = y = 1; x = y = 1;
else if (m_border_style) else if (m_border_style)
{ {
GtkWidget* widget = GTK_WIDGET(this); GtkWidget *entry_widget = GetEntryWidget();
if (widget->style) if (entry_widget->style)
{ {
x = widget->style->xthickness; x = entry_widget->style->xthickness;
y = widget->style->ythickness; y = entry_widget->style->ythickness;
x = 1;
y = 1;
} }
} }
} }

View File

@@ -330,6 +330,9 @@ void wxgtk_window_size_request_callback(GtkWidget * WXUNUSED(widget),
// "expose_event" of m_wxwindow // "expose_event" of m_wxwindow
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
extern GtkWidget *GetEntryWidget();
extern "C" { extern "C" {
static gboolean static gboolean
gtk_window_expose_callback( GtkWidget *widget, gtk_window_expose_callback( GtkWidget *widget,
@@ -360,10 +363,10 @@ gtk_window_expose_callback( GtkWidget *widget,
if (win->HasFlag(wxBORDER_RAISED)) if (win->HasFlag(wxBORDER_RAISED))
shadow = GTK_SHADOW_OUT; shadow = GTK_SHADOW_OUT;
gtk_paint_shadow( gtk_paint_shadow(
widget->style, gdk_event->window, GTK_STATE_NORMAL, GetEntryWidget()->style, gdk_event->window, GTK_STATE_NORMAL,
shadow, NULL, widget, "viewport", 0, 0, w, h); shadow, NULL, GetEntryWidget(), "entry", 0, 0, w, h);
} }
return TRUE; return TRUE;
} }
@@ -405,14 +408,13 @@ gtk_window_expose_callback( GtkWidget *widget,
// "expose_event" from m_widget, for drawing border // "expose_event" from m_widget, for drawing border
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#if 0 #ifndef __WXUNIVERSAL__
ndef __WXUNIVERSAL__
extern "C" { extern "C" {
static gboolean 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 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; return false;
int x = 0; int x = 0;
@@ -428,9 +430,9 @@ expose_event_border(GtkWidget* widget, GdkEventExpose* event, wxWindow* win)
if (win->HasFlag(wxBORDER_SIMPLE)) if (win->HasFlag(wxBORDER_SIMPLE))
{ {
GdkGC* gc; GdkGC* gc;
gc = gdk_gc_new(event->window); gc = gdk_gc_new(gdk_event->window);
gdk_gc_set_foreground(gc, &widget->style->black); 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); g_object_unref(gc);
} }
else else
@@ -439,8 +441,8 @@ expose_event_border(GtkWidget* widget, GdkEventExpose* event, wxWindow* win)
if (win->HasFlag(wxBORDER_RAISED)) if (win->HasFlag(wxBORDER_RAISED))
shadow = GTK_SHADOW_OUT; shadow = GTK_SHADOW_OUT;
gtk_paint_shadow( gtk_paint_shadow(
widget->style, event->window, GTK_STATE_NORMAL, GetEntryWidget()->style, gdk_event->window, GTK_STATE_NORMAL,
shadow, &event->area, widget, "entry", x, y, w, h); shadow, NULL, GetEntryWidget(), "viewport", x, y, w, h);
} }
// no further painting is needed for border-only GdkWindow // no further painting is needed for border-only GdkWindow
@@ -2439,8 +2441,7 @@ void wxWindowGTK::PostCreation()
G_CALLBACK (gtk_wxwindow_commit_cb), this); G_CALLBACK (gtk_wxwindow_commit_cb), this);
// border drawing // border drawing
#if 0 #ifndef __WXUNIVERSAL__
ndef __WXUNIVERSAL__
if (HasFlag(wxBORDER_SIMPLE | wxBORDER_RAISED | wxBORDER_SUNKEN)) if (HasFlag(wxBORDER_SIMPLE | wxBORDER_RAISED | wxBORDER_SUNKEN))
{ {
g_signal_connect(m_widget, "expose_event", g_signal_connect(m_widget, "expose_event",
@@ -3649,7 +3650,6 @@ void wxWindowGTK::GtkSendPaintEvents()
} }
} }
#if 0
if (GetThemeEnabled() && (GetBackgroundStyle() == wxBG_STYLE_SYSTEM)) if (GetThemeEnabled() && (GetBackgroundStyle() == wxBG_STYLE_SYSTEM))
{ {
// find ancestor from which to steal background // find ancestor from which to steal background
@@ -3703,11 +3703,7 @@ void wxWindowGTK::GtkSendPaintEvents()
wxNcPaintEvent nc_paint_event( GetId() ); wxNcPaintEvent nc_paint_event( GetId() );
nc_paint_event.SetEventObject( this ); nc_paint_event.SetEventObject( this );
GetEventHandler()->ProcessEvent( nc_paint_event ); GetEventHandler()->ProcessEvent( nc_paint_event );
#endif
if (GetName() == "MyMiniControl")
wxPrintf( "MyMini paint\n" );
wxPaintEvent paint_event( GetId() ); wxPaintEvent paint_event( GetId() );
paint_event.SetEventObject( this ); paint_event.SetEventObject( this );
GetEventHandler()->ProcessEvent( paint_event ); GetEventHandler()->ProcessEvent( paint_event );