// Name: topluniv.cpp
// Author: Vaclav Slavik
// Id: $Id$
-// Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com)
+// Copyright: (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com)
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
BEGIN_EVENT_TABLE(wxTopLevelWindow, wxTopLevelWindowNative)
WX_EVENT_TABLE_INPUT_CONSUMER(wxTopLevelWindow)
EVT_NC_PAINT(wxTopLevelWindow::OnNcPaint)
+ EVT_MENU_RANGE(wxID_CLOSE_FRAME, wxID_RESTORE_FRAME, wxTopLevelWindow::OnSystemMenu)
END_EVENT_TABLE()
WX_FORWARD_TO_INPUT_CONSUMER(wxTopLevelWindow)
return m_renderer->HitTestFrame(rect, pt+GetClientAreaOrigin(), GetDecorationsStyle());
}
+int wxTopLevelWindow::GetMinWidth() const
+{
+ if ( ms_drawDecorations )
+ {
+ return wxMax(wxTopLevelWindowNative::GetMinWidth(),
+ m_renderer->GetFrameMinSize(GetDecorationsStyle()).x);
+ }
+ else
+ return wxTopLevelWindowNative::GetMinWidth();
+}
+
+int wxTopLevelWindow::GetMinHeight() const
+{
+ if ( ms_drawDecorations )
+ {
+ return wxMax(wxTopLevelWindowNative::GetMinHeight(),
+ m_renderer->GetFrameMinSize(GetDecorationsStyle()).y);
+ }
+ else
+ return wxTopLevelWindowNative::GetMinHeight();
+}
+
// ----------------------------------------------------------------------------
// icons
// ----------------------------------------------------------------------------
// interactive manipulation
// ----------------------------------------------------------------------------
+
+static bool wxGetResizingCursor(long hitTestResult, wxCursor& cursor)
+{
+ if ( hitTestResult & wxHT_TOPLEVEL_ANY_BORDER )
+ {
+ switch (hitTestResult)
+ {
+ case wxHT_TOPLEVEL_BORDER_N:
+ case wxHT_TOPLEVEL_BORDER_S:
+ cursor = wxCursor(wxCURSOR_SIZENS);
+ break;
+ case wxHT_TOPLEVEL_BORDER_W:
+ case wxHT_TOPLEVEL_BORDER_E:
+ cursor = wxCursor(wxCURSOR_SIZEWE);
+ break;
+ case wxHT_TOPLEVEL_BORDER_NE:
+ case wxHT_TOPLEVEL_BORDER_SW:
+ cursor = wxCursor(wxCURSOR_SIZENESW);
+ break;
+ case wxHT_TOPLEVEL_BORDER_NW:
+ case wxHT_TOPLEVEL_BORDER_SE:
+ cursor = wxCursor(wxCURSOR_SIZENWSE);
+ break;
+ default:
+ return FALSE;
+ break;
+ }
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
#define wxINTERACTIVE_RESIZE_DIR \
(wxINTERACTIVE_RESIZE_W | wxINTERACTIVE_RESIZE_E | \
wxINTERACTIVE_RESIZE_S | wxINTERACTIVE_RESIZE_N)
struct wxInteractiveMoveData
{
- wxTopLevelWindowBase *m_window;
+ wxTopLevelWindow *m_window;
wxEventLoop *m_evtLoop;
int m_flags;
wxRect m_rect;
wxRect m_rectOrig;
wxPoint m_pos;
wxSize m_minSize, m_maxSize;
+ bool m_sizingCursor;
};
class wxInteractiveMoveHandler : public wxEvtHandler
{
if ( m_data.m_flags & wxINTERACTIVE_WAIT_FOR_INPUT )
{
- m_data.m_flags &= ~wxINTERACTIVE_WAIT_FOR_INPUT;
- m_data.m_pos = wxGetMousePosition();
+ m_data.m_evtLoop->Exit();
}
}
void wxInteractiveMoveHandler::OnKeyDown(wxKeyEvent& event)
{
- if ( m_data.m_flags & wxINTERACTIVE_WAIT_FOR_INPUT )
- {
- m_data.m_flags &= ~wxINTERACTIVE_WAIT_FOR_INPUT;
- m_data.m_pos = wxGetMousePosition();
- }
-
wxPoint diff(-1,-1);
switch ( event.GetKeyCode() )
if ( diff.x != -1 )
{
+ if ( m_data.m_flags & wxINTERACTIVE_WAIT_FOR_INPUT )
+ {
+ m_data.m_flags &= ~wxINTERACTIVE_WAIT_FOR_INPUT;
+ if ( m_data.m_sizingCursor )
+ {
+ wxEndBusyCursor();
+ m_data.m_sizingCursor = FALSE;
+ }
+
+ if ( m_data.m_flags & wxINTERACTIVE_MOVE )
+ {
+ m_data.m_pos = m_data.m_window->GetPosition() +
+ wxPoint(m_data.m_window->GetSize().x/2, 8);
+ }
+ }
+
+ wxPoint warp;
+ bool changeCur = FALSE;
+
if ( m_data.m_flags & wxINTERACTIVE_MOVE )
{
m_data.m_rect.Offset(diff);
m_data.m_window->Move(m_data.m_rect.GetPosition());
+ warp = wxPoint(m_data.m_window->GetSize().x/2, 8);
}
else /* wxINTERACTIVE_RESIZE */
{
- if ( !(m_data.m_flags & wxINTERACTIVE_RESIZE_DIR) )
+ if ( !(m_data.m_flags &
+ (wxINTERACTIVE_RESIZE_N | wxINTERACTIVE_RESIZE_S)) )
{
if ( diff.y < 0 )
+ {
m_data.m_flags |= wxINTERACTIVE_RESIZE_N;
+ m_data.m_pos.y = m_data.m_window->GetPosition().y;
+ changeCur = TRUE;
+ }
else if ( diff.y > 0 )
+ {
m_data.m_flags |= wxINTERACTIVE_RESIZE_S;
+ m_data.m_pos.y = m_data.m_window->GetPosition().y +
+ m_data.m_window->GetSize().y;
+ changeCur = TRUE;
+ }
+ }
+ if ( !(m_data.m_flags &
+ (wxINTERACTIVE_RESIZE_W | wxINTERACTIVE_RESIZE_E)) )
+ {
if ( diff.x < 0 )
+ {
m_data.m_flags |= wxINTERACTIVE_RESIZE_W;
+ m_data.m_pos.x = m_data.m_window->GetPosition().x;
+ changeCur = TRUE;
+ }
else if ( diff.x > 0 )
+ {
m_data.m_flags |= wxINTERACTIVE_RESIZE_E;
+ m_data.m_pos.x = m_data.m_window->GetPosition().x +
+ m_data.m_window->GetSize().x;
+ changeCur = TRUE;
+ }
}
wxApplyResize(m_data, diff);
m_data.m_window->SetSize(m_data.m_rect);
+
+ if ( m_data.m_flags & wxINTERACTIVE_RESIZE_W )
+ warp.x = 0;
+ else if ( m_data.m_flags & wxINTERACTIVE_RESIZE_E )
+ warp.x = m_data.m_window->GetSize().x-1;
+ else
+ warp.x = wxGetMousePosition().x - m_data.m_window->GetPosition().x;
+
+ if ( m_data.m_flags & wxINTERACTIVE_RESIZE_N )
+ warp.y = 0;
+ else if ( m_data.m_flags & wxINTERACTIVE_RESIZE_S )
+ warp.y = m_data.m_window->GetSize().y-1;
+ else
+ warp.y = wxGetMousePosition().y - m_data.m_window->GetPosition().y;
+ }
+
+ warp -= m_data.m_window->GetClientAreaOrigin();
+ m_data.m_window->WarpPointer(warp.x, warp.y);
+
+ if ( changeCur )
+ {
+ long hit = m_data.m_window->HitTest(warp);
+ wxCursor cur;
+ if ( wxGetResizingCursor(hit, cur) )
+ {
+ if ( m_data.m_sizingCursor )
+ wxEndBusyCursor();
+ wxBeginBusyCursor(&cur);
+ m_data.m_sizingCursor = TRUE;
+ }
}
}
}
wxInteractiveMoveData data;
wxEventLoop loop;
- wxWindow *focus = FindFocus();
- // FIXME - display resize cursor if waiting for initial input
+ SetFocus();
+
+#ifndef __WXGTK__
+ if ( flags & wxINTERACTIVE_WAIT_FOR_INPUT )
+ {
+ wxCursor sizingCursor(wxCURSOR_SIZING);
+ wxBeginBusyCursor(&sizingCursor);
+ data.m_sizingCursor = TRUE;
+ }
+ else
+#endif
+ data.m_sizingCursor = FALSE;
data.m_window = this;
data.m_evtLoop = &loop;
data.m_minSize = wxSize(GetMinWidth(), GetMinHeight());
data.m_maxSize = wxSize(GetMaxWidth(), GetMaxHeight());
- this->PushEventHandler(new wxInteractiveMoveHandler(data));
- if ( focus )
- focus->PushEventHandler(new wxInteractiveMoveHandler(data));
+ wxEvtHandler *handler = new wxInteractiveMoveHandler(data);
+ this->PushEventHandler(handler);
CaptureMouse();
loop.Run();
ReleaseMouse();
- this->PopEventHandler(TRUE/*delete*/);
- if ( focus )
- focus->PopEventHandler(TRUE/*delete*/);
+ this->RemoveEventHandler(handler);
+ delete handler;
+
+ if ( data.m_sizingCursor )
+ wxEndBusyCursor();
}
// ----------------------------------------------------------------------------
return FALSE;
}
+void wxTopLevelWindow::OnSystemMenu(wxCommandEvent& event)
+{
+ bool ret = TRUE;
+
+ switch (event.GetId())
+ {
+ case wxID_CLOSE_FRAME:
+ ret = PerformAction(wxACTION_TOPLEVEL_BUTTON_CLICK,
+ wxTOPLEVEL_BUTTON_CLOSE);
+ break;
+ case wxID_MOVE_FRAME:
+ InteractiveMove(wxINTERACTIVE_MOVE | wxINTERACTIVE_WAIT_FOR_INPUT);
+ break;
+ case wxID_RESIZE_FRAME:
+ InteractiveMove(wxINTERACTIVE_RESIZE | wxINTERACTIVE_WAIT_FOR_INPUT);
+ break;
+ case wxID_MAXIMIZE_FRAME:
+ ret = PerformAction(wxACTION_TOPLEVEL_BUTTON_CLICK,
+ wxTOPLEVEL_BUTTON_MAXIMIZE);
+ break;
+ case wxID_ICONIZE_FRAME:
+ ret = PerformAction(wxACTION_TOPLEVEL_BUTTON_CLICK,
+ wxTOPLEVEL_BUTTON_ICONIZE);
+ break;
+ case wxID_RESTORE_FRAME:
+ ret = PerformAction(wxACTION_TOPLEVEL_BUTTON_CLICK,
+ wxTOPLEVEL_BUTTON_RESTORE);
+ break;
+
+ default:
+ ret = FALSE;
+ }
+
+ if ( !ret )
+ event.Skip();
+}
+
// ============================================================================
// wxStdFrameInputHandler: handles focus, resizing and titlebar buttons clicks
consumer->PerformAction(wxACTION_TOPLEVEL_BUTTON_PRESS, m_winPressed);
return TRUE;
}
- else if ( hit & wxHT_TOPLEVEL_TITLEBAR )
+ else if ( (hit & wxHT_TOPLEVEL_TITLEBAR) && !w->IsMaximized() )
{
consumer->PerformAction(wxACTION_TOPLEVEL_MOVE);
return TRUE;
if ( hit & wxHT_TOPLEVEL_ANY_BORDER )
{
- m_borderCursorOn = TRUE;
wxCursor cur;
- switch (hit)
- {
- case wxHT_TOPLEVEL_BORDER_N:
- case wxHT_TOPLEVEL_BORDER_S:
- cur = wxCursor(wxCURSOR_SIZENS);
- break;
- case wxHT_TOPLEVEL_BORDER_W:
- case wxHT_TOPLEVEL_BORDER_E:
- cur = wxCursor(wxCURSOR_SIZEWE);
- break;
- case wxHT_TOPLEVEL_BORDER_NE:
- case wxHT_TOPLEVEL_BORDER_SW:
- cur = wxCursor(wxCURSOR_SIZENESW);
- break;
- case wxHT_TOPLEVEL_BORDER_NW:
- case wxHT_TOPLEVEL_BORDER_SE:
- cur = wxCursor(wxCURSOR_SIZENWSE);
- break;
- default:
- m_borderCursorOn = FALSE;
- break;
- }
+ m_borderCursorOn = wxGetResizingCursor(hit, cur);
if ( m_borderCursorOn )
{
m_origCursor = win->GetCursor();