destroy created widgets
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@49844 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -30,6 +30,7 @@
|
|||||||
#include "wx/window.h"
|
#include "wx/window.h"
|
||||||
#include "wx/dcclient.h"
|
#include "wx/dcclient.h"
|
||||||
#include "wx/settings.h"
|
#include "wx/settings.h"
|
||||||
|
#include "wx/module.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
@@ -95,9 +96,10 @@ public:
|
|||||||
|
|
||||||
virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win);
|
virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win);
|
||||||
|
|
||||||
private:
|
class Module;
|
||||||
// FIXME: shouldn't we destroy these windows somewhere?
|
friend class Module;
|
||||||
|
|
||||||
|
private:
|
||||||
// used by DrawPushButton and DrawDropArrow
|
// used by DrawPushButton and DrawDropArrow
|
||||||
static GtkWidget *GetButtonWidget();
|
static GtkWidget *GetButtonWidget();
|
||||||
|
|
||||||
@@ -109,12 +111,41 @@ private:
|
|||||||
|
|
||||||
// Used by DrawHeaderButton
|
// Used by DrawHeaderButton
|
||||||
static GtkWidget *GetHeaderButtonWidget();
|
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()
|
||||||
{
|
{
|
||||||
@@ -127,18 +158,26 @@ wxRendererNative& wxRendererNative::GetDefault()
|
|||||||
// helper functions
|
// 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 *
|
GtkWidget *
|
||||||
wxRendererGTK::GetButtonWidget()
|
wxRendererGTK::GetButtonWidget()
|
||||||
{
|
{
|
||||||
static GtkWidget *s_button = NULL;
|
static GtkWidget *s_button = NULL;
|
||||||
static GtkWidget *s_window = NULL;
|
|
||||||
|
|
||||||
if ( !s_button )
|
if ( !s_button )
|
||||||
{
|
{
|
||||||
s_window = gtk_window_new( GTK_WINDOW_POPUP );
|
|
||||||
gtk_widget_realize( s_window );
|
|
||||||
s_button = gtk_button_new();
|
s_button = gtk_button_new();
|
||||||
gtk_container_add( GTK_CONTAINER(s_window), s_button );
|
gtk_container_add(GetContainer(), s_button);
|
||||||
gtk_widget_realize( s_button );
|
gtk_widget_realize( s_button );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,14 +188,11 @@ GtkWidget *
|
|||||||
wxRendererGTK::GetCheckButtonWidget()
|
wxRendererGTK::GetCheckButtonWidget()
|
||||||
{
|
{
|
||||||
static GtkWidget *s_button = NULL;
|
static GtkWidget *s_button = NULL;
|
||||||
static GtkWidget *s_window = NULL;
|
|
||||||
|
|
||||||
if ( !s_button )
|
if ( !s_button )
|
||||||
{
|
{
|
||||||
s_window = gtk_window_new( GTK_WINDOW_POPUP );
|
|
||||||
gtk_widget_realize( s_window );
|
|
||||||
s_button = gtk_check_button_new();
|
s_button = gtk_check_button_new();
|
||||||
gtk_container_add( GTK_CONTAINER(s_window), s_button );
|
gtk_container_add(GetContainer(), s_button);
|
||||||
gtk_widget_realize( s_button );
|
gtk_widget_realize( s_button );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,14 +203,11 @@ GtkWidget *
|
|||||||
wxRendererGTK::GetTreeWidget()
|
wxRendererGTK::GetTreeWidget()
|
||||||
{
|
{
|
||||||
static GtkWidget *s_tree = NULL;
|
static GtkWidget *s_tree = NULL;
|
||||||
static GtkWidget *s_window = NULL;
|
|
||||||
|
|
||||||
if ( !s_tree )
|
if ( !s_tree )
|
||||||
{
|
{
|
||||||
s_tree = gtk_tree_view_new();
|
s_tree = gtk_tree_view_new();
|
||||||
s_window = gtk_window_new( GTK_WINDOW_POPUP );
|
gtk_container_add(GetContainer(), s_tree);
|
||||||
gtk_widget_realize( s_window );
|
|
||||||
gtk_container_add( GTK_CONTAINER(s_window), s_tree );
|
|
||||||
gtk_widget_realize( s_tree );
|
gtk_widget_realize( s_tree );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -220,6 +253,18 @@ wxRendererGTK::GetHeaderButtonWidget()
|
|||||||
return s_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
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -326,14 +371,10 @@ wxRendererGTK::DrawTreeItemButton(wxWindow* win,
|
|||||||
// splitter sash drawing
|
// splitter sash drawing
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
static int GetGtkSplitterFullSize()
|
static int GetGtkSplitterFullSize(GtkWidget* widget)
|
||||||
{
|
{
|
||||||
static GtkWidget *s_paned = NULL;
|
|
||||||
if (s_paned == NULL)
|
|
||||||
s_paned = gtk_vpaned_new();
|
|
||||||
|
|
||||||
gint handle_size;
|
gint handle_size;
|
||||||
gtk_widget_style_get (s_paned, "handle_size", &handle_size, NULL);
|
gtk_widget_style_get(widget, "handle_size", &handle_size, NULL);
|
||||||
|
|
||||||
return handle_size;
|
return handle_size;
|
||||||
}
|
}
|
||||||
@@ -344,7 +385,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(),
|
GetGtkSplitterFullSize(GetSplitterWidget()),
|
||||||
0,
|
0,
|
||||||
true // hot sensitive
|
true // hot sensitive
|
||||||
);
|
);
|
||||||
@@ -385,7 +426,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();
|
wxCoord full_size = GetGtkSplitterFullSize(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;
|
||||||
|
Reference in New Issue
Block a user