use wxSTB_ as prefix for wxStatusBar styles; add support for wxSTB_ELLIPSIZE_* flags under wxGTK; support wxSTB_SHOW_TIPS even if no ellipsization mode is active; update the sample to allow the user to choose the wxStatusBar style dynamically

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@60337 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Francesco Montorsi
2009-04-25 12:59:09 +00:00
parent 97d13342cc
commit c4c178c10d
20 changed files with 303 additions and 156 deletions

View File

@@ -86,7 +86,7 @@ public:
// create the main status bar by calling OnCreateStatusBar() // create the main status bar by calling OnCreateStatusBar()
virtual wxStatusBar* CreateStatusBar(int number = 1, virtual wxStatusBar* CreateStatusBar(int number = 1,
long style = wxST_SIZEGRIP, long style = wxSTB_DEFAULT_STYLE,
wxWindowID winid = 0, wxWindowID winid = 0,
const wxString& name = const wxString& name =
wxStatusLineNameStr); wxStatusLineNameStr);

View File

@@ -104,7 +104,7 @@ public:
#if wxUSE_STATUSBAR #if wxUSE_STATUSBAR
// create the main status bar by calling OnCreateStatusBar() // create the main status bar by calling OnCreateStatusBar()
virtual wxStatusBar* CreateStatusBar(int number = 1, virtual wxStatusBar* CreateStatusBar(int number = 1,
long style = wxST_DEFAULT_STYLE, long style = wxSTB_DEFAULT_STYLE,
wxWindowID winid = 0, wxWindowID winid = 0,
const wxString& name = wxStatusLineNameStr); const wxString& name = wxStatusLineNameStr);
// return a new status bar // return a new status bar

View File

@@ -30,7 +30,7 @@ public:
wxStatusBarGeneric() { Init(); } wxStatusBarGeneric() { Init(); }
wxStatusBarGeneric(wxWindow *parent, wxStatusBarGeneric(wxWindow *parent,
wxWindowID winid = wxID_ANY, wxWindowID winid = wxID_ANY,
long style = wxST_DEFAULT_STYLE, long style = wxSTB_DEFAULT_STYLE,
const wxString& name = wxStatusBarNameStr) const wxString& name = wxStatusBarNameStr)
{ {
Init(); Init();
@@ -41,7 +41,7 @@ public:
virtual ~wxStatusBarGeneric(); virtual ~wxStatusBarGeneric();
bool Create(wxWindow *parent, wxWindowID winid = wxID_ANY, bool Create(wxWindow *parent, wxWindowID winid = wxID_ANY,
long style = wxST_DEFAULT_STYLE, long style = wxSTB_DEFAULT_STYLE,
const wxString& name = wxStatusBarNameStr); const wxString& name = wxStatusBarNameStr);
// Create status line // Create status line
@@ -90,7 +90,7 @@ protected:
virtual void InitColours(); virtual void InitColours();
// true if the status bar shows the size grip: for this it must have // true if the status bar shows the size grip: for this it must have
// wxST_SIZEGRIP style and the window it is attached to must be resizeable // wxSTB_SIZEGRIP style and the window it is attached to must be resizeable
// and not maximized // and not maximized
bool ShowsSizeGrip() const; bool ShowsSizeGrip() const;

View File

@@ -57,7 +57,7 @@ public:
virtual void PositionStatusBar(); virtual void PositionStatusBar();
virtual wxStatusBar* CreateStatusBar(int number = 1, virtual wxStatusBar* CreateStatusBar(int number = 1,
long style = wxST_SIZEGRIP|wxFULL_REPAINT_ON_RESIZE, long style = wxSTB_DEFAULT_STYLE,
wxWindowID id = 0, wxWindowID id = 0,
const wxString& name = wxStatusLineNameStr); const wxString& name = wxStatusLineNameStr);

View File

@@ -60,7 +60,7 @@ public:
// Status bar // Status bar
#if wxUSE_STATUSBAR #if wxUSE_STATUSBAR
virtual wxStatusBar* OnCreateStatusBar(int number = 1, virtual wxStatusBar* OnCreateStatusBar(int number = 1,
long style = wxST_SIZEGRIP, long style = wxSTB_DEFAULT_STYLE,
wxWindowID id = 0, wxWindowID id = 0,
const wxString& name = wxStatusLineNameStr); const wxString& name = wxStatusLineNameStr);

View File

@@ -23,7 +23,7 @@ public:
wxStatusBar(); wxStatusBar();
wxStatusBar(wxWindow *parent, wxStatusBar(wxWindow *parent,
wxWindowID id = wxID_ANY, wxWindowID id = wxID_ANY,
long style = wxST_DEFAULT_STYLE, long style = wxSTB_DEFAULT_STYLE,
const wxString& name = wxStatusBarNameStr) const wxString& name = wxStatusBarNameStr)
{ {
m_pDC = NULL; m_pDC = NULL;
@@ -32,7 +32,7 @@ public:
bool Create(wxWindow *parent, bool Create(wxWindow *parent,
wxWindowID id = wxID_ANY, wxWindowID id = wxID_ANY,
long style = wxST_DEFAULT_STYLE, long style = wxSTB_DEFAULT_STYLE,
const wxString& name = wxStatusBarNameStr); const wxString& name = wxStatusBarNameStr);
virtual ~wxStatusBar(); virtual ~wxStatusBar();

View File

@@ -81,7 +81,7 @@ public:
// Status bar // Status bar
#if wxUSE_STATUSBAR #if wxUSE_STATUSBAR
virtual wxStatusBar* OnCreateStatusBar( int nNumber = 1 virtual wxStatusBar* OnCreateStatusBar( int nNumber = 1
,long lStyle = wxST_SIZEGRIP ,long lStyle = wxSTB_DEFAULT_STYLE
,wxWindowID vId = 0 ,wxWindowID vId = 0
,const wxString& rsName = wxStatusLineNameStr ,const wxString& rsName = wxStatusLineNameStr
); );

View File

@@ -77,7 +77,7 @@ public:
// Status bar // Status bar
#if wxUSE_STATUSBAR #if wxUSE_STATUSBAR
virtual wxStatusBar* OnCreateStatusBar(int number = 1, virtual wxStatusBar* OnCreateStatusBar(int number = 1,
long style = wxST_SIZEGRIP, long style = wxSTB_DEFAULT_STYLE,
wxWindowID id = 0, wxWindowID id = 0,
const wxString& name = wxStatusLineNameStr); const wxString& name = wxStatusLineNameStr);
#endif // wxUSE_STATUSBAR #endif // wxUSE_STATUSBAR

View File

@@ -19,13 +19,13 @@ class WXDLLIMPEXP_CORE wxStatusBarMac : public wxStatusBarGeneric
wxStatusBarMac(); wxStatusBarMac();
wxStatusBarMac(wxWindow *parent, wxWindowID id = wxID_ANY, wxStatusBarMac(wxWindow *parent, wxWindowID id = wxID_ANY,
long style = wxST_DEFAULT_STYLE, long style = wxSTB_DEFAULT_STYLE,
const wxString& name = wxStatusBarNameStr); const wxString& name = wxStatusBarNameStr);
virtual ~wxStatusBarMac(); virtual ~wxStatusBarMac();
bool Create(wxWindow *parent, wxWindowID id = wxID_ANY, bool Create(wxWindow *parent, wxWindowID id = wxID_ANY,
long style = wxST_DEFAULT_STYLE, long style = wxSTB_DEFAULT_STYLE,
const wxString& name = wxStatusBarNameStr); const wxString& name = wxStatusBarNameStr);
virtual void DrawFieldText(wxDC& dc, const wxRect& rc, int i, int textHeight); virtual void DrawFieldText(wxDC& dc, const wxRect& rc, int i, int textHeight);

View File

@@ -21,7 +21,7 @@ public:
wxStatusBarPalm(); wxStatusBarPalm();
wxStatusBarPalm(wxWindow *parent, wxStatusBarPalm(wxWindow *parent,
wxWindowID id = wxID_ANY, wxWindowID id = wxID_ANY,
long style = wxST_DEFAULT_STYLE, long style = wxSTB_DEFAULT_STYLE,
const wxString& name = wxEmptyString) const wxString& name = wxEmptyString)
{ {
(void)Create(parent, id, style, name); (void)Create(parent, id, style, name);
@@ -29,7 +29,7 @@ public:
bool Create(wxWindow *parent, bool Create(wxWindow *parent,
wxWindowID id = wxID_ANY, wxWindowID id = wxID_ANY,
long style = wxST_DEFAULT_STYLE, long style = wxSTB_DEFAULT_STYLE,
const wxString& name = wxEmptyString); const wxString& name = wxEmptyString);
virtual ~wxStatusBarPalm(); virtual ~wxStatusBarPalm();

View File

@@ -27,12 +27,21 @@ extern WXDLLIMPEXP_DATA_CORE(const char) wxStatusBarNameStr[];
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxStatusBar styles // wxStatusBar styles
#define wxST_SIZEGRIP 0x0010 #define wxSTB_SIZEGRIP 0x0010
#define wxST_SHOW_TIPS 0x0020 #define wxSTB_SHOW_TIPS 0x0020
#define wxST_DEFAULT_STYLE (wxST_SIZEGRIP|wxST_SHOW_TIPS|wxFULL_REPAINT_ON_RESIZE) #define wxSTB_ELLIPSIZE_START 0x0040
#define wxSTB_ELLIPSIZE_MIDDLE 0x0080
#define wxSTB_ELLIPSIZE_END 0x0100
// style flags for fields #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_NORMAL 0x0000
#define wxSB_FLAT 0x0001 #define wxSB_FLAT 0x0001
#define wxSB_RAISED 0x0002 #define wxSB_RAISED 0x0002

View File

@@ -44,7 +44,7 @@ public:
#if wxUSE_STATUSBAR #if wxUSE_STATUSBAR
virtual wxStatusBar* CreateStatusBar(int number = 1, virtual wxStatusBar* CreateStatusBar(int number = 1,
long style = wxST_SIZEGRIP, long style = wxSTB_DEFAULT_STYLE,
wxWindowID id = 0, wxWindowID id = 0,
const wxString& name = wxStatusLineNameStr); const wxString& name = wxStatusLineNameStr);
#endif // wxUSE_STATUSBAR #endif // wxUSE_STATUSBAR

View File

@@ -20,14 +20,14 @@
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
class WXDLLIMPEXP_CORE wxStatusBarUniv : public wxStatusBarBase, class WXDLLIMPEXP_CORE wxStatusBarUniv : public wxStatusBarBase,
public wxInputConsumer public wxInputConsumer
{ {
public: public:
wxStatusBarUniv() { Init(); } wxStatusBarUniv() { Init(); }
wxStatusBarUniv(wxWindow *parent, wxStatusBarUniv(wxWindow *parent,
wxWindowID id = wxID_ANY, wxWindowID id = wxID_ANY,
long style = wxST_DEFAULT_STYLE, long style = wxSTB_DEFAULT_STYLE,
const wxString& name = wxPanelNameStr) const wxString& name = wxPanelNameStr)
{ {
Init(); Init();
@@ -37,7 +37,7 @@ public:
bool Create(wxWindow *parent, bool Create(wxWindow *parent,
wxWindowID id = wxID_ANY, wxWindowID id = wxID_ANY,
long style = wxST_DEFAULT_STYLE, long style = wxSTB_DEFAULT_STYLE,
const wxString& name = wxPanelNameStr); const wxString& name = wxPanelNameStr);
// set field count/widths // set field count/widths

View File

@@ -222,7 +222,7 @@ public:
@see SetStatusText(), OnCreateStatusBar(), GetStatusBar() @see SetStatusText(), OnCreateStatusBar(), GetStatusBar()
*/ */
virtual wxStatusBar* CreateStatusBar(int number = 1, long style = wxST_SIZEGRIP|wxFULL_REPAINT_ON_RESIZE, virtual wxStatusBar* CreateStatusBar(int number = 1, long style = wxSTB_DEFAULT_STYLE,
wxWindowID id = 0, wxWindowID id = 0,
const wxString& name = wxStatusLineNameStr); const wxString& name = wxStatusLineNameStr);
@@ -373,6 +373,9 @@ public:
/** /**
Associates a status bar with the frame. Associates a status bar with the frame.
If @a statusBar is @NULL, then the status bar, if present, is detached from
the frame, but @e not deleted.
@see CreateStatusBar(), wxStatusBar, GetStatusBar() @see CreateStatusBar(), wxStatusBar, GetStatusBar()
*/ */
virtual void SetStatusBar(wxStatusBar* statusBar); virtual void SetStatusBar(wxStatusBar* statusBar);

View File

@@ -59,15 +59,25 @@ public:
Note that in wxStatusBar context, the terms @e pane and @e field are synonyms. Note that in wxStatusBar context, the terms @e pane and @e field are synonyms.
@beginStyleTable @beginStyleTable
@style{wxST_SIZEGRIP} @style{wxSTB_SIZEGRIP}
Displays a gripper at the right-hand side of the status bar which can be used Displays a gripper at the right-hand side of the status bar which can be used
to resize the parent window. to resize the parent window.
@style{wxST_SHOW_TIPS} @style{wxSTB_SHOW_TIPS}
Displays tooltips for those panes whose status text has been ellipsized because Displays tooltips for those panes whose status text has been ellipsized/truncated
the status text doesn't fit the pane width. because the status text doesn't fit the pane width.
Note that this style has effect only on wxGTK (with GTK+ >= 2.12) currently. Note that this style has effect only on wxGTK (with GTK+ >= 2.12) currently.
@style{wxST_DEFAULT_STYLE} @style{wxSTB_ELLIPSIZE_START}
The default style: includes @c wxST_SIZEGRIP|wxST_SHOW_TIPS|wxFULL_REPAINT_ON_RESIZE. Replace the beginning of the status texts with an ellipsis when the status text
widths exceed the status bar pane's widths (uses wxControl::Ellipsize).
@style{wxSTB_ELLIPSIZE_MIDDLE}
Replace the middle of the status texts with an ellipsis when the status text
widths exceed the status bar pane's widths (uses wxControl::Ellipsize).
@style{wxSTB_ELLIPSIZE_END}
Replace the end of the status texts with an ellipsis when the status text
widths exceed the status bar pane's widths (uses wxControl::Ellipsize).
@style{wxSTB_DEFAULT_STYLE}
The default style: includes
@c wxSTB_SIZEGRIP|wxSTB_SHOW_TIPS|wxSTB_ELLIPSIZE_END|wxFULL_REPAINT_ON_RESIZE.
@endStyleTable @endStyleTable
@remarks @remarks
@@ -105,7 +115,7 @@ public:
@see Create() @see Create()
*/ */
wxStatusBar(wxWindow* parent, wxWindowID id = wxID_ANY, wxStatusBar(wxWindow* parent, wxWindowID id = wxID_ANY,
long style = wxST_DEFAULT_STYLE, long style = wxSTB_DEFAULT_STYLE,
const wxString& name = wxStatusBarNameStr); const wxString& name = wxStatusBarNameStr);
/** /**
@@ -118,7 +128,7 @@ public:
See wxStatusBar() for details. See wxStatusBar() for details.
*/ */
bool Create(wxWindow* parent, wxWindowID id = wxID_ANY, bool Create(wxWindow* parent, wxWindowID id = wxID_ANY,
long style = wxST_DEFAULT_STYLE, long style = wxSTB_DEFAULT_STYLE,
const wxString& name = wxStatusBarNameStr); const wxString& name = wxStatusBarNameStr);
/** /**
@@ -233,11 +243,11 @@ public:
The number of fields in the status bar. Must be equal to the The number of fields in the status bar. Must be equal to the
number passed to SetFieldsCount() the last time it was called. number passed to SetFieldsCount() the last time it was called.
@param styles @param styles
Contains an array of n integers with the styles for each field. There Contains an array of @a n integers with the styles for each field.
are three possible styles: There are three possible styles:
- wxSB_NORMAL (default): The field appears sunken with a standard 3D border. - @c wxSB_NORMAL (default): The field appears sunken with a standard 3D border.
- wxSB_FLAT: No border is painted around the field so that it appears flat. - @c wxSB_FLAT: No border is painted around the field so that it appears flat.
- wxSB_RAISED: A raised 3D border is painted around the field. - @c wxSB_RAISED: A raised 3D border is painted around the field.
*/ */
virtual void SetStatusStyles(int n, const int* styles); virtual void SetStatusStyles(int n, const int* styles);

View File

@@ -98,7 +98,7 @@ public:
class MyStatusBar : public wxStatusBar class MyStatusBar : public wxStatusBar
{ {
public: public:
MyStatusBar(wxWindow *parent); MyStatusBar(wxWindow *parent, long style = wxSTB_DEFAULT_STYLE);
virtual ~MyStatusBar(); virtual ~MyStatusBar();
void UpdateClock(); void UpdateClock();
@@ -163,12 +163,12 @@ class MyFrame : public wxMDIParentFrame
void OnSetStatusTexts(wxCommandEvent& event); void OnSetStatusTexts(wxCommandEvent& event);
void OnSetStatusFont(wxCommandEvent& event); void OnSetStatusFont(wxCommandEvent& event);
void OnRecreateStatusBar(wxCommandEvent& event); void OnRecreateStatusBar(wxCommandEvent& event);
void OnSetStyleNormal(wxCommandEvent& event);
void OnSetStyleFlat(wxCommandEvent& event); void OnSetPaneStyle(wxCommandEvent& event);
void OnSetStyleRaised(wxCommandEvent& event); void OnSetStyle(wxCommandEvent& event);
private: private:
enum StatBarKind enum StatusBarKind
{ {
StatBar_Default, StatBar_Default,
StatBar_Custom, StatBar_Custom,
@@ -178,17 +178,13 @@ private:
void OnUpdateForDefaultStatusbar(wxUpdateUIEvent& event); void OnUpdateForDefaultStatusbar(wxUpdateUIEvent& event);
void OnUpdateStatusBarToggle(wxUpdateUIEvent& event); void OnUpdateStatusBarToggle(wxUpdateUIEvent& event);
void OnUpdateSetStyleNormal(wxUpdateUIEvent& event); void OnUpdateSetPaneStyle(wxUpdateUIEvent& event);
void OnUpdateSetStyleFlat(wxUpdateUIEvent& event); void OnUpdateSetStyle(wxUpdateUIEvent& event);
void OnUpdateSetStyleRaised(wxUpdateUIEvent& event);
void OnStatusBarToggle(wxCommandEvent& event); void OnStatusBarToggle(wxCommandEvent& event);
void DoCreateStatusBar(StatBarKind kind); void DoCreateStatusBar(StatusBarKind kind, long style);
void ApplyStyle(); void ApplyPaneStyle();
wxStatusBar *m_statbarDefault; int m_statbarPaneStyle;
MyStatusBar *m_statbarCustom;
int m_statbarStyle;
// any class wishing to process wxWidgets events must use this macro // any class wishing to process wxWidgets events must use this macro
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
@@ -209,21 +205,27 @@ public:
enum enum
{ {
// menu items // menu items
StatusBar_Quit = 1, StatusBar_Quit = wxID_EXIT,
StatusBar_About = wxID_ABOUT,
StatusBar_SetFields,
StatusBar_SetFields = wxID_HIGHEST+1,
StatusBar_SetTexts, StatusBar_SetTexts,
StatusBar_SetFont, StatusBar_SetFont,
StatusBar_ResetFieldsWidth, StatusBar_ResetFieldsWidth,
StatusBar_Recreate, StatusBar_Recreate,
StatusBar_About,
StatusBar_Toggle, StatusBar_Toggle,
StatusBar_Checkbox = 1000, StatusBar_Checkbox,
StatusBar_SetStyle, StatusBar_SetPaneStyle,
StatusBar_SetStyleNormal, StatusBar_SetPaneStyleNormal,
StatusBar_SetStyleFlat, StatusBar_SetPaneStyleFlat,
StatusBar_SetStyleRaised StatusBar_SetPaneStyleRaised,
StatusBar_SetStyleSizeGrip,
StatusBar_SetStyleEllipsizeStart,
StatusBar_SetStyleEllipsizeMiddle,
StatusBar_SetStyleEllipsizeEnd,
StatusBar_SetStyleShowTips
}; };
static const int BITMAP_SIZE_X = 32; static const int BITMAP_SIZE_X = 32;
@@ -249,16 +251,23 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(StatusBar_Recreate, MyFrame::OnRecreateStatusBar) EVT_MENU(StatusBar_Recreate, MyFrame::OnRecreateStatusBar)
EVT_MENU(StatusBar_About, MyFrame::OnAbout) EVT_MENU(StatusBar_About, MyFrame::OnAbout)
EVT_MENU(StatusBar_Toggle, MyFrame::OnStatusBarToggle) EVT_MENU(StatusBar_Toggle, MyFrame::OnStatusBarToggle)
EVT_MENU(StatusBar_SetStyleNormal, MyFrame::OnSetStyleNormal) EVT_MENU(StatusBar_SetPaneStyleNormal, MyFrame::OnSetPaneStyle)
EVT_MENU(StatusBar_SetStyleFlat, MyFrame::OnSetStyleFlat) EVT_MENU(StatusBar_SetPaneStyleFlat, MyFrame::OnSetPaneStyle)
EVT_MENU(StatusBar_SetStyleRaised, MyFrame::OnSetStyleRaised) EVT_MENU(StatusBar_SetPaneStyleRaised, MyFrame::OnSetPaneStyle)
EVT_MENU(StatusBar_SetStyleSizeGrip, MyFrame::OnSetStyle)
EVT_MENU(StatusBar_SetStyleEllipsizeStart, MyFrame::OnSetStyle)
EVT_MENU(StatusBar_SetStyleEllipsizeMiddle, MyFrame::OnSetStyle)
EVT_MENU(StatusBar_SetStyleEllipsizeEnd, MyFrame::OnSetStyle)
EVT_MENU(StatusBar_SetStyleShowTips, MyFrame::OnSetStyle)
EVT_UPDATE_UI_RANGE(StatusBar_SetFields, StatusBar_ResetFieldsWidth, EVT_UPDATE_UI_RANGE(StatusBar_SetFields, StatusBar_ResetFieldsWidth,
MyFrame::OnUpdateForDefaultStatusbar) MyFrame::OnUpdateForDefaultStatusbar)
EVT_UPDATE_UI(StatusBar_Toggle, MyFrame::OnUpdateStatusBarToggle) EVT_UPDATE_UI(StatusBar_Toggle, MyFrame::OnUpdateStatusBarToggle)
EVT_UPDATE_UI(StatusBar_SetStyleNormal, MyFrame::OnUpdateSetStyleNormal) EVT_UPDATE_UI_RANGE(StatusBar_SetPaneStyleNormal, StatusBar_SetPaneStyleRaised,
EVT_UPDATE_UI(StatusBar_SetStyleFlat, MyFrame::OnUpdateSetStyleFlat) MyFrame::OnUpdateSetPaneStyle)
EVT_UPDATE_UI(StatusBar_SetStyleRaised, MyFrame::OnUpdateSetStyleRaised) EVT_UPDATE_UI_RANGE(StatusBar_SetStyleSizeGrip, StatusBar_SetStyleShowTips,
MyFrame::OnUpdateSetStyle)
END_EVENT_TABLE() END_EVENT_TABLE()
BEGIN_EVENT_TABLE(MyStatusBar, wxStatusBar) BEGIN_EVENT_TABLE(MyStatusBar, wxStatusBar)
@@ -321,10 +330,7 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
{ {
SetIcon(wxICON(sample)); SetIcon(wxICON(sample));
m_statbarDefault = NULL; m_statbarPaneStyle = wxSB_NORMAL;
m_statbarCustom = NULL;
m_statbarStyle = wxSB_NORMAL;
#ifdef __WXMAC__ #ifdef __WXMAC__
// we need this in order to allow the about menu relocation, since ABOUT is // we need this in order to allow the about menu relocation, since ABOUT is
@@ -337,6 +343,17 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
menuFile->Append(StatusBar_Quit, _T("E&xit\tAlt-X"), _T("Quit this program")); menuFile->Append(StatusBar_Quit, _T("E&xit\tAlt-X"), _T("Quit this program"));
wxMenu *statbarMenu = new wxMenu; wxMenu *statbarMenu = new wxMenu;
wxMenu *statbarStyleMenu = new wxMenu;
statbarStyleMenu->Append(StatusBar_SetStyleSizeGrip, _T("wxSTB_SIZE_GRIP"), _T("Toggles the wxSTB_SIZE_GRIP style"), true);
statbarStyleMenu->Append(StatusBar_SetStyleShowTips, _T("wxSTB_SHOW_TIPS"), _T("Toggles the wxSTB_SHOW_TIPS style"), true);
statbarStyleMenu->AppendSeparator();
statbarStyleMenu->Append(StatusBar_SetStyleEllipsizeStart, _T("wxSTB_ELLIPSIZE_START"), _T("Toggles the wxSTB_ELLIPSIZE_START style"), true);
statbarStyleMenu->Append(StatusBar_SetStyleEllipsizeMiddle, _T("wxSTB_ELLIPSIZE_MIDDLE"), _T("Toggles the wxSTB_ELLIPSIZE_MIDDLE style"), true);
statbarStyleMenu->Append(StatusBar_SetStyleEllipsizeEnd, _T("wxSTB_ELLIPSIZE_END"), _T("Toggles the wxSTB_ELLIPSIZE_END style"), true);
statbarMenu->Append(StatusBar_SetPaneStyle, _T("Status bar style"), statbarStyleMenu);
statbarMenu->AppendSeparator();
statbarMenu->Append(StatusBar_SetFields, _T("&Set field count\tCtrl-C"), statbarMenu->Append(StatusBar_SetFields, _T("&Set field count\tCtrl-C"),
_T("Set the number of status bar fields")); _T("Set the number of status bar fields"));
statbarMenu->Append(StatusBar_SetTexts, _T("&Set field text\tCtrl-T"), statbarMenu->Append(StatusBar_SetTexts, _T("&Set field text\tCtrl-T"),
@@ -344,12 +361,11 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
statbarMenu->Append(StatusBar_SetFont, _T("&Set field font\tCtrl-F"), statbarMenu->Append(StatusBar_SetFont, _T("&Set field font\tCtrl-F"),
_T("Set the font to use for rendering status bar fields")); _T("Set the font to use for rendering status bar fields"));
wxMenu *statbarStyleMenu = new wxMenu; wxMenu *statbarPaneStyleMenu = new wxMenu;
statbarStyleMenu->Append(StatusBar_SetStyleNormal, _T("&Normal"), _T("Sets the style of the first field to normal (sunken) look"), true); statbarPaneStyleMenu->Append(StatusBar_SetPaneStyleNormal, _T("&Normal"), _T("Sets the style of the first field to normal (sunken) look"), true);
statbarStyleMenu->Append(StatusBar_SetStyleFlat, _T("&Flat"), _T("Sets the style of the first field to flat look"), true); statbarPaneStyleMenu->Append(StatusBar_SetPaneStyleFlat, _T("&Flat"), _T("Sets the style of the first field to flat look"), true);
statbarStyleMenu->Append(StatusBar_SetStyleRaised, _T("&Raised"), _T("Sets the style of the first field to raised look"), true); statbarPaneStyleMenu->Append(StatusBar_SetPaneStyleRaised, _T("&Raised"), _T("Sets the style of the first field to raised look"), true);
statbarMenu->Append(StatusBar_SetPaneStyle, _T("Field style"), statbarPaneStyleMenu);
statbarMenu->Append(StatusBar_SetStyle, _T("Field style"), statbarStyleMenu);
statbarMenu->Append(StatusBar_ResetFieldsWidth, _T("Reset field widths"), statbarMenu->Append(StatusBar_ResetFieldsWidth, _T("Reset field widths"),
_T("Sets all fields to the same width")); _T("Sets all fields to the same width"));
@@ -373,49 +389,41 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
SetMenuBar(menuBar); SetMenuBar(menuBar);
// create default status bar to start with // create default status bar to start with
CreateStatusBar(2); DoCreateStatusBar(StatBar_Default, wxSTB_DEFAULT_STYLE);
m_statbarKind = StatBar_Default;
SetStatusText(_T("Welcome to wxWidgets!")); SetStatusText(_T("Welcome to wxWidgets!"));
m_statbarDefault = GetStatusBar();
} }
MyFrame::~MyFrame() MyFrame::~MyFrame()
{ {
SetStatusBar(NULL);
delete m_statbarDefault;
delete m_statbarCustom;
} }
void MyFrame::DoCreateStatusBar(MyFrame::StatBarKind kind) void MyFrame::DoCreateStatusBar(MyFrame::StatusBarKind kind, long style)
{ {
wxStatusBar *statbarOld = GetStatusBar(); wxStatusBar *statbarOld = GetStatusBar();
if ( statbarOld ) if ( statbarOld )
{ {
statbarOld->Hide(); SetStatusBar(NULL);
delete statbarOld;
} }
wxStatusBar *statbarNew = NULL;
switch ( kind ) switch ( kind )
{ {
case StatBar_Default: case StatBar_Default:
SetStatusBar(m_statbarDefault); statbarNew = new wxStatusBar(this, wxID_ANY, style, "wxStatusBar");
statbarNew->SetFieldsCount(2);
break; break;
case StatBar_Custom: case StatBar_Custom:
if ( !m_statbarCustom ) statbarNew = new MyStatusBar(this, style);
{
m_statbarCustom = new MyStatusBar(this);
}
SetStatusBar(m_statbarCustom);
break; break;
default: default:
wxFAIL_MSG(wxT("unknown stat bar kind")); wxFAIL_MSG(wxT("unknown status bar kind"));
} }
ApplyStyle(); SetStatusBar(statbarNew);
GetStatusBar()->Show(); ApplyPaneStyle();
PositionStatusBar(); PositionStatusBar();
m_statbarKind = kind; m_statbarKind = kind;
@@ -430,12 +438,17 @@ void MyFrame::OnUpdateForDefaultStatusbar(wxUpdateUIEvent& event)
{ {
// only allow this feature for the default status bar // only allow this feature for the default status bar
wxStatusBar *sb = GetStatusBar(); wxStatusBar *sb = GetStatusBar();
event.Enable(sb == m_statbarDefault); if (!sb)
return;
event.Enable(sb->GetName() == "wxStatusBar");
} }
void MyFrame::OnSetStatusTexts(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnSetStatusTexts(wxCommandEvent& WXUNUSED(event))
{ {
wxStatusBar *sb = GetStatusBar(); wxStatusBar *sb = GetStatusBar();
if (!sb)
return;
wxString txt; wxString txt;
for (int i=0; i<sb->GetFieldsCount(); i++) for (int i=0; i<sb->GetFieldsCount(); i++)
@@ -451,6 +464,8 @@ void MyFrame::OnSetStatusTexts(wxCommandEvent& WXUNUSED(event))
void MyFrame::OnSetStatusFont(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnSetStatusFont(wxCommandEvent& WXUNUSED(event))
{ {
wxStatusBar *sb = GetStatusBar(); wxStatusBar *sb = GetStatusBar();
if (!sb)
return;
wxFont fnt = wxGetFontFromUser(this, sb->GetFont(), "Choose statusbar font"); wxFont fnt = wxGetFontFromUser(this, sb->GetFont(), "Choose statusbar font");
if (fnt.IsOk()) if (fnt.IsOk())
@@ -463,6 +478,8 @@ void MyFrame::OnSetStatusFont(wxCommandEvent& WXUNUSED(event))
void MyFrame::OnSetStatusFields(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnSetStatusFields(wxCommandEvent& WXUNUSED(event))
{ {
wxStatusBar *sb = GetStatusBar(); wxStatusBar *sb = GetStatusBar();
if (!sb)
return;
long nFields = wxGetNumberFromUser long nFields = wxGetNumberFromUser
( (
@@ -521,13 +538,13 @@ void MyFrame::OnSetStatusFields(wxCommandEvent& WXUNUSED(event))
void MyFrame::OnResetFieldsWidth(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnResetFieldsWidth(wxCommandEvent& WXUNUSED(event))
{ {
wxStatusBar *pStat = GetStatusBar(); wxStatusBar *pStat = GetStatusBar();
if (pStat) if (!pStat)
{ return;
int n = pStat->GetFieldsCount();
pStat->SetStatusWidths(n, NULL); int n = pStat->GetFieldsCount();
for (int i=0; i<n; i++) pStat->SetStatusWidths(n, NULL);
pStat->SetStatusText("same size", i); for (int i=0; i<n; i++)
} pStat->SetStatusText("same size", i);
} }
void MyFrame::OnUpdateStatusBarToggle(wxUpdateUIEvent& event) void MyFrame::OnUpdateStatusBarToggle(wxUpdateUIEvent& event)
@@ -540,19 +557,20 @@ void MyFrame::OnStatusBarToggle(wxCommandEvent& WXUNUSED(event))
wxStatusBar *statbarOld = GetStatusBar(); wxStatusBar *statbarOld = GetStatusBar();
if ( statbarOld ) if ( statbarOld )
{ {
statbarOld->Hide();
SetStatusBar(NULL); SetStatusBar(NULL);
delete statbarOld;
} }
else else
{ {
DoCreateStatusBar(m_statbarKind); DoCreateStatusBar(m_statbarKind, wxSTB_DEFAULT_STYLE);
} }
} }
void MyFrame::OnRecreateStatusBar(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnRecreateStatusBar(wxCommandEvent& WXUNUSED(event))
{ {
DoCreateStatusBar(m_statbarKind == StatBar_Custom ? StatBar_Default DoCreateStatusBar(m_statbarKind == StatBar_Custom ? StatBar_Default
: StatBar_Custom); : StatBar_Custom,
wxSTB_DEFAULT_STYLE);
} }
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
@@ -567,55 +585,128 @@ void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
dlg.ShowModal(); dlg.ShowModal();
} }
void MyFrame::OnUpdateSetStyleNormal(wxUpdateUIEvent &event) void MyFrame::OnUpdateSetPaneStyle(wxUpdateUIEvent& event)
{ {
event.Check(m_statbarStyle == wxSB_NORMAL); switch (event.GetId())
{
case StatusBar_SetPaneStyleNormal:
event.Check(m_statbarPaneStyle == wxSB_NORMAL);
break;
case StatusBar_SetPaneStyleFlat:
event.Check(m_statbarPaneStyle == wxSB_FLAT);
break;
case StatusBar_SetPaneStyleRaised:
event.Check(m_statbarPaneStyle == wxSB_RAISED);
break;
}
} }
void MyFrame::OnUpdateSetStyleFlat(wxUpdateUIEvent &event) void MyFrame::OnSetPaneStyle(wxCommandEvent& event)
{ {
event.Check(m_statbarStyle == wxSB_FLAT); switch (event.GetId())
{
case StatusBar_SetPaneStyleNormal:
m_statbarPaneStyle = wxSB_NORMAL;
break;
case StatusBar_SetPaneStyleFlat:
m_statbarPaneStyle = wxSB_FLAT;
break;
case StatusBar_SetPaneStyleRaised:
m_statbarPaneStyle = wxSB_RAISED;
break;
}
ApplyPaneStyle();
} }
void MyFrame::OnUpdateSetStyleRaised(wxUpdateUIEvent &event) void MyFrame::ApplyPaneStyle()
{
event.Check(m_statbarStyle == wxSB_RAISED);
}
void MyFrame::OnSetStyleNormal(wxCommandEvent & WXUNUSED(event))
{
m_statbarStyle = wxSB_NORMAL;
ApplyStyle();
}
void MyFrame::OnSetStyleFlat(wxCommandEvent & WXUNUSED(event))
{
m_statbarStyle = wxSB_FLAT;
ApplyStyle();
}
void MyFrame::OnSetStyleRaised(wxCommandEvent & WXUNUSED(event))
{
m_statbarStyle = wxSB_RAISED;
ApplyStyle();
}
void MyFrame::ApplyStyle()
{ {
wxStatusBar *sb = GetStatusBar(); wxStatusBar *sb = GetStatusBar();
if (!sb)
return;
int fields = sb->GetFieldsCount(); int fields = sb->GetFieldsCount();
int *styles = new int[fields]; int *styles = new int[fields];
for (int i = 1; i < fields; i++) for (int i = 1; i < fields; i++)
styles[i] = wxSB_NORMAL; styles[i] = wxSB_NORMAL;
styles[0] = m_statbarStyle; styles[0] = m_statbarPaneStyle;
sb->SetStatusStyles(fields, styles); sb->SetStatusStyles(fields, styles);
delete [] styles; delete [] styles;
} }
void MyFrame::OnUpdateSetStyle(wxUpdateUIEvent& event)
{
long currentStyle = wxSTB_DEFAULT_STYLE;
if (GetStatusBar())
currentStyle = GetStatusBar()->GetWindowStyle();
switch (event.GetId())
{
case StatusBar_SetStyleSizeGrip:
event.Check((currentStyle & wxSTB_SIZEGRIP) != 0);
break;
case StatusBar_SetStyleShowTips:
event.Check((currentStyle & wxSTB_SHOW_TIPS) != 0);
break;
case StatusBar_SetStyleEllipsizeStart:
event.Check((currentStyle & wxSTB_ELLIPSIZE_START) != 0);
break;
case StatusBar_SetStyleEllipsizeMiddle:
event.Check((currentStyle & wxSTB_ELLIPSIZE_MIDDLE) != 0);
break;
case StatusBar_SetStyleEllipsizeEnd:
event.Check((currentStyle & wxSTB_ELLIPSIZE_END) != 0);
break;
}
}
void MyFrame::OnSetStyle(wxCommandEvent& event)
{
long oldStyle = wxSTB_DEFAULT_STYLE;
if (GetStatusBar())
oldStyle = GetStatusBar()->GetWindowStyle();
#define STB_ELLIPSIZE_MASK (wxSTB_ELLIPSIZE_START|wxSTB_ELLIPSIZE_MIDDLE|wxSTB_ELLIPSIZE_END)
long newStyle = oldStyle;
long newStyleBit = 0;
switch (event.GetId())
{
case StatusBar_SetStyleSizeGrip:
newStyleBit = wxSTB_SIZEGRIP;
break;
case StatusBar_SetStyleShowTips:
newStyleBit = wxSTB_SHOW_TIPS;
break;
case StatusBar_SetStyleEllipsizeStart:
newStyleBit = wxSTB_ELLIPSIZE_START;
newStyle &= ~STB_ELLIPSIZE_MASK;
break;
case StatusBar_SetStyleEllipsizeMiddle:
newStyleBit = wxSTB_ELLIPSIZE_MIDDLE;
newStyle &= ~STB_ELLIPSIZE_MASK;
break;
case StatusBar_SetStyleEllipsizeEnd:
newStyleBit = wxSTB_ELLIPSIZE_END;
newStyle &= ~STB_ELLIPSIZE_MASK;
break;
}
newStyle = event.IsChecked() ? (newStyle | newStyleBit) :
(newStyle & ~newStyleBit);
if (newStyle != oldStyle)
{
DoCreateStatusBar(m_statbarKind, newStyle);
SetStatusText("Status bar recreated with a new style");
}
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// MyAboutDialog // MyAboutDialog
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -665,8 +756,8 @@ MyAboutDialog::MyAboutDialog(wxWindow *parent)
#pragma warning(disable: 4355) #pragma warning(disable: 4355)
#endif #endif
MyStatusBar::MyStatusBar(wxWindow *parent) MyStatusBar::MyStatusBar(wxWindow *parent, long style)
: wxStatusBar(parent, wxID_ANY) : wxStatusBar(parent, wxID_ANY, style, "MyStatusBar")
#if wxUSE_TIMER #if wxUSE_TIMER
, m_timer(this) , m_timer(this)
#endif #endif

View File

@@ -57,10 +57,10 @@
#if GTK_CHECK_VERSION(2,12,0) #if GTK_CHECK_VERSION(2,12,0)
extern "C" { extern "C" {
static static
gboolean statusbar_query_tooltip(GtkWidget *widget, gboolean statusbar_query_tooltip(GtkWidget* WXUNUSED(widget),
gint x, gint x,
gint y, gint y,
gboolean keyboard_mode, gboolean WXUNUSED(keyboard_mode),
GtkTooltip *tooltip, GtkTooltip *tooltip,
wxStatusBar* statbar) wxStatusBar* statbar)
{ {
@@ -72,7 +72,11 @@ gboolean statusbar_query_tooltip(GtkWidget *widget,
if (!statbar->GetField(n).IsEllipsized()) if (!statbar->GetField(n).IsEllipsized())
return FALSE; // no, it's not useful return FALSE; // no, it's not useful
gtk_tooltip_set_text(tooltip, wxGTK_CONV_SYS(statbar->GetStatusText(n))); const wxString& str = statbar->GetStatusText(n);
if (str.empty())
return FALSE;
gtk_tooltip_set_text(tooltip, wxGTK_CONV_SYS(str));
return TRUE; return TRUE;
} }
} }
@@ -128,7 +132,7 @@ bool wxStatusBarGeneric::Create(wxWindow *parent,
#if defined( __WXGTK20__ ) #if defined( __WXGTK20__ )
#if GTK_CHECK_VERSION(2,12,0) #if GTK_CHECK_VERSION(2,12,0)
if (HasFlag(wxST_SHOW_TIPS) && !gtk_check_version(2,12,0)) if (HasFlag(wxSTB_SHOW_TIPS) && !gtk_check_version(2,12,0))
{ {
g_object_set(m_widget, "has-tooltip", TRUE, NULL); g_object_set(m_widget, "has-tooltip", TRUE, NULL);
g_signal_connect(m_widget, "query-tooltip", g_signal_connect(m_widget, "query-tooltip",
@@ -202,7 +206,7 @@ void wxStatusBarGeneric::SetStatusWidths(int n, const int widths_field[])
bool wxStatusBarGeneric::ShowsSizeGrip() const bool wxStatusBarGeneric::ShowsSizeGrip() const
{ {
if ( !HasFlag(wxST_SIZEGRIP) ) if ( !HasFlag(wxSTB_SIZEGRIP) )
return false; return false;
wxTopLevelWindow * const wxTopLevelWindow * const
@@ -242,16 +246,34 @@ void wxStatusBarGeneric::DrawFieldText(wxDC& dc, const wxRect& rect, int i, int
} }
// eventually ellipsize the text so that it fits the field width // eventually ellipsize the text so that it fits the field width
text = wxControl::Ellipsize(
text, dc, wxEllipsizeMode ellmode = (wxEllipsizeMode)-1;
GetLayoutDirection() == wxLayout_RightToLeft ? wxELLIPSIZE_START : wxELLIPSIZE_END, if (HasFlag(wxSTB_ELLIPSIZE_START)) ellmode = wxELLIPSIZE_START;
maxWidth, else if (HasFlag(wxSTB_ELLIPSIZE_MIDDLE)) ellmode = wxELLIPSIZE_MIDDLE;
wxELLIPSIZE_EXPAND_TAB); else if (HasFlag(wxSTB_ELLIPSIZE_END)) ellmode = wxELLIPSIZE_END;
// Ellipsize() will do something only if necessary
// update the ellipsization status for this pane; this is used to decide if (ellmode == (wxEllipsizeMode)-1)
// whether a tooltip should be shown or not for this pane {
SetEllipsizedFlag(i, text != GetStatusText(i)); // if we have the wxSTB_SHOW_TIPS we must set the ellipsized flag even if
// we don't ellipsize the text but just truncate it
if (HasFlag(wxSTB_SHOW_TIPS))
SetEllipsizedFlag(i, dc.GetTextExtent(text).GetWidth() > maxWidth);
dc.SetClippingRegion(rect);
}
else
{
text = wxControl::Ellipsize(text, dc,
ellmode,
maxWidth,
wxELLIPSIZE_EXPAND_TAB);
// Ellipsize() will do something only if necessary
// update the ellipsization status for this pane; this is used later to
// decide whether a tooltip should be shown or not for this pane
// (if we have wxSTB_SHOW_TIPS)
SetEllipsizedFlag(i, text != GetStatusText(i));
}
#if defined( __WXGTK__ ) || defined(__WXMAC__) #if defined( __WXGTK__ ) || defined(__WXMAC__)
xpos++; xpos++;
@@ -260,6 +282,9 @@ void wxStatusBarGeneric::DrawFieldText(wxDC& dc, const wxRect& rect, int i, int
// draw the text // draw the text
dc.DrawText(text, xpos, ypos); dc.DrawText(text, xpos, ypos);
if (ellmode == (wxEllipsizeMode)-1)
dc.DestroyClippingRegion();
} }
void wxStatusBarGeneric::DrawField(wxDC& dc, int i, int textHeight) void wxStatusBarGeneric::DrawField(wxDC& dc, int i, int textHeight)

View File

@@ -89,9 +89,9 @@ bool wxStatusBar::Create(wxWindow *parent,
// setting SBARS_SIZEGRIP is perfectly useless: it's always on by default // setting SBARS_SIZEGRIP is perfectly useless: it's always on by default
// (at least in the version of comctl32.dll I'm using), and the only way to // (at least in the version of comctl32.dll I'm using), and the only way to
// turn it off is to use CCS_TOP style - as we position the status bar // turn it off is to use CCS_TOP style - as we position the status bar
// manually anyhow (see DoMoveWindow), use CCS_TOP style if wxST_SIZEGRIP // manually anyhow (see DoMoveWindow), use CCS_TOP style if wxSTB_SIZEGRIP
// is not given // is not given
if ( !(style & wxST_SIZEGRIP) ) if ( !(style & wxSTB_SIZEGRIP) )
{ {
wstyle |= CCS_TOP; wstyle |= CCS_TOP;
} }

View File

@@ -127,7 +127,7 @@ void wxStatusBarUniv::DoDraw(wxControlRenderer *renderer)
// have the corresponding style and even then only if we really can // have the corresponding style and even then only if we really can
// resize this frame // resize this frame
if ( n == (int)m_panes.GetCount() - 1 && if ( n == (int)m_panes.GetCount() - 1 &&
HasFlag(wxST_SIZEGRIP) && HasFlag(wxSTB_SIZEGRIP) &&
GetParent()->HasFlag(wxRESIZE_BORDER) && GetParent()->HasFlag(wxRESIZE_BORDER) &&
parentTLW && !parentTLW->IsMaximized() ) parentTLW && !parentTLW->IsMaximized() )
{ {

View File

@@ -31,7 +31,16 @@ IMPLEMENT_DYNAMIC_CLASS(wxStatusBarXmlHandler, wxXmlResourceHandler)
wxStatusBarXmlHandler::wxStatusBarXmlHandler() wxStatusBarXmlHandler::wxStatusBarXmlHandler()
:wxXmlResourceHandler() :wxXmlResourceHandler()
{ {
XRC_ADD_STYLE(wxST_SIZEGRIP); XRC_ADD_STYLE(wxSTB_SIZEGRIP);
XRC_ADD_STYLE(wxSTB_SHOW_TIPS);
XRC_ADD_STYLE(wxSTB_ELLIPSIZE_START);
XRC_ADD_STYLE(wxSTB_ELLIPSIZE_MIDDLE);
XRC_ADD_STYLE(wxSTB_ELLIPSIZE_END);
XRC_ADD_STYLE(wxSTB_DEFAULT_STYLE);
// compat style name:
XRC_ADD_STYLE(wxST_SIZE_GRIP);
AddWindowStyles(); AddWindowStyles();
} }