From 1f916a19f14ce4f8d172f81344dd2b978dd29340 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Mon, 8 Feb 1999 00:15:40 +0000 Subject: [PATCH] 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 --- distrib/msw/ogl.rsp | 25 +++++ include/wx/generic/panelg.h | 1 + include/wx/utils.h | 2 +- samples/controls/controls.cpp | 3 +- src/gtk/window.cpp | 8 ++ src/gtk1/window.cpp | 8 ++ src/motif/window.cpp | 8 ++ src/msw/radiobox.cpp | 161 +++++++++++++++++++++++++++++++- src/msw/textctrl.cpp | 5 +- src/msw/window.cpp | 8 ++ utils/dialoged/src/winprop.cpp | 16 ++-- utils/dialoged/src/winstyle.cpp | 5 +- 12 files changed, 232 insertions(+), 18 deletions(-) diff --git a/distrib/msw/ogl.rsp b/distrib/msw/ogl.rsp index f981ca6d6c..72d552d4f0 100644 --- a/distrib/msw/ogl.rsp +++ b/distrib/msw/ogl.rsp @@ -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 diff --git a/include/wx/generic/panelg.h b/include/wx/generic/panelg.h index d3d45a7c65..a6e983e024 100644 --- a/include/wx/generic/panelg.h +++ b/include/wx/generic/panelg.h @@ -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 diff --git a/include/wx/utils.h b/include/wx/utils.h index 8c55231237..7a6fc52806 100644 --- a/include/wx/utils.h +++ b/include/wx/utils.h @@ -24,7 +24,7 @@ #include "wx/ioswrap.h" -class wxProcess; +class WXDLLEXPORT wxProcess; #ifdef __X__ #ifndef __VMS__ diff --git a/samples/controls/controls.cpp b/samples/controls/controls.cpp index eb52045add..8b10682e5f 100644 --- a/samples/controls/controls.cpp +++ b/samples/controls/controls.cpp @@ -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 diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 3bb8f1cea5..32f42e8f77 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -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 diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 3bb8f1cea5..32f42e8f77 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -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 diff --git a/src/motif/window.cpp b/src/motif/window.cpp index 5af5f87602..e654d4aad0 100644 --- a/src/motif/window.cpp +++ b/src/motif/window.cpp @@ -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()) diff --git a/src/msw/radiobox.cpp b/src/msw/radiobox.cpp index dc5008a687..d80bc66391 100644 --- a/src/msw/radiobox.cpp +++ b/src/msw/radiobox.cpp @@ -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(¤tX, ¤tY); + 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, ¤t_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 (maxWidth0) + 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, ¤t_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 { diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index 14d001af79..7fa765d4a4 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -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 diff --git a/src/msw/window.cpp b/src/msw/window.cpp index bf30596b93..569dec2dd6 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -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 diff --git a/utils/dialoged/src/winprop.cpp b/utils/dialoged/src/winprop.cpp index 4f3a64b6f5..193df7e390 100644 --- a/utils/dialoged/src/winprop.cpp +++ b/utils/dialoged/src/winprop.cpp @@ -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; } } diff --git a/utils/dialoged/src/winstyle.cpp b/utils/dialoged/src/winstyle.cpp index 6fa29b4b18..8537101d72 100644 --- a/utils/dialoged/src/winstyle.cpp +++ b/utils/dialoged/src/winstyle.cpp @@ -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) ; -- 2.45.2