Added size hints to dialog,

Corrected client data "code" for wxChoice,


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4065 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling 1999-10-19 10:51:48 +00:00
parent bcdfb2cf30
commit d6538e2c55
7 changed files with 112 additions and 133 deletions

View File

@ -17,14 +17,23 @@ Support for GTK 1.0 has been dropped. This version has
been tested with GTK 1.2.3 and GTK 1.2.6 - it is known been tested with GTK 1.2.3 and GTK 1.2.6 - it is known
not work with some other versions. not work with some other versions.
wxChoice can now handle only either void client data
(which it will not delete on destruction) or client
data of the wxClientData type (which it will delete),
instead of both at the same time. The same will happen
to wxListBox and wxComboBox some time.
Many build fixes for various platforms have been applied, Many build fixes for various platforms have been applied,
try again, poor HP-UX and *BSD users, but don't reckon try again, poor HP-UX and *BSD users, but don't reckon
with immediate success. Actually, when using GNU compilers, with immediate success. Actually, when using GNU compilers,
your chances are quite good. your chances are quite good.
My total rewrite of the wxWindows underlying GTK widget My rewrite of the wxWindows underlying GTK widget
has turned scrolling including subwindows from barely has turned scrolling including subwindows from barely
functional to pretty and fast. functional to pretty and fast. I also added scrolling
of foreign windows to wxScrolledWindow.
Setting size hints for the window manager might work now.
wxSocket and Co. have been improved up to the point of wxSocket and Co. have been improved up to the point of
calling it a rewrite. It works on wxMSW now too and calling it a rewrite. It works on wxMSW now too and
@ -40,7 +49,7 @@ Several printing things fixed.
HTML widget and the wxWindows' help system based upon HTML widget and the wxWindows' help system based upon
it have been reorganized and improved for easier use it have been reorganized and improved for easier use
from Python and C++. from Python and C++. Also HTML printing has been added.
wxSpinCtrl added. Like a wxSpinButton and a wxTextCtrl. wxSpinCtrl added. Like a wxSpinButton and a wxTextCtrl.

View File

@ -53,8 +53,7 @@ public:
wxString GetString( int n ) const; wxString GetString( int n ) const;
// implementation // implementation
wxList m_clientDataList; wxList m_clientList;
wxList m_clientObjectList;
void DisableEvents(); void DisableEvents();
void EnableEvents(); void EnableEvents();
@ -69,6 +68,16 @@ protected:
virtual void DoSetClientObject( int n, wxClientData* clientData ); virtual void DoSetClientObject( int n, wxClientData* clientData );
virtual wxClientData* DoGetClientObject( int n ) const; virtual wxClientData* DoGetClientObject( int n ) const;
// the above virtuals hide these virtuals in wxChoiceBase
virtual void DoSetClientData(void* clientData )
{ wxWindowBase::DoSetClientData(clientData); };
virtual void* DoGetClientData() const
{ return(wxWindowBase::DoGetClientData()); };
virtual void DoSetClientObject( wxClientData* clientData )
{ wxWindowBase::DoSetClientObject(clientData); };
virtual wxClientData* DoGetClientObject() const
{ return(wxWindowBase::DoGetClientObject()); };
private: private:
DECLARE_DYNAMIC_CLASS(wxChoice) DECLARE_DYNAMIC_CLASS(wxChoice)
}; };

View File

@ -53,8 +53,7 @@ public:
wxString GetString( int n ) const; wxString GetString( int n ) const;
// implementation // implementation
wxList m_clientDataList; wxList m_clientList;
wxList m_clientObjectList;
void DisableEvents(); void DisableEvents();
void EnableEvents(); void EnableEvents();
@ -69,6 +68,16 @@ protected:
virtual void DoSetClientObject( int n, wxClientData* clientData ); virtual void DoSetClientObject( int n, wxClientData* clientData );
virtual wxClientData* DoGetClientObject( int n ) const; virtual wxClientData* DoGetClientObject( int n ) const;
// the above virtuals hide these virtuals in wxChoiceBase
virtual void DoSetClientData(void* clientData )
{ wxWindowBase::DoSetClientData(clientData); };
virtual void* DoGetClientData() const
{ return(wxWindowBase::DoGetClientData()); };
virtual void DoSetClientObject( wxClientData* clientData )
{ wxWindowBase::DoSetClientObject(clientData); };
virtual wxClientData* DoGetClientObject() const
{ return(wxWindowBase::DoGetClientObject()); };
private: private:
DECLARE_DYNAMIC_CLASS(wxChoice) DECLARE_DYNAMIC_CLASS(wxChoice)
}; };

View File

@ -92,8 +92,7 @@ bool wxChoice::Create( wxWindow *parent, wxWindowID id,
for (int i = 0; i < n; i++) for (int i = 0; i < n; i++)
{ {
m_clientDataList.Append( (wxObject*) NULL ); m_clientList.Append( (wxObject*) NULL );
m_clientObjectList.Append( (wxObject*) NULL );
GtkWidget *item = gtk_menu_item_new_with_label( choices[i].mbc_str() ); GtkWidget *item = gtk_menu_item_new_with_label( choices[i].mbc_str() );
gtk_menu_append( GTK_MENU(menu), item ); gtk_menu_append( GTK_MENU(menu), item );
@ -145,18 +144,17 @@ int wxChoice::DoAppend( const wxString &item )
gtk_widget_show( menu_item ); gtk_widget_show( menu_item );
m_clientDataList.Append( (wxObject*) NULL ); m_clientList.Append( (wxObject*) NULL );
m_clientObjectList.Append( (wxObject*) NULL );
// return the index of the item in the control // return the index of the item in the control
return GetCount(); return GetCount() - 1;
} }
void wxChoice::DoSetClientData( int n, void* clientData ) void wxChoice::DoSetClientData( int n, void* clientData )
{ {
wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") ); wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
wxNode *node = m_clientDataList.Nth( n ); wxNode *node = m_clientList.Nth( n );
wxCHECK_RET( node, wxT("invalid index in wxChoice::DoSetClientData") ); wxCHECK_RET( node, wxT("invalid index in wxChoice::DoSetClientData") );
node->SetData( (wxObject*) clientData ); node->SetData( (wxObject*) clientData );
@ -166,7 +164,7 @@ void* wxChoice::DoGetClientData( int n ) const
{ {
wxCHECK_MSG( m_widget != NULL, NULL, wxT("invalid combobox") ); wxCHECK_MSG( m_widget != NULL, NULL, wxT("invalid combobox") );
wxNode *node = m_clientDataList.Nth( n ); wxNode *node = m_clientList.Nth( n );
wxCHECK_MSG( node, NULL, wxT("invalid index in wxChoice::DoGetClientData") ); wxCHECK_MSG( node, NULL, wxT("invalid index in wxChoice::DoGetClientData") );
return node->Data(); return node->Data();
@ -176,7 +174,7 @@ void wxChoice::DoSetClientObject( int n, wxClientData* clientData )
{ {
wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") ); wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
wxNode *node = m_clientObjectList.Nth( n ); wxNode *node = m_clientList.Nth( n );
wxCHECK_RET( node, wxT("invalid index in wxChoice::DoSetClientObject") ); wxCHECK_RET( node, wxT("invalid index in wxChoice::DoSetClientObject") );
wxClientData *cd = (wxClientData*) node->Data(); wxClientData *cd = (wxClientData*) node->Data();
@ -189,7 +187,7 @@ wxClientData* wxChoice::DoGetClientObject( int n ) const
{ {
wxCHECK_MSG( m_widget != NULL, (wxClientData*) NULL, wxT("invalid combobox") ); wxCHECK_MSG( m_widget != NULL, (wxClientData*) NULL, wxT("invalid combobox") );
wxNode *node = m_clientObjectList.Nth( n ); wxNode *node = m_clientList.Nth( n );
wxCHECK_MSG( node, (wxClientData *)NULL, wxCHECK_MSG( node, (wxClientData *)NULL,
wxT("invalid index in wxChoice::DoGetClientObject") ); wxT("invalid index in wxChoice::DoGetClientObject") );
@ -204,16 +202,17 @@ void wxChoice::Clear()
GtkWidget *menu = gtk_menu_new(); GtkWidget *menu = gtk_menu_new();
gtk_option_menu_set_menu( GTK_OPTION_MENU(m_widget), menu ); gtk_option_menu_set_menu( GTK_OPTION_MENU(m_widget), menu );
wxNode *node = m_clientObjectList.First(); if (m_clientDataItemsType == ClientData_Object)
{
wxNode *node = m_clientList.First();
while (node) while (node)
{ {
wxClientData *cd = (wxClientData*)node->Data(); wxClientData *cd = (wxClientData*)node->Data();
if (cd) delete cd; if (cd) delete cd;
node = node->Next(); node = node->Next();
} }
m_clientObjectList.Clear(); }
m_clientList.Clear();
m_clientDataList.Clear();
} }
void wxChoice::Delete( int WXUNUSED(n) ) void wxChoice::Delete( int WXUNUSED(n) )

View File

@ -118,48 +118,9 @@ gtk_dialog_realized_callback( GtkWidget *widget, wxDialog *win )
if (g_isIdle) if (g_isIdle)
wxapp_install_idle_handler(); wxapp_install_idle_handler();
/* I haven''t been able to set the position of /* I haven't been able to set the position of
the dialog before it is shown, so I set the the dialog before it is shown, so I set the
position in "realize" and "map" */ position in "realize" */
gtk_widget_set_uposition( widget, win->m_x, win->m_y );
/* set size hints */
gint flag = GDK_HINT_POS;
if ((win->GetMinWidth() != -1) || (win->GetMinHeight() != -1)) flag |= GDK_HINT_MIN_SIZE;
if ((win->GetMaxWidth() != -1) || (win->GetMaxHeight() != -1)) flag |= GDK_HINT_MAX_SIZE;
if (flag)
{
gdk_window_set_hints( win->m_widget->window,
win->m_x, win->m_y,
win->GetMinWidth(), win->GetMinHeight(),
win->GetMaxWidth(), win->GetMaxHeight(),
flag );
}
/* reset the icon */
if (win->m_icon != wxNullIcon)
{
wxIcon icon( win->m_icon );
win->m_icon = wxNullIcon;
win->SetIcon( icon );
}
return FALSE;
}
//-----------------------------------------------------------------------------
// "map" from m_widget
//-----------------------------------------------------------------------------
static gint
gtk_dialog_map_callback( GtkWidget *widget, wxDialog *win )
{
if (g_isIdle)
wxapp_install_idle_handler();
/* I haven''t been able to set the position of
the dialog before it is shown, so I set the
position in "realize" and "map" */
gtk_widget_set_uposition( widget, win->m_x, win->m_y ); gtk_widget_set_uposition( widget, win->m_x, win->m_y );
/* all this is for Motif Window Manager "hints" and is supposed to be /* all this is for Motif Window Manager "hints" and is supposed to be
@ -198,6 +159,27 @@ gtk_dialog_map_callback( GtkWidget *widget, wxDialog *win )
else else
gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1); gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1);
/* set size hints */
gint flag = GDK_HINT_POS;
if ((win->GetMinWidth() != -1) || (win->GetMinHeight() != -1)) flag |= GDK_HINT_MIN_SIZE;
if ((win->GetMaxWidth() != -1) || (win->GetMaxHeight() != -1)) flag |= GDK_HINT_MAX_SIZE;
if (flag)
{
gdk_window_set_hints( win->m_widget->window,
win->m_x, win->m_y,
win->GetMinWidth(), win->GetMinHeight(),
win->GetMaxWidth(), win->GetMaxHeight(),
flag );
}
/* reset the icon */
if (win->m_icon != wxNullIcon)
{
wxIcon icon( win->m_icon );
win->m_icon = wxNullIcon;
win->SetIcon( icon );
}
return FALSE; return FALSE;
} }
@ -304,11 +286,6 @@ bool wxDialog::Create( wxWindow *parent,
gtk_signal_connect( GTK_OBJECT(m_widget), "realize", gtk_signal_connect( GTK_OBJECT(m_widget), "realize",
GTK_SIGNAL_FUNC(gtk_dialog_realized_callback), (gpointer) this ); GTK_SIGNAL_FUNC(gtk_dialog_realized_callback), (gpointer) this );
/* we set the position of the window after the map event. setting it
before has no effect (with KWM) */
gtk_signal_connect( GTK_OBJECT(m_widget), "map",
GTK_SIGNAL_FUNC(gtk_dialog_map_callback), (gpointer) this );
/* the user resized the frame by dragging etc. */ /* the user resized the frame by dragging etc. */
gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate", gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
GTK_SIGNAL_FUNC(gtk_dialog_size_callback), (gpointer)this ); GTK_SIGNAL_FUNC(gtk_dialog_size_callback), (gpointer)this );

View File

@ -92,8 +92,7 @@ bool wxChoice::Create( wxWindow *parent, wxWindowID id,
for (int i = 0; i < n; i++) for (int i = 0; i < n; i++)
{ {
m_clientDataList.Append( (wxObject*) NULL ); m_clientList.Append( (wxObject*) NULL );
m_clientObjectList.Append( (wxObject*) NULL );
GtkWidget *item = gtk_menu_item_new_with_label( choices[i].mbc_str() ); GtkWidget *item = gtk_menu_item_new_with_label( choices[i].mbc_str() );
gtk_menu_append( GTK_MENU(menu), item ); gtk_menu_append( GTK_MENU(menu), item );
@ -145,18 +144,17 @@ int wxChoice::DoAppend( const wxString &item )
gtk_widget_show( menu_item ); gtk_widget_show( menu_item );
m_clientDataList.Append( (wxObject*) NULL ); m_clientList.Append( (wxObject*) NULL );
m_clientObjectList.Append( (wxObject*) NULL );
// return the index of the item in the control // return the index of the item in the control
return GetCount(); return GetCount() - 1;
} }
void wxChoice::DoSetClientData( int n, void* clientData ) void wxChoice::DoSetClientData( int n, void* clientData )
{ {
wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") ); wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
wxNode *node = m_clientDataList.Nth( n ); wxNode *node = m_clientList.Nth( n );
wxCHECK_RET( node, wxT("invalid index in wxChoice::DoSetClientData") ); wxCHECK_RET( node, wxT("invalid index in wxChoice::DoSetClientData") );
node->SetData( (wxObject*) clientData ); node->SetData( (wxObject*) clientData );
@ -166,7 +164,7 @@ void* wxChoice::DoGetClientData( int n ) const
{ {
wxCHECK_MSG( m_widget != NULL, NULL, wxT("invalid combobox") ); wxCHECK_MSG( m_widget != NULL, NULL, wxT("invalid combobox") );
wxNode *node = m_clientDataList.Nth( n ); wxNode *node = m_clientList.Nth( n );
wxCHECK_MSG( node, NULL, wxT("invalid index in wxChoice::DoGetClientData") ); wxCHECK_MSG( node, NULL, wxT("invalid index in wxChoice::DoGetClientData") );
return node->Data(); return node->Data();
@ -176,7 +174,7 @@ void wxChoice::DoSetClientObject( int n, wxClientData* clientData )
{ {
wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") ); wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
wxNode *node = m_clientObjectList.Nth( n ); wxNode *node = m_clientList.Nth( n );
wxCHECK_RET( node, wxT("invalid index in wxChoice::DoSetClientObject") ); wxCHECK_RET( node, wxT("invalid index in wxChoice::DoSetClientObject") );
wxClientData *cd = (wxClientData*) node->Data(); wxClientData *cd = (wxClientData*) node->Data();
@ -189,7 +187,7 @@ wxClientData* wxChoice::DoGetClientObject( int n ) const
{ {
wxCHECK_MSG( m_widget != NULL, (wxClientData*) NULL, wxT("invalid combobox") ); wxCHECK_MSG( m_widget != NULL, (wxClientData*) NULL, wxT("invalid combobox") );
wxNode *node = m_clientObjectList.Nth( n ); wxNode *node = m_clientList.Nth( n );
wxCHECK_MSG( node, (wxClientData *)NULL, wxCHECK_MSG( node, (wxClientData *)NULL,
wxT("invalid index in wxChoice::DoGetClientObject") ); wxT("invalid index in wxChoice::DoGetClientObject") );
@ -204,16 +202,17 @@ void wxChoice::Clear()
GtkWidget *menu = gtk_menu_new(); GtkWidget *menu = gtk_menu_new();
gtk_option_menu_set_menu( GTK_OPTION_MENU(m_widget), menu ); gtk_option_menu_set_menu( GTK_OPTION_MENU(m_widget), menu );
wxNode *node = m_clientObjectList.First(); if (m_clientDataItemsType == ClientData_Object)
{
wxNode *node = m_clientList.First();
while (node) while (node)
{ {
wxClientData *cd = (wxClientData*)node->Data(); wxClientData *cd = (wxClientData*)node->Data();
if (cd) delete cd; if (cd) delete cd;
node = node->Next(); node = node->Next();
} }
m_clientObjectList.Clear(); }
m_clientList.Clear();
m_clientDataList.Clear();
} }
void wxChoice::Delete( int WXUNUSED(n) ) void wxChoice::Delete( int WXUNUSED(n) )

View File

@ -118,48 +118,9 @@ gtk_dialog_realized_callback( GtkWidget *widget, wxDialog *win )
if (g_isIdle) if (g_isIdle)
wxapp_install_idle_handler(); wxapp_install_idle_handler();
/* I haven''t been able to set the position of /* I haven't been able to set the position of
the dialog before it is shown, so I set the the dialog before it is shown, so I set the
position in "realize" and "map" */ position in "realize" */
gtk_widget_set_uposition( widget, win->m_x, win->m_y );
/* set size hints */
gint flag = GDK_HINT_POS;
if ((win->GetMinWidth() != -1) || (win->GetMinHeight() != -1)) flag |= GDK_HINT_MIN_SIZE;
if ((win->GetMaxWidth() != -1) || (win->GetMaxHeight() != -1)) flag |= GDK_HINT_MAX_SIZE;
if (flag)
{
gdk_window_set_hints( win->m_widget->window,
win->m_x, win->m_y,
win->GetMinWidth(), win->GetMinHeight(),
win->GetMaxWidth(), win->GetMaxHeight(),
flag );
}
/* reset the icon */
if (win->m_icon != wxNullIcon)
{
wxIcon icon( win->m_icon );
win->m_icon = wxNullIcon;
win->SetIcon( icon );
}
return FALSE;
}
//-----------------------------------------------------------------------------
// "map" from m_widget
//-----------------------------------------------------------------------------
static gint
gtk_dialog_map_callback( GtkWidget *widget, wxDialog *win )
{
if (g_isIdle)
wxapp_install_idle_handler();
/* I haven''t been able to set the position of
the dialog before it is shown, so I set the
position in "realize" and "map" */
gtk_widget_set_uposition( widget, win->m_x, win->m_y ); gtk_widget_set_uposition( widget, win->m_x, win->m_y );
/* all this is for Motif Window Manager "hints" and is supposed to be /* all this is for Motif Window Manager "hints" and is supposed to be
@ -198,6 +159,27 @@ gtk_dialog_map_callback( GtkWidget *widget, wxDialog *win )
else else
gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1); gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1);
/* set size hints */
gint flag = GDK_HINT_POS;
if ((win->GetMinWidth() != -1) || (win->GetMinHeight() != -1)) flag |= GDK_HINT_MIN_SIZE;
if ((win->GetMaxWidth() != -1) || (win->GetMaxHeight() != -1)) flag |= GDK_HINT_MAX_SIZE;
if (flag)
{
gdk_window_set_hints( win->m_widget->window,
win->m_x, win->m_y,
win->GetMinWidth(), win->GetMinHeight(),
win->GetMaxWidth(), win->GetMaxHeight(),
flag );
}
/* reset the icon */
if (win->m_icon != wxNullIcon)
{
wxIcon icon( win->m_icon );
win->m_icon = wxNullIcon;
win->SetIcon( icon );
}
return FALSE; return FALSE;
} }
@ -304,11 +286,6 @@ bool wxDialog::Create( wxWindow *parent,
gtk_signal_connect( GTK_OBJECT(m_widget), "realize", gtk_signal_connect( GTK_OBJECT(m_widget), "realize",
GTK_SIGNAL_FUNC(gtk_dialog_realized_callback), (gpointer) this ); GTK_SIGNAL_FUNC(gtk_dialog_realized_callback), (gpointer) this );
/* we set the position of the window after the map event. setting it
before has no effect (with KWM) */
gtk_signal_connect( GTK_OBJECT(m_widget), "map",
GTK_SIGNAL_FUNC(gtk_dialog_map_callback), (gpointer) this );
/* the user resized the frame by dragging etc. */ /* the user resized the frame by dragging etc. */
gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate", gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
GTK_SIGNAL_FUNC(gtk_dialog_size_callback), (gpointer)this ); GTK_SIGNAL_FUNC(gtk_dialog_size_callback), (gpointer)this );