X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1e6feb95a79834836e88143b15d9f424ebe79621..f1a736636c32fa9cda80447c9f17287484ea8094:/include/wx/statusbr.h?ds=sidebyside diff --git a/include/wx/statusbr.h b/include/wx/statusbr.h index 56e9096737..0b286fc7f7 100644 --- a/include/wx/statusbr.h +++ b/include/wx/statusbr.h @@ -5,37 +5,155 @@ // Modified by: // Created: 05.02.00 // RCS-ID: $Id$ -// Copyright: (c) wxWindows team -// Licence: wxWindows license +// Copyright: (c) Vadim Zeitlin +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_STATUSBR_H_BASE_ #define _WX_STATUSBR_H_BASE_ -#include "wx/window.h" +#include "wx/defs.h" #if wxUSE_STATUSBAR +#include "wx/window.h" +#include "wx/list.h" +#include "wx/dynarray.h" + +extern WXDLLIMPEXP_DATA_CORE(const char) wxStatusBarNameStr[]; + // ---------------------------------------------------------------------------- -// wxStatusBar: a window near the bottom of the frame used for status info +// wxStatusBar constants +// ---------------------------------------------------------------------------- + +// wxStatusBar styles +#define wxSTB_SIZEGRIP 0x0010 +#define wxSTB_SHOW_TIPS 0x0020 + +#define wxSTB_ELLIPSIZE_START 0x0040 +#define wxSTB_ELLIPSIZE_MIDDLE 0x0080 +#define wxSTB_ELLIPSIZE_END 0x0100 + +#define wxSTB_DEFAULT_STYLE (wxSTB_SIZEGRIP|wxSTB_ELLIPSIZE_END|wxSTB_SHOW_TIPS|wxFULL_REPAINT_ON_RESIZE) + + +// old compat style name: +#define wxST_SIZEGRIP wxSTB_SIZEGRIP + + +// style flags for wxStatusBar fields +#define wxSB_NORMAL 0x0000 +#define wxSB_FLAT 0x0001 +#define wxSB_RAISED 0x0002 + +// ---------------------------------------------------------------------------- +// wxStatusBarPane: an helper for wxStatusBar // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxStatusBarBase : public wxWindow +class WXDLLIMPEXP_CORE wxStatusBarPane { + // only wxStatusBarBase can access our internal members and modify them: + friend class WXDLLIMPEXP_FWD_CORE wxStatusBarBase; + public: - wxStatusBarBase() { m_statusWidths = NULL; } + wxStatusBarPane(int style = wxSB_NORMAL, size_t width = 0) + : m_nStyle(style), m_nWidth(width) + { m_arrStack.Add(wxEmptyString); m_bEllipsized=false; } + + int GetWidth() const + { return m_nWidth; } + int GetStyle() const + { return m_nStyle; } + + const wxArrayString& GetStack() const + { return m_arrStack; } + + // implementation-only getter: + bool IsEllipsized() const + { return m_bEllipsized; } + + // NOTE: there are no setters in wxStatusBarPane; + // use wxStatusBar functions to modify a wxStatusBarPane - // get/set the number of fields - virtual void SetFieldsCount(int number = 1, - const int *widths = (const int *) NULL) = 0; - int GetFieldsCount() const { return m_nFields; } +protected: + int m_nStyle; + int m_nWidth; // the width maybe negative, indicating a variable-width field + + // this is the array of the stacked strings of this pane; note that this + // stack does include also the string currently displayed in this pane + // as the version stored in the native status bar control is possibly + // ellipsized; note that m_arrStack.Last() is the top of the stack + // (i.e. the string shown in the status bar) + wxArrayString m_arrStack; + + // was the m_arrStack.Last() string shown in the status bar control ellipsized? + bool m_bEllipsized; +}; + +WX_DECLARE_OBJARRAY(wxStatusBarPane, wxStatusBarPaneArray); - // get/set the text of the given field - virtual void SetStatusText(const wxString& text, int number = 0) = 0; - virtual wxString GetStatusText(int number = 0) const = 0; +// ---------------------------------------------------------------------------- +// wxStatusBar: a window near the bottom of the frame used for status info +// ---------------------------------------------------------------------------- - // set status line widths (n should be the same as field count) - virtual void SetStatusWidths(int n, const int widths[]) = 0; +class WXDLLIMPEXP_CORE wxStatusBarBase : public wxWindow +{ +public: + wxStatusBarBase(); + + virtual ~wxStatusBarBase(); + + // field count + // ----------- + + // set the number of fields and call SetStatusWidths(widths) if widths are + // given + virtual void SetFieldsCount(int number = 1, const int *widths = NULL); + int GetFieldsCount() const { return m_panes.GetCount(); } + + // field text + // ---------- + + // NOTE: even if it is not pure virtual, SetStatusText() must be overloaded by + // the derived classes to update the given text in the native control + virtual void SetStatusText(const wxString& text, int number = 0) + { m_panes[number].GetStack().Last() = text; } + virtual wxString GetStatusText(int number = 0) const + { return m_panes[number].GetStack().Last(); } + const wxArrayString& GetStatusStack(int n) const + { return m_panes[n].GetStack(); } + + void PushStatusText(const wxString& text, int number = 0); + void PopStatusText(int number = 0); + + // fields widths + // ------------- + + // set status field widths as absolute numbers: positive widths mean that + // the field has the specified absolute width, negative widths are + // interpreted as the sizer options, i.e. the extra space (total space + // minus the sum of fixed width fields) is divided between the fields with + // negative width according to the abs value of the width (field with width + // -2 grows twice as much as one with width -1 &c) + virtual void SetStatusWidths(int n, const int widths[]); + + int GetStatusWidth(int n) const + { return m_panes[n].GetWidth(); } + + // field styles + // ------------ + + // Set the field style. Use either wxSB_NORMAL (default) for a standard 3D + // border around a field, wxSB_FLAT for no border around a field, so that it + // appears flat or wxSB_POPOUT to make the field appear raised. + // Setting field styles only works on wxMSW + virtual void SetStatusStyles(int n, const int styles[]); + + int GetStatusStyle(int n) const + { return m_panes[n].GetStyle(); } + + // geometry + // -------- // Get the position and size of the field's internal bounding rectangle virtual bool GetFieldRect(int i, wxRect& rect) const = 0; @@ -46,59 +164,81 @@ public: // get the dimensions of the horizontal and vertical borders virtual int GetBorderX() const = 0; virtual int GetBorderY() const = 0; - + + wxSize GetBorders() const + { return wxSize(GetBorderX(), GetBorderY()); } + + // miscellaneous + // ------------- + + const wxStatusBarPane& GetField(int n) const + { return m_panes[n]; } + + // wxWindow overrides: + // don't want status bars to accept the focus at all - virtual bool AcceptsFocus() const { return FALSE; } + virtual bool AcceptsFocus() const { return false; } + + // the client size of a toplevel window doesn't include the status bar + virtual bool CanBeOutsideClientArea() const { return true; } protected: - int m_nFields; // the current number of fields - int *m_statusWidths; // the width (if !NULL) of the fields + + // wxWindow overrides: + +#if wxUSE_TOOLTIPS + virtual void DoSetToolTip( wxToolTip *tip ) + { + wxASSERT_MSG(!HasFlag(wxSTB_SHOW_TIPS), + "Do not set tooltip(s) manually when using wxSTB_SHOW_TIPS!"); + wxWindow::DoSetToolTip(tip); + } +#endif + + virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; } + + + // internal helpers & data: + + // calculate the real field widths for the given total available size + wxArrayInt CalculateAbsWidths(wxCoord widthTotal) const; + + // an internal utility used to keep track of which panes have labels + // which were last rendered as ellipsized... + void SetEllipsizedFlag(int n, bool ellipsized) + { m_panes[n].m_bEllipsized = ellipsized; } + + // the array with the pane infos: + wxStatusBarPaneArray m_panes; + + // if true overrides the width info of the wxStatusBarPanes + bool m_bSameWidthForAllPanes; + + wxDECLARE_NO_COPY_CLASS(wxStatusBarBase); }; -#if defined(__WIN32__) && wxUSE_NATIVE_STATUSBAR - #include "wx/msw/statbr95.h" +// ---------------------------------------------------------------------------- +// include the actual wxStatusBar class declaration +// ---------------------------------------------------------------------------- - typedef wxStatusBar95 wxStatusBarReal; +#if defined(__WXUNIVERSAL__) + #define wxStatusBarUniv wxStatusBar + #include "wx/univ/statusbr.h" +#elif defined(__WXPALMOS__) + #define wxStatusBarPalm wxStatusBar + #include "wx/palmos/statusbr.h" +#elif defined(__WIN32__) && wxUSE_NATIVE_STATUSBAR + #include "wx/msw/statusbar.h" #elif defined(__WXMAC__) + #define wxStatusBarMac wxStatusBar #include "wx/generic/statusbr.h" - #include "wx/mac/statusbr.h" - - typedef wxStatusBarMac wxStatusBarReal; + #include "wx/osx/statusbr.h" #else + #define wxStatusBarGeneric wxStatusBar #include "wx/generic/statusbr.h" - - typedef wxStatusBarGeneric wxStatusBarReal; #endif -// we can't just typedef wxStatusBar to be one of 95/Generic because we should -// be able to forward declare it (done in several places) and because wxWin -// RTTI wouldn't work then -class WXDLLEXPORT wxStatusBar : public wxStatusBarReal -{ -public: - wxStatusBar() { } - wxStatusBar(wxWindow *parent, - wxWindowID id, - const wxPoint& WXUNUSED(pos) = wxDefaultPosition, - const wxSize& WXUNUSED(size) = wxDefaultSize, - long style = wxST_SIZEGRIP, - const wxString& name = wxPanelNameStr) - { - Create(parent, id, style, name); - } - wxStatusBar(wxWindow *parent, - wxWindowID id, - long style, - const wxString& name = wxPanelNameStr) - { - Create(parent, id, style, name); - } - -private: - DECLARE_DYNAMIC_CLASS(wxStatusBar) -}; - -#endif +#endif // wxUSE_STATUSBAR #endif // _WX_STATUSBR_H_BASE_