]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/pickerbase.h
added template wxScopedArray<> too
[wxWidgets.git] / include / wx / pickerbase.h
index d5bd9a5c47f816afa334a3ed4f4ea682d98144fd..1982838cc28906d4fe7d20f996d241b9573508d3 100644 (file)
 #ifndef _WX_PICKERBASE_H_BASE_
 #define _WX_PICKERBASE_H_BASE_
 
-#include "wx/defs.h"
-#include "wx/button.h"
-#include "wx/textctrl.h"
+#include "wx/control.h"
+#include "wx/sizer.h"
+#include "wx/containr.h"
+
+class WXDLLIMPEXP_FWD_CORE wxTextCtrl;
+class WXDLLIMPEXP_FWD_CORE wxToolTip;
+
+extern WXDLLIMPEXP_DATA_CORE(const char) wxButtonNameStr[];
 
 // ----------------------------------------------------------------------------
 // wxPickerBase is the base class for the picker controls which support
@@ -31,31 +36,67 @@ class WXDLLIMPEXP_CORE wxPickerBase : public wxControl
 {
 public:
     // ctor: text is the associated text control
-    wxPickerBase() : m_text(NULL), m_picker(NULL),
-                     m_margin(5), m_textProportion(2) {}
-    virtual ~wxPickerBase();
+    wxPickerBase() : m_text(NULL), m_picker(NULL), m_sizer(NULL)
+        { WX_INIT_CONTROL_CONTAINER(); }
+    virtual ~wxPickerBase() {}
 
 
     // if present, intercepts wxPB_USE_TEXTCTRL style and creates the text control
     // The 3rd argument is the initial wxString to display in the text control
-    bool CreateBase(wxWindow *parent, wxWindowID id,
-        const wxString& text = wxEmptyString,
-        const wxPoint& pos = wxDefaultPosition,
-        const wxSize& size = wxDefaultSize, long style = 0,
-        const wxValidator& validator = wxDefaultValidator,
-        const wxString& name = wxButtonNameStr);
-
+    bool CreateBase(wxWindow *parent,
+                    wxWindowID id,
+                    const wxString& text = wxEmptyString,
+                    const wxPoint& pos = wxDefaultPosition,
+                    const wxSize& size = wxDefaultSize,
+                    long style = 0,
+                    const wxValidator& validator = wxDefaultValidator,
+                    const wxString& name = wxButtonNameStr);
 
 public:     // public API
 
     // margin between the text control and the picker
-    void SetInternalMargin(int newmargin);
-    int GetInternalMargin() const { return m_margin; }
-
-    // proportion of the text control respect the picker
-    // (which has a fixed proportion value of 1)
-    void SetTextCtrlProportion(int prop) { wxASSERT(prop>=1); m_textProportion=prop; }
-    int GetTextCtrlProportion() const { return m_textProportion; }
+    void SetInternalMargin(int newmargin)
+        { GetTextCtrlItem()->SetBorder(newmargin); m_sizer->Layout(); }
+    int GetInternalMargin() const
+        { return GetTextCtrlItem()->GetBorder(); }
+
+    // proportion of the text control
+    void SetTextCtrlProportion(int prop)
+        { GetTextCtrlItem()->SetProportion(prop); m_sizer->Layout(); }
+    int GetTextCtrlProportion() const
+        { return GetTextCtrlItem()->GetProportion(); }
+
+    // proportion of the picker control
+    void SetPickerCtrlProportion(int prop)
+        { GetPickerCtrlItem()->SetProportion(prop); m_sizer->Layout(); }
+    int GetPickerCtrlProportion() const
+        { return GetPickerCtrlItem()->GetProportion(); }
+
+    bool IsTextCtrlGrowable() const
+        { return (GetTextCtrlItem()->GetFlag() & wxGROW) != 0; }
+    void SetTextCtrlGrowable(bool grow = true)
+    {
+        int f = GetDefaultTextCtrlFlag();
+        if ( grow )
+            f |= wxGROW;
+        else
+            f &= ~wxGROW;
+
+        GetTextCtrlItem()->SetFlag(f);
+    }
+
+    bool IsPickerCtrlGrowable() const
+        { return (GetPickerCtrlItem()->GetFlag() & wxGROW) != 0; }
+    void SetPickerCtrlGrowable(bool grow = true)
+    {
+        int f = GetDefaultPickerCtrlFlag();
+        if ( grow )
+            f |= wxGROW;
+        else
+            f &= ~wxGROW;
+
+        GetPickerCtrlItem()->SetFlag(f);
+    }
 
     bool HasTextCtrl() const
         { return m_text != NULL; }
@@ -64,33 +105,24 @@ public:     // public API
     wxControl *GetPickerCtrl()
         { return m_picker; }
 
-public:     // wxWindow overrides
-
-    void DoSetSizeHints(int minW, int minH,
-                        int maxW = wxDefaultCoord, int maxH = wxDefaultCoord,
-                        int incW = wxDefaultCoord, int incH = wxDefaultCoord );
-
-    void DoSetSize(int x, int y,
-                   int width, int height,
-                   int sizeFlags = wxSIZE_AUTO);
-
-    wxSize DoGetBestSize() const;
-
-
-public:     // methods that derived class must/may override
-
+    // methods that derived class must/may override
     virtual void UpdatePickerFromTextCtrl() = 0;
     virtual void UpdateTextCtrlFromPicker() = 0;
 
-protected:        // utility functions
+protected:
+    // overridden base class methods
+#if wxUSE_TOOLTIPS
+    virtual void DoSetToolTip(wxToolTip *tip);
+#endif // wxUSE_TOOLTIPS
 
-    inline int GetTextCtrlWidth(int given);
 
     // event handlers
     void OnTextCtrlDelete(wxWindowDestroyEvent &);
     void OnTextCtrlUpdate(wxCommandEvent &);
     void OnTextCtrlKillFocus(wxFocusEvent &);
 
+    void OnSize(wxSizeEvent &);
+
     // returns the set of styles for the attached wxTextCtrl
     // from given wxPickerBase's styles
     virtual long GetTextCtrlStyle(long style) const
@@ -100,15 +132,56 @@ protected:        // utility functions
     virtual long GetPickerStyle(long style) const
         { return (style & wxWINDOW_STYLE_MASK); }
 
+
+    wxSizerItem *GetPickerCtrlItem() const
+    {
+        if (this->HasTextCtrl())
+            return m_sizer->GetItem((size_t)1);
+        return m_sizer->GetItem((size_t)0);
+    }
+
+    wxSizerItem *GetTextCtrlItem() const
+    {
+        wxASSERT(this->HasTextCtrl());
+        return m_sizer->GetItem((size_t)0);
+    }
+
+    int GetDefaultPickerCtrlFlag() const
+    {
+        // on macintosh, without additional borders
+        // there's not enough space for focus rect
+        return wxALIGN_CENTER_VERTICAL|wxGROW
+#ifdef __WXMAC__
+            | wxTOP | wxRIGHT | wxBOTTOM
+#endif
+            ;
+    }
+
+    int GetDefaultTextCtrlFlag() const
+    {
+        // on macintosh, without wxALL there's not enough space for focus rect
+        return wxALIGN_CENTER_VERTICAL
+#ifdef __WXMAC__
+            | wxALL
+#else
+            | wxRIGHT
+#endif
+            ;
+    }
+
+    void PostCreation();
+
 protected:
     wxTextCtrl *m_text;     // can be NULL
     wxControl *m_picker;
-
-    int m_margin;           // distance between subcontrols
-    int m_textProportion;   // proportion between textctrl and other item
+    wxBoxSizer *m_sizer;
 
 private:
     DECLARE_ABSTRACT_CLASS(wxPickerBase)
+    DECLARE_EVENT_TABLE()
+
+    // This class must be something just like a panel...
+    WX_DECLARE_CONTROL_CONTAINER();
 };