X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/56873923f39af96aac6bfc5776d2637b8c4623ca..ca77701441e39245dcbfce903049e76f166979e5:/include/wx/headercol.h diff --git a/include/wx/headercol.h b/include/wx/headercol.h index 29a26e5ecc..58736edb02 100644 --- a/include/wx/headercol.h +++ b/include/wx/headercol.h @@ -13,6 +13,8 @@ #include "wx/bitmap.h" +#if wxUSE_HEADERCTRL + // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -20,7 +22,10 @@ enum { // special value for column width meaning unspecified/default - wxCOL_WIDTH_DEFAULT = -1 + wxCOL_WIDTH_DEFAULT = -1, + + // size the column automatically to fit all values + wxCOL_WIDTH_AUTOSIZE = -2 }; // bit masks for the various column attributes @@ -43,11 +48,11 @@ enum }; // ---------------------------------------------------------------------------- -// wxHeaderColumnBase: interface for a column in a header of controls such as -// wxListCtrl, wxDataViewCtrl or wxGrid +// wxHeaderColumn: interface for a column in a header of controls such as +// wxListCtrl, wxDataViewCtrl or wxGrid // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_CORE wxHeaderColumnBase : public wxObject +class WXDLLIMPEXP_CORE wxHeaderColumn { public: // ctors and dtor @@ -67,106 +72,218 @@ public: int flags = wxCOL_DEFAULT_FLAGS); */ + // virtual dtor for the base class to avoid gcc warnings even though we + // don't normally delete the objects of this class via a pointer to + // wxHeaderColumn so it's not necessary, strictly speaking + virtual ~wxHeaderColumn() { } + + // getters for various attributes + // ------------------------------ - // setters and getters for various attributes - // ------------------------------------------ + // notice that wxHeaderColumn only provides getters as this is all the + // wxHeaderCtrl needs, various derived class must also provide some way to + // change these attributes but this can be done either at the column level + // (in which case they should inherit from wxSettableHeaderColumn) or via + // the methods of the main control in which case you don't need setters in + // the column class at all // title is the string shown for this column - virtual void SetTitle(const wxString& title) = 0; virtual wxString GetTitle() const = 0; // bitmap shown (instead of text) in the column header - virtual void SetBitmap(const wxBitmap& bitmap) = 0; virtual wxBitmap GetBitmap() const = 0; \ // width of the column in pixels, can be set to wxCOL_WIDTH_DEFAULT meaning // unspecified/default - virtual void SetWidth(int width) = 0; virtual int GetWidth() const = 0; - // minimal width can be set for resizeable columns to forbid resizing them + // minimal width can be set for resizable columns to forbid resizing them // below the specified size (set to 0 to remove) - virtual void SetMinWidth(int minWidth) = 0; virtual int GetMinWidth() const = 0; // alignment of the text: wxALIGN_CENTRE, wxALIGN_LEFT or wxALIGN_RIGHT - virtual void SetAlignment(wxAlignment align) = 0; virtual wxAlignment GetAlignment() const = 0; - // arbitrary client data associated with the column (currently only - // implemented in MSW because it is used in MSW wxDataViewCtrl - // implementation) - virtual void SetClientData(wxUIntPtr WXUNUSED(data)) - { wxFAIL_MSG("not implemented"); } - virtual wxUIntPtr GetClientData() const - { return 0; } - // flags manipulations: // -------------------- - // notice that while we make Set/GetFlags() pure virtual here and implement - // the individual flags access in terms of them, for some derived classes - // it is more natural to implement access to each flag individually, in - // which case they can use SetIndividualFlags() and GetFromIndividualFlags() - // below to implement Set/GetFlags() + // notice that while we make GetFlags() pure virtual here and implement the + // individual flags access in terms of it, for some derived classes it is + // more natural to implement access to each flag individually, in which + // case they can use our GetFromIndividualFlags() helper below to implement + // GetFlags() - // set or retrieve all column flags at once: combination of wxCOL_XXX - // values above - virtual void SetFlags(int flags) = 0; + // retrieve all column flags at once: combination of wxCOL_XXX values above virtual int GetFlags() const = 0; - // change, set, clear, toggle or test for any individual flag - void ChangeFlag(int flag, bool set); - void SetFlag(int flag); - void ClearFlag(int flag); - void ToggleFlag(int flag); - bool HasFlag(int flag) const { return (GetFlags() & flag) != 0; } // wxCOL_RESIZABLE - virtual void SetResizeable(bool resizeable) - { ChangeFlag(wxCOL_RESIZABLE, resizeable); } virtual bool IsResizeable() const { return HasFlag(wxCOL_RESIZABLE); } // wxCOL_SORTABLE - virtual void SetSortable(bool sortable) - { ChangeFlag(wxCOL_SORTABLE, sortable); } virtual bool IsSortable() const { return HasFlag(wxCOL_SORTABLE); } // wxCOL_REORDERABLE - virtual void SetReorderable(bool reorderable) - { ChangeFlag(wxCOL_REORDERABLE, reorderable); } virtual bool IsReorderable() const { return HasFlag(wxCOL_REORDERABLE); } // wxCOL_HIDDEN - virtual void SetHidden(bool hidden) - { ChangeFlag(wxCOL_HIDDEN, hidden); } virtual bool IsHidden() const { return HasFlag(wxCOL_HIDDEN); } + bool IsShown() const + { return !IsHidden(); } + + + // sorting + // ------- + + // return true if the column is the one currently used for sorting + virtual bool IsSortKey() const = 0; // for sortable columns indicate whether we should sort in ascending or - // descending order + // descending order (this should only be taken into account if IsSortKey()) + virtual bool IsSortOrderAscending() const = 0; + +protected: + // helper for the class overriding IsXXX() + int GetFromIndividualFlags() const; +}; + +// ---------------------------------------------------------------------------- +// wxSettableHeaderColumn: column which allows to change its fields too +// ---------------------------------------------------------------------------- + +class WXDLLIMPEXP_CORE wxSettableHeaderColumn : public wxHeaderColumn +{ +public: + virtual void SetTitle(const wxString& title) = 0; + virtual void SetBitmap(const wxBitmap& bitmap) = 0; + virtual void SetWidth(int width) = 0; + virtual void SetMinWidth(int minWidth) = 0; + virtual void SetAlignment(wxAlignment align) = 0; + + // see comment for wxHeaderColumn::GetFlags() about the relationship + // between SetFlags() and Set{Sortable,Reorderable,...} + + // change, set, clear, toggle or test for any individual flag + virtual void SetFlags(int flags) = 0; + void ChangeFlag(int flag, bool set); + void SetFlag(int flag); + void ClearFlag(int flag); + void ToggleFlag(int flag); + + virtual void SetResizeable(bool resizable) + { ChangeFlag(wxCOL_RESIZABLE, resizable); } + virtual void SetSortable(bool sortable) + { ChangeFlag(wxCOL_SORTABLE, sortable); } + virtual void SetReorderable(bool reorderable) + { ChangeFlag(wxCOL_REORDERABLE, reorderable); } + virtual void SetHidden(bool hidden) + { ChangeFlag(wxCOL_HIDDEN, hidden); } + + // This function can be called to indicate that this column is not used for + // sorting any more. Under some platforms it's not necessary to do anything + // in this case as just setting another column as a sort key takes care of + // everything but under MSW we currently need to call this explicitly to + // reset the sort indicator displayed on the column. + virtual void UnsetAsSortKey() { } + virtual void SetSortOrder(bool ascending) = 0; void ToggleSortOrder() { SetSortOrder(!IsSortOrderAscending()); } - virtual bool IsSortOrderAscending() const = 0; protected: - // helpers for the class overriding Set/IsXXX() + // helper for the class overriding individual SetXXX() methods instead of + // overriding SetFlags() void SetIndividualFlags(int flags); - int GetFromIndividualFlags() const; }; -#if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) - #include "wx/msw/headercol.h" -#else - #define wxHAS_GENERIC_HEADERCOL - #include "wx/generic/headercolg.h" -#endif +// ---------------------------------------------------------------------------- +// wxHeaderColumnSimple: trivial generic implementation of wxHeaderColumn +// ---------------------------------------------------------------------------- + +class wxHeaderColumnSimple : public wxSettableHeaderColumn +{ +public: + // ctors and dtor + wxHeaderColumnSimple(const wxString& title, + int width = wxCOL_WIDTH_DEFAULT, + wxAlignment align = wxALIGN_NOT, + int flags = wxCOL_DEFAULT_FLAGS) + : m_title(title), + m_width(width), + m_align(align), + m_flags(flags) + { + Init(); + } + + wxHeaderColumnSimple(const wxBitmap& bitmap, + int width = wxCOL_WIDTH_DEFAULT, + wxAlignment align = wxALIGN_CENTER, + int flags = wxCOL_DEFAULT_FLAGS) + : m_bitmap(bitmap), + m_width(width), + m_align(align), + m_flags(flags) + { + Init(); + } + + // implement base class pure virtuals + virtual void SetTitle(const wxString& title) { m_title = title; } + virtual wxString GetTitle() const { return m_title; } + + virtual void SetBitmap(const wxBitmap& bitmap) { m_bitmap = bitmap; } + wxBitmap GetBitmap() const { return m_bitmap; } + + virtual void SetWidth(int width) { m_width = width; } + virtual int GetWidth() const { return m_width; } + + virtual void SetMinWidth(int minWidth) { m_minWidth = minWidth; } + virtual int GetMinWidth() const { return m_minWidth; } + + virtual void SetAlignment(wxAlignment align) { m_align = align; } + virtual wxAlignment GetAlignment() const { return m_align; } + + virtual void SetFlags(int flags) { m_flags = flags; } + virtual int GetFlags() const { return m_flags; } + + virtual bool IsSortKey() const { return m_sort; } + virtual void UnsetAsSortKey() { m_sort = false; } + + virtual void SetSortOrder(bool ascending) + { + m_sort = true; + m_sortAscending = ascending; + } + + virtual bool IsSortOrderAscending() const { return m_sortAscending; } + +private: + // common part of all ctors + void Init() + { + m_minWidth = 0; + m_sort = false; + m_sortAscending = true; + } + + wxString m_title; + wxBitmap m_bitmap; + int m_width, + m_minWidth; + wxAlignment m_align; + int m_flags; + bool m_sort, + m_sortAscending; +}; + +#endif // wxUSE_HEADERCTRL #endif // _WX_HEADERCOL_H_