]>
git.saurik.com Git - wxWidgets.git/blob - src/generic/statusbr.cpp
dbd35b40f84bf109c5886e276e1de88b5cbff18f
   1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        generic/statusbr.cpp 
   3 // Purpose:     wxStatusBarGeneric class implementation 
   4 // Author:      Julian Smart 
   8 // Copyright:   (c) Julian Smart and Markus Holzem 
   9 // Licence:     wxWindows license 
  10 ///////////////////////////////////////////////////////////////////////////// 
  13 #pragma implementation "statusbr.h" 
  16 // For compilers that support precompilation, includes "wx.h". 
  17 #include "wx/wxprec.h" 
  23 //#if !defined(__WIN32__) || !wxUSE_NATIVE_STATUSBAR 
  28 #include "wx/settings.h" 
  29 #include "wx/dcclient.h" 
  32 #include "wx/statusbr.h" 
  34 // with wxUSE_NATIVE_STATUSBAR it is not included from wx/statusbr.h 
  35 #include "wx/generic/statusbr.h" 
  37 IMPLEMENT_DYNAMIC_CLASS(wxStatusBarGeneric
, wxWindow
) 
  39 #if !defined(__WIN32__) || !wxUSE_NATIVE_STATUSBAR 
  40     IMPLEMENT_DYNAMIC_CLASS(wxStatusBar
, wxStatusBarGeneric
) 
  41 #endif // Win32 && wxUSE_NATIVE_STATUSBAR 
  43 BEGIN_EVENT_TABLE(wxStatusBarGeneric
, wxWindow
) 
  44     EVT_PAINT(wxStatusBarGeneric::OnPaint
) 
  45     EVT_SYS_COLOUR_CHANGED(wxStatusBarGeneric::OnSysColourChanged
) 
  48 // Default status border dimensions 
  49 #define         wxTHICK_LINE_BORDER 2 
  50 #define         wxTHICK_LINE_WIDTH  1 
  52 wxStatusBarGeneric::wxStatusBarGeneric() 
  54   m_statusWidths 
= (int *) NULL
; 
  55   m_statusStrings 
= (wxString 
*) NULL
; 
  57   m_borderX 
= wxTHICK_LINE_BORDER
; 
  58   m_borderY 
= wxTHICK_LINE_BORDER
; 
  61 wxStatusBarGeneric::~wxStatusBarGeneric() 
  68         delete[] m_statusWidths
; 
  69     if ( m_statusStrings 
) 
  70         delete[] m_statusStrings
; 
  73 bool wxStatusBarGeneric::Create(wxWindow 
*parent
, 
  78   m_statusWidths 
= (int *) NULL
; 
  79   m_statusStrings 
= (wxString 
*) NULL
; 
  81   m_borderX 
= wxTHICK_LINE_BORDER
; 
  82   m_borderY 
= wxTHICK_LINE_BORDER
; 
  84   bool success 
= wxWindow::Create(parent
, id
, 
  85                                   wxDefaultPosition
, wxDefaultSize
, 
  86                                   style 
| wxTAB_TRAVERSAL
, name
); 
  88   // Don't wish this to be found as a child 
  90   parent
->GetChildren().DeleteObject(this); 
  94   SetFont(m_defaultStatusBarFont
); 
  99 void wxStatusBarGeneric::SetFieldsCount(int number
, const int *widths
) 
 101     if ( number 
!= m_nFields 
) 
 105         delete[] m_statusStrings
; 
 106         m_statusStrings 
= new wxString
[number
]; 
 108 #if 0 // VZ: what is this for? 
 110         for (i 
= 0; i 
< number
; i
++) 
 111             m_statusStrings
[i
] = ""; 
 115     SetStatusWidths(number
, widths
); 
 118 void wxStatusBarGeneric::SetStatusText(const wxString
& text
, int number
) 
 120     wxCHECK_RET( (number 
>= 0) && (number 
< m_nFields
), 
 121                  _T("invalid status bar field index") ); 
 123     m_statusStrings
[number
] = text
; 
 128 wxString 
wxStatusBarGeneric::GetStatusText(int n
) const 
 130     wxCHECK_MSG( (n 
>= 0) && (n 
< m_nFields
), wxEmptyString
, 
 131                  _T("invalid status bar field index") ); 
 133     return m_statusStrings
[n
]; 
 136 void wxStatusBarGeneric::SetStatusWidths(int n
, const int widths_field
[]) 
 138     // only set status widths, when n == number of statuswindows 
 139     wxCHECK_RET( n 
== m_nFields
, _T("status bar field count mismatch") ); 
 141     // delete the old widths in any case - this function may be used to reset 
 142     // the widths to the default (all equal) 
 143     delete [] m_statusWidths
; 
 147         // not an error, see the comment above 
 148         m_statusWidths 
= (int *)NULL
; 
 155     // VZ: this doesn't do anything as is_variable is unused later 
 157     // when one window (minimum) is variable (width <= 0) 
 158     bool is_variable 
= FALSE
; 
 159     for (i 
= 0; i 
< m_nFields
; i
++) 
 161         if (widths_field
[i
] <= 0) 
 167     m_statusWidths 
= new int[n
]; 
 168     for (i 
= 0; i 
< m_nFields
; i
++) 
 170         m_statusWidths
[i
] = widths_field
[i
]; 
 174 void wxStatusBarGeneric::OnPaint(wxPaintEvent
& WXUNUSED(event
) ) 
 180   if ( GetFont().Ok() ) 
 181     dc
.SetFont(GetFont()); 
 182   dc
.SetBackgroundMode(wxTRANSPARENT
); 
 185   ::WinFillRect(vDC
.m_hPS
, &vDC
.m_rclPaint
, CLR_GREEN
); 
 188   for ( i 
= 0; i 
< m_nFields
; i 
++ ) 
 192   dc
.SetFont(wxNullFont
); 
 196 void wxStatusBarGeneric::DrawFieldText(wxDC
& dc
, int i
) 
 201   GetFieldRect(i
, rect
); 
 203   wxString 
text(GetStatusText(i
)); 
 207 #if defined(__WXPM__) 
 210   dc
.GetTextExtent(text
, &x
, &y
,&decsent
); 
 211   int xpos 
= rect
.x 
+ leftMargin
; 
 212   int ypos 
= (int) (((rect
.height 
- y 
+ 1) / 2 ) + rect
.y 
+ decsent 
) ; 
 215   dc
.GetTextExtent(text
, &x
, &y
); 
 217   int xpos 
= rect
.x 
+ leftMargin
; 
 218   int ypos 
= (int) (((rect
.height 
- y
) / 2 ) + rect
.y 
+ 0.5) ; 
 222 #if defined( __WXGTK__ ) || defined(__WXMAC__) 
 227   dc
.SetClippingRegion(rect
.x
, rect
.y
, rect
.width
, rect
.height
); 
 229   dc
.DrawText(text
, xpos
, ypos
); 
 231   dc
.DestroyClippingRegion(); 
 234 void wxStatusBarGeneric::DrawField(wxDC
& dc
, int i
) 
 237   GetFieldRect(i
, rect
); 
 240     // Have grey background, plus 3-d border - 
 241     // One black rectangle. 
 242     // Inside this, left and top sides - dark grey. Bottom and right - 
 245     dc
.SetPen(m_hilightPen
); 
 247     // Right and bottom white lines 
 248     dc
.DrawLine(rect
.x 
+ rect
.width
, rect
.y
, 
 249                 rect
.x 
+ rect
.width
, rect
.y 
+ rect
.height
); 
 250     dc
.DrawLine(rect
.x 
+ rect
.width
, rect
.y 
+ rect
.height
, 
 251                 rect
.x
, rect
.y 
+ rect
.height
); 
 253     dc
.SetPen(m_mediumShadowPen
); 
 255     // Left and top grey lines 
 256     dc
.DrawLine(rect
.x
, rect
.y 
+ rect
.height
, 
 258     dc
.DrawLine(rect
.x
, rect
.y
, 
 259         rect
.x 
+ rect
.width
, rect
.y
); 
 261     DrawFieldText(dc
, i
); 
 264   // Get the position and size of the field's internal bounding rectangle 
 265 bool wxStatusBarGeneric::GetFieldRect(int n
, wxRect
& rect
) const 
 267   wxCHECK_MSG( (n 
>= 0) && (n 
< m_nFields
), FALSE
, 
 268                _T("invalid status bar field index") ); 
 272   GetSize(&width
, &height
); 
 274   GetClientSize(&width
, &height
); 
 278   int sum_of_nonvar 
= 0; 
 280   bool do_same_width 
= FALSE
; 
 283   int fieldPosition 
= 0; 
 287     // if sum(not variable Windows) > c_width - (20 points per variable_window) 
 288     // then do_same_width = TRUE; 
 289     for (i 
= 0; i 
< m_nFields
; i
++) 
 291        if (m_statusWidths
[i
] > 0) sum_of_nonvar 
+= m_statusWidths
[i
]; 
 294      if (sum_of_nonvar 
> (width 
- 20*num_of_var
)) do_same_width 
= TRUE
; 
 296   else do_same_width 
= TRUE
; 
 299     for (i 
= 0; i 
< m_nFields
; i
++) 
 301       fieldWidth 
= (int)(width
/m_nFields
); 
 302       fieldPosition 
= i
*fieldWidth
; 
 307   else // no_same_width 
 309     int *tempwidth 
= new int[m_nFields
]; 
 311     for (i 
= 0; i 
< m_nFields
; i
++) 
 313       if (m_statusWidths
[i
] > 0) tempwidth
[i
] = m_statusWidths
[i
]; 
 314       else tempwidth
[i
] = (width 
- sum_of_nonvar
) / num_of_var
; 
 316     for (i 
= 0; i 
< m_nFields
; i
++) 
 318         fieldWidth 
= tempwidth
[i
]; 
 319         fieldPosition 
= temppos
; 
 321           temppos 
+= tempwidth
[i
]; 
 329     rect
.x 
= fieldPosition 
+ wxTHICK_LINE_BORDER
; 
 330     rect
.y 
= wxTHICK_LINE_BORDER
; 
 332     rect
.width 
= fieldWidth 
- 2 * wxTHICK_LINE_BORDER 
; 
 333     rect
.height 
= height 
- 2 * wxTHICK_LINE_BORDER 
; 
 338 // Initialize colours 
 339 void wxStatusBarGeneric::InitColours() 
 342 #if defined(__WIN95__) 
 343     wxColour 
mediumShadowColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DSHADOW
)); 
 344     m_mediumShadowPen 
= wxPen(mediumShadowColour
, 1, wxSOLID
); 
 346     wxColour 
hilightColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DHILIGHT
)); 
 347     m_hilightPen 
= wxPen(hilightColour
, 1, wxSOLID
); 
 349     m_mediumShadowPen 
= wxPen("GREY", 1, wxSOLID
); 
 350     m_hilightPen 
= wxPen("WHITE", 1, wxSOLID
); 
 353     m_defaultStatusBarFont 
= wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT
); 
 354     SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_3DFACE
)); 
 357 // Responds to colour changes, and passes event on to children. 
 358 void wxStatusBarGeneric::OnSysColourChanged(wxSysColourChangedEvent
& event
) 
 363     // Propagate the event to the non-top-level children 
 364     wxWindow::OnSysColourChanged(event
); 
 367 void wxStatusBarGeneric::SetMinHeight(int height
) 
 369     // check that this min height is not less than minimal height for the 
 373     dc
.GetTextExtent( _T("X"), NULL
, &y 
); 
 375     if ( height 
> (11*y
)/10 ) 
 377         SetSize(-1, -1, -1, height 
+ 2*m_borderY
); 
 381 //#endif // Win32 && wxUSE_NATIVE_STATUSBAR