]> git.saurik.com Git - wxWidgets.git/commitdiff
Tried to fix wxPanel bug (windows now set the panel current focus window on deletion);
authorJulian Smart <julian@anthemion.co.uk>
Mon, 8 Feb 1999 00:15:40 +0000 (00:15 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Mon, 8 Feb 1999 00:15:40 +0000 (00:15 +0000)
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

12 files changed:
distrib/msw/ogl.rsp
include/wx/generic/panelg.h
include/wx/utils.h
samples/controls/controls.cpp
src/gtk/window.cpp
src/gtk1/window.cpp
src/motif/window.cpp
src/msw/radiobox.cpp
src/msw/textctrl.cpp
src/msw/window.cpp
utils/dialoged/src/winprop.cpp
utils/dialoged/src/winstyle.cpp

index f981ca6d6c73db0e9f9e33c7d44adae114176869..72d552d4f017466043667e7c66eb3e02990729ed 100644 (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
 
index d3d45a7c651430f45224270d8859a3361b57f1d4..a6e983e0244bc427e70b45050cf0e6943db746a3 100644 (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
index 8c55231237bb06a7409ef54d0f84bbb8f932d8c5..7a6fc528068f221188f9a15aee0643c388943cc9 100644 (file)
@@ -24,7 +24,7 @@
 
 #include "wx/ioswrap.h"
 
-class wxProcess;
+class WXDLLEXPORT wxProcess;
 
 #ifdef __X__
 #ifndef __VMS__
index eb52045adda744b77cc473ca0e45f0804d106c31..8b10682e5f67dfe91597c87d5496103a8fb106b6 100644 (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
index 3bb8f1cea5eead1a98ff73ed84170f6cf92d6d21..32f42e8f77e7582fa116a274a02c39657ce21fe2 100644 (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
index 3bb8f1cea5eead1a98ff73ed84170f6cf92d6d21..32f42e8f77e7582fa116a274a02c39657ce21fe2 100644 (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
index 5af5f8760268eb557d7da4dd74f2c7b101202ff0..e654d4aad02996711db5db568ae3a88f462c7812 100644 (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())
index dc5008a687d4fb88ab6a4d6a4ca3e19405601be9..d80bc663911bce8ea175c370626aa564198e57fe 100644 (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
 {
index 14d001af79b462f837bec79c0c0567621d6794e6..7fa765d4a4cbaf8f90a5996f080b8ab002aa8a02 100644 (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
index bf30596b93862014c9202e0737157fca5ed4fdfd..569dec2dd6c5bcca35163decf16e4cf9cb1f9cab 100644 (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
index 4f3a64b6f5752348cfe0ad5c15cd59ae8d8028e4..193df7e390ff26bcb12a86d687d43c26d65eb02e 100644 (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;
       }
     }
index 6fa29b4b18ee6eefc1a3eff63bb31cadbb8f649f..8537101d721d200f2d1d2ce84feb2bd90d00bd76 100644 (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) ;