X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e5dcae09e6c207688b41c8b744764d32b7b39a46..7198c3368055d88249a338eb33b21f051f674806:/src/aui/auibar.cpp diff --git a/src/aui/auibar.cpp b/src/aui/auibar.cpp index e33ce817a0..a64ed0cce5 100644 --- a/src/aui/auibar.cpp +++ b/src/aui/auibar.cpp @@ -1,6 +1,6 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: src/aui/dockart.cpp +// Name: src/aui/auibar.cpp // Purpose: wxaui: wx advanced user interface - docking window manager // Author: Benjamin I. Williams // Modified by: @@ -69,44 +69,6 @@ const int BUTTON_DROPDOWN_WIDTH = 10; wxBitmap wxAuiBitmapFromBits(const unsigned char bits[], int w, int h, const wxColour& color); -unsigned char wxAuiBlendColour(unsigned char fg, unsigned char bg, double alpha); -wxColor wxAuiStepColour(const wxColor& c, int percent); - -static wxBitmap MakeDisabledBitmap(wxBitmap& bmp) -{ - wxImage image = bmp.ConvertToImage(); - - int mr, mg, mb; - mr = image.GetMaskRed(); - mg = image.GetMaskGreen(); - mb = image.GetMaskBlue(); - - unsigned char* data = image.GetData(); - int width = image.GetWidth(); - int height = image.GetHeight(); - bool has_mask = image.HasMask(); - - for (int y = height-1; y >= 0; --y) - { - for (int x = width-1; x >= 0; --x) - { - data = image.GetData() + (y*(width*3))+(x*3); - unsigned char* r = data; - unsigned char* g = data+1; - unsigned char* b = data+2; - - if (has_mask && *r == mr && *g == mg && *b == mb) - continue; - - *r = wxAuiBlendColour(*r, 255, 0.4); - *g = wxAuiBlendColour(*g, 255, 0.4); - *b = wxAuiBlendColour(*b, 255, 0.4); - } - } - - return wxBitmap(image); -} - static wxColor GetBaseColor() { @@ -122,7 +84,7 @@ static wxColor GetBaseColor() (255-base_colour.Green()) + (255-base_colour.Blue()) < 60) { - base_colour = wxAuiStepColour(base_colour, 92); + base_colour = base_colour.ChangeLightness(92); } return base_colour; @@ -158,7 +120,7 @@ private: static const unsigned char - DISABLED_TEXT_GREY_HUE = wxAuiBlendColour(0, 255, 0.4); + DISABLED_TEXT_GREY_HUE = wxColour::AlphaBlend(0, 255, 0.4); const wxColour DISABLED_TEXT_COLOR(DISABLED_TEXT_GREY_HUE, DISABLED_TEXT_GREY_HUE, DISABLED_TEXT_GREY_HUE); @@ -175,11 +137,11 @@ wxAuiDefaultToolBarArt::wxAuiDefaultToolBarArt() m_gripper_size = 7; m_overflow_size = 16; - wxColor darker1_colour = wxAuiStepColour(m_base_colour, 85); - wxColor darker2_colour = wxAuiStepColour(m_base_colour, 75); - wxColor darker3_colour = wxAuiStepColour(m_base_colour, 60); - wxColor darker4_colour = wxAuiStepColour(m_base_colour, 50); - wxColor darker5_colour = wxAuiStepColour(m_base_colour, 40); + wxColor darker1_colour = m_base_colour.ChangeLightness(85); + wxColor darker2_colour = m_base_colour.ChangeLightness(75); + wxColor darker3_colour = m_base_colour.ChangeLightness(60); + wxColor darker4_colour = m_base_colour.ChangeLightness(50); + wxColor darker5_colour = m_base_colour.ChangeLightness(40); m_gripper_pen1 = wxPen(darker5_colour); m_gripper_pen2 = wxPen(darker3_colour); @@ -247,8 +209,8 @@ void wxAuiDefaultToolBarArt::DrawBackground( { wxRect rect = _rect; rect.height++; - wxColour start_colour = wxAuiStepColour(m_base_colour, 150); - wxColour end_colour = wxAuiStepColour(m_base_colour, 90); + wxColour start_colour = m_base_colour.ChangeLightness(150); + wxColour end_colour = m_base_colour.ChangeLightness(90); dc.GradientFillLinear(rect, start_colour, end_colour, wxSOUTH); } @@ -334,18 +296,18 @@ void wxAuiDefaultToolBarArt::DrawButton( if (item.GetState() & wxAUI_BUTTON_STATE_PRESSED) { dc.SetPen(wxPen(m_highlight_colour)); - dc.SetBrush(wxBrush(wxAuiStepColour(m_highlight_colour, 150))); + dc.SetBrush(wxBrush(m_highlight_colour.ChangeLightness(150))); dc.DrawRectangle(rect); } else if ((item.GetState() & wxAUI_BUTTON_STATE_HOVER) || item.IsSticky()) { dc.SetPen(wxPen(m_highlight_colour)); - dc.SetBrush(wxBrush(wxAuiStepColour(m_highlight_colour, 170))); + dc.SetBrush(wxBrush(m_highlight_colour.ChangeLightness(170))); // draw an even lighter background for checked item hovers (since // the hover background is the same color as the check background) if (item.GetState() & wxAUI_BUTTON_STATE_CHECKED) - dc.SetBrush(wxBrush(wxAuiStepColour(m_highlight_colour, 180))); + dc.SetBrush(wxBrush(m_highlight_colour.ChangeLightness(180))); dc.DrawRectangle(rect); } @@ -354,7 +316,7 @@ void wxAuiDefaultToolBarArt::DrawButton( // it's important to put this code in an else statment after the // hover, otherwise hovers won't draw properly for checked items dc.SetPen(wxPen(m_highlight_colour)); - dc.SetBrush(wxBrush(wxAuiStepColour(m_highlight_colour, 170))); + dc.SetBrush(wxBrush(m_highlight_colour.ChangeLightness(170))); dc.DrawRectangle(rect); } } @@ -365,10 +327,8 @@ void wxAuiDefaultToolBarArt::DrawButton( else bmp = item.GetBitmap(); - if (!bmp.IsOk()) - return; - - dc.DrawBitmap(bmp, bmp_x, bmp_y, true); + if ( bmp.IsOk() ) + dc.DrawBitmap(bmp, bmp_x, bmp_y, true); // set the item's text color based on if it is disabled dc.SetTextForeground(*wxBLACK); @@ -454,15 +414,26 @@ void wxAuiDefaultToolBarArt::DrawDropDownButton( if (item.GetState() & wxAUI_BUTTON_STATE_PRESSED) { dc.SetPen(wxPen(m_highlight_colour)); - dc.SetBrush(wxBrush(wxAuiStepColour(m_highlight_colour, 140))); + dc.SetBrush(wxBrush(m_highlight_colour.ChangeLightness(140))); dc.DrawRectangle(button_rect); + + dc.SetBrush(wxBrush(m_highlight_colour.ChangeLightness(170))); dc.DrawRectangle(dropdown_rect); } else if (item.GetState() & wxAUI_BUTTON_STATE_HOVER || item.IsSticky()) { dc.SetPen(wxPen(m_highlight_colour)); - dc.SetBrush(wxBrush(wxAuiStepColour(m_highlight_colour, 170))); + dc.SetBrush(wxBrush(m_highlight_colour.ChangeLightness(170))); + dc.DrawRectangle(button_rect); + dc.DrawRectangle(dropdown_rect); + } + else if (item.GetState() & wxAUI_BUTTON_STATE_CHECKED) + { + // Notice that this branch must come after the hover one to ensure the + // correct appearance when the mouse hovers over a checked item. + dc.SetPen(wxPen(m_highlight_colour)); + dc.SetBrush(wxBrush(m_highlight_colour.ChangeLightness(170))); dc.DrawRectangle(button_rect); dc.DrawRectangle(dropdown_rect); } @@ -639,8 +610,8 @@ void wxAuiDefaultToolBarArt::DrawSeparator( rect.width = new_width; } - wxColour start_colour = wxAuiStepColour(m_base_colour, 80); - wxColour end_colour = wxAuiStepColour(m_base_colour, 80); + wxColour start_colour = m_base_colour.ChangeLightness(80); + wxColour end_colour = m_base_colour.ChangeLightness(80); dc.GradientFillLinear(rect, start_colour, end_colour, horizontal ? wxSOUTH : wxEAST); } @@ -692,7 +663,7 @@ void wxAuiDefaultToolBarArt::DrawOverflowButton(wxDC& dc, state & wxAUI_BUTTON_STATE_PRESSED) { wxRect cli_rect = wnd->GetClientRect(); - wxColor light_gray_bg = wxAuiStepColour(m_highlight_colour, 170); + wxColor light_gray_bg = m_highlight_colour.ChangeLightness(170); if (m_flags & wxAUI_TB_VERTICAL) { @@ -824,6 +795,7 @@ BEGIN_EVENT_TABLE(wxAuiToolBar, wxControl) EVT_MIDDLE_UP(wxAuiToolBar::OnMiddleUp) EVT_MOTION(wxAuiToolBar::OnMotion) EVT_LEAVE_WINDOW(wxAuiToolBar::OnLeaveWindow) + EVT_MOUSE_CAPTURE_LOST(wxAuiToolBar::OnCaptureLost) EVT_SET_CURSOR(wxAuiToolBar::OnSetCursor) END_EVENT_TABLE() @@ -972,7 +944,7 @@ wxAuiToolBarItem* wxAuiToolBar::AddTool(int tool_id, item.active = true; item.dropdown = false; item.spacer_pixels = 0; - item.id = tool_id; + item.toolid = tool_id; item.state = 0; item.proportion = 0; item.kind = kind; @@ -981,18 +953,15 @@ wxAuiToolBarItem* wxAuiToolBar::AddTool(int tool_id, item.user_data = 0; item.sticky = false; - if (item.id == wxID_ANY) - item.id = wxNewId(); + if (item.toolid == wxID_ANY) + item.toolid = wxNewId(); if (!item.disabled_bitmap.IsOk()) { // no disabled bitmap specified, we need to make one if (item.bitmap.IsOk()) { - //wxImage img = item.bitmap.ConvertToImage(); - //wxImage grey_version = img.ConvertToGreyscale(); - //item.disabled_bitmap = wxBitmap(grey_version); - item.disabled_bitmap = MakeDisabledBitmap(item.bitmap); + item.disabled_bitmap = item.bitmap.ConvertToDisabled(); } } m_items.Add(item); @@ -1010,7 +979,7 @@ wxAuiToolBarItem* wxAuiToolBar::AddControl(wxControl* control, item.active = true; item.dropdown = false; item.spacer_pixels = 0; - item.id = control->GetId(); + item.toolid = control->GetId(); item.state = 0; item.proportion = 0; item.kind = wxITEM_CONTROL; @@ -1039,7 +1008,7 @@ wxAuiToolBarItem* wxAuiToolBar::AddLabel(int tool_id, item.active = true; item.dropdown = false; item.spacer_pixels = 0; - item.id = tool_id; + item.toolid = tool_id; item.state = 0; item.proportion = 0; item.kind = wxITEM_LABEL; @@ -1048,8 +1017,8 @@ wxAuiToolBarItem* wxAuiToolBar::AddLabel(int tool_id, item.user_data = 0; item.sticky = false; - if (item.id == wxID_ANY) - item.id = wxNewId(); + if (item.toolid == wxID_ANY) + item.toolid = wxNewId(); m_items.Add(item); return &m_items.Last(); @@ -1064,7 +1033,7 @@ wxAuiToolBarItem* wxAuiToolBar::AddSeparator() item.disabled_bitmap = wxNullBitmap; item.active = true; item.dropdown = false; - item.id = -1; + item.toolid = -1; item.state = 0; item.proportion = 0; item.kind = wxITEM_SEPARATOR; @@ -1087,7 +1056,7 @@ wxAuiToolBarItem* wxAuiToolBar::AddSpacer(int pixels) item.active = true; item.dropdown = false; item.spacer_pixels = pixels; - item.id = -1; + item.toolid = -1; item.state = 0; item.proportion = 0; item.kind = wxITEM_SPACER; @@ -1110,7 +1079,7 @@ wxAuiToolBarItem* wxAuiToolBar::AddStretchSpacer(int proportion) item.active = true; item.dropdown = false; item.spacer_pixels = 0; - item.id = -1; + item.toolid = -1; item.state = 0; item.proportion = proportion; item.kind = wxITEM_SPACER; @@ -1167,7 +1136,7 @@ wxAuiToolBarItem* wxAuiToolBar::FindTool(int tool_id) const for (i = 0, count = m_items.GetCount(); i < count; ++i) { wxAuiToolBarItem& item = m_items.Item(i); - if (item.id == tool_id) + if (item.toolid == tool_id) return &item; } @@ -1537,13 +1506,13 @@ void wxAuiToolBar::ToggleTool(int tool_id, bool state) if (idx >= 0 && idx < count) { - for (i = idx; i < count; ++i) + for (i = idx + 1; i < count; ++i) { if (m_items[i].kind != wxITEM_RADIO) break; m_items[i].state &= ~wxAUI_BUTTON_STATE_CHECKED; } - for (i = idx; i > 0; i--) + for (i = idx - 1; i >= 0; i--) { if (m_items[i].kind != wxITEM_RADIO) break; @@ -1760,7 +1729,7 @@ int wxAuiToolBar::GetToolIndex(int tool_id) const for (i = 0; i < count; ++i) { wxAuiToolBarItem& item = m_items.Item(i); - if (item.id == tool_id) + if (item.toolid == tool_id) return i; } @@ -2169,10 +2138,10 @@ void wxAuiToolBar::DoIdleUpdate() { wxAuiToolBarItem& item = m_items.Item(i); - if (item.id == -1) + if (item.toolid == -1) continue; - wxUpdateUIEvent evt(item.id); + wxUpdateUIEvent evt(item.toolid); evt.SetEventObject(this); if (handler->ProcessEvent(evt)) @@ -2446,8 +2415,11 @@ void wxAuiToolBar::OnPaint(wxPaintEvent& WXUNUSED(evt)) } else if (item.kind == wxITEM_CHECK) { - // draw a toggle button - m_art->DrawButton(dc, this, item, item_rect); + // draw either a regular or dropdown toggle button + if (!item.dropdown) + m_art->DrawButton(dc, this, item, item_rect); + else + m_art->DrawDropDownButton(dc, this, item, item_rect); } else if (item.kind == wxITEM_RADIO) { @@ -2570,33 +2542,45 @@ void wxAuiToolBar::OnLeftDown(wxMouseEvent& evt) return; } - SetPressedItem(m_action_item); + UnsetToolTip(); // fire the tool dropdown event - wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, m_action_item->id); + wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, m_action_item->toolid); e.SetEventObject(this); - e.SetToolId(m_action_item->id); - e.SetDropDownClicked(false); + e.SetToolId(m_action_item->toolid); int mouse_x = evt.GetX(); wxRect rect = m_action_item->sizer_item->GetRect(); + const bool dropDownHit = m_action_item->dropdown && + mouse_x >= (rect.x+rect.width-BUTTON_DROPDOWN_WIDTH-1) && + mouse_x < (rect.x+rect.width); + e.SetDropDownClicked(dropDownHit); + + e.SetClickPoint(evt.GetPosition()); + e.SetItemRect(rect); - if (m_action_item->dropdown && - mouse_x >= (rect.x+rect.width-BUTTON_DROPDOWN_WIDTH-1) && - mouse_x < (rect.x+rect.width)) + // we only set the 'pressed button' state if we hit the actual button + // and not just the drop-down + SetPressedItem(dropDownHit ? 0 : m_action_item); + + if(dropDownHit) { - e.SetDropDownClicked(true); + m_action_pos = wxPoint(-1,-1); + m_action_item = NULL; } - e.SetClickPoint(evt.GetPosition()); - e.SetItemRect(rect); - GetEventHandler()->ProcessEvent(e); + if(!GetEventHandler()->ProcessEvent(e) || e.GetSkipped()) + CaptureMouse(); + DoIdleUpdate(); } } void wxAuiToolBar::OnLeftUp(wxMouseEvent& evt) { + if (!HasCapture()) + return; + SetPressedItem(NULL); wxAuiToolBarItem* hit_item = FindToolByPosition(evt.GetX(), evt.GetY()); @@ -2605,14 +2589,15 @@ void wxAuiToolBar::OnLeftUp(wxMouseEvent& evt) SetHoverItem(hit_item); } - if (m_dragging) { - // reset drag and drop member variables - m_dragging = false; - m_action_pos = wxPoint(-1,-1); - m_action_item = NULL; - return; + // TODO: it would make sense to send out an 'END_DRAG' event here, + // otherwise a client would never know what to do with the 'BEGIN_DRAG' + // event + + // OnCaptureLost() will be called now and this will reset all our state + // tracking variables + ReleaseMouse(); } else { @@ -2623,41 +2608,34 @@ void wxAuiToolBar::OnLeftUp(wxMouseEvent& evt) { UnsetToolTip(); + wxCommandEvent e(wxEVT_COMMAND_MENU_SELECTED, m_action_item->toolid); + e.SetEventObject(this); + if (hit_item->kind == wxITEM_CHECK || hit_item->kind == wxITEM_RADIO) { - bool toggle = false; + const bool toggle = !(m_action_item->state & wxAUI_BUTTON_STATE_CHECKED); - if (m_action_item->state & wxAUI_BUTTON_STATE_CHECKED) - toggle = false; - else - toggle = true; - - ToggleTool(m_action_item->id, toggle); + ToggleTool(m_action_item->toolid, toggle); // repaint immediately Refresh(false); Update(); - wxCommandEvent e(wxEVT_COMMAND_MENU_SELECTED, m_action_item->id); - e.SetEventObject(this); - e.SetInt (toggle); - GetEventHandler()->ProcessEvent(e); - DoIdleUpdate(); - } - else - { - wxCommandEvent e(wxEVT_COMMAND_MENU_SELECTED, m_action_item->id); - e.SetEventObject(this); - GetEventHandler()->ProcessEvent(e); - DoIdleUpdate(); + e.SetInt(toggle); } + + // we have to release the mouse *before* sending the event, because + // we don't know what a handler might do. It could open up a popup + // menu for example and that would make us lose our capture anyway. + + ReleaseMouse(); + + GetEventHandler()->ProcessEvent(e); + DoIdleUpdate(); } + else + ReleaseMouse(); } - - // reset drag and drop member variables - m_dragging = false; - m_action_pos = wxPoint(-1,-1); - m_action_item = NULL; } void wxAuiToolBar::OnRightDown(wxMouseEvent& evt) @@ -2687,15 +2665,14 @@ void wxAuiToolBar::OnRightDown(wxMouseEvent& evt) m_action_pos = wxPoint(evt.GetX(), evt.GetY()); m_action_item = FindToolByPosition(evt.GetX(), evt.GetY()); - if (m_action_item) + if (m_action_item && m_action_item->state & wxAUI_BUTTON_STATE_DISABLED) { - if (m_action_item->state & wxAUI_BUTTON_STATE_DISABLED) - { - m_action_pos = wxPoint(-1,-1); - m_action_item = NULL; - return; - } + m_action_pos = wxPoint(-1,-1); + m_action_item = NULL; + return; } + + UnsetToolTip(); } void wxAuiToolBar::OnRightUp(wxMouseEvent& evt) @@ -2707,9 +2684,9 @@ void wxAuiToolBar::OnRightUp(wxMouseEvent& evt) { if (hit_item->kind == wxITEM_NORMAL) { - wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK, m_action_item->id); + wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_RIGHT_CLICK, m_action_item->toolid); e.SetEventObject(this); - e.SetToolId(m_action_item->id); + e.SetToolId(m_action_item->toolid); e.SetClickPoint(m_action_pos); GetEventHandler()->ProcessEvent(e); DoIdleUpdate(); @@ -2767,6 +2744,8 @@ void wxAuiToolBar::OnMiddleDown(wxMouseEvent& evt) return; } } + + UnsetToolTip(); } void wxAuiToolBar::OnMiddleUp(wxMouseEvent& evt) @@ -2778,9 +2757,9 @@ void wxAuiToolBar::OnMiddleUp(wxMouseEvent& evt) { if (hit_item->kind == wxITEM_NORMAL) { - wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK, m_action_item->id); + wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_MIDDLE_CLICK, m_action_item->toolid); e.SetEventObject(this); - e.SetToolId(m_action_item->id); + e.SetToolId(m_action_item->toolid); e.SetClickPoint(m_action_pos); GetEventHandler()->ProcessEvent(e); DoIdleUpdate(); @@ -2794,82 +2773,104 @@ void wxAuiToolBar::OnMiddleUp(wxMouseEvent& evt) void wxAuiToolBar::OnMotion(wxMouseEvent& evt) { + const bool button_pressed = HasCapture(); + // start a drag event - if (!m_dragging && - m_action_item != NULL && - m_action_pos != wxPoint(-1,-1) && - abs(evt.m_x - m_action_pos.x) + abs(evt.m_y - m_action_pos.y) > 5) + if (!m_dragging && button_pressed && + abs(evt.GetX() - m_action_pos.x) + abs(evt.GetY() - m_action_pos.y) > 5) { - UnsetToolTip(); - - m_dragging = true; - + // TODO: sending this event only makes sense if there is an 'END_DRAG' + // event sent sometime in the future (see OnLeftUp()) wxAuiToolBarEvent e(wxEVT_COMMAND_AUITOOLBAR_BEGIN_DRAG, GetId()); e.SetEventObject(this); - e.SetToolId(m_action_item->id); - GetEventHandler()->ProcessEvent(e); + e.SetToolId(m_action_item->toolid); + m_dragging = GetEventHandler()->ProcessEvent(e) && !e.GetSkipped(); + DoIdleUpdate(); - return; } + if(m_dragging) + return; + wxAuiToolBarItem* hit_item = FindToolByPosition(evt.GetX(), evt.GetY()); - if (hit_item) + if(button_pressed) { - if (!(hit_item->state & wxAUI_BUTTON_STATE_DISABLED)) - SetHoverItem(hit_item); + // if we have a button pressed we want it to be shown in 'depressed' + // state unless we move the mouse outside the button, then we want it + // to show as just 'highlighted' + if (hit_item == m_action_item) + SetPressedItem(m_action_item); else - SetHoverItem(NULL); + { + SetPressedItem(NULL); + SetHoverItem(m_action_item); + } } else { - // no hit item, remove any hit item - SetHoverItem(hit_item); - } + if (hit_item && (hit_item->state & wxAUI_BUTTON_STATE_DISABLED)) + SetHoverItem(NULL); + else + SetHoverItem(hit_item); - // figure out tooltips - wxAuiToolBarItem* packing_hit_item; - packing_hit_item = FindToolByPositionWithPacking(evt.GetX(), evt.GetY()); - if (packing_hit_item) - { - if (packing_hit_item != m_tip_item) + // tooltips handling + wxAuiToolBarItem* packing_hit_item; + packing_hit_item = FindToolByPositionWithPacking(evt.GetX(), evt.GetY()); + if (packing_hit_item) { - m_tip_item = packing_hit_item; + if (packing_hit_item != m_tip_item) + { + m_tip_item = packing_hit_item; - if ( !packing_hit_item->short_help.empty() ) - SetToolTip(packing_hit_item->short_help); - else - UnsetToolTip(); + if ( !packing_hit_item->short_help.empty() ) + SetToolTip(packing_hit_item->short_help); + else + UnsetToolTip(); + } } - } - else - { - UnsetToolTip(); - m_tip_item = NULL; - } - - // if we've pressed down an item and we're hovering - // over it, make sure it's state is set to pressed - if (m_action_item) - { - if (m_action_item == hit_item) - SetPressedItem(m_action_item); else - SetPressedItem(NULL); - } + { + UnsetToolTip(); + m_tip_item = NULL; + } - // figure out the dropdown button state (are we hovering or pressing it?) - RefreshOverflowState(); + // figure out the dropdown button state (are we hovering or pressing it?) + RefreshOverflowState(); + } } -void wxAuiToolBar::OnLeaveWindow(wxMouseEvent& WXUNUSED(evt)) +void wxAuiToolBar::DoResetMouseState() { RefreshOverflowState(); SetHoverItem(NULL); SetPressedItem(NULL); m_tip_item = NULL; + + // we have to reset those here, because the mouse-up handlers which do + // it usually won't be called if we let go of a mouse button while we + // are outside of the window + m_action_pos = wxPoint(-1,-1); + m_action_item = NULL; +} + +void wxAuiToolBar::OnLeaveWindow(wxMouseEvent& evt) +{ + if(HasCapture()) + { + evt.Skip(); + return; + } + + DoResetMouseState(); } +void wxAuiToolBar::OnCaptureLost(wxMouseCaptureLostEvent& WXUNUSED(evt)) +{ + m_dragging = false; + + DoResetMouseState(); +} void wxAuiToolBar::OnSetCursor(wxSetCursorEvent& evt) {