wxAuiPaneInfo wxAuiNullPaneInfo;
wxAuiDockInfo wxAuiNullDockInfo;
-DEFINE_EVENT_TYPE(wxEVT_AUI_PANE_BUTTON)
-DEFINE_EVENT_TYPE(wxEVT_AUI_PANE_CLOSE)
-DEFINE_EVENT_TYPE(wxEVT_AUI_PANE_MAXIMIZE)
-DEFINE_EVENT_TYPE(wxEVT_AUI_PANE_RESTORE)
-DEFINE_EVENT_TYPE(wxEVT_AUI_RENDER)
-DEFINE_EVENT_TYPE(wxEVT_AUI_FIND_MANAGER)
+wxDEFINE_EVENT( wxEVT_AUI_PANE_BUTTON, wxAuiManagerEvent )
+wxDEFINE_EVENT( wxEVT_AUI_PANE_CLOSE, wxAuiManagerEvent )
+wxDEFINE_EVENT( wxEVT_AUI_PANE_MAXIMIZE, wxAuiManagerEvent )
+wxDEFINE_EVENT( wxEVT_AUI_PANE_RESTORE, wxAuiManagerEvent )
+wxDEFINE_EVENT( wxEVT_AUI_RENDER, wxAuiManagerEvent )
+wxDEFINE_EVENT( wxEVT_AUI_FIND_MANAGER, wxAuiManagerEvent )
#ifdef __WXMAC__
// a few defines to avoid nameclashes
wxAuiManager::wxAuiManager(wxWindow* managed_wnd, unsigned int flags)
{
m_action = actionNone;
+ m_action_window = NULL;
m_last_mouse_move = wxPoint();
m_hover_button = NULL;
m_art = new wxAuiDefaultDockArt;
m_dock_constraint_x = 0.3;
m_dock_constraint_y = 0.3;
m_reserved = NULL;
+ m_currentDragItem = -1;
if (managed_wnd)
{
return m_flags;
}
+// Convenience function
+bool wxAuiManager_HasLiveResize(wxAuiManager& manager)
+{
+ // With Core Graphics on Mac, it's not possible to show sash feedback,
+ // so we'll always use live update instead.
+#if defined(__WXMAC__)
+ return true;
+#else
+ return (manager.GetFlags() & wxAUI_MGR_LIVE_RESIZE) == wxAUI_MGR_LIVE_RESIZE;
+#endif
+}
// don't use these anymore as they are deprecated
// use Set/GetManagedFrame() instead
{
wxFrame* f = static_cast<wxFrame*>(w);
can_do_transparent = f->CanSetTransparent();
-
+
break;
}
bool wxAuiManager::AddPane(wxWindow* window, const wxAuiPaneInfo& pane_info)
{
wxASSERT_MSG(window, wxT("NULL window ptrs are not allowed"));
-
+
// check if the pane has a valid window
if (!window)
return false;
button.button_id = wxAUI_BUTTON_CLOSE;
pinfo.buttons.Add(button);
}
-
+
if (pinfo.HasGripper())
{
if (pinfo.window->IsKindOf(CLASSINFO(wxAuiToolBar)))
// have a gripper control. The toolbar's built-in gripper
// meshes better with the look and feel of the control than ours,
// so turn wxAuiManager's gripper off, and the toolbar's on.
-
+
wxAuiToolBar* tb = static_cast<wxAuiToolBar*>(pinfo.window);
pinfo.SetFlag(wxAuiPaneInfo::optionGripper, false);
tb->SetGripperVisible(true);
}
}
-
+
if (pinfo.best_size == wxDefaultSize &&
pinfo.window)
}
-
+
return true;
}
{
wxAuiPaneInfo& pane = *(dock.panes.Item(pane_i));
- if (pane.state & wxAuiPaneInfo::actionPane)
+ if (pane.HasFlag(wxAuiPaneInfo::actionPane))
{
wxASSERT_MSG(action_pane==-1, wxT("Too many fixed action panes"));
action_pane = pane_i;
dock.toolbar = false;
if (pane.HasFlag(wxAuiPaneInfo::optionDockFixed))
dock.fixed = true;
- if (pane.state & wxAuiPaneInfo::actionPane)
+ if (pane.HasFlag(wxAuiPaneInfo::actionPane))
action_pane_marked = true;
}
cont->Add(middle, 1, wxEXPAND);
else
delete middle;
-
+
// find any bottom docks in this layer
void wxAuiManager::OnLeftDown(wxMouseEvent& event)
{
+ m_currentDragItem = -1;
+
wxAuiDockUIPart* part = HitTest(event.GetX(), event.GetY());
if (part)
{
#endif
}
-
-void wxAuiManager::OnLeftUp(wxMouseEvent& event)
+/// Ends a resize action, or for live update, resizes the sash
+bool wxAuiManager::DoEndResizeAction(wxMouseEvent& event)
{
- if (m_action == actionResize)
+ // resize the dock or the pane
+ if (m_action_part && m_action_part->type==wxAuiDockUIPart::typeDockSizer)
{
- m_frame->ReleaseMouse();
+ wxRect& rect = m_action_part->dock->rect;
- // get rid of the hint rectangle
- wxScreenDC dc;
- DrawResizeHint(dc, m_action_hintrect);
+ wxPoint new_pos(event.m_x - m_action_offset.x,
+ event.m_y - m_action_offset.y);
- // resize the dock or the pane
- if (m_action_part && m_action_part->type==wxAuiDockUIPart::typeDockSizer)
+ switch (m_action_part->dock->dock_direction)
{
- wxRect& rect = m_action_part->dock->rect;
-
- wxPoint new_pos(event.m_x - m_action_offset.x,
- event.m_y - m_action_offset.y);
-
- switch (m_action_part->dock->dock_direction)
- {
- case wxAUI_DOCK_LEFT:
- m_action_part->dock->size = new_pos.x - rect.x;
- break;
- case wxAUI_DOCK_TOP:
- m_action_part->dock->size = new_pos.y - rect.y;
- break;
- case wxAUI_DOCK_RIGHT:
- m_action_part->dock->size = rect.x + rect.width -
- new_pos.x - m_action_part->rect.GetWidth();
- break;
- case wxAUI_DOCK_BOTTOM:
- m_action_part->dock->size = rect.y + rect.height -
- new_pos.y - m_action_part->rect.GetHeight();
- break;
- }
-
- Update();
- Repaint(NULL);
+ case wxAUI_DOCK_LEFT:
+ m_action_part->dock->size = new_pos.x - rect.x;
+ break;
+ case wxAUI_DOCK_TOP:
+ m_action_part->dock->size = new_pos.y - rect.y;
+ break;
+ case wxAUI_DOCK_RIGHT:
+ m_action_part->dock->size = rect.x + rect.width -
+ new_pos.x - m_action_part->rect.GetWidth();
+ break;
+ case wxAUI_DOCK_BOTTOM:
+ m_action_part->dock->size = rect.y + rect.height -
+ new_pos.y - m_action_part->rect.GetHeight();
+ break;
}
- else if (m_action_part &&
- m_action_part->type == wxAuiDockUIPart::typePaneSizer)
- {
- wxAuiDockInfo& dock = *m_action_part->dock;
- wxAuiPaneInfo& pane = *m_action_part->pane;
- int total_proportion = 0;
- int dock_pixels = 0;
- int new_pixsize = 0;
+ Update();
+ Repaint(NULL);
+ }
+ else if (m_action_part &&
+ m_action_part->type == wxAuiDockUIPart::typePaneSizer)
+ {
+ wxAuiDockInfo& dock = *m_action_part->dock;
+ wxAuiPaneInfo& pane = *m_action_part->pane;
- int caption_size = m_art->GetMetric(wxAUI_DOCKART_CAPTION_SIZE);
- int pane_border_size = m_art->GetMetric(wxAUI_DOCKART_PANE_BORDER_SIZE);
- int sash_size = m_art->GetMetric(wxAUI_DOCKART_SASH_SIZE);
+ int total_proportion = 0;
+ int dock_pixels = 0;
+ int new_pixsize = 0;
- wxPoint new_pos(event.m_x - m_action_offset.x,
- event.m_y - m_action_offset.y);
+ int caption_size = m_art->GetMetric(wxAUI_DOCKART_CAPTION_SIZE);
+ int pane_border_size = m_art->GetMetric(wxAUI_DOCKART_PANE_BORDER_SIZE);
+ int sash_size = m_art->GetMetric(wxAUI_DOCKART_SASH_SIZE);
- // determine the pane rectangle by getting the pane part
- wxAuiDockUIPart* pane_part = GetPanePart(pane.window);
- wxASSERT_MSG(pane_part,
- wxT("Pane border part not found -- shouldn't happen"));
+ wxPoint new_pos(event.m_x - m_action_offset.x,
+ event.m_y - m_action_offset.y);
- // determine the new pixel size that the user wants;
- // this will help us recalculate the pane's proportion
- if (dock.IsHorizontal())
- new_pixsize = new_pos.x - pane_part->rect.x;
- else
- new_pixsize = new_pos.y - pane_part->rect.y;
+ // determine the pane rectangle by getting the pane part
+ wxAuiDockUIPart* pane_part = GetPanePart(pane.window);
+ wxASSERT_MSG(pane_part,
+ wxT("Pane border part not found -- shouldn't happen"));
- // determine the size of the dock, based on orientation
- if (dock.IsHorizontal())
- dock_pixels = dock.rect.GetWidth();
- else
- dock_pixels = dock.rect.GetHeight();
+ // determine the new pixel size that the user wants;
+ // this will help us recalculate the pane's proportion
+ if (dock.IsHorizontal())
+ new_pixsize = new_pos.x - pane_part->rect.x;
+ else
+ new_pixsize = new_pos.y - pane_part->rect.y;
- // determine the total proportion of all resizable panes,
- // and the total size of the dock minus the size of all
- // the fixed panes
- int i, dock_pane_count = dock.panes.GetCount();
- int pane_position = -1;
- for (i = 0; i < dock_pane_count; ++i)
+ // determine the size of the dock, based on orientation
+ if (dock.IsHorizontal())
+ dock_pixels = dock.rect.GetWidth();
+ else
+ dock_pixels = dock.rect.GetHeight();
+
+ // determine the total proportion of all resizable panes,
+ // and the total size of the dock minus the size of all
+ // the fixed panes
+ int i, dock_pane_count = dock.panes.GetCount();
+ int pane_position = -1;
+ for (i = 0; i < dock_pane_count; ++i)
+ {
+ wxAuiPaneInfo& p = *dock.panes.Item(i);
+ if (p.window == pane.window)
+ pane_position = i;
+
+ // while we're at it, subtract the pane sash
+ // width from the dock width, because this would
+ // skew our proportion calculations
+ if (i > 0)
+ dock_pixels -= sash_size;
+
+ // also, the whole size (including decorations) of
+ // all fixed panes must also be subtracted, because they
+ // are not part of the proportion calculation
+ if (p.IsFixed())
{
- wxAuiPaneInfo& p = *dock.panes.Item(i);
- if (p.window == pane.window)
- pane_position = i;
-
- // while we're at it, subtract the pane sash
- // width from the dock width, because this would
- // skew our proportion calculations
- if (i > 0)
- dock_pixels -= sash_size;
-
- // also, the whole size (including decorations) of
- // all fixed panes must also be subtracted, because they
- // are not part of the proportion calculation
- if (p.IsFixed())
- {
- if (dock.IsHorizontal())
- dock_pixels -= p.best_size.x;
- else
- dock_pixels -= p.best_size.y;
- }
+ if (dock.IsHorizontal())
+ dock_pixels -= p.best_size.x;
else
- {
- total_proportion += p.dock_proportion;
- }
+ dock_pixels -= p.best_size.y;
+ }
+ else
+ {
+ total_proportion += p.dock_proportion;
}
+ }
- // find a pane in our dock to 'steal' space from or to 'give'
- // space to -- this is essentially what is done when a pane is
- // resized; the pane should usually be the first non-fixed pane
- // to the right of the action pane
- int borrow_pane = -1;
- for (i = pane_position+1; i < dock_pane_count; ++i)
+ // find a pane in our dock to 'steal' space from or to 'give'
+ // space to -- this is essentially what is done when a pane is
+ // resized; the pane should usually be the first non-fixed pane
+ // to the right of the action pane
+ int borrow_pane = -1;
+ for (i = pane_position+1; i < dock_pane_count; ++i)
+ {
+ wxAuiPaneInfo& p = *dock.panes.Item(i);
+ if (!p.IsFixed())
{
- wxAuiPaneInfo& p = *dock.panes.Item(i);
- if (!p.IsFixed())
- {
- borrow_pane = i;
- break;
- }
+ borrow_pane = i;
+ break;
}
+ }
- // demand that the pane being resized is found in this dock
- // (this assert really never should be raised)
- wxASSERT_MSG(pane_position != -1, wxT("Pane not found in dock"));
+ // demand that the pane being resized is found in this dock
+ // (this assert really never should be raised)
+ wxASSERT_MSG(pane_position != -1, wxT("Pane not found in dock"));
- // prevent division by zero
- if (dock_pixels == 0 || total_proportion == 0 || borrow_pane == -1)
- {
- m_action = actionNone;
- return;
- }
+ // prevent division by zero
+ if (dock_pixels == 0 || total_proportion == 0 || borrow_pane == -1)
+ {
+ m_action = actionNone;
+ return false;
+ }
- // calculate the new proportion of the pane
- int new_proportion = (new_pixsize*total_proportion)/dock_pixels;
+ // calculate the new proportion of the pane
+ int new_proportion = (new_pixsize*total_proportion)/dock_pixels;
- // default minimum size
- int min_size = 0;
+ // default minimum size
+ int min_size = 0;
- // check against the pane's minimum size, if specified. please note
- // that this is not enough to ensure that the minimum size will
- // not be violated, because the whole frame might later be shrunk,
- // causing the size of the pane to violate it's minimum size
- if (pane.min_size.IsFullySpecified())
- {
- min_size = 0;
+ // check against the pane's minimum size, if specified. please note
+ // that this is not enough to ensure that the minimum size will
+ // not be violated, because the whole frame might later be shrunk,
+ // causing the size of the pane to violate it's minimum size
+ if (pane.min_size.IsFullySpecified())
+ {
+ min_size = 0;
- if (pane.HasBorder())
- min_size += (pane_border_size*2);
+ if (pane.HasBorder())
+ min_size += (pane_border_size*2);
- // calculate minimum size with decorations (border,caption)
- if (pane_part->orientation == wxVERTICAL)
- {
- min_size += pane.min_size.y;
- if (pane.HasCaption())
- min_size += caption_size;
- }
- else
- {
- min_size += pane.min_size.x;
- }
+ // calculate minimum size with decorations (border,caption)
+ if (pane_part->orientation == wxVERTICAL)
+ {
+ min_size += pane.min_size.y;
+ if (pane.HasCaption())
+ min_size += caption_size;
}
+ else
+ {
+ min_size += pane.min_size.x;
+ }
+ }
- // for some reason, an arithmatic error somewhere is causing
- // the proportion calculations to always be off by 1 pixel;
- // for now we will add the 1 pixel on, but we really should
- // determine what's causing this.
- min_size++;
+ // for some reason, an arithmatic error somewhere is causing
+ // the proportion calculations to always be off by 1 pixel;
+ // for now we will add the 1 pixel on, but we really should
+ // determine what's causing this.
+ min_size++;
- int min_proportion = (min_size*total_proportion)/dock_pixels;
+ int min_proportion = (min_size*total_proportion)/dock_pixels;
- if (new_proportion < min_proportion)
- new_proportion = min_proportion;
+ if (new_proportion < min_proportion)
+ new_proportion = min_proportion;
- int prop_diff = new_proportion - pane.dock_proportion;
+ int prop_diff = new_proportion - pane.dock_proportion;
- // borrow the space from our neighbor pane to the
- // right or bottom (depending on orientation)
- dock.panes.Item(borrow_pane)->dock_proportion -= prop_diff;
- pane.dock_proportion = new_proportion;
+ // borrow the space from our neighbor pane to the
+ // right or bottom (depending on orientation)
+ dock.panes.Item(borrow_pane)->dock_proportion -= prop_diff;
+ pane.dock_proportion = new_proportion;
- // repaint
- Update();
- Repaint(NULL);
+ // repaint
+ Update();
+ Repaint(NULL);
+ }
+
+ return true;
+}
+
+void wxAuiManager::OnLeftUp(wxMouseEvent& event)
+{
+ if (m_action == actionResize)
+ {
+ m_frame->ReleaseMouse();
+
+ if (!wxAuiManager_HasLiveResize(*this))
+ {
+ // get rid of the hint rectangle
+ wxScreenDC dc;
+ DrawResizeHint(dc, m_action_hintrect);
}
+ if (m_currentDragItem != -1 && wxAuiManager_HasLiveResize(*this))
+ m_action_part = & (m_uiparts.Item(m_currentDragItem));
+
+ DoEndResizeAction(event);
+
+ m_currentDragItem = -1;
+
}
else if (m_action == actionClickButton)
{
m_hover_button = NULL;
m_frame->ReleaseMouse();
-
+
if (m_action_part)
{
UpdateButtonOnScreen(m_action_part, event);
if (m_action == actionResize)
{
+ // It's necessary to reset m_action_part since it destroyed
+ // by the Update within DoEndResizeAction.
+ if (m_currentDragItem != -1)
+ m_action_part = & (m_uiparts.Item(m_currentDragItem));
+ else
+ m_currentDragItem = m_uiparts.Index(* m_action_part);
+
if (m_action_part)
{
wxPoint pos = m_action_part->rect.GetPosition();
else
pos.x = wxMax(0, event.m_x - m_action_offset.x);
- wxRect rect(m_frame->ClientToScreen(pos),
- m_action_part->rect.GetSize());
-
- wxScreenDC dc;
- if (!m_action_hintrect.IsEmpty())
- DrawResizeHint(dc, m_action_hintrect);
- DrawResizeHint(dc, rect);
- m_action_hintrect = rect;
+ if (wxAuiManager_HasLiveResize(*this))
+ {
+ m_frame->ReleaseMouse();
+ DoEndResizeAction(event);
+ m_frame->CaptureMouse();
+ }
+ else
+ {
+ wxRect rect(m_frame->ClientToScreen(pos),
+ m_action_part->rect.GetSize());
+ wxScreenDC dc;
+
+ if (!m_action_hintrect.IsEmpty())
+ DrawResizeHint(dc, m_action_hintrect);
+ DrawResizeHint(dc, rect);
+ m_action_hintrect = rect;
+ }
}
}
else if (m_action == actionClickCaption)
wxAuiPaneInfo& pane = GetPane(m_action_window);
wxASSERT_MSG(pane.IsOk(), wxT("Pane window not found"));
- pane.state |= wxAuiPaneInfo::actionPane;
+ pane.SetFlag(wxAuiPaneInfo::actionPane, true);
wxPoint pt = event.GetPosition();
DoDrop(m_docks, m_panes, pane, pt, m_action_offset);