added status bar fields styles support (patch 988292)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28480 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2004-07-25 16:13:52 +00:00
parent 22dec51f90
commit c2919ab326
14 changed files with 373 additions and 50 deletions

View File

@@ -47,6 +47,7 @@ wxObject *wxStatusBarXmlHandler::DoCreateResource()
int fields = GetLong(wxT("fields"), 1); int fields = GetLong(wxT("fields"), 1);
wxString widths = GetParamValue(wxT("widths")); wxString widths = GetParamValue(wxT("widths"));
wxString styles = GetParamValue(wxT("styles"));
if (fields > 1 && !widths.IsEmpty()) if (fields > 1 && !widths.IsEmpty())
{ {
@@ -64,6 +65,30 @@ wxObject *wxStatusBarXmlHandler::DoCreateResource()
else else
statbar->SetFieldsCount(fields); statbar->SetFieldsCount(fields);
if (!styles.IsEmpty())
{
int *style = new int[fields];
for (int i = 0; i < fields; ++i)
{
style[i] = wxSB_NORMAL;
wxString first = styles.BeforeFirst(wxT(','));
if (first == wxT("wxSB_NORMAL"))
style[i] = wxSB_NORMAL;
else if (first == wxT("wxSB_FLAT"))
style[i] = wxSB_FLAT;
else if (first == wxT("wxSB_RAISED"))
style[i] = wxSB_RAISED;
if (!first.IsEmpty())
wxLogError(wxT("Error in resource, unknown statusbar field style: ") + first);
if(styles.Find(wxT(',')))
styles.Remove(0, styles.Find(wxT(',')) + 1);
}
statbar->SetStatusStyles(fields, style);
delete [] style;
}
if (m_parentAsWindow) if (m_parentAsWindow)
{ {
wxFrame *parentFrame = wxDynamicCast(m_parent, wxFrame); wxFrame *parentFrame = wxDynamicCast(m_parent, wxFrame);

View File

@@ -218,6 +218,7 @@ All (GUI):
- added wxKeyEvent::GetUnicodeKey() - added wxKeyEvent::GetUnicodeKey()
- added wxKeyEvent::CmdDown() and wxMouseEvent::CmdDown() - added wxKeyEvent::CmdDown() and wxMouseEvent::CmdDown()
- implemented wxListCtrl::FindItem() for non-MSW (Robin Stoll) - implemented wxListCtrl::FindItem() for non-MSW (Robin Stoll)
- added status bar fields styles support (Tim Kosse)
Unix: Unix:

View File

@@ -232,3 +232,28 @@ integers.}
\perlnote{In wxPerl this method takes as parameters the field widths.} \perlnote{In wxPerl this method takes as parameters the field widths.}
\membersection{wxStatusBar::SetStatusStyles}\label{wxstatusbarsetstatusstyles}
\func{virtual void}{SetStatusStyles}{\param{int}{ n}, \param{int *}{styles}}
Sets the styles of the fields in the status line which can make fields appear flat
or raised instead of the standard sunken 3D border.
\wxheading{Parameters}
\docparam{n}{The number of fields in the status bar. Must be equal to the
number passed to \helpref{SetFieldsCount}{wxstatusbarsetfieldscount} the last
time it was called.}
\docparam{styles}{Contains an array of {\it n} integers with the styles for each field. There
are three possible styles:
\twocolwidtha{5cm}
\begin{twocollist}\itemsep=0pt
\twocolitem{\windowstyle{wxSB\_NORMAL}}{(default) The field appears sunken with a standard 3D border.}
\twocolitem{\windowstyle{wxSB\_FLAT}}{No border is painted around the field so that it appears flat.}
\twocolitem{\windowstyle{wxSB\_RAISED}}{A raised 3D border is painted around the field.}
\end{twocollist}

View File

@@ -48,6 +48,9 @@ public:
// set status line fields' widths // set status line fields' widths
virtual void SetStatusWidths(int n, const int widths_field[]); virtual void SetStatusWidths(int n, const int widths_field[]);
// set status line fields' styles
virtual void SetStatusStyles(int n, const int styles[]);
// sets the minimal vertical size of the status bar // sets the minimal vertical size of the status bar
virtual void SetMinHeight(int height); virtual void SetMinHeight(int height);

View File

@@ -25,6 +25,15 @@
WX_DECLARE_LIST(wxString, wxListString); WX_DECLARE_LIST(wxString, wxListString);
// ----------------------------------------------------------------------------
// wxStatusBar constants
// ----------------------------------------------------------------------------
// style flags for fields
#define wxSB_NORMAL 0x0000
#define wxSB_FLAT 0x0001
#define wxSB_RAISED 0x0002
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxStatusBar: a window near the bottom of the frame used for status info // wxStatusBar: a window near the bottom of the frame used for status info
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -64,6 +73,15 @@ public:
// -2 grows twice as much as one with width -1 &c) // -2 grows twice as much as one with width -1 &c)
virtual void SetStatusWidths(int n, const int widths[]); virtual void SetStatusWidths(int n, const int widths[]);
// 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[]);
// geometry // geometry
// -------- // --------
@@ -90,6 +108,11 @@ protected:
// reset the widths // reset the widths
void ReinitWidths() { FreeWidths(); InitWidths(); } void ReinitWidths() { FreeWidths(); InitWidths(); }
// same, for field styles
void InitStyles();
void FreeStyles();
void ReinitStyles() { FreeStyles(); InitStyles(); }
// same, for text stacks // same, for text stacks
void InitStacks(); void InitStacks();
void FreeStacks(); void FreeStacks();
@@ -109,6 +132,9 @@ protected:
// width otherwise // width otherwise
int *m_statusWidths; int *m_statusWidths;
// the styles of the fields
int *m_statusStyles;
// stacks of previous values for PushStatusText/PopStatusText // stacks of previous values for PushStatusText/PopStatusText
// this is created on demand, use GetStatusStack/GetOrCreateStatusStack // this is created on demand, use GetStatusStack/GetOrCreateStatusStack
wxListString **m_statusTextStacks; wxListString **m_statusTextStacks;

View File

@@ -288,7 +288,7 @@ public:
virtual void DrawStatusField(wxDC& dc, virtual void DrawStatusField(wxDC& dc,
const wxRect& rect, const wxRect& rect,
const wxString& label, const wxString& label,
int flags = 0) = 0; int flags = 0, int style = 0) = 0;
// draw complete frame/dialog titlebar // draw complete frame/dialog titlebar
virtual void DrawFrameTitleBar(wxDC& dc, virtual void DrawFrameTitleBar(wxDC& dc,
@@ -701,8 +701,8 @@ public:
virtual void DrawStatusField(wxDC& dc, virtual void DrawStatusField(wxDC& dc,
const wxRect& rect, const wxRect& rect,
const wxString& label, const wxString& label,
int flags = 0) int flags = 0, inst style = 0)
{ m_renderer->DrawStatusField(dc, rect, label, flags); } { m_renderer->DrawStatusField(dc, rect, label, flags, style); }
virtual void DrawFrameTitleBar(wxDC& dc, virtual void DrawFrameTitleBar(wxDC& dc,
const wxRect& rect, const wxRect& rect,

View File

@@ -146,6 +146,9 @@ class MyFrame : public wxMDIParentFrame
void OnSetStatusFields(wxCommandEvent& event); void OnSetStatusFields(wxCommandEvent& event);
void OnRecreateStatusBar(wxCommandEvent& event); void OnRecreateStatusBar(wxCommandEvent& event);
void OnSetStyleNormal(wxCommandEvent& event);
void OnSetStyleFlat(wxCommandEvent& event);
void OnSetStyleRaised(wxCommandEvent& event);
private: private:
enum StatBarKind enum StatBarKind
@@ -156,12 +159,18 @@ private:
} m_statbarKind; } m_statbarKind;
void OnUpdateSetStatusFields(wxUpdateUIEvent& event); void OnUpdateSetStatusFields(wxUpdateUIEvent& event);
void OnUpdateStatusBarToggle(wxUpdateUIEvent& event); void OnUpdateStatusBarToggle(wxUpdateUIEvent& event);
void OnUpdateSetStyleNormal(wxUpdateUIEvent& event);
void OnUpdateSetStyleFlat(wxUpdateUIEvent& event);
void OnUpdateSetStyleRaised(wxUpdateUIEvent& event);
void OnStatusBarToggle(wxCommandEvent& event); void OnStatusBarToggle(wxCommandEvent& event);
void DoCreateStatusBar(StatBarKind kind); void DoCreateStatusBar(StatBarKind kind);
void ApplyStyle();
wxStatusBar *m_statbarDefault; wxStatusBar *m_statbarDefault;
MyStatusBar *m_statbarCustom; 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()
}; };
@@ -186,7 +195,11 @@ enum
StatusBar_Recreate, StatusBar_Recreate,
StatusBar_About, StatusBar_About,
StatusBar_Toggle, StatusBar_Toggle,
StatusBar_Checkbox = 1000 StatusBar_Checkbox = 1000,
StatusBar_SetStyle,
StatusBar_SetStyleNormal,
StatusBar_SetStyleFlat,
StatusBar_SetStyleRaised
}; };
static const int BITMAP_SIZE_X = 32; static const int BITMAP_SIZE_X = 32;
@@ -209,8 +222,14 @@ 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_SetStyleFlat, MyFrame::OnSetStyleFlat)
EVT_MENU(StatusBar_SetStyleRaised, MyFrame::OnSetStyleRaised)
EVT_UPDATE_UI(StatusBar_Toggle, MyFrame::OnUpdateStatusBarToggle) EVT_UPDATE_UI(StatusBar_Toggle, MyFrame::OnUpdateStatusBarToggle)
EVT_UPDATE_UI(StatusBar_SetFields, MyFrame::OnUpdateSetStatusFields) EVT_UPDATE_UI(StatusBar_SetFields, MyFrame::OnUpdateSetStatusFields)
EVT_UPDATE_UI(StatusBar_SetStyleNormal, MyFrame::OnUpdateSetStyleNormal)
EVT_UPDATE_UI(StatusBar_SetStyleFlat, MyFrame::OnUpdateSetStyleFlat)
EVT_UPDATE_UI(StatusBar_SetStyleRaised, MyFrame::OnUpdateSetStyleRaised)
END_EVENT_TABLE() END_EVENT_TABLE()
BEGIN_EVENT_TABLE(MyStatusBar, wxStatusBar) BEGIN_EVENT_TABLE(MyStatusBar, wxStatusBar)
@@ -267,6 +286,8 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
m_statbarDefault = NULL; m_statbarDefault = NULL;
m_statbarCustom = NULL; 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
// not the default id of the about menu // not the default id of the about menu
@@ -285,6 +306,12 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
statbarMenu->Append(StatusBar_Recreate, _T("&Recreate\tCtrl-R"), statbarMenu->Append(StatusBar_Recreate, _T("&Recreate\tCtrl-R"),
_T("Toggle status bar format")); _T("Toggle status bar format"));
wxMenu *statbarStyleMenu = new wxMenu;
statbarStyleMenu->Append(StatusBar_SetStyleNormal, _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);
statbarStyleMenu->Append(StatusBar_SetStyleRaised, _T("&Raised"), _T("Sets the style of the first field to raised look"), true);
statbarMenu->Append(StatusBar_SetStyle, _T("Field style"), statbarStyleMenu);
wxMenu *helpMenu = new wxMenu; wxMenu *helpMenu = new wxMenu;
helpMenu->Append(StatusBar_About, _T("&About...\tCtrl-A"), _T("Show about dialog")); helpMenu->Append(StatusBar_About, _T("&About...\tCtrl-A"), _T("Show about dialog"));
@@ -339,6 +366,7 @@ void MyFrame::DoCreateStatusBar(MyFrame::StatBarKind kind)
wxFAIL_MSG(wxT("unknown stat bar kind")); wxFAIL_MSG(wxT("unknown stat bar kind"));
} }
ApplyStyle();
GetStatusBar()->Show(); GetStatusBar()->Show();
PositionStatusBar(); PositionStatusBar();
@@ -347,13 +375,12 @@ void MyFrame::DoCreateStatusBar(MyFrame::StatBarKind kind)
void MyFrame::OnUpdateSetStatusFields(wxUpdateUIEvent& event) void MyFrame::OnUpdateSetStatusFields(wxUpdateUIEvent& event)
{ {
// only allow the setting of the number of status fields for the default // only allow the settings of the number of status fields for the default
// status bar // status bar
wxStatusBar *sb = GetStatusBar(); wxStatusBar *sb = GetStatusBar();
event.Enable(sb == m_statbarDefault); event.Enable(sb == m_statbarDefault);
} }
// event handlers // event handlers
void MyFrame::OnSetStatusFields(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnSetStatusFields(wxCommandEvent& WXUNUSED(event))
{ {
@@ -455,6 +482,55 @@ void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
dlg.ShowModal(); dlg.ShowModal();
} }
void MyFrame::OnUpdateSetStyleNormal(wxUpdateUIEvent &event)
{
event.Check(m_statbarStyle == wxSB_NORMAL);
}
void MyFrame::OnUpdateSetStyleFlat(wxUpdateUIEvent &event)
{
event.Check(m_statbarStyle == wxSB_FLAT);
}
void MyFrame::OnUpdateSetStyleRaised(wxUpdateUIEvent &event)
{
event.Check(m_statbarStyle == wxSB_RAISED);
}
void MyFrame::OnSetStyleNormal(wxCommandEvent &event)
{
m_statbarStyle = wxSB_NORMAL;
ApplyStyle();
}
void MyFrame::OnSetStyleFlat(wxCommandEvent &event)
{
m_statbarStyle = wxSB_FLAT;
ApplyStyle();
}
void MyFrame::OnSetStyleRaised(wxCommandEvent &event)
{
m_statbarStyle = wxSB_RAISED;
ApplyStyle();
}
void MyFrame::ApplyStyle()
{
wxStatusBar *sb = GetStatusBar();
int fields = sb->GetFieldsCount();
int *styles = new int[fields];
for (int i = 1; i < fields; i++)
styles[i] = wxSB_NORMAL;
styles[0] = m_statbarStyle;
sb->SetStatusStyles(fields, styles);
delete [] styles;
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// MyAboutDialog // MyAboutDialog
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@@ -53,12 +53,14 @@ wxStatusBarBase::wxStatusBarBase()
InitWidths(); InitWidths();
InitStacks(); InitStacks();
InitStyles();
} }
wxStatusBarBase::~wxStatusBarBase() wxStatusBarBase::~wxStatusBarBase()
{ {
FreeWidths(); FreeWidths();
FreeStacks(); FreeStacks();
InitStyles();
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -75,6 +77,20 @@ void wxStatusBarBase::FreeWidths()
delete [] m_statusWidths; delete [] m_statusWidths;
} }
// ----------------------------------------------------------------------------
// styles array handling
// ----------------------------------------------------------------------------
void wxStatusBarBase::InitStyles()
{
m_statusStyles = NULL;
}
void wxStatusBarBase::FreeStyles()
{
delete [] m_statusStyles;
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// field widths // field widths
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -112,6 +128,26 @@ void wxStatusBarBase::SetFieldsCount(int number, const int *widths)
m_statusTextStacks = newStacks; m_statusTextStacks = newStacks;
} }
// Resize styles array
if (m_statusStyles)
{
int *oldStyles = m_statusStyles;
m_statusStyles = new int[number];
int i, max = wxMin(number, m_nFields);
// copy old styles
for (i = 0; i < max; ++i)
m_statusStyles[i] = oldStyles[i];
// initialize new styles to wxSB_NORMAL
for (i = max; i < number; ++i)
m_statusStyles[i] = wxSB_NORMAL;
// free old styles
delete [] oldStyles;
}
m_nFields = number; m_nFields = number;
ReinitWidths(); ReinitWidths();
@@ -151,6 +187,25 @@ void wxStatusBarBase::SetStatusWidths(int WXUNUSED_UNLESS_DEBUG(n),
Refresh(); Refresh();
} }
void wxStatusBarBase::SetStatusStyles(int WXUNUSED_UNLESS_DEBUG(n),
const int styles[])
{
wxCHECK_RET( styles, _T("NULL pointer in SetStatusStyles") );
wxASSERT_MSG( n == m_nFields, _T("field number mismatch") );
if ( !m_statusStyles )
m_statusStyles = new int[m_nFields];
for ( int i = 0; i < m_nFields; i++ )
{
m_statusStyles[i] = styles[i];
}
// update the display after the widths changed
Refresh();
}
wxArrayInt wxStatusBarBase::CalculateAbsWidths(wxCoord widthTotal) const wxArrayInt wxStatusBarBase::CalculateAbsWidths(wxCoord widthTotal) const
{ {
wxArrayInt widths; wxArrayInt widths;

View File

@@ -140,12 +140,10 @@ void wxStatusBarGeneric::SetFieldsCount(int number, const int *widths)
for (i = m_nFields - 1; i >= number; --i) for (i = m_nFields - 1; i >= number; --i)
m_statusStrings.RemoveAt(i); m_statusStrings.RemoveAt(i);
m_nFields = number; wxStatusBarBase::SetFieldsCount(number, widths);
wxASSERT_MSG( m_nFields == (int)m_statusStrings.GetCount(), wxASSERT_MSG( m_nFields == (int)m_statusStrings.GetCount(),
_T("This really should never happen, can we do away with m_nFields here?") ); _T("This really should never happen, can we do away with m_nFields here?") );
SetStatusWidths(number, widths);
} }
void wxStatusBarGeneric::SetStatusText(const wxString& text, int number) void wxStatusBarGeneric::SetStatusText(const wxString& text, int number)
@@ -269,25 +267,33 @@ void wxStatusBarGeneric::DrawField(wxDC& dc, int i)
wxRect rect; wxRect rect;
GetFieldRect(i, rect); GetFieldRect(i, rect);
int style = wxSB_NORMAL;
if (m_statusStyles)
style = m_statusStyles[i];
if (style != wxSB_FLAT)
{
// Draw border // Draw border
// For wxSB_NORMAL:
// Have grey background, plus 3-d border - // Have grey background, plus 3-d border -
// One black rectangle. // One black rectangle.
// Inside this, left and top sides - dark grey. Bottom and right - // Inside this, left and top sides - dark grey. Bottom and right -
// white. // white.
// Reverse it for wxSB_RAISED
dc.SetPen(m_hilightPen); dc.SetPen((style == wxSB_RAISED) ? m_mediumShadowPen : m_hilightPen);
#ifndef __WXPM__ #ifndef __WXPM__
// Right and bottom white lines // Right and bottom lines
dc.DrawLine(rect.x + rect.width, rect.y, dc.DrawLine(rect.x + rect.width, rect.y,
rect.x + rect.width, rect.y + rect.height); rect.x + rect.width, rect.y + rect.height);
dc.DrawLine(rect.x + rect.width, rect.y + rect.height, dc.DrawLine(rect.x + rect.width, rect.y + rect.height,
rect.x, rect.y + rect.height); rect.x, rect.y + rect.height);
dc.SetPen(m_mediumShadowPen); dc.SetPen((style == wxSB_RAISED) ? m_hilightPen : m_mediumShadowPen);
// Left and top grey lines // Left and top lines
dc.DrawLine(rect.x, rect.y + rect.height, dc.DrawLine(rect.x, rect.y + rect.height,
rect.x, rect.y); rect.x, rect.y);
dc.DrawLine(rect.x, rect.y, dc.DrawLine(rect.x, rect.y,
@@ -299,13 +305,14 @@ void wxStatusBarGeneric::DrawField(wxDC& dc, int i)
dc.DrawLine(rect.x + rect.width, rect.y, dc.DrawLine(rect.x + rect.width, rect.y,
rect.x + rect.width, rect.y + rect.height); rect.x + rect.width, rect.y + rect.height);
dc.SetPen(m_mediumShadowPen); dc.SetPen((style == wxSB_RAISED) ? m_hilightPen : m_mediumShadowPen);
dc.DrawLine(rect.x, rect.y, dc.DrawLine(rect.x, rect.y,
rect.x + rect.width, rect.y); rect.x + rect.width, rect.y);
dc.DrawLine(rect.x, rect.y + rect.height, dc.DrawLine(rect.x, rect.y + rect.height,
rect.x, rect.y); rect.x, rect.y);
#endif #endif
}
DrawFieldText(dc, i); DrawFieldText(dc, i);
} }

View File

@@ -177,7 +177,30 @@ void wxStatusBar95::SetStatusText(const wxString& strText, int nField)
wxCHECK_RET( (nField >= 0) && (nField < m_nFields), wxCHECK_RET( (nField >= 0) && (nField < m_nFields),
_T("invalid statusbar field index") ); _T("invalid statusbar field index") );
if ( !StatusBar_SetText(GetHwnd(), nField, strText) ) // Get field style, if any
int style;
if (m_statusStyles)
{
switch(m_statusStyles[nField])
{
case wxSB_RAISED:
style = SBT_POPOUT;
break;
case wxSB_FLAT:
style = SBT_NOBORDERS;
break;
case wxSB_NORMAL:
default:
style = 0;
break;
}
}
else
style = 0;
// Pass both field number and style. MSDN library doesn't mention
// that nField and style have to be 'ORed'
if ( !StatusBar_SetText(GetHwnd(), nField | style, strText) )
{ {
wxLogLastError(wxT("StatusBar_SetText")); wxLogLastError(wxT("StatusBar_SetText"));
} }
@@ -267,5 +290,39 @@ void wxStatusBar95::DoMoveWindow(int x, int y, int width, int height)
} }
} }
void wxStatusBar95::SetStatusStyles(int n, const int styles[])
{
wxStatusBarBase::SetStatusStyles(n, styles);
if (n != m_nFields)
return;
for (int i = 0; i < n; i++)
{
int style;
switch(styles[i])
{
case wxSB_RAISED:
style = SBT_POPOUT;
break;
case wxSB_FLAT:
style = SBT_NOBORDERS;
break;
case wxSB_NORMAL:
default:
style = 0;
break;
}
// The SB_SETTEXT message is both used to set the field's text as well as
// the fields' styles. MSDN library doesn't mention
// that nField and style have to be 'ORed'
wxString text = GetStatusText(i);
if (!StatusBar_SetText(GetHwnd(), style | i, text))
{
wxLogLastError(wxT("StatusBar_SetText"));
}
}
}
#endif // __WIN95__ && wxUSE_NATIVE_STATUSBAR #endif // __WIN95__ && wxUSE_NATIVE_STATUSBAR

View File

@@ -140,7 +140,12 @@ void wxStatusBarUniv::DoDraw(wxControlRenderer *renderer)
flags |= wxCONTROL_ISDEFAULT; flags |= wxCONTROL_ISDEFAULT;
} }
m_renderer->DrawStatusField(dc, rect, m_statusText[n], flags); int style;
if (m_statusStyles)
style = m_statusStyles[n];
else
style = wxSB_NORMAL;
m_renderer->DrawStatusField(dc, rect, m_statusText[n], flags, style);
} }
rect.x += rect.width + borderBetweenFields; rect.x += rect.width + borderBetweenFields;

View File

@@ -42,6 +42,7 @@
#include "wx/slider.h" #include "wx/slider.h"
#include "wx/textctrl.h" #include "wx/textctrl.h"
#include "wx/toolbar.h" #include "wx/toolbar.h"
#include "wx/statusbr.h"
#include "wx/settings.h" #include "wx/settings.h"
#endif // WX_PRECOMP #endif // WX_PRECOMP
@@ -228,7 +229,7 @@ public:
virtual void DrawStatusField(wxDC& dc, virtual void DrawStatusField(wxDC& dc,
const wxRect& rect, const wxRect& rect,
const wxString& label, const wxString& label,
int flags = 0); int flags = 0, int style = 0);
virtual void DrawFrameTitleBar(wxDC& dc, virtual void DrawFrameTitleBar(wxDC& dc,
const wxRect& rect, const wxRect& rect,
@@ -2236,7 +2237,7 @@ wxGTKRenderer::GetStatusBarBorders(wxCoord * WXUNUSED(borderBetweenFields)) cons
void wxGTKRenderer::DrawStatusField(wxDC& WXUNUSED(dc), void wxGTKRenderer::DrawStatusField(wxDC& WXUNUSED(dc),
const wxRect& WXUNUSED(rect), const wxRect& WXUNUSED(rect),
const wxString& WXUNUSED(label), const wxString& WXUNUSED(label),
int WXUNUSED(flags)) int WXUNUSED(flags), int WXUNUSED(style))
{ {
} }

View File

@@ -40,6 +40,7 @@
#include "wx/textctrl.h" #include "wx/textctrl.h"
#include "wx/listbox.h" #include "wx/listbox.h"
#include "wx/toolbar.h" #include "wx/toolbar.h"
#include "wx/statusbr.h"
#ifdef __WXMSW__ #ifdef __WXMSW__
// for COLOR_* constants // for COLOR_* constants
@@ -299,7 +300,7 @@ public:
virtual void DrawStatusField(wxDC& dc, virtual void DrawStatusField(wxDC& dc,
const wxRect& rect, const wxRect& rect,
const wxString& label, const wxString& label,
int flags = 0); int flags = 0, int style = 0);
// titlebars // titlebars
virtual void DrawFrameTitleBar(wxDC& dc, virtual void DrawFrameTitleBar(wxDC& dc,
@@ -3224,7 +3225,7 @@ wxSize wxWin32Renderer::GetStatusBarBorders(wxCoord *borderBetweenFields) const
void wxWin32Renderer::DrawStatusField(wxDC& dc, void wxWin32Renderer::DrawStatusField(wxDC& dc,
const wxRect& rect, const wxRect& rect,
const wxString& label, const wxString& label,
int flags) int flags, int style /*=0*/)
{ {
wxRect rectIn; wxRect rectIn;
@@ -3240,9 +3241,15 @@ void wxWin32Renderer::DrawStatusField(wxDC& dc,
y2 = rect.GetBottom(); y2 = rect.GetBottom();
// draw the upper left part of the rect normally // draw the upper left part of the rect normally
if (style != wxSB_FLAT)
{
if (style == wxSB_RAISED)
dc.SetPen(m_penHighlight);
else
dc.SetPen(m_penDarkGrey); dc.SetPen(m_penDarkGrey);
dc.DrawLine(rect.GetLeft(), rect.GetTop(), rect.GetLeft(), y2); dc.DrawLine(rect.GetLeft(), rect.GetTop(), rect.GetLeft(), y2);
dc.DrawLine(rect.GetLeft() + 1, rect.GetTop(), x2, rect.GetTop()); dc.DrawLine(rect.GetLeft() + 1, rect.GetTop(), x2, rect.GetTop());
}
// draw the grey stripes of the grip // draw the grey stripes of the grip
size_t n; size_t n;
@@ -3262,9 +3269,16 @@ void wxWin32Renderer::DrawStatusField(wxDC& dc,
} }
// draw the remaining rect boundaries // draw the remaining rect boundaries
if (style != wxSB_FLAT)
{
if (style == wxSB_RAISED)
dc.SetPen(m_penDarkGrey);
else
dc.SetPen(m_penHighlight);
ofs -= WIDTH_STATUSBAR_GRIP_BAND; ofs -= WIDTH_STATUSBAR_GRIP_BAND;
dc.DrawLine(x2, rect.GetTop(), x2, y2 - ofs + 1); dc.DrawLine(x2, rect.GetTop(), x2, y2 - ofs + 1);
dc.DrawLine(rect.GetLeft(), y2, x2 - ofs + 1, y2); dc.DrawLine(rect.GetLeft(), y2, x2 - ofs + 1, y2);
}
rectIn = rect; rectIn = rect;
rectIn.Deflate(1); rectIn.Deflate(1);
@@ -3273,6 +3287,9 @@ void wxWin32Renderer::DrawStatusField(wxDC& dc,
} }
else // normal pane else // normal pane
{ {
if (style == wxSB_RAISED)
DrawBorder(dc, wxBORDER_RAISED, rect, flags, &rectIn);
else if (style != wxSB_FLAT)
DrawBorder(dc, wxBORDER_STATIC, rect, flags, &rectIn); DrawBorder(dc, wxBORDER_STATIC, rect, flags, &rectIn);
} }

View File

@@ -47,6 +47,7 @@ wxObject *wxStatusBarXmlHandler::DoCreateResource()
int fields = GetLong(wxT("fields"), 1); int fields = GetLong(wxT("fields"), 1);
wxString widths = GetParamValue(wxT("widths")); wxString widths = GetParamValue(wxT("widths"));
wxString styles = GetParamValue(wxT("styles"));
if (fields > 1 && !widths.IsEmpty()) if (fields > 1 && !widths.IsEmpty())
{ {
@@ -64,6 +65,30 @@ wxObject *wxStatusBarXmlHandler::DoCreateResource()
else else
statbar->SetFieldsCount(fields); statbar->SetFieldsCount(fields);
if (!styles.IsEmpty())
{
int *style = new int[fields];
for (int i = 0; i < fields; ++i)
{
style[i] = wxSB_NORMAL;
wxString first = styles.BeforeFirst(wxT(','));
if (first == wxT("wxSB_NORMAL"))
style[i] = wxSB_NORMAL;
else if (first == wxT("wxSB_FLAT"))
style[i] = wxSB_FLAT;
else if (first == wxT("wxSB_RAISED"))
style[i] = wxSB_RAISED;
if (!first.IsEmpty())
wxLogError(wxT("Error in resource, unknown statusbar field style: ") + first);
if(styles.Find(wxT(',')))
styles.Remove(0, styles.Find(wxT(',')) + 1);
}
statbar->SetStatusStyles(fields, style);
delete [] style;
}
if (m_parentAsWindow) if (m_parentAsWindow)
{ {
wxFrame *parentFrame = wxDynamicCast(m_parent, wxFrame); wxFrame *parentFrame = wxDynamicCast(m_parent, wxFrame);