#pragma hdrstop
#endif
+#include "wx/univ/theme.h"
+
+#if wxUSE_THEME_WIN32
+
#ifndef WX_PRECOMP
#include "wx/timer.h"
#include "wx/intl.h"
#include "wx/window.h"
#include "wx/dcmemory.h"
+ #include "wx/dcclient.h"
#include "wx/button.h"
#include "wx/bmpbuttn.h"
#include "wx/univ/inpcons.h"
#include "wx/univ/inphand.h"
#include "wx/univ/colschem.h"
-#include "wx/univ/theme.h"
// ----------------------------------------------------------------------------
// constants
virtual wxBitmap GetFrameButtonBitmap(FrameButtonType type);
+#if wxUSE_SLIDER
+ // Fill the arguments with true or false if this slider has labels on
+ // left/right side (or top/bottom for horizontal sliders) respectively
+ static
+ void GetSliderLabelsSides(wxOrientation orient, long style,
+ bool *left, bool *right)
+ {
+ // should we draw ticks at all?
+ if ( !(style & wxSL_AUTOTICKS) )
+ {
+ *left =
+ *right = false;
+ return;
+ }
+
+ // should we draw them on both sides?
+ if ( style & wxSL_BOTH )
+ {
+ *left =
+ *right = true;
+ return;
+ }
+
+ // we draw them on one side only, determine which one
+ if ( ((style & wxSL_TOP) && (orient == wxHORIZONTAL)) ||
+ ((style & wxSL_LEFT) && (orient == wxVERTICAL)) )
+ {
+ *left = true;
+ *right = false;
+ }
+ else if ( ((style & wxSL_BOTTOM) && (orient == wxHORIZONTAL)) ||
+ ((style & wxSL_RIGHT) && (orient == wxVERTICAL)) )
+ {
+ *left = false;
+ *right = true;
+ }
+ else
+ {
+ wxFAIL_MSG( "inconsistent wxSlider flags" );
+
+ *left =
+ *right = false;
+ }
+ }
+#endif // wxUSE_SLIDER
+
private:
// the sizing parameters (TODO make them changeable)
wxSize m_sizeScrollbarArrow;
case TITLEBAR_ACTIVE_TEXT: return wxColour(GetSysColor(COLOR_CAPTIONTEXT));
case DESKTOP: return wxColour(0x808000);
+ case FRAME: return wxColour(GetSysColor(COLOR_APPWORKSPACE));
#else // !__WXMSW__
// use the standard Windows colours elsewhere
case WINDOW: return *wxWHITE;
case TITLEBAR_ACTIVE_TEXT:return *wxWHITE;
case DESKTOP: return wxColour(0x808000);
+ case FRAME: return wxColour(0x808080);
#endif // __WXMSW__
case GAUGE: return Get(HIGHLIGHT);
case MAX:
default:
- wxFAIL_MSG(_T("invalid standard colour"));
+ wxFAIL_MSG(wxT("invalid standard colour"));
return *wxBLACK;
}
}
int indexAccel)
{
wxString label2;
- label2 << _T(' ') << label << _T(' ');
+ label2 << wxT(' ') << label << wxT(' ');
if ( indexAccel != -1 )
{
// adjust it as we prepended a space
{
int xpoint = (rect.GetLeft() + rect.GetRight() + 1 - bitmap.GetWidth()) / 2;
int ypoint = (rect.GetTop() + rect.GetBottom() + 1 - bitmap.GetHeight()) / 2;
- dc.DrawBitmap(bitmap, xpoint, ypoint);
+ dc.DrawBitmap(bitmap, xpoint, ypoint, bitmap.GetMask() != NULL);
}
}
else if (style == wxTOOL_STYLE_SEPARATOR)
switch ( dir )
{
default:
- wxFAIL_MSG(_T("invaild notebook tab orientation"));
+ wxFAIL_MSG(wxT("invaild notebook tab orientation"));
// fall through
case wxTOP:
wxOrientation orient,
long style) const
{
- bool transpose = (orient == wxVERTICAL);
- bool left = ((style & wxSL_AUTOTICKS) != 0) &
- (((style & wxSL_TOP) != 0) & !transpose |
- ((style & wxSL_LEFT) != 0) & transpose |
- ((style & wxSL_BOTH) != 0));
- bool right = ((style & wxSL_AUTOTICKS) != 0) &
- (((style & wxSL_BOTTOM) != 0) & !transpose |
- ((style & wxSL_RIGHT) != 0) & transpose |
- ((style & wxSL_BOTH) != 0));
+ bool left, right;
+ GetSliderLabelsSides(orient, style, &left, &right);
wxRect rect = rectOrig;
wxSize sizeThumb = GetSliderThumbSize (rect, lenThumb, orient);
- if (orient == wxHORIZONTAL) {
+ if (orient == wxHORIZONTAL)
+ {
rect.x += SLIDER_MARGIN;
if (left & right)
{
rect.width -= 2*SLIDER_MARGIN;
rect.height = 2*BORDER_THICKNESS;
}
- else
- { // == wxVERTICAL
+ else // == wxVERTICAL
+ {
rect.y += SLIDER_MARGIN;
if (left & right)
{
y1 y2
*/
- if (flags & wxCONTROL_FOCUSED) {
- DrawFocusRect(dc, rectOrig);
- }
+ if (flags & wxCONTROL_FOCUSED)
+ DrawFocusRect(NULL, dc, rectOrig);
wxRect rect = GetSliderShaftRect(rectOrig, lenThumb, orient, style);
DrawBackground(dc, wxNullColour, rect, flags);
- bool transpose = (orient == wxVERTICAL);
- bool left = ((style & wxSL_AUTOTICKS) != 0) &
- (((style & wxSL_TOP) != 0) & !transpose |
- ((style & wxSL_LEFT) != 0) & transpose) &
- ((style & wxSL_BOTH) == 0);
- bool right = ((style & wxSL_AUTOTICKS) != 0) &
- (((style & wxSL_BOTTOM) != 0) & !transpose |
- ((style & wxSL_RIGHT) != 0) & transpose) &
- ((style & wxSL_BOTH) == 0);
+ bool left, right;
+ GetSliderLabelsSides(orient, style, &left, &right);
- wxCoord sizeArrow = (transpose ? rect.height : rect.width) / 2;
- wxCoord c = ((transpose ? rect.height : rect.width) - 2*sizeArrow);
+ bool isVertical = orient == wxVERTICAL;
+
+ wxCoord sizeArrow = (isVertical ? rect.height : rect.width) / 2;
+ wxCoord c = ((isVertical ? rect.height : rect.width) - 2*sizeArrow);
wxCoord x1, x2, x3, y1, y2, y3, y4;
- x1 = (transpose ? rect.y : rect.x);
- x2 = (transpose ? rect.GetBottom() : rect.GetRight());
+ x1 = (isVertical ? rect.y : rect.x);
+ x2 = (isVertical ? rect.GetBottom() : rect.GetRight());
x3 = (x1-1+c) + sizeArrow;
- y1 = (transpose ? rect.x : rect.y);
- y2 = (transpose ? rect.GetRight() : rect.GetBottom());
+ y1 = (isVertical ? rect.x : rect.y);
+ y2 = (isVertical ? rect.GetRight() : rect.GetBottom());
y3 = (left ? (y1-1+c) + sizeArrow : y1);
y4 = (right ? (y2+1-c) - sizeArrow : y2);
dc.SetPen(m_penBlack);
- if (left) {
- DrawLine(dc, x3+1-c, y1, x2, y3, transpose);
+ if (left)
+ {
+ DrawLine(dc, x3+1-c, y1, x2, y3, isVertical);
}
- DrawLine(dc, x2, y3, x2, y4, transpose);
+ DrawLine(dc, x2, y3, x2, y4, isVertical);
if (right)
{
- DrawLine(dc, x3+1-c, y2, x2, y4, transpose);
+ DrawLine(dc, x3+1-c, y2, x2, y4, isVertical);
}
else
{
- DrawLine(dc, x1, y2, x2, y2, transpose);
+ DrawLine(dc, x1, y2, x2, y2, isVertical);
}
dc.SetPen(m_penDarkGrey);
- DrawLine(dc, x2-1, y3+1, x2-1, y4-1, transpose);
- if (right) {
- DrawLine(dc, x3+1-c, y2-1, x2-1, y4, transpose);
+ DrawLine(dc, x2-1, y3+1, x2-1, y4-1, isVertical);
+ if (right)
+ {
+ DrawLine(dc, x3+1-c, y2-1, x2-1, y4, isVertical);
}
else
{
- DrawLine(dc, x1+1, y2-1, x2-1, y2-1, transpose);
+ DrawLine(dc, x1+1, y2-1, x2-1, y2-1, isVertical);
}
dc.SetPen(m_penHighlight);
if (left)
{
- DrawLine(dc, x1, y3, x3, y1, transpose);
- DrawLine(dc, x3+1-c, y1+1, x2-1, y3, transpose);
+ DrawLine(dc, x1, y3, x3, y1, isVertical);
+ DrawLine(dc, x3+1-c, y1+1, x2-1, y3, isVertical);
}
else
{
- DrawLine(dc, x1, y1, x2, y1, transpose);
+ DrawLine(dc, x1, y1, x2, y1, isVertical);
}
- DrawLine(dc, x1, y3, x1, y4, transpose);
+ DrawLine(dc, x1, y3, x1, y4, isVertical);
if (right)
{
- DrawLine(dc, x1, y4, x3+c, y2+c, transpose);
+ DrawLine(dc, x1, y4, x3+c, y2+c, isVertical);
}
- if (flags & wxCONTROL_PRESSED) {
+ if (flags & wxCONTROL_PRESSED)
+ {
// TODO: MSW fills the entire area inside, not just the rect
wxRect rectInt = rect;
- if ( transpose )
+ if ( isVertical )
{
rectInt.SetLeft(y3);
rectInt.SetRight(y4);
*/
// empty slider?
- if (end == start) return;
-
- bool transpose = (orient == wxVERTICAL);
- bool left = ((style & wxSL_AUTOTICKS) != 0) &
- (((style & wxSL_TOP) != 0) & !transpose |
- ((style & wxSL_LEFT) != 0) & transpose |
- ((style & wxSL_BOTH) != 0));
- bool right = ((style & wxSL_AUTOTICKS) != 0) &
- (((style & wxSL_BOTTOM) != 0) & !transpose |
- ((style & wxSL_RIGHT) != 0) & transpose |
- ((style & wxSL_BOTH) != 0));
+ if ( end == start )
+ return;
+
+ bool left, right;
+ GetSliderLabelsSides(orient, style, &left, &right);
+
+ bool isVertical = orient == wxVERTICAL;
// default thumb size
wxSize sizeThumb = GetSliderThumbSize (rect, 0, orient);
- wxCoord defaultLen = (transpose ? sizeThumb.x : sizeThumb.y);
+ wxCoord defaultLen = (isVertical ? sizeThumb.x : sizeThumb.y);
// normal thumb size
sizeThumb = GetSliderThumbSize (rect, lenThumb, orient);
- wxCoord widthThumb = (transpose ? sizeThumb.y : sizeThumb.x);
+ wxCoord widthThumb = (isVertical ? sizeThumb.y : sizeThumb.x);
wxRect rectShaft = GetSliderShaftRect (rect, lenThumb, orient, style);
wxCoord x1, x2, y1, y2, y3, y4 , len;
- x1 = (transpose ? rectShaft.y : rectShaft.x) + widthThumb/2;
- x2 = (transpose ? rectShaft.GetBottom() : rectShaft.GetRight()) - widthThumb/2;
- y1 = (transpose ? rectShaft.x : rectShaft.y) - defaultLen/2;
- y2 = (transpose ? rectShaft.GetRight() : rectShaft.GetBottom()) + defaultLen/2;
- y3 = (transpose ? rect.x : rect.y);
- y4 = (transpose ? rect.GetRight() : rect.GetBottom());
+ x1 = (isVertical ? rectShaft.y : rectShaft.x) + widthThumb/2;
+ x2 = (isVertical ? rectShaft.GetBottom() : rectShaft.GetRight()) - widthThumb/2;
+ y1 = (isVertical ? rectShaft.x : rectShaft.y) - defaultLen/2;
+ y2 = (isVertical ? rectShaft.GetRight() : rectShaft.GetBottom()) + defaultLen/2;
+ y3 = (isVertical ? rect.x : rect.y);
+ y4 = (isVertical ? rect.GetRight() : rect.GetBottom());
len = x2 - x1;
dc.SetPen(m_penBlack);
int range = end - start;
- for ( int n = 0; n < range; n += step ) {
+ for ( int n = 0; n < range; n += step )
+ {
wxCoord x = x1 + (len*n) / range;
- if (left & (y1 > y3)) {
+ if (left & (y1 > y3))
+ {
DrawLine(dc, x, y1, x, y3, orient == wxVERTICAL);
}
- if (right & (y4 > y2)) {
+ if (right & (y4 > y2))
+ {
DrawLine(dc, x, y2, x, y4, orient == wxVERTICAL);
}
}
// always draw the line at the end position
- if (left & (y1 > y3)) {
+ if (left & (y1 > y3))
+ {
DrawLine(dc, x2, y1, x2, y3, orient == wxVERTICAL);
}
- if (right & (y4 > y2)) {
+ if (right & (y4 > y2))
+ {
DrawLine(dc, x2, y2, x2, y4, orient == wxVERTICAL);
}
}
h = heightText;
wxCoord widthLabel;
- dc.GetTextExtent(item->GetLabel(), &widthLabel, NULL);
+ dc.GetTextExtent(item->GetItemLabelText(), &widthLabel, NULL);
if ( widthLabel > widthLabelMax )
{
widthLabelMax = widthLabel;
// ----------------------------------------------------------------------------
/* Copyright (c) Julian Smart */
-static char *error_xpm[]={
+static const char *error_xpm[]={
/* columns rows colors chars-per-pixel */
"32 32 70 1",
"- c #BF0101",
};
/* Copyright (c) Julian Smart */
-static char *info_xpm[]={
+static const char *info_xpm[]={
/* columns rows colors chars-per-pixel */
"32 32 17 1",
"* c #A1A3FB",
};
/* Copyright (c) Julian Smart */
-static char *question_xpm[]={
+static const char *question_xpm[]={
/* columns rows colors chars-per-pixel */
"32 32 16 1",
"O c #A3A3FF",
};
/* Copyright (c) Julian Smart */
-static char *warning_xpm[]={
+static const char *warning_xpm[]={
/* columns rows colors chars-per-pixel */
"32 32 9 1",
"@ c Black",
// clicking on the control gives it focus
if ( event.ButtonDown() )
{
- wxWindow *win = control->GetInputWindow();
+ wxWindow * const win = control->GetInputWindow();
- if ( (wxWindow::FindFocus() != control->GetInputWindow()) &&
- win->AcceptsFocus() )
+ if ( win->CanAcceptFocus() && wxWindow::FindFocus() != win )
{
win->SetFocus();
bool stop = false;
if ( action == wxACTION_SCROLL_PAGE_DOWN )
{
- stop = m_renderer->HitTestScrollbar(scrollbar, m_ptStartScrolling)
- != wxHT_SCROLLBAR_BAR_2;
+ stop = scrollbar->HitTestBar(m_ptStartScrolling) != wxHT_SCROLLBAR_BAR_2;
}
else if ( action == wxACTION_SCROLL_PAGE_UP )
{
- stop = m_renderer->HitTestScrollbar(scrollbar, m_ptStartScrolling)
- != wxHT_SCROLLBAR_BAR_1;
+ stop = scrollbar->HitTestBar(m_ptStartScrolling) != wxHT_SCROLLBAR_BAR_1;
}
if ( stop )
return false;
}
- ht = m_renderer->HitTestScrollbar(scrollbar, event.GetPosition());
+ ht = scrollbar->HitTestBar(event.GetPosition());
if ( ht == m_htLast )
{
// yes it did, resume scrolling
// Always let thumb jump back if we leave the scrollbar
if ( event.Moving() )
{
- ht = m_renderer->HitTestScrollbar(scrollbar, event.GetPosition());
+ ht = scrollbar->HitTestBar(event.GetPosition());
}
else // event.Leaving()
{
if (pos.y > -40 && pos.y < scrollbar->GetSize().y+40)
pos.y = 5;
}
- ht = m_renderer->HitTestScrollbar(scrollbar, pos );
+ ht = scrollbar->HitTestBar(pos);
#endif
// if we're dragging the thumb and the mouse stays in the scrollbar, it
parentTLW = wxDynamicCast(statbar->GetParent(), wxTopLevelWindow);
wxCHECK_MSG( parentTLW, false,
- _T("the status bar should be a child of a TLW") );
+ wxT("the status bar should be a child of a TLW") );
// a maximized window can't be resized anyhow
if ( !parentTLW->IsMaximized() )
void wxWin32SystemMenuEvtHandler::Attach(wxInputConsumer *consumer)
{
- wxASSERT_MSG( m_wnd == NULL, _T("can't attach the handler twice!") );
+ wxASSERT_MSG( m_wnd == NULL, wxT("can't attach the handler twice!") );
m_wnd = wxStaticCast(consumer->GetInputWindow(), wxTopLevelWindow);
m_wnd->PushEventHandler(this);
return wxStdInputHandler::HandleActivation(consumer, activated);
}
+
+#endif // wxUSE_THEME_WIN32