generic status bar now:
1. works correctly (handles negative widths according to the docs/MSW/Univ) 2. has shorter and simpler GetFieldRect() implementation 3. ... which is also more efficient (pixel widths are cached) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16966 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -148,72 +148,6 @@ strings.
|
||||
Saves the current field text in a per field stack, and sets the field text
|
||||
to the string passed as argument.
|
||||
|
||||
%% VZ: these functions are not in wxStatusBar API, these are just
|
||||
%% implementation details of wxStatusBarGeneric
|
||||
%%
|
||||
%% \membersection{wxStatusBar::DrawField}\label{wxstatusbardrawfield}
|
||||
%%
|
||||
%% \func{virtual void}{DrawField}{\param{wxDC\& }{dc}, \param{int }{i}}
|
||||
%%
|
||||
%% Draws a field, including shaded borders and text.
|
||||
%%
|
||||
%% \wxheading{Parameters}
|
||||
%%
|
||||
%% \docparam{dc}{The device context to draw onto.}
|
||||
%%
|
||||
%% \docparam{i}{The field to be drawn.}
|
||||
%%
|
||||
%% \wxheading{See also}
|
||||
%%
|
||||
%% \helpref{wxStatusBar::DrawFieldText}{wxstatusbardrawfieldtext}
|
||||
%%
|
||||
%% \membersection{wxStatusBar::DrawFieldText}\label{wxstatusbardrawfieldtext}
|
||||
%%
|
||||
%% \func{virtual void}{DrawFieldText}{\param{wxDC\& }{dc}, \param{int }{i}}
|
||||
%%
|
||||
%% Draws a field's text.
|
||||
%%
|
||||
%% \wxheading{Parameters}
|
||||
%%
|
||||
%% \docparam{dc}{The device context to draw onto.}
|
||||
%%
|
||||
%% \docparam{i}{The field whose text is to be drawn.}
|
||||
%%
|
||||
%% \wxheading{See also}
|
||||
%%
|
||||
%% \helpref{wxStatusBar::DrawField}{wxstatusbardrawfield}
|
||||
%%
|
||||
%% \membersection{wxStatusBar::InitColours}\label{wxstatusbarinitcolours}
|
||||
%%
|
||||
%% \func{virtual void}{InitColours}{\void}
|
||||
%%
|
||||
%% Sets up the background colour and shading pens using suitable system colours (Windows) or tasteful shades
|
||||
%% of grey (other platforms).
|
||||
%%
|
||||
%% \wxheading{Remarks}
|
||||
%%
|
||||
%% This function is called when the window is created, and also
|
||||
%% from \helpref{wxStatusBar::OnSysColourChanged}{wxstatusbaronsyscolourchanged} on Windows.
|
||||
%%
|
||||
%% \wxheading{See also}
|
||||
%%
|
||||
%% \helpref{wxStatusBar::OnSysColourChanged}{wxstatusbaronsyscolourchanged}
|
||||
%%
|
||||
%% \membersection{wxStatusBar::OnSysColourChanged}\label{wxstatusbaronsyscolourchanged}
|
||||
%%
|
||||
%% \func{void}{OnSysColourChanged}{\param{wxSysColourChangedEvent\& }{event}}
|
||||
%%
|
||||
%% Handles a system colour change by calling \helpref{wxStatusBar::InitColours}{wxstatusbarinitcolours},
|
||||
%% and refreshes the window.
|
||||
%%
|
||||
%% \wxheading{Parameters}
|
||||
%%
|
||||
%% \docparam{event}{The colour change event.}
|
||||
%%
|
||||
%% \wxheading{See also}
|
||||
%%
|
||||
%% \helpref{wxStatusBar::InitColours}{wxstatusbarinitcolours}
|
||||
|
||||
\membersection{wxStatusBar::SetFieldsCount}\label{wxstatusbarsetfieldscount}
|
||||
|
||||
\func{virtual void}{SetFieldsCount}{\param{int}{ number = 1}, \param{int* }{widths = NULL}}
|
||||
@@ -230,9 +164,8 @@ Use SetStatusWidths to set the field widths.}
|
||||
|
||||
\docparam{number}{The number of fields.}
|
||||
|
||||
\docparam{widths}{An array of {\it n} integers, each of which is a status field width
|
||||
in pixels. A value of -1 indicates that the field is variable width; at least one
|
||||
field must be -1.}
|
||||
\docparam{widths}{An array of {\it n} integers interpreted in the same way as
|
||||
in \helpref{SetStatusWidths}{wxstatusbarsetstatuswidths}}
|
||||
|
||||
\membersection{wxStatusBar::SetMinHeight}\label{wxstatusbarsetminheight}
|
||||
|
||||
|
@@ -25,7 +25,7 @@ WXDLLEXPORT_DATA(extern const wxChar*) wxPanelNameStr;
|
||||
class WXDLLEXPORT wxStatusBarGeneric : public wxStatusBarBase
|
||||
{
|
||||
public:
|
||||
wxStatusBarGeneric();
|
||||
wxStatusBarGeneric() { Init(); }
|
||||
wxStatusBarGeneric(wxWindow *parent,
|
||||
wxWindowID id,
|
||||
const wxPoint& pos = wxDefaultPosition,
|
||||
@@ -33,17 +33,21 @@ public:
|
||||
long style = 0,
|
||||
const wxString& name = wxPanelNameStr)
|
||||
{
|
||||
Init();
|
||||
|
||||
Create(parent, id, pos, size, style, name);
|
||||
}
|
||||
wxStatusBarGeneric(wxWindow *parent,
|
||||
wxWindowID id,
|
||||
long style,
|
||||
const wxString& name = wxPanelNameStr)
|
||||
wxWindowID id,
|
||||
long style,
|
||||
const wxString& name = wxPanelNameStr)
|
||||
{
|
||||
Init();
|
||||
|
||||
Create(parent, id, style, name);
|
||||
}
|
||||
|
||||
~wxStatusBarGeneric();
|
||||
virtual ~wxStatusBarGeneric();
|
||||
|
||||
bool Create(wxWindow *parent, wxWindowID id,
|
||||
const wxPoint& WXUNUSED(pos) = wxDefaultPosition,
|
||||
@@ -61,7 +65,6 @@ public:
|
||||
// Create status line
|
||||
virtual void SetFieldsCount(int number = 1,
|
||||
const int *widths = (const int *) NULL);
|
||||
int GetFieldsCount() const { return m_nFields; }
|
||||
|
||||
// Set status line text
|
||||
virtual void SetStatusText(const wxString& text, int number = 0);
|
||||
@@ -89,6 +92,7 @@ public:
|
||||
void SetBorderY(int y);
|
||||
|
||||
void OnPaint(wxPaintEvent& event);
|
||||
void OnSize(wxSizeEvent& event);
|
||||
|
||||
virtual void InitColours();
|
||||
|
||||
@@ -96,7 +100,14 @@ public:
|
||||
void OnSysColourChanged(wxSysColourChangedEvent& event);
|
||||
|
||||
protected:
|
||||
// common part of all ctors
|
||||
void Init();
|
||||
|
||||
wxArrayString m_statusStrings;
|
||||
|
||||
// the widths of the status bar panes in pixels
|
||||
wxArrayInt m_widthsAbs;
|
||||
|
||||
int m_borderX;
|
||||
int m_borderY;
|
||||
wxFont m_defaultStatusBarFont;
|
||||
|
@@ -44,6 +44,8 @@
|
||||
|
||||
BEGIN_EVENT_TABLE(wxStatusBarGeneric, wxWindow)
|
||||
EVT_PAINT(wxStatusBarGeneric::OnPaint)
|
||||
EVT_SIZE(wxStatusBarGeneric::OnSize)
|
||||
|
||||
EVT_SYS_COLOUR_CHANGED(wxStatusBarGeneric::OnSysColourChanged)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
@@ -51,7 +53,7 @@ END_EVENT_TABLE()
|
||||
#define wxTHICK_LINE_BORDER 2
|
||||
#define wxTHICK_LINE_WIDTH 1
|
||||
|
||||
wxStatusBarGeneric::wxStatusBarGeneric()
|
||||
void wxStatusBarGeneric::Init()
|
||||
{
|
||||
m_borderX = wxTHICK_LINE_BORDER;
|
||||
m_borderY = wxTHICK_LINE_BORDER;
|
||||
@@ -59,9 +61,10 @@ wxStatusBarGeneric::wxStatusBarGeneric()
|
||||
|
||||
wxStatusBarGeneric::~wxStatusBarGeneric()
|
||||
{
|
||||
# ifdef __WXMSW__
|
||||
SetFont(wxNullFont);
|
||||
# endif // MSW
|
||||
// VZ: what is this for? please comment...
|
||||
#ifdef __WXMSW__
|
||||
SetFont(wxNullFont);
|
||||
#endif // MSW
|
||||
}
|
||||
|
||||
bool wxStatusBarGeneric::Create(wxWindow *parent,
|
||||
@@ -69,16 +72,10 @@ bool wxStatusBarGeneric::Create(wxWindow *parent,
|
||||
long style,
|
||||
const wxString& name)
|
||||
{
|
||||
// If create is ever meant to be re-entrant over the life of
|
||||
// an object we should:
|
||||
// m_statusStrings.Empty();
|
||||
|
||||
m_borderX = wxTHICK_LINE_BORDER;
|
||||
m_borderY = wxTHICK_LINE_BORDER;
|
||||
|
||||
bool success = wxWindow::Create(parent, id,
|
||||
wxDefaultPosition, wxDefaultSize,
|
||||
style | wxTAB_TRAVERSAL, name);
|
||||
if ( !wxWindow::Create(parent, id,
|
||||
wxDefaultPosition, wxDefaultSize,
|
||||
style | wxTAB_TRAVERSAL, name) )
|
||||
return FALSE;
|
||||
|
||||
// The status bar should have a themed background
|
||||
SetThemeEnabled( TRUE );
|
||||
@@ -102,24 +99,19 @@ bool wxStatusBarGeneric::Create(wxWindow *parent,
|
||||
|
||||
SetSize(-1, -1, -1, height);
|
||||
|
||||
return success;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void wxStatusBarGeneric::SetFieldsCount(int number, const int *widths)
|
||||
{
|
||||
wxASSERT_MSG( number >= 0,
|
||||
_T("Yes, number should be a size_t and less than no fields is silly.") );
|
||||
|
||||
// if( number > m_nFields )
|
||||
wxASSERT_MSG( number >= 0, _T("negative number of fields in wxStatusBar?") );
|
||||
|
||||
int i;
|
||||
for(i = m_nFields; i < number; ++i)
|
||||
m_statusStrings.Add( wxEmptyString );
|
||||
|
||||
// if( number < m_nFields )
|
||||
|
||||
for (i = m_nFields - 1; i >= number; --i)
|
||||
m_statusStrings.Remove(i);
|
||||
m_statusStrings.RemoveAt(i);
|
||||
|
||||
m_nFields = number;
|
||||
|
||||
@@ -161,6 +153,9 @@ void wxStatusBarGeneric::SetStatusWidths(int n, const int widths_field[])
|
||||
// documented, but let's keep it for now
|
||||
ReinitWidths();
|
||||
|
||||
// forget the old cached pixel widths
|
||||
m_widthsAbs.Empty();
|
||||
|
||||
if ( !widths_field )
|
||||
{
|
||||
// not an error, see the comment above
|
||||
@@ -191,6 +186,7 @@ void wxStatusBarGeneric::OnPaint(wxPaintEvent& WXUNUSED(event) )
|
||||
for ( i = 0; i < m_nFields; i ++ )
|
||||
DrawField(dc, i);
|
||||
|
||||
// VZ: again, what is this for?
|
||||
#ifdef __WXMSW__
|
||||
dc.SetFont(wxNullFont);
|
||||
#endif // MSW
|
||||
@@ -273,73 +269,36 @@ void wxStatusBarGeneric::DrawField(wxDC& dc, int i)
|
||||
// Get the position and size of the field's internal bounding rectangle
|
||||
bool wxStatusBarGeneric::GetFieldRect(int n, wxRect& rect) const
|
||||
{
|
||||
wxCHECK_MSG( (n >= 0) && (n < m_nFields), FALSE,
|
||||
_T("invalid status bar field index") );
|
||||
wxCHECK_MSG( (n >= 0) && (n < m_nFields), FALSE,
|
||||
_T("invalid status bar field index") );
|
||||
|
||||
int width, height;
|
||||
// FIXME: workarounds for OS/2 bugs have nothing to do here (VZ)
|
||||
int width, height;
|
||||
#ifdef __WXPM__
|
||||
GetSize(&width, &height);
|
||||
GetSize(&width, &height);
|
||||
#else
|
||||
GetClientSize(&width, &height);
|
||||
GetClientSize(&width, &height);
|
||||
#endif
|
||||
|
||||
int i;
|
||||
int sum_of_nonvar = 0;
|
||||
int num_of_var = 0;
|
||||
bool do_same_width = FALSE;
|
||||
|
||||
int fieldWidth = 0;
|
||||
int fieldPosition = 0;
|
||||
|
||||
if (m_statusWidths)
|
||||
{
|
||||
// if sum(not variable Windows) > c_width - (20 points per variable_window)
|
||||
// then do_same_width = TRUE;
|
||||
for (i = 0; i < m_nFields; i++)
|
||||
// we cache m_widthsAbs between calls normally but it's cleared when the
|
||||
// status widths change so recompute it if needed
|
||||
if ( m_widthsAbs.IsEmpty() )
|
||||
{
|
||||
if (m_statusWidths[i] > 0) sum_of_nonvar += m_statusWidths[i];
|
||||
else num_of_var++;
|
||||
}
|
||||
if (sum_of_nonvar > (width - 20*num_of_var)) do_same_width = TRUE;
|
||||
}
|
||||
else do_same_width = TRUE;
|
||||
if (do_same_width)
|
||||
{
|
||||
for (i = 0; i < m_nFields; i++)
|
||||
{
|
||||
fieldWidth = (int)(width/m_nFields);
|
||||
fieldPosition = i*fieldWidth;
|
||||
if ( i == n )
|
||||
break;
|
||||
wxConstCast(this, wxStatusBarGeneric)->
|
||||
m_widthsAbs = CalculateAbsWidths(width);
|
||||
}
|
||||
}
|
||||
else // no_same_width
|
||||
{
|
||||
int *tempwidth = new int[m_nFields];
|
||||
int temppos = 0;
|
||||
for (i = 0; i < m_nFields; i++)
|
||||
|
||||
rect.x = 0;
|
||||
for ( int i = 0; i < n; i++ )
|
||||
{
|
||||
if (m_statusWidths[i] > 0) tempwidth[i] = m_statusWidths[i];
|
||||
else tempwidth[i] = (width - sum_of_nonvar) / num_of_var;
|
||||
rect.x += m_widthsAbs[i];
|
||||
}
|
||||
for (i = 0; i < m_nFields; i++)
|
||||
{
|
||||
fieldWidth = tempwidth[i];
|
||||
fieldPosition = temppos;
|
||||
|
||||
temppos += tempwidth[i];
|
||||
rect.x += m_borderX;
|
||||
rect.y = m_borderY;
|
||||
|
||||
if ( i == n )
|
||||
break;
|
||||
}
|
||||
delete [] tempwidth;
|
||||
}
|
||||
|
||||
rect.x = fieldPosition + wxTHICK_LINE_BORDER;
|
||||
rect.y = wxTHICK_LINE_BORDER;
|
||||
|
||||
rect.width = fieldWidth - 2 * wxTHICK_LINE_BORDER ;
|
||||
rect.height = height - 2 * wxTHICK_LINE_BORDER ;
|
||||
rect.width = m_widthsAbs[n] - 2*m_borderX;
|
||||
rect.height = height - 2*m_borderY;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -400,6 +359,13 @@ void wxStatusBarGeneric::SetMinHeight(int height)
|
||||
}
|
||||
}
|
||||
|
||||
void wxStatusBarGeneric::OnSize(wxSizeEvent& event)
|
||||
{
|
||||
// have to recompute the widths in pixels
|
||||
m_widthsAbs.Empty();
|
||||
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
#endif // wxUSE_STATUSBAR
|
||||
|
||||
// vi:sts=4:sw=4:et
|
||||
|
Reference in New Issue
Block a user