X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/06f23ff937050f8489771a5bf15ce59dda86ae09..5568067a3d151caf17d01de9192ca4471decba97:/src/common/pickerbase.cpp diff --git a/src/common/pickerbase.cpp b/src/common/pickerbase.cpp index 3187ccdfe9..ce17ad7da8 100644 --- a/src/common/pickerbase.cpp +++ b/src/common/pickerbase.cpp @@ -24,32 +24,36 @@ #pragma hdrstop #endif +#if wxUSE_COLOURPICKERCTRL || \ + wxUSE_DIRPICKERCTRL || \ + wxUSE_FILEPICKERCTRL || \ + wxUSE_FONTPICKERCTRL + #include "wx/pickerbase.h" +#include "wx/tooltip.h" #ifndef WX_PRECOMP #include "wx/textctrl.h" #endif + // ============================================================================ // implementation // ============================================================================ -IMPLEMENT_ABSTRACT_CLASS(wxPickerBase, wxWindow) +IMPLEMENT_ABSTRACT_CLASS(wxPickerBase, wxControl) + +BEGIN_EVENT_TABLE(wxPickerBase, wxControl) + EVT_SIZE(wxPickerBase::OnSize) + WX_EVENT_TABLE_CONTROL_CONTAINER(wxPickerBase) +END_EVENT_TABLE() +WX_DELEGATE_TO_CONTROL_CONTAINER(wxPickerBase, wxControl) + // ---------------------------------------------------------------------------- // wxPickerBase // ---------------------------------------------------------------------------- -wxPickerBase::~wxPickerBase() -{ - // destroy the windows we are managing: these are not automatically - // destroyed by wxWindow because they are not built as our children - // but rather as children of the parent of the wxPickerBase class - // (since wxPickerBase does not represent a real window) - if (m_text) m_text->Destroy(); - if (m_picker) m_picker->Destroy(); -} - bool wxPickerBase::CreateBase(wxWindow *parent, wxWindowID id, const wxString &text, @@ -62,17 +66,23 @@ bool wxPickerBase::CreateBase(wxWindow *parent, // remove any border style from our style as wxPickerBase's window must be // invisible (user styles must be set on the textctrl or the platform-dependent picker) style &= ~wxBORDER_MASK; + if (!wxControl::Create(parent, id, pos, size, style | wxNO_BORDER | wxTAB_TRAVERSAL, - validator, name)) + validator, name)) return false; + SetMinSize( size ); + + m_sizer = new wxBoxSizer(wxHORIZONTAL); + if (HasFlag(wxPB_USE_TEXTCTRL)) { // NOTE: the style of this class (wxPickerBase) and the style of the // attached text control are different: GetTextCtrlStyle() extracts // the styles related to the textctrl from the styles passed here - m_text = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxPoint(0, 0), - wxSize(40, size.GetHeight()), GetTextCtrlStyle(style)); + m_text = new wxTextCtrl(this, wxID_ANY, wxEmptyString, + wxDefaultPosition, wxDefaultSize, + GetTextCtrlStyle(style)); if (!m_text) { wxFAIL_MSG( wxT("wxPickerBase's textctrl creation failed") ); @@ -89,27 +99,71 @@ bool wxPickerBase::CreateBase(wxWindow *parent, // set the initial contents of the textctrl m_text->SetValue(text); - m_text->Connect(wxEVT_COMMAND_TEXT_UPDATED, + m_text->Connect(m_text->GetId(), wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(wxPickerBase::OnTextCtrlUpdate), NULL, this); - m_text->Connect(wxEVT_KILL_FOCUS, + m_text->Connect(m_text->GetId(), wxEVT_KILL_FOCUS, wxFocusEventHandler(wxPickerBase::OnTextCtrlKillFocus), NULL, this); - m_text->Connect(wxEVT_DESTROY, + m_text->Connect(m_text->GetId(), wxEVT_DESTROY, wxWindowDestroyEventHandler(wxPickerBase::OnTextCtrlDelete), NULL, this); + + // the text control's proportion values defaults to 2 + m_sizer->Add(m_text, 2, GetDefaultTextCtrlFlag(), 5); } return true; } -void wxPickerBase::OnTextCtrlKillFocus(wxFocusEvent &) +void wxPickerBase::PostCreation() { - wxASSERT(m_text); + // the picker's proportion value defaults to 1 when there's no text control + // associated with it - in that case it defaults to 0 + m_sizer->Add(m_picker, HasTextCtrl() ? 0 : 1, GetDefaultPickerCtrlFlag(), 5); + + // For aesthetic reasons, make sure the picker is at least as high as the + // associated text control and is always at least square. + const wxSize pickerBestSize(m_picker->GetBestSize()); + const wxSize textBestSize( HasTextCtrl() ? m_text->GetBestSize() : wxSize()); + wxSize pickerMinSize; + pickerMinSize.y = wxMax(pickerBestSize.y, textBestSize.y); + pickerMinSize.x = wxMax(pickerBestSize.x, pickerMinSize.y); + if ( pickerMinSize != pickerBestSize ) + m_picker->SetMinSize(pickerMinSize); + + SetSizer(m_sizer); + + SetInitialSize( GetMinSize() ); +} + +#if wxUSE_TOOLTIPS + +void wxPickerBase::DoSetToolTip(wxToolTip *tip) +{ + // don't set the tooltip on us but rather on our two child windows + // as otherwise it would appear only when the cursor is placed on the + // small area around the child windows which belong to wxPickerBase + m_picker->SetToolTip(tip); + + // do a copy as wxWindow will own the pointer we pass + if ( m_text ) + m_text->SetToolTip(tip ? new wxToolTip(tip->GetTip()) : NULL); +} + +#endif // wxUSE_TOOLTIPS + +// ---------------------------------------------------------------------------- +// wxPickerBase - event handlers +// ---------------------------------------------------------------------------- + +void wxPickerBase::OnTextCtrlKillFocus(wxFocusEvent& event) +{ + event.Skip(); // don't leave the textctrl empty - if (m_text->GetValue().empty()) + if (m_text && m_text->GetValue().empty()) UpdateTextCtrlFromPicker(); } @@ -125,78 +179,11 @@ void wxPickerBase::OnTextCtrlUpdate(wxCommandEvent &) UpdatePickerFromTextCtrl(); } -int wxPickerBase::GetTextCtrlWidth(int given) -{ - // compute the width of m_text like a wxBoxSizer(wxHORIZONTAL) would do - // NOTE: the proportion of m_picker is fixed to 1 - return ((given - m_margin) / (m_textProportion + 1)) * m_textProportion; -} - -void wxPickerBase::DoSetSizeHints(int minW, int minH, int maxW, int maxH, int incW, int incH) -{ - wxControl::DoSetSizeHints(minW, minH, maxW, maxH, incW, incH); - - if (m_text) - { - // compute minWidth and maxWidth of the ausiliary textctrl - int textCtrlMinW = -1, textCtrlMaxW = -1; - if (minW != -1) - { - textCtrlMinW = GetTextCtrlWidth(minW); - minW -= textCtrlMinW + m_margin; - } - - if (maxW != -1) - { - textCtrlMaxW = GetTextCtrlWidth(maxW); - maxW -= textCtrlMaxW + m_margin; - } - - m_text->SetSizeHints(textCtrlMinW, minH, textCtrlMaxW, maxH, incW, incH); - } - - if (m_picker) - m_picker->SetSizeHints(minW, minH, maxW, maxH, incW, incH); -} - -void wxPickerBase::DoSetSize(int x, int y, int width, int height, int sizeFlags) +void wxPickerBase::OnSize(wxSizeEvent &event) { - wxControl::DoSetSize(x, y, width, height, sizeFlags); - - int pickerx = 0; - if (m_text) - { - // compute width of the ausiliary textctrl - int textCtrlW = GetTextCtrlWidth(width); - - // set the m_text's position relatively to this window - m_text->SetSize(0, 0, textCtrlW, height, sizeFlags); - - // change position of the real picker - pickerx += textCtrlW + m_margin; - width -= textCtrlW + m_margin; - } - - if (m_picker) - m_picker->SetSize(pickerx, 0, width, height, sizeFlags); + if (GetAutoLayout()) + Layout(); + event.Skip(); } -wxSize wxPickerBase::DoGetBestSize() const -{ - wxSize ret = m_picker->GetBestSize(); - - if (m_text) - { - wxSize sz = m_text->GetBestSize(); - - ret.SetWidth( ret.GetWidth() + sz.GetWidth() + m_margin ); - ret.SetHeight( wxMax(ret.GetHeight(), sz.GetHeight()) ); - } - - return ret; -} - -void wxPickerBase::SetInternalMargin(int newmargin) -{ - m_margin = newmargin; -} +#endif // Any picker in use