#include "wx/aui/floatpane.h"
#ifndef WX_PRECOMP
+ #include "wx/panel.h"
#include "wx/settings.h"
#include "wx/app.h"
#include "wx/dcclient.h"
int h=100;
GetClientSize(&w, &h);
- m_MaxWidth = w;
+ m_MaxWidth = w;
m_MaxHeight = h;
m_Amount = alpha;
m_Region.Clear();
}
m_lastWidth = event.GetSize().GetWidth();
m_lastHeight = event.GetSize().GetHeight();
-
+
SetTransparent(m_Amount);
m_Region.Intersect(0, 0, event.GetSize().GetWidth(),
event.GetSize().GetHeight());
}
private:
- int m_Amount;
+ wxByte m_Amount;
int m_MaxWidth;
int m_MaxHeight;
bool m_CanSetShape;
m_art = new wxDefaultDockArt;
m_hint_wnd = NULL;
m_flags = flags;
+ m_skipping = false;
if (managed_wnd)
{
delete m_art;
}
+// Creates a floating frame for the windows
+wxFloatingPane * wxFrameManager::CreateFloatingFrame(wxWindow* parent, const wxPaneInfo& p)
+{
+ return new wxFloatingPane(parent, this, p);
+}
+
// GetPane() looks up a wxPaneInfo structure based
// on the supplied window pointer. Upon failure, GetPane()
// returns an empty wxPaneInfo, a condition which can be checked
continue;
// if the point is inside the rectangle, we have a hit
- if (item->rect.Inside(x,y))
+ if (item->rect.Contains(x,y))
result = item;
}
return false;
}
+// ClosePane() destroys or hides the pane depending on its
+// flags
+void wxFrameManager::ClosePane(wxPaneInfo& pane_info)
+{
+ // first, hide the window
+ if (pane_info.window && pane_info.window->IsShown()) {
+ pane_info.window->Show(false);
+ }
+
+ // make sure that we are the parent of this window
+ if(pane_info.window && pane_info.window->GetParent() != m_frame) {
+ pane_info.window->Reparent(m_frame);
+ }
+
+ // if we have a frame, destroy it
+ if(pane_info.frame) {
+ pane_info.frame->Destroy();
+ pane_info.frame = NULL;
+ }
+
+ // now we need to either destroy or hide the pane
+ if(pane_info.IsDestroyOnClose())
+ {
+ wxWindow * window = pane_info.window;
+ DetachPane(window);
+ if(window) {
+ window->Destroy();
+ }
+ }
+ else
+ {
+ pane_info.Hide();
+ }
+}
// EscapeDelimiters() changes ";" into "\;" and "|" into "\|"
// in the input string. This is an internal functions which is
val_name.Trim(false);
value.Trim(true);
value.Trim(false);
-
+
if (val_name.empty())
break;
-
+
if (val_name == wxT("name"))
pane.name = value;
else if (val_name == wxT("caption"))
{
// we need to create a frame for this
// pane, which has recently been floated
- wxFloatingPane* frame = new wxFloatingPane(m_frame,
- this,
- p);
+ wxFloatingPane* frame = CreateFloatingFrame(m_frame, p);
#if wxCHECK_VERSION(2,7,0)
// on MSW and Mac, if the owner desires transparent dragging, and
if (pt.x < layer_insert_offset &&
pt.x > layer_insert_offset-auiLayerInsertPixels)
{
- int new_layer = wxMax(wxMax(GetMaxLayer(docks, wxAUI_DOCK_LEFT),
- GetMaxLayer(docks, wxAUI_DOCK_BOTTOM)),
- GetMaxLayer(docks, wxAUI_DOCK_TOP)) + 1;
drop.Dock().Left().
- Layer(new_layer).
Row(0).
Position(pt.y - GetDockPixelOffset(drop) - offset.y);
return ProcessDockResult(target, drop);
else if (pt.y < layer_insert_offset &&
pt.y > layer_insert_offset-auiLayerInsertPixels)
{
- int new_layer = wxMax(wxMax(GetMaxLayer(docks, wxAUI_DOCK_TOP),
- GetMaxLayer(docks, wxAUI_DOCK_LEFT)),
- GetMaxLayer(docks, wxAUI_DOCK_RIGHT)) + 1;
drop.Dock().Top().
- Layer(new_layer).
Row(0).
Position(pt.x - GetDockPixelOffset(drop) - offset.x);
return ProcessDockResult(target, drop);
else if (pt.x >= cli_size.x - layer_insert_offset &&
pt.x < cli_size.x - layer_insert_offset + auiLayerInsertPixels)
{
- int new_layer = wxMax(wxMax(GetMaxLayer(docks, wxAUI_DOCK_RIGHT),
- GetMaxLayer(docks, wxAUI_DOCK_TOP)),
- GetMaxLayer(docks, wxAUI_DOCK_BOTTOM)) + 1;
drop.Dock().Right().
- Layer(new_layer).
Row(0).
Position(pt.y - GetDockPixelOffset(drop) - offset.y);
return ProcessDockResult(target, drop);
else if (pt.y >= cli_size.y - layer_insert_offset &&
pt.y < cli_size.y - layer_insert_offset + auiLayerInsertPixels)
{
- int new_layer = wxMax(wxMax(GetMaxLayer(docks, wxAUI_DOCK_BOTTOM),
- GetMaxLayer(docks, wxAUI_DOCK_LEFT)),
- GetMaxLayer(docks, wxAUI_DOCK_RIGHT)) + 1;
+ int new_layer = wxMax( wxMax( GetMaxLayer(docks, wxAUI_DOCK_BOTTOM),
+ GetMaxLayer(docks, wxAUI_DOCK_LEFT)),
+ GetMaxLayer(docks, wxAUI_DOCK_RIGHT)) + 1;
+
drop.Dock().Bottom().
Layer(new_layer).
Row(0).
return ProcessDockResult(target, drop);
}
-
wxDockUIPart* part = HitTest(pt.x, pt.y);
if (!part || !part->dock)
return false;
-
// calculate the offset from where the dock begins
// to the point where the user dropped the pane
int dock_drop_offset = 0;
// should float if being dragged over center pane windows
if (!part->dock->fixed || part->dock->dock_direction == wxAUI_DOCK_CENTER)
{
- if ((m_flags & wxAUI_MGR_ALLOW_FLOATING) &&
+ if (m_last_rect.IsEmpty() || m_last_rect.Contains(pt.x, pt.y ))
+ {
+ m_skipping = true;
+ }
+ else
+ {
+ if ((m_flags & wxAUI_MGR_ALLOW_FLOATING) &&
(drop.IsFloatable() ||
(part->dock->dock_direction != wxAUI_DOCK_CENTER &&
part->dock->dock_direction != wxAUI_DOCK_NONE)))
- {
- drop.Float();
+ {
+ drop.Float();
+ }
+
+ m_skipping = false;
+
+ return ProcessDockResult(target, drop);
}
+ drop.Position(pt.x - GetDockPixelOffset(drop) - offset.x);
+
return ProcessDockResult(target, drop);
}
+ else
+ {
+ m_skipping = false;
+ }
+
+ if (!m_skipping)
+ {
+ m_last_rect = part->dock->rect;
+ m_last_rect.Inflate( 15, 15 );
+ }
drop.Dock().
Direction(part->dock->dock_direction).
Position(dock_drop_offset);
if ((
- ((pt.y < part->dock->rect.y + 2) && part->dock->IsHorizontal()) ||
- ((pt.x < part->dock->rect.x + 2) && part->dock->IsVertical())
+ ((pt.y < part->dock->rect.y + 1) && part->dock->IsHorizontal()) ||
+ ((pt.x < part->dock->rect.x + 1) && part->dock->IsVertical())
) && part->dock->panes.GetCount() > 1)
{
- int row = drop.dock_row;
- DoInsertDockRow(panes, part->dock->dock_direction,
- part->dock->dock_layer,
- part->dock->dock_row);
- drop.dock_row = row;
+ if ((part->dock->dock_direction == wxAUI_DOCK_TOP) ||
+ (part->dock->dock_direction == wxAUI_DOCK_LEFT))
+ {
+ int row = drop.dock_row;
+ DoInsertDockRow(panes, part->dock->dock_direction,
+ part->dock->dock_layer,
+ part->dock->dock_row);
+ drop.dock_row = row;
+ }
+ else
+ {
+ DoInsertDockRow(panes, part->dock->dock_direction,
+ part->dock->dock_layer,
+ part->dock->dock_row+1);
+ drop.dock_row = part->dock->dock_row+1;
+ }
}
if ((
((pt.x > part->dock->rect.x + part->dock->rect.width - 2 ) && part->dock->IsVertical())
) && part->dock->panes.GetCount() > 1)
{
- DoInsertDockRow(panes, part->dock->dock_direction,
- part->dock->dock_layer,
- part->dock->dock_row+1);
- drop.dock_row = part->dock->dock_row+1;
+ if ((part->dock->dock_direction == wxAUI_DOCK_TOP) ||
+ (part->dock->dock_direction == wxAUI_DOCK_LEFT))
+ {
+ DoInsertDockRow(panes, part->dock->dock_direction,
+ part->dock->dock_layer,
+ part->dock->dock_row+1);
+ drop.dock_row = part->dock->dock_row+1;
+ }
+ else
+ {
+ int row = drop.dock_row;
+ DoInsertDockRow(panes, part->dock->dock_direction,
+ part->dock->dock_layer,
+ part->dock->dock_row);
+ drop.dock_row = row;
+ }
}
return ProcessDockResult(target, drop);
m_hint_fadeamt = 0;
m_hint_wnd->SetSize(rect);
-
+
if (! m_hint_wnd->IsShown())
m_hint_wnd->Show();
wxPoint pt = ::wxGetMousePosition();
#if 0
- // Adapt pt to direction
+ // Adapt pt to direction
if (dir == wxNORTH)
{
// move to pane's upper border
pos = wnd->ClientToScreen( pos );
pt.y = pos.y;
}
+#else
+ wxUnusedVar(dir);
#endif
wxPoint client_pt = m_frame->ScreenToClient(pt);
wxPoint pt = ::wxGetMousePosition();
#if 0
- // Adapt pt to direction
+ // Adapt pt to direction
if (dir == wxNORTH)
{
// move to pane's upper border
pos = wnd->ClientToScreen( pos );
pt.y = pos.y;
}
+#else
+ wxUnusedVar(dir);
#endif
wxPoint client_pt = m_frame->ScreenToClient(pt);
evt.Veto();
return;
}
- else
+ else
{
- // reparent the pane window back to us and
- // prepare the frame window for destruction
- if (pane.window->IsShown())
- pane.window->Show(false);
- pane.window->Reparent(m_frame);
- pane.frame = NULL;
- pane.Hide();
+ ClosePane(pane);
}
}
{
case wxDockUIPart::typeDockSizer:
case wxDockUIPart::typePaneSizer:
- m_art->DrawSash(*dc, part.orientation, part.rect);
+ m_art->DrawSash(*dc, m_frame, part.orientation, part.rect);
break;
case wxDockUIPart::typeBackground:
- m_art->DrawBackground(*dc, part.orientation, part.rect);
+ m_art->DrawBackground(*dc, m_frame, part.orientation, part.rect);
break;
case wxDockUIPart::typeCaption:
- m_art->DrawCaption(*dc, part.pane->caption, part.rect, *part.pane);
+ m_art->DrawCaption(*dc, m_frame, part.pane->caption, part.rect, *part.pane);
break;
case wxDockUIPart::typeGripper:
- m_art->DrawGripper(*dc, part.rect, *part.pane);
+ m_art->DrawGripper(*dc, m_frame, part.rect, *part.pane);
break;
case wxDockUIPart::typePaneBorder:
- m_art->DrawBorder(*dc, part.rect, *part.pane);
+ m_art->DrawBorder(*dc, m_frame, part.rect, *part.pane);
break;
case wxDockUIPart::typePaneButton:
- m_art->DrawPaneButton(*dc, part.button->button_id,
+ m_art->DrawPaneButton(*dc, m_frame, part.button->button_id,
wxAUI_BUTTON_STATE_NORMAL, part.rect, *part.pane);
break;
}
if (pt.x != 0 || pt.y != 0)
cdc.SetDeviceOrigin(pt.x, pt.y);
- m_art->DrawPaneButton(cdc,
+ m_art->DrawPaneButton(cdc, m_frame,
button_ui_part->button->button_id,
state,
button_ui_part->rect,
if (!e.GetVeto())
{
- pane.Hide();
+ ClosePane(pane);
Update();
}
}