1 ///////////////////////////////////////////////////////////////////////////////
3 // Name: src/aui/dockart.cpp
4 // Purpose: wxaui: wx advanced user interface - docking window manager
5 // Author: Benjamin I. Williams
9 // Copyright: (C) Copyright 2005-2006, Kirix Corporation, All Rights Reserved
10 // Licence: wxWindows Library Licence, Version 3.1
11 ///////////////////////////////////////////////////////////////////////////////
13 // ============================================================================
15 // ============================================================================
17 // ----------------------------------------------------------------------------
19 // ----------------------------------------------------------------------------
21 #include "wx/wxprec.h"
29 #include "wx/statline.h"
30 #include "wx/dcbuffer.h"
33 #include "wx/settings.h"
36 #include "wx/aui/auibar.h"
37 #include "wx/aui/framemanager.h"
40 #include "wx/osx/private.h"
41 // for themeing support
42 #include <Carbon/Carbon.h>
45 #include "wx/arrimpl.cpp"
46 WX_DEFINE_OBJARRAY(wxAuiToolBarItemArray
)
49 wxDEFINE_EVENT( wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN
, wxAuiToolBarEvent
);
50 wxDEFINE_EVENT( wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK
, wxAuiToolBarEvent
);
51 wxDEFINE_EVENT( wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK
, wxAuiToolBarEvent
);
52 wxDEFINE_EVENT( wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK
, wxAuiToolBarEvent
);
53 wxDEFINE_EVENT( wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG
, wxAuiToolBarEvent
);
56 IMPLEMENT_CLASS(wxAuiToolBar
, wxControl
)
57 IMPLEMENT_DYNAMIC_CLASS(wxAuiToolBarEvent
, wxEvent
)
60 // missing wxITEM_* items
63 wxITEM_CONTROL
= wxITEM_MAX
,
68 const int BUTTON_DROPDOWN_WIDTH
= 10;
71 wxBitmap
wxAuiBitmapFromBits(const unsigned char bits
[], int w
, int h
,
72 const wxColour
& color
);
74 unsigned char wxAuiBlendColour(unsigned char fg
, unsigned char bg
, double alpha
);
75 wxColor
wxAuiStepColour(const wxColor
& c
, int percent
);
77 static wxBitmap
MakeDisabledBitmap(wxBitmap
& bmp
)
79 wxImage image
= bmp
.ConvertToImage();
82 mr
= image
.GetMaskRed();
83 mg
= image
.GetMaskGreen();
84 mb
= image
.GetMaskBlue();
86 unsigned char* data
= image
.GetData();
87 int width
= image
.GetWidth();
88 int height
= image
.GetHeight();
89 bool has_mask
= image
.HasMask();
91 for (int y
= height
-1; y
>= 0; --y
)
93 for (int x
= width
-1; x
>= 0; --x
)
95 data
= image
.GetData() + (y
*(width
*3))+(x
*3);
96 unsigned char* r
= data
;
97 unsigned char* g
= data
+1;
98 unsigned char* b
= data
+2;
100 if (has_mask
&& *r
== mr
&& *g
== mg
&& *b
== mb
)
103 *r
= wxAuiBlendColour(*r
, 255, 0.4);
104 *g
= wxAuiBlendColour(*g
, 255, 0.4);
105 *b
= wxAuiBlendColour(*b
, 255, 0.4);
109 return wxBitmap(image
);
112 static wxColor
GetBaseColor()
115 #if defined( __WXMAC__ ) && wxOSX_USE_COCOA_OR_CARBON
116 wxColor base_colour
= wxColour( wxMacCreateCGColorFromHITheme(kThemeBrushToolbarBackground
));
118 wxColor base_colour
= wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE
);
121 // the base_colour is too pale to use as our base colour,
122 // so darken it a bit --
123 if ((255-base_colour
.Red()) +
124 (255-base_colour
.Green()) +
125 (255-base_colour
.Blue()) < 60)
127 base_colour
= wxAuiStepColour(base_colour
, 92);
135 class ToolbarCommandCapture
: public wxEvtHandler
139 ToolbarCommandCapture() { m_last_id
= 0; }
140 int GetCommandId() const { return m_last_id
; }
142 bool ProcessEvent(wxEvent
& evt
)
144 if (evt
.GetEventType() == wxEVT_COMMAND_MENU_SELECTED
)
146 m_last_id
= evt
.GetId();
150 if (GetNextHandler())
151 return GetNextHandler()->ProcessEvent(evt
);
162 static const unsigned char
163 DISABLED_TEXT_GREY_HUE
= wxAuiBlendColour(0, 255, 0.4);
164 const wxColour
DISABLED_TEXT_COLOR(DISABLED_TEXT_GREY_HUE
,
165 DISABLED_TEXT_GREY_HUE
,
166 DISABLED_TEXT_GREY_HUE
);
168 wxAuiDefaultToolBarArt::wxAuiDefaultToolBarArt()
170 m_base_colour
= GetBaseColor();
173 m_text_orientation
= wxAUI_TBTOOL_TEXT_BOTTOM
;
174 m_highlight_colour
= wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT
);
176 m_separator_size
= 7;
178 m_overflow_size
= 16;
180 wxColor darker1_colour
= wxAuiStepColour(m_base_colour
, 85);
181 wxColor darker2_colour
= wxAuiStepColour(m_base_colour
, 75);
182 wxColor darker3_colour
= wxAuiStepColour(m_base_colour
, 60);
183 wxColor darker4_colour
= wxAuiStepColour(m_base_colour
, 50);
184 wxColor darker5_colour
= wxAuiStepColour(m_base_colour
, 40);
186 m_gripper_pen1
= wxPen(darker5_colour
);
187 m_gripper_pen2
= wxPen(darker3_colour
);
188 m_gripper_pen3
= *wxWHITE_PEN
;
190 static unsigned char button_dropdown_bits
[] = { 0xe0, 0xf1, 0xfb };
191 static unsigned char overflow_bits
[] = { 0x80, 0xff, 0x80, 0xc1, 0xe3, 0xf7 };
193 m_button_dropdown_bmp
= wxAuiBitmapFromBits(button_dropdown_bits
, 5, 3,
195 m_disabled_button_dropdown_bmp
= wxAuiBitmapFromBits(
196 button_dropdown_bits
, 5, 3,
197 wxColor(128,128,128));
198 m_overflow_bmp
= wxAuiBitmapFromBits(overflow_bits
, 7, 6, *wxBLACK
);
199 m_disabled_overflow_bmp
= wxAuiBitmapFromBits(overflow_bits
, 7, 6, wxColor(128,128,128));
201 m_font
= *wxNORMAL_FONT
;
204 wxAuiDefaultToolBarArt::~wxAuiDefaultToolBarArt()
206 m_font
= *wxNORMAL_FONT
;
210 wxAuiToolBarArt
* wxAuiDefaultToolBarArt::Clone()
212 return static_cast<wxAuiToolBarArt
*>(new wxAuiDefaultToolBarArt
);
215 void wxAuiDefaultToolBarArt::SetFlags(unsigned int flags
)
220 void wxAuiDefaultToolBarArt::SetFont(const wxFont
& font
)
225 void wxAuiDefaultToolBarArt::SetTextOrientation(int orientation
)
227 m_text_orientation
= orientation
;
230 unsigned int wxAuiDefaultToolBarArt::GetFlags()
235 wxFont
wxAuiDefaultToolBarArt::GetFont()
240 int wxAuiDefaultToolBarArt::GetTextOrientation()
242 return m_text_orientation
;
245 void wxAuiDefaultToolBarArt::DrawBackground(
247 wxWindow
* WXUNUSED(wnd
),
252 wxColour start_colour
= wxAuiStepColour(m_base_colour
, 150);
253 wxColour end_colour
= wxAuiStepColour(m_base_colour
, 90);
254 dc
.GradientFillLinear(rect
, start_colour
, end_colour
, wxSOUTH
);
257 void wxAuiDefaultToolBarArt::DrawLabel(
259 wxWindow
* WXUNUSED(wnd
),
260 const wxAuiToolBarItem
& item
,
264 dc
.SetTextForeground(*wxBLACK
);
266 // we only care about the text height here since the text
267 // will get cropped based on the width of the item
268 int text_width
= 0, text_height
= 0;
269 dc
.GetTextExtent(wxT("ABCDHgj"), &text_width
, &text_height
);
271 // set the clipping region
272 wxRect clip_rect
= rect
;
273 clip_rect
.width
-= 1;
274 dc
.SetClippingRegion(clip_rect
);
278 text_y
= rect
.y
+ (rect
.height
-text_height
)/2;
279 dc
.DrawText(item
.GetLabel(), text_x
, text_y
);
280 dc
.DestroyClippingRegion();
284 void wxAuiDefaultToolBarArt::DrawButton(
286 wxWindow
* WXUNUSED(wnd
),
287 const wxAuiToolBarItem
& item
,
290 int text_width
= 0, text_height
= 0;
292 if (m_flags
& wxAUI_TB_TEXT
)
298 dc
.GetTextExtent(wxT("ABCDHgj"), &tx
, &text_height
);
300 dc
.GetTextExtent(item
.GetLabel(), &text_width
, &ty
);
303 int bmp_x
= 0, bmp_y
= 0;
304 int text_x
= 0, text_y
= 0;
306 if (m_text_orientation
== wxAUI_TBTOOL_TEXT_BOTTOM
)
310 (item
.GetBitmap().GetWidth()/2);
313 ((rect
.height
-text_height
)/2) -
314 (item
.GetBitmap().GetHeight()/2);
316 text_x
= rect
.x
+ (rect
.width
/2) - (text_width
/2) + 1;
317 text_y
= rect
.y
+ rect
.height
- text_height
- 1;
319 else if (m_text_orientation
== wxAUI_TBTOOL_TEXT_RIGHT
)
325 (item
.GetBitmap().GetHeight()/2);
327 text_x
= bmp_x
+ 3 + item
.GetBitmap().GetWidth();
334 if (!(item
.GetState() & wxAUI_BUTTON_STATE_DISABLED
))
336 if (item
.GetState() & wxAUI_BUTTON_STATE_PRESSED
)
338 dc
.SetPen(wxPen(m_highlight_colour
));
339 dc
.SetBrush(wxBrush(wxAuiStepColour(m_highlight_colour
, 150)));
340 dc
.DrawRectangle(rect
);
342 else if ((item
.GetState() & wxAUI_BUTTON_STATE_HOVER
) || item
.IsSticky())
344 dc
.SetPen(wxPen(m_highlight_colour
));
345 dc
.SetBrush(wxBrush(wxAuiStepColour(m_highlight_colour
, 170)));
347 // draw an even lighter background for checked item hovers (since
348 // the hover background is the same color as the check background)
349 if (item
.GetState() & wxAUI_BUTTON_STATE_CHECKED
)
350 dc
.SetBrush(wxBrush(wxAuiStepColour(m_highlight_colour
, 180)));
352 dc
.DrawRectangle(rect
);
354 else if (item
.GetState() & wxAUI_BUTTON_STATE_CHECKED
)
356 // it's important to put this code in an else statment after the
357 // hover, otherwise hovers won't draw properly for checked items
358 dc
.SetPen(wxPen(m_highlight_colour
));
359 dc
.SetBrush(wxBrush(wxAuiStepColour(m_highlight_colour
, 170)));
360 dc
.DrawRectangle(rect
);
365 if (item
.GetState() & wxAUI_BUTTON_STATE_DISABLED
)
366 bmp
= item
.GetDisabledBitmap();
368 bmp
= item
.GetBitmap();
373 dc
.DrawBitmap(bmp
, bmp_x
, bmp_y
, true);
375 // set the item's text color based on if it is disabled
376 dc
.SetTextForeground(*wxBLACK
);
377 if (item
.GetState() & wxAUI_BUTTON_STATE_DISABLED
)
378 dc
.SetTextForeground(DISABLED_TEXT_COLOR
);
380 if ( (m_flags
& wxAUI_TB_TEXT
) && !item
.GetLabel().empty() )
382 dc
.DrawText(item
.GetLabel(), text_x
, text_y
);
387 void wxAuiDefaultToolBarArt::DrawDropDownButton(
389 wxWindow
* WXUNUSED(wnd
),
390 const wxAuiToolBarItem
& item
,
393 int text_width
= 0, text_height
= 0, text_x
= 0, text_y
= 0;
394 int bmp_x
= 0, bmp_y
= 0, dropbmp_x
= 0, dropbmp_y
= 0;
396 wxRect button_rect
= wxRect(rect
.x
,
398 rect
.width
-BUTTON_DROPDOWN_WIDTH
,
400 wxRect dropdown_rect
= wxRect(rect
.x
+rect
.width
-BUTTON_DROPDOWN_WIDTH
-1,
402 BUTTON_DROPDOWN_WIDTH
+1,
405 if (m_flags
& wxAUI_TB_TEXT
)
410 if (m_flags
& wxAUI_TB_TEXT
)
412 dc
.GetTextExtent(wxT("ABCDHgj"), &tx
, &text_height
);
416 dc
.GetTextExtent(item
.GetLabel(), &text_width
, &ty
);
421 dropbmp_x
= dropdown_rect
.x
+
422 (dropdown_rect
.width
/2) -
423 (m_button_dropdown_bmp
.GetWidth()/2);
424 dropbmp_y
= dropdown_rect
.y
+
425 (dropdown_rect
.height
/2) -
426 (m_button_dropdown_bmp
.GetHeight()/2);
429 if (m_text_orientation
== wxAUI_TBTOOL_TEXT_BOTTOM
)
431 bmp_x
= button_rect
.x
+
432 (button_rect
.width
/2) -
433 (item
.GetBitmap().GetWidth()/2);
434 bmp_y
= button_rect
.y
+
435 ((button_rect
.height
-text_height
)/2) -
436 (item
.GetBitmap().GetHeight()/2);
438 text_x
= rect
.x
+ (rect
.width
/2) - (text_width
/2) + 1;
439 text_y
= rect
.y
+ rect
.height
- text_height
- 1;
441 else if (m_text_orientation
== wxAUI_TBTOOL_TEXT_RIGHT
)
447 (item
.GetBitmap().GetHeight()/2);
449 text_x
= bmp_x
+ 3 + item
.GetBitmap().GetWidth();
456 if (item
.GetState() & wxAUI_BUTTON_STATE_PRESSED
)
458 dc
.SetPen(wxPen(m_highlight_colour
));
459 dc
.SetBrush(wxBrush(wxAuiStepColour(m_highlight_colour
, 140)));
460 dc
.DrawRectangle(button_rect
);
461 dc
.DrawRectangle(dropdown_rect
);
463 else if (item
.GetState() & wxAUI_BUTTON_STATE_HOVER
||
466 dc
.SetPen(wxPen(m_highlight_colour
));
467 dc
.SetBrush(wxBrush(wxAuiStepColour(m_highlight_colour
, 170)));
468 dc
.DrawRectangle(button_rect
);
469 dc
.DrawRectangle(dropdown_rect
);
474 if (item
.GetState() & wxAUI_BUTTON_STATE_DISABLED
)
476 bmp
= item
.GetDisabledBitmap();
477 dropbmp
= m_disabled_button_dropdown_bmp
;
481 bmp
= item
.GetBitmap();
482 dropbmp
= m_button_dropdown_bmp
;
488 dc
.DrawBitmap(bmp
, bmp_x
, bmp_y
, true);
489 dc
.DrawBitmap(dropbmp
, dropbmp_x
, dropbmp_y
, true);
491 // set the item's text color based on if it is disabled
492 dc
.SetTextForeground(*wxBLACK
);
493 if (item
.GetState() & wxAUI_BUTTON_STATE_DISABLED
)
494 dc
.SetTextForeground(DISABLED_TEXT_COLOR
);
496 if ( (m_flags
& wxAUI_TB_TEXT
) && !item
.GetLabel().empty() )
498 dc
.DrawText(item
.GetLabel(), text_x
, text_y
);
502 void wxAuiDefaultToolBarArt::DrawControlLabel(
504 wxWindow
* WXUNUSED(wnd
),
505 const wxAuiToolBarItem
& item
,
508 if (!(m_flags
& wxAUI_TB_TEXT
))
511 if (m_text_orientation
!= wxAUI_TBTOOL_TEXT_BOTTOM
)
514 int text_x
= 0, text_y
= 0;
515 int text_width
= 0, text_height
= 0;
520 if (m_flags
& wxAUI_TB_TEXT
)
522 dc
.GetTextExtent(wxT("ABCDHgj"), &tx
, &text_height
);
526 dc
.GetTextExtent(item
.GetLabel(), &text_width
, &ty
);
528 // don't draw the label if it is wider than the item width
529 if (text_width
> rect
.width
)
532 // set the label's text color
533 dc
.SetTextForeground(*wxBLACK
);
535 text_x
= rect
.x
+ (rect
.width
/2) - (text_width
/2) + 1;
536 text_y
= rect
.y
+ rect
.height
- text_height
- 1;
538 if ( (m_flags
& wxAUI_TB_TEXT
) && !item
.GetLabel().empty() )
540 dc
.DrawText(item
.GetLabel(), text_x
, text_y
);
544 wxSize
wxAuiDefaultToolBarArt::GetLabelSize(
546 wxWindow
* WXUNUSED(wnd
),
547 const wxAuiToolBarItem
& item
)
551 // get label's height
552 int width
= 0, height
= 0;
553 dc
.GetTextExtent(wxT("ABCDHgj"), &width
, &height
);
556 width
= item
.GetMinSize().GetWidth();
560 // no width specified, measure the text ourselves
561 width
= dc
.GetTextExtent(item
.GetLabel()).GetX();
564 return wxSize(width
, height
);
567 wxSize
wxAuiDefaultToolBarArt::GetToolSize(
569 wxWindow
* WXUNUSED(wnd
),
570 const wxAuiToolBarItem
& item
)
572 if (!item
.GetBitmap().IsOk() && !(m_flags
& wxAUI_TB_TEXT
))
573 return wxSize(16,16);
575 int width
= item
.GetBitmap().GetWidth();
576 int height
= item
.GetBitmap().GetHeight();
578 if (m_flags
& wxAUI_TB_TEXT
)
583 if (m_text_orientation
== wxAUI_TBTOOL_TEXT_BOTTOM
)
585 dc
.GetTextExtent(wxT("ABCDHgj"), &tx
, &ty
);
588 if ( !item
.GetLabel().empty() )
590 dc
.GetTextExtent(item
.GetLabel(), &tx
, &ty
);
591 width
= wxMax(width
, tx
+6);
594 else if ( m_text_orientation
== wxAUI_TBTOOL_TEXT_RIGHT
&&
595 !item
.GetLabel().empty() )
597 width
+= 3; // space between left border and bitmap
598 width
+= 3; // space between bitmap and text
600 if ( !item
.GetLabel().empty() )
602 dc
.GetTextExtent(item
.GetLabel(), &tx
, &ty
);
604 height
= wxMax(height
, ty
);
609 // if the tool has a dropdown button, add it to the width
610 if (item
.HasDropDown())
611 width
+= (BUTTON_DROPDOWN_WIDTH
+4);
613 return wxSize(width
, height
);
616 void wxAuiDefaultToolBarArt::DrawSeparator(
618 wxWindow
* WXUNUSED(wnd
),
621 bool horizontal
= true;
622 if (m_flags
& wxAUI_TB_VERTICAL
)
629 rect
.x
+= (rect
.width
/2);
631 int new_height
= (rect
.height
*3)/4;
632 rect
.y
+= (rect
.height
/2) - (new_height
/2);
633 rect
.height
= new_height
;
637 rect
.y
+= (rect
.height
/2);
639 int new_width
= (rect
.width
*3)/4;
640 rect
.x
+= (rect
.width
/2) - (new_width
/2);
641 rect
.width
= new_width
;
644 wxColour start_colour
= wxAuiStepColour(m_base_colour
, 80);
645 wxColour end_colour
= wxAuiStepColour(m_base_colour
, 80);
646 dc
.GradientFillLinear(rect
, start_colour
, end_colour
, horizontal
? wxSOUTH
: wxEAST
);
649 void wxAuiDefaultToolBarArt::DrawGripper(wxDC
& dc
,
650 wxWindow
* WXUNUSED(wnd
),
658 if (m_flags
& wxAUI_TB_VERTICAL
)
660 x
= rect
.x
+ (i
*4) + 5;
662 if (x
> rect
.GetWidth()-5)
668 y
= rect
.y
+ (i
*4) + 5;
669 if (y
> rect
.GetHeight()-5)
673 dc
.SetPen(m_gripper_pen1
);
675 dc
.SetPen(m_gripper_pen2
);
676 dc
.DrawPoint(x
, y
+1);
677 dc
.DrawPoint(x
+1, y
);
678 dc
.SetPen(m_gripper_pen3
);
679 dc
.DrawPoint(x
+2, y
+1);
680 dc
.DrawPoint(x
+2, y
+2);
681 dc
.DrawPoint(x
+1, y
+2);
688 void wxAuiDefaultToolBarArt::DrawOverflowButton(wxDC
& dc
,
693 if (state
& wxAUI_BUTTON_STATE_HOVER
||
694 state
& wxAUI_BUTTON_STATE_PRESSED
)
696 wxRect cli_rect
= wnd
->GetClientRect();
697 wxColor light_gray_bg
= wxAuiStepColour(m_highlight_colour
, 170);
699 if (m_flags
& wxAUI_TB_VERTICAL
)
701 dc
.SetPen(wxPen(m_highlight_colour
));
702 dc
.DrawLine(rect
.x
, rect
.y
, rect
.x
+rect
.width
, rect
.y
);
703 dc
.SetPen(wxPen(light_gray_bg
));
704 dc
.SetBrush(wxBrush(light_gray_bg
));
705 dc
.DrawRectangle(rect
.x
, rect
.y
+1, rect
.width
, rect
.height
);
709 dc
.SetPen(wxPen(m_highlight_colour
));
710 dc
.DrawLine(rect
.x
, rect
.y
, rect
.x
, rect
.y
+rect
.height
);
711 dc
.SetPen(wxPen(light_gray_bg
));
712 dc
.SetBrush(wxBrush(light_gray_bg
));
713 dc
.DrawRectangle(rect
.x
+1, rect
.y
, rect
.width
, rect
.height
);
717 int x
= rect
.x
+1+(rect
.width
-m_overflow_bmp
.GetWidth())/2;
718 int y
= rect
.y
+1+(rect
.height
-m_overflow_bmp
.GetHeight())/2;
719 dc
.DrawBitmap(m_overflow_bmp
, x
, y
, true);
722 int wxAuiDefaultToolBarArt::GetElementSize(int element_id
)
726 case wxAUI_TBART_SEPARATOR_SIZE
: return m_separator_size
;
727 case wxAUI_TBART_GRIPPER_SIZE
: return m_gripper_size
;
728 case wxAUI_TBART_OVERFLOW_SIZE
: return m_overflow_size
;
733 void wxAuiDefaultToolBarArt::SetElementSize(int element_id
, int size
)
737 case wxAUI_TBART_SEPARATOR_SIZE
: m_separator_size
= size
; break;
738 case wxAUI_TBART_GRIPPER_SIZE
: m_gripper_size
= size
; break;
739 case wxAUI_TBART_OVERFLOW_SIZE
: m_overflow_size
= size
; break;
743 int wxAuiDefaultToolBarArt::ShowDropDown(wxWindow
* wnd
,
744 const wxAuiToolBarItemArray
& items
)
748 size_t items_added
= 0;
750 size_t i
, count
= items
.GetCount();
751 for (i
= 0; i
< count
; ++i
)
753 wxAuiToolBarItem
& item
= items
.Item(i
);
755 if (item
.GetKind() == wxITEM_NORMAL
)
757 wxString text
= item
.GetShortHelp();
759 text
= item
.GetLabel();
764 wxMenuItem
* m
= new wxMenuItem(&menuPopup
, item
.GetId(), text
, item
.GetShortHelp());
766 m
->SetBitmap(item
.GetBitmap());
770 else if (item
.GetKind() == wxITEM_SEPARATOR
)
773 menuPopup
.AppendSeparator();
777 // find out where to put the popup menu of window items
778 wxPoint pt
= ::wxGetMousePosition();
779 pt
= wnd
->ScreenToClient(pt
);
781 // find out the screen coordinate at the bottom of the tab ctrl
782 wxRect cli_rect
= wnd
->GetClientRect();
783 pt
.y
= cli_rect
.y
+ cli_rect
.height
;
785 ToolbarCommandCapture
* cc
= new ToolbarCommandCapture
;
786 wnd
->PushEventHandler(cc
);
787 wnd
->PopupMenu(&menuPopup
, pt
);
788 int command
= cc
->GetCommandId();
789 wnd
->PopEventHandler(true);
797 BEGIN_EVENT_TABLE(wxAuiToolBar
, wxControl
)
798 EVT_SIZE(wxAuiToolBar::OnSize
)
799 EVT_IDLE(wxAuiToolBar::OnIdle
)
800 EVT_ERASE_BACKGROUND(wxAuiToolBar::OnEraseBackground
)
801 EVT_PAINT(wxAuiToolBar::OnPaint
)
802 EVT_LEFT_DOWN(wxAuiToolBar::OnLeftDown
)
803 EVT_LEFT_DCLICK(wxAuiToolBar::OnLeftDown
)
804 EVT_LEFT_UP(wxAuiToolBar::OnLeftUp
)
805 EVT_RIGHT_DOWN(wxAuiToolBar::OnRightDown
)
806 EVT_RIGHT_DCLICK(wxAuiToolBar::OnRightDown
)
807 EVT_RIGHT_UP(wxAuiToolBar::OnRightUp
)
808 EVT_MIDDLE_DOWN(wxAuiToolBar::OnMiddleDown
)
809 EVT_MIDDLE_DCLICK(wxAuiToolBar::OnMiddleDown
)
810 EVT_MIDDLE_UP(wxAuiToolBar::OnMiddleUp
)
811 EVT_MOTION(wxAuiToolBar::OnMotion
)
812 EVT_LEAVE_WINDOW(wxAuiToolBar::OnLeaveWindow
)
813 EVT_SET_CURSOR(wxAuiToolBar::OnSetCursor
)
817 wxAuiToolBar::wxAuiToolBar(wxWindow
* parent
,
819 const wxPoint
& position
,
826 style
| wxBORDER_NONE
)
828 m_sizer
= new wxBoxSizer(wxHORIZONTAL
);
830 m_button_height
= -1;
831 m_sizer_element_count
= 0;
832 m_action_pos
= wxPoint(-1,-1);
833 m_action_item
= NULL
;
835 m_art
= new wxAuiDefaultToolBarArt
;
837 m_tool_border_padding
= 3;
838 m_tool_text_orientation
= wxAUI_TBTOOL_TEXT_BOTTOM
;
839 m_gripper_sizer_item
= NULL
;
840 m_overflow_sizer_item
= NULL
;
842 m_style
= style
| wxBORDER_NONE
;
843 m_gripper_visible
= (m_style
& wxAUI_TB_GRIPPER
) ? true : false;
844 m_overflow_visible
= (m_style
& wxAUI_TB_OVERFLOW
) ? true : false;
845 m_overflow_state
= 0;
846 SetMargins(5, 5, 2, 2);
847 SetFont(*wxNORMAL_FONT
);
848 m_art
->SetFlags((unsigned int)m_style
);
849 SetExtraStyle(wxWS_EX_PROCESS_IDLE
);
850 if (style
& wxAUI_TB_HORZ_LAYOUT
)
851 SetToolTextOrientation(wxAUI_TBTOOL_TEXT_RIGHT
);
855 wxAuiToolBar::~wxAuiToolBar()
861 void wxAuiToolBar::SetWindowStyleFlag(long style
)
863 wxControl::SetWindowStyleFlag(style
);
869 m_art
->SetFlags((unsigned int)m_style
);
872 if (m_style
& wxAUI_TB_GRIPPER
)
873 m_gripper_visible
= true;
875 m_gripper_visible
= false;
878 if (m_style
& wxAUI_TB_OVERFLOW
)
879 m_overflow_visible
= true;
881 m_overflow_visible
= false;
883 if (style
& wxAUI_TB_HORZ_LAYOUT
)
884 SetToolTextOrientation(wxAUI_TBTOOL_TEXT_RIGHT
);
886 SetToolTextOrientation(wxAUI_TBTOOL_TEXT_BOTTOM
);
889 long wxAuiToolBar::GetWindowStyleFlag() const
894 void wxAuiToolBar::SetArtProvider(wxAuiToolBarArt
* art
)
902 m_art
->SetFlags((unsigned int)m_style
);
903 m_art
->SetTextOrientation(m_tool_text_orientation
);
907 wxAuiToolBarArt
* wxAuiToolBar::GetArtProvider() const
915 wxAuiToolBarItem
* wxAuiToolBar::AddTool(int tool_id
,
916 const wxString
& label
,
917 const wxBitmap
& bitmap
,
918 const wxString
& short_help_string
,
921 return AddTool(tool_id
,
932 wxAuiToolBarItem
* wxAuiToolBar::AddTool(int tool_id
,
933 const wxString
& label
,
934 const wxBitmap
& bitmap
,
935 const wxBitmap
& disabled_bitmap
,
937 const wxString
& short_help_string
,
938 const wxString
& long_help_string
,
939 wxObject
* WXUNUSED(client_data
))
941 wxAuiToolBarItem item
;
944 item
.bitmap
= bitmap
;
945 item
.disabled_bitmap
= disabled_bitmap
;
946 item
.short_help
= short_help_string
;
947 item
.long_help
= long_help_string
;
949 item
.dropdown
= false;
950 item
.spacer_pixels
= 0;
955 item
.sizer_item
= NULL
;
956 item
.min_size
= wxDefaultSize
;
960 if (item
.id
== wxID_ANY
)
963 if (!item
.disabled_bitmap
.IsOk())
965 // no disabled bitmap specified, we need to make one
966 if (item
.bitmap
.IsOk())
968 //wxImage img = item.bitmap.ConvertToImage();
969 //wxImage grey_version = img.ConvertToGreyscale();
970 //item.disabled_bitmap = wxBitmap(grey_version);
971 item
.disabled_bitmap
= MakeDisabledBitmap(item
.bitmap
);
975 return &m_items
.Last();
978 wxAuiToolBarItem
* wxAuiToolBar::AddControl(wxControl
* control
,
979 const wxString
& label
)
981 wxAuiToolBarItem item
;
982 item
.window
= (wxWindow
*)control
;
984 item
.bitmap
= wxNullBitmap
;
985 item
.disabled_bitmap
= wxNullBitmap
;
987 item
.dropdown
= false;
988 item
.spacer_pixels
= 0;
989 item
.id
= control
->GetId();
992 item
.kind
= wxITEM_CONTROL
;
993 item
.sizer_item
= NULL
;
994 item
.min_size
= control
->GetEffectiveMinSize();
999 return &m_items
.Last();
1002 wxAuiToolBarItem
* wxAuiToolBar::AddLabel(int tool_id
,
1003 const wxString
& label
,
1006 wxSize min_size
= wxDefaultSize
;
1010 wxAuiToolBarItem item
;
1013 item
.bitmap
= wxNullBitmap
;
1014 item
.disabled_bitmap
= wxNullBitmap
;
1016 item
.dropdown
= false;
1017 item
.spacer_pixels
= 0;
1020 item
.proportion
= 0;
1021 item
.kind
= wxITEM_LABEL
;
1022 item
.sizer_item
= NULL
;
1023 item
.min_size
= min_size
;
1025 item
.sticky
= false;
1027 if (item
.id
== wxID_ANY
)
1028 item
.id
= wxNewId();
1031 return &m_items
.Last();
1034 wxAuiToolBarItem
* wxAuiToolBar::AddSeparator()
1036 wxAuiToolBarItem item
;
1038 item
.label
= wxEmptyString
;
1039 item
.bitmap
= wxNullBitmap
;
1040 item
.disabled_bitmap
= wxNullBitmap
;
1042 item
.dropdown
= false;
1045 item
.proportion
= 0;
1046 item
.kind
= wxITEM_SEPARATOR
;
1047 item
.sizer_item
= NULL
;
1048 item
.min_size
= wxDefaultSize
;
1050 item
.sticky
= false;
1053 return &m_items
.Last();
1056 wxAuiToolBarItem
* wxAuiToolBar::AddSpacer(int pixels
)
1058 wxAuiToolBarItem item
;
1060 item
.label
= wxEmptyString
;
1061 item
.bitmap
= wxNullBitmap
;
1062 item
.disabled_bitmap
= wxNullBitmap
;
1064 item
.dropdown
= false;
1065 item
.spacer_pixels
= pixels
;
1068 item
.proportion
= 0;
1069 item
.kind
= wxITEM_SPACER
;
1070 item
.sizer_item
= NULL
;
1071 item
.min_size
= wxDefaultSize
;
1073 item
.sticky
= false;
1076 return &m_items
.Last();
1079 wxAuiToolBarItem
* wxAuiToolBar::AddStretchSpacer(int proportion
)
1081 wxAuiToolBarItem item
;
1083 item
.label
= wxEmptyString
;
1084 item
.bitmap
= wxNullBitmap
;
1085 item
.disabled_bitmap
= wxNullBitmap
;
1087 item
.dropdown
= false;
1088 item
.spacer_pixels
= 0;
1091 item
.proportion
= proportion
;
1092 item
.kind
= wxITEM_SPACER
;
1093 item
.sizer_item
= NULL
;
1094 item
.min_size
= wxDefaultSize
;
1096 item
.sticky
= false;
1099 return &m_items
.Last();
1102 void wxAuiToolBar::Clear()
1105 m_sizer_element_count
= 0;
1108 bool wxAuiToolBar::DeleteTool(int tool_id
)
1110 int idx
= GetToolIndex(tool_id
);
1111 if (idx
>= 0 && idx
< (int)m_items
.GetCount())
1113 m_items
.RemoveAt(idx
);
1121 bool wxAuiToolBar::DeleteByIndex(int idx
)
1123 if (idx
>= 0 && idx
< (int)m_items
.GetCount())
1125 m_items
.RemoveAt(idx
);
1134 wxControl
* wxAuiToolBar::FindControl(int id
)
1136 wxWindow
* wnd
= FindWindow(id
);
1137 return (wxControl
*)wnd
;
1140 wxAuiToolBarItem
* wxAuiToolBar::FindTool(int tool_id
) const
1143 for (i
= 0, count
= m_items
.GetCount(); i
< count
; ++i
)
1145 wxAuiToolBarItem
& item
= m_items
.Item(i
);
1146 if (item
.id
== tool_id
)
1153 wxAuiToolBarItem
* wxAuiToolBar::FindToolByPosition(wxCoord x
, wxCoord y
) const
1156 for (i
= 0, count
= m_items
.GetCount(); i
< count
; ++i
)
1158 wxAuiToolBarItem
& item
= m_items
.Item(i
);
1160 if (!item
.sizer_item
)
1163 wxRect rect
= item
.sizer_item
->GetRect();
1164 if (rect
.Contains(x
,y
))
1166 // if the item doesn't fit on the toolbar, return NULL
1167 if (!GetToolFitsByIndex(i
))
1177 wxAuiToolBarItem
* wxAuiToolBar::FindToolByPositionWithPacking(wxCoord x
, wxCoord y
) const
1180 for (i
= 0, count
= m_items
.GetCount(); i
< count
; ++i
)
1182 wxAuiToolBarItem
& item
= m_items
.Item(i
);
1184 if (!item
.sizer_item
)
1187 wxRect rect
= item
.sizer_item
->GetRect();
1189 // apply tool packing
1191 rect
.width
+= m_tool_packing
;
1193 if (rect
.Contains(x
,y
))
1195 // if the item doesn't fit on the toolbar, return NULL
1196 if (!GetToolFitsByIndex(i
))
1206 wxAuiToolBarItem
* wxAuiToolBar::FindToolByIndex(int idx
) const
1211 if (idx
>= (int)m_items
.size())
1214 return &(m_items
[idx
]);
1217 void wxAuiToolBar::SetToolBitmapSize(const wxSize
& WXUNUSED(size
))
1219 // TODO: wxToolBar compatibility
1222 wxSize
wxAuiToolBar::GetToolBitmapSize() const
1224 // TODO: wxToolBar compatibility
1225 return wxSize(16,15);
1228 void wxAuiToolBar::SetToolProportion(int tool_id
, int proportion
)
1230 wxAuiToolBarItem
* item
= FindTool(tool_id
);
1234 item
->proportion
= proportion
;
1237 int wxAuiToolBar::GetToolProportion(int tool_id
) const
1239 wxAuiToolBarItem
* item
= FindTool(tool_id
);
1243 return item
->proportion
;
1246 void wxAuiToolBar::SetToolSeparation(int separation
)
1249 m_art
->SetElementSize(wxAUI_TBART_SEPARATOR_SIZE
, separation
);
1252 int wxAuiToolBar::GetToolSeparation() const
1255 return m_art
->GetElementSize(wxAUI_TBART_SEPARATOR_SIZE
);
1261 void wxAuiToolBar::SetToolDropDown(int tool_id
, bool dropdown
)
1263 wxAuiToolBarItem
* item
= FindTool(tool_id
);
1267 item
->dropdown
= dropdown
;
1270 bool wxAuiToolBar::GetToolDropDown(int tool_id
) const
1272 wxAuiToolBarItem
* item
= FindTool(tool_id
);
1276 return item
->dropdown
;
1279 void wxAuiToolBar::SetToolSticky(int tool_id
, bool sticky
)
1281 // ignore separators
1285 wxAuiToolBarItem
* item
= FindTool(tool_id
);
1289 if (item
->sticky
== sticky
)
1292 item
->sticky
= sticky
;
1298 bool wxAuiToolBar::GetToolSticky(int tool_id
) const
1300 wxAuiToolBarItem
* item
= FindTool(tool_id
);
1304 return item
->sticky
;
1310 void wxAuiToolBar::SetToolBorderPadding(int padding
)
1312 m_tool_border_padding
= padding
;
1315 int wxAuiToolBar::GetToolBorderPadding() const
1317 return m_tool_border_padding
;
1320 void wxAuiToolBar::SetToolTextOrientation(int orientation
)
1322 m_tool_text_orientation
= orientation
;
1326 m_art
->SetTextOrientation(orientation
);
1330 int wxAuiToolBar::GetToolTextOrientation() const
1332 return m_tool_text_orientation
;
1335 void wxAuiToolBar::SetToolPacking(int packing
)
1337 m_tool_packing
= packing
;
1340 int wxAuiToolBar::GetToolPacking() const
1342 return m_tool_packing
;
1346 void wxAuiToolBar::SetOrientation(int WXUNUSED(orientation
))
1350 void wxAuiToolBar::SetMargins(int left
, int right
, int top
, int bottom
)
1353 m_left_padding
= left
;
1355 m_right_padding
= right
;
1357 m_top_padding
= top
;
1359 m_bottom_padding
= bottom
;
1362 bool wxAuiToolBar::GetGripperVisible() const
1364 return m_gripper_visible
;
1367 void wxAuiToolBar::SetGripperVisible(bool visible
)
1369 m_gripper_visible
= visible
;
1371 m_style
|= wxAUI_TB_GRIPPER
;
1373 m_style
&= ~wxAUI_TB_GRIPPER
;
1379 bool wxAuiToolBar::GetOverflowVisible() const
1381 return m_overflow_visible
;
1384 void wxAuiToolBar::SetOverflowVisible(bool visible
)
1386 m_overflow_visible
= visible
;
1388 m_style
|= wxAUI_TB_OVERFLOW
;
1390 m_style
&= ~wxAUI_TB_OVERFLOW
;
1394 bool wxAuiToolBar::SetFont(const wxFont
& font
)
1396 bool res
= wxWindow::SetFont(font
);
1400 m_art
->SetFont(font
);
1407 void wxAuiToolBar::SetHoverItem(wxAuiToolBarItem
* pitem
)
1409 wxAuiToolBarItem
* former_hover
= NULL
;
1412 for (i
= 0, count
= m_items
.GetCount(); i
< count
; ++i
)
1414 wxAuiToolBarItem
& item
= m_items
.Item(i
);
1415 if (item
.state
& wxAUI_BUTTON_STATE_HOVER
)
1416 former_hover
= &item
;
1417 item
.state
&= ~wxAUI_BUTTON_STATE_HOVER
;
1422 pitem
->state
|= wxAUI_BUTTON_STATE_HOVER
;
1425 if (former_hover
!= pitem
)
1432 void wxAuiToolBar::SetPressedItem(wxAuiToolBarItem
* pitem
)
1434 wxAuiToolBarItem
* former_item
= NULL
;
1437 for (i
= 0, count
= m_items
.GetCount(); i
< count
; ++i
)
1439 wxAuiToolBarItem
& item
= m_items
.Item(i
);
1440 if (item
.state
& wxAUI_BUTTON_STATE_PRESSED
)
1441 former_item
= &item
;
1442 item
.state
&= ~wxAUI_BUTTON_STATE_PRESSED
;
1447 pitem
->state
&= ~wxAUI_BUTTON_STATE_HOVER
;
1448 pitem
->state
|= wxAUI_BUTTON_STATE_PRESSED
;
1451 if (former_item
!= pitem
)
1458 void wxAuiToolBar::RefreshOverflowState()
1460 if (!m_overflow_sizer_item
)
1462 m_overflow_state
= 0;
1466 int overflow_state
= 0;
1468 wxRect overflow_rect
= GetOverflowRect();
1471 // find out the mouse's current position
1472 wxPoint pt
= ::wxGetMousePosition();
1473 pt
= this->ScreenToClient(pt
);
1475 // find out if the mouse cursor is inside the dropdown rectangle
1476 if (overflow_rect
.Contains(pt
.x
, pt
.y
))
1478 if (::wxGetMouseState().LeftIsDown())
1479 overflow_state
= wxAUI_BUTTON_STATE_PRESSED
;
1481 overflow_state
= wxAUI_BUTTON_STATE_HOVER
;
1484 if (overflow_state
!= m_overflow_state
)
1486 m_overflow_state
= overflow_state
;
1491 m_overflow_state
= overflow_state
;
1494 void wxAuiToolBar::ToggleTool(int tool_id
, bool state
)
1496 wxAuiToolBarItem
* tool
= FindTool(tool_id
);
1498 if (tool
&& (tool
->kind
== wxITEM_CHECK
|| tool
->kind
== wxITEM_RADIO
))
1500 if (tool
->kind
== wxITEM_RADIO
)
1503 idx
= GetToolIndex(tool_id
);
1504 count
= (int)m_items
.GetCount();
1506 if (idx
>= 0 && idx
< count
)
1508 for (i
= idx
; i
< count
; ++i
)
1510 if (m_items
[i
].kind
!= wxITEM_RADIO
)
1512 m_items
[i
].state
&= ~wxAUI_BUTTON_STATE_CHECKED
;
1514 for (i
= idx
; i
> 0; i
--)
1516 if (m_items
[i
].kind
!= wxITEM_RADIO
)
1518 m_items
[i
].state
&= ~wxAUI_BUTTON_STATE_CHECKED
;
1522 tool
->state
|= wxAUI_BUTTON_STATE_CHECKED
;
1524 else if (tool
->kind
== wxITEM_CHECK
)
1527 tool
->state
|= wxAUI_BUTTON_STATE_CHECKED
;
1529 tool
->state
&= ~wxAUI_BUTTON_STATE_CHECKED
;
1534 bool wxAuiToolBar::GetToolToggled(int tool_id
) const
1536 wxAuiToolBarItem
* tool
= FindTool(tool_id
);
1540 if ( (tool
->kind
!= wxITEM_CHECK
) && (tool
->kind
!= wxITEM_RADIO
) )
1543 return (tool
->state
& wxAUI_BUTTON_STATE_CHECKED
) ? true : false;
1549 void wxAuiToolBar::EnableTool(int tool_id
, bool state
)
1551 wxAuiToolBarItem
* tool
= FindTool(tool_id
);
1556 tool
->state
&= ~wxAUI_BUTTON_STATE_DISABLED
;
1558 tool
->state
|= wxAUI_BUTTON_STATE_DISABLED
;
1562 bool wxAuiToolBar::GetToolEnabled(int tool_id
) const
1564 wxAuiToolBarItem
* tool
= FindTool(tool_id
);
1567 return (tool
->state
& wxAUI_BUTTON_STATE_DISABLED
) ? false : true;
1572 wxString
wxAuiToolBar::GetToolLabel(int tool_id
) const
1574 wxAuiToolBarItem
* tool
= FindTool(tool_id
);
1575 wxASSERT_MSG(tool
, wxT("can't find tool in toolbar item array"));
1577 return wxEmptyString
;
1582 void wxAuiToolBar::SetToolLabel(int tool_id
, const wxString
& label
)
1584 wxAuiToolBarItem
* tool
= FindTool(tool_id
);
1587 tool
->label
= label
;
1591 wxBitmap
wxAuiToolBar::GetToolBitmap(int tool_id
) const
1593 wxAuiToolBarItem
* tool
= FindTool(tool_id
);
1594 wxASSERT_MSG(tool
, wxT("can't find tool in toolbar item array"));
1596 return wxNullBitmap
;
1598 return tool
->bitmap
;
1601 void wxAuiToolBar::SetToolBitmap(int tool_id
, const wxBitmap
& bitmap
)
1603 wxAuiToolBarItem
* tool
= FindTool(tool_id
);
1606 tool
->bitmap
= bitmap
;
1610 wxString
wxAuiToolBar::GetToolShortHelp(int tool_id
) const
1612 wxAuiToolBarItem
* tool
= FindTool(tool_id
);
1613 wxASSERT_MSG(tool
, wxT("can't find tool in toolbar item array"));
1615 return wxEmptyString
;
1617 return tool
->short_help
;
1620 void wxAuiToolBar::SetToolShortHelp(int tool_id
, const wxString
& help_string
)
1622 wxAuiToolBarItem
* tool
= FindTool(tool_id
);
1625 tool
->short_help
= help_string
;
1629 wxString
wxAuiToolBar::GetToolLongHelp(int tool_id
) const
1631 wxAuiToolBarItem
* tool
= FindTool(tool_id
);
1632 wxASSERT_MSG(tool
, wxT("can't find tool in toolbar item array"));
1634 return wxEmptyString
;
1636 return tool
->long_help
;
1639 void wxAuiToolBar::SetToolLongHelp(int tool_id
, const wxString
& help_string
)
1641 wxAuiToolBarItem
* tool
= FindTool(tool_id
);
1644 tool
->long_help
= help_string
;
1648 void wxAuiToolBar::SetCustomOverflowItems(const wxAuiToolBarItemArray
& prepend
,
1649 const wxAuiToolBarItemArray
& append
)
1651 m_custom_overflow_prepend
= prepend
;
1652 m_custom_overflow_append
= append
;
1656 size_t wxAuiToolBar::GetToolCount() const
1658 return m_items
.size();
1661 int wxAuiToolBar::GetToolIndex(int tool_id
) const
1663 // this will prevent us from returning the index of the
1664 // first separator in the toolbar since its id is equal to -1
1668 size_t i
, count
= m_items
.GetCount();
1669 for (i
= 0; i
< count
; ++i
)
1671 wxAuiToolBarItem
& item
= m_items
.Item(i
);
1672 if (item
.id
== tool_id
)
1679 bool wxAuiToolBar::GetToolFitsByIndex(int tool_idx
) const
1681 if (tool_idx
< 0 || tool_idx
>= (int)m_items
.GetCount())
1684 if (!m_items
[tool_idx
].sizer_item
)
1688 GetClientSize(&cli_w
, &cli_h
);
1690 wxRect rect
= m_items
[tool_idx
].sizer_item
->GetRect();
1692 if (m_style
& wxAUI_TB_VERTICAL
)
1694 // take the dropdown size into account
1695 if (m_overflow_visible
)
1696 cli_h
-= m_overflow_sizer_item
->GetSize().y
;
1698 if (rect
.y
+rect
.height
< cli_h
)
1703 // take the dropdown size into account
1704 if (m_overflow_visible
)
1705 cli_w
-= m_overflow_sizer_item
->GetSize().x
;
1707 if (rect
.x
+rect
.width
< cli_w
)
1715 bool wxAuiToolBar::GetToolFits(int tool_id
) const
1717 return GetToolFitsByIndex(GetToolIndex(tool_id
));
1720 wxRect
wxAuiToolBar::GetToolRect(int tool_id
) const
1722 wxAuiToolBarItem
* tool
= FindTool(tool_id
);
1723 if (tool
&& tool
->sizer_item
)
1725 return tool
->sizer_item
->GetRect();
1731 bool wxAuiToolBar::GetToolBarFits() const
1733 if (m_items
.GetCount() == 0)
1735 // empty toolbar always 'fits'
1739 // entire toolbar content fits if the last tool fits
1740 return GetToolFitsByIndex(m_items
.GetCount() - 1);
1743 bool wxAuiToolBar::Realize()
1745 wxClientDC
dc(this);
1749 bool horizontal
= true;
1750 if (m_style
& wxAUI_TB_VERTICAL
)
1754 // create the new sizer to add toolbar elements to
1755 wxBoxSizer
* sizer
= new wxBoxSizer(horizontal
? wxHORIZONTAL
: wxVERTICAL
);
1758 int separator_size
= m_art
->GetElementSize(wxAUI_TBART_SEPARATOR_SIZE
);
1759 int gripper_size
= m_art
->GetElementSize(wxAUI_TBART_GRIPPER_SIZE
);
1760 if (gripper_size
> 0 && m_gripper_visible
)
1763 m_gripper_sizer_item
= sizer
->Add(gripper_size
, 1, 0, wxEXPAND
);
1765 m_gripper_sizer_item
= sizer
->Add(1, gripper_size
, 0, wxEXPAND
);
1769 m_gripper_sizer_item
= NULL
;
1772 // add "left" padding
1773 if (m_left_padding
> 0)
1776 sizer
->Add(m_left_padding
, 1);
1778 sizer
->Add(1, m_left_padding
);
1782 for (i
= 0, count
= m_items
.GetCount(); i
< count
; ++i
)
1784 wxAuiToolBarItem
& item
= m_items
.Item(i
);
1785 wxSizerItem
* sizer_item
= NULL
;
1791 wxSize size
= m_art
->GetLabelSize(dc
, this, item
);
1792 sizer_item
= sizer
->Add(size
.x
+ (m_tool_border_padding
*2),
1793 size
.y
+ (m_tool_border_padding
*2),
1798 sizer
->AddSpacer(m_tool_packing
);
1808 wxSize size
= m_art
->GetToolSize(dc
, this, item
);
1809 sizer_item
= sizer
->Add(size
.x
+ (m_tool_border_padding
*2),
1810 size
.y
+ (m_tool_border_padding
*2),
1816 sizer
->AddSpacer(m_tool_packing
);
1822 case wxITEM_SEPARATOR
:
1825 sizer_item
= sizer
->Add(separator_size
, 1, 0, wxEXPAND
);
1827 sizer_item
= sizer
->Add(1, separator_size
, 0, wxEXPAND
);
1832 sizer
->AddSpacer(m_tool_packing
);
1839 if (item
.proportion
> 0)
1840 sizer_item
= sizer
->AddStretchSpacer(item
.proportion
);
1842 sizer_item
= sizer
->Add(item
.spacer_pixels
, 1);
1845 case wxITEM_CONTROL
:
1847 //sizer_item = sizer->Add(item.window, item.proportion, wxEXPAND);
1848 wxSizerItem
* ctrl_sizer_item
;
1850 wxBoxSizer
* vert_sizer
= new wxBoxSizer(wxVERTICAL
);
1851 vert_sizer
->AddStretchSpacer(1);
1852 ctrl_sizer_item
= vert_sizer
->Add(item
.window
, 0, wxEXPAND
);
1853 vert_sizer
->AddStretchSpacer(1);
1854 if ( (m_style
& wxAUI_TB_TEXT
) &&
1855 m_tool_text_orientation
== wxAUI_TBTOOL_TEXT_BOTTOM
&&
1856 !item
.GetLabel().empty() )
1858 wxSize s
= GetLabelSize(item
.GetLabel());
1859 vert_sizer
->Add(1, s
.y
);
1863 sizer_item
= sizer
->Add(vert_sizer
, item
.proportion
, wxEXPAND
);
1865 wxSize min_size
= item
.min_size
;
1868 // proportional items will disappear from the toolbar if
1869 // their min width is not set to something really small
1870 if (item
.proportion
!= 0)
1875 if (min_size
.IsFullySpecified())
1877 sizer_item
->SetMinSize(min_size
);
1878 ctrl_sizer_item
->SetMinSize(min_size
);
1884 sizer
->AddSpacer(m_tool_packing
);
1889 item
.sizer_item
= sizer_item
;
1892 // add "right" padding
1893 if (m_right_padding
> 0)
1896 sizer
->Add(m_right_padding
, 1);
1898 sizer
->Add(1, m_right_padding
);
1901 // add drop down area
1902 m_overflow_sizer_item
= NULL
;
1904 if (m_style
& wxAUI_TB_OVERFLOW
)
1906 int overflow_size
= m_art
->GetElementSize(wxAUI_TBART_OVERFLOW_SIZE
);
1907 if (overflow_size
> 0 && m_overflow_visible
)
1910 m_overflow_sizer_item
= sizer
->Add(overflow_size
, 1, 0, wxEXPAND
);
1912 m_overflow_sizer_item
= sizer
->Add(1, overflow_size
, 0, wxEXPAND
);
1916 m_overflow_sizer_item
= NULL
;
1921 // the outside sizer helps us apply the "top" and "bottom" padding
1922 wxBoxSizer
* outside_sizer
= new wxBoxSizer(horizontal
? wxVERTICAL
: wxHORIZONTAL
);
1924 // add "top" padding
1925 if (m_top_padding
> 0)
1928 outside_sizer
->Add(1, m_top_padding
);
1930 outside_sizer
->Add(m_top_padding
, 1);
1933 // add the sizer that contains all of the toolbar elements
1934 outside_sizer
->Add(sizer
, 1, wxEXPAND
);
1936 // add "bottom" padding
1937 if (m_bottom_padding
> 0)
1940 outside_sizer
->Add(1, m_bottom_padding
);
1942 outside_sizer
->Add(m_bottom_padding
, 1);
1945 delete m_sizer
; // remove old sizer
1946 m_sizer
= outside_sizer
;
1948 // calculate the rock-bottom minimum size
1949 for (i
= 0, count
= m_items
.GetCount(); i
< count
; ++i
)
1951 wxAuiToolBarItem
& item
= m_items
.Item(i
);
1952 if (item
.sizer_item
&& item
.proportion
> 0 && item
.min_size
.IsFullySpecified())
1953 item
.sizer_item
->SetMinSize(0,0);
1956 m_absolute_min_size
= m_sizer
->GetMinSize();
1958 // reset the min sizes to what they were
1959 for (i
= 0, count
= m_items
.GetCount(); i
< count
; ++i
)
1961 wxAuiToolBarItem
& item
= m_items
.Item(i
);
1962 if (item
.sizer_item
&& item
.proportion
> 0 && item
.min_size
.IsFullySpecified())
1963 item
.sizer_item
->SetMinSize(item
.min_size
);
1967 wxSize size
= m_sizer
->GetMinSize();
1968 m_minWidth
= size
.x
;
1969 m_minHeight
= size
.y
;
1971 if ((m_style
& wxAUI_TB_NO_AUTORESIZE
) == 0)
1973 wxSize cur_size
= GetClientSize();
1974 wxSize new_size
= GetMinSize();
1975 if (new_size
!= cur_size
)
1977 SetClientSize(new_size
);
1981 m_sizer
->SetDimension(0, 0, cur_size
.x
, cur_size
.y
);
1986 wxSize cur_size
= GetClientSize();
1987 m_sizer
->SetDimension(0, 0, cur_size
.x
, cur_size
.y
);
1994 int wxAuiToolBar::GetOverflowState() const
1996 return m_overflow_state
;
1999 wxRect
wxAuiToolBar::GetOverflowRect() const
2001 wxRect
cli_rect(wxPoint(0,0), GetClientSize());
2002 wxRect overflow_rect
= m_overflow_sizer_item
->GetRect();
2003 int overflow_size
= m_art
->GetElementSize(wxAUI_TBART_OVERFLOW_SIZE
);
2005 if (m_style
& wxAUI_TB_VERTICAL
)
2007 overflow_rect
.y
= cli_rect
.height
- overflow_size
;
2008 overflow_rect
.x
= 0;
2009 overflow_rect
.width
= cli_rect
.width
;
2010 overflow_rect
.height
= overflow_size
;
2014 overflow_rect
.x
= cli_rect
.width
- overflow_size
;
2015 overflow_rect
.y
= 0;
2016 overflow_rect
.width
= overflow_size
;
2017 overflow_rect
.height
= cli_rect
.height
;
2020 return overflow_rect
;
2023 wxSize
wxAuiToolBar::GetLabelSize(const wxString
& label
)
2025 wxClientDC
dc(this);
2028 int text_width
= 0, text_height
= 0;
2032 // get the text height
2033 dc
.GetTextExtent(wxT("ABCDHgj"), &tx
, &text_height
);
2035 // get the text width
2036 dc
.GetTextExtent(label
, &text_width
, &ty
);
2038 return wxSize(text_width
, text_height
);
2042 void wxAuiToolBar::DoIdleUpdate()
2044 wxEvtHandler
* handler
= GetEventHandler();
2046 bool need_refresh
= false;
2049 for (i
= 0, count
= m_items
.GetCount(); i
< count
; ++i
)
2051 wxAuiToolBarItem
& item
= m_items
.Item(i
);
2056 wxUpdateUIEvent
evt(item
.id
);
2057 evt
.SetEventObject(this);
2059 if (handler
->ProcessEvent(evt
))
2061 if (evt
.GetSetEnabled())
2065 is_enabled
= item
.window
->IsEnabled();
2067 is_enabled
= (item
.state
& wxAUI_BUTTON_STATE_DISABLED
) ? false : true;
2069 bool new_enabled
= evt
.GetEnabled();
2070 if (new_enabled
!= is_enabled
)
2074 item
.window
->Enable(new_enabled
);
2079 item
.state
&= ~wxAUI_BUTTON_STATE_DISABLED
;
2081 item
.state
|= wxAUI_BUTTON_STATE_DISABLED
;
2083 need_refresh
= true;
2087 if (evt
.GetSetChecked())
2089 // make sure we aren't checking an item that can't be
2090 if (item
.kind
!= wxITEM_CHECK
&& item
.kind
!= wxITEM_RADIO
)
2093 bool is_checked
= (item
.state
& wxAUI_BUTTON_STATE_CHECKED
) ? true : false;
2094 bool new_checked
= evt
.GetChecked();
2096 if (new_checked
!= is_checked
)
2099 item
.state
|= wxAUI_BUTTON_STATE_CHECKED
;
2101 item
.state
&= ~wxAUI_BUTTON_STATE_CHECKED
;
2103 need_refresh
= true;
2118 void wxAuiToolBar::OnSize(wxSizeEvent
& WXUNUSED(evt
))
2121 GetClientSize(&x
, &y
);
2124 SetOrientation(wxHORIZONTAL
);
2126 SetOrientation(wxVERTICAL
);
2128 if (((x
>= y
) && m_absolute_min_size
.x
> x
) ||
2129 ((y
> x
) && m_absolute_min_size
.y
> y
))
2131 // hide all flexible items
2133 for (i
= 0, count
= m_items
.GetCount(); i
< count
; ++i
)
2135 wxAuiToolBarItem
& item
= m_items
.Item(i
);
2136 if (item
.sizer_item
&& item
.proportion
> 0 && item
.sizer_item
->IsShown())
2138 item
.sizer_item
->Show(false);
2139 item
.sizer_item
->SetProportion(0);
2145 // show all flexible items
2147 for (i
= 0, count
= m_items
.GetCount(); i
< count
; ++i
)
2149 wxAuiToolBarItem
& item
= m_items
.Item(i
);
2150 if (item
.sizer_item
&& item
.proportion
> 0 && !item
.sizer_item
->IsShown())
2152 item
.sizer_item
->Show(true);
2153 item
.sizer_item
->SetProportion(item
.proportion
);
2158 m_sizer
->SetDimension(0, 0, x
, y
);
2166 void wxAuiToolBar::DoSetSize(int x
,
2172 wxSize parent_size
= GetParent()->GetClientSize();
2173 if (x
+ width
> parent_size
.x
)
2174 width
= wxMax(0, parent_size
.x
- x
);
2175 if (y
+ height
> parent_size
.y
)
2176 height
= wxMax(0, parent_size
.y
- y
);
2178 wxWindow::DoSetSize(x
, y
, width
, height
, sizeFlags
);
2182 void wxAuiToolBar::OnIdle(wxIdleEvent
& evt
)
2188 void wxAuiToolBar::OnPaint(wxPaintEvent
& WXUNUSED(evt
))
2190 wxBufferedPaintDC
dc(this);
2191 wxRect
cli_rect(wxPoint(0,0), GetClientSize());
2194 bool horizontal
= true;
2195 if (m_style
& wxAUI_TB_VERTICAL
)
2199 m_art
->DrawBackground(dc
, this, cli_rect
);
2201 int gripper_size
= m_art
->GetElementSize(wxAUI_TBART_GRIPPER_SIZE
);
2202 int dropdown_size
= m_art
->GetElementSize(wxAUI_TBART_OVERFLOW_SIZE
);
2204 // paint the gripper
2205 if (gripper_size
> 0 && m_gripper_sizer_item
)
2207 wxRect gripper_rect
= m_gripper_sizer_item
->GetRect();
2209 gripper_rect
.width
= gripper_size
;
2211 gripper_rect
.height
= gripper_size
;
2212 m_art
->DrawGripper(dc
, this, gripper_rect
);
2215 // calculated how far we can draw items
2218 last_extent
= cli_rect
.width
;
2220 last_extent
= cli_rect
.height
;
2221 if (m_overflow_visible
)
2222 last_extent
-= dropdown_size
;
2224 // paint each individual tool
2225 size_t i
, count
= m_items
.GetCount();
2226 for (i
= 0; i
< count
; ++i
)
2228 wxAuiToolBarItem
& item
= m_items
.Item(i
);
2230 if (!item
.sizer_item
)
2233 wxRect item_rect
= item
.sizer_item
->GetRect();
2236 if ((horizontal
&& item_rect
.x
+ item_rect
.width
>= last_extent
) ||
2237 (!horizontal
&& item_rect
.y
+ item_rect
.height
>= last_extent
))
2242 if (item
.kind
== wxITEM_SEPARATOR
)
2245 m_art
->DrawSeparator(dc
, this, item_rect
);
2247 else if (item
.kind
== wxITEM_LABEL
)
2249 // draw a text label only
2250 m_art
->DrawLabel(dc
, this, item
, item_rect
);
2252 else if (item
.kind
== wxITEM_NORMAL
)
2254 // draw a regular button or dropdown button
2256 m_art
->DrawButton(dc
, this, item
, item_rect
);
2258 m_art
->DrawDropDownButton(dc
, this, item
, item_rect
);
2260 else if (item
.kind
== wxITEM_CHECK
)
2262 // draw a toggle button
2263 m_art
->DrawButton(dc
, this, item
, item_rect
);
2265 else if (item
.kind
== wxITEM_RADIO
)
2267 // draw a toggle button
2268 m_art
->DrawButton(dc
, this, item
, item_rect
);
2270 else if (item
.kind
== wxITEM_CONTROL
)
2272 // draw the control's label
2273 m_art
->DrawControlLabel(dc
, this, item
, item_rect
);
2276 // fire a signal to see if the item wants to be custom-rendered
2277 OnCustomRender(dc
, item
, item_rect
);
2280 // paint the overflow button
2281 if (dropdown_size
> 0 && m_overflow_sizer_item
)
2283 wxRect dropdown_rect
= GetOverflowRect();
2284 m_art
->DrawOverflowButton(dc
, this, dropdown_rect
, m_overflow_state
);
2288 void wxAuiToolBar::OnEraseBackground(wxEraseEvent
& WXUNUSED(evt
))
2293 void wxAuiToolBar::OnLeftDown(wxMouseEvent
& evt
)
2295 wxRect
cli_rect(wxPoint(0,0), GetClientSize());
2297 if (m_gripper_sizer_item
)
2299 wxRect gripper_rect
= m_gripper_sizer_item
->GetRect();
2300 if (gripper_rect
.Contains(evt
.GetX(), evt
.GetY()))
2303 wxAuiManager
* manager
= wxAuiManager::GetManager(this);
2307 int x_drag_offset
= evt
.GetX() - gripper_rect
.GetX();
2308 int y_drag_offset
= evt
.GetY() - gripper_rect
.GetY();
2310 // gripper was clicked
2311 manager
->StartPaneDrag(this, wxPoint(x_drag_offset
, y_drag_offset
));
2316 if (m_overflow_sizer_item
)
2318 wxRect overflow_rect
= GetOverflowRect();
2321 m_overflow_visible
&&
2322 overflow_rect
.Contains(evt
.m_x
, evt
.m_y
))
2324 wxAuiToolBarEvent
e(wxEVT_COMMAND_AUITOOLBAR_OVERFLOW_CLICK
, -1);
2325 e
.SetEventObject(this);
2327 e
.SetClickPoint(wxPoint(evt
.GetX(), evt
.GetY()));
2328 bool processed
= GetEventHandler()->ProcessEvent(e
);
2337 wxAuiToolBarItemArray overflow_items
;
2340 // add custom overflow prepend items, if any
2341 count
= m_custom_overflow_prepend
.GetCount();
2342 for (i
= 0; i
< count
; ++i
)
2343 overflow_items
.Add(m_custom_overflow_prepend
[i
]);
2345 // only show items that don't fit in the dropdown
2346 count
= m_items
.GetCount();
2347 for (i
= 0; i
< count
; ++i
)
2349 if (!GetToolFitsByIndex(i
))
2350 overflow_items
.Add(m_items
[i
]);
2353 // add custom overflow append items, if any
2354 count
= m_custom_overflow_append
.GetCount();
2355 for (i
= 0; i
< count
; ++i
)
2356 overflow_items
.Add(m_custom_overflow_append
[i
]);
2358 int res
= m_art
->ShowDropDown(this, overflow_items
);
2359 m_overflow_state
= 0;
2363 wxCommandEvent
e(wxEVT_COMMAND_MENU_SELECTED
, res
);
2364 e
.SetEventObject(this);
2365 GetParent()->GetEventHandler()->ProcessEvent(e
);
2374 m_action_pos
= wxPoint(evt
.GetX(), evt
.GetY());
2375 m_action_item
= FindToolByPosition(evt
.GetX(), evt
.GetY());
2379 if (m_action_item
->state
& wxAUI_BUTTON_STATE_DISABLED
)
2381 m_action_pos
= wxPoint(-1,-1);
2382 m_action_item
= NULL
;
2386 SetPressedItem(m_action_item
);
2388 // fire the tool dropdown event
2389 wxAuiToolBarEvent
e(wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN
, m_action_item
->id
);
2390 e
.SetEventObject(this);
2391 e
.SetToolId(m_action_item
->id
);
2392 e
.SetDropDownClicked(false);
2394 int mouse_x
= evt
.GetX();
2395 wxRect rect
= m_action_item
->sizer_item
->GetRect();
2397 if (m_action_item
->dropdown
&&
2398 mouse_x
>= (rect
.x
+rect
.width
-BUTTON_DROPDOWN_WIDTH
-1) &&
2399 mouse_x
< (rect
.x
+rect
.width
))
2401 e
.SetDropDownClicked(true);
2404 e
.SetClickPoint(evt
.GetPosition());
2405 e
.SetItemRect(rect
);
2406 GetEventHandler()->ProcessEvent(e
);
2411 void wxAuiToolBar::OnLeftUp(wxMouseEvent
& evt
)
2413 SetPressedItem(NULL
);
2415 wxAuiToolBarItem
* hit_item
= FindToolByPosition(evt
.GetX(), evt
.GetY());
2416 if (hit_item
&& !(hit_item
->state
& wxAUI_BUTTON_STATE_DISABLED
))
2418 SetHoverItem(hit_item
);
2424 // reset drag and drop member variables
2426 m_action_pos
= wxPoint(-1,-1);
2427 m_action_item
= NULL
;
2432 wxAuiToolBarItem
* hit_item
;
2433 hit_item
= FindToolByPosition(evt
.GetX(), evt
.GetY());
2435 if (m_action_item
&& hit_item
== m_action_item
)
2439 if (hit_item
->kind
== wxITEM_CHECK
|| hit_item
->kind
== wxITEM_RADIO
)
2441 bool toggle
= false;
2443 if (m_action_item
->state
& wxAUI_BUTTON_STATE_CHECKED
)
2448 ToggleTool(m_action_item
->id
, toggle
);
2450 // repaint immediately
2454 wxCommandEvent
e(wxEVT_COMMAND_MENU_SELECTED
, m_action_item
->id
);
2455 e
.SetEventObject(this);
2457 GetEventHandler()->ProcessEvent(e
);
2462 wxCommandEvent
e(wxEVT_COMMAND_MENU_SELECTED
, m_action_item
->id
);
2463 e
.SetEventObject(this);
2464 GetEventHandler()->ProcessEvent(e
);
2470 // reset drag and drop member variables
2472 m_action_pos
= wxPoint(-1,-1);
2473 m_action_item
= NULL
;
2476 void wxAuiToolBar::OnRightDown(wxMouseEvent
& evt
)
2478 wxRect
cli_rect(wxPoint(0,0), GetClientSize());
2480 if (m_gripper_sizer_item
)
2482 wxRect gripper_rect
= m_gripper_sizer_item
->GetRect();
2483 if (gripper_rect
.Contains(evt
.GetX(), evt
.GetY()))
2487 if (m_overflow_sizer_item
)
2489 int dropdown_size
= m_art
->GetElementSize(wxAUI_TBART_OVERFLOW_SIZE
);
2490 if (dropdown_size
> 0 &&
2491 evt
.m_x
> cli_rect
.width
- dropdown_size
&&
2493 evt
.m_y
< cli_rect
.height
&&
2500 m_action_pos
= wxPoint(evt
.GetX(), evt
.GetY());
2501 m_action_item
= FindToolByPosition(evt
.GetX(), evt
.GetY());
2505 if (m_action_item
->state
& wxAUI_BUTTON_STATE_DISABLED
)
2507 m_action_pos
= wxPoint(-1,-1);
2508 m_action_item
= NULL
;
2514 void wxAuiToolBar::OnRightUp(wxMouseEvent
& evt
)
2516 wxAuiToolBarItem
* hit_item
;
2517 hit_item
= FindToolByPosition(evt
.GetX(), evt
.GetY());
2519 if (m_action_item
&& hit_item
== m_action_item
)
2521 if (hit_item
->kind
== wxITEM_NORMAL
)
2523 wxAuiToolBarEvent
e(wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK
, m_action_item
->id
);
2524 e
.SetEventObject(this);
2525 e
.SetToolId(m_action_item
->id
);
2526 e
.SetClickPoint(m_action_pos
);
2527 GetEventHandler()->ProcessEvent(e
);
2533 // right-clicked on the invalid area of the toolbar
2534 wxAuiToolBarEvent
e(wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK
, -1);
2535 e
.SetEventObject(this);
2537 e
.SetClickPoint(m_action_pos
);
2538 GetEventHandler()->ProcessEvent(e
);
2542 // reset member variables
2543 m_action_pos
= wxPoint(-1,-1);
2544 m_action_item
= NULL
;
2547 void wxAuiToolBar::OnMiddleDown(wxMouseEvent
& evt
)
2549 wxRect
cli_rect(wxPoint(0,0), GetClientSize());
2551 if (m_gripper_sizer_item
)
2553 wxRect gripper_rect
= m_gripper_sizer_item
->GetRect();
2554 if (gripper_rect
.Contains(evt
.GetX(), evt
.GetY()))
2558 if (m_overflow_sizer_item
)
2560 int dropdown_size
= m_art
->GetElementSize(wxAUI_TBART_OVERFLOW_SIZE
);
2561 if (dropdown_size
> 0 &&
2562 evt
.m_x
> cli_rect
.width
- dropdown_size
&&
2564 evt
.m_y
< cli_rect
.height
&&
2571 m_action_pos
= wxPoint(evt
.GetX(), evt
.GetY());
2572 m_action_item
= FindToolByPosition(evt
.GetX(), evt
.GetY());
2576 if (m_action_item
->state
& wxAUI_BUTTON_STATE_DISABLED
)
2578 m_action_pos
= wxPoint(-1,-1);
2579 m_action_item
= NULL
;
2585 void wxAuiToolBar::OnMiddleUp(wxMouseEvent
& evt
)
2587 wxAuiToolBarItem
* hit_item
;
2588 hit_item
= FindToolByPosition(evt
.GetX(), evt
.GetY());
2590 if (m_action_item
&& hit_item
== m_action_item
)
2592 if (hit_item
->kind
== wxITEM_NORMAL
)
2594 wxAuiToolBarEvent
e(wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK
, m_action_item
->id
);
2595 e
.SetEventObject(this);
2596 e
.SetToolId(m_action_item
->id
);
2597 e
.SetClickPoint(m_action_pos
);
2598 GetEventHandler()->ProcessEvent(e
);
2603 // reset member variables
2604 m_action_pos
= wxPoint(-1,-1);
2605 m_action_item
= NULL
;
2608 void wxAuiToolBar::OnMotion(wxMouseEvent
& evt
)
2610 // start a drag event
2612 m_action_item
!= NULL
&&
2613 m_action_pos
!= wxPoint(-1,-1) &&
2614 abs(evt
.m_x
- m_action_pos
.x
) + abs(evt
.m_y
- m_action_pos
.y
) > 5)
2620 wxAuiToolBarEvent
e(wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG
, GetId());
2621 e
.SetEventObject(this);
2622 e
.SetToolId(m_action_item
->id
);
2623 GetEventHandler()->ProcessEvent(e
);
2628 wxAuiToolBarItem
* hit_item
= FindToolByPosition(evt
.GetX(), evt
.GetY());
2631 if (!(hit_item
->state
& wxAUI_BUTTON_STATE_DISABLED
))
2632 SetHoverItem(hit_item
);
2638 // no hit item, remove any hit item
2639 SetHoverItem(hit_item
);
2642 // figure out tooltips
2643 wxAuiToolBarItem
* packing_hit_item
;
2644 packing_hit_item
= FindToolByPositionWithPacking(evt
.GetX(), evt
.GetY());
2645 if (packing_hit_item
)
2647 if (packing_hit_item
!= m_tip_item
)
2649 m_tip_item
= packing_hit_item
;
2651 if ( !packing_hit_item
->short_help
.empty() )
2652 SetToolTip(packing_hit_item
->short_help
);
2663 // if we've pressed down an item and we're hovering
2664 // over it, make sure it's state is set to pressed
2667 if (m_action_item
== hit_item
)
2668 SetPressedItem(m_action_item
);
2670 SetPressedItem(NULL
);
2673 // figure out the dropdown button state (are we hovering or pressing it?)
2674 RefreshOverflowState();
2677 void wxAuiToolBar::OnLeaveWindow(wxMouseEvent
& WXUNUSED(evt
))
2679 RefreshOverflowState();
2681 SetPressedItem(NULL
);
2687 void wxAuiToolBar::OnSetCursor(wxSetCursorEvent
& evt
)
2689 wxCursor cursor
= wxNullCursor
;
2691 if (m_gripper_sizer_item
)
2693 wxRect gripper_rect
= m_gripper_sizer_item
->GetRect();
2694 if (gripper_rect
.Contains(evt
.GetX(), evt
.GetY()))
2696 cursor
= wxCursor(wxCURSOR_SIZING
);
2700 evt
.SetCursor(cursor
);