1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/univ/themes/win32.cpp
3 // Purpose: wxUniversal theme implementing Win32-like LNF
4 // Author: Vadim Zeitlin
8 // Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com)
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 // ===========================================================================
14 // ===========================================================================
16 // ---------------------------------------------------------------------------
18 // ---------------------------------------------------------------------------
20 // For compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
27 #if wxUSE_ALL_THEMES || wxUSE_THEME_WIN32
33 #include "wx/window.h"
35 #include "wx/dcmemory.h"
37 #include "wx/button.h"
38 #include "wx/bmpbuttn.h"
39 #include "wx/listbox.h"
40 #include "wx/checklst.h"
41 #include "wx/combobox.h"
42 #include "wx/scrolbar.h"
43 #include "wx/slider.h"
44 #include "wx/textctrl.h"
45 #include "wx/toolbar.h"
46 #include "wx/statusbr.h"
49 // for COLOR_* constants
50 #include "wx/msw/private.h"
53 #include "wx/settings.h"
54 #include "wx/toplevel.h"
58 #include "wx/notebook.h"
59 #include "wx/spinbutt.h"
60 #include "wx/artprov.h"
61 #ifdef wxUSE_TOGGLEBTN
62 #include "wx/tglbtn.h"
63 #endif // wxUSE_TOGGLEBTN
65 #include "wx/univ/scrtimer.h"
66 #include "wx/univ/stdrend.h"
67 #include "wx/univ/inpcons.h"
68 #include "wx/univ/inphand.h"
69 #include "wx/univ/colschem.h"
70 #include "wx/univ/theme.h"
72 // ----------------------------------------------------------------------------
74 // ----------------------------------------------------------------------------
76 static const int BORDER_THICKNESS
= 2;
78 static const size_t NUM_STATUSBAR_GRIP_BANDS
= 3;
79 static const size_t WIDTH_STATUSBAR_GRIP_BAND
= 4;
80 static const size_t STATUSBAR_GRIP_SIZE
=
81 WIDTH_STATUSBAR_GRIP_BAND
*NUM_STATUSBAR_GRIP_BANDS
;
83 static const wxCoord SLIDER_MARGIN
= 6; // margin around slider
84 static const wxCoord SLIDER_THUMB_LENGTH
= 18;
85 static const wxCoord SLIDER_TICK_LENGTH
= 6;
87 // wxWin32Renderer: draw the GUI elements in Win32 style
88 // ----------------------------------------------------------------------------
90 class wxWin32Renderer
: public wxStdRenderer
94 wxWin32Renderer(const wxColourScheme
*scheme
);
96 // reimplement the renderer methods which are different for this theme
97 virtual void DrawLabel(wxDC
& dc
,
98 const wxString
& label
,
101 int alignment
= wxALIGN_LEFT
| wxALIGN_TOP
,
103 wxRect
*rectBounds
= NULL
);
104 virtual void DrawButtonLabel(wxDC
& dc
,
105 const wxString
& label
,
106 const wxBitmap
& image
,
109 int alignment
= wxALIGN_LEFT
| wxALIGN_TOP
,
111 wxRect
*rectBounds
= NULL
);
112 virtual void DrawButtonBorder(wxDC
& dc
,
115 wxRect
*rectIn
= NULL
);
117 virtual void DrawArrow(wxDC
& dc
,
121 virtual void DrawScrollbarThumb(wxDC
& dc
,
122 wxOrientation orient
,
125 virtual void DrawScrollbarShaft(wxDC
& dc
,
126 wxOrientation orient
,
131 virtual void DrawToolBarButton(wxDC
& dc
,
132 const wxString
& label
,
133 const wxBitmap
& bitmap
,
138 #endif // wxUSE_TOOLBAR
141 virtual void DrawTab(wxDC
& dc
,
144 const wxString
& label
,
145 const wxBitmap
& bitmap
= wxNullBitmap
,
147 int indexAccel
= -1);
148 #endif // wxUSE_NOTEBOOK
151 virtual void DrawSliderShaft(wxDC
& dc
,
154 wxOrientation orient
,
157 wxRect
*rectShaft
= NULL
);
158 virtual void DrawSliderThumb(wxDC
& dc
,
160 wxOrientation orient
,
163 virtual void DrawSliderTicks(wxDC
& dc
,
166 wxOrientation orient
,
172 #endif // wxUSE_SLIDER
175 virtual void DrawMenuBarItem(wxDC
& dc
,
177 const wxString
& label
,
179 int indexAccel
= -1);
180 virtual void DrawMenuItem(wxDC
& dc
,
182 const wxMenuGeometryInfo
& geometryInfo
,
183 const wxString
& label
,
184 const wxString
& accel
,
185 const wxBitmap
& bitmap
= wxNullBitmap
,
187 int indexAccel
= -1);
188 virtual void DrawMenuSeparator(wxDC
& dc
,
190 const wxMenuGeometryInfo
& geomInfo
);
191 #endif // wxUSE_MENUS
194 virtual void DrawStatusField(wxDC
& dc
,
196 const wxString
& label
,
197 int flags
= 0, int style
= 0);
198 #endif // wxUSE_STATUSBAR
200 virtual void GetComboBitmaps(wxBitmap
*bmpNormal
,
202 wxBitmap
*bmpPressed
,
203 wxBitmap
*bmpDisabled
);
205 virtual void AdjustSize(wxSize
*size
, const wxWindow
*window
);
206 virtual bool AreScrollbarsInsideBorder() const;
208 virtual wxSize
GetScrollbarArrowSize() const
209 { return m_sizeScrollbarArrow
; }
211 virtual wxSize
GetCheckBitmapSize() const
212 { return wxSize(13, 13); }
213 virtual wxSize
GetRadioBitmapSize() const
214 { return wxSize(12, 12); }
215 virtual wxCoord
GetCheckItemMargin() const
219 virtual wxSize
GetToolBarButtonSize(wxCoord
*separator
) const
220 { if ( separator
) *separator
= 5; return wxSize(16, 15); }
221 virtual wxSize
GetToolBarMargin() const
222 { return wxSize(4, 4); }
223 #endif // wxUSE_TOOLBAR
226 virtual wxRect
GetTextTotalArea(const wxTextCtrl
*text
,
227 const wxRect
& rect
) const;
228 virtual wxRect
GetTextClientArea(const wxTextCtrl
*text
,
230 wxCoord
*extraSpaceBeyond
) const;
231 #endif // wxUSE_TEXTCTRL
234 virtual wxSize
GetTabIndent() const { return wxSize(2, 2); }
235 virtual wxSize
GetTabPadding() const { return wxSize(6, 5); }
236 #endif // wxUSE_NOTEBOOK
240 virtual wxCoord
GetSliderDim() const { return SLIDER_THUMB_LENGTH
+ 2*BORDER_THICKNESS
; }
241 virtual wxCoord
GetSliderTickLen() const { return SLIDER_TICK_LENGTH
; }
242 virtual wxRect
GetSliderShaftRect(const wxRect
& rect
,
244 wxOrientation orient
,
245 long style
= 0) const;
246 virtual wxSize
GetSliderThumbSize(const wxRect
& rect
,
248 wxOrientation orient
) const;
249 #endif // wxUSE_SLIDER
251 virtual wxSize
GetProgressBarStep() const { return wxSize(16, 32); }
254 virtual wxSize
GetMenuBarItemSize(const wxSize
& sizeText
) const;
255 virtual wxMenuGeometryInfo
*GetMenuGeometry(wxWindow
*win
,
256 const wxMenu
& menu
) const;
257 #endif // wxUSE_MENUS
260 // overridden wxStdRenderer methods
261 virtual void DrawFrameWithLabel(wxDC
& dc
,
262 const wxString
& label
,
263 const wxRect
& rectFrame
,
264 const wxRect
& rectText
,
269 virtual void DrawCheckItemBitmap(wxDC
& dc
,
270 const wxBitmap
& bitmap
,
275 // draw the border used for scrollbar arrows
276 void DrawArrowBorder(wxDC
& dc
, wxRect
*rect
, bool isPressed
= false);
278 // public DrawArrow()s helper
279 void DrawArrow(wxDC
& dc
, const wxRect
& rect
,
280 ArrowDirection arrowDir
, ArrowStyle arrowStyle
);
282 // DrawArrowButton is used by DrawScrollbar and DrawComboButton
283 void DrawArrowButton(wxDC
& dc
, const wxRect
& rect
,
284 ArrowDirection arrowDir
,
285 ArrowStyle arrowStyle
);
287 // draw a normal or transposed line (useful for using the same code fo both
288 // horizontal and vertical widgets)
289 void DrawLine(wxDC
& dc
,
290 wxCoord x1
, wxCoord y1
,
291 wxCoord x2
, wxCoord y2
,
292 bool transpose
= false)
295 dc
.DrawLine(y1
, x1
, y2
, x2
);
297 dc
.DrawLine(x1
, y1
, x2
, y2
);
300 // get the standard check/radio button bitmap
301 wxBitmap
GetIndicator(IndicatorType indType
, int flags
);
302 virtual wxBitmap
GetCheckBitmap(int flags
)
303 { return GetIndicator(IndicatorType_Check
, flags
); }
304 virtual wxBitmap
GetRadioBitmap(int flags
)
305 { return GetIndicator(IndicatorType_Radio
, flags
); }
307 virtual wxBitmap
GetFrameButtonBitmap(FrameButtonType type
);
310 // the sizing parameters (TODO make them changeable)
311 wxSize m_sizeScrollbarArrow
;
313 // the checked and unchecked bitmaps for DrawCheckItemBitmap()
314 wxBitmap m_bmpCheckBitmaps
[IndicatorStatus_Max
];
316 // the bitmaps returned by GetIndicator()
317 wxBitmap m_bmpIndicators
[IndicatorType_Max
]
318 [IndicatorState_MaxMenu
]
319 [IndicatorStatus_Max
];
322 wxBitmap m_bmpFrameButtons
[FrameButton_Max
];
324 // standard defaults for the above bitmaps
325 static const char **ms_xpmChecked
[IndicatorStatus_Max
];
326 static const char **ms_xpmIndicators
[IndicatorType_Max
]
327 [IndicatorState_MaxMenu
]
328 [IndicatorStatus_Max
];
329 static const char **ms_xpmFrameButtons
[FrameButton_Max
];
331 // first row is for the normal state, second - for the disabled
332 wxBitmap m_bmpArrows
[Arrow_StateMax
][Arrow_Max
];
335 // ----------------------------------------------------------------------------
336 // wxWin32InputHandler and derived classes: process the keyboard and mouse
337 // messages according to Windows standards
338 // ----------------------------------------------------------------------------
340 class wxWin32InputHandler
: public wxInputHandler
343 wxWin32InputHandler() { }
345 virtual bool HandleKey(wxInputConsumer
*control
,
346 const wxKeyEvent
& event
,
348 virtual bool HandleMouse(wxInputConsumer
*control
,
349 const wxMouseEvent
& event
);
353 class wxWin32ScrollBarInputHandler
: public wxStdScrollBarInputHandler
356 wxWin32ScrollBarInputHandler(wxRenderer
*renderer
,
357 wxInputHandler
*handler
);
359 virtual bool HandleMouse(wxInputConsumer
*control
,
360 const wxMouseEvent
& event
);
361 virtual bool HandleMouseMove(wxInputConsumer
*control
,
362 const wxMouseEvent
& event
);
364 virtual bool OnScrollTimer(wxScrollBar
*scrollbar
,
365 const wxControlAction
& action
);
368 virtual void Highlight(wxScrollBar
* WXUNUSED(scrollbar
),
371 // we don't highlight anything
374 // the first and last event which caused the thumb to move
375 wxMouseEvent m_eventStartDrag
,
378 // have we paused the scrolling because the mouse moved?
381 // we remember the interval of the timer to be able to restart it
384 #endif // wxUSE_SCROLLBAR
387 class wxWin32CheckboxInputHandler
: public wxStdInputHandler
390 wxWin32CheckboxInputHandler(wxInputHandler
*handler
)
391 : wxStdInputHandler(handler
) { }
393 virtual bool HandleKey(wxInputConsumer
*control
,
394 const wxKeyEvent
& event
,
397 #endif // wxUSE_CHECKBOX
400 class wxWin32TextCtrlInputHandler
: public wxStdInputHandler
403 wxWin32TextCtrlInputHandler(wxInputHandler
*handler
)
404 : wxStdInputHandler(handler
) { }
406 virtual bool HandleKey(wxInputConsumer
*control
,
407 const wxKeyEvent
& event
,
410 #endif // wxUSE_TEXTCTRL
412 class wxWin32StatusBarInputHandler
: public wxStdInputHandler
415 wxWin32StatusBarInputHandler(wxInputHandler
*handler
);
417 virtual bool HandleMouse(wxInputConsumer
*consumer
,
418 const wxMouseEvent
& event
);
420 virtual bool HandleMouseMove(wxInputConsumer
*consumer
,
421 const wxMouseEvent
& event
);
424 // is the given point over the statusbar grip?
425 bool IsOnGrip(wxWindow
*statbar
, const wxPoint
& pt
) const;
428 // the cursor we had replaced with the resize one
429 wxCursor m_cursorOld
;
431 // was the mouse over the grip last time we checked?
435 class wxWin32SystemMenuEvtHandler
;
437 class wxWin32FrameInputHandler
: public wxStdInputHandler
440 wxWin32FrameInputHandler(wxInputHandler
*handler
);
441 virtual ~wxWin32FrameInputHandler();
443 virtual bool HandleMouse(wxInputConsumer
*control
,
444 const wxMouseEvent
& event
);
446 virtual bool HandleActivation(wxInputConsumer
*consumer
, bool activated
);
449 void PopupSystemMenu(wxTopLevelWindow
*window
) const;
450 #endif // wxUSE_MENUS
453 // was the mouse over the grip last time we checked?
454 wxWin32SystemMenuEvtHandler
*m_menuHandler
;
457 // ----------------------------------------------------------------------------
458 // wxWin32ColourScheme: uses (default) Win32 colours
459 // ----------------------------------------------------------------------------
461 class wxWin32ColourScheme
: public wxColourScheme
464 virtual wxColour
Get(StdColour col
) const;
465 virtual wxColour
GetBackground(wxWindow
*win
) const;
468 // ----------------------------------------------------------------------------
469 // wxWin32ArtProvider
470 // ----------------------------------------------------------------------------
472 class wxWin32ArtProvider
: public wxArtProvider
475 virtual wxBitmap
CreateBitmap(const wxArtID
& id
,
476 const wxArtClient
& client
,
480 // ----------------------------------------------------------------------------
482 // ----------------------------------------------------------------------------
484 WX_DEFINE_ARRAY_PTR(wxInputHandler
*, wxArrayHandlers
);
486 class wxWin32Theme
: public wxTheme
490 virtual ~wxWin32Theme();
492 virtual wxRenderer
*GetRenderer();
493 virtual wxArtProvider
*GetArtProvider();
494 virtual wxInputHandler
*GetInputHandler(const wxString
& control
,
495 wxInputConsumer
*consumer
);
496 virtual wxColourScheme
*GetColourScheme();
499 wxWin32Renderer
*m_renderer
;
501 wxWin32ArtProvider
*m_artProvider
;
503 // the names of the already created handlers and the handlers themselves
504 // (these arrays are synchronized)
505 wxSortedArrayString m_handlerNames
;
506 wxArrayHandlers m_handlers
;
508 wxWin32ColourScheme
*m_scheme
;
510 WX_DECLARE_THEME(win32
)
513 // ----------------------------------------------------------------------------
515 // ----------------------------------------------------------------------------
517 // frame buttons bitmaps
518 static const char *frame_button_close_xpm
[] = {
533 static const char *frame_button_help_xpm
[] = {
548 static const char *frame_button_maximize_xpm
[] = {
563 static const char *frame_button_minimize_xpm
[] = {
578 static const char *frame_button_restore_xpm
[] = {
593 const char **wxWin32Renderer::ms_xpmFrameButtons
[FrameButton_Max
] =
595 frame_button_close_xpm
,
596 frame_button_minimize_xpm
,
597 frame_button_maximize_xpm
,
598 frame_button_restore_xpm
,
599 frame_button_help_xpm
,
604 static const char *checked_menu_xpm
[] = {
605 /* columns rows colors chars-per-pixel */
621 static const char *selected_checked_menu_xpm
[] = {
622 /* columns rows colors chars-per-pixel */
638 static const char *disabled_checked_menu_xpm
[] = {
639 /* columns rows colors chars-per-pixel */
656 static const char *selected_disabled_checked_menu_xpm
[] = {
657 /* columns rows colors chars-per-pixel */
673 // checkbox and radiobox bitmaps below
675 static const char *checked_xpm
[] = {
676 /* columns rows colors chars-per-pixel */
699 static const char *pressed_checked_xpm
[] = {
700 /* columns rows colors chars-per-pixel */
722 static const char *pressed_disabled_checked_xpm
[] = {
723 /* columns rows colors chars-per-pixel */
745 static const char *checked_item_xpm
[] = {
746 /* columns rows colors chars-per-pixel */
767 static const char *unchecked_xpm
[] = {
768 /* columns rows colors chars-per-pixel */
791 static const char *pressed_unchecked_xpm
[] = {
792 /* columns rows colors chars-per-pixel */
814 static const char *unchecked_item_xpm
[] = {
815 /* columns rows colors chars-per-pixel */
835 static const char *undetermined_xpm
[] = {
836 /* columns rows colors chars-per-pixel */
859 static const char *pressed_undetermined_xpm
[] = {
860 /* columns rows colors chars-per-pixel */
883 static const char *checked_radio_xpm
[] = {
884 /* columns rows colors chars-per-pixel */
907 static const char *pressed_checked_radio_xpm
[] = {
908 /* columns rows colors chars-per-pixel */
931 static const char *pressed_disabled_checked_radio_xpm
[] = {
932 /* columns rows colors chars-per-pixel */
955 static const char *unchecked_radio_xpm
[] = {
956 /* columns rows colors chars-per-pixel */
979 static const char *pressed_unchecked_radio_xpm
[] = {
980 /* columns rows colors chars-per-pixel */
1003 const char **wxWin32Renderer::ms_xpmIndicators
[IndicatorType_Max
]
1004 [IndicatorState_MaxMenu
]
1005 [IndicatorStatus_Max
] =
1010 { checked_xpm
, unchecked_xpm
, undetermined_xpm
},
1013 { pressed_checked_xpm
, pressed_unchecked_xpm
, pressed_undetermined_xpm
},
1016 { pressed_disabled_checked_xpm
, pressed_unchecked_xpm
, pressed_disabled_checked_xpm
},
1022 { checked_radio_xpm
, unchecked_radio_xpm
, NULL
},
1025 { pressed_checked_radio_xpm
, pressed_unchecked_radio_xpm
, NULL
},
1028 { pressed_disabled_checked_radio_xpm
, pressed_unchecked_radio_xpm
, NULL
},
1034 { checked_menu_xpm
, NULL
, NULL
},
1037 { selected_checked_menu_xpm
, NULL
, NULL
},
1040 { disabled_checked_menu_xpm
, NULL
, NULL
},
1042 // disabled selected state
1043 { selected_disabled_checked_menu_xpm
, NULL
, NULL
},
1047 const char **wxWin32Renderer::ms_xpmChecked
[IndicatorStatus_Max
] =
1053 // ============================================================================
1055 // ============================================================================
1057 WX_IMPLEMENT_THEME(wxWin32Theme
, win32
, wxTRANSLATE("Win32 theme"));
1059 // ----------------------------------------------------------------------------
1061 // ----------------------------------------------------------------------------
1063 wxWin32Theme::wxWin32Theme()
1067 m_artProvider
= NULL
;
1070 wxWin32Theme::~wxWin32Theme()
1074 delete m_artProvider
;
1077 wxRenderer
*wxWin32Theme::GetRenderer()
1081 m_renderer
= new wxWin32Renderer(GetColourScheme());
1087 wxArtProvider
*wxWin32Theme::GetArtProvider()
1089 if ( !m_artProvider
)
1091 m_artProvider
= new wxWin32ArtProvider
;
1094 return m_artProvider
;
1098 wxWin32Theme::GetInputHandler(const wxString
& control
,
1099 wxInputConsumer
*consumer
)
1101 wxInputHandler
*handler
= NULL
;
1102 int n
= m_handlerNames
.Index(control
);
1103 if ( n
== wxNOT_FOUND
)
1105 static wxWin32InputHandler s_handlerDef
;
1107 wxInputHandler
* const
1108 handlerStd
= consumer
->DoGetStdInputHandler(&s_handlerDef
);
1110 // create a new handler
1111 if ( control
== wxINP_HANDLER_TOPLEVEL
)
1113 static wxWin32FrameInputHandler
s_handler(handlerStd
);
1115 handler
= &s_handler
;
1118 else if ( control
== wxINP_HANDLER_CHECKBOX
)
1120 static wxWin32CheckboxInputHandler
s_handler(handlerStd
);
1122 handler
= &s_handler
;
1124 #endif // wxUSE_CHECKBOX
1126 else if ( control
== wxINP_HANDLER_SCROLLBAR
)
1128 static wxWin32ScrollBarInputHandler
1129 s_handler(GetRenderer(), handlerStd
);
1131 handler
= &s_handler
;
1133 #endif // wxUSE_SCROLLBAR
1135 else if ( control
== wxINP_HANDLER_STATUSBAR
)
1137 static wxWin32StatusBarInputHandler
s_handler(handlerStd
);
1139 handler
= &s_handler
;
1141 #endif // wxUSE_STATUSBAR
1143 else if ( control
== wxINP_HANDLER_TEXTCTRL
)
1145 static wxWin32TextCtrlInputHandler
s_handler(handlerStd
);
1147 handler
= &s_handler
;
1149 #endif // wxUSE_TEXTCTRL
1150 else // no special handler for this control
1152 handler
= handlerStd
;
1155 n
= m_handlerNames
.Add(control
);
1156 m_handlers
.Insert(handler
, n
);
1158 else // we already have it
1160 handler
= m_handlers
[n
];
1166 wxColourScheme
*wxWin32Theme::GetColourScheme()
1170 m_scheme
= new wxWin32ColourScheme
;
1175 // ============================================================================
1176 // wxWin32ColourScheme
1177 // ============================================================================
1179 wxColour
wxWin32ColourScheme::GetBackground(wxWindow
*win
) const
1182 if ( win
->UseBgCol() )
1184 // use the user specified colour
1185 col
= win
->GetBackgroundColour();
1188 if ( !win
->ShouldInheritColours() )
1191 wxTextCtrl
*text
= wxDynamicCast(win
, wxTextCtrl
);
1192 #endif // wxUSE_TEXTCTRL
1194 wxListBox
* listBox
= wxDynamicCast(win
, wxListBox
);
1195 #endif // wxUSE_LISTBOX
1204 if ( !win
->IsEnabled() ) // not IsEditable()
1210 // doesn't depend on the state
1215 #endif // wxUSE_TEXTCTRL
1218 col
= Get(CONTROL
); // Most controls should be this colour, not WINDOW
1222 int flags
= win
->GetStateFlags();
1224 // the colour set by the user should be used for the normal state
1225 // and for the states for which we don't have any specific colours
1226 if ( !col
.Ok() || (flags
& wxCONTROL_PRESSED
) != 0 )
1229 if ( wxDynamicCast(win
, wxScrollBar
) )
1230 col
= Get(flags
& wxCONTROL_PRESSED
? SCROLLBAR_PRESSED
1233 #endif // wxUSE_SCROLLBAR
1241 wxColour
wxWin32ColourScheme::Get(wxWin32ColourScheme::StdColour col
) const
1245 // use the system colours under Windows
1246 #if defined(__WXMSW__)
1247 case WINDOW
: return wxColour(GetSysColor(COLOR_WINDOW
));
1249 case CONTROL_PRESSED
:
1250 case CONTROL_CURRENT
:
1251 case CONTROL
: return wxColour(GetSysColor(COLOR_BTNFACE
));
1253 case CONTROL_TEXT
: return wxColour(GetSysColor(COLOR_BTNTEXT
));
1255 #if defined(COLOR_3DLIGHT)
1256 case SCROLLBAR
: return wxColour(GetSysColor(COLOR_3DLIGHT
));
1258 case SCROLLBAR
: return wxColour(0xe0e0e0);
1260 case SCROLLBAR_PRESSED
: return wxColour(GetSysColor(COLOR_BTNTEXT
));
1262 case HIGHLIGHT
: return wxColour(GetSysColor(COLOR_HIGHLIGHT
));
1263 case HIGHLIGHT_TEXT
: return wxColour(GetSysColor(COLOR_HIGHLIGHTTEXT
));
1265 #if defined(COLOR_3DDKSHADOW)
1266 case SHADOW_DARK
: return wxColour(GetSysColor(COLOR_3DDKSHADOW
));
1268 case SHADOW_DARK
: return wxColour(GetSysColor(COLOR_3DHADOW
));
1271 case CONTROL_TEXT_DISABLED
:
1272 case SHADOW_HIGHLIGHT
: return wxColour(GetSysColor(COLOR_BTNHIGHLIGHT
));
1274 case SHADOW_IN
: return wxColour(GetSysColor(COLOR_BTNFACE
));
1276 case CONTROL_TEXT_DISABLED_SHADOW
:
1277 case SHADOW_OUT
: return wxColour(GetSysColor(COLOR_BTNSHADOW
));
1279 case TITLEBAR
: return wxColour(GetSysColor(COLOR_INACTIVECAPTION
));
1280 case TITLEBAR_ACTIVE
: return wxColour(GetSysColor(COLOR_ACTIVECAPTION
));
1281 case TITLEBAR_TEXT
: return wxColour(GetSysColor(COLOR_INACTIVECAPTIONTEXT
));
1282 case TITLEBAR_ACTIVE_TEXT
: return wxColour(GetSysColor(COLOR_CAPTIONTEXT
));
1284 case DESKTOP
: return wxColour(0x808000);
1286 // use the standard Windows colours elsewhere
1287 case WINDOW
: return *wxWHITE
;
1289 case CONTROL_PRESSED
:
1290 case CONTROL_CURRENT
:
1291 case CONTROL
: return wxColour(0xc0c0c0);
1293 case CONTROL_TEXT
: return *wxBLACK
;
1295 case SCROLLBAR
: return wxColour(0xe0e0e0);
1296 case SCROLLBAR_PRESSED
: return *wxBLACK
;
1298 case HIGHLIGHT
: return wxColour(0x800000);
1299 case HIGHLIGHT_TEXT
: return wxColour(0xffffff);
1301 case SHADOW_DARK
: return *wxBLACK
;
1303 case CONTROL_TEXT_DISABLED
:return wxColour(0xe0e0e0);
1304 case SHADOW_HIGHLIGHT
: return wxColour(0xffffff);
1306 case SHADOW_IN
: return wxColour(0xc0c0c0);
1308 case CONTROL_TEXT_DISABLED_SHADOW
:
1309 case SHADOW_OUT
: return wxColour(0x7f7f7f);
1311 case TITLEBAR
: return wxColour(0xaeaaae);
1312 case TITLEBAR_ACTIVE
: return wxColour(0x820300);
1313 case TITLEBAR_TEXT
: return wxColour(0xc0c0c0);
1314 case TITLEBAR_ACTIVE_TEXT
:return *wxWHITE
;
1316 case DESKTOP
: return wxColour(0x808000);
1319 case GAUGE
: return Get(HIGHLIGHT
);
1323 wxFAIL_MSG(_T("invalid standard colour"));
1328 // ============================================================================
1330 // ============================================================================
1332 // ----------------------------------------------------------------------------
1334 // ----------------------------------------------------------------------------
1336 wxWin32Renderer::wxWin32Renderer(const wxColourScheme
*scheme
)
1337 : wxStdRenderer(scheme
)
1340 m_sizeScrollbarArrow
= wxSize(16, 16);
1342 // init the arrow bitmaps
1343 static const size_t ARROW_WIDTH
= 7;
1344 static const size_t ARROW_LENGTH
= 4;
1347 wxMemoryDC dcNormal
,
1350 for ( size_t n
= 0; n
< Arrow_Max
; n
++ )
1352 bool isVertical
= n
> Arrow_Right
;
1365 // disabled arrow is larger because of the shadow
1366 m_bmpArrows
[Arrow_Normal
][n
].Create(w
, h
);
1367 m_bmpArrows
[Arrow_Disabled
][n
].Create(w
+ 1, h
+ 1);
1369 dcNormal
.SelectObject(m_bmpArrows
[Arrow_Normal
][n
]);
1370 dcDisabled
.SelectObject(m_bmpArrows
[Arrow_Disabled
][n
]);
1372 dcNormal
.SetBackground(*wxWHITE_BRUSH
);
1373 dcDisabled
.SetBackground(*wxWHITE_BRUSH
);
1377 dcNormal
.SetPen(m_penBlack
);
1378 dcDisabled
.SetPen(m_penDarkGrey
);
1380 // calculate the position of the point of the arrow
1384 x1
= (ARROW_WIDTH
- 1)/2;
1385 y1
= n
== Arrow_Up
? 0 : ARROW_LENGTH
- 1;
1389 x1
= n
== Arrow_Left
? 0 : ARROW_LENGTH
- 1;
1390 y1
= (ARROW_WIDTH
- 1)/2;
1401 for ( size_t i
= 0; i
< ARROW_LENGTH
; i
++ )
1403 dcNormal
.DrawLine(x1
, y1
, x2
, y2
);
1404 dcDisabled
.DrawLine(x1
, y1
, x2
, y2
);
1411 if ( n
== Arrow_Up
)
1422 else // left or right arrow
1427 if ( n
== Arrow_Left
)
1440 // draw the shadow for the disabled one
1441 dcDisabled
.SetPen(m_penHighlight
);
1446 dcDisabled
.DrawLine(x1
, y1
, x2
, y2
);
1450 x1
= ARROW_LENGTH
- 1;
1451 y1
= (ARROW_WIDTH
- 1)/2 + 1;
1454 dcDisabled
.DrawLine(x1
, y1
, x2
, y2
);
1455 dcDisabled
.DrawLine(++x1
, y1
, x2
, ++y2
);
1460 dcDisabled
.DrawLine(x1
, y1
, x2
, y2
);
1464 x1
= ARROW_WIDTH
- 1;
1466 x2
= (ARROW_WIDTH
- 1)/2;
1468 dcDisabled
.DrawLine(x1
, y1
, x2
, y2
);
1469 dcDisabled
.DrawLine(++x1
, y1
, x2
, ++y2
);
1474 // create the inverted bitmap but only for the right arrow as we only
1475 // use it for the menus
1476 if ( n
== Arrow_Right
)
1478 m_bmpArrows
[Arrow_Inverted
][n
].Create(w
, h
);
1479 dcInverse
.SelectObject(m_bmpArrows
[Arrow_Inverted
][n
]);
1481 dcInverse
.Blit(0, 0, w
, h
,
1484 dcInverse
.SelectObject(wxNullBitmap
);
1486 mask
= new wxMask(m_bmpArrows
[Arrow_Inverted
][n
], *wxBLACK
);
1487 m_bmpArrows
[Arrow_Inverted
][n
].SetMask(mask
);
1489 m_bmpArrows
[Arrow_InvertedDisabled
][n
].Create(w
, h
);
1490 dcInverse
.SelectObject(m_bmpArrows
[Arrow_InvertedDisabled
][n
]);
1492 dcInverse
.Blit(0, 0, w
, h
,
1495 dcInverse
.SelectObject(wxNullBitmap
);
1497 mask
= new wxMask(m_bmpArrows
[Arrow_InvertedDisabled
][n
], *wxBLACK
);
1498 m_bmpArrows
[Arrow_InvertedDisabled
][n
].SetMask(mask
);
1501 dcNormal
.SelectObject(wxNullBitmap
);
1502 dcDisabled
.SelectObject(wxNullBitmap
);
1504 mask
= new wxMask(m_bmpArrows
[Arrow_Normal
][n
], *wxWHITE
);
1505 m_bmpArrows
[Arrow_Normal
][n
].SetMask(mask
);
1506 mask
= new wxMask(m_bmpArrows
[Arrow_Disabled
][n
], *wxWHITE
);
1507 m_bmpArrows
[Arrow_Disabled
][n
].SetMask(mask
);
1509 m_bmpArrows
[Arrow_Pressed
][n
] = m_bmpArrows
[Arrow_Normal
][n
];
1513 bool wxWin32Renderer::AreScrollbarsInsideBorder() const
1518 // ----------------------------------------------------------------------------
1520 // ----------------------------------------------------------------------------
1522 void wxWin32Renderer::DrawLabel(wxDC
& dc
,
1523 const wxString
& label
,
1530 // the underscores are not drawn for focused controls in wxMSW
1531 if ( flags
& wxCONTROL_FOCUSED
)
1536 if ( flags
& wxCONTROL_DISABLED
)
1538 // the combination of wxCONTROL_SELECTED and wxCONTROL_DISABLED
1539 // currently only can happen for a menu item and it seems that Windows
1540 // doesn't draw the shadow in this case, so we don't do it neither
1541 if ( flags
& wxCONTROL_SELECTED
)
1543 // just make the label text greyed out
1544 dc
.SetTextForeground(m_penDarkGrey
.GetColour());
1546 flags
&= ~wxCONTROL_DISABLED
;
1550 wxStdRenderer::DrawLabel(dc
, label
, rect
, flags
, alignment
,
1551 indexAccel
, rectBounds
);
1554 void wxWin32Renderer::DrawFrameWithLabel(wxDC
& dc
,
1555 const wxString
& label
,
1556 const wxRect
& rectFrame
,
1557 const wxRect
& rectText
,
1563 label2
<< _T(' ') << label
<< _T(' ');
1564 if ( indexAccel
!= -1 )
1566 // adjust it as we prepended a space
1570 wxStdRenderer::DrawFrameWithLabel(dc
, label2
, rectFrame
, rectText
,
1571 flags
, alignment
, indexAccel
);
1574 void wxWin32Renderer::DrawButtonLabel(wxDC
& dc
,
1575 const wxString
& label
,
1576 const wxBitmap
& image
,
1583 // the underscores are not drawn for focused controls in wxMSW
1584 if ( flags
& wxCONTROL_PRESSED
)
1589 wxStdRenderer::DrawButtonLabel(dc
, label
, image
, rect
, flags
, alignment
,
1590 indexAccel
, rectBounds
);
1593 void wxWin32Renderer::DrawButtonBorder(wxDC
& dc
,
1594 const wxRect
& rectTotal
,
1598 wxRect rect
= rectTotal
;
1600 wxPen
penOut(*wxBLACK
);
1601 if ( flags
& wxCONTROL_PRESSED
)
1603 // button pressed: draw a double border around it
1604 DrawRect(dc
, &rect
, penOut
);
1605 DrawRect(dc
, &rect
, m_penDarkGrey
);
1607 else // button not pressed
1609 if ( flags
& (wxCONTROL_FOCUSED
| wxCONTROL_ISDEFAULT
) )
1611 // button either default or focused (or both): add an extra border
1613 DrawRect(dc
, &rect
, penOut
);
1616 // now draw a normal button border
1617 DrawRaisedBorder(dc
, &rect
);
1624 // ----------------------------------------------------------------------------
1625 // (check)listbox items
1626 // ----------------------------------------------------------------------------
1628 void wxWin32Renderer::DrawCheckItemBitmap(wxDC
& dc
,
1629 const wxBitmap
& bitmap
,
1638 else // use default bitmap
1640 IndicatorStatus i
= flags
& wxCONTROL_CHECKED
1641 ? IndicatorStatus_Checked
1642 : IndicatorStatus_Unchecked
;
1644 if ( !m_bmpCheckBitmaps
[i
].Ok() )
1646 m_bmpCheckBitmaps
[i
] = wxBitmap(ms_xpmChecked
[i
]);
1649 bmp
= m_bmpCheckBitmaps
[i
];
1652 dc
.DrawBitmap(bmp
, rect
.x
, rect
.y
+ (rect
.height
- bmp
.GetHeight()) / 2 - 1,
1653 true /* use mask */);
1656 // ----------------------------------------------------------------------------
1657 // check/radio buttons
1658 // ----------------------------------------------------------------------------
1660 wxBitmap
wxWin32Renderer::GetIndicator(IndicatorType indType
, int flags
)
1662 IndicatorState indState
;
1663 IndicatorStatus indStatus
;
1664 GetIndicatorsFromFlags(flags
, indState
, indStatus
);
1666 wxBitmap
& bmp
= m_bmpIndicators
[indType
][indState
][indStatus
];
1669 const char **xpm
= ms_xpmIndicators
[indType
][indState
][indStatus
];
1672 // create and cache it
1673 bmp
= wxBitmap(xpm
);
1680 // ----------------------------------------------------------------------------
1682 // ----------------------------------------------------------------------------
1685 void wxWin32Renderer::DrawToolBarButton(wxDC
& dc
,
1686 const wxString
& label
,
1687 const wxBitmap
& bitmap
,
1688 const wxRect
& rectOrig
,
1693 if (style
== wxTOOL_STYLE_BUTTON
)
1695 wxRect rect
= rectOrig
;
1696 rect
.Deflate(BORDER_THICKNESS
);
1698 if ( flags
& wxCONTROL_PRESSED
)
1700 DrawBorder(dc
, wxBORDER_SUNKEN
, rect
, flags
);
1702 else if ( flags
& wxCONTROL_CURRENT
)
1704 DrawBorder(dc
, wxBORDER_RAISED
, rect
, flags
);
1707 if(tbarStyle
& wxTB_TEXT
)
1709 if(tbarStyle
& wxTB_HORIZONTAL
)
1711 dc
.DrawLabel(label
, bitmap
, rect
, wxALIGN_CENTRE
);
1715 dc
.DrawLabel(label
, bitmap
, rect
, wxALIGN_LEFT
|wxALIGN_CENTER_VERTICAL
);
1720 int xpoint
= (rect
.GetLeft() + rect
.GetRight() + 1 - bitmap
.GetWidth()) / 2;
1721 int ypoint
= (rect
.GetTop() + rect
.GetBottom() + 1 - bitmap
.GetHeight()) / 2;
1722 dc
.DrawBitmap(bitmap
, xpoint
, ypoint
);
1725 else if (style
== wxTOOL_STYLE_SEPARATOR
)
1727 // leave a small gap aroudn the line, also account for the toolbar
1729 if(rectOrig
.height
> rectOrig
.width
)
1732 DrawVerticalLine(dc
, rectOrig
.x
+ rectOrig
.width
/2,
1733 rectOrig
.y
+ 2*BORDER_THICKNESS
,
1734 rectOrig
.GetBottom() - BORDER_THICKNESS
);
1739 DrawHorizontalLine(dc
, rectOrig
.y
+ rectOrig
.height
/2,
1740 rectOrig
.x
+ 2*BORDER_THICKNESS
,
1741 rectOrig
.GetRight() - BORDER_THICKNESS
);
1744 // don't draw wxTOOL_STYLE_CONTROL
1746 #endif // wxUSE_TOOLBAR
1748 // ----------------------------------------------------------------------------
1750 // ----------------------------------------------------------------------------
1754 void wxWin32Renderer::DrawTab(wxDC
& dc
,
1755 const wxRect
& rectOrig
,
1757 const wxString
& label
,
1758 const wxBitmap
& bitmap
,
1762 #define SELECT_FOR_VERTICAL(X,Y) ( isVertical ? Y : X )
1763 #define REVERSE_FOR_VERTICAL(X,Y) \
1764 SELECT_FOR_VERTICAL(X,Y) \
1766 SELECT_FOR_VERTICAL(Y,X)
1768 wxRect rect
= rectOrig
;
1770 bool isVertical
= ( dir
== wxLEFT
) || ( dir
== wxRIGHT
);
1772 // the current tab is drawn indented (to the top for default case) and
1773 // bigger than the other ones
1774 const wxSize indent
= GetTabIndent();
1775 if ( flags
& wxCONTROL_SELECTED
)
1777 rect
.Inflate( SELECT_FOR_VERTICAL( indent
.x
, 0),
1778 SELECT_FOR_VERTICAL( 0, indent
.y
));
1782 wxFAIL_MSG(_T("invaild notebook tab orientation"));
1789 rect
.height
+= indent
.y
;
1796 rect
.width
+= indent
.x
;
1801 // draw the text, image and the focus around them (if necessary)
1802 wxRect
rectLabel( REVERSE_FOR_VERTICAL(rect
.x
,rect
.y
),
1803 REVERSE_FOR_VERTICAL(rect
.width
,rect
.height
)
1805 rectLabel
.Deflate(1, 1);
1808 // draw it horizontally into memory and rotate for screen
1810 wxBitmap bitmapRotated
,
1811 bitmapMem( rectLabel
.x
+ rectLabel
.width
,
1812 rectLabel
.y
+ rectLabel
.height
);
1813 dcMem
.SelectObject(bitmapMem
);
1814 dcMem
.SetBackground(dc
.GetBackground());
1815 dcMem
.SetFont(dc
.GetFont());
1816 dcMem
.SetTextForeground(dc
.GetTextForeground());
1820 wxBitmap( wxImage( bitmap
.ConvertToImage() ).Rotate90(dir
==wxLEFT
) )
1823 #endif // wxUSE_IMAGE
1825 DrawButtonLabel(dcMem
, label
, bitmapRotated
, rectLabel
,
1826 flags
, wxALIGN_CENTRE
, indexAccel
);
1827 dcMem
.SelectObject(wxNullBitmap
);
1828 bitmapMem
= bitmapMem
.GetSubBitmap(rectLabel
);
1830 bitmapMem
= wxBitmap(wxImage(bitmapMem
.ConvertToImage()).Rotate90(dir
==wxRIGHT
));
1831 #endif // wxUSE_IMAGE
1832 dc
.DrawBitmap(bitmapMem
, rectLabel
.y
, rectLabel
.x
, false);
1836 DrawButtonLabel(dc
, label
, bitmap
, rectLabel
,
1837 flags
, wxALIGN_CENTRE
, indexAccel
);
1840 // now draw the tab border itself (maybe use DrawRoundedRectangle()?)
1841 static const wxCoord CUTOFF
= 2; // radius of the rounded corner
1842 wxCoord x
= SELECT_FOR_VERTICAL(rect
.x
,rect
.y
),
1843 y
= SELECT_FOR_VERTICAL(rect
.y
,rect
.x
),
1844 x2
= SELECT_FOR_VERTICAL(rect
.GetRight(),rect
.GetBottom()),
1845 y2
= SELECT_FOR_VERTICAL(rect
.GetBottom(),rect
.GetRight());
1847 // FIXME: all this code will break if the tab indent or the border width,
1848 // it is tied to the fact that both of them are equal to 2
1854 // left orientation looks like top but IsVertical makes x and y reversed
1856 // top is not vertical so use coordinates in written order
1857 dc
.SetPen(m_penHighlight
);
1858 dc
.DrawLine(REVERSE_FOR_VERTICAL(x
, y2
),
1859 REVERSE_FOR_VERTICAL(x
, y
+ CUTOFF
));
1860 dc
.DrawLine(REVERSE_FOR_VERTICAL(x
, y
+ CUTOFF
),
1861 REVERSE_FOR_VERTICAL(x
+ CUTOFF
, y
));
1862 dc
.DrawLine(REVERSE_FOR_VERTICAL(x
+ CUTOFF
, y
),
1863 REVERSE_FOR_VERTICAL(x2
- CUTOFF
+ 1, y
));
1865 dc
.SetPen(m_penBlack
);
1866 dc
.DrawLine(REVERSE_FOR_VERTICAL(x2
, y2
),
1867 REVERSE_FOR_VERTICAL(x2
, y
+ CUTOFF
));
1868 dc
.DrawLine(REVERSE_FOR_VERTICAL(x2
, y
+ CUTOFF
),
1869 REVERSE_FOR_VERTICAL(x2
- CUTOFF
, y
));
1871 dc
.SetPen(m_penDarkGrey
);
1872 dc
.DrawLine(REVERSE_FOR_VERTICAL(x2
- 1, y2
),
1873 REVERSE_FOR_VERTICAL(x2
- 1, y
+ CUTOFF
- 1));
1875 if ( flags
& wxCONTROL_SELECTED
)
1877 dc
.SetPen(m_penLightGrey
);
1879 // overwrite the part of the border below this tab
1880 dc
.DrawLine(REVERSE_FOR_VERTICAL(x
+ 1, y2
+ 1),
1881 REVERSE_FOR_VERTICAL(x2
- 1, y2
+ 1));
1883 // and the shadow of the tab to the left of us
1884 dc
.DrawLine(REVERSE_FOR_VERTICAL(x
+ 1, y
+ CUTOFF
+ 1),
1885 REVERSE_FOR_VERTICAL(x
+ 1, y2
+ 1));
1890 // right orientation looks like bottom but IsVertical makes x and y reversed
1892 // bottom is not vertical so use coordinates in written order
1893 dc
.SetPen(m_penHighlight
);
1894 // we need to continue one pixel further to overwrite the corner of
1895 // the border for the selected tab
1896 dc
.DrawLine(REVERSE_FOR_VERTICAL(x
, y
- (flags
& wxCONTROL_SELECTED
? 1 : 0)),
1897 REVERSE_FOR_VERTICAL(x
, y2
- CUTOFF
));
1898 dc
.DrawLine(REVERSE_FOR_VERTICAL(x
, y2
- CUTOFF
),
1899 REVERSE_FOR_VERTICAL(x
+ CUTOFF
, y2
));
1901 dc
.SetPen(m_penBlack
);
1902 dc
.DrawLine(REVERSE_FOR_VERTICAL(x
+ CUTOFF
, y2
),
1903 REVERSE_FOR_VERTICAL(x2
- CUTOFF
+ 1, y2
));
1904 dc
.DrawLine(REVERSE_FOR_VERTICAL(x2
, y
),
1905 REVERSE_FOR_VERTICAL(x2
, y2
- CUTOFF
));
1906 dc
.DrawLine(REVERSE_FOR_VERTICAL(x2
, y2
- CUTOFF
),
1907 REVERSE_FOR_VERTICAL(x2
- CUTOFF
, y2
));
1909 dc
.SetPen(m_penDarkGrey
);
1910 dc
.DrawLine(REVERSE_FOR_VERTICAL(x
+ CUTOFF
, y2
- 1),
1911 REVERSE_FOR_VERTICAL(x2
- CUTOFF
+ 1, y2
- 1));
1912 dc
.DrawLine(REVERSE_FOR_VERTICAL(x2
- 1, y
),
1913 REVERSE_FOR_VERTICAL(x2
- 1, y2
- CUTOFF
+ 1));
1915 if ( flags
& wxCONTROL_SELECTED
)
1917 dc
.SetPen(m_penLightGrey
);
1919 // overwrite the part of the (double!) border above this tab
1920 dc
.DrawLine(REVERSE_FOR_VERTICAL(x
+ 1, y
- 1),
1921 REVERSE_FOR_VERTICAL(x2
- 1, y
- 1));
1922 dc
.DrawLine(REVERSE_FOR_VERTICAL(x
+ 1, y
- 2),
1923 REVERSE_FOR_VERTICAL(x2
- 1, y
- 2));
1925 // and the shadow of the tab to the left of us
1926 dc
.DrawLine(REVERSE_FOR_VERTICAL(x
+ 1, y2
- CUTOFF
),
1927 REVERSE_FOR_VERTICAL(x
+ 1, y
- 1));
1932 #undef SELECT_FOR_VERTICAL
1933 #undef REVERSE_FOR_VERTICAL
1936 #endif // wxUSE_NOTEBOOK
1940 // ----------------------------------------------------------------------------
1942 // ----------------------------------------------------------------------------
1945 wxWin32Renderer::GetSliderThumbSize(const wxRect
& WXUNUSED(rect
),
1947 wxOrientation orient
) const
1950 wxCoord width
= wxMax (lenThumb
, SLIDER_THUMB_LENGTH
) / 2;
1951 wxCoord height
= wxMax (lenThumb
, SLIDER_THUMB_LENGTH
);
1953 if (orient
== wxHORIZONTAL
)
1967 wxRect
wxWin32Renderer::GetSliderShaftRect(const wxRect
& rectOrig
,
1969 wxOrientation orient
,
1972 bool transpose
= (orient
== wxVERTICAL
);
1973 bool left
= ((style
& wxSL_AUTOTICKS
) != 0) &
1974 (((style
& wxSL_TOP
) != 0) & !transpose
|
1975 ((style
& wxSL_LEFT
) != 0) & transpose
|
1976 ((style
& wxSL_BOTH
) != 0));
1977 bool right
= ((style
& wxSL_AUTOTICKS
) != 0) &
1978 (((style
& wxSL_BOTTOM
) != 0) & !transpose
|
1979 ((style
& wxSL_RIGHT
) != 0) & transpose
|
1980 ((style
& wxSL_BOTH
) != 0));
1982 wxRect rect
= rectOrig
;
1984 wxSize sizeThumb
= GetSliderThumbSize (rect
, lenThumb
, orient
);
1986 if (orient
== wxHORIZONTAL
) {
1987 rect
.x
+= SLIDER_MARGIN
;
1990 rect
.y
+= wxMax ((rect
.height
- 2*BORDER_THICKNESS
) / 2, sizeThumb
.y
/2);
1994 rect
.y
+= wxMax ((rect
.height
- 2*BORDER_THICKNESS
- sizeThumb
.y
/2), sizeThumb
.y
/2);
1998 rect
.y
+= sizeThumb
.y
/2;
2000 rect
.width
-= 2*SLIDER_MARGIN
;
2001 rect
.height
= 2*BORDER_THICKNESS
;
2005 rect
.y
+= SLIDER_MARGIN
;
2008 rect
.x
+= wxMax ((rect
.width
- 2*BORDER_THICKNESS
) / 2, sizeThumb
.x
/2);
2012 rect
.x
+= wxMax ((rect
.width
- 2*BORDER_THICKNESS
- sizeThumb
.x
/2), sizeThumb
.x
/2);
2016 rect
.x
+= sizeThumb
.x
/2;
2018 rect
.width
= 2*BORDER_THICKNESS
;
2019 rect
.height
-= 2*SLIDER_MARGIN
;
2025 void wxWin32Renderer::DrawSliderShaft(wxDC
& dc
,
2026 const wxRect
& rectOrig
,
2028 wxOrientation orient
,
2033 /* show shaft geometry
2051 if (flags
& wxCONTROL_FOCUSED
) {
2052 DrawFocusRect(dc
, rectOrig
);
2055 wxRect rect
= GetSliderShaftRect(rectOrig
, lenThumb
, orient
, style
);
2057 if (rectShaft
) *rectShaft
= rect
;
2059 DrawSunkenBorder(dc
, &rect
);
2062 void wxWin32Renderer::DrawSliderThumb(wxDC
& dc
,
2064 wxOrientation orient
,
2068 /* show thumb geometry
2077 H D B where H is highlight colour
2091 The interior of this shape is filled with the hatched brush if the thumb
2095 DrawBackground(dc
, wxNullColour
, rect
, flags
);
2097 bool transpose
= (orient
== wxVERTICAL
);
2098 bool left
= ((style
& wxSL_AUTOTICKS
) != 0) &
2099 (((style
& wxSL_TOP
) != 0) & !transpose
|
2100 ((style
& wxSL_LEFT
) != 0) & transpose
) &
2101 ((style
& wxSL_BOTH
) == 0);
2102 bool right
= ((style
& wxSL_AUTOTICKS
) != 0) &
2103 (((style
& wxSL_BOTTOM
) != 0) & !transpose
|
2104 ((style
& wxSL_RIGHT
) != 0) & transpose
) &
2105 ((style
& wxSL_BOTH
) == 0);
2107 wxCoord sizeArrow
= (transpose
? rect
.height
: rect
.width
) / 2;
2108 wxCoord c
= ((transpose
? rect
.height
: rect
.width
) - 2*sizeArrow
);
2110 wxCoord x1
, x2
, x3
, y1
, y2
, y3
, y4
;
2111 x1
= (transpose
? rect
.y
: rect
.x
);
2112 x2
= (transpose
? rect
.GetBottom() : rect
.GetRight());
2113 x3
= (x1
-1+c
) + sizeArrow
;
2114 y1
= (transpose
? rect
.x
: rect
.y
);
2115 y2
= (transpose
? rect
.GetRight() : rect
.GetBottom());
2116 y3
= (left
? (y1
-1+c
) + sizeArrow
: y1
);
2117 y4
= (right
? (y2
+1-c
) - sizeArrow
: y2
);
2119 dc
.SetPen(m_penBlack
);
2121 DrawLine(dc
, x3
+1-c
, y1
, x2
, y3
, transpose
);
2123 DrawLine(dc
, x2
, y3
, x2
, y4
, transpose
);
2126 DrawLine(dc
, x3
+1-c
, y2
, x2
, y4
, transpose
);
2130 DrawLine(dc
, x1
, y2
, x2
, y2
, transpose
);
2133 dc
.SetPen(m_penDarkGrey
);
2134 DrawLine(dc
, x2
-1, y3
+1, x2
-1, y4
-1, transpose
);
2136 DrawLine(dc
, x3
+1-c
, y2
-1, x2
-1, y4
, transpose
);
2140 DrawLine(dc
, x1
+1, y2
-1, x2
-1, y2
-1, transpose
);
2143 dc
.SetPen(m_penHighlight
);
2146 DrawLine(dc
, x1
, y3
, x3
, y1
, transpose
);
2147 DrawLine(dc
, x3
+1-c
, y1
+1, x2
-1, y3
, transpose
);
2151 DrawLine(dc
, x1
, y1
, x2
, y1
, transpose
);
2153 DrawLine(dc
, x1
, y3
, x1
, y4
, transpose
);
2156 DrawLine(dc
, x1
, y4
, x3
+c
, y2
+c
, transpose
);
2159 if (flags
& wxCONTROL_PRESSED
) {
2160 // TODO: MSW fills the entire area inside, not just the rect
2161 wxRect rectInt
= rect
;
2164 rectInt
.SetLeft(y3
);
2165 rectInt
.SetRight(y4
);
2170 rectInt
.SetBottom(y4
);
2174 #if !defined(__WXMGL__)
2175 static const char *stipple_xpm
[] = {
2176 /* columns rows colors chars-per-pixel */
2185 // VS: MGL can only do 8x8 stipple brushes
2186 static const char *stipple_xpm
[] = {
2187 /* columns rows colors chars-per-pixel */
2202 dc
.SetBrush(wxBrush(stipple_xpm
));
2204 dc
.SetTextForeground(wxSCHEME_COLOUR(m_scheme
, SHADOW_HIGHLIGHT
));
2205 dc
.SetTextBackground(wxSCHEME_COLOUR(m_scheme
, CONTROL
));
2206 dc
.SetPen(*wxTRANSPARENT_PEN
);
2207 dc
.DrawRectangle(rectInt
);
2211 void wxWin32Renderer::DrawSliderTicks(wxDC
& dc
,
2214 wxOrientation orient
,
2218 int WXUNUSED(flags
),
2221 /* show ticks geometry
2236 if (end
== start
) return;
2238 bool transpose
= (orient
== wxVERTICAL
);
2239 bool left
= ((style
& wxSL_AUTOTICKS
) != 0) &
2240 (((style
& wxSL_TOP
) != 0) & !transpose
|
2241 ((style
& wxSL_LEFT
) != 0) & transpose
|
2242 ((style
& wxSL_BOTH
) != 0));
2243 bool right
= ((style
& wxSL_AUTOTICKS
) != 0) &
2244 (((style
& wxSL_BOTTOM
) != 0) & !transpose
|
2245 ((style
& wxSL_RIGHT
) != 0) & transpose
|
2246 ((style
& wxSL_BOTH
) != 0));
2248 // default thumb size
2249 wxSize sizeThumb
= GetSliderThumbSize (rect
, 0, orient
);
2250 wxCoord defaultLen
= (transpose
? sizeThumb
.x
: sizeThumb
.y
);
2252 // normal thumb size
2253 sizeThumb
= GetSliderThumbSize (rect
, lenThumb
, orient
);
2254 wxCoord widthThumb
= (transpose
? sizeThumb
.y
: sizeThumb
.x
);
2256 wxRect rectShaft
= GetSliderShaftRect (rect
, lenThumb
, orient
, style
);
2258 wxCoord x1
, x2
, y1
, y2
, y3
, y4
, len
;
2259 x1
= (transpose
? rectShaft
.y
: rectShaft
.x
) + widthThumb
/2;
2260 x2
= (transpose
? rectShaft
.GetBottom() : rectShaft
.GetRight()) - widthThumb
/2;
2261 y1
= (transpose
? rectShaft
.x
: rectShaft
.y
) - defaultLen
/2;
2262 y2
= (transpose
? rectShaft
.GetRight() : rectShaft
.GetBottom()) + defaultLen
/2;
2263 y3
= (transpose
? rect
.x
: rect
.y
);
2264 y4
= (transpose
? rect
.GetRight() : rect
.GetBottom());
2267 dc
.SetPen(m_penBlack
);
2269 int range
= end
- start
;
2270 for ( int n
= 0; n
< range
; n
+= step
) {
2271 wxCoord x
= x1
+ (len
*n
) / range
;
2273 if (left
& (y1
> y3
)) {
2274 DrawLine(dc
, x
, y1
, x
, y3
, orient
== wxVERTICAL
);
2276 if (right
& (y4
> y2
)) {
2277 DrawLine(dc
, x
, y2
, x
, y4
, orient
== wxVERTICAL
);
2280 // always draw the line at the end position
2281 if (left
& (y1
> y3
)) {
2282 DrawLine(dc
, x2
, y1
, x2
, y3
, orient
== wxVERTICAL
);
2284 if (right
& (y4
> y2
)) {
2285 DrawLine(dc
, x2
, y2
, x2
, y4
, orient
== wxVERTICAL
);
2289 #endif // wxUSE_SLIDER
2293 // ----------------------------------------------------------------------------
2295 // ----------------------------------------------------------------------------
2297 // wxWin32MenuGeometryInfo: the wxMenuGeometryInfo used by wxWin32Renderer
2298 class WXDLLEXPORT wxWin32MenuGeometryInfo
: public wxMenuGeometryInfo
2301 virtual wxSize
GetSize() const { return m_size
; }
2303 wxCoord
GetLabelOffset() const { return m_ofsLabel
; }
2304 wxCoord
GetAccelOffset() const { return m_ofsAccel
; }
2306 wxCoord
GetItemHeight() const { return m_heightItem
; }
2309 // the total size of the menu
2312 // the offset of the start of the menu item label
2315 // the offset of the start of the accel label
2318 // the height of a normal (not separator) item
2319 wxCoord m_heightItem
;
2321 friend wxMenuGeometryInfo
*
2322 wxWin32Renderer::GetMenuGeometry(wxWindow
*, const wxMenu
&) const;
2325 // FIXME: all constants are hardcoded but shouldn't be
2326 static const wxCoord MENU_LEFT_MARGIN
= 9;
2327 static const wxCoord MENU_RIGHT_MARGIN
= 18;
2328 static const wxCoord MENU_VERT_MARGIN
= 3;
2330 // the margin around bitmap/check marks (on each side)
2331 static const wxCoord MENU_BMP_MARGIN
= 2;
2333 // the margin between the labels and accel strings
2334 static const wxCoord MENU_ACCEL_MARGIN
= 8;
2336 // the separator height in pixels: in fact, strangely enough, the real height
2337 // is 2 but Windows adds one extra pixel in the bottom margin, so take it into
2339 static const wxCoord MENU_SEPARATOR_HEIGHT
= 3;
2341 // the size of the standard checkmark bitmap
2342 static const wxCoord MENU_CHECK_SIZE
= 9;
2344 void wxWin32Renderer::DrawMenuBarItem(wxDC
& dc
,
2345 const wxRect
& rectOrig
,
2346 const wxString
& label
,
2350 wxRect rect
= rectOrig
;
2353 wxDCTextColourChanger
colChanger(dc
);
2355 if ( flags
& wxCONTROL_SELECTED
)
2357 colChanger
.Set(wxSCHEME_COLOUR(m_scheme
, HIGHLIGHT_TEXT
));
2359 const wxColour colBg
= wxSCHEME_COLOUR(m_scheme
, HIGHLIGHT
);
2362 dc
.DrawRectangle(rect
);
2365 // don't draw the focus rect around menu bar items
2366 DrawLabel(dc
, label
, rect
, flags
& ~wxCONTROL_FOCUSED
,
2367 wxALIGN_CENTRE
, indexAccel
);
2370 void wxWin32Renderer::DrawMenuItem(wxDC
& dc
,
2372 const wxMenuGeometryInfo
& gi
,
2373 const wxString
& label
,
2374 const wxString
& accel
,
2375 const wxBitmap
& bitmap
,
2379 const wxWin32MenuGeometryInfo
& geometryInfo
=
2380 (const wxWin32MenuGeometryInfo
&)gi
;
2385 rect
.width
= geometryInfo
.GetSize().x
;
2386 rect
.height
= geometryInfo
.GetItemHeight();
2388 // draw the selected item specially
2389 wxDCTextColourChanger
colChanger(dc
);
2390 if ( flags
& wxCONTROL_SELECTED
)
2392 colChanger
.Set(wxSCHEME_COLOUR(m_scheme
, HIGHLIGHT_TEXT
));
2394 const wxColour colBg
= wxSCHEME_COLOUR(m_scheme
, HIGHLIGHT
);
2397 dc
.DrawRectangle(rect
);
2400 // draw the bitmap: use the bitmap provided or the standard checkmark for
2401 // the checkable items
2402 wxBitmap bmp
= bitmap
;
2403 if ( !bmp
.Ok() && (flags
& wxCONTROL_CHECKED
) )
2405 bmp
= GetIndicator(IndicatorType_Menu
, flags
);
2410 rect
.SetRight(geometryInfo
.GetLabelOffset());
2411 wxControlRenderer::DrawBitmap(dc
, bmp
, rect
);
2415 rect
.x
= geometryInfo
.GetLabelOffset();
2416 rect
.SetRight(geometryInfo
.GetAccelOffset());
2418 DrawLabel(dc
, label
, rect
, flags
, wxALIGN_CENTRE_VERTICAL
, indexAccel
);
2420 // draw the accel string
2421 rect
.x
= geometryInfo
.GetAccelOffset();
2422 rect
.SetRight(geometryInfo
.GetSize().x
);
2424 // NB: no accel index here
2425 DrawLabel(dc
, accel
, rect
, flags
, wxALIGN_CENTRE_VERTICAL
);
2427 // draw the submenu indicator
2428 if ( flags
& wxCONTROL_ISSUBMENU
)
2430 rect
.x
= geometryInfo
.GetSize().x
- MENU_RIGHT_MARGIN
;
2431 rect
.width
= MENU_RIGHT_MARGIN
;
2433 ArrowStyle arrowStyle
;
2434 if ( flags
& wxCONTROL_DISABLED
)
2435 arrowStyle
= flags
& wxCONTROL_SELECTED
? Arrow_InvertedDisabled
2437 else if ( flags
& wxCONTROL_SELECTED
)
2438 arrowStyle
= Arrow_Inverted
;
2440 arrowStyle
= Arrow_Normal
;
2442 DrawArrow(dc
, rect
, Arrow_Right
, arrowStyle
);
2446 void wxWin32Renderer::DrawMenuSeparator(wxDC
& dc
,
2448 const wxMenuGeometryInfo
& geomInfo
)
2450 DrawHorizontalLine(dc
, y
+ MENU_VERT_MARGIN
, 0, geomInfo
.GetSize().x
);
2453 wxSize
wxWin32Renderer::GetMenuBarItemSize(const wxSize
& sizeText
) const
2455 wxSize size
= sizeText
;
2457 // FIXME: menubar height is configurable under Windows
2464 wxMenuGeometryInfo
*wxWin32Renderer::GetMenuGeometry(wxWindow
*win
,
2465 const wxMenu
& menu
) const
2467 // prepare the dc: for now we draw all the items with the system font
2469 dc
.SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
));
2471 // the height of a normal item
2472 wxCoord heightText
= dc
.GetCharHeight();
2477 // the max length of label and accel strings: the menu width is the sum of
2478 // them, even if they're for different items (as the accels should be
2481 // the max length of the bitmap is never 0 as Windows always leaves enough
2482 // space for a check mark indicator
2483 wxCoord widthLabelMax
= 0,
2485 widthBmpMax
= MENU_LEFT_MARGIN
;
2487 for ( wxMenuItemList::compatibility_iterator node
= menu
.GetMenuItems().GetFirst();
2489 node
= node
->GetNext() )
2491 // height of this item
2494 wxMenuItem
*item
= node
->GetData();
2495 if ( item
->IsSeparator() )
2497 h
= MENU_SEPARATOR_HEIGHT
;
2499 else // not separator
2504 dc
.GetTextExtent(item
->GetLabel(), &widthLabel
, NULL
);
2505 if ( widthLabel
> widthLabelMax
)
2507 widthLabelMax
= widthLabel
;
2511 dc
.GetTextExtent(item
->GetAccelString(), &widthAccel
, NULL
);
2512 if ( widthAccel
> widthAccelMax
)
2514 widthAccelMax
= widthAccel
;
2517 const wxBitmap
& bmp
= item
->GetBitmap();
2520 wxCoord widthBmp
= bmp
.GetWidth();
2521 if ( widthBmp
> widthBmpMax
)
2522 widthBmpMax
= widthBmp
;
2524 //else if ( item->IsCheckable() ): no need to check for this as
2525 // MENU_LEFT_MARGIN is big enough to show the check mark
2528 h
+= 2*MENU_VERT_MARGIN
;
2530 // remember the item position and height
2531 item
->SetGeometry(height
, h
);
2536 // bundle the metrics into a struct and return it
2537 wxWin32MenuGeometryInfo
*gi
= new wxWin32MenuGeometryInfo
;
2539 gi
->m_ofsLabel
= widthBmpMax
+ 2*MENU_BMP_MARGIN
;
2540 gi
->m_ofsAccel
= gi
->m_ofsLabel
+ widthLabelMax
;
2541 if ( widthAccelMax
> 0 )
2543 // if we actually have any accesl, add a margin
2544 gi
->m_ofsAccel
+= MENU_ACCEL_MARGIN
;
2547 gi
->m_heightItem
= heightText
+ 2*MENU_VERT_MARGIN
;
2549 gi
->m_size
.x
= gi
->m_ofsAccel
+ widthAccelMax
+ MENU_RIGHT_MARGIN
;
2550 gi
->m_size
.y
= height
;
2555 #endif // wxUSE_MENUS
2559 // ----------------------------------------------------------------------------
2561 // ----------------------------------------------------------------------------
2563 void wxWin32Renderer::DrawStatusField(wxDC
& dc
,
2565 const wxString
& label
,
2571 if ( flags
& wxCONTROL_SIZEGRIP
)
2573 // draw the size grip: it is a normal rect except that in the lower
2574 // right corner we have several bands which may be used for dragging
2575 // the status bar corner
2577 // each band consists of 4 stripes: m_penHighlight, double
2578 // m_penDarkGrey and transparent one
2579 wxCoord x2
= rect
.GetRight(),
2580 y2
= rect
.GetBottom();
2582 // draw the upper left part of the rect normally
2583 if (style
!= wxSB_FLAT
)
2585 if (style
== wxSB_RAISED
)
2586 dc
.SetPen(m_penHighlight
);
2588 dc
.SetPen(m_penDarkGrey
);
2589 dc
.DrawLine(rect
.GetLeft(), rect
.GetTop(), rect
.GetLeft(), y2
);
2590 dc
.DrawLine(rect
.GetLeft() + 1, rect
.GetTop(), x2
, rect
.GetTop());
2593 // draw the grey stripes of the grip
2595 wxCoord ofs
= WIDTH_STATUSBAR_GRIP_BAND
- 1;
2596 for ( n
= 0; n
< NUM_STATUSBAR_GRIP_BANDS
; n
++, ofs
+= WIDTH_STATUSBAR_GRIP_BAND
)
2598 dc
.DrawLine(x2
- ofs
+ 1, y2
- 1, x2
, y2
- ofs
);
2599 dc
.DrawLine(x2
- ofs
, y2
- 1, x2
, y2
- ofs
- 1);
2602 // draw the white stripes
2603 dc
.SetPen(m_penHighlight
);
2604 ofs
= WIDTH_STATUSBAR_GRIP_BAND
+ 1;
2605 for ( n
= 0; n
< NUM_STATUSBAR_GRIP_BANDS
; n
++, ofs
+= WIDTH_STATUSBAR_GRIP_BAND
)
2607 dc
.DrawLine(x2
- ofs
+ 1, y2
- 1, x2
, y2
- ofs
);
2610 // draw the remaining rect boundaries
2611 if (style
!= wxSB_FLAT
)
2613 if (style
== wxSB_RAISED
)
2614 dc
.SetPen(m_penDarkGrey
);
2616 dc
.SetPen(m_penHighlight
);
2617 ofs
-= WIDTH_STATUSBAR_GRIP_BAND
;
2618 dc
.DrawLine(x2
, rect
.GetTop(), x2
, y2
- ofs
+ 1);
2619 dc
.DrawLine(rect
.GetLeft(), y2
, x2
- ofs
+ 1, y2
);
2625 rectIn
.width
-= STATUSBAR_GRIP_SIZE
;
2627 // this will prevent the standard version from drawing any borders
2631 wxStdRenderer::DrawStatusField(dc
, rect
, label
, flags
, style
);
2634 #endif // wxUSE_STATUSBAR
2636 // ----------------------------------------------------------------------------
2638 // ----------------------------------------------------------------------------
2640 void wxWin32Renderer::GetComboBitmaps(wxBitmap
*bmpNormal
,
2641 wxBitmap
* WXUNUSED(bmpFocus
),
2642 wxBitmap
*bmpPressed
,
2643 wxBitmap
*bmpDisabled
)
2645 static const wxCoord widthCombo
= 16;
2646 static const wxCoord heightCombo
= 17;
2652 bmpNormal
->Create(widthCombo
, heightCombo
);
2653 dcMem
.SelectObject(*bmpNormal
);
2654 DrawArrowButton(dcMem
, wxRect(0, 0, widthCombo
, heightCombo
),
2655 Arrow_Down
, Arrow_Normal
);
2660 bmpPressed
->Create(widthCombo
, heightCombo
);
2661 dcMem
.SelectObject(*bmpPressed
);
2662 DrawArrowButton(dcMem
, wxRect(0, 0, widthCombo
, heightCombo
),
2663 Arrow_Down
, Arrow_Pressed
);
2668 bmpDisabled
->Create(widthCombo
, heightCombo
);
2669 dcMem
.SelectObject(*bmpDisabled
);
2670 DrawArrowButton(dcMem
, wxRect(0, 0, widthCombo
, heightCombo
),
2671 Arrow_Down
, Arrow_Disabled
);
2675 // ----------------------------------------------------------------------------
2677 // ----------------------------------------------------------------------------
2679 void wxWin32Renderer::DrawArrowBorder(wxDC
& dc
, wxRect
*rect
, bool isPressed
)
2683 DrawRect(dc
, rect
, m_penDarkGrey
);
2685 // the arrow is usually drawn inside border of width 2 and is offset by
2686 // another pixel in both directions when it's pressed - as the border
2687 // in this case is more narrow as well, we have to adjust rect like
2695 DrawAntiSunkenBorder(dc
, rect
);
2699 void wxWin32Renderer::DrawArrow(wxDC
& dc
,
2704 ArrowStyle arrowStyle
;
2705 if ( flags
& wxCONTROL_PRESSED
)
2707 // can't be pressed and disabled
2708 arrowStyle
= Arrow_Pressed
;
2712 arrowStyle
= flags
& wxCONTROL_DISABLED
? Arrow_Disabled
: Arrow_Normal
;
2715 DrawArrowButton(dc
, rect
, GetArrowDirection(dir
), arrowStyle
);
2718 void wxWin32Renderer::DrawArrow(wxDC
& dc
,
2720 ArrowDirection arrowDir
,
2721 ArrowStyle arrowStyle
)
2723 const wxBitmap
& bmp
= m_bmpArrows
[arrowStyle
][arrowDir
];
2725 // under Windows the arrows always have the same size so just centre it in
2726 // the provided rectangle
2727 wxCoord x
= rect
.x
+ (rect
.width
- bmp
.GetWidth()) / 2,
2728 y
= rect
.y
+ (rect
.height
- bmp
.GetHeight()) / 2;
2730 // Windows does it like this...
2731 if ( arrowDir
== Arrow_Left
)
2735 dc
.DrawBitmap(bmp
, x
, y
, true /* use mask */);
2738 void wxWin32Renderer::DrawArrowButton(wxDC
& dc
,
2739 const wxRect
& rectAll
,
2740 ArrowDirection arrowDir
,
2741 ArrowStyle arrowStyle
)
2743 wxRect rect
= rectAll
;
2744 DrawBackground(dc
, wxSCHEME_COLOUR(m_scheme
, CONTROL
), rect
);
2745 DrawArrowBorder(dc
, &rect
, arrowStyle
== Arrow_Pressed
);
2746 DrawArrow(dc
, rect
, arrowDir
, arrowStyle
);
2749 void wxWin32Renderer::DrawScrollbarThumb(wxDC
& dc
,
2750 wxOrientation
WXUNUSED(orient
),
2752 int WXUNUSED(flags
))
2754 // we don't use the flags, the thumb never changes appearance
2755 wxRect rectThumb
= rect
;
2756 DrawArrowBorder(dc
, &rectThumb
);
2757 DrawBackground(dc
, wxNullColour
, rectThumb
);
2760 void wxWin32Renderer::DrawScrollbarShaft(wxDC
& dc
,
2761 wxOrientation
WXUNUSED(orient
),
2762 const wxRect
& rectBar
,
2765 wxColourScheme::StdColour col
= flags
& wxCONTROL_PRESSED
2766 ? wxColourScheme::SCROLLBAR_PRESSED
2767 : wxColourScheme::SCROLLBAR
;
2768 DrawBackground(dc
, m_scheme
->Get(col
), rectBar
);
2771 // ----------------------------------------------------------------------------
2773 // ----------------------------------------------------------------------------
2775 /* Copyright (c) Julian Smart */
2776 static char *error_xpm
[]={
2777 /* columns rows colors chars-per-pixel */
2854 " $oooooooooooo%& ",
2855 " *=-ooooooooooooo;: ",
2856 " *oooooooooooooooooo> ",
2857 " =ooooooooooooooooooo, ",
2858 " $-ooooooooooooooooooo<1 ",
2859 " .oooooo2334ooo533oooooo6 ",
2860 " +ooooooo789oo2883oooooo0q ",
2861 " oooooooo2w83o78eoooooooor ",
2862 " toooooooooy88u884oooooooori ",
2863 " Xooooooooooe888poooooooooas ",
2864 " ooooooooooo4889doooooooooof ",
2865 " ooooooooooo588w2oooooooooofi ",
2866 " oooooooooodw8887oooooooooofi ",
2867 " goooooooooh8w588jooooooookli ",
2868 " tooooooooz885op8wdooooooorix ",
2869 " oooooood98cood98cooooooori ",
2870 " @oooooop8w2ooo5885ooooovbi ",
2871 " n%ooooooooooooooooooooomiM ",
2872 " &;oooooooooooooooooooNBiV ",
2873 " :ooooooooooooooooooCZiA ",
2874 " nSooooooooooooooooCDiF ",
2875 " nG<oooooooooooooNZiiH ",
2876 " 160ooooooooovmBiFH ",
2877 " nqrraoookrrbiiA ",
2884 /* Copyright (c) Julian Smart */
2885 static char *info_xpm
[]={
2886 /* columns rows colors chars-per-pixel */
2908 " ..XXXXXXXXXXXXX.. ",
2909 " .XXXXXXXXXXXXXXXXX. ",
2910 " .XXXXXXXXoO+XXXXXXXX. ",
2911 " .XXXXXXXXX@#OXXXXXXXXX. ",
2912 " .XXXXXXXXXX$@oXXXXXXXXXX. ",
2913 " .XXXXXXXXXXXXXXXXXXXXXXX.% ",
2914 " .XXXXXXXXX&*=-XXXXXXXXXX.%% ",
2915 ".XXXXXXXXXX;:#>XXXXXXXXXXX.% ",
2916 ".XXXXXXXXXXX;#+XXXXXXXXXXX.% ",
2917 ".XXXXXXXXXXX;#+XXXXXXXXXXX.%% ",
2918 " .XXXXXXXXXX;#+XXXXXXXXXX.%%% ",
2919 " .XXXXXXXXXX;#+XXXXXXXXXX.%%% ",
2920 " .XXXXXXXXXX;#+XXXXXXXXXX.%% ",
2921 " .XXXXXXXX*-##+XXXXXXXX.%%% ",
2922 " .XXXXXXXXXXXXXXXXXXX.%%%% ",
2923 " .XXXXXXXXXXXXXXXXX.%%%% ",
2924 " ..XXXXXXXXXXXXX..%%%% ",
2925 " %...XXXXXXXX..%%%%% ",
2926 " %%%..XXXXXX.%%%%% ",
2940 /* Copyright (c) Julian Smart */
2941 static char *question_xpm
[]={
2942 /* columns rows colors chars-per-pixel */
2963 " ..XXXXXXXXXXXXX.. ",
2964 " .XXXXXXoO++@XXXXXX. ",
2965 " .XXXXXXO#$$$$#%XXXXX. ",
2966 " .XXXXXX@$$#&&#$#oXXXXX. ",
2967 " .XXXXXXX*$$%XX%$$=XXXXXX. ",
2968 " .XXXXXXX+-;XXXX$$-XXXXXX.: ",
2969 " .XXXXXXXXXXXXX+$$&XXXXXX.:: ",
2970 ".XXXXXXXXXXXXo;$$*oXXXXXXX.: ",
2971 ".XXXXXXXXXXXo*$$*oXXXXXXXX.: ",
2972 ".XXXXXXXXXXX+$$*oXXXXXXXXX.:: ",
2973 " .XXXXXXXXXX-$$oXXXXXXXXX.::: ",
2974 " .XXXXXXXXXXX--XXXXXXXXXX.::: ",
2975 " .XXXXXXXXXXXXXXXXXXXXXXX.:: ",
2976 " .XXXXXXXXX-$$XXXXXXXXX.::: ",
2977 " .XXXXXXXX-$$XXXXXXXX.:::: ",
2978 " .XXXXXXXO++XXXXXXX.:::: ",
2979 " ..XXXXXXXXXXXXX..:::: ",
2980 " :...XXXXXXXX..::::: ",
2981 " :::..XXXXXX.::::: ",
2995 /* Copyright (c) Julian Smart */
2996 static char *warning_xpm
[]={
2997 /* columns rows colors chars-per-pixel */
3023 " ..XXXXO@#XXX... ",
3024 " ...XXXXO@#XXXX.. ",
3025 " ..XXXXXO@#XXXX... ",
3026 " ...XXXXXo@OXXXXX.. ",
3027 " ...XXXXXXo@OXXXXXX.. ",
3028 " ..XXXXXXX$@OXXXXXX... ",
3029 " ...XXXXXXXX@XXXXXXXX.. ",
3030 " ...XXXXXXXXXXXXXXXXXX... ",
3031 " ..XXXXXXXXXXOXXXXXXXXX.. ",
3032 " ...XXXXXXXXXO@#XXXXXXXXX.. ",
3033 " ..XXXXXXXXXXX#XXXXXXXXXX... ",
3034 " ...XXXXXXXXXXXXXXXXXXXXXXX.. ",
3035 " ...XXXXXXXXXXXXXXXXXXXXXXXX... ",
3036 " .............................. ",
3037 " .............................. ",
3044 wxBitmap
wxWin32ArtProvider::CreateBitmap(const wxArtID
& id
,
3045 const wxArtClient
& WXUNUSED(client
),
3046 const wxSize
& WXUNUSED(size
))
3048 if ( id
== wxART_INFORMATION
)
3049 return wxBitmap(info_xpm
);
3050 if ( id
== wxART_ERROR
)
3051 return wxBitmap(error_xpm
);
3052 if ( id
== wxART_WARNING
)
3053 return wxBitmap(warning_xpm
);
3054 if ( id
== wxART_QUESTION
)
3055 return wxBitmap(question_xpm
);
3056 return wxNullBitmap
;
3062 // ----------------------------------------------------------------------------
3063 // text control geometry
3064 // ----------------------------------------------------------------------------
3067 wxWin32Renderer::GetTextTotalArea(const wxTextCtrl
*text
,
3068 const wxRect
& rect
) const
3070 wxRect rectTotal
= wxStdRenderer::GetTextTotalArea(text
, rect
);
3072 // this is strange but it's what Windows does
3079 wxWin32Renderer::GetTextClientArea(const wxTextCtrl
*text
,
3081 wxCoord
*extraSpaceBeyond
) const
3083 wxRect rectText
= rect
;
3085 // undo GetTextTotalArea()
3086 if ( rectText
.height
> 0 )
3089 return wxStdRenderer::GetTextClientArea(text
, rect
, extraSpaceBeyond
);
3092 #endif // wxUSE_TEXTCTRL
3094 // ----------------------------------------------------------------------------
3096 // ----------------------------------------------------------------------------
3098 void wxWin32Renderer::AdjustSize(wxSize
*size
, const wxWindow
*window
)
3101 if ( wxDynamicCast(window
, wxScrollBar
) )
3103 // we only set the width of vert scrollbars and height of the
3105 if ( window
->GetWindowStyle() & wxSB_HORIZONTAL
)
3106 size
->y
= m_sizeScrollbarArrow
.y
;
3108 size
->x
= m_sizeScrollbarArrow
.x
;
3110 // skip border width adjustments, they don't make sense for us
3113 #endif // wxUSE_SCROLLBAR
3116 if ( wxDynamicCast(window
, wxBitmapButton
) )
3120 #endif // wxUSE_BMPBUTTON
3121 #if wxUSE_BUTTON || wxUSE_TOGGLEBTN
3124 || wxDynamicCast(window
, wxButton
)
3125 # endif // wxUSE_BUTTON
3126 # if wxUSE_TOGGLEBTN
3127 || wxDynamicCast(window
, wxToggleButton
)
3128 # endif // wxUSE_TOGGLEBTN
3131 if ( !(window
->GetWindowStyle() & wxBU_EXACTFIT
) )
3133 // TODO: don't harcode all this
3134 size
->x
+= 3*window
->GetCharWidth();
3136 wxCoord heightBtn
= (11*(window
->GetCharHeight() + 8))/10;
3137 if ( size
->y
< heightBtn
- 8 )
3138 size
->y
= heightBtn
;
3143 // for compatibility with other ports, the buttons default size is never
3144 // less than the standard one, but not when display not PDAs.
3145 if (wxSystemSettings::GetScreenType() > wxSYS_SCREEN_PDA
)
3147 if ( !(window
->GetWindowStyle() & wxBU_EXACTFIT
) )
3149 wxSize szDef
= wxButton::GetDefaultSize();
3150 if ( size
->x
< szDef
.x
)
3155 // no border width adjustments for buttons
3158 #endif // wxUSE_BUTTON || wxUSE_TOGGLEBTN
3160 wxStdRenderer::AdjustSize(size
, window
);
3163 wxBitmap
wxWin32Renderer::GetFrameButtonBitmap(FrameButtonType type
)
3165 wxBitmap
& bmp
= m_bmpFrameButtons
[type
];
3168 bmp
= wxBitmap(ms_xpmFrameButtons
[type
]);
3174 // ============================================================================
3176 // ============================================================================
3178 // ----------------------------------------------------------------------------
3179 // wxWin32InputHandler
3180 // ----------------------------------------------------------------------------
3182 bool wxWin32InputHandler::HandleKey(wxInputConsumer
* WXUNUSED(control
),
3183 const wxKeyEvent
& WXUNUSED(event
),
3184 bool WXUNUSED(pressed
))
3189 bool wxWin32InputHandler::HandleMouse(wxInputConsumer
*control
,
3190 const wxMouseEvent
& event
)
3192 // clicking on the control gives it focus
3193 if ( event
.ButtonDown() )
3195 wxWindow
*win
= control
->GetInputWindow();
3197 if ( (wxWindow::FindFocus() != control
->GetInputWindow()) &&
3198 win
->AcceptsFocus() )
3211 // ----------------------------------------------------------------------------
3212 // wxWin32ScrollBarInputHandler
3213 // ----------------------------------------------------------------------------
3215 wxWin32ScrollBarInputHandler::
3216 wxWin32ScrollBarInputHandler(wxRenderer
*renderer
, wxInputHandler
*handler
)
3217 : wxStdScrollBarInputHandler(renderer
, handler
)
3219 m_scrollPaused
= false;
3223 bool wxWin32ScrollBarInputHandler::OnScrollTimer(wxScrollBar
*scrollbar
,
3224 const wxControlAction
& action
)
3226 // stop if went beyond the position of the original click (this can only
3227 // happen when we scroll by pages)
3229 if ( action
== wxACTION_SCROLL_PAGE_DOWN
)
3231 stop
= m_renderer
->HitTestScrollbar(scrollbar
, m_ptStartScrolling
)
3232 != wxHT_SCROLLBAR_BAR_2
;
3234 else if ( action
== wxACTION_SCROLL_PAGE_UP
)
3236 stop
= m_renderer
->HitTestScrollbar(scrollbar
, m_ptStartScrolling
)
3237 != wxHT_SCROLLBAR_BAR_1
;
3242 StopScrolling(scrollbar
);
3244 scrollbar
->Refresh();
3249 return wxStdScrollBarInputHandler::OnScrollTimer(scrollbar
, action
);
3252 bool wxWin32ScrollBarInputHandler::HandleMouse(wxInputConsumer
*control
,
3253 const wxMouseEvent
& event
)
3255 // remember the current state
3256 bool wasDraggingThumb
= m_htLast
== wxHT_SCROLLBAR_THUMB
;
3258 // do process the message
3259 bool rc
= wxStdScrollBarInputHandler::HandleMouse(control
, event
);
3261 // analyse the changes
3262 if ( !wasDraggingThumb
&& (m_htLast
== wxHT_SCROLLBAR_THUMB
) )
3264 // we just started dragging the thumb, remember its initial position to
3265 // be able to restore it if the drag is cancelled later
3266 m_eventStartDrag
= event
;
3272 bool wxWin32ScrollBarInputHandler::HandleMouseMove(wxInputConsumer
*control
,
3273 const wxMouseEvent
& event
)
3275 // we don't highlight scrollbar elements, so there is no need to process
3276 // mouse move events normally - only do it while mouse is captured (i.e.
3277 // when we're dragging the thumb or pressing on something)
3278 if ( !m_winCapture
)
3281 if ( event
.Entering() )
3283 // we're not interested in this at all
3287 wxScrollBar
*scrollbar
= wxStaticCast(control
->GetInputWindow(), wxScrollBar
);
3289 if ( m_scrollPaused
)
3291 // check if the mouse returned to its original location
3293 if ( event
.Leaving() )
3299 ht
= m_renderer
->HitTestScrollbar(scrollbar
, event
.GetPosition());
3300 if ( ht
== m_htLast
)
3302 // yes it did, resume scrolling
3303 m_scrollPaused
= false;
3304 if ( m_timerScroll
)
3306 // we were scrolling by line/page, restart timer
3307 m_timerScroll
->Start(m_interval
);
3309 Press(scrollbar
, true);
3311 else // we were dragging the thumb
3313 // restore its last location
3314 HandleThumbMove(scrollbar
, m_eventLastDrag
);
3320 else // normal case, scrolling hasn't been paused
3322 // if we're scrolling the scrollbar because the arrow or the shaft was
3323 // pressed, check that the mouse stays on the same scrollbar element
3326 // Always let thumb jump back if we leave the scrollbar
3327 if ( event
.Moving() )
3329 ht
= m_renderer
->HitTestScrollbar(scrollbar
, event
.GetPosition());
3331 else // event.Leaving()
3336 // Jump back only if we get far away from it
3337 wxPoint pos
= event
.GetPosition();
3338 if (scrollbar
->HasFlag( wxVERTICAL
))
3340 if (pos
.x
> -40 && pos
.x
< scrollbar
->GetSize().x
+40)
3345 if (pos
.y
> -40 && pos
.y
< scrollbar
->GetSize().y
+40)
3348 ht
= m_renderer
->HitTestScrollbar(scrollbar
, pos
);
3351 // if we're dragging the thumb and the mouse stays in the scrollbar, it
3352 // is still ok - we only want to catch the case when the mouse leaves
3353 // the scrollbar here
3354 if ( m_htLast
== wxHT_SCROLLBAR_THUMB
&& ht
!= wxHT_NOWHERE
)
3356 ht
= wxHT_SCROLLBAR_THUMB
;
3359 if ( ht
!= m_htLast
)
3361 // what were we doing? 2 possibilities: either an arrow/shaft was
3362 // pressed in which case we have a timer and so we just stop it or
3363 // we were dragging the thumb
3364 if ( m_timerScroll
)
3367 m_interval
= m_timerScroll
->GetInterval();
3368 m_timerScroll
->Stop();
3369 m_scrollPaused
= true;
3371 // unpress the arrow
3372 Press(scrollbar
, false);
3374 else // we were dragging the thumb
3376 // remember the current thumb position to be able to restore it
3377 // if the mouse returns to it later
3378 m_eventLastDrag
= event
;
3380 // and restore the original position (before dragging) of the
3382 HandleThumbMove(scrollbar
, m_eventStartDrag
);
3389 return wxStdInputHandler::HandleMouseMove(control
, event
);
3392 #endif // wxUSE_SCROLLBAR
3396 // ----------------------------------------------------------------------------
3397 // wxWin32CheckboxInputHandler
3398 // ----------------------------------------------------------------------------
3400 bool wxWin32CheckboxInputHandler::HandleKey(wxInputConsumer
*control
,
3401 const wxKeyEvent
& event
,
3406 wxControlAction action
;
3407 int keycode
= event
.GetKeyCode();
3411 action
= wxACTION_CHECKBOX_TOGGLE
;
3415 case WXK_NUMPAD_SUBTRACT
:
3416 action
= wxACTION_CHECKBOX_CHECK
;
3420 case WXK_NUMPAD_ADD
:
3421 case WXK_NUMPAD_EQUAL
:
3422 action
= wxACTION_CHECKBOX_CLEAR
;
3426 if ( !action
.IsEmpty() )
3428 control
->PerformAction(action
);
3437 #endif // wxUSE_CHECKBOX
3441 // ----------------------------------------------------------------------------
3442 // wxWin32TextCtrlInputHandler
3443 // ----------------------------------------------------------------------------
3445 bool wxWin32TextCtrlInputHandler::HandleKey(wxInputConsumer
*control
,
3446 const wxKeyEvent
& event
,
3449 // handle only MSW-specific text bindings here, the others are handled in
3453 int keycode
= event
.GetKeyCode();
3455 wxControlAction action
;
3456 if ( keycode
== WXK_DELETE
&& event
.ShiftDown() )
3458 action
= wxACTION_TEXT_CUT
;
3460 else if ( keycode
== WXK_INSERT
)
3462 if ( event
.ControlDown() )
3463 action
= wxACTION_TEXT_COPY
;
3464 else if ( event
.ShiftDown() )
3465 action
= wxACTION_TEXT_PASTE
;
3468 if ( action
!= wxACTION_NONE
)
3470 control
->PerformAction(action
);
3476 return wxStdInputHandler::HandleKey(control
, event
, pressed
);
3479 #endif // wxUSE_TEXTCTRL
3483 // ----------------------------------------------------------------------------
3484 // wxWin32StatusBarInputHandler
3485 // ----------------------------------------------------------------------------
3487 wxWin32StatusBarInputHandler::
3488 wxWin32StatusBarInputHandler(wxInputHandler
*handler
)
3489 : wxStdInputHandler(handler
)
3494 bool wxWin32StatusBarInputHandler::IsOnGrip(wxWindow
*statbar
,
3495 const wxPoint
& pt
) const
3497 if ( statbar
->HasFlag(wxST_SIZEGRIP
) &&
3498 statbar
->GetParent()->HasFlag(wxRESIZE_BORDER
) )
3501 parentTLW
= wxDynamicCast(statbar
->GetParent(), wxTopLevelWindow
);
3503 wxCHECK_MSG( parentTLW
, false,
3504 _T("the status bar should be a child of a TLW") );
3506 // a maximized window can't be resized anyhow
3507 if ( !parentTLW
->IsMaximized() )
3509 // VZ: I think that the standard Windows behaviour is to only
3510 // show the resizing cursor when the mouse is on top of the
3511 // grip itself but apparently different Windows versions behave
3512 // differently (?) and it seems a better UI to allow resizing
3513 // the status bar even when the mouse is above the grip
3514 wxSize sizeSbar
= statbar
->GetSize();
3516 int diff
= sizeSbar
.x
- pt
.x
;
3517 return diff
>= 0 && diff
< (wxCoord
)STATUSBAR_GRIP_SIZE
;
3524 bool wxWin32StatusBarInputHandler::HandleMouse(wxInputConsumer
*consumer
,
3525 const wxMouseEvent
& event
)
3527 if ( event
.Button(1) )
3529 if ( event
.ButtonDown(1) )
3531 wxWindow
*statbar
= consumer
->GetInputWindow();
3533 if ( IsOnGrip(statbar
, event
.GetPosition()) )
3535 wxTopLevelWindow
*tlw
= wxDynamicCast(statbar
->GetParent(),
3539 tlw
->PerformAction(wxACTION_TOPLEVEL_RESIZE
,
3540 wxHT_TOPLEVEL_BORDER_SE
);
3542 statbar
->SetCursor(m_cursorOld
);
3550 return wxStdInputHandler::HandleMouse(consumer
, event
);
3553 bool wxWin32StatusBarInputHandler::HandleMouseMove(wxInputConsumer
*consumer
,
3554 const wxMouseEvent
& event
)
3556 wxWindow
*statbar
= consumer
->GetInputWindow();
3558 bool isOnGrip
= IsOnGrip(statbar
, event
.GetPosition());
3559 if ( isOnGrip
!= m_isOnGrip
)
3561 m_isOnGrip
= isOnGrip
;
3564 m_cursorOld
= statbar
->GetCursor();
3565 statbar
->SetCursor(wxCURSOR_SIZENWSE
);
3569 statbar
->SetCursor(m_cursorOld
);
3573 return wxStdInputHandler::HandleMouseMove(consumer
, event
);
3576 #endif // wxUSE_STATUSBAR
3578 // ----------------------------------------------------------------------------
3579 // wxWin32FrameInputHandler
3580 // ----------------------------------------------------------------------------
3582 class wxWin32SystemMenuEvtHandler
: public wxEvtHandler
3585 wxWin32SystemMenuEvtHandler(wxWin32FrameInputHandler
*handler
);
3587 void Attach(wxInputConsumer
*consumer
);
3591 DECLARE_EVENT_TABLE()
3592 void OnSystemMenu(wxCommandEvent
&event
);
3593 void OnCloseFrame(wxCommandEvent
&event
);
3594 void OnClose(wxCloseEvent
&event
);
3596 wxWin32FrameInputHandler
*m_inputHnd
;
3597 wxTopLevelWindow
*m_wnd
;
3599 wxAcceleratorTable m_oldAccelTable
;
3603 wxWin32SystemMenuEvtHandler::
3604 wxWin32SystemMenuEvtHandler(wxWin32FrameInputHandler
*handler
)
3606 m_inputHnd
= handler
;
3610 void wxWin32SystemMenuEvtHandler::Attach(wxInputConsumer
*consumer
)
3612 wxASSERT_MSG( m_wnd
== NULL
, _T("can't attach the handler twice!") );
3614 m_wnd
= wxStaticCast(consumer
->GetInputWindow(), wxTopLevelWindow
);
3615 m_wnd
->PushEventHandler(this);
3618 // VS: This code relies on using generic implementation of
3619 // wxAcceleratorTable in wxUniv!
3620 wxAcceleratorTable table
= *m_wnd
->GetAcceleratorTable();
3621 m_oldAccelTable
= table
;
3622 table
.Add(wxAcceleratorEntry(wxACCEL_ALT
, WXK_SPACE
, wxID_SYSTEM_MENU
));
3623 table
.Add(wxAcceleratorEntry(wxACCEL_ALT
, WXK_F4
, wxID_CLOSE_FRAME
));
3624 m_wnd
->SetAcceleratorTable(table
);
3628 void wxWin32SystemMenuEvtHandler::Detach()
3633 m_wnd
->SetAcceleratorTable(m_oldAccelTable
);
3635 m_wnd
->RemoveEventHandler(this);
3640 BEGIN_EVENT_TABLE(wxWin32SystemMenuEvtHandler
, wxEvtHandler
)
3641 EVT_MENU(wxID_SYSTEM_MENU
, wxWin32SystemMenuEvtHandler::OnSystemMenu
)
3642 EVT_MENU(wxID_CLOSE_FRAME
, wxWin32SystemMenuEvtHandler::OnCloseFrame
)
3643 EVT_CLOSE(wxWin32SystemMenuEvtHandler::OnClose
)
3646 void wxWin32SystemMenuEvtHandler::OnSystemMenu(wxCommandEvent
&WXUNUSED(event
))
3649 wxAcceleratorTable table
= *m_wnd
->GetAcceleratorTable();
3650 m_wnd
->SetAcceleratorTable(wxNullAcceleratorTable
);
3654 m_inputHnd
->PopupSystemMenu(m_wnd
);
3655 #endif // wxUSE_MENUS
3658 m_wnd
->SetAcceleratorTable(table
);
3662 void wxWin32SystemMenuEvtHandler::OnCloseFrame(wxCommandEvent
&WXUNUSED(event
))
3664 m_wnd
->PerformAction(wxACTION_TOPLEVEL_BUTTON_CLICK
,
3665 wxTOPLEVEL_BUTTON_CLOSE
);
3668 void wxWin32SystemMenuEvtHandler::OnClose(wxCloseEvent
&event
)
3675 wxWin32FrameInputHandler::wxWin32FrameInputHandler(wxInputHandler
*handler
)
3676 : wxStdInputHandler(handler
)
3678 m_menuHandler
= new wxWin32SystemMenuEvtHandler(this);
3681 wxWin32FrameInputHandler::~wxWin32FrameInputHandler()
3683 if ( m_menuHandler
)
3685 m_menuHandler
->Detach();
3686 delete m_menuHandler
;
3690 bool wxWin32FrameInputHandler::HandleMouse(wxInputConsumer
*consumer
,
3691 const wxMouseEvent
& event
)
3693 if ( event
.LeftDClick() || event
.LeftDown() || event
.RightDown() )
3695 wxTopLevelWindow
*tlw
=
3696 wxStaticCast(consumer
->GetInputWindow(), wxTopLevelWindow
);
3698 long hit
= tlw
->HitTest(event
.GetPosition());
3700 if ( event
.LeftDClick() && hit
== wxHT_TOPLEVEL_TITLEBAR
)
3702 tlw
->PerformAction(wxACTION_TOPLEVEL_BUTTON_CLICK
,
3703 tlw
->IsMaximized() ? wxTOPLEVEL_BUTTON_RESTORE
3704 : wxTOPLEVEL_BUTTON_MAXIMIZE
);
3707 else if ( tlw
->GetWindowStyle() & wxSYSTEM_MENU
)
3709 if ( (event
.LeftDown() && hit
== wxHT_TOPLEVEL_ICON
) ||
3710 (event
.RightDown() &&
3711 (hit
== wxHT_TOPLEVEL_TITLEBAR
||
3712 hit
== wxHT_TOPLEVEL_ICON
)) )
3715 PopupSystemMenu(tlw
);
3716 #endif // wxUSE_MENUS
3722 return wxStdInputHandler::HandleMouse(consumer
, event
);
3727 void wxWin32FrameInputHandler::PopupSystemMenu(wxTopLevelWindow
*window
) const
3731 if ( window
->GetWindowStyle() & wxMAXIMIZE_BOX
)
3732 menu
.Append(wxID_RESTORE_FRAME
, _("&Restore"));
3733 menu
.Append(wxID_MOVE_FRAME
, _("&Move"));
3734 if ( window
->GetWindowStyle() & wxRESIZE_BORDER
)
3735 menu
.Append(wxID_RESIZE_FRAME
, _("&Size"));
3736 if ( wxSystemSettings::HasFeature(wxSYS_CAN_ICONIZE_FRAME
) )
3737 menu
.Append(wxID_ICONIZE_FRAME
, _("Mi&nimize"));
3738 if ( window
->GetWindowStyle() & wxMAXIMIZE_BOX
)
3739 menu
.Append(wxID_MAXIMIZE_FRAME
, _("Ma&ximize"));
3740 menu
.AppendSeparator();
3741 menu
.Append(wxID_CLOSE_FRAME
, _("Close\tAlt-F4"));
3743 if ( window
->GetWindowStyle() & wxMAXIMIZE_BOX
)
3745 if ( window
->IsMaximized() )
3747 menu
.Enable(wxID_MAXIMIZE_FRAME
, false);
3748 menu
.Enable(wxID_MOVE_FRAME
, false);
3749 if ( window
->GetWindowStyle() & wxRESIZE_BORDER
)
3750 menu
.Enable(wxID_RESIZE_FRAME
, false);
3753 menu
.Enable(wxID_RESTORE_FRAME
, false);
3756 window
->PopupMenu(&menu
, wxPoint(0, 0));
3759 #endif // wxUSE_MENUS
3761 bool wxWin32FrameInputHandler::HandleActivation(wxInputConsumer
*consumer
,
3764 if ( consumer
->GetInputWindow()->GetWindowStyle() & wxSYSTEM_MENU
)
3766 // always detach if active frame changed:
3767 m_menuHandler
->Detach();
3771 m_menuHandler
->Attach(consumer
);
3775 return wxStdInputHandler::HandleActivation(consumer
, activated
);
3778 #endif // wxUSE_ALL_THEMES || wxUSE_THEME_WIN32