wxFloatingPane::wxFloatingPane(wxWindow* parent,
wxFrameManager* owner_mgr,
const wxPaneInfo& pane,
- wxWindowID id /*= wxID_ANY*/)
+ wxWindowID id /*= wxID_ANY*/,
+ long style /*=wxRESIZE_BORDER | wxSYSTEM_MENU | wxCAPTION |
+ wxFRAME_NO_TASKBAR | wxFRAME_FLOAT_ON_PARENT |
+ wxCLIP_CHILDREN
+ */)
: wxFloatingPaneBaseClass(parent, id, wxEmptyString,
pane.floating_pos, pane.floating_size,
- wxRESIZE_BORDER | wxSYSTEM_MENU | wxCAPTION |
- wxCLOSE_BOX | wxFRAME_NO_TASKBAR |
- wxFRAME_FLOAT_ON_PARENT | wxCLIP_CHILDREN |
+ style |
+ (pane.HasCloseButton()?wxCLOSE_BOX:0) |
(pane.IsFixed()?0:wxRESIZE_BORDER)
)
{
m_owner_mgr = owner_mgr;
m_moving = false;
- m_last_rect = wxRect();
- m_mgr.SetFrame(this);
+ m_mgr.SetManagedWindow(this);
SetExtraStyle(wxWS_EX_PROCESS_IDLE);
}
PaneBorder(false).
Layer(0).Row(0).Position(0);
+ // Carry over the minimum size
+ SetMinSize(pane.window->GetMinSize());
+
m_mgr.AddPane(m_pane_window, contained_pane);
m_mgr.Update();
m_owner_mgr->OnFloatingPaneResized(m_pane_window, event.GetSize());
}
-void wxFloatingPane::OnClose(wxCloseEvent& WXUNUSED(event))
+void wxFloatingPane::OnClose(wxCloseEvent& evt)
{
- static wxList s_closing;
-
- if (!s_closing.Member(this))
- {
- s_closing.Append(this);
-
- wxCommandEvent cancelEvent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
- cancelEvent.SetEventObject( m_pane_window );
- m_pane_window->GetEventHandler()->ProcessEvent(cancelEvent);
- s_closing.DeleteObject(this);
- // we should really return here without doing anything if the close was vetoed
- }
-
- // The problem here is that the above can cause the window itself to be destroyed
- if (!IsBeingDeleted() && m_pane_window && !m_pane_window->IsBeingDeleted()
- && (m_pane_window->GetParent()==this))
- {
- m_owner_mgr->OnFloatingPaneClosed(m_pane_window);
+ m_owner_mgr->OnFloatingPaneClosed(m_pane_window, evt);
+ if (!evt.GetVeto())
Destroy();
- }
}
void wxFloatingPane::OnMoveEvent(wxMoveEvent& event)
{
wxRect win_rect = GetRect();
+ if (win_rect == m_last_rect)
+ return;
+
// skip the first move event
if (m_last_rect.IsEmpty())
{
return;
}
+ // skip if moving too fast to avoid massive redraws and
+ // jumping hint windows
+ if ((abs(win_rect.x - m_last_rect.x) > 3) ||
+ (abs(win_rect.y - m_last_rect.y) > 3))
+ {
+ m_last3_rect = m_last2_rect;
+ m_last2_rect = m_last_rect;
+ m_last_rect = win_rect;
+ return;
+ }
+
// prevent frame redocking during resize
if (m_last_rect.GetSize() != win_rect.GetSize())
{
+ m_last3_rect = m_last2_rect;
+ m_last2_rect = m_last_rect;
m_last_rect = win_rect;
return;
}
+ wxDirection dir = wxALL;
+
+ int horiz_dist = abs(win_rect.x - m_last3_rect.x);
+ int vert_dist = abs(win_rect.y - m_last3_rect.y);
+
+ if (vert_dist >= horiz_dist)
+ {
+ if (win_rect.y < m_last3_rect.y)
+ dir = wxNORTH;
+ else
+ dir = wxSOUTH;
+ }
+ else
+ {
+ if (win_rect.x < m_last3_rect.x)
+ dir = wxWEST;
+ else
+ dir = wxEAST;
+ }
+
+ m_last3_rect = m_last2_rect;
+ m_last2_rect = m_last_rect;
m_last_rect = win_rect;
if (!isMouseDown())
m_moving = true;
}
- OnMoving(event.GetRect());
+ if (m_last3_rect.IsEmpty())
+ return;
+
+ OnMoving(event.GetRect(), dir );
}
void wxFloatingPane::OnIdle(wxIdleEvent& event)
m_owner_mgr->OnFloatingPaneMoveStart(m_pane_window);
}
-void wxFloatingPane::OnMoving(const wxRect& WXUNUSED(window_rect))
+void wxFloatingPane::OnMoving(const wxRect& WXUNUSED(window_rect), wxDirection dir)
{
// notify the owner manager that the pane is moving
- m_owner_mgr->OnFloatingPaneMoving(m_pane_window);
+ m_owner_mgr->OnFloatingPaneMoving(m_pane_window, dir);
+ m_lastDirection = dir;
}
void wxFloatingPane::OnMoveFinished()
{
// notify the owner manager that the pane has finished moving
- m_owner_mgr->OnFloatingPaneMoved(m_pane_window);
+ m_owner_mgr->OnFloatingPaneMoved(m_pane_window, m_lastDirection);
}
void wxFloatingPane::OnActivate(wxActivateEvent& event)