X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/aa74396d46f89699c3b5bb29abafc8ae2bb59ba9..19aa75a87435f16f2ff60e4e662b7df3264b223b:/src/univ/topluniv.cpp diff --git a/src/univ/topluniv.cpp b/src/univ/topluniv.cpp index 6392765ed6..dea87cf2f5 100644 --- a/src/univ/topluniv.cpp +++ b/src/univ/topluniv.cpp @@ -2,7 +2,7 @@ // 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 ///////////////////////////////////////////////////////////////////////////// @@ -14,7 +14,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "univtoplevel.h" #endif @@ -47,6 +47,7 @@ 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) @@ -100,7 +101,7 @@ bool wxTopLevelWindow::Create(wxWindow *parent, style &= ~(wxCAPTION | wxMINIMIZE_BOX | wxMAXIMIZE_BOX | wxSYSTEM_MENU | wxRESIZE_BORDER | wxFRAME_TOOL_WINDOW | wxTHICK_FRAME); - style = wxSIMPLE_BORDER; + style |= wxSIMPLE_BORDER; SetExtraStyle(exstyleOrig & ~(wxFRAME_EX_CONTEXTHELP | wxDIALOG_EX_CONTEXTHELP)); } @@ -237,7 +238,7 @@ void wxTopLevelWindow::DoSetClientSize(int width, int height) wxTopLevelWindowNative::DoSetClientSize(width, height); } -void wxTopLevelWindow::OnNcPaint(wxPaintEvent& event) +void wxTopLevelWindow::OnNcPaint(wxNcPaintEvent& event) { if ( !ms_drawDecorations || !m_renderer ) event.Skip(); @@ -295,13 +296,14 @@ int wxTopLevelWindow::GetMinHeight() const // icons // ---------------------------------------------------------------------------- -void wxTopLevelWindow::SetIcon(const wxIcon& icon) +void wxTopLevelWindow::SetIcons(const wxIconBundle& icons) { - wxTopLevelWindowNative::SetIcon(icon); + wxTopLevelWindowNative::SetIcons(icons); if ( ms_drawDecorations && m_renderer ) { wxSize size = m_renderer->GetFrameIconSize(); + const wxIcon& icon = icons.GetIcon( size ); if ( !icon.Ok() || size.x == -1 ) m_titlebarIcon = icon; @@ -327,19 +329,56 @@ void wxTopLevelWindow::SetIcon(const wxIcon& icon) // 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; + #if 0 + // not rachable due to earlier return + break; + #endif + } + 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 @@ -435,23 +474,16 @@ void wxInteractiveMoveHandler::OnMouseMove(wxMouseEvent& event) } } -void wxInteractiveMoveHandler::OnMouseDown(wxMouseEvent& event) +void wxInteractiveMoveHandler::OnMouseDown(wxMouseEvent& WXUNUSED(event)) { 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() ) @@ -471,32 +503,105 @@ void wxInteractiveMoveHandler::OnKeyDown(wxKeyEvent& event) 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; + } } } } -void wxInteractiveMoveHandler::OnMouseUp(wxMouseEvent& event) +void wxInteractiveMoveHandler::OnMouseUp(wxMouseEvent& WXUNUSED(event)) { m_data.m_evtLoop->Exit(); } @@ -514,9 +619,19 @@ void wxTopLevelWindow::InteractiveMove(int flags) 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; @@ -526,17 +641,18 @@ void wxTopLevelWindow::InteractiveMove(int flags) 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(); } // ---------------------------------------------------------------------------- @@ -578,7 +694,7 @@ void wxTopLevelWindow::ClickTitleBarButton(long button) bool wxTopLevelWindow::PerformAction(const wxControlAction& action, long numArg, - const wxString& strArg) + const wxString& WXUNUSED(strArg)) { bool isActive = numArg != 0; @@ -639,6 +755,43 @@ bool wxTopLevelWindow::PerformAction(const wxControlAction& action, 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 @@ -750,31 +903,9 @@ bool wxStdFrameInputHandler::HandleMouseMove(wxInputConsumer *consumer, 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();