X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7ee7c43f7ee79b21f64cdaec142d0ba2c9457865..d21d2e5adf7a5acf3b496a9c4e87eab220bd75d8:/src/univ/topluniv.cpp?ds=sidebyside diff --git a/src/univ/topluniv.cpp b/src/univ/topluniv.cpp index ab12008f28..f9bfbeaa86 100644 --- a/src/univ/topluniv.cpp +++ b/src/univ/topluniv.cpp @@ -26,9 +26,14 @@ #endif #include "wx/defs.h" + +#ifndef WX_PRECOMP + #include "wx/dcclient.h" + #include "wx/settings.h" +#endif + #include "wx/toplevel.h" #include "wx/univ/renderer.h" -#include "wx/dcclient.h" #include "wx/bitmap.h" #include "wx/image.h" #include "wx/cshelp.h" @@ -50,6 +55,7 @@ WX_FORWARD_TO_INPUT_CONSUMER(wxTopLevelWindow) // ============================================================================ int wxTopLevelWindow::ms_drawDecorations = -1; +int wxTopLevelWindow::ms_canIconize = -1; void wxTopLevelWindow::Init() { @@ -71,9 +77,18 @@ bool wxTopLevelWindow::Create(wxWindow *parent, exstyleOrig = 0; if ( ms_drawDecorations == -1 ) - ms_drawDecorations = TRUE; - // FIXME_MGL -- this is temporary; we assume for now that native TLW - // can't do decorations, which is not true + { + ms_drawDecorations = + !wxSystemSettings::GetCapability(wxSYS_CAN_DRAW_FRAME_DECORATIONS) + || wxGetEnv(wxT("WXDECOR"), NULL); + // FIXME -- wxUniv should provide a way to force non-native decorations! + // $WXDECOR is just a hack in absence of better wxUniv solution + } + + if ( ms_canIconize == -1 ) + { + ms_canIconize = wxSystemSettings::GetCapability(wxSYS_CAN_ICONIZE_FRAME); + } if ( ms_drawDecorations ) { @@ -93,15 +108,6 @@ bool wxTopLevelWindow::Create(wxWindow *parent, size, style, name) ) return FALSE; - // FIXME: to be removed as soon as wxTLW/wxFrame/wxDialog creation code in - // wxMSW is rationalized -#ifdef __WXMSW__ - extern const wxChar *wxFrameClassName; - if ( !MSWCreate(id, NULL, wxFrameClassName, this, title, - pos.x, pos.y, size.x, size.y, style) ) - return FALSE; -#endif // __WXMSW__ - if ( ms_drawDecorations ) { m_windowStyle = styleOrig; @@ -141,10 +147,15 @@ long wxTopLevelWindow::GetDecorationsStyle() const if ( m_windowStyle & wxCAPTION ) { style |= wxTOPLEVEL_TITLEBAR | wxTOPLEVEL_BUTTON_CLOSE; - if ( m_windowStyle & wxMINIMIZE_BOX ) + if ( (m_windowStyle & wxMINIMIZE_BOX) && ms_canIconize ) style |= wxTOPLEVEL_BUTTON_ICONIZE; if ( m_windowStyle & wxMAXIMIZE_BOX ) - style |= wxTOPLEVEL_BUTTON_MAXIMIZE; + { + if ( IsMaximized() ) + style |= wxTOPLEVEL_BUTTON_RESTORE; + else + style |= wxTOPLEVEL_BUTTON_MAXIMIZE; + } #if wxUSE_HELP if ( m_exStyle & (wxFRAME_EX_CONTEXTHELP | wxDIALOG_EX_CONTEXTHELP)) style |= wxTOPLEVEL_BUTTON_HELP; @@ -254,7 +265,7 @@ long wxTopLevelWindow::HitTest(const wxPoint& pt) const wxTopLevelWindowNative::DoGetClientSize(&w, &h); wxRect rect(wxTopLevelWindowNative::GetClientAreaOrigin(), wxSize(w, h)); - return m_renderer->HitTestFrame(rect, pt, GetDecorationsStyle()); + return m_renderer->HitTestFrame(rect, pt+GetClientAreaOrigin(), GetDecorationsStyle()); } // ---------------------------------------------------------------------------- @@ -264,25 +275,27 @@ long wxTopLevelWindow::HitTest(const wxPoint& pt) const void wxTopLevelWindow::SetIcon(const wxIcon& icon) { wxTopLevelWindowNative::SetIcon(icon); - if ( !m_renderer ) return; - - wxSize size = m_renderer->GetFrameIconSize(); - if ( !icon.Ok() || size.x == -1 ) - m_titlebarIcon = icon; - else + if ( ms_drawDecorations && m_renderer ) { - wxBitmap bmp1; - bmp1.CopyFromIcon(icon); - if ( !bmp1.Ok() ) - m_titlebarIcon = wxNullIcon; - else if ( bmp1.GetWidth() == size.x && bmp1.GetHeight() == size.y ) + wxSize size = m_renderer->GetFrameIconSize(); + + if ( !icon.Ok() || size.x == -1 ) m_titlebarIcon = icon; else { - wxImage img = bmp1.ConvertToImage(); - img.Rescale(size.x, size.y); - m_titlebarIcon.CopyFromBitmap(wxBitmap(img)); + wxBitmap bmp1; + bmp1.CopyFromIcon(icon); + if ( !bmp1.Ok() ) + m_titlebarIcon = wxNullIcon; + else if ( bmp1.GetWidth() == size.x && bmp1.GetHeight() == size.y ) + m_titlebarIcon = icon; + else + { + wxImage img = bmp1.ConvertToImage(); + img.Rescale(size.x, size.y); + m_titlebarIcon.CopyFromBitmap(wxBitmap(img)); + } } } } @@ -334,11 +347,8 @@ bool wxTopLevelWindow::PerformAction(const wxControlAction& action, { if ( m_isActive != isActive ) { - Refresh(); m_isActive = isActive; - wxNcPaintEvent event(GetId()); - event.SetEventObject(this); - GetEventHandler()->ProcessEvent(event); + RefreshTitleBar(); } return TRUE; } @@ -365,6 +375,27 @@ bool wxTopLevelWindow::PerformAction(const wxControlAction& action, return TRUE; } + else if ( action == wxACTION_TOPLEVEL_MOVE ) + { + InteractiveMove(wxINTERACTIVE_MOVE); + return TRUE; + } + + else if ( action == wxACTION_TOPLEVEL_RESIZE ) + { + int flags = wxINTERACTIVE_RESIZE; + if ( numArg & wxHT_TOPLEVEL_BORDER_N ) + flags |= wxINTERACTIVE_RESIZE_N; + if ( numArg & wxHT_TOPLEVEL_BORDER_S ) + flags |= wxINTERACTIVE_RESIZE_S; + if ( numArg & wxHT_TOPLEVEL_BORDER_W ) + flags |= wxINTERACTIVE_RESIZE_W; + if ( numArg & wxHT_TOPLEVEL_BORDER_E ) + flags |= wxINTERACTIVE_RESIZE_E; + InteractiveMove(flags); + return TRUE; + } + else return FALSE; } @@ -380,6 +411,7 @@ wxStdFrameInputHandler::wxStdFrameInputHandler(wxInputHandler *inphand) m_winCapture = NULL; m_winHitTest = 0; m_winPressed = 0; + m_borderCursorOn = FALSE; } bool wxStdFrameInputHandler::HandleMouse(wxInputConsumer *consumer, @@ -409,6 +441,17 @@ bool wxStdFrameInputHandler::HandleMouse(wxInputConsumer *consumer, consumer->PerformAction(wxACTION_TOPLEVEL_BUTTON_PRESS, m_winPressed); return TRUE; } + else if ( hit & wxHT_TOPLEVEL_TITLEBAR ) + { + consumer->PerformAction(wxACTION_TOPLEVEL_MOVE); + return TRUE; + } + else if ( (consumer->GetInputWindow()->GetWindowStyle() & wxRESIZE_BORDER) + && (hit & wxHT_TOPLEVEL_ANY_BORDER) ) + { + consumer->PerformAction(wxACTION_TOPLEVEL_RESIZE, hit); + return TRUE; + } } else // up @@ -435,8 +478,6 @@ bool wxStdFrameInputHandler::HandleMouse(wxInputConsumer *consumer, bool wxStdFrameInputHandler::HandleMouseMove(wxInputConsumer *consumer, const wxMouseEvent& event) { - // we only have to do something when the mouse leaves/enters the pressed - // button and don't care about the other ones if ( event.GetEventObject() == m_winCapture ) { long hit = m_winCapture->HitTest(event.GetPosition()); @@ -452,6 +493,57 @@ bool wxStdFrameInputHandler::HandleMouseMove(wxInputConsumer *consumer, return TRUE; } } + else if ( consumer->GetInputWindow()->GetWindowStyle() & wxRESIZE_BORDER ) + { + wxTopLevelWindow *win = wxStaticCast(consumer->GetInputWindow(), + wxTopLevelWindow); + long hit = win->HitTest(event.GetPosition()); + + if ( hit != m_winHitTest ) + { + m_winHitTest = hit; + + if ( m_borderCursorOn ) + { + m_borderCursorOn = FALSE; + win->SetCursor(m_origCursor); + } + + 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; + } + if ( m_borderCursorOn ) + { + m_origCursor = win->GetCursor(); + win->SetCursor(cur); + } + } + } + } return wxStdInputHandler::HandleMouseMove(consumer, event); } @@ -459,6 +551,11 @@ bool wxStdFrameInputHandler::HandleMouseMove(wxInputConsumer *consumer, bool wxStdFrameInputHandler::HandleActivation(wxInputConsumer *consumer, bool activated) { + if ( m_borderCursorOn ) + { + consumer->GetInputWindow()->SetCursor(m_origCursor); + m_borderCursorOn = FALSE; + } consumer->PerformAction(wxACTION_TOPLEVEL_ACTIVATE, activated); return FALSE; }