wxAuiPaneInfo wxAuiNullPaneInfo;
wxAuiDockInfo wxAuiNullDockInfo;
-DEFINE_EVENT_TYPE(wxEVT_AUI_PANEBUTTON)
-DEFINE_EVENT_TYPE(wxEVT_AUI_PANECLOSE)
-DEFINE_EVENT_TYPE(wxEVT_AUI_PANEMAXIMIZE)
-DEFINE_EVENT_TYPE(wxEVT_AUI_PANERESTORE)
+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_FINDMANAGER)
+DEFINE_EVENT_TYPE(wxEVT_AUI_FIND_MANAGER)
#ifdef __WXMAC__
// a few defines to avoid nameclashes
IMPLEMENT_DYNAMIC_CLASS(wxAuiManagerEvent, wxEvent)
IMPLEMENT_CLASS(wxAuiManager, wxEvtHandler)
-// private manager flags (not yet on the public API)
-enum wxAuiPrivateManagerOption
-{
- wxAUI_MGR_NO_DOCK_SIZE_LIMIT = 1 << 28
-};
const int auiToolBarLayer = 10;
BEGIN_EVENT_TABLE(wxAuiManager, wxEvtHandler)
- EVT_AUI_PANEBUTTON(wxAuiManager::OnPaneButton)
+ EVT_AUI_PANE_BUTTON(wxAuiManager::OnPaneButton)
EVT_AUI_RENDER(wxAuiManager::OnRender)
EVT_PAINT(wxAuiManager::OnPaint)
EVT_ERASE_BACKGROUND(wxAuiManager::OnEraseBackground)
EVT_MOTION(wxAuiManager::OnMotion)
EVT_LEAVE_WINDOW(wxAuiManager::OnLeaveWindow)
EVT_CHILD_FOCUS(wxAuiManager::OnChildFocus)
- EVT_AUI_FINDMANAGER(wxAuiManager::OnFindManager)
+ EVT_AUI_FIND_MANAGER(wxAuiManager::OnFindManager)
EVT_TIMER(101, wxAuiManager::OnHintFadeTimer)
END_EVENT_TABLE()
m_skipping = false;
m_has_maximized = false;
m_frame = NULL;
+ m_dock_constraint_x = 0.3;
+ m_dock_constraint_y = 0.3;
if (managed_wnd)
{
// need to be managed by the manager itself.
wxAuiManager* wxAuiManager::GetManager(wxWindow* window)
{
- wxAuiManagerEvent evt(wxEVT_AUI_FINDMANAGER);
+ wxAuiManagerEvent evt(wxEVT_AUI_FIND_MANAGER);
evt.SetManager(NULL);
evt.ResumePropagation(wxEVENT_PROPAGATE_MAX);
if (!window->ProcessEvent(evt))
if (!window)
return false;
- // check if the pane already exists
+ // check if the window is already managed by us
if (GetPane(pane_info.window).IsOk())
return false;
+ // check if the pane name already exists, this could reveal a
+ // bug in the library user's application
+ bool already_exists = false;
+ if (!pane_info.name.empty() && GetPane(pane_info.name).IsOk())
+ {
+ wxFAIL_MSG(wxT("A pane with that name already exists in the manager!"));
+ already_exists = true;
+ }
+
// if the new pane is docked then we should undo maximize
if (pane_info.IsDocked())
RestoreMaximizedPane();
// set the pane window
pinfo.window = window;
+
// if the pane's name identifier is blank, create a random string
- if (pinfo.name.empty())
+ if (pinfo.name.empty() || already_exists)
{
pinfo.name.Printf(wxT("%08lx%08x%08x%08lx"),
((unsigned long)pinfo.window) & 0xffffffff,
}
}
- if (!(m_flags & wxAUI_MGR_NO_DOCK_SIZE_LIMIT))
- {
- // new dock's size may not be more than 1/3 of the frame size
- if (dock.IsHorizontal())
- size = wxMin(size, cli_size.y/3);
- else
- size = wxMin(size, cli_size.x/3);
- }
+
+ // new dock's size may not be more than the dock constraint
+ // parameter specifies. See SetDockSizeConstraint()
+ int max_dock_x_size = (int)(m_dock_constraint_x * ((double)cli_size.x));
+ int max_dock_y_size = (int)(m_dock_constraint_y * ((double)cli_size.y));
+
+ if (dock.IsHorizontal())
+ size = wxMin(size, max_dock_y_size);
+ else
+ size = wxMin(size, max_dock_x_size);
+
+ // absolute minimum size for a dock is 10 pixels
if (size < 10)
size = 10;
+
dock.size = size;
}
}
+// SetDockSizeConstraint() allows the dock constraints to be set. For example,
+// specifying values of 0.5, 0.5 will mean that upon dock creation, a dock may
+// not be larger than half of the window's size
+
+void wxAuiManager::SetDockSizeConstraint(double width_pct, double height_pct)
+{
+ m_dock_constraint_x = wxMax(0.0, wxMin(1.0, width_pct));
+ m_dock_constraint_y = wxMax(0.0, wxMin(1.0, height_pct));
+}
+
+void wxAuiManager::GetDockSizeConstraint(double* width_pct, double* height_pct) const
+{
+ if (width_pct)
+ *width_pct = m_dock_constraint_x;
+
+ if (height_pct)
+ *height_pct = m_dock_constraint_y;
+}
+
+
+
// Update() updates the layout. Whenever changes are made to
// one or more panes, this function should be called. It is the
// external entry point for running the layout engine.
// fire pane close event
- wxAuiManagerEvent e(wxEVT_AUI_PANECLOSE);
+ wxAuiManagerEvent e(wxEVT_AUI_PANE_CLOSE);
e.SetPane(&pane);
e.SetCanVeto(evt.CanVeto());
ProcessMgrEvent(e);
else if (part->type == wxAuiDockUIPart::typeCaption ||
part->type == wxAuiDockUIPart::typeGripper)
{
+ // if we are managing a wxAuiFloatingFrame window, then
+ // we are an embedded wxAuiManager inside the wxAuiFloatingFrame.
+ // We want to initiate a toolbar drag in our owner manager
+ wxWindow* managed_wnd = GetManagedWindow();
+
+ if (part->pane &&
+ part->pane->window &&
+ managed_wnd &&
+ managed_wnd->IsKindOf(CLASSINFO(wxAuiFloatingFrame)))
+ {
+ wxAuiFloatingFrame* floating_frame = (wxAuiFloatingFrame*)managed_wnd;
+ wxAuiManager* owner_mgr = floating_frame->GetOwnerManager();
+ owner_mgr->StartPaneDrag(part->pane->window,
+ wxPoint(event.m_x - part->rect.x,
+ event.m_y - part->rect.y));
+ return;
+ }
+
+
+
if (part->dock && part->dock->dock_direction == wxAUI_DOCK_CENTER)
return;
if (m_action_part == HitTest(event.GetX(), event.GetY()))
{
// fire button-click event
- wxAuiManagerEvent e(wxEVT_AUI_PANEBUTTON);
+ wxAuiManagerEvent e(wxEVT_AUI_PANE_BUTTON);
e.SetManager(this);
e.SetPane(m_action_part->pane);
e.SetButton(m_action_part->button->button_id);
if (evt.button == wxAUI_BUTTON_CLOSE)
{
// fire pane close event
- wxAuiManagerEvent e(wxEVT_AUI_PANECLOSE);
+ wxAuiManagerEvent e(wxEVT_AUI_PANE_CLOSE);
e.SetManager(this);
e.SetPane(evt.pane);
ProcessMgrEvent(e);
else if (evt.button == wxAUI_BUTTON_MAXIMIZE_RESTORE && !pane.IsMaximized())
{
// fire pane close event
- wxAuiManagerEvent e(wxEVT_AUI_PANEMAXIMIZE);
+ wxAuiManagerEvent e(wxEVT_AUI_PANE_MAXIMIZE);
e.SetManager(this);
e.SetPane(evt.pane);
ProcessMgrEvent(e);
else if (evt.button == wxAUI_BUTTON_MAXIMIZE_RESTORE && pane.IsMaximized())
{
// fire pane close event
- wxAuiManagerEvent e(wxEVT_AUI_PANERESTORE);
+ wxAuiManagerEvent e(wxEVT_AUI_PANE_RESTORE);
e.SetManager(this);
e.SetPane(evt.pane);
ProcessMgrEvent(e);