wxCalendarCtrl: positioning fixes and colours following system settings.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@36816 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Włodzimierz Skiba
2006-01-10 21:08:07 +00:00
parent f9cc9706e4
commit d9170b47d1
3 changed files with 63 additions and 27 deletions

View File

@@ -52,6 +52,8 @@ All (GUI):
by Sandro Sigala) by Sandro Sigala)
- Added caption parameter to wxGetFontFromUser and wxGetColourFromUser. - Added caption parameter to wxGetFontFromUser and wxGetColourFromUser.
- Added wxGetMouseState function. - Added wxGetMouseState function.
- wxCalendarCtrl positioning fixes for dimensions other than best size.
- wxCalendarCtrl colour schema changed and adjusted to system settings.
wxMSW: wxMSW:

View File

@@ -161,10 +161,15 @@ public:
static wxVisualAttributes static wxVisualAttributes
GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
void OnSysColourChanged(wxSysColourChangedEvent& event);
private: private:
// common part of all ctors // common part of all ctors
void Init(); void Init();
// startup colours and reinitialization after colour changes in system
void InitColours();
// event handlers // event handlers
void OnPaint(wxPaintEvent& event); void OnPaint(wxPaintEvent& event);
void OnClick(wxMouseEvent& event); void OnClick(wxMouseEvent& event);
@@ -286,7 +291,9 @@ private:
m_colHolidayFg, m_colHolidayFg,
m_colHolidayBg, m_colHolidayBg,
m_colHeaderFg, m_colHeaderFg,
m_colHeaderBg; m_colHeaderBg,
m_colBackground,
m_colSorrounding;
// the attributes for each of the month days // the attributes for each of the month days
wxCalendarDateAttr *m_attrs[31]; wxCalendarDateAttr *m_attrs[31];

View File

@@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Name: generic/calctrl.cpp // Name: src/generic/calctrl.cpp
// Purpose: implementation fo the generic wxCalendarCtrl // Purpose: implementation fo the generic wxCalendarCtrl
// Author: Vadim Zeitlin // Author: Vadim Zeitlin
// Modified by: // Modified by:
@@ -59,6 +59,8 @@ BEGIN_EVENT_TABLE(wxCalendarCtrl, wxControl)
EVT_LEFT_DOWN(wxCalendarCtrl::OnClick) EVT_LEFT_DOWN(wxCalendarCtrl::OnClick)
EVT_LEFT_DCLICK(wxCalendarCtrl::OnDClick) EVT_LEFT_DCLICK(wxCalendarCtrl::OnDClick)
EVT_SYS_COLOUR_CHANGED(wxCalendarCtrl::OnSysColourChanged)
END_EVENT_TABLE() END_EVENT_TABLE()
#if wxUSE_EXTENDED_RTTI #if wxUSE_EXTENDED_RTTI
@@ -175,8 +177,15 @@ void wxCalendarCtrl::Init()
m_attrs[n] = NULL; m_attrs[n] = NULL;
} }
InitColours();
}
void wxCalendarCtrl::InitColours()
{
m_colHighlightFg = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT); m_colHighlightFg = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT);
m_colHighlightBg = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT); m_colHighlightBg = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT);
m_colBackground = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
m_colSorrounding = wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT);
m_colHolidayFg = *wxRED; m_colHolidayFg = *wxRED;
// don't set m_colHolidayBg - by default, same as our bg colour // don't set m_colHolidayBg - by default, same as our bg colour
@@ -194,7 +203,7 @@ bool wxCalendarCtrl::Create(wxWindow *parent,
const wxString& name) const wxString& name)
{ {
if ( !wxControl::Create(parent, id, pos, size, if ( !wxControl::Create(parent, id, pos, size,
style | wxCLIP_CHILDREN | wxWANTS_CHARS, style | wxCLIP_CHILDREN | wxWANTS_CHARS | wxFULL_REPAINT_ON_RESIZE,
wxDefaultValidator, name) ) wxDefaultValidator, name) )
{ {
return false; return false;
@@ -231,7 +240,7 @@ bool wxCalendarCtrl::Create(wxWindow *parent,
// Since we don't paint the whole background make sure that the platform // Since we don't paint the whole background make sure that the platform
// will use the right one. // will use the right one.
SetBackgroundColour(GetBackgroundColour()); SetBackgroundColour(m_colBackground);
SetHolidayAttrs(); SetHolidayAttrs();
@@ -888,8 +897,7 @@ void wxCalendarCtrl::OnPaint(wxPaintEvent& WXUNUSED(event))
#endif #endif
wxCoord y = 0; wxCoord y = 0;
wxCoord x0 = (GetSize().x - m_widthCol*7) /2; wxCoord x0 = wxMax( (GetSize().x - m_widthCol*7) /2 , 0 );
if (x0 < 0) x0 = 0;
if ( HasFlag(wxCAL_SEQUENTIAL_MONTH_SELECTION) ) if ( HasFlag(wxCAL_SEQUENTIAL_MONTH_SELECTION) )
{ {
@@ -939,8 +947,8 @@ void wxCalendarCtrl::OnPaint(wxPaintEvent& WXUNUSED(event))
if ( IsDateInRange(ldpm) && ( ( ldpm.GetYear() == m_date.GetYear() ) ? true : AllowYearChange() ) ) if ( IsDateInRange(ldpm) && ( ( ldpm.GetYear() == m_date.GetYear() ) ? true : AllowYearChange() ) )
{ {
m_leftArrowRect = wxRect(larrowx - 3, arrowy - 3, (arrowheight / 2) + 8, (arrowheight + 6)); m_leftArrowRect = wxRect(larrowx - 3, arrowy - 3, (arrowheight / 2) + 8, (arrowheight + 6));
dc.SetBrush(wxBrush(*wxBLACK, wxSOLID)); dc.SetBrush(*wxBLACK_BRUSH);
dc.SetPen(wxPen(*wxBLACK, 1, wxSOLID)); dc.SetPen(*wxBLACK_PEN);
dc.DrawPolygon(3, leftarrow, larrowx , arrowy, wxWINDING_RULE); dc.DrawPolygon(3, leftarrow, larrowx , arrowy, wxWINDING_RULE);
dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.SetBrush(*wxTRANSPARENT_BRUSH);
dc.DrawRectangle(m_leftArrowRect); dc.DrawRectangle(m_leftArrowRect);
@@ -949,8 +957,8 @@ void wxCalendarCtrl::OnPaint(wxPaintEvent& WXUNUSED(event))
if ( IsDateInRange(fdnm) && ( ( fdnm.GetYear() == m_date.GetYear() ) ? true : AllowYearChange() ) ) if ( IsDateInRange(fdnm) && ( ( fdnm.GetYear() == m_date.GetYear() ) ? true : AllowYearChange() ) )
{ {
m_rightArrowRect = wxRect(rarrowx - 4, arrowy - 3, (arrowheight / 2) + 8, (arrowheight + 6)); m_rightArrowRect = wxRect(rarrowx - 4, arrowy - 3, (arrowheight / 2) + 8, (arrowheight + 6));
dc.SetBrush(wxBrush(*wxBLACK, wxSOLID)); dc.SetBrush(*wxBLACK_BRUSH);
dc.SetPen(wxPen(*wxBLACK, 1, wxSOLID)); dc.SetPen(*wxBLACK_PEN);
dc.DrawPolygon(3, rightarrow, rarrowx , arrowy, wxWINDING_RULE); dc.DrawPolygon(3, rightarrow, rarrowx , arrowy, wxWINDING_RULE);
dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.SetBrush(*wxTRANSPARENT_BRUSH);
dc.DrawRectangle(m_rightArrowRect); dc.DrawRectangle(m_rightArrowRect);
@@ -961,7 +969,7 @@ void wxCalendarCtrl::OnPaint(wxPaintEvent& WXUNUSED(event))
} }
// first draw the week days // first draw the week days
if ( IsExposed(x0, y, 7*m_widthCol, m_heightRow) ) if ( IsExposed(x0, y, x0 + 7*m_widthCol, m_heightRow) )
{ {
#if DEBUG_PAINT #if DEBUG_PAINT
wxLogDebug("painting the header"); wxLogDebug("painting the header");
@@ -1003,7 +1011,7 @@ void wxCalendarCtrl::OnPaint(wxPaintEvent& WXUNUSED(event))
for ( size_t nWeek = 1; nWeek <= 6; nWeek++, y += m_heightRow ) for ( size_t nWeek = 1; nWeek <= 6; nWeek++, y += m_heightRow )
{ {
// if the update region doesn't intersect this row, don't paint it // if the update region doesn't intersect this row, don't paint it
if ( !IsExposed(0, y, 7*m_widthCol, m_heightRow - 1) ) if ( !IsExposed(x0, y, x0 + 7*m_widthCol, m_heightRow - 1) )
{ {
date += wxDateSpan::Week(); date += wxDateSpan::Week();
@@ -1016,6 +1024,7 @@ void wxCalendarCtrl::OnPaint(wxPaintEvent& WXUNUSED(event))
for ( int wd = 0; wd < 7; wd++ ) for ( int wd = 0; wd < 7; wd++ )
{ {
dc.SetTextBackground(m_colBackground);
if ( IsDateShown(date) ) if ( IsDateShown(date) )
{ {
// don't use wxDate::Format() which prepends 0s // don't use wxDate::Format() which prepends 0s
@@ -1034,7 +1043,7 @@ void wxCalendarCtrl::OnPaint(wxPaintEvent& WXUNUSED(event))
{ {
// surrounding week or out-of-range // surrounding week or out-of-range
// draw "disabled" // draw "disabled"
dc.SetTextForeground(*wxLIGHT_GREY); dc.SetTextForeground(m_colSorrounding);
changedColours = true; changedColours = true;
} }
else else
@@ -1176,7 +1185,7 @@ void wxCalendarCtrl::RefreshDate(const wxDateTime& date)
// always refresh the whole row at once because our OnPaint() will draw // always refresh the whole row at once because our OnPaint() will draw
// the whole row anyhow - and this allows the small optimisation in // the whole row anyhow - and this allows the small optimisation in
// OnClick() below to work // OnClick() below to work
rect.x = 0; rect.x = wxMax( (GetSize().x - m_widthCol*7) /2 , 0 );
rect.y = (m_heightRow * GetWeek(date)) + m_rowOffset; rect.y = (m_heightRow * GetWeek(date)) + m_rowOffset;
@@ -1242,38 +1251,39 @@ void wxCalendarCtrl::HighlightRange(wxPaintDC* pDC, const wxDateTime& fromdate,
{ {
int numpoints; int numpoints;
wxPoint corners[8]; // potentially 8 corners in polygon wxPoint corners[8]; // potentially 8 corners in polygon
wxCoord x0 = wxMax( (GetSize().x - m_widthCol*7) /2 , 0 );
if ( fw == tw ) if ( fw == tw )
{ {
// simple case: same week // simple case: same week
numpoints = 4; numpoints = 4;
corners[0] = wxPoint((fd - 1) * m_widthCol, (fw * m_heightRow) + m_rowOffset); corners[0] = wxPoint(x0 + (fd - 1) * m_widthCol, (fw * m_heightRow) + m_rowOffset);
corners[1] = wxPoint((fd - 1) * m_widthCol, ((fw + 1 ) * m_heightRow) + m_rowOffset); corners[1] = wxPoint(x0 + (fd - 1) * m_widthCol, ((fw + 1 ) * m_heightRow) + m_rowOffset);
corners[2] = wxPoint(td * m_widthCol, ((tw + 1) * m_heightRow) + m_rowOffset); corners[2] = wxPoint(x0 + td * m_widthCol, ((tw + 1) * m_heightRow) + m_rowOffset);
corners[3] = wxPoint(td * m_widthCol, (tw * m_heightRow) + m_rowOffset); corners[3] = wxPoint(x0 + td * m_widthCol, (tw * m_heightRow) + m_rowOffset);
} }
else else
{ {
int cidx = 0; int cidx = 0;
// "complex" polygon // "complex" polygon
corners[cidx] = wxPoint((fd - 1) * m_widthCol, (fw * m_heightRow) + m_rowOffset); cidx++; corners[cidx] = wxPoint(x0 + (fd - 1) * m_widthCol, (fw * m_heightRow) + m_rowOffset); cidx++;
if ( fd > 1 ) if ( fd > 1 )
{ {
corners[cidx] = wxPoint((fd - 1) * m_widthCol, ((fw + 1) * m_heightRow) + m_rowOffset); cidx++; corners[cidx] = wxPoint(x0 + (fd - 1) * m_widthCol, ((fw + 1) * m_heightRow) + m_rowOffset); cidx++;
corners[cidx] = wxPoint(0, ((fw + 1) * m_heightRow) + m_rowOffset); cidx++; corners[cidx] = wxPoint(x0, ((fw + 1) * m_heightRow) + m_rowOffset); cidx++;
} }
corners[cidx] = wxPoint(0, ((tw + 1) * m_heightRow) + m_rowOffset); cidx++; corners[cidx] = wxPoint(x0, ((tw + 1) * m_heightRow) + m_rowOffset); cidx++;
corners[cidx] = wxPoint(td * m_widthCol, ((tw + 1) * m_heightRow) + m_rowOffset); cidx++; corners[cidx] = wxPoint(x0 + td * m_widthCol, ((tw + 1) * m_heightRow) + m_rowOffset); cidx++;
if ( td < 7 ) if ( td < 7 )
{ {
corners[cidx] = wxPoint(td * m_widthCol, (tw * m_heightRow) + m_rowOffset); cidx++; corners[cidx] = wxPoint(x0 + td * m_widthCol, (tw * m_heightRow) + m_rowOffset); cidx++;
corners[cidx] = wxPoint(7 * m_widthCol, (tw * m_heightRow) + m_rowOffset); cidx++; corners[cidx] = wxPoint(x0 + 7 * m_widthCol, (tw * m_heightRow) + m_rowOffset); cidx++;
} }
corners[cidx] = wxPoint(7 * m_widthCol, (fw * m_heightRow) + m_rowOffset); cidx++; corners[cidx] = wxPoint(x0 + 7 * m_widthCol, (fw * m_heightRow) + m_rowOffset); cidx++;
numpoints = cidx; numpoints = cidx;
} }
@@ -1489,7 +1499,10 @@ wxCalendarHitTestResult wxCalendarCtrl::HitTest(const wxPoint& pos,
/////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////
// Header: Days // Header: Days
int wday = pos.x / m_widthCol;
wxCoord x0 = wxMax( (GetSize().x - m_widthCol*7) /2 , 0 );
int wday = ( pos.x - x0 ) / m_widthCol;
// if ( y < m_heightRow ) // if ( y < m_heightRow )
if ( y < (m_heightRow + m_rowOffset) ) if ( y < (m_heightRow + m_rowOffset) )
{ {
@@ -1599,6 +1612,20 @@ void wxCalendarCtrl::OnYearTextChange(wxCommandEvent& event)
OnYearChange(event); OnYearChange(event);
} }
// Responds to colour changes, and passes event on to children.
void wxCalendarCtrl::OnSysColourChanged(wxSysColourChangedEvent& event)
{
// reinit colours
InitColours();
// Propagate the event to the children
wxControl::OnSysColourChanged(event);
// Redraw control area
SetBackgroundColour(m_colBackground);
Refresh();
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// keyboard interface // keyboard interface
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------