]> git.saurik.com Git - wxWidgets.git/commitdiff
1. corrected (but the fix is ugly) the multiple def button problem
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 28 Oct 1999 01:17:35 +0000 (01:17 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 28 Oct 1999 01:17:35 +0000 (01:17 +0000)
2. corrected a bug which disabled all accels for MSW (sic)
3. added SetValue/GetValue to wxSpinCtrl
4. modified wxGetNumberFromUser to use wxSpinCtrl

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4234 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/generic/panelg.h
include/wx/msw/button.h
include/wx/msw/spinctrl.h
samples/controls/controls.cpp
src/generic/numdlgg.cpp
src/msw/button.cpp
src/msw/menu.cpp
src/msw/spinctrl.cpp

index c5442a15e0ecb1c75ca58217968eb64c1f76258d..b6c550a860659e50100886a5580646e6206758e4 100644 (file)
@@ -6,11 +6,11 @@
 // Created:     01/02/97
 // RCS-ID:      $Id$
 // Copyright:   (c)
-// Licence:    wxWindows licence
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifndef __PANELH_G__
-#define __PANELH_G__
+#ifndef _WX_GENERIC_PANEL_H_
+#define _WX_GENERIC_PANEL_H_
 
 #ifdef __GNUG__
 #pragma interface "panelg.h"
@@ -100,4 +100,4 @@ private:
 };
 
 #endif
-    // __PANELH_G__
+    // _WX_GENERIC_PANEL_H_
index 6888ee443a158760f515c1a2ec1e2b30a1011b73..794d9f933733034dd9703c0d11995a81d5b23460 100644 (file)
@@ -53,6 +53,7 @@ public:
 
     // implementation from now on
     virtual void Command(wxCommandEvent& event);
+    virtual long MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam);
     virtual bool MSWCommand(WXUINT param, WXWORD id);
     virtual WXHBRUSH OnCtlColor(WXHDC pDC,
                                 WXHWND pWnd,
index 4471ccd5dcbe62a3d247af5f110185d88d090161..7babcf4e74765276f73b1cc349ee084594dd0856 100644 (file)
@@ -31,24 +31,32 @@ public:
 
     wxSpinCtrl(wxWindow *parent,
                wxWindowID id = -1,
+               const wxString& value = wxEmptyString,
                const wxPoint& pos = wxDefaultPosition,
                const wxSize& size = wxDefaultSize,
                long style = wxSP_ARROW_KEYS,
                int min = 0, int max = 100, int initial = 0,
                const wxString& name = _T("wxSpinCtrl"))
     {
-        Create(parent, id, pos, size, style, min, max, initial, name);
+        Create(parent, id, value, pos, size, style, min, max, initial, name);
     }
 
     bool Create(wxWindow *parent,
                 wxWindowID id = -1,
+                const wxString& value = wxEmptyString,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = wxSP_ARROW_KEYS,
                 int min = 0, int max = 100, int initial = 0,
                 const wxString& name = _T("wxSpinCtrl"));
 
+    // a wxTextCtrl-like method (but we can't have GetValue returning wxString
+    // because the base class already has one returning int!)
+    void SetValue(const wxString& text);
+
     // override some of the base class virtuals
+    virtual void SetValue(int val) { wxSpinButton::SetValue(val); }
+    virtual int GetValue() const;
     virtual bool SetFont(const wxFont &font);
 
 protected:
index f4719a7b863313170b540d188a1da1aae090a9ce..4b6f62cee19535cbfde6e4a8cecca81babcd49a2 100644 (file)
@@ -527,7 +527,7 @@ MyPanel::MyPanel( wxFrame *frame, int x, int y, int w, int h )
 #endif // wxUSE_SPINBUTTON
 
 #if wxUSE_SPINCTRL
-    m_spinctrl = new wxSpinCtrl( panel, ID_SPINCTRL, wxPoint(200, 160), wxSize(80, -1) );
+    m_spinctrl = new wxSpinCtrl( panel, ID_SPINCTRL, "", wxPoint(200, 160), wxSize(80, -1) );
     m_spinctrl->SetRange(10,30);
     m_spinctrl->SetValue(15);
 #endif // wxUSE_SPINCTRL
index c88afa638c57ba00ab24a751629bc42639fa56d7..0bcafcdc6094567e374e7e34b6abc050b75b0f1d 100644 (file)
@@ -45,6 +45,8 @@
   #include "wx/statline.h"
 #endif
 
+#include "wx/spinctrl.h"
+
 // this is where wxGetNumberFromUser() is declared
 #include "wx/generic/textdlgg.h"
 
@@ -69,7 +71,7 @@ public:
     void OnCancel(wxCommandEvent& event);
 
 protected:
-    wxTextCtrl *m_spinctrl; // TODO replace it with wxSpinCtrl once it's done
+    wxSpinCtrl *m_spinctrl;
 
     long m_value, m_min, m_max;
 
@@ -107,12 +109,12 @@ wxNumberEntryDialog::wxNumberEntryDialog(wxWindow *parent,
     m_min = min;
 
     wxBeginBusyCursor();
-    
+
     wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
 
     // 1) text message
     topsizer->Add( CreateTextSizer( message ), 0, wxALL, 10 );
-    
+
     // 2) prompt and text ctrl
     wxBoxSizer *inputsizer = new wxBoxSizer( wxHORIZONTAL );
     // prompt if any
@@ -121,9 +123,9 @@ wxNumberEntryDialog::wxNumberEntryDialog(wxWindow *parent,
     // spin ctrl
     wxString valStr;
     valStr.Printf(wxT("%lu"), m_value);
-    m_spinctrl = new wxTextCtrl(this, -1, valStr, wxDefaultPosition, wxSize( 140, -1 ) );
+    m_spinctrl = new wxSpinCtrl(this, -1, valStr, wxDefaultPosition, wxSize( 140, -1 ) );
     inputsizer->Add( m_spinctrl, 1, wxCENTER | wxLEFT | wxRIGHT, 10 );
-    // add both    
+    // add both
     topsizer->Add( inputsizer, 1, wxEXPAND | wxLEFT|wxRIGHT, 5 );
 
 #if wxUSE_STATLINE
@@ -133,7 +135,7 @@ wxNumberEntryDialog::wxNumberEntryDialog(wxWindow *parent,
 
     // 4) buttons
     topsizer->Add( CreateButtonSizer( wxOK|wxCANCEL ), 0, wxCENTRE | wxALL, 10 );
-    
+
     SetSizer( topsizer );
     SetAutoLayout( TRUE );
 
@@ -149,8 +151,8 @@ wxNumberEntryDialog::wxNumberEntryDialog(wxWindow *parent,
 
 void wxNumberEntryDialog::OnOK(wxCommandEvent& WXUNUSED(event))
 {
-    if ( (wxSscanf(m_spinctrl->GetValue(), wxT("%lu"), &m_value) != 1) ||
-         (m_value < m_min) || (m_value > m_max) )
+    m_value = m_spinctrl->GetValue();
+    if ( m_value < m_min || m_value > m_max )
     {
         // not a number or out of range
         m_value = -1;
index 18a3cc42e6102472e75aeef465618d3ea22b3fa4..b1001d59308051dc4ceb497275be0f9d71bd1e4c 100644 (file)
@@ -70,9 +70,6 @@ bool wxButton::Create(wxWindow *parent,
     if ( !CreateBase(parent, id, pos, size, style, validator, name) )
         return FALSE;
 
-    // Validator was set in CreateBase
-    //SetValidator(validator);
-
     parent->AddChild((wxButton *)this);
 
     m_backgroundColour = parent->GetBackgroundColour() ;
@@ -104,8 +101,10 @@ bool wxButton::Create(wxWindow *parent,
     wxSize nsize( GetSize() );
     if ((nsize.x < 80) || (nsize.y < 23))
     {
-        if ((size.x == -1) && (nsize.x < 80)) nsize.x = 80;
-       if ((size.y == -1) && (nsize.y < 23)) nsize.y = 23;
+        if ((size.x == -1) && (nsize.x < 80))
+            nsize.x = 80;
+        if ((size.y == -1) && (nsize.y < 23))
+            nsize.y = 23;
         SetSize( nsize );
     }
 
@@ -234,7 +233,7 @@ bool wxButton::MSWCommand(WXUINT param, WXWORD id)
     bool processed = FALSE;
     switch ( param )
     {
-        case 1:                                             // 1 for accelerator
+        case 1: // means that the message came from an accelerator
         case BN_CLICKED:
             processed = SendClickEvent();
             break;
@@ -255,3 +254,28 @@ WXHBRUSH wxButton::OnCtlColor(WXHDC pDC,
   return (WXHBRUSH) backgroundBrush->GetResourceHandle();
 }
 
+long wxButton::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
+{
+    // make sure that we won't have BS_DEFPUSHBUTTON style any more if the
+    // focus is being transfered to another button with the same parent -
+    // otherwise, we could finish with 2 default buttons inside one panel
+    if ( (nMsg == WM_KILLFOCUS) &&
+         (GetWindowLong(GetHwnd(), GWL_STYLE) & BS_DEFPUSHBUTTON) )
+    {
+        wxWindow *parent = GetParent();
+        wxWindow *win = wxFindWinFromHandle((WXHWND)wParam);
+        if ( win && win->GetParent() == parent )
+        {
+            wxPanel *panel = wxDynamicCast(parent, wxPanel);
+            if ( panel )
+            {
+                panel->SetDefaultItem(this);
+            }
+            // else: I don't know what to do - we'll still have the problem
+            //       with multiple default buttons in a dialog...
+        }
+    }
+
+    // let the base class do all real processing
+    return wxControl::MSWWindowProc(nMsg, wParam, lParam);
+}
index 1fb674564ee89674887d1887002d4d5c1f52931e..22b89e7b4e72cb28027133e3d35859755e9aa510 100644 (file)
@@ -150,6 +150,7 @@ void wxMenu::Append(wxMenuItem *pItem)
     wxAcceleratorEntry *accel = wxGetAccelFromString(pItem->GetText());
     if ( accel ) {
         m_accels.Add(accel);
+        accel->m_command = pItem->GetId();
     }
 #endif // wxUSE_ACCEL
 
index 983181c466fde5fed7e5aa17260502491b325811..1e5ed522668e83575a2e3eb605f658f49383f5e6 100644 (file)
@@ -42,6 +42,8 @@
     #include <commctrl.h>
 #endif
 
+#include <limits.h>         // for INT_MIN
+
 // ----------------------------------------------------------------------------
 // macros
 // ----------------------------------------------------------------------------
@@ -69,6 +71,7 @@ static const int MARGIN_BETWEEN = 1;
 
 bool wxSpinCtrl::Create(wxWindow *parent,
                         wxWindowID id,
+                        const wxString& value,
                         const wxPoint& pos,
                         const wxSize& size,
                         long style,
@@ -149,9 +152,37 @@ bool wxSpinCtrl::Create(wxWindow *parent,
     // associate the text window with the spin button
     (void)::SendMessage(GetHwnd(), UDM_SETBUDDY, (WPARAM)m_hwndBuddy, 0);
 
+    if ( !value.IsEmpty() )
+    {
+        SetValue(value);
+    }
+
     return TRUE;
 }
 
+// ----------------------------------------------------------------------------
+// wxTextCtrl-like methods
+// ----------------------------------------------------------------------------
+
+void wxSpinCtrl::SetValue(const wxString& text)
+{
+    if ( ::SetWindowText((HWND)m_hwndBuddy, text.c_str()) )
+    {
+        wxLogLastError("SetWindowText(buddy)");
+    }
+}
+
+int wxSpinCtrl::GetValue() const
+{
+    wxString val = wxGetWindowText(m_hwndBuddy);
+
+    long n;
+    if ( (wxSscanf(val, wxT("%lu"), &n) != 1) )
+        n = INT_MIN;
+
+    return n;
+}
+
 // ----------------------------------------------------------------------------
 // when setting font, we need to do it for both controls
 // ----------------------------------------------------------------------------