Tried to fix wxPanel bug (windows now set the panel current focus window on deletion);

undid wxMSW wxRadioBox::SetSize changes that made it resizeable because it just doesn't
work (see notes in radiobox.cpp); fixed wxTextCtrl enter processing bug; fixed
Dialog Editor wxRadioBox-writing bug


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1641 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart 1999-02-08 00:15:40 +00:00
parent 306dfc2b3d
commit 1f916a19f1
12 changed files with 232 additions and 18 deletions

View File

@ -28,6 +28,31 @@ utils/ogl/samples/ogledit/bitmaps/*.gif
utils/ogl/samples/ogledit/bitmaps/*.xbm
utils/ogl/samples/ogledit/bitmaps/*.xpm
utils/ogl/samples/studio/*.cpp
utils/ogl/samples/studio/*.h
utils/ogl/samples/studio/*.rc
utils/ogl/samples/studio/*.def
utils/ogl/samples/studio/*.xbm
utils/ogl/samples/studio/make*.*
utils/ogl/samples/studio/Makefile
utils/ogl/samples/studio/*.txt
utils/ogl/samples/studio/*.ico
utils/ogl/samples/studio/*.bmp
utils/ogl/samples/studio/*.xpm
utils/ogl/samples/studio/*.wxr
utils/ogl/samples/studio/bitmaps/*.bmp
utils/ogl/samples/studio/bitmaps/*.gif
utils/ogl/samples/studio/bitmaps/*.xbm
utils/ogl/samples/studio/bitmaps/*.xpm
utils/ogl/samples/studio/manual/*.tex
utils/ogl/samples/studio/manual/*.ini
utils/ogl/samples/studio/manual/*.gif
utils/ogl/samples/studio/manual/*.bmp
utils/ogl/samples/studio/manual/*.htm
utils/ogl/samples/studio/manual/*.hlp
utils/ogl/samples/studio/manual/*.cnt
utils/ogl/samples/studio/manual/Makefile
utils/ogl/distrib/*.rsp
utils/ogl/distrib/*.bat

View File

@ -70,6 +70,7 @@ public:
// called by wxWindow whenever it gets focus
void SetLastFocus(wxWindow *focus) { m_lastFocus = focus; }
wxWindow* GetLastFocus() const { return m_lastFocus; }
protected:
// the child which had the focus last time this panel was activated

View File

@ -24,7 +24,7 @@
#include "wx/ioswrap.h"
class wxProcess;
class WXDLLEXPORT wxProcess;
#ifdef __X__
#ifndef __VMS__

View File

@ -444,7 +444,8 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
panel = new wxPanel(m_notebook);
m_textentry = new MyTextCtrl( panel, -1, "Write text here.", wxPoint(10,10), wxSize(320,28),
0);//wxTE_PROCESS_ENTER);
//0);
wxTE_PROCESS_ENTER);
(*m_textentry) << " More text."; // this text is appended
m_textentry->SetInsertionPoint(0);
m_textentry->WriteText("Less text."); // this text is prepended

View File

@ -1508,6 +1508,14 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id,
wxWindow::~wxWindow()
{
// Remove potential dangling pointer
if (GetParent() && GetParent()->IsKindOf(CLASSINFO(wxPanel)))
{
wxPanel* panel = (wxPanel*) GetParent();
if (panel->GetLastFocus() == this)
panel->SetLastFocus((wxWindow*) NULL);
}
m_hasVMT = FALSE;
#if wxUSE_DRAG_AND_DROP

View File

@ -1508,6 +1508,14 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id,
wxWindow::~wxWindow()
{
// Remove potential dangling pointer
if (GetParent() && GetParent()->IsKindOf(CLASSINFO(wxPanel)))
{
wxPanel* panel = (wxPanel*) GetParent();
if (panel->GetLastFocus() == this)
panel->SetLastFocus((wxWindow*) NULL);
}
m_hasVMT = FALSE;
#if wxUSE_DRAG_AND_DROP

View File

@ -142,6 +142,14 @@ wxWindow::wxWindow()
// Destructor
wxWindow::~wxWindow()
{
// Remove potential dangling pointer
if (GetParent() && GetParent()->IsKindOf(CLASSINFO(wxPanel)))
{
wxPanel* panel = (wxPanel*) GetParent();
if (panel->GetLastFocus() == this)
panel->SetLastFocus((wxWindow*) NULL);
}
//// Motif-specific
if (GetMainWidget())

View File

@ -388,6 +388,17 @@ wxString wxRadioBox::GetString(int N) const
return wxString(wxBuffer);
}
/* NOTE. The contributed code to size the group box according to the
* given size simply didn't work (try it in e.g. Dialog Editor)
* so sorry, I'm removing it. If you reinstate it, please make sure
* it's bullet-proof in Dialog Editor. Meanwhile, it's better to have it
* working with a calculated size, than supposedly flexibly but
* actually broken. This is rather important when it comes to releasing
* stable software. Suggestion: if you modify this, rewrite it completely.
* -- JACS 7/2/99
*/
#if 0
void wxRadioBox::SetSize(int x, int y, int width, int height, int sizeFlags)
{
int currentX, currentY;
@ -413,7 +424,7 @@ void wxRadioBox::SetSize(int x, int y, int width, int height, int sizeFlags)
// number of radio boxes in both directions
int nbHor, nbVer;
if (m_windowStyle & wxRA_VERTICAL)
if (m_windowStyle & wxRA_SPECIFY_ROWS)
{
nbVer = m_majorDim ;
nbHor = (m_noItems+m_majorDim-1)/m_majorDim ;
@ -432,6 +443,7 @@ void wxRadioBox::SetSize(int x, int y, int width, int height, int sizeFlags)
// if we're given the width or height explicitly do not recalculate it, but
// use what we have
bool calcWidth = maxWidth == -1,
calcHeight = maxHeight == -1;
@ -510,7 +522,7 @@ void wxRadioBox::SetSize(int x, int y, int width, int height, int sizeFlags)
// Bidimensional radio adjustment
if (i&&((i%m_majorDim)==0)) // Why is this omitted for i = 0?
{
if (m_windowStyle & wxRA_VERTICAL)
if (m_windowStyle & wxRA_SPECIFY_ROWS)
{
y_offset = startY;
x_offset += maxWidth + cx1 ;
@ -544,7 +556,7 @@ void wxRadioBox::SetSize(int x, int y, int width, int height, int sizeFlags)
}
MoveWindow((HWND) m_radioButtons[i],x_offset,y_offset,eachWidth,eachHeight,TRUE);
if (m_windowStyle & wxRA_VERTICAL)
if (m_windowStyle & wxRA_SPECIFY_ROWS)
{
y_offset += maxHeight;
if (m_radioWidth[0]>0)
@ -554,6 +566,149 @@ void wxRadioBox::SetSize(int x, int y, int width, int height, int sizeFlags)
x_offset += maxWidth + cx1;
}
}
#endif
// Restored old code.
void wxRadioBox::SetSize(int x, int y, int width, int height, int sizeFlags)
{
int currentX, currentY;
GetPosition(&currentX, &currentY);
int xx = x;
int yy = y;
if (x == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
xx = currentX;
if (y == -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
yy = currentY;
char buf[400];
int y_offset = yy;
int x_offset = xx;
int current_width, cyf;
int cx1,cy1 ;
wxGetCharSize(m_hWnd, &cx1, &cy1, & GetFont());
// Attempt to have a look coherent with other platforms:
// We compute the biggest toggle dim, then we align all
// items according this value.
int maxWidth = -1;
int maxHeight = -1 ;
int i;
for (i = 0 ; i < m_noItems; i++)
{
int eachWidth;
int eachHeight ;
if (m_radioWidth[i]<0)
{
// It's a labelled toggle
GetWindowText((HWND) m_radioButtons[i], buf, 300);
GetTextExtent(buf, &current_width, &cyf,NULL,NULL, & GetFont());
eachWidth = (int)(current_width + RADIO_SIZE);
eachHeight = (int)((3*cyf)/2);
}
else
{
eachWidth = m_radioWidth[i] ;
eachHeight = m_radioHeight[i] ;
}
if (maxWidth<eachWidth) maxWidth = eachWidth ;
if (maxHeight<eachHeight) maxHeight = eachHeight ;
}
if (m_hWnd)
{
int totWidth ;
int totHeight;
int nbHor,nbVer;
if (m_windowStyle & wxRA_SPECIFY_ROWS)
{
nbVer = m_majorDim ;
nbHor = (m_noItems+m_majorDim-1)/m_majorDim ;
}
else
{
nbHor = m_majorDim ;
nbVer = (m_noItems+m_majorDim-1)/m_majorDim ;
}
// this formula works, but I don't know why.
// Please, be sure what you do if you modify it!!
if (m_radioWidth[0]<0)
totHeight = (nbVer * maxHeight) + cy1/2 ;
else
totHeight = nbVer * (maxHeight+cy1/2) ;
totWidth = nbHor * (maxWidth+cx1) ;
#if (!CTL3D)
// Requires a bigger group box in plain Windows
MoveWindow((HWND) m_hWnd,x_offset,y_offset,totWidth+cx1,totHeight+(3*cy1)/2,TRUE) ;
#else
MoveWindow((HWND) m_hWnd,x_offset,y_offset,totWidth+cx1,totHeight+cy1,TRUE) ;
#endif
x_offset += cx1;
y_offset += cy1;
}
#if (!CTL3D)
y_offset += (int)(cy1/2); // Fudge factor since buttons overlapped label
// JACS 2/12/93. CTL3D draws group label quite high.
#endif
int startX = x_offset ;
int startY = y_offset ;
for ( i = 0 ; i < m_noItems; i++)
{
// Bidimensional radio adjustment
if (i&&((i%m_majorDim)==0)) // Why is this omitted for i = 0?
{
if (m_windowStyle & wxRA_VERTICAL)
{
y_offset = startY;
x_offset += maxWidth + cx1 ;
}
else
{
x_offset = startX ;
y_offset += maxHeight ;
if (m_radioWidth[0]>0)
y_offset += cy1/2 ;
}
}
int eachWidth ;
int eachHeight ;
if (m_radioWidth[i]<0)
{
// It's a labeled item
GetWindowText((HWND) m_radioButtons[i], buf, 300);
GetTextExtent(buf, &current_width, &cyf,NULL,NULL, & GetFont());
// How do we find out radio button bitmap size!!
// By adjusting them carefully, manually :-)
eachWidth = (int)(current_width + RADIO_SIZE);
eachHeight = (int)((3*cyf)/2);
}
else
{
eachWidth = m_radioWidth[i] ;
eachHeight = m_radioHeight[i] ;
}
MoveWindow((HWND) m_radioButtons[i],x_offset,y_offset,eachWidth,eachHeight,TRUE);
if (m_windowStyle & wxRA_SPECIFY_ROWS)
{
y_offset += maxHeight;
if (m_radioWidth[0]>0)
y_offset += cy1/2 ;
}
else
x_offset += maxWidth + cx1;
}
}
void wxRadioBox::GetSize(int *width, int *height) const
{

View File

@ -970,9 +970,10 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
break;
case WXK_RETURN:
{
wxASSERT_MSG( m_windowStyle & wxTE_PROCESS_ENTER,
"this text ctrl should never receive return" );
if ( m_windowStyle & wxTE_MULTILINE == 0 )
if ( (m_windowStyle & wxTE_MULTILINE) == 0 )
{
wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, m_windowId);
event.SetEventObject( this );
@ -982,7 +983,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
//else: multiline controls need Enter for themselves
break;
}
case WXK_TAB:
// only produce navigation event if we don't process TAB ourself or
// if it's a Shift-Tab keypress (we assume nobody will ever need

View File

@ -302,6 +302,14 @@ wxWindow::wxWindow()
// Destructor
wxWindow::~wxWindow()
{
// Remove potential dangling pointer
if (GetParent() && GetParent()->IsKindOf(CLASSINFO(wxPanel)))
{
wxPanel* panel = (wxPanel*) GetParent();
if (panel->GetLastFocus() == this)
panel->SetLastFocus((wxWindow*) NULL);
}
m_isBeingDeleted = TRUE;
// first of all, delete the things on which nothing else depends

View File

@ -857,12 +857,11 @@ bool wxBitmapButtonPropertyInfo::SetProperty(wxString& name, wxProperty *propert
char *s = property->GetValue().StringValue();
if (s && wxFileExists(s))
{
s = copystring(s);
wxBitmap *bitmap = new wxBitmap(s, wxBITMAP_TYPE_BMP);
wxString str(s);
wxBitmap *bitmap = new wxBitmap(str, wxBITMAP_TYPE_BMP);
if (!bitmap->Ok())
{
delete bitmap;
delete[] s;
return FALSE;
}
else
@ -871,7 +870,7 @@ bool wxBitmapButtonPropertyInfo::SetProperty(wxString& name, wxProperty *propert
if (resource)
{
wxString oldResource(resource->GetValue4());
wxString resName = wxResourceManager::GetCurrentResourceManager()->AddBitmapResource(s);
wxString resName = wxResourceManager::GetCurrentResourceManager()->AddBitmapResource(str);
resource->SetValue4(resName);
if (!oldResource.IsNull())
@ -879,7 +878,6 @@ bool wxBitmapButtonPropertyInfo::SetProperty(wxString& name, wxProperty *propert
}
button->SetLabel(* bitmap);
delete[] s;
return TRUE;
}
}
@ -956,13 +954,12 @@ bool wxStaticBitmapPropertyInfo::SetProperty(wxString& name, wxProperty *propert
char *s = property->GetValue().StringValue();
if (s && wxFileExists(s))
{
s = copystring(s);
wxString str(s);
wxBitmap *bitmap = new wxBitmap(s, wxBITMAP_TYPE_BMP);
wxBitmap *bitmap = new wxBitmap(str, wxBITMAP_TYPE_BMP);
if (!bitmap->Ok())
{
delete bitmap;
delete[] s;
return FALSE;
}
else
@ -971,7 +968,7 @@ bool wxStaticBitmapPropertyInfo::SetProperty(wxString& name, wxProperty *propert
if (resource)
{
wxString oldResource(resource->GetValue4());
wxString resName = wxResourceManager::GetCurrentResourceManager()->AddBitmapResource(s);
wxString resName = wxResourceManager::GetCurrentResourceManager()->AddBitmapResource(str);
resource->SetValue4(resName);
if (!oldResource.IsNull())
@ -979,7 +976,6 @@ bool wxStaticBitmapPropertyInfo::SetProperty(wxString& name, wxProperty *propert
}
message->SetBitmap(* bitmap);
delete[] s;
return TRUE;
}
}

View File

@ -98,9 +98,12 @@ int g_WindowStylesRadioButtonCount = sizeof(g_WindowStylesRadioButton)/sizeof(wx
/* wxRadioBox */
static wxWindowStylePair g_WindowStylesRadioBox[] = {
{ "wxRA_SPECIFY_COLS", wxRA_SPECIFY_COLS },
{ "wxRA_SPECIFY_ROWS", wxRA_SPECIFY_ROWS },
{ "wxRA_SPECIFY_ROWS", wxRA_SPECIFY_ROWS }
/*
,
{ "wxRA_HORIZONTAL", wxRA_HORIZONTAL },
{ "wxRA_VERTICAL", wxRA_VERTICAL }
*/
};
int g_WindowStylesRadioBoxCount = sizeof(g_WindowStylesRadioBox)/sizeof(wxWindowStylePair) ;