Rewrite generic message box

Minor corrections to frame/resizing
  Update for wxPython


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2322 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling 1999-05-01 21:21:35 +00:00
parent 8d72073ee3
commit 15b24b148a
10 changed files with 284 additions and 178 deletions

View File

@ -35,11 +35,110 @@ working the same as described in the wxWindows documents the best
thing to do is to scan through the wxPython sources, especially the .i
files, as that is where the interfaces for wxPython are defined.
Currently this extension module is designed such that the entire
application will be written in Python. I havn't tried it yet, but I
am sure that attempting to embed wxPython in a C++ wxWindows
application will cause problems. However there is a plan to support
this in the future.
I have reports of successfully embedding wxPython within a wxWindows
C++ app on GTK. It hasn't yet been attempted on MSW (to my knowledge)
so I don't know how successful such an attempt would be. However it
is certainly possible.
Getting Help
------------
Since wxPython is a blending of multiple technologies, help comes from
multiple sources. See the http://alldunn.com/wxPython for details on
various sources of help, but probably the best source is the
wxPython-users mail list. You can view the archive or subscribe by
going to
http://starship.python.net/mailman/listinfo/wxpython-users
Or you can send mail directly to the list using this address:
wxpython-users@starship.python.net
What's new in 2.0b9
-------------------
Bug fix for ListCtrl in test4.py (Was a missing file... DSM!)
Bug fix for occassional GPF on Win32 systems upon termination of a
wxPython application.
Added wxListBox.GetSelections returning selections as a Tuple.
Added a wxTreeItemData that is able to hold any Python object and be
associated with items in a wxTreeCtrl. Added test pytree.py to show
this feature off.
Added wxSafeYield function.
OpenGL Canvas can be optionally compiled in to wxPython.
Awesome new Demo Framework for showing off wxPython and for learning
how it all works.
The pre-built Win32 version is no longer distributing the wxWindows
DLL. It is statically linked with the wxWindows library instead.
Added a couple missing items from the docs.
Added wxImage, wxImageHandler, wxPNGHandler, wxJPEGHandler,
wxGIFHandler and wxBMPHandler.
Added new methods to wxTextCtrl.
What's new in 2.0b8
-------------------
Support for using Python threads in wxPython apps.
Several missing methods from various classes.
Various bug fixes.
What's new in 2.0b7
-------------------
Added DLG_PNT and DLG_SZE convienience methods to wxWindow class.
Added missing constructor and other methods for wxMenuItem.
What's new in 2.0b6
-------------------
Just a quickie update to fix the self-installer to be compatible with
Python 1.5.2b2's Registry settings.
What's new in 2.0b5
-------------------
Well obviously the numbering scheme has changed. I did this to
reflect the fact that this truly is the second major revision of
wxPython, (well the third actually if you count the one I did for
wxWindows 1.68 and then threw away...) and also that it is associated
with the 2.0 version of wxWindows.
I have finally started documenting wxPython. There are several pages
in the wxWindows documentation tree specifically about wxPython, and I
have added notes within the class references about where wxPython
diverges from wxWindows.
Added wxWindow_FromHWND(hWnd) for wxMSW to construct a wxWindow from a
window handle. If you can get the window handle into the python code,
it should just work... More news on this later.
Added wxImageList, wxToolTip.
Re-enabled wxConfig.DeleteAll() since it is reportedly fixed for the
wxRegConfig class.
As usual, some bug fixes, tweaks, etc.
What's new in 0.5.3
@ -142,11 +241,11 @@ there, make sure wxUSE_OWNER_DRAWN is also set to 1.
2. Change into the $(WXWIN)/utils/wxPython/src directory.
3. Edit makefile.nt and specify where your python installation is at.
3. Edit makefile.vc and specify where your python installation is at.
You may also want to fiddle with the TARGETDIR variable as described
above.
4. Run nmake -f makefile.nt
4. Run nmake -f makefile.vc
5. If it builds successfully, congratulations! Move on to the next
step. If not then you can try mailing me for help. Also, I will
@ -169,7 +268,7 @@ version of Python either from the command line or from a shortcut.
Unix
----
1. Change into the wxPython/src directory.
1. Change into the $(WXWIN)/utils/wxPython/src directory.
2. Edit Setup.in and ensure that the flags, directories, and toolkit
options are correct. See the above commentary about TARGETDIR. There
@ -188,18 +287,19 @@ module:
make
4b. Log in as root. [Robert Roebling]
make install
4c. Log out from root. [Robert Roebling]
5. Change to the wxPython/tests directory.
5. Change to the $(WXWIN)/utils/wxPython/tests directory.
6. Try executing the test programs. For example:
python test1.py
------------------------
10/20/1998

View File

@ -11,7 +11,7 @@ CCC=g++
WXWIN=~/wxWindows
GENCODEDIR=gtk
srcdir=$(GENCODEDIR)
WX_CONFIG_CFLAGS=`wx-config --cflags`
WX_CONFIG_CFLAGS=`wx-config --cflags` `gtk-config --cflags`
WX_CONFIG_LIBS=`wx-config --libs`
# Depending on how your Python was built, you may have to set this

View File

@ -27,15 +27,19 @@ WXDLLEXPORT_DATA(extern const wxChar*) wxMessageBoxCaptionStr;
class WXDLLEXPORT wxGenericMessageDialog: public wxDialog
{
DECLARE_DYNAMIC_CLASS(wxGenericMessageDialog)
protected:
long m_dialogStyle;
public:
wxGenericMessageDialog(wxWindow *parent, const wxString& message, const wxString& caption = wxMessageBoxCaptionStr,
wxGenericMessageDialog(wxWindow *parent, const wxString& message,
const wxString& caption = wxMessageBoxCaptionStr,
long style = wxOK|wxCENTRE, const wxPoint& pos = wxDefaultPosition);
void OnYes(wxCommandEvent& event);
void OnNo(wxCommandEvent& event);
void OnCancel(wxCommandEvent& event);
private:
wxList m_buttons;
int m_dialogStyle;
DECLARE_EVENT_TABLE()
};

View File

@ -1,11 +1,11 @@
/////////////////////////////////////////////////////////////////////////////
// Name: msgdlgg.cpp
// Purpose: wxGenericMessageDialog
// Author: Julian Smart
// Author: Julian Smart, Robert Roebling
// Modified by:
// Created: 04/01/98
// RCS-ID: $Id$
// Copyright: (c) Julian Smart and Markus Holzem
// Copyright: (c) Julian Smart, Markus Holzem, Robert Roebling
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
@ -39,36 +39,40 @@
// New dialog box implementations
// Split message, using constraints to position controls
void wxSplitMessage2(const wxChar *message, wxList *messageList, wxWindow *parent, wxRowColSizer *sizer)
wxSize wxSplitMessage2( const wxString &message, wxWindow *parent )
{
wxChar *copyMessage = copystring(message);
size_t i = 0;
size_t len = wxStrlen(copyMessage);
wxChar *currentMessage = copyMessage;
// wxWindow *lastWindow = parent;
while (i < len) {
while ((i < len) && (copyMessage[i] != _T('\n'))) i++;
if (i < len) copyMessage[i] = 0;
wxStaticText *mess = new wxStaticText(parent, -1, currentMessage);
/*
wxLayoutConstraints *c = new wxLayoutConstraints;
c->left.SameAs (parent, wxLeft, 10);
c->top.SameAs (lastWindow, wxBottom, 5);
c->right.AsIs ();
c->height.AsIs ();
mess->SetConstraints(c);
*/
sizer->AddSizerChild(mess);
messageList->Append(mess);
currentMessage = copyMessage + i + 1;
}
delete[] copyMessage;
int y = 10;
int w = 50;
wxString line( _T("") );
for (uint pos = 0; pos < message.Len(); pos++)
{
if (message[pos] == _T('\n'))
{
if (!line.IsEmpty())
{
wxStaticText *s1 = new wxStaticText( parent, -1, line, wxPoint(15,y) );
wxSize size1( s1->GetSize() );
if (size1.x > w) w = size1.x;
line = _T("");
}
y += 18;
}
else
{
line += message[pos];
}
}
if (!line.IsEmpty())
{
wxStaticText *s2 = new wxStaticText( parent, -1, line, wxPoint(15,y) );
wxSize size2( s2->GetSize() );
if (size2.x > w) w = size2.x;
}
y += 18;
return wxSize(w+30,y);
}
#if !USE_SHARED_LIBRARY
@ -81,106 +85,90 @@ END_EVENT_TABLE()
IMPLEMENT_CLASS(wxGenericMessageDialog, wxDialog)
#endif
wxGenericMessageDialog::wxGenericMessageDialog(wxWindow *parent, const wxString& message, const wxString& caption,
long style, const wxPoint& pos):
wxDialog(parent, -1, caption, pos,
#ifdef __WXMOTIF_
wxSize(400, 300),
#else
wxDefaultSize,
#endif
wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL)
wxGenericMessageDialog::wxGenericMessageDialog( wxWindow *parent, const wxString& message,
const wxString& caption, long style, const wxPoint& pos) :
wxDialog( parent, -1, caption, pos, wxDefaultSize )
{
m_dialogStyle = style;
wxBeginBusyCursor();
wxSize message_size( wxSplitMessage2( message, this ) );
wxSizer *topSizer = new wxSizer(this, wxSizerShrink);
topSizer->SetBorder(10, 10);
// message sizer at the top
wxRowColSizer *messageSizer = new wxRowColSizer(topSizer, wxSIZER_COLS, 100);
messageSizer->SetName(_T("messageSizer"));
// bool centre = ((style & wxCENTRE) == wxCENTRE);
wxList messageList;
wxSplitMessage2(message, &messageList, this, messageSizer);
// spacer size in the middle
wxSpacingSizer *spacingSizer = new wxSpacingSizer(topSizer, wxBelow, messageSizer, 20);
// row size at the bottom
wxRowColSizer *buttonSizer = new wxRowColSizer(topSizer, wxSIZER_ROWS );
buttonSizer->SetName(_T("buttonSizer"));
buttonSizer->SetSpacing(12,0);
// Specify constraints for the button sizer
wxLayoutConstraints *c = new wxLayoutConstraints;
c->width.AsIs ();
c->height.AsIs ();
c->top.Below (spacingSizer);
c->left.Absolute (10);
// c->centreX.SameAs (spacingSizer, wxCentreX);
buttonSizer->SetConstraints(c);
wxButton *ok = (wxButton *) NULL;
wxButton *cancel = (wxButton *) NULL;
wxButton *yes = (wxButton *) NULL;
wxButton *no = (wxButton *) NULL;
if (style & wxYES_NO) {
yes = new wxButton(this, wxID_YES, _("Yes"), wxDefaultPosition, wxSize(75,-1) );
no = new wxButton(this, wxID_NO, _("No"), wxDefaultPosition, wxSize(75,-1) );
buttonSizer->AddSizerChild(yes);
buttonSizer->AddSizerChild(no);
int y = message_size.y + 30;
if (style & wxYES_NO)
{
yes = new wxButton( this, wxID_YES, _("Yes"), wxPoint(-1,y), wxSize(80,-1) );
m_buttons.Append( yes );
no = new wxButton( this, wxID_NO, _("No"), wxPoint(-1,y), wxSize(80,-1) );
m_buttons.Append( no );
}
if (style & wxOK) {
ok = new wxButton(this, wxID_OK, _("OK"), wxDefaultPosition, wxSize(75,-1) );
buttonSizer->AddSizerChild(ok);
if (style & wxOK)
{
ok = new wxButton( this, wxID_OK, _("OK"), wxPoint(-1,y), wxSize(80,-1) );
m_buttons.Append( ok );
}
if (style & wxCANCEL) {
cancel = new wxButton(this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize(75,-1) );
buttonSizer->AddSizerChild(cancel);
if (style & wxCANCEL)
{
cancel = new wxButton( this, wxID_CANCEL, _("Cancel"), wxPoint(-1,y), wxSize(80,-1) );
m_buttons.Append( cancel );
}
if (ok)
{
ok->SetDefault();
ok->SetFocus();
ok->SetDefault();
ok->SetFocus();
}
else if (yes)
{
yes->SetDefault();
yes->SetFocus();
yes->SetDefault();
yes->SetFocus();
}
Layout();
Centre(wxBOTH);
int w = m_buttons.GetCount() * 100;
if (message_size.x > w) w = message_size.x;
int space = w / (m_buttons.GetCount()*2);
int n = 0;
wxNode *node = m_buttons.First();
while (node)
{
wxWindow *win = (wxWindow*)node->Data();
int x = (n*2+1)*space - 40 + 15;
win->Move( x, -1 );
node = node->Next();
n++;
}
SetSize( w+30, y+40 );
wxEndBusyCursor();
Centre( wxBOTH );
}
void wxGenericMessageDialog::OnYes(wxCommandEvent& WXUNUSED(event))
{
EndModal(wxID_YES);
EndModal( wxID_YES );
}
void wxGenericMessageDialog::OnNo(wxCommandEvent& WXUNUSED(event))
{
EndModal(wxID_NO);
EndModal( wxID_NO );
}
void wxGenericMessageDialog::OnCancel(wxCommandEvent& WXUNUSED(event))
{
// Allow cancellation via ESC/Close button except if
// only YES and NO are specified.
/* Allow cancellation via ESC/Close button except if
only YES and NO are specified. */
if ( (m_dialogStyle & wxYES_NO) != wxYES_NO || (m_dialogStyle & wxCANCEL) )
EndModal(wxID_CANCEL);
{
EndModal( wxID_CANCEL );
}
}

View File

@ -109,35 +109,6 @@ gtk_dialog_realized_callback( GtkWidget *widget, wxDialog *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_ALL;
long func = (long) GDK_FUNC_ALL;
if ((win->m_windowStyle & wxCAPTION) == 0)
decor |= GDK_DECOR_TITLE;
/* if ((win->m_windowStyle & wxMINIMIZE) == 0)
func |= GDK_FUNC_MINIMIZE;
if ((win->m_windowStyle & wxMAXIMIZE) == 0)
func |= GDK_FUNC_MAXIMIZE; */
if ((win->m_windowStyle & wxSYSTEM_MENU) == 0)
decor |= GDK_DECOR_MENU;
if ((win->m_windowStyle & wxMINIMIZE_BOX) == 0)
decor |= GDK_DECOR_MINIMIZE;
if ((win->m_windowStyle & wxMAXIMIZE_BOX) == 0)
decor |= GDK_DECOR_MAXIMIZE;
if ((win->m_windowStyle & wxRESIZE_BORDER) == 0)
func |= GDK_FUNC_RESIZE;
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->m_windowStyle & 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);
/* reset the icon */
if (win->m_icon != wxNullIcon)
{
@ -156,8 +127,41 @@ gtk_dialog_realized_callback( GtkWidget *widget, wxDialog *win )
static gint
gtk_dialog_map_callback( GtkWidget *widget, wxDialog *win )
{
/* I haven''t been able to set the position of
the dialog before it is shown, so I do it here */
gtk_widget_set_uposition( widget, win->m_x, win->m_y );
/* 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_ALL;
long func = (long) GDK_FUNC_ALL;
if ((win->m_windowStyle & wxCAPTION) == 0)
decor |= GDK_DECOR_TITLE;
if ((win->m_windowStyle & wxSYSTEM_MENU) == 0)
decor |= GDK_DECOR_MENU;
if ((win->m_windowStyle & wxMINIMIZE_BOX) == 0)
{
func |= GDK_FUNC_MINIMIZE;
decor |= GDK_DECOR_MINIMIZE;
}
if ((win->m_windowStyle & wxMAXIMIZE_BOX) == 0)
{
decor |= GDK_DECOR_MAXIMIZE;
func |= GDK_FUNC_MAXIMIZE;
}
if ((win->m_windowStyle & wxRESIZE_BORDER) == 0)
func |= GDK_FUNC_RESIZE;
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->m_windowStyle & 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;
}

View File

@ -196,16 +196,18 @@ gtk_frame_realized_callback( GtkWidget *widget, wxFrame *win )
if ((win->m_windowStyle & wxCAPTION) == 0)
decor |= GDK_DECOR_TITLE;
/* if ((win->m_windowStyle & wxMINIMIZE) == 0)
func |= GDK_FUNC_MINIMIZE;
if ((win->m_windowStyle & wxMAXIMIZE) == 0)
func |= GDK_FUNC_MAXIMIZE; */
if ((win->m_windowStyle & wxSYSTEM_MENU) == 0)
decor |= GDK_DECOR_MENU;
if ((win->m_windowStyle & wxMINIMIZE_BOX) == 0)
{
func |= GDK_FUNC_MINIMIZE;
decor |= GDK_DECOR_MINIMIZE;
}
if ((win->m_windowStyle & wxMAXIMIZE_BOX) == 0)
{
func |= GDK_FUNC_MAXIMIZE;
decor |= GDK_DECOR_MAXIMIZE;
}
if ((win->m_windowStyle & wxRESIZE_BORDER) == 0)
func |= GDK_FUNC_RESIZE;

View File

@ -3532,6 +3532,7 @@ bool wxWindow::Layout()
GetSizer()->LayoutPhase1(&noChanges);
GetSizer()->LayoutPhase2(&noChanges);
GetSizer()->SetConstraintSizes(); // Recursively set the real window sizes
return TRUE;
}
else

View File

@ -109,35 +109,6 @@ gtk_dialog_realized_callback( GtkWidget *widget, wxDialog *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_ALL;
long func = (long) GDK_FUNC_ALL;
if ((win->m_windowStyle & wxCAPTION) == 0)
decor |= GDK_DECOR_TITLE;
/* if ((win->m_windowStyle & wxMINIMIZE) == 0)
func |= GDK_FUNC_MINIMIZE;
if ((win->m_windowStyle & wxMAXIMIZE) == 0)
func |= GDK_FUNC_MAXIMIZE; */
if ((win->m_windowStyle & wxSYSTEM_MENU) == 0)
decor |= GDK_DECOR_MENU;
if ((win->m_windowStyle & wxMINIMIZE_BOX) == 0)
decor |= GDK_DECOR_MINIMIZE;
if ((win->m_windowStyle & wxMAXIMIZE_BOX) == 0)
decor |= GDK_DECOR_MAXIMIZE;
if ((win->m_windowStyle & wxRESIZE_BORDER) == 0)
func |= GDK_FUNC_RESIZE;
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->m_windowStyle & 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);
/* reset the icon */
if (win->m_icon != wxNullIcon)
{
@ -156,8 +127,41 @@ gtk_dialog_realized_callback( GtkWidget *widget, wxDialog *win )
static gint
gtk_dialog_map_callback( GtkWidget *widget, wxDialog *win )
{
/* I haven''t been able to set the position of
the dialog before it is shown, so I do it here */
gtk_widget_set_uposition( widget, win->m_x, win->m_y );
/* 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_ALL;
long func = (long) GDK_FUNC_ALL;
if ((win->m_windowStyle & wxCAPTION) == 0)
decor |= GDK_DECOR_TITLE;
if ((win->m_windowStyle & wxSYSTEM_MENU) == 0)
decor |= GDK_DECOR_MENU;
if ((win->m_windowStyle & wxMINIMIZE_BOX) == 0)
{
func |= GDK_FUNC_MINIMIZE;
decor |= GDK_DECOR_MINIMIZE;
}
if ((win->m_windowStyle & wxMAXIMIZE_BOX) == 0)
{
decor |= GDK_DECOR_MAXIMIZE;
func |= GDK_FUNC_MAXIMIZE;
}
if ((win->m_windowStyle & wxRESIZE_BORDER) == 0)
func |= GDK_FUNC_RESIZE;
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->m_windowStyle & 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;
}

View File

@ -196,16 +196,18 @@ gtk_frame_realized_callback( GtkWidget *widget, wxFrame *win )
if ((win->m_windowStyle & wxCAPTION) == 0)
decor |= GDK_DECOR_TITLE;
/* if ((win->m_windowStyle & wxMINIMIZE) == 0)
func |= GDK_FUNC_MINIMIZE;
if ((win->m_windowStyle & wxMAXIMIZE) == 0)
func |= GDK_FUNC_MAXIMIZE; */
if ((win->m_windowStyle & wxSYSTEM_MENU) == 0)
decor |= GDK_DECOR_MENU;
if ((win->m_windowStyle & wxMINIMIZE_BOX) == 0)
{
func |= GDK_FUNC_MINIMIZE;
decor |= GDK_DECOR_MINIMIZE;
}
if ((win->m_windowStyle & wxMAXIMIZE_BOX) == 0)
{
func |= GDK_FUNC_MAXIMIZE;
decor |= GDK_DECOR_MAXIMIZE;
}
if ((win->m_windowStyle & wxRESIZE_BORDER) == 0)
func |= GDK_FUNC_RESIZE;

View File

@ -3532,6 +3532,7 @@ bool wxWindow::Layout()
GetSizer()->LayoutPhase1(&noChanges);
GetSizer()->LayoutPhase2(&noChanges);
GetSizer()->SetConstraintSizes(); // Recursively set the real window sizes
return TRUE;
}
else