add wxRenderer::GetCheckBoxSize(); refactor wxGTK code to avoid duplication (#9642)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54934 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2008-08-02 21:51:22 +00:00
parent 979a73474c
commit e8759560f8
12 changed files with 301 additions and 176 deletions

View File

@ -4240,6 +4240,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___LOWLEVEL_SRC_OBJECTS = \
monodll_minifram.o \ monodll_minifram.o \
monodll_pen.o \ monodll_pen.o \
monodll_popupwin.o \ monodll_popupwin.o \
monodll_private.o \
monodll_region.o \ monodll_region.o \
monodll_renderer.o \ monodll_renderer.o \
monodll_settings.o \ monodll_settings.o \
@ -5105,6 +5106,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___LOWLEVEL_SRC_OBJECTS_1 = \
monodll_minifram.o \ monodll_minifram.o \
monodll_pen.o \ monodll_pen.o \
monodll_popupwin.o \ monodll_popupwin.o \
monodll_private.o \
monodll_region.o \ monodll_region.o \
monodll_renderer.o \ monodll_renderer.o \
monodll_settings.o \ monodll_settings.o \
@ -6138,6 +6140,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___LOWLEVEL_SRC_OBJECTS_2 = \
monolib_minifram.o \ monolib_minifram.o \
monolib_pen.o \ monolib_pen.o \
monolib_popupwin.o \ monolib_popupwin.o \
monolib_private.o \
monolib_region.o \ monolib_region.o \
monolib_renderer.o \ monolib_renderer.o \
monolib_settings.o \ monolib_settings.o \
@ -7004,6 +7007,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___LOWLEVEL_SRC_OBJECTS_3 = \
monolib_minifram.o \ monolib_minifram.o \
monolib_pen.o \ monolib_pen.o \
monolib_popupwin.o \ monolib_popupwin.o \
monolib_private.o \
monolib_region.o \ monolib_region.o \
monolib_renderer.o \ monolib_renderer.o \
monolib_settings.o \ monolib_settings.o \
@ -8298,6 +8302,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___LOWLEVEL_SRC_OBJECTS_4 = \
coredll_minifram.o \ coredll_minifram.o \
coredll_pen.o \ coredll_pen.o \
coredll_popupwin.o \ coredll_popupwin.o \
coredll_private.o \
coredll_region.o \ coredll_region.o \
coredll_renderer.o \ coredll_renderer.o \
coredll_settings.o \ coredll_settings.o \
@ -9164,6 +9169,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___LOWLEVEL_SRC_OBJECTS_5 = \
coredll_minifram.o \ coredll_minifram.o \
coredll_pen.o \ coredll_pen.o \
coredll_popupwin.o \ coredll_popupwin.o \
coredll_private.o \
coredll_region.o \ coredll_region.o \
coredll_renderer.o \ coredll_renderer.o \
coredll_settings.o \ coredll_settings.o \
@ -9795,6 +9801,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___LOWLEVEL_SRC_OBJECTS_6 = \
corelib_minifram.o \ corelib_minifram.o \
corelib_pen.o \ corelib_pen.o \
corelib_popupwin.o \ corelib_popupwin.o \
corelib_private.o \
corelib_region.o \ corelib_region.o \
corelib_renderer.o \ corelib_renderer.o \
corelib_settings.o \ corelib_settings.o \
@ -10661,6 +10668,7 @@ COND_TOOLKIT_GTK_TOOLKIT_VERSION_2___LOWLEVEL_SRC_OBJECTS_7 = \
corelib_minifram.o \ corelib_minifram.o \
corelib_pen.o \ corelib_pen.o \
corelib_popupwin.o \ corelib_popupwin.o \
corelib_private.o \
corelib_region.o \ corelib_region.o \
corelib_renderer.o \ corelib_renderer.o \
corelib_settings.o \ corelib_settings.o \
@ -15653,6 +15661,9 @@ monodll_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@monodll_popupwin.o: $(srcdir)/src/os2/popupwin.cpp $(MONODLL_ODEP) @COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@monodll_popupwin.o: $(srcdir)/src/os2/popupwin.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/os2/popupwin.cpp @COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/os2/popupwin.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@monodll_private.o: $(srcdir)/src/gtk/private.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk/private.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@monodll_region.o: $(srcdir)/src/gtk/region.cpp $(MONODLL_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@monodll_region.o: $(srcdir)/src/gtk/region.cpp $(MONODLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk/region.cpp @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/gtk/region.cpp
@ -20141,6 +20152,9 @@ monolib_sound_sdl.o: $(srcdir)/src/unix/sound_sdl.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@monolib_popupwin.o: $(srcdir)/src/os2/popupwin.cpp $(MONOLIB_ODEP) @COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@monolib_popupwin.o: $(srcdir)/src/os2/popupwin.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/os2/popupwin.cpp @COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/os2/popupwin.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@monolib_private.o: $(srcdir)/src/gtk/private.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk/private.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@monolib_region.o: $(srcdir)/src/gtk/region.cpp $(MONOLIB_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@monolib_region.o: $(srcdir)/src/gtk/region.cpp $(MONOLIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk/region.cpp @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/gtk/region.cpp
@ -25121,6 +25135,9 @@ coredll_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(COREDLL_ODEP)
@COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@coredll_popupwin.o: $(srcdir)/src/os2/popupwin.cpp $(COREDLL_ODEP) @COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@coredll_popupwin.o: $(srcdir)/src/os2/popupwin.cpp $(COREDLL_ODEP)
@COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/os2/popupwin.cpp @COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/os2/popupwin.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@coredll_private.o: $(srcdir)/src/gtk/private.cpp $(COREDLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/gtk/private.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@coredll_region.o: $(srcdir)/src/gtk/region.cpp $(COREDLL_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@coredll_region.o: $(srcdir)/src/gtk/region.cpp $(COREDLL_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/gtk/region.cpp @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(COREDLL_CXXFLAGS) $(srcdir)/src/gtk/region.cpp
@ -28193,6 +28210,9 @@ corelib_win32.o: $(srcdir)/src/univ/themes/win32.cpp $(CORELIB_ODEP)
@COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@corelib_popupwin.o: $(srcdir)/src/os2/popupwin.cpp $(CORELIB_ODEP) @COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@corelib_popupwin.o: $(srcdir)/src/os2/popupwin.cpp $(CORELIB_ODEP)
@COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/os2/popupwin.cpp @COND_TOOLKIT_PM_USE_GUI_1_WXUNIV_0@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/os2/popupwin.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@corelib_private.o: $(srcdir)/src/gtk/private.cpp $(CORELIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/gtk/private.cpp
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@corelib_region.o: $(srcdir)/src/gtk/region.cpp $(CORELIB_ODEP) @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@corelib_region.o: $(srcdir)/src/gtk/region.cpp $(CORELIB_ODEP)
@COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/gtk/region.cpp @COND_TOOLKIT_GTK_TOOLKIT_VERSION_2_USE_GUI_1@ $(CXXC) -c -o $@ $(CORELIB_CXXFLAGS) $(srcdir)/src/gtk/region.cpp

View File

@ -997,6 +997,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file!
src/gtk/minifram.cpp src/gtk/minifram.cpp
src/gtk/pen.cpp src/gtk/pen.cpp
src/gtk/popupwin.cpp src/gtk/popupwin.cpp
src/gtk/private.cpp
src/gtk/region.cpp src/gtk/region.cpp
src/gtk/renderer.cpp src/gtk/renderer.cpp
src/gtk/settings.cpp src/gtk/settings.cpp

View File

@ -104,5 +104,27 @@ void gtk_window_set_policy (GtkWindow *window,
} // extern "C" } // extern "C"
// ----------------------------------------------------------------------------
// various private helper functions
// ----------------------------------------------------------------------------
namespace wxGTKPrivate
{
// these functions create the GTK widgets of the specified types which can then
// used to retrieve their styles, pass them to drawing functions &c
//
// the returned widgets shouldn't be destroyed, this is done automatically on
// shutdown
GtkWidget *GetButtonWidget();
GtkWidget *GetCheckButtonWidget();
GtkWidget *GetEntryWidget();
GtkWidget *GetHeaderButtonWidget();
GtkWidget *GetSplitterWidget();
GtkWidget *GetTreeWidget();
} // wxGTKPrivate
#endif // _WX_GTK_PRIVATE_H_ #endif // _WX_GTK_PRIVATE_H_

View File

@ -28,7 +28,7 @@
class WXDLLIMPEXP_FWD_CORE wxDC; class WXDLLIMPEXP_FWD_CORE wxDC;
class WXDLLIMPEXP_FWD_CORE wxWindow; class WXDLLIMPEXP_FWD_CORE wxWindow;
#include "wx/gdicmn.h" // for wxPoint #include "wx/gdicmn.h" // for wxPoint, wxSize
#include "wx/colour.h" #include "wx/colour.h"
#include "wx/font.h" #include "wx/font.h"
#include "wx/bitmap.h" #include "wx/bitmap.h"
@ -227,6 +227,9 @@ public:
const wxRect& rect, const wxRect& rect,
int flags = 0) = 0; int flags = 0) = 0;
// Returns the default size of a check box.
virtual wxSize GetCheckBoxSize(wxWindow *win) = 0;
// draw blank button // draw blank button
// //
// flags may use wxCONTROL_PRESSED, wxCONTROL_CURRENT and wxCONTROL_ISDEFAULT // flags may use wxCONTROL_PRESSED, wxCONTROL_CURRENT and wxCONTROL_ISDEFAULT
@ -373,6 +376,9 @@ public:
int flags = 0 ) int flags = 0 )
{ m_rendererNative.DrawCheckBox( win, dc, rect, flags ); } { m_rendererNative.DrawCheckBox( win, dc, rect, flags ); }
virtual wxSize GetCheckBoxSize(wxWindow *win)
{ return m_rendererNative.GetCheckBoxSize(win); }
virtual void DrawPushButton(wxWindow *win, virtual void DrawPushButton(wxWindow *win,
wxDC& dc, wxDC& dc,
const wxRect& rect, const wxRect& rect,

View File

@ -211,6 +211,8 @@ public:
virtual void DrawCheckBox(wxWindow *win, wxDC& dc, virtual void DrawCheckBox(wxWindow *win, wxDC& dc,
const wxRect& rect, int flags = 0 ); const wxRect& rect, int flags = 0 );
virtual wxSize GetCheckBoxSize(wxWindow *win);
virtual void DrawPushButton(wxWindow *win, wxDC& dc, virtual void DrawPushButton(wxWindow *win, wxDC& dc,
const wxRect& rect, int flags = 0 ); const wxRect& rect, int flags = 0 );
@ -286,7 +288,7 @@ public:
~wxRendererNative(); ~wxRendererNative();
/** /**
Draw a check box (used by wxDataViewCtrl). Draw a check box.
@a flags may have the @c wxCONTROL_CHECKED, @c wxCONTROL_CURRENT or @a flags may have the @c wxCONTROL_CHECKED, @c wxCONTROL_CURRENT or
@c wxCONTROL_UNDETERMINED bit set, see @ref wxCONTROL_FLAGS. @c wxCONTROL_UNDETERMINED bit set, see @ref wxCONTROL_FLAGS.
@ -427,6 +429,11 @@ public:
*/ */
static wxRendererNative GetGeneric(); static wxRendererNative GetGeneric();
/**
Returns the size of a check box.
*/
virtual wxSize GetCheckBoxSize(wxWindow *win);
/** /**
Returns the height of a header button, either a fixed platform height if Returns the height of a header button, either a fixed platform height if
available, or a available, or a

View File

@ -98,6 +98,8 @@ public:
const wxRect& rect, const wxRect& rect,
int flags = 0); int flags = 0);
virtual wxSize GetCheckBoxSize(wxWindow *win);
virtual void DrawPushButton(wxWindow *win, virtual void DrawPushButton(wxWindow *win,
wxDC& dc, wxDC& dc,
const wxRect& rect, const wxRect& rect,
@ -618,6 +620,11 @@ wxRendererGeneric::DrawCheckBox(wxWindow *WXUNUSED(win),
} }
} }
wxSize wxRendererGeneric::GetCheckBoxSize(wxWindow *WXUNUSED(win))
{
return wxSize(16, 16);
}
void void
wxRendererGeneric::DrawPushButton(wxWindow *win, wxRendererGeneric::DrawPushButton(wxWindow *win,
wxDC& dc, wxDC& dc,

169
src/gtk/private.cpp Normal file
View File

@ -0,0 +1,169 @@
///////////////////////////////////////////////////////////////////////////////
// Name: src/gtk/private.cpp
// Purpose: implementation of wxGTK private functions
// Author: Marcin Malich
// Modified by:
// Created: 28.06.2008
// RCS-ID: $Id$
// Copyright: (c) 2008 Marcin Malich <me@malcom.pl>
// License: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
// for compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/module.h"
#endif
#include "wx/gtk/private.h"
// ----------------------------------------------------------------------------
// wxGTKPrivate functions implementation
// ----------------------------------------------------------------------------
namespace wxGTKPrivate
{
static GtkWidget *gs_container = NULL;
static GtkContainer* GetContainer()
{
if ( gs_container == NULL )
{
GtkWidget* window = gtk_window_new(GTK_WINDOW_POPUP);
gs_container = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window), gs_container);
}
return GTK_CONTAINER(gs_container);
}
GtkWidget *GetButtonWidget()
{
static GtkWidget *s_button = NULL;
if ( !s_button )
{
s_button = gtk_button_new();
gtk_container_add(GetContainer(), s_button);
gtk_widget_realize(s_button);
}
return s_button;
}
GtkWidget *GetCheckButtonWidget()
{
static GtkWidget *s_button = NULL;
if ( !s_button )
{
s_button = gtk_check_button_new();
gtk_container_add(GetContainer(), s_button);
gtk_widget_realize(s_button);
}
return s_button;
}
GtkWidget *GetEntryWidget()
{
static GtkWidget *s_entry = NULL;
if ( !s_entry )
{
s_entry = gtk_entry_new();
gtk_container_add(GetContainer(), 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
// differently if the button is in a treeview.
GtkWidget *GetHeaderButtonWidget()
{
static GtkWidget *s_button = NULL;
if ( !s_button )
{
// Get the dummy tree widget, give it a column, and then use the
// widget in the column header for the rendering code.
GtkWidget* treewidget = GetTreeWidget();
GtkTreeViewColumn *column = gtk_tree_view_column_new();
gtk_tree_view_append_column(GTK_TREE_VIEW(treewidget), column);
s_button = column->button;
}
return s_button;
}
GtkWidget* GetSplitterWidget()
{
static GtkWidget* widget;
if (widget == NULL)
{
widget = gtk_vpaned_new();
gtk_container_add(GetContainer(), widget);
gtk_widget_realize(widget);
}
return widget;
}
GtkWidget *GetTreeWidget()
{
static GtkWidget *s_tree = NULL;
if ( !s_tree )
{
s_tree = gtk_tree_view_new();
gtk_container_add(GetContainer(), s_tree);
gtk_widget_realize(s_tree);
}
return s_tree;
}
// Module for destroying created widgets
class WidgetsCleanupModule : public wxModule
{
public:
virtual bool OnInit()
{
return true;
}
virtual void OnExit()
{
if ( gs_container )
{
GtkWidget* parent = gtk_widget_get_parent(gs_container);
gtk_widget_destroy(parent);
}
}
DECLARE_DYNAMIC_CLASS(WidgetsCleanupModule)
};
IMPLEMENT_DYNAMIC_CLASS(WidgetsCleanupModule, wxModule)
static WidgetsCleanupModule gs_widgetsCleanupModule;
} // wxGTKPrivate namespace

View File

@ -34,6 +34,7 @@
#endif #endif
#include "wx/gtk/dc.h" #include "wx/gtk/dc.h"
#include "wx/gtk/private.h"
#include <gtk/gtk.h> #include <gtk/gtk.h>
@ -96,58 +97,15 @@ public:
virtual void DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags = 0); virtual void DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags = 0);
virtual wxSize GetCheckBoxSize(wxWindow *win);
virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win); virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win);
class Module;
friend class Module;
private:
// used by DrawPushButton and DrawDropArrow
static GtkWidget *GetButtonWidget();
// used by DrawTreeItemButton()
static GtkWidget *GetTreeWidget();
// used by DrawCheckBox()
static GtkWidget *GetCheckButtonWidget();
// Used by DrawHeaderButton
static GtkWidget *GetHeaderButtonWidget();
static GtkWidget* GetSplitterWidget();
// container for created widgets
static GtkContainer* GetContainer();
static GtkWidget* ms_container;
}; };
// Module for destroying created widgets
class wxRendererGTK::Module: public wxModule
{
public:
virtual bool OnInit()
{
return true;
}
virtual void OnExit()
{
if (wxRendererGTK::ms_container)
{
GtkWidget* parent =
gtk_widget_get_parent(wxRendererGTK::ms_container);
gtk_widget_destroy(parent);
}
}
DECLARE_DYNAMIC_CLASS(wxRendererGTK::Module)
};
IMPLEMENT_DYNAMIC_CLASS(wxRendererGTK::Module, wxModule)
// ============================================================================ // ============================================================================
// implementation // implementation
// ============================================================================ // ============================================================================
GtkWidget* wxRendererGTK::ms_container;
/* static */ /* static */
wxRendererNative& wxRendererNative::GetDefault() wxRendererNative& wxRendererNative::GetDefault()
{ {
@ -156,117 +114,6 @@ wxRendererNative& wxRendererNative::GetDefault()
return s_rendererGTK; return s_rendererGTK;
} }
// ----------------------------------------------------------------------------
// helper functions
// ----------------------------------------------------------------------------
GtkContainer* wxRendererGTK::GetContainer()
{
if (ms_container == NULL)
{
GtkWidget* window = gtk_window_new(GTK_WINDOW_POPUP);
ms_container = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window), ms_container);
}
return GTK_CONTAINER(ms_container);
}
GtkWidget *
wxRendererGTK::GetButtonWidget()
{
static GtkWidget *s_button = NULL;
if ( !s_button )
{
s_button = gtk_button_new();
gtk_container_add(GetContainer(), s_button);
gtk_widget_realize( s_button );
}
return s_button;
}
GtkWidget *
wxRendererGTK::GetCheckButtonWidget()
{
static GtkWidget *s_button = NULL;
if ( !s_button )
{
s_button = gtk_check_button_new();
gtk_container_add(GetContainer(), s_button);
gtk_widget_realize( s_button );
}
return s_button;
}
GtkWidget *
wxRendererGTK::GetTreeWidget()
{
static GtkWidget *s_tree = NULL;
if ( !s_tree )
{
s_tree = gtk_tree_view_new();
gtk_container_add(GetContainer(), s_tree);
gtk_widget_realize( 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;
}
// 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
// differently if the button is in a treeview.
GtkWidget *
wxRendererGTK::GetHeaderButtonWidget()
{
static GtkWidget *s_button = NULL;
if ( !s_button )
{
// Get the dummy tree widget, give it a column, and then use the
// widget in the column header for the rendering code.
GtkWidget* treewidget = GetTreeWidget();
GtkTreeViewColumn* column = gtk_tree_view_column_new();
gtk_tree_view_append_column(GTK_TREE_VIEW(treewidget), column);
s_button = column->button;
}
return s_button;
}
GtkWidget* wxRendererGTK::GetSplitterWidget()
{
static GtkWidget* widget;
if (widget == NULL)
{
widget = gtk_vpaned_new();
gtk_container_add(GetContainer(), widget);
gtk_widget_realize(widget);
}
return widget;
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// list/tree controls drawing // list/tree controls drawing
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@ -280,7 +127,7 @@ wxRendererGTK::DrawHeaderButton(wxWindow *win,
wxHeaderButtonParams* params) wxHeaderButtonParams* params)
{ {
GtkWidget *button = GetHeaderButtonWidget(); GtkWidget *button = wxGTKPrivate::GetHeaderButtonWidget();
GdkWindow* gdk_window = NULL; GdkWindow* gdk_window = NULL;
#if wxUSE_NEW_DC #if wxUSE_NEW_DC
@ -327,7 +174,7 @@ void
wxRendererGTK::DrawTreeItemButton(wxWindow* win, wxRendererGTK::DrawTreeItemButton(wxWindow* win,
wxDC& dc, const wxRect& rect, int flags) wxDC& dc, const wxRect& rect, int flags)
{ {
GtkWidget *tree = GetTreeWidget(); GtkWidget *tree = wxGTKPrivate::GetTreeWidget();
GdkWindow* gdk_window = NULL; GdkWindow* gdk_window = NULL;
#if wxUSE_NEW_DC #if wxUSE_NEW_DC
@ -387,7 +234,7 @@ wxRendererGTK::GetSplitterParams(const wxWindow *WXUNUSED(win))
// we don't draw any border, hence 0 for the second field // we don't draw any border, hence 0 for the second field
return wxSplitterRenderParams return wxSplitterRenderParams
( (
GetGtkSplitterFullSize(GetSplitterWidget()), GetGtkSplitterFullSize(wxGTKPrivate::GetSplitterWidget()),
0, 0,
true // hot sensitive true // hot sensitive
); );
@ -428,7 +275,7 @@ wxRendererGTK::DrawSplitterSash(wxWindow *win,
wxASSERT_MSG( gdk_window, wxASSERT_MSG( gdk_window,
wxT("cannot use wxRendererNative on wxDC of this type") ); wxT("cannot use wxRendererNative on wxDC of this type") );
wxCoord full_size = GetGtkSplitterFullSize(GetSplitterWidget()); wxCoord full_size = GetGtkSplitterFullSize(wxGTKPrivate::GetSplitterWidget());
// are we drawing vertical or horizontal splitter? // are we drawing vertical or horizontal splitter?
const bool isVert = orient == wxVERTICAL; const bool isVert = orient == wxVERTICAL;
@ -477,7 +324,7 @@ wxRendererGTK::DrawDropArrow(wxWindow *WXUNUSED(win),
const wxRect& rect, const wxRect& rect,
int flags) int flags)
{ {
GtkWidget *button = GetButtonWidget(); GtkWidget *button = wxGTKPrivate::GetButtonWidget();
// If we give GTK_PIZZA(win->m_wxwindow)->bin_window as // If we give GTK_PIZZA(win->m_wxwindow)->bin_window as
// a window for gtk_paint_xxx function, then it won't // a window for gtk_paint_xxx function, then it won't
@ -546,13 +393,26 @@ wxRendererGTK::DrawComboBoxDropButton(wxWindow *win,
DrawDropArrow(win,dc,rect); DrawDropArrow(win,dc,rect);
} }
wxSize
wxRendererGTK::GetCheckBoxSize(wxWindow *WXUNUSED(win))
{
gint indicator_size, indicator_spacing;
gtk_widget_style_get(wxGTKPrivate::GetCheckButtonWidget(),
"indicator_size", &indicator_size,
"indicator_spacing", &indicator_spacing,
NULL);
int size = indicator_size + indicator_spacing * 2;
return wxSize(size, size);
}
void void
wxRendererGTK::DrawCheckBox(wxWindow *WXUNUSED(win), wxRendererGTK::DrawCheckBox(wxWindow *WXUNUSED(win),
wxDC& dc, wxDC& dc,
const wxRect& rect, const wxRect& rect,
int flags ) int flags )
{ {
GtkWidget *button = GetCheckButtonWidget(); GtkWidget *button = wxGTKPrivate::GetCheckButtonWidget();
GdkWindow* gdk_window = NULL; GdkWindow* gdk_window = NULL;
#if wxUSE_NEW_DC #if wxUSE_NEW_DC
@ -566,6 +426,12 @@ wxRendererGTK::DrawCheckBox(wxWindow *WXUNUSED(win),
wxASSERT_MSG( gdk_window, wxASSERT_MSG( gdk_window,
wxT("cannot use wxRendererNative on wxDC of this type") ); wxT("cannot use wxRendererNative on wxDC of this type") );
gint indicator_size, indicator_spacing;
gtk_widget_style_get(button,
"indicator_size", &indicator_size,
"indicator_spacing", &indicator_spacing,
NULL);
GtkStateType state; GtkStateType state;
if ( flags & wxCONTROL_PRESSED ) if ( flags & wxCONTROL_PRESSED )
@ -586,9 +452,9 @@ wxRendererGTK::DrawCheckBox(wxWindow *WXUNUSED(win),
NULL, NULL,
button, button,
"cellcheck", "cellcheck",
dc.LogicalToDeviceX(rect.x)+2, dc.LogicalToDeviceX(rect.x) + indicator_spacing,
dc.LogicalToDeviceY(rect.y)+3, dc.LogicalToDeviceY(rect.y) + indicator_spacing,
13, 13 indicator_size, indicator_size
); );
} }
@ -598,7 +464,7 @@ wxRendererGTK::DrawPushButton(wxWindow *WXUNUSED(win),
const wxRect& rect, const wxRect& rect,
int flags) int flags)
{ {
GtkWidget *button = GetButtonWidget(); GtkWidget *button = wxGTKPrivate::GetButtonWidget();
GdkWindow* gdk_window = NULL; GdkWindow* gdk_window = NULL;
#if wxUSE_NEW_DC #if wxUSE_NEW_DC

View File

@ -8,6 +8,7 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
#include "wx/defs.h" #include "wx/defs.h"
#include "wx/gtk/private.h"
#include "wx/gtk/private/win_gtk.h" #include "wx/gtk/private/win_gtk.h"
/* /*
@ -382,8 +383,6 @@ 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;
@ -391,7 +390,7 @@ 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 *entry_widget = GetEntryWidget(); GtkWidget *entry_widget = wxGTKPrivate::GetEntryWidget();
if (entry_widget->style) if (entry_widget->style)
{ {
x = entry_widget->style->xthickness; x = entry_widget->style->xthickness;

View File

@ -301,8 +301,6 @@ gtk_window_expose_callback( GtkWidget* widget,
#ifndef __WXUNIVERSAL__ #ifndef __WXUNIVERSAL__
GtkWidget* GetEntryWidget();
extern "C" { extern "C" {
static gboolean static gboolean
expose_event_border(GtkWidget* widget, GdkEventExpose* gdk_event, wxWindow* win) expose_event_border(GtkWidget* widget, GdkEventExpose* gdk_event, wxWindow* win)
@ -343,7 +341,7 @@ expose_event_border(GtkWidget* widget, GdkEventExpose* gdk_event, wxWindow* win)
// for scrollable ones // for scrollable ones
detail = "viewport"; detail = "viewport";
GtkWidget* styleWidget = GetEntryWidget(); GtkWidget* styleWidget = wxGTKPrivate::GetEntryWidget();
gtk_paint_shadow( gtk_paint_shadow(
styleWidget->style, gdk_event->window, GTK_STATE_NORMAL, styleWidget->style, gdk_event->window, GTK_STATE_NORMAL,
shadow, NULL, styleWidget, detail, x, y, w, h); shadow, NULL, styleWidget, detail, x, y, w, h);

View File

@ -122,6 +122,8 @@ public:
const wxRect& rect, const wxRect& rect,
int flags = 0); int flags = 0);
virtual wxSize GetCheckBoxSize(wxWindow *win);
virtual int GetHeaderButtonHeight(wxWindow *win); virtual int GetHeaderButtonHeight(wxWindow *win);
private: private:
@ -295,6 +297,12 @@ void wxRendererMSW::DrawFocusRect(wxWindow * WXUNUSED(win),
::DrawFocusRect(GetHdcOf(*((wxMSWDCImpl*)dc.GetImpl())), &rc); ::DrawFocusRect(GetHdcOf(*((wxMSWDCImpl*)dc.GetImpl())), &rc);
} }
wxSize wxRendererMSW::GetCheckBoxSize(wxWindow * WXUNUSED(win))
{
return wxSize(::GetSystemMetrics(SM_CXMENUCHECK),
::GetSystemMetrics(SM_CYMENUCHECK));
}
int wxRendererMSW::GetHeaderButtonHeight(wxWindow * WXUNUSED(win)) int wxRendererMSW::GetHeaderButtonHeight(wxWindow * WXUNUSED(win))
{ {
// some "reasonable" value returned in case of error, it doesn't really // some "reasonable" value returned in case of error, it doesn't really
@ -560,7 +568,7 @@ wxRendererXP::DrawItemSelectionRect(wxWindow *win,
dc.SetBrush(brush); dc.SetBrush(brush);
dc.SetPen(*wxTRANSPARENT_PEN); dc.SetPen(*wxTRANSPARENT_PEN);
dc.DrawRectangle( rect ); dc.DrawRectangle( rect );
if ((flags & wxCONTROL_FOCUSED) && (flags & wxCONTROL_CURRENT)) if ((flags & wxCONTROL_FOCUSED) && (flags & wxCONTROL_CURRENT))
DrawFocusRect( win, dc, rect, flags ); DrawFocusRect( win, dc, rect, flags );
} }

View File

@ -62,6 +62,8 @@ public:
const wxRect& rect, const wxRect& rect,
int flags = 0); int flags = 0);
virtual wxSize GetCheckBoxSize(wxWindow* win);
virtual void DrawComboBoxDropButton(wxWindow *win, virtual void DrawComboBoxDropButton(wxWindow *win,
wxDC& dc, wxDC& dc,
const wxRect& rect, const wxRect& rect,
@ -344,6 +346,27 @@ wxRendererMac::DrawCheckBox(wxWindow *win,
kThemeCheckBox, kThemeAdornmentNone); kThemeCheckBox, kThemeAdornmentNone);
} }
wxSize wxRendererMac::GetCheckBoxSize(wxWindow* WXUNUSED(win))
{
wxSize size;
SInt32 width, height;
OSStatus errStatus;
errStatus = GetThemeMetric(kThemeMetricCheckBoxWidth, &width);
if (errStatus == noErr)
{
size.SetWidth(width);
}
errStatus = GetThemeMetric(kThemeMetricCheckBoxHeight, &height);
if (errStatus == noErr)
{
size.SetHeight(height);
}
return size;
}
void void
wxRendererMac::DrawComboBoxDropButton(wxWindow *win, wxRendererMac::DrawComboBoxDropButton(wxWindow *win,
wxDC& dc, wxDC& dc,
@ -405,4 +428,3 @@ wxRendererMac::DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int fl
HIThemeDrawFocusRect( &cgrect , true , cgContext , kHIThemeOrientationNormal ) ; HIThemeDrawFocusRect( &cgrect , true , cgContext , kHIThemeOrientationNormal ) ;
} }