Added wxPopupWindow to GTK port, wxComboBox had to

be adapted a little but basically works not under
  GTK/Univ.
  I am pretty sure I forgot some file...


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10887 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2001-07-07 21:42:30 +00:00
parent 776a33cfd3
commit 9f41d60156
14 changed files with 1450 additions and 588 deletions

1299
configure vendored

File diff suppressed because it is too large Load Diff

View File

@@ -750,6 +750,7 @@ if test $DEBUG_CONFIGURE = 1; then
DEFAULT_wxUSE_TOOLBAR_NATIVE=no DEFAULT_wxUSE_TOOLBAR_NATIVE=no
DEFAULT_wxUSE_TOOLBAR_SIMPLE=no DEFAULT_wxUSE_TOOLBAR_SIMPLE=no
DEFAULT_wxUSE_TREECTRL=no DEFAULT_wxUSE_TREECTRL=no
DEFAULT_wxUSE_POPUPWIN=no
DEFAULT_wxUSE_UNICODE=no DEFAULT_wxUSE_UNICODE=no
DEFAULT_wxUSE_WCSRTOMBS=no DEFAULT_wxUSE_WCSRTOMBS=no
@@ -902,6 +903,7 @@ else
DEFAULT_wxUSE_TOOLBAR_NATIVE=yes DEFAULT_wxUSE_TOOLBAR_NATIVE=yes
DEFAULT_wxUSE_TOOLBAR_SIMPLE=yes DEFAULT_wxUSE_TOOLBAR_SIMPLE=yes
DEFAULT_wxUSE_TREECTRL=yes DEFAULT_wxUSE_TREECTRL=yes
DEFAULT_wxUSE_POPUPWIN=yes
DEFAULT_wxUSE_UNICODE=no DEFAULT_wxUSE_UNICODE=no
DEFAULT_wxUSE_WCSRTOMBS=no DEFAULT_wxUSE_WCSRTOMBS=no
@@ -1144,6 +1146,7 @@ if test "$wxUSE_CONTROLS" = "yes"; then
DEFAULT_wxUSE_TOOLBAR_SIMPLE=yes DEFAULT_wxUSE_TOOLBAR_SIMPLE=yes
DEFAULT_wxUSE_TOOLTIPS=yes DEFAULT_wxUSE_TOOLTIPS=yes
DEFAULT_wxUSE_TREECTRL=yes DEFAULT_wxUSE_TREECTRL=yes
DEFAULT_wxUSE_POPUPWIN=yes
elif test "$wxUSE_CONTROLS" = "no"; then elif test "$wxUSE_CONTROLS" = "no"; then
DEFAULT_wxUSE_ACCEL=no DEFAULT_wxUSE_ACCEL=no
DEFAULT_wxUSE_BMPBUTTON=no DEFAULT_wxUSE_BMPBUTTON=no
@@ -1180,6 +1183,7 @@ elif test "$wxUSE_CONTROLS" = "no"; then
DEFAULT_wxUSE_TOOLBAR_SIMPLE=no DEFAULT_wxUSE_TOOLBAR_SIMPLE=no
DEFAULT_wxUSE_TOOLTIPS=no DEFAULT_wxUSE_TOOLTIPS=no
DEFAULT_wxUSE_TREECTRL=no DEFAULT_wxUSE_TREECTRL=no
DEFAULT_wxUSE_POPUPWIN=no
fi fi
WX_ARG_ENABLE(accel, [ --enable-accel use accelerators], wxUSE_ACCEL) WX_ARG_ENABLE(accel, [ --enable-accel use accelerators], wxUSE_ACCEL)
@@ -1218,6 +1222,7 @@ WX_ARG_ENABLE(toolbar, [ --enable-toolbar use wxToolBar class], wxUS
WX_ARG_ENABLE(tbarnative, [ --enable-tbarnative use native wxToolBar class], wxUSE_TOOLBAR_NATIVE) WX_ARG_ENABLE(tbarnative, [ --enable-tbarnative use native wxToolBar class], wxUSE_TOOLBAR_NATIVE)
WX_ARG_ENABLE(tbarsmpl, [ --enable-tbarsmpl use wxToolBarSimple class], wxUSE_TOOLBAR_SIMPLE) WX_ARG_ENABLE(tbarsmpl, [ --enable-tbarsmpl use wxToolBarSimple class], wxUSE_TOOLBAR_SIMPLE)
WX_ARG_ENABLE(treectrl, [ --enable-treectrl use wxTreeCtrl class], wxUSE_TREECTRL) WX_ARG_ENABLE(treectrl, [ --enable-treectrl use wxTreeCtrl class], wxUSE_TREECTRL)
WX_ARG_ENABLE(popupwin, [ --enable-popupwin use wxPopUpWindow class], wxUSE_POPUPWIN)
dnl --------------------------------------------------------------------------- dnl ---------------------------------------------------------------------------
dnl common dialogs dnl common dialogs
@@ -4203,6 +4208,11 @@ if test "$wxUSE_TREECTRL" = "yes"; then
fi fi
fi fi
if test "$wxUSE_POPUPWIN" = "yes"; then
AC_DEFINE(wxUSE_POPUPWIN)
USES_CONTROLS=1
fi
if test "$USES_CONTROLS" = 1; then if test "$USES_CONTROLS" = 1; then
AC_DEFINE(wxUSE_CONTROLS) AC_DEFINE(wxUSE_CONTROLS)
fi fi

View File

@@ -379,7 +379,7 @@ checklst.cpp GTK
choice.cpp GTK LowLevel choice.cpp GTK LowLevel
clipbrd.cpp GTK LowLevel clipbrd.cpp GTK LowLevel
colour.cpp GTK LowLevel colour.cpp GTK LowLevel
combobox.cpp GTK combobox.cpp GTK LowLevel
control.cpp GTK control.cpp GTK
cursor.cpp GTK LowLevel cursor.cpp GTK LowLevel
data.cpp GTK LowLevel data.cpp GTK LowLevel
@@ -404,6 +404,7 @@ menu.cpp GTK
minifram.cpp GTK minifram.cpp GTK
notebook.cpp GTK notebook.cpp GTK
pen.cpp GTK LowLevel pen.cpp GTK LowLevel
popupwin.cpp GTK LowLevel
radiobox.cpp GTK radiobox.cpp GTK
radiobut.cpp GTK radiobut.cpp GTK
region.cpp GTK LowLevel region.cpp GTK LowLevel
@@ -724,6 +725,7 @@ palette.h WXH
panel.h WXH panel.h WXH
paper.h WXH paper.h WXH
pen.h WXH pen.h WXH
popupwin.h WXH
print.h WXH print.h WXH
printdlg.h WXH printdlg.h WXH
prntbase.h WXH prntbase.h WXH
@@ -843,6 +845,7 @@ menuitem.h GTKH
minifram.h GTKH minifram.h GTKH
notebook.h GTKH notebook.h GTKH
pen.h GTKH pen.h GTKH
popupwin.h GTKH
radiobox.h GTKH radiobox.h GTKH
radiobut.h GTKH radiobut.h GTKH
region.h GTKH region.h GTKH

56
include/wx/gtk/popupwin.h Normal file
View File

@@ -0,0 +1,56 @@
/////////////////////////////////////////////////////////////////////////////
// Name: popupwin.h
// Purpose:
// Author: Robert Roebling
// Created:
// Id: $Id$
// Copyright: (c) 1998 Robert Roebling
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef __GTKPOPUPWINH__
#define __GTKPOPUPWINH__
#ifdef __GNUG__
#pragma interface
#endif
#include "wx/defs.h"
#include "wx/panel.h"
#include "wx/icon.h"
//-----------------------------------------------------------------------------
// wxPopUpWindow
//-----------------------------------------------------------------------------
class wxPopupWindow: public wxPopupWindowBase
{
public:
wxPopupWindow() { }
wxPopupWindow(wxWindow *parent) { (void)Create(parent); }
bool Create(wxWindow *parent, int flags = wxBORDER_NONE);
virtual bool Show( bool show = TRUE );
// implementation
// --------------
virtual void DoMoveWindow(int x, int y, int width, int height);
virtual void OnInternalIdle();
protected:
void GtkOnSize( int x, int y, int width, int height );
virtual void DoSetSize(int x, int y,
int width, int height,
int sizeFlags = wxSIZE_AUTO);
private:
DECLARE_EVENT_TABLE()
DECLARE_DYNAMIC_CLASS(wxPopupWindow)
};
#endif // __GTKPOPUPWINDOWH__

View File

@@ -0,0 +1,56 @@
/////////////////////////////////////////////////////////////////////////////
// Name: popupwin.h
// Purpose:
// Author: Robert Roebling
// Created:
// Id: $Id$
// Copyright: (c) 1998 Robert Roebling
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef __GTKPOPUPWINH__
#define __GTKPOPUPWINH__
#ifdef __GNUG__
#pragma interface
#endif
#include "wx/defs.h"
#include "wx/panel.h"
#include "wx/icon.h"
//-----------------------------------------------------------------------------
// wxPopUpWindow
//-----------------------------------------------------------------------------
class wxPopupWindow: public wxPopupWindowBase
{
public:
wxPopupWindow() { }
wxPopupWindow(wxWindow *parent) { (void)Create(parent); }
bool Create(wxWindow *parent, int flags = wxBORDER_NONE);
virtual bool Show( bool show = TRUE );
// implementation
// --------------
virtual void DoMoveWindow(int x, int y, int width, int height);
virtual void OnInternalIdle();
protected:
void GtkOnSize( int x, int y, int width, int height );
virtual void DoSetSize(int x, int y,
int width, int height,
int sizeFlags = wxSIZE_AUTO);
private:
DECLARE_EVENT_TABLE()
DECLARE_DYNAMIC_CLASS(wxPopupWindow)
};
#endif // __GTKPOPUPWINDOWH__

View File

@@ -50,6 +50,8 @@ public:
// include the real class declaration // include the real class declaration
#ifdef __WXMSW__ #ifdef __WXMSW__
#include "wx/msw/popupwin.h" #include "wx/msw/popupwin.h"
#elif __WXGTK__
#include "wx/gtk/popupwin.h"
#else #else
#error "wxPopupWindow is not supported under this platform." #error "wxPopupWindow is not supported under this platform."
#endif #endif

View File

@@ -271,6 +271,8 @@ public:
virtual int GetSelection() const; virtual int GetSelection() const;
void SetSelection(int n) { Select(n); } void SetSelection(int n) { Select(n); }
void SetStringSelection(const wxString& s) { }
protected: protected:
virtual int DoAppend(const wxString& item); virtual int DoAppend(const wxString& item);
virtual void DoSetItemClientData(int n, void* clientData); virtual void DoSetItemClientData(int n, void* clientData);

6
samples/configure vendored
View File

@@ -692,6 +692,7 @@ trap 'rm -fr `echo "
sashtest/Makefile sashtest/Makefile
scroll/Makefile scroll/Makefile
scrollsub/Makefile scrollsub/Makefile
sockets/Makefile
splitter/Makefile splitter/Makefile
statbar/Makefile statbar/Makefile
text/Makefile text/Makefile
@@ -701,7 +702,7 @@ trap 'rm -fr `echo "
treelay/Makefile treelay/Makefile
typetest/Makefile typetest/Makefile
validate/Makefile validate/Makefile
sockets/Makefile widgets/Makefile
wizard/Makefile wizard/Makefile
html/Makefile html/Makefile
html/about/Makefile html/about/Makefile
@@ -838,6 +839,7 @@ CONFIG_FILES=\${CONFIG_FILES-"Makefile
sashtest/Makefile sashtest/Makefile
scroll/Makefile scroll/Makefile
scrollsub/Makefile scrollsub/Makefile
sockets/Makefile
splitter/Makefile splitter/Makefile
statbar/Makefile statbar/Makefile
text/Makefile text/Makefile
@@ -847,7 +849,7 @@ CONFIG_FILES=\${CONFIG_FILES-"Makefile
treelay/Makefile treelay/Makefile
typetest/Makefile typetest/Makefile
validate/Makefile validate/Makefile
sockets/Makefile widgets/Makefile
wizard/Makefile wizard/Makefile
html/Makefile html/Makefile
html/about/Makefile html/about/Makefile

View File

@@ -196,6 +196,7 @@ ALL_SOURCES = \
gtk/minifram.cpp \ gtk/minifram.cpp \
gtk/notebook.cpp \ gtk/notebook.cpp \
gtk/pen.cpp \ gtk/pen.cpp \
gtk/popupwin.cpp \
gtk/radiobox.cpp \ gtk/radiobox.cpp \
gtk/radiobut.cpp \ gtk/radiobut.cpp \
gtk/region.cpp \ gtk/region.cpp \
@@ -1062,6 +1063,7 @@ GUI_LOWLEVEL_OBJS = \
icon.o \ icon.o \
main.o \ main.o \
pen.o \ pen.o \
popupwin.o \
region.o \ region.o \
settings.o \ settings.o \
timer.o \ timer.o \

334
src/gtk/popupwin.cpp Normal file
View File

@@ -0,0 +1,334 @@
/////////////////////////////////////////////////////////////////////////////
// Name: popupwin.cpp
// Purpose:
// Author: Robert Roebling
// Id: $Id$
// Copyright: (c) 1998 Robert Roebling
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "popupwin.h"
#endif
#include "wx/popupwin.h"
#include "wx/frame.h"
#include "wx/app.h"
#include "wx/cursor.h"
#include <gdk/gdk.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include "wx/gtk/win_gtk.h"
//-----------------------------------------------------------------------------
// idle system
//-----------------------------------------------------------------------------
extern void wxapp_install_idle_handler();
extern bool g_isIdle;
//-----------------------------------------------------------------------------
// "focus" from m_window
//-----------------------------------------------------------------------------
static gint gtk_dialog_focus_callback( GtkWidget *widget, GtkDirectionType WXUNUSED(d), wxWindow *WXUNUSED(win) )
{
if (g_isIdle)
wxapp_install_idle_handler();
// This disables GTK's tab traversal
gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus" );
return TRUE;
}
//-----------------------------------------------------------------------------
// "delete_event"
//-----------------------------------------------------------------------------
bool gtk_dialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxPopupWindow *win )
{
if (g_isIdle)
wxapp_install_idle_handler();
if (win->IsEnabled())
win->Close();
return TRUE;
}
//-----------------------------------------------------------------------------
// "size_allocate"
//-----------------------------------------------------------------------------
static void gtk_dialog_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxPopupWindow *win )
{
if (g_isIdle)
wxapp_install_idle_handler();
if (!win->m_hasVMT) return;
if ((win->m_width != alloc->width) || (win->m_height != alloc->height))
{
win->m_width = alloc->width;
win->m_height = alloc->height;
win->GtkUpdateSize();
}
}
//-----------------------------------------------------------------------------
// "realize" from m_widget
//-----------------------------------------------------------------------------
/* we cannot MWM hints and icons before the widget has been realized,
so we do this directly after realization */
static gint
gtk_dialog_realized_callback( GtkWidget * WXUNUSED(widget), wxPopupWindow *win )
{
if (g_isIdle)
wxapp_install_idle_handler();
/* all this is for Motif Window Manager "hints" and is supposed to be
recognized by other WM as well. not tested. */
long decor = (long) GDK_DECOR_BORDER;
long func = (long) GDK_FUNC_MOVE ;
gdk_window_set_decorations( win->m_widget->window, (GdkWMDecoration)decor);
gdk_window_set_functions( win->m_widget->window, (GdkWMFunction)func);
/* GTK's shrinking/growing policy */
if ((win->GetWindowStyle() & wxRESIZE_BORDER) == 0)
gtk_window_set_policy(GTK_WINDOW(win->m_widget), 0, 0, 1);
else
gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1);
return FALSE;
}
//-----------------------------------------------------------------------------
// InsertChild for wxPopupWindow
//-----------------------------------------------------------------------------
/* Callback for wxFrame. This very strange beast has to be used because
* C++ has no virtual methods in a constructor. We have to emulate a
* virtual function here as wxWindows requires different ways to insert
* a child in container classes. */
static void wxInsertChildInDialog( wxPopupWindow* parent, wxWindow* child )
{
gtk_pizza_put( GTK_PIZZA(parent->m_wxwindow),
GTK_WIDGET(child->m_widget),
child->m_x,
child->m_y,
child->m_width,
child->m_height );
if (parent->HasFlag(wxTAB_TRAVERSAL))
{
/* we now allow a window to get the focus as long as it
doesn't have any children. */
GTK_WIDGET_UNSET_FLAGS( parent->m_wxwindow, GTK_CAN_FOCUS );
}
}
//-----------------------------------------------------------------------------
// wxPopupWindow
//-----------------------------------------------------------------------------
BEGIN_EVENT_TABLE(wxPopupWindow,wxPopupWindowBase)
EVT_SIZE (wxPopupWindow::OnSize)
END_EVENT_TABLE()
IMPLEMENT_DYNAMIC_CLASS(wxPopupWindow,wxPopupWindowBase)
bool wxPopupWindow::Create( wxWindow *parent, int style )
{
m_needParent = FALSE;
if (!PreCreation( parent, wxDefaultPosition, wxDefaultSize ) ||
!CreateBase( parent, -1, wxDefaultPosition, wxDefaultSize, style, wxDefaultValidator, "popup" ))
{
wxFAIL_MSG( wxT("wxPopupWindow creation failed") );
return FALSE;
}
// All dialogs should really have this style
m_windowStyle |= wxTAB_TRAVERSAL;
m_insertCallback = (wxInsertChildFunction) wxInsertChildInDialog;
m_widget = gtk_window_new( GTK_WINDOW_POPUP );
if ((m_parent) && (GTK_IS_WINDOW(m_parent->m_widget)))
gtk_window_set_transient_for( GTK_WINDOW(m_widget), GTK_WINDOW(m_parent->m_widget) );
GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event",
GTK_SIGNAL_FUNC(gtk_dialog_delete_callback), (gpointer)this );
m_wxwindow = gtk_pizza_new();
gtk_widget_show( m_wxwindow );
GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow );
if (m_parent) m_parent->AddChild( this );
PostCreation();
/* we cannot set MWM hints before the widget has
been realized, so we do this directly after realization */
gtk_signal_connect( GTK_OBJECT(m_widget), "realize",
GTK_SIGNAL_FUNC(gtk_dialog_realized_callback), (gpointer) this );
/* the user resized the frame by dragging etc. */
gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
GTK_SIGNAL_FUNC(gtk_dialog_size_callback), (gpointer)this );
/* disable native tab traversal */
gtk_signal_connect( GTK_OBJECT(m_widget), "focus",
GTK_SIGNAL_FUNC(gtk_dialog_focus_callback), (gpointer)this );
return TRUE;
}
void wxPopupWindow::DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y), int WXUNUSED(width), int WXUNUSED(height) )
{
wxFAIL_MSG( wxT("DoMoveWindow called for wxPopupWindow") );
}
void wxPopupWindow::DoSetSize( int x, int y, int width, int height, int sizeFlags )
{
wxASSERT_MSG( (m_widget != NULL), wxT("invalid dialog") );
wxASSERT_MSG( (m_wxwindow != NULL), wxT("invalid dialog") );
if (m_resizing) return; /* I don't like recursions */
m_resizing = TRUE;
int old_x = m_x;
int old_y = m_y;
int old_width = m_width;
int old_height = m_height;
if ((sizeFlags & wxSIZE_ALLOW_MINUS_ONE) == 0)
{
if (x != -1) m_x = x;
if (y != -1) m_y = y;
if (width != -1) m_width = width;
if (height != -1) m_height = height;
}
else
{
m_x = x;
m_y = y;
m_width = width;
m_height = height;
}
/*
if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH)
{
if (width == -1) m_width = 80;
}
if ((sizeFlags & wxSIZE_AUTO_HEIGHT) == wxSIZE_AUTO_HEIGHT)
{
if (height == -1) m_height = 26;
}
*/
if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth;
if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight;
if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth;
if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight;
if ((m_x != -1) || (m_y != -1))
{
if ((m_x != old_x) || (m_y != old_y))
{
/* we set the position here and when showing the dialog
for the first time in idle time */
gtk_widget_set_uposition( m_widget, m_x, m_y );
}
}
if ((m_width != old_width) || (m_height != old_height))
{
gtk_widget_set_usize( m_widget, m_width, m_height );
/* actual resizing is deferred to GtkOnSize in idle time and
when showing the dialog */
m_sizeSet = FALSE;
}
m_resizing = FALSE;
}
void wxPopupWindow::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height )
{
// due to a bug in gtk, x,y are always 0
// m_x = x;
// m_y = y;
if ((m_height == height) && (m_width == width) && (m_sizeSet)) return;
if (!m_wxwindow) return;
m_width = width;
m_height = height;
if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth;
if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight;
if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth;
if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight;
/* set size hints */
gint flag = 0; // GDK_HINT_POS;
if ((m_minWidth != -1) || (m_minHeight != -1)) flag |= GDK_HINT_MIN_SIZE;
if ((m_maxWidth != -1) || (m_maxHeight != -1)) flag |= GDK_HINT_MAX_SIZE;
GdkGeometry geom;
geom.min_width = m_minWidth;
geom.min_height = m_minHeight;
geom.max_width = m_maxWidth;
geom.max_height = m_maxHeight;
gtk_window_set_geometry_hints( GTK_WINDOW(m_widget),
(GtkWidget*) NULL,
&geom,
(GdkWindowHints) flag );
m_sizeSet = TRUE;
wxSizeEvent event( wxSize(m_width,m_height), GetId() );
event.SetEventObject( this );
GetEventHandler()->ProcessEvent( event );
}
void wxPopupWindow::OnInternalIdle()
{
if (!m_sizeSet && GTK_WIDGET_REALIZED(m_wxwindow))
GtkOnSize( m_x, m_y, m_width, m_height );
wxWindow::OnInternalIdle();
}
bool wxPopupWindow::Show( bool show )
{
if (show && !m_sizeSet)
{
/* by calling GtkOnSize here, we don't have to call
either after showing the frame, which would entail
much ugly flicker nor from within the size_allocate
handler, because GTK 1.1.X forbids that. */
GtkOnSize( m_x, m_y, m_width, m_height );
}
bool ret = wxWindow::Show( show );
return ret;
}

View File

@@ -196,6 +196,7 @@ ALL_SOURCES = \
gtk/minifram.cpp \ gtk/minifram.cpp \
gtk/notebook.cpp \ gtk/notebook.cpp \
gtk/pen.cpp \ gtk/pen.cpp \
gtk/popupwin.cpp \
gtk/radiobox.cpp \ gtk/radiobox.cpp \
gtk/radiobut.cpp \ gtk/radiobut.cpp \
gtk/region.cpp \ gtk/region.cpp \
@@ -1062,6 +1063,7 @@ GUI_LOWLEVEL_OBJS = \
icon.o \ icon.o \
main.o \ main.o \
pen.o \ pen.o \
popupwin.o \
region.o \ region.o \
settings.o \ settings.o \
timer.o \ timer.o \

334
src/gtk1/popupwin.cpp Normal file
View File

@@ -0,0 +1,334 @@
/////////////////////////////////////////////////////////////////////////////
// Name: popupwin.cpp
// Purpose:
// Author: Robert Roebling
// Id: $Id$
// Copyright: (c) 1998 Robert Roebling
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "popupwin.h"
#endif
#include "wx/popupwin.h"
#include "wx/frame.h"
#include "wx/app.h"
#include "wx/cursor.h"
#include <gdk/gdk.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include "wx/gtk/win_gtk.h"
//-----------------------------------------------------------------------------
// idle system
//-----------------------------------------------------------------------------
extern void wxapp_install_idle_handler();
extern bool g_isIdle;
//-----------------------------------------------------------------------------
// "focus" from m_window
//-----------------------------------------------------------------------------
static gint gtk_dialog_focus_callback( GtkWidget *widget, GtkDirectionType WXUNUSED(d), wxWindow *WXUNUSED(win) )
{
if (g_isIdle)
wxapp_install_idle_handler();
// This disables GTK's tab traversal
gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus" );
return TRUE;
}
//-----------------------------------------------------------------------------
// "delete_event"
//-----------------------------------------------------------------------------
bool gtk_dialog_delete_callback( GtkWidget *WXUNUSED(widget), GdkEvent *WXUNUSED(event), wxPopupWindow *win )
{
if (g_isIdle)
wxapp_install_idle_handler();
if (win->IsEnabled())
win->Close();
return TRUE;
}
//-----------------------------------------------------------------------------
// "size_allocate"
//-----------------------------------------------------------------------------
static void gtk_dialog_size_callback( GtkWidget *WXUNUSED(widget), GtkAllocation* alloc, wxPopupWindow *win )
{
if (g_isIdle)
wxapp_install_idle_handler();
if (!win->m_hasVMT) return;
if ((win->m_width != alloc->width) || (win->m_height != alloc->height))
{
win->m_width = alloc->width;
win->m_height = alloc->height;
win->GtkUpdateSize();
}
}
//-----------------------------------------------------------------------------
// "realize" from m_widget
//-----------------------------------------------------------------------------
/* we cannot MWM hints and icons before the widget has been realized,
so we do this directly after realization */
static gint
gtk_dialog_realized_callback( GtkWidget * WXUNUSED(widget), wxPopupWindow *win )
{
if (g_isIdle)
wxapp_install_idle_handler();
/* all this is for Motif Window Manager "hints" and is supposed to be
recognized by other WM as well. not tested. */
long decor = (long) GDK_DECOR_BORDER;
long func = (long) GDK_FUNC_MOVE ;
gdk_window_set_decorations( win->m_widget->window, (GdkWMDecoration)decor);
gdk_window_set_functions( win->m_widget->window, (GdkWMFunction)func);
/* GTK's shrinking/growing policy */
if ((win->GetWindowStyle() & wxRESIZE_BORDER) == 0)
gtk_window_set_policy(GTK_WINDOW(win->m_widget), 0, 0, 1);
else
gtk_window_set_policy(GTK_WINDOW(win->m_widget), 1, 1, 1);
return FALSE;
}
//-----------------------------------------------------------------------------
// InsertChild for wxPopupWindow
//-----------------------------------------------------------------------------
/* Callback for wxFrame. This very strange beast has to be used because
* C++ has no virtual methods in a constructor. We have to emulate a
* virtual function here as wxWindows requires different ways to insert
* a child in container classes. */
static void wxInsertChildInDialog( wxPopupWindow* parent, wxWindow* child )
{
gtk_pizza_put( GTK_PIZZA(parent->m_wxwindow),
GTK_WIDGET(child->m_widget),
child->m_x,
child->m_y,
child->m_width,
child->m_height );
if (parent->HasFlag(wxTAB_TRAVERSAL))
{
/* we now allow a window to get the focus as long as it
doesn't have any children. */
GTK_WIDGET_UNSET_FLAGS( parent->m_wxwindow, GTK_CAN_FOCUS );
}
}
//-----------------------------------------------------------------------------
// wxPopupWindow
//-----------------------------------------------------------------------------
BEGIN_EVENT_TABLE(wxPopupWindow,wxPopupWindowBase)
EVT_SIZE (wxPopupWindow::OnSize)
END_EVENT_TABLE()
IMPLEMENT_DYNAMIC_CLASS(wxPopupWindow,wxPopupWindowBase)
bool wxPopupWindow::Create( wxWindow *parent, int style )
{
m_needParent = FALSE;
if (!PreCreation( parent, wxDefaultPosition, wxDefaultSize ) ||
!CreateBase( parent, -1, wxDefaultPosition, wxDefaultSize, style, wxDefaultValidator, "popup" ))
{
wxFAIL_MSG( wxT("wxPopupWindow creation failed") );
return FALSE;
}
// All dialogs should really have this style
m_windowStyle |= wxTAB_TRAVERSAL;
m_insertCallback = (wxInsertChildFunction) wxInsertChildInDialog;
m_widget = gtk_window_new( GTK_WINDOW_POPUP );
if ((m_parent) && (GTK_IS_WINDOW(m_parent->m_widget)))
gtk_window_set_transient_for( GTK_WINDOW(m_widget), GTK_WINDOW(m_parent->m_widget) );
GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
gtk_signal_connect( GTK_OBJECT(m_widget), "delete_event",
GTK_SIGNAL_FUNC(gtk_dialog_delete_callback), (gpointer)this );
m_wxwindow = gtk_pizza_new();
gtk_widget_show( m_wxwindow );
GTK_WIDGET_UNSET_FLAGS( m_wxwindow, GTK_CAN_FOCUS );
gtk_container_add( GTK_CONTAINER(m_widget), m_wxwindow );
if (m_parent) m_parent->AddChild( this );
PostCreation();
/* we cannot set MWM hints before the widget has
been realized, so we do this directly after realization */
gtk_signal_connect( GTK_OBJECT(m_widget), "realize",
GTK_SIGNAL_FUNC(gtk_dialog_realized_callback), (gpointer) this );
/* the user resized the frame by dragging etc. */
gtk_signal_connect( GTK_OBJECT(m_widget), "size_allocate",
GTK_SIGNAL_FUNC(gtk_dialog_size_callback), (gpointer)this );
/* disable native tab traversal */
gtk_signal_connect( GTK_OBJECT(m_widget), "focus",
GTK_SIGNAL_FUNC(gtk_dialog_focus_callback), (gpointer)this );
return TRUE;
}
void wxPopupWindow::DoMoveWindow(int WXUNUSED(x), int WXUNUSED(y), int WXUNUSED(width), int WXUNUSED(height) )
{
wxFAIL_MSG( wxT("DoMoveWindow called for wxPopupWindow") );
}
void wxPopupWindow::DoSetSize( int x, int y, int width, int height, int sizeFlags )
{
wxASSERT_MSG( (m_widget != NULL), wxT("invalid dialog") );
wxASSERT_MSG( (m_wxwindow != NULL), wxT("invalid dialog") );
if (m_resizing) return; /* I don't like recursions */
m_resizing = TRUE;
int old_x = m_x;
int old_y = m_y;
int old_width = m_width;
int old_height = m_height;
if ((sizeFlags & wxSIZE_ALLOW_MINUS_ONE) == 0)
{
if (x != -1) m_x = x;
if (y != -1) m_y = y;
if (width != -1) m_width = width;
if (height != -1) m_height = height;
}
else
{
m_x = x;
m_y = y;
m_width = width;
m_height = height;
}
/*
if ((sizeFlags & wxSIZE_AUTO_WIDTH) == wxSIZE_AUTO_WIDTH)
{
if (width == -1) m_width = 80;
}
if ((sizeFlags & wxSIZE_AUTO_HEIGHT) == wxSIZE_AUTO_HEIGHT)
{
if (height == -1) m_height = 26;
}
*/
if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth;
if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight;
if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth;
if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight;
if ((m_x != -1) || (m_y != -1))
{
if ((m_x != old_x) || (m_y != old_y))
{
/* we set the position here and when showing the dialog
for the first time in idle time */
gtk_widget_set_uposition( m_widget, m_x, m_y );
}
}
if ((m_width != old_width) || (m_height != old_height))
{
gtk_widget_set_usize( m_widget, m_width, m_height );
/* actual resizing is deferred to GtkOnSize in idle time and
when showing the dialog */
m_sizeSet = FALSE;
}
m_resizing = FALSE;
}
void wxPopupWindow::GtkOnSize( int WXUNUSED(x), int WXUNUSED(y), int width, int height )
{
// due to a bug in gtk, x,y are always 0
// m_x = x;
// m_y = y;
if ((m_height == height) && (m_width == width) && (m_sizeSet)) return;
if (!m_wxwindow) return;
m_width = width;
m_height = height;
if ((m_minWidth != -1) && (m_width < m_minWidth)) m_width = m_minWidth;
if ((m_minHeight != -1) && (m_height < m_minHeight)) m_height = m_minHeight;
if ((m_maxWidth != -1) && (m_width > m_maxWidth)) m_width = m_maxWidth;
if ((m_maxHeight != -1) && (m_height > m_maxHeight)) m_height = m_maxHeight;
/* set size hints */
gint flag = 0; // GDK_HINT_POS;
if ((m_minWidth != -1) || (m_minHeight != -1)) flag |= GDK_HINT_MIN_SIZE;
if ((m_maxWidth != -1) || (m_maxHeight != -1)) flag |= GDK_HINT_MAX_SIZE;
GdkGeometry geom;
geom.min_width = m_minWidth;
geom.min_height = m_minHeight;
geom.max_width = m_maxWidth;
geom.max_height = m_maxHeight;
gtk_window_set_geometry_hints( GTK_WINDOW(m_widget),
(GtkWidget*) NULL,
&geom,
(GdkWindowHints) flag );
m_sizeSet = TRUE;
wxSizeEvent event( wxSize(m_width,m_height), GetId() );
event.SetEventObject( this );
GetEventHandler()->ProcessEvent( event );
}
void wxPopupWindow::OnInternalIdle()
{
if (!m_sizeSet && GTK_WIDGET_REALIZED(m_wxwindow))
GtkOnSize( m_x, m_y, m_width, m_height );
wxWindow::OnInternalIdle();
}
bool wxPopupWindow::Show( bool show )
{
if (show && !m_sizeSet)
{
/* by calling GtkOnSize here, we don't have to call
either after showing the frame, which would entail
much ugly flicker nor from within the size_allocate
handler, because GTK 1.1.X forbids that. */
GtkOnSize( m_x, m_y, m_width, m_height );
}
bool ret = wxWindow::Show( show );
return ret;
}

View File

@@ -201,6 +201,8 @@ void wxComboControl::Init()
m_popup = (wxComboPopup *)NULL; m_popup = (wxComboPopup *)NULL;
m_winPopup = (wxPopupComboWindow *)NULL; m_winPopup = (wxPopupComboWindow *)NULL;
m_isPopupShown = FALSE; m_isPopupShown = FALSE;
m_btn = NULL;
m_text = NULL;
} }
bool wxComboControl::Create(wxWindow *parent, bool wxComboControl::Create(wxWindow *parent,
@@ -326,7 +328,10 @@ bool wxComboControl::Show(bool show)
if ( !wxControl::Show(show) ) if ( !wxControl::Show(show) )
return FALSE; return FALSE;
if (m_btn)
m_btn->Show(show); m_btn->Show(show);
if (m_text)
m_text->Show(show); m_text->Show(show);
return TRUE; return TRUE;

View File

@@ -7,6 +7,7 @@ UNIVOBJS = \
checklst.o \ checklst.o \
colschem.o \ colschem.o \
control.o \ control.o \
combobox.o \
framuniv.o \ framuniv.o \
gauge.o \ gauge.o \
gtk.o \ gtk.o \