From: Vadim Zeitlin Date: Sat, 9 Mar 2013 15:08:31 +0000 (+0000) Subject: Use generic spin control itself as parent for its children. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/29cc4cc9bcfd25f9b586e3f1b52a2168802616fc Use generic spin control itself as parent for its children. This fixes a problem with using wxSpinCtrlGeneric in toolbars under wxOSX, using the toolbar itself (i.e. the parent of the spin control) as parent for the children didn't work there and no windows were visible at all. Also use wxNavigationEnabled as base class of wxSpinCtrlGeneric to fix keyboard navigation. And override SetBackgroundColour() to set it for the text control part of the spin control only. Closes #15016. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73630 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/generic/spinctlg.h b/include/wx/generic/spinctlg.h index f5f52a56bb..ff30a8ef9d 100644 --- a/include/wx/generic/spinctlg.h +++ b/include/wx/generic/spinctlg.h @@ -43,7 +43,7 @@ class wxSpinCtrlTextGeneric; // wxTextCtrl used for the wxSpinCtrlGenericBase // ---------------------------------------------------------------------------- class WXDLLIMPEXP_CORE wxSpinCtrlGenericBase - : public wxCompositeWindow + : public wxNavigationEnabled > { public: wxSpinCtrlGenericBase() { Init(); } @@ -88,6 +88,8 @@ public: virtual void DoSetToolTip(wxToolTip *tip); #endif // wxUSE_TOOLTIPS + virtual bool SetBackgroundColour(const wxColour& colour); + // get the subcontrols wxTextCtrl *GetText() const { return m_textCtrl; } wxSpinButton *GetSpinButton() const { return m_spinButton; } diff --git a/src/generic/spinctlg.cpp b/src/generic/spinctlg.cpp index d703bb566b..0e13113779 100644 --- a/src/generic/spinctlg.cpp +++ b/src/generic/spinctlg.cpp @@ -64,7 +64,7 @@ class wxSpinCtrlTextGeneric : public wxTextCtrl { public: wxSpinCtrlTextGeneric(wxSpinCtrlGenericBase *spin, const wxString& value, long style=0) - : wxTextCtrl(spin->GetParent(), wxID_ANY, value, wxDefaultPosition, wxDefaultSize, + : wxTextCtrl(spin, wxID_ANY, value, wxDefaultPosition, wxDefaultSize, // This is tricky: we want to honour any alignment flags // but not wxALIGN_CENTER_VERTICAL because it's the same // as wxTE_PASSWORD and we definitely don't want to show @@ -137,7 +137,7 @@ class wxSpinCtrlButtonGeneric : public wxSpinButton { public: wxSpinCtrlButtonGeneric(wxSpinCtrlGenericBase *spin, int style) - : wxSpinButton(spin->GetParent(), wxID_ANY, wxDefaultPosition, + : wxSpinButton(spin, wxID_ANY, wxDefaultPosition, wxDefaultSize, style | wxSP_VERTICAL) { m_spin = spin; @@ -213,6 +213,7 @@ bool wxSpinCtrlGenericBase::Create(wxWindow *parent, m_textCtrl = new wxSpinCtrlTextGeneric(this, value, style); m_spinButton = new wxSpinCtrlButtonGeneric(this, style); + #if wxUSE_TOOLTIPS m_textCtrl->SetToolTip(GetToolTipText()); m_spinButton->SetToolTip(GetToolTipText()); @@ -237,16 +238,6 @@ bool wxSpinCtrlGenericBase::Create(wxWindow *parent, SetInitialSize(size); Move(pos); - // have to disable this window to avoid interfering it with message - // processing to the text and the button... but pretend it is enabled to - // make IsEnabled() return true - wxControl::Enable(false); // don't use non virtual Disable() here! - m_isEnabled = true; - - // we don't even need to show this window itself - and not doing it avoids - // that it overwrites the text control - wxControl::Show(false); - m_isShown = true; return true; } @@ -313,8 +304,8 @@ void wxSpinCtrlGenericBase::DoMoveWindow(int x, int y, int width, int height) wxSize sizeBtn = m_spinButton->GetSize(); wxCoord wText = width - sizeBtn.x - MARGIN; - m_textCtrl->SetSize(x, y, wText, height); - m_spinButton->SetSize(x + wText + MARGIN, y, wxDefaultCoord, height); + m_textCtrl->SetSize(0, 0, wText, height); + m_spinButton->SetSize(0 + wText + MARGIN, 0, wxDefaultCoord, height); } // ---------------------------------------------------------------------------- @@ -331,11 +322,7 @@ void wxSpinCtrlGenericBase::SetFocus() void wxSpinCtrlGenericBase::DoEnable(bool enable) { - // We never enable this control itself, it must stay disabled to avoid - // interfering with the siblings event handling (see e.g. #12045 for the - // kind of problems which arise otherwise). - if ( !enable ) - wxSpinCtrlBase::DoEnable(enable); + wxSpinCtrlBase::DoEnable(enable); } #endif // __WXMSW__ @@ -394,6 +381,17 @@ void wxSpinCtrlGenericBase::DoSetToolTip(wxToolTip *tip) } #endif // wxUSE_TOOLTIPS +bool wxSpinCtrlGenericBase::SetBackgroundColour(const wxColour& colour) +{ + // We need to provide this otherwise the entire composite window + // background and therefore the between component spaces + // will be changed. + if ( m_textCtrl ) + return m_textCtrl->SetBackgroundColour(colour); + + return true; +} + // ---------------------------------------------------------------------------- // Handle sub controls events // ----------------------------------------------------------------------------