6cf6897100
Calls to SetStatusText() in between Push/PopStatusText() were simply lost before, now the text explicitly changed by SetStatusText() is preserved by the next call to PopStatusText(). This required adding a new virtual method, called DoUpdateStatusText(), which is now implemented in all the derived classes instead of overriding SetStatusText() (on the bright side, it doesn't need to do any checks already done in the base class any more). Also fix PushStatusText() to actually show the text being pushed at all under wxMSW as a side effect. And further reduce code duplication between wxStatusBarBase and the derived classes. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61624 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
255 lines
8.1 KiB
C++
255 lines
8.1 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: wx/statusbr.h
|
|
// Purpose: wxStatusBar class interface
|
|
// Author: Vadim Zeitlin
|
|
// Modified by:
|
|
// Created: 05.02.00
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) Vadim Zeitlin
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _WX_STATUSBR_H_BASE_
|
|
#define _WX_STATUSBR_H_BASE_
|
|
|
|
#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 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 WXDLLIMPEXP_CORE wxStatusBarPane
|
|
{
|
|
public:
|
|
wxStatusBarPane(int style = wxSB_NORMAL, size_t width = 0)
|
|
: m_nStyle(style), m_nWidth(width)
|
|
{ m_bEllipsized = false; }
|
|
|
|
int GetWidth() const { return m_nWidth; }
|
|
int GetStyle() const { return m_nStyle; }
|
|
wxString GetText() const { return m_text; }
|
|
|
|
|
|
// implementation-only from now on
|
|
// -------------------------------
|
|
|
|
bool IsEllipsized() const
|
|
{ return m_bEllipsized; }
|
|
void SetIsEllipsized(bool isEllipsized) { m_bEllipsized = isEllipsized; }
|
|
|
|
void SetWidth(int width) { m_nWidth = width; }
|
|
void SetStyle(int style) { m_nStyle = style; }
|
|
|
|
// set text, return true if it changed or false if it was already set to
|
|
// this value
|
|
bool SetText(const wxString& text);
|
|
|
|
// save the existing text on top of our stack and make the new text
|
|
// current; return true if the text really changed
|
|
bool PushText(const wxString& text);
|
|
|
|
// restore the message saved by the last call to Push() (unless it was
|
|
// changed by an intervening call to SetText()) and return true if we
|
|
// really restored anything
|
|
bool PopText();
|
|
|
|
private:
|
|
int m_nStyle;
|
|
int m_nWidth; // may be negative, indicating a variable-width field
|
|
wxString m_text;
|
|
|
|
// the array used to keep the previous values of this pane after a
|
|
// PushStatusText() call, its top element is the value to restore after the
|
|
// next PopStatusText() call while the currently shown value is always in
|
|
// m_text
|
|
wxArrayString m_arrStack;
|
|
|
|
// is the currently shown value shown with ellipsis in the status bar?
|
|
bool m_bEllipsized;
|
|
};
|
|
|
|
WX_DECLARE_EXPORTED_OBJARRAY(wxStatusBarPane, wxStatusBarPaneArray);
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxStatusBar: a window near the bottom of the frame used for status info
|
|
// ----------------------------------------------------------------------------
|
|
|
|
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
|
|
// ----------
|
|
|
|
// just change or get the currently shown text
|
|
void SetStatusText(const wxString& text, int number = 0);
|
|
wxString GetStatusText(int number = 0) const;
|
|
|
|
// change the currently shown text to the new one and save the current
|
|
// value to be restored by the next call to PopStatusText()
|
|
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;
|
|
|
|
// sets the minimal vertical size of the status bar
|
|
virtual void SetMinHeight(int height) = 0;
|
|
|
|
// 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; }
|
|
|
|
// the client size of a toplevel window doesn't include the status bar
|
|
virtual bool CanBeOutsideClientArea() const { return true; }
|
|
|
|
protected:
|
|
// called after the status bar pane text changed and should update its
|
|
// display
|
|
virtual void DoUpdateStatusText(int number) = 0;
|
|
|
|
|
|
// 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 // wxUSE_TOOLTIPS
|
|
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;
|
|
|
|
// should be called to remember if the pane text is currently being show
|
|
// ellipsized or not
|
|
void SetEllipsizedFlag(int n, bool isEllipsized);
|
|
|
|
|
|
// 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);
|
|
};
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// include the actual wxStatusBar class declaration
|
|
// ----------------------------------------------------------------------------
|
|
|
|
#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/osx/statusbr.h"
|
|
#else
|
|
#define wxStatusBarGeneric wxStatusBar
|
|
#include "wx/generic/statusbr.h"
|
|
#endif
|
|
|
|
#endif // wxUSE_STATUSBAR
|
|
|
|
#endif
|
|
// _WX_STATUSBR_H_BASE_
|