diff --git a/lib/wxExtend/build/wxExtend.vcxproj b/lib/wxExtend/build/wxExtend.vcxproj deleted file mode 100644 index 0845e5b..0000000 --- a/lib/wxExtend/build/wxExtend.vcxproj +++ /dev/null @@ -1,90 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - - - Create - Create - Create - Create - - - - - - - - - {A3A36689-AC35-4026-93DA-A3BA0C0E767C} - wxExtend - - - - StaticLibrary - true - Unicode - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - true - Unicode - - - StaticLibrary - false - true - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/lib/wxExtend/build/wxExtend.vcxproj.filters b/lib/wxExtend/build/wxExtend.vcxproj.filters deleted file mode 100644 index ec75aac..0000000 --- a/lib/wxExtend/build/wxExtend.vcxproj.filters +++ /dev/null @@ -1,36 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - \ No newline at end of file diff --git a/lib/wxExtend/include/wxex/appbar.h b/lib/wxExtend/include/wxex/appbar.h deleted file mode 100644 index 2f2cd0a..0000000 --- a/lib/wxExtend/include/wxex/appbar.h +++ /dev/null @@ -1,620 +0,0 @@ -/* - Copyright 2016 Amebis - Based on code written by Jeffrey Richter. - - This file is part of wxExtend. - - wxExtend is free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wxExtend is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with wxExtend. If not, see . -*/ - -#pragma once - -#include -#include - -#include - - -#define wxABT_AUTOHIDETIMERID 1 -#define wxABT_AUTOHIDETIME 300 -#define wxABT_AUTOHIDETIMERINTERVAL 3000 - - -/// -/// Dockable application bar -/// -class wxAppBar : public wxFrame -{ -public: - /// - /// Application bar states - /// - enum wxState { - wxSTATE_UNKNOWN = -2, - wxSTATE_FLOAT = -1, - wxSTATE_LEFT = ABE_LEFT, - wxSTATE_TOP = ABE_TOP, - wxSTATE_RIGHT = ABE_RIGHT, - wxSTATE_BOTTOM = ABE_BOTTOM, - }; - - - /// - /// Application bar flags - /// - enum wxFlags { - wxFLAG_ALLOWFLOAT = 1 << 0, ///< Is floating application bar allowed? - wxFLAG_ALLOWDOCKTOP = 1 << 1, ///< Is docking on top of the screen allowed? - wxFLAG_ALLOWDOCKBOTTOM = 1 << 2, ///< Is docking on bottom of the screen allowed? - wxFLAG_ALLOWDOCKLEFT = 1 << 3, ///< Is docking left of the screen allowed? - wxFLAG_ALLOWDOCKRIGHT = 1 << 4, ///< Is docking right of the screen allowed? - wxFLAG_ALLOWDOCKANY = (wxFLAG_ALLOWDOCKTOP | wxFLAG_ALLOWDOCKBOTTOM | wxFLAG_ALLOWDOCKLEFT | wxFLAG_ALLOWDOCKRIGHT), ///< Is docking at any edge of the screen allowed? - wxFLAG_ALLOWDOCKHORIZONTAL = (wxFLAG_ALLOWDOCKTOP | wxFLAG_ALLOWDOCKBOTTOM), ///< Is docking on top or bottom of the screen allowed? - wxFLAG_ALLOWDOCKVERTICAL = (wxFLAG_ALLOWDOCKLEFT | wxFLAG_ALLOWDOCKRIGHT), ///< Is docking left or right of the screen allowed? - wxFLAG_ALLOWANY = (wxFLAG_ALLOWFLOAT | wxFLAG_ALLOWDOCKANY), ///< Is floating and docking at any edge of the screen allowed? - - wxFLAG_ALWAYSONTOP = 1 << 5, ///< Is application bar always on top? - wxFLAG_ALWAYSONTOPTASKBAR = 1 << 6, ///< Does application bar follow always on top state of the system taskbar? - - wxFLAG_AUTOHIDE = 1 << 7, ///< Is application bar setup for auto-hide? - wxFLAG_AUTOHIDETASKBAR = 1 << 8, ///< Does application bar follow auto-hide state of the system taskbar? - - wxFLAG_ALLOWSIZING = 1 << 9, ///< Is application bar's sizing allowed? - - wxFLAG_HIDETASKBARTABWHENFLOATING = 1 << 10, ///< Should application bar's tab on the system taskbar hide when floating? - wxFLAG_HIDETASKBARTABWHENDOCKED = 1 << 11, ///< Should application bar's tab on the system taskbar hide when docked? - wxFLAG_ALWAYSHIDETASKBARTAB = (wxFLAG_HIDETASKBARTABWHENFLOATING | wxFLAG_HIDETASKBARTABWHENDOCKED), ///< Should application bar's tab on the system taskbar hide always? - - // Internal flags - wxFLAG_FULLSCREENAPPOPEN = 1 << 12, ///< Is full-screen application open? - wxFLAG_AUTOHIDDEN = 1 << 13, ///< Is application bar auto-hidden right now? - }; - -public: - wxAppBar(); - wxAppBar(wxWindow *parent, - wxWindowID id, - const wxString& title, - wxState state = wxSTATE_FLOAT, - int flags = wxFLAG_ALLOWANY, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = wxDEFAULT_FRAME_STYLE, - const wxString& name = wxFrameNameStr); - - bool Create(wxWindow *parent, - wxWindowID id, - const wxString& title, - wxState state = wxSTATE_FLOAT, - int flags = wxFLAG_ALLOWANY, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = wxDEFAULT_FRAME_STYLE, - const wxString& name = wxFrameNameStr); - - virtual ~wxAppBar(); - -public: - /// \name Application bar general management - /// @{ - - /// - /// Returns current state of the application bar. - /// - inline wxState GetState() const; - - /// - /// Returns whether application bar is displayed always on top. - /// - /// \returns - /// - true when application bar is always on top - /// - false otherwise - /// - inline bool IsAlwaysOnTop() const; - - /// - /// Sets whether application bar is displayed always on top. - /// - /// \param[in] alwaysOnTop Logical variable to control whether always-on-top behaviour is to be enabled (true) or disabled (false). - /// - inline bool SetAlwaysOnTop(bool alwaysOnTop = true); - - /// - /// Returns if application bar is configured for auto-hide. - /// - /// \returns - /// - true if application bar is configured for auto-hide - /// - false otherwise - /// - inline bool IsAutoHide() const; - - /// - /// Sets whether application bar is displayed always on top. - /// - /// \param[in] autoHide Logical variable to control whether auto-hide behaviour is to be enabled (true) or disabled (false). - /// - inline bool SetAutoHide(bool autoHide = true); - - /// - /// Returns if sizing of the application bar is allowed. - /// - /// \returns - /// - true if sizing of the application bar is allowed - /// - false otherwise - /// - inline bool GetAllowSizing() const; - - /// - /// Sets whether resizing of the application bar is allowed. - /// - /// \param[in] bAllowSizing Logical variable to control whether resizing is to be enabled (true) or disabled (false). - /// - inline bool SetAllowSizing(bool bAllowSizing = true); - - /// - /// Returns if application bar is auto-hidden right now. - /// - /// \returns - /// - true if application bar is auto-hidden right now - /// - false otherwise - inline bool GetAutoHidden() const; - - //bool GetAppBarPlacement(LPAPPBARPLACEMENT lpPlacement) const; - //bool SetAppBarPlacement(LPCAPPBARPLACEMENT lpPlacement); - - /// - /// Minimize application bar to the edge of the desktop. - /// - /// \param[in] edge The edge at which to dock. Must be either of: wxSTATE_LEFT, wxSTATE_TOP, wxSTATE_RIGHT, or wxSTATE_BOTTOM. - /// \param[in] wnd When the undocked and docked window is different, this parameter denotes the undocked version. - /// - void MinimiseToEdge(wxState edge, wxWindow* wnd = NULL); - - /// - /// Restore application bar from the edge of the desktop. - /// - /// \param[in] rect The desired coordinates of the restored window. If NULL internally saved coordinates are used. - /// \param[in] wnd When the undocked and docked window is different, this parameter denotes the undocked version. - /// - void MaximiseFromEdge(const RECT* rect = NULL); - void MaximiseFromEdge(wxWindow *wnd); - - /// - /// Shows or hides auto-hide application bar. - /// - /// \param[in] bShow Logical variable to control whether application bar is be shown (true) or hidden (false). - /// - void ShowAutoHideAppBar(bool bShow = true); - - /// - /// Hides auto-hide application bar. - /// - inline void HideAutoHideAppBar() { ShowAutoHideAppBar(false); } - - /// @} - -protected: - /// \name Notification handlers - /// @{ - - /// - /// Notification handler when the new state of the application bar is proposed. - /// - /// Derived classes can implement their own. However, overriden virtual method should call the parent's implementation too. - /// - /// \param[in] stateNew New state about to take effect. - /// - virtual void OnChangeState(wxState stateNew); - - /// - /// Notification handler when the Windows' task bar state changes. - /// - /// Derived classes can implement their own. However, overriden virtual method should call the parent's implementation too. - /// - /// \param[in] state New task bar state. - /// - virtual void OnChangeTaskBarState(UINT_PTR state); - - /// - /// Notification handler when desktop windows are being arranged (cascaded, tiled, ...) - /// - /// Derived classes can implement their own. However, overriden virtual method should call the parent's implementation too. - /// - /// \param[in] bBeginning true when windows arrangement starts and false when arrangement ends. - /// - virtual void OnWindowsArrange(bool bBeginning); - - /// - /// Called when application bar was forced from auto-hide to normal docking. - /// - /// Default implementation displays a warning dialog. - /// - virtual void OnAutoHideDenied(); - - /// @} - -protected: - virtual WXLRESULT MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam); - -private: - inline bool DockAppBar(wxState state); - inline bool UndockAppBar(); - inline bool RegisterAutoHide(wxState state); - inline bool UnregisterAutoHide(wxState state); - inline bool GetDockedRect(wxState state, LPRECT rect) const; - inline bool GetAutoHideRect(wxState state, bool bAutoHidden, LPRECT rect) const; - inline static bool IsDocked(wxState state); - inline static bool IsDockedVert(wxState state); - inline static bool IsDockedHoriz(wxState state); - inline static WXHWND GetZWnd(wxState state, int flags); - inline static UINT_PTR GetTaskBarState(); - -protected: - wxState m_state; ///< Current state of the application bar - wxState m_stateDesired; ///< Desired state of the application bar while moving/resizing - int m_flags; ///< Flags describing application bar's behaviour - - SIZE m_sizeFloat; ///< Window size when floating (we need it to restore floating size, when we undock) - SIZE m_sizeDocked; ///< Size of the window when docked (height when wxSTATE_TOP or wxSTATE_BOTTOM, width when wxSTATE_LEFT or wxSTATE_RIGHT) - SIZE m_sizeMin; ///< Minimum window size - - UINT_PTR m_stateTaskBar; ///< TaskBar's current state - UINT_PTR m_timerID; ///< Application bar's timer id. - - ITaskbarList *m_taskbarList; ///< Windows's taskbar list interface - -private: - static const UINT WM_AB_NOTIFY; ///< Application bar notification message -}; - - -inline wxAppBar::wxState wxAppBar::GetState() const -{ - return m_stateDesired != wxSTATE_UNKNOWN ? m_stateDesired : m_state; -} - - -inline bool wxAppBar::IsAlwaysOnTop() const -{ - return (m_flags & wxFLAG_ALWAYSONTOP) ? true : false; -} - - -inline bool wxAppBar::SetAlwaysOnTop(bool alwaysOnTop) -{ - if (alwaysOnTop) - m_flags |= wxFLAG_ALWAYSONTOP; - else - m_flags &= ~wxFLAG_ALWAYSONTOP; - - if (::IsWindowVisible(m_hWnd)) { - // Set the Z-order. - wxCHECK(::SetWindowPos(m_hWnd, GetZWnd(m_state, m_flags), 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOSENDCHANGING), false); - } - - return true; -} - - -inline bool wxAppBar::IsAutoHide() const -{ - return (m_flags & wxFLAG_AUTOHIDE) ? true : false; -} - - -inline bool wxAppBar::SetAutoHide(bool autoHide) -{ - bool autoHidePrev = IsAutoHide(); - - if (autoHide) - m_flags |= wxFLAG_AUTOHIDE; - else - m_flags &= ~wxFLAG_AUTOHIDE; - - if (autoHidePrev != autoHide && IsDocked(m_state) && ::IsWindowVisible(m_hWnd)) { - if (autoHide) { - // Application bar should be auto-hidden. Try to setup it so. - - // We undock to free the space before registering auto-hide, otherwise system will leave application bar's space reserved. - UndockAppBar(); - - // Register auto-hide application bar. - if (!RegisterAutoHide(m_state)) { - // Auto-hide failed; some other application bar must be hidden on this edge already. Dock back instead. - DockAppBar(m_state); - return false; - } - } else { - // Unregister the auto-hidden application bar and dock. - UnregisterAutoHide(m_state); - DockAppBar(m_state); - } - } - - return true; -} - - -inline bool wxAppBar::GetAllowSizing() const -{ - return (m_flags & wxFLAG_ALLOWSIZING) ? true : false; -} - - -inline bool wxAppBar::SetAllowSizing(bool bAllowSizing) -{ - if (bAllowSizing) - m_flags |= wxFLAG_ALLOWSIZING; - else - m_flags &= ~wxFLAG_ALLOWSIZING; - - return true; -} - - -inline bool wxAppBar::GetAutoHidden() const -{ - return (m_flags & wxFLAG_AUTOHIDDEN) ? true : false; -} - - -inline bool wxAppBar::DockAppBar(wxState state) -{ - wxASSERT(IsDocked(state)); - - // Calculate docked window rect and dock the window there. - APPBARDATA abd = { sizeof(abd), m_hWnd, 0, state }; - GetDockedRect(state, &(abd.rc)); - wxCHECK(::SHAppBarMessage(ABM_SETPOS, &abd), false); - wxCHECK(::SetWindowPos(m_hWnd, GetZWnd(state, m_flags), abd.rc.left, abd.rc.top, abd.rc.right - abd.rc.left, abd.rc.bottom - abd.rc.top, SWP_NOACTIVATE | SWP_DRAWFRAME | SWP_FRAMECHANGED), false); - - return true; -} - - -inline bool wxAppBar::UndockAppBar() -{ - // Free application bar's space to undock. - APPBARDATA abd = { sizeof(abd), m_hWnd, 0, wxSTATE_LEFT }; - wxASSERT(!abd.rc.left && !abd.rc.top && !abd.rc.right && !abd.rc.bottom); - wxCHECK(::SHAppBarMessage(ABM_SETPOS, &abd), false); - - return true; -} - - -inline bool wxAppBar::RegisterAutoHide(wxState state) -{ - wxASSERT(IsDocked(state)); - - // Register application bar as auto-hide. - APPBARDATA abd = { sizeof(abd), m_hWnd, 0, state, {}, (LPARAM)true }; - if (::SHAppBarMessage(ABM_SETAUTOHIDEBAR, &abd)) { - // Auto-hide succeeded. - m_flags |= wxFLAG_AUTOHIDE; - m_flags &= ~wxFLAG_AUTOHIDDEN; - - // Calculate auto-hidden window rect and move the window there. - GetAutoHideRect(state, false, &(abd.rc)); - wxCHECK(::SetWindowPos(m_hWnd, GetZWnd(state, m_flags), abd.rc.left, abd.rc.top, abd.rc.right - abd.rc.left, abd.rc.bottom - abd.rc.top, SWP_NOACTIVATE | SWP_DRAWFRAME | SWP_FRAMECHANGED), false); - - // Reset auto-hide timer. - m_timerID = ::SetTimer(m_hWnd, wxABT_AUTOHIDETIMERID, wxABT_AUTOHIDETIMERINTERVAL, NULL); - - return true; - } else { - // Auto-hide failed; some other application bar must be hidden on this edge already. - m_flags &= ~(wxFLAG_AUTOHIDE | wxFLAG_AUTOHIDDEN); - - // Post a message to user. - OnAutoHideDenied(); - - return false; - } -} - - -inline bool wxAppBar::UnregisterAutoHide(wxState state) -{ - wxASSERT(IsDocked(state)); - - // Unregister application bar as auto-hide. - APPBARDATA abd = { sizeof(abd), m_hWnd, 0, state, {}, (LPARAM)false }; - wxCHECK(::SHAppBarMessage(ABM_SETAUTOHIDEBAR, &abd), false); - m_flags &= ~wxFLAG_AUTOHIDDEN; - - // Cancel the timer. - if (m_timerID) { - ::KillTimer(m_hWnd, m_timerID); - m_timerID = 0; - } - - return true; -} - - -inline bool wxAppBar::GetDockedRect(wxState state, LPRECT rect) const -{ - wxASSERT(rect); - wxASSERT(IsDocked(state)); - - // Set dimensions to full screen. - APPBARDATA abd = { sizeof(abd), m_hWnd, 0, state, { 0, 0, ::GetSystemMetrics(SM_CXSCREEN), ::GetSystemMetrics(SM_CYSCREEN) } }; - wxCHECK(::SHAppBarMessage(ABM_QUERYPOS, &abd), false); - - // Correct our dimensions accordingly. - switch (state) { - case wxSTATE_LEFT: - rect->left = abd.rc.left; - rect->top = abd.rc.top; - rect->right = abd.rc.left + m_sizeDocked.cx; - rect->bottom = abd.rc.bottom; - break; - - case wxSTATE_TOP: - rect->left = abd.rc.left; - rect->top = abd.rc.top; - rect->right = abd.rc.right; - rect->bottom = abd.rc.top + m_sizeDocked.cy; - break; - - case wxSTATE_RIGHT: - rect->left = abd.rc.right - m_sizeDocked.cx; - rect->top = abd.rc.top; - rect->right = abd.rc.right; - rect->bottom = abd.rc.bottom; - break; - - case wxSTATE_BOTTOM: - rect->left = abd.rc.left; - rect->top = abd.rc.bottom - m_sizeDocked.cy; - rect->right = abd.rc.right; - rect->bottom = abd.rc.bottom; - break; - - default: - // Unknown state. - wxFAIL; - return false; - } - - return true; -} - - -inline bool wxAppBar::GetAutoHideRect(wxState state, bool bAutoHidden, LPRECT rect) const -{ - wxASSERT(rect); - wxASSERT(IsDocked(state)); - - // Keep a part of the application bar visible at all times - const int iBorder = ::GetSystemMetrics(IsDockedVert(state) ? SM_CXBORDER : SM_CYBORDER) * 2; - const RECT rcScreen = { - 0, - 0, - ::GetSystemMetrics(SM_CXSCREEN), - ::GetSystemMetrics(SM_CYSCREEN) - }; - - // Correct our dimensions accordingly. - switch (state) { - case wxSTATE_LEFT: - rect->top = rcScreen.top; - rect->bottom = rcScreen.bottom; - rect->right = rcScreen.left + (bAutoHidden ? iBorder : m_sizeDocked.cx); - rect->left = rect->right - m_sizeDocked.cx; - break; - - case wxSTATE_TOP: - rect->left = rcScreen.left; - rect->right = rcScreen.right; - rect->bottom = rcScreen.top + (bAutoHidden ? iBorder : m_sizeDocked.cy); - rect->top = rect->bottom - m_sizeDocked.cy; - break; - - case wxSTATE_RIGHT: - rect->left = rcScreen.right - (bAutoHidden ? iBorder : m_sizeDocked.cx); - rect->top = rcScreen.top; - rect->right = rect->left + m_sizeDocked.cx; - rect->bottom = rcScreen.bottom; - break; - - case wxSTATE_BOTTOM: - rect->left = rcScreen.left; - rect->top = rcScreen.bottom - (bAutoHidden ? iBorder : m_sizeDocked.cy); - rect->right = rcScreen.right; - rect->bottom = rect->top + m_sizeDocked.cy; - break; - - default: - // Unknown state. - wxFAIL; - return false; - } - - return true; -} - - -inline bool wxAppBar::IsDocked(wxState state) -{ - return wxSTATE_LEFT <= state && state <= wxSTATE_BOTTOM; -} - - -inline bool wxAppBar::IsDockedVert(wxState state) -{ - return state == wxSTATE_LEFT || state == wxSTATE_RIGHT; -} - - -inline bool wxAppBar::IsDockedHoriz(wxState state) -{ - return state == wxSTATE_TOP || state == wxSTATE_BOTTOM; -} - - -inline WXHWND wxAppBar::GetZWnd(wxState state, int flags) -{ - if (flags & wxFLAG_FULLSCREENAPPOPEN) { - // If full screen app is open, clear the always-on-top flag. - return HWND_NOTOPMOST; - } - - //_AFX_THREAD_STATE* pThreadState = AfxGetThreadState(); - //if (::IsWindow(pThreadState->m_hTrackingWindow)) { - // // We're tracking another window/menu, position behind it. - // return pThreadState->m_hTrackingWindow; - // } - - if (state == wxSTATE_FLOAT) { - // When floating, decide according to the flags. - return (flags & wxFLAG_ALWAYSONTOP) ? HWND_TOPMOST : HWND_NOTOPMOST; - } - - if (IsDocked(state)) { - if (flags & wxFLAG_AUTOHIDE) { - // Auto-hidden docked application bar is always on top. - return HWND_TOPMOST; - } - - if (flags & wxFLAG_ALWAYSONTOP) { - // Regular docked always-on-top application bar. - WXHWND hWndTaskbar = ::FindWindow(_T("Shell_TrayWnd"), _T("")); - if (hWndTaskbar) { - // We found the taskbar window. Position directly after it. Otherwise our window overlaps Vista's Start button orb. - return hWndTaskbar; - } else { - // Only always-on-top windows are allowed to resize properly outside the desktop rect. - // If window is docked and not always on top, resizing a window to smaller size is obstructed by desktop rect limit. - return HWND_TOPMOST; - } - } - - - // Regular docked non-always-on-top application bar. - return HWND_NOTOPMOST; - } else { - // Unknown state. Do nothing. - wxFAIL; - return HWND_TOP; - } -} - - -inline UINT_PTR wxAppBar::GetTaskBarState() -{ - APPBARDATA abd = { sizeof(abd) }; - return ::SHAppBarMessage(ABM_GETSTATE, &abd); -} diff --git a/lib/wxExtend/include/wxex/common.h b/lib/wxExtend/include/wxex/common.h deleted file mode 100644 index aa98f2f..0000000 --- a/lib/wxExtend/include/wxex/common.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - Copyright 2016 Amebis - - This file is part of wxExtend. - - wxExtend is free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wxExtend is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with wxExtend. If not, see . -*/ - -#pragma once - -#include -#include -#include - - -//--------------------------------------------------------------------------- -// Usual debugging macros -//--------------------------------------------------------------------------- -#if wxDEBUG_LEVEL -#define wxVERIFY(x) wxASSERT((x)) -#else -#define wxVERIFY(x) (x) -#endif - - -/// -/// Returns whether windows animation is enabled. -/// -/// \returns -/// - true when window animation is enabled -/// - false otherwise -/// -inline bool wxGetDoWndAnimation() -{ - ANIMATIONINFO ai = { sizeof(ai) }; - wxCHECK(SystemParametersInfo(SPI_GETANIMATION, sizeof(ai), &ai, 0), false); - return ai.iMinAnimate ? true : false; -} - - -/// -/// Modifies window extended style. -/// -/// \param[in] hWnd Handle of the window to modify. -/// \param[in] dwRemove Set of extended styles to remove. -/// \param[in] dwAdd Set of extended styles to add. -/// \param[in] nFlags Additional SWP_ flags to pass to SetWindowPos(). If zero, SetWindowPos() is not called. -/// \returns -/// - true when the window extended style was modified -/// - false if the window extended style was not neccessary -/// -inline bool wxModifyStyleEx(_In_ WXHWND hWnd, _In_ DWORD dwRemove, _In_ DWORD dwAdd, _In_ UINT nFlags = 0) -{ - wxASSERT(IsWindow(hWnd)); - - DWORD dwStyle = GetWindowLong(hWnd, GWL_EXSTYLE); - DWORD dwNewStyle = (dwStyle & ~dwRemove) | dwAdd; - if(dwStyle == dwNewStyle) - return false; - - SetWindowLong(hWnd, GWL_EXSTYLE, dwNewStyle); - if(nFlags != 0) - SetWindowPos(hWnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | nFlags); - - return true; -} diff --git a/lib/wxExtend/src/appbar.cpp b/lib/wxExtend/src/appbar.cpp deleted file mode 100644 index 8d76148..0000000 --- a/lib/wxExtend/src/appbar.cpp +++ /dev/null @@ -1,829 +0,0 @@ -/* - Copyright 2016 Amebis - - This file is part of wxExtend. - - wxExtend is free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wxExtend is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with wxExtend. If not, see . -*/ - -#include "stdafx.h" - - -////////////////////////////////////////////////////////////////////////// -// wxAppBar -////////////////////////////////////////////////////////////////////////// - -const UINT wxAppBar::WM_AB_NOTIFY = ::RegisterWindowMessage(_T("AppBarNotify")); - - -wxAppBar::wxAppBar() : - m_timerID(0), - m_taskbarList(NULL), - wxFrame() -{ -} - - -wxAppBar::wxAppBar(wxWindow *parent, wxWindowID id, const wxString& title, wxState state, int flags, const wxPoint& pos, const wxSize& size, long style, const wxString& name) : - m_timerID(0), - m_taskbarList(NULL), - wxFrame() -{ - Create(parent, id, title, state, flags, pos, size, style, name); -} - - -bool wxAppBar::Create(wxWindow *parent, wxWindowID id, const wxString& title, wxState state, int flags, const wxPoint& pos, const wxSize& size, long style, const wxString& name) -{ - // Save initial floating window size. - m_sizeFloat.cx = size.x; - m_sizeFloat.cy = size.y; - - // Save initial docked window width/height. - m_sizeDocked.cx = size.x; - m_sizeDocked.cy = size.y; - - // Save initial state and flags. - m_state = state; - m_stateDesired = wxSTATE_UNKNOWN; - m_flags = flags; - - // Find the taskbar list's interface. - wxCHECK(SUCCEEDED(::CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_ALL, IID_ITaskbarList, (LPVOID*)&m_taskbarList)), false); - wxCHECK(SUCCEEDED(m_taskbarList->HrInit()), false); - - // If any taskbar list tab's hiding is in affect, set application bar's style as tool window to avoid being displayed on the taskbar initially. - if (state == wxSTATE_FLOAT) { - if (flags & wxFLAG_HIDETASKBARTABWHENFLOATING) { - // Hide our application bar's entry on the Windows's taskbar. - style |= wxFRAME_TOOL_WINDOW; - } else if (flags & wxFLAG_HIDETASKBARTABWHENDOCKED) { - // Show our application bar's entry on the Windows's taskbar. - style &= ~wxFRAME_TOOL_WINDOW; - } - } else if (IsDocked(state)) { - if (flags & wxFLAG_HIDETASKBARTABWHENDOCKED) { - // Hide our application bar's entry on the Windows's taskbar. - style |= wxFRAME_TOOL_WINDOW; - } else if (flags & wxFLAG_HIDETASKBARTABWHENFLOATING) { - // Show our application bar's entry on the Windows's taskbar. - style &= ~wxFRAME_TOOL_WINDOW; - } - } else { - // Unknown state. - wxFAIL; - } - - // Create frame. - wxCHECK(wxFrame::Create(parent, id, title, pos, size, style, name), false); - - // Register our application bar. - APPBARDATA abd = { sizeof(abd), m_hWnd, WM_AB_NOTIFY, m_state }; - wxCHECK(::SHAppBarMessage(ABM_NEW, &abd), false); - - // Get the state of the Windows taskbar. - m_stateTaskBar = GetTaskBarState(); - - if (m_flags & wxFLAG_AUTOHIDETASKBAR) { - // Mimic the auto-hide state of taskbar. - SetAutoHide((m_stateTaskBar & ABS_AUTOHIDE) ? true : false); - } - - if (m_flags & wxFLAG_ALWAYSONTOPTASKBAR) { - // Mimic the always-on-top state of taskbar. - SetAlwaysOnTop((m_stateTaskBar & ABS_ALWAYSONTOP) ? true : false); - } - - return true; -} - - -wxAppBar::~wxAppBar() -{ - wxASSERT(m_timerID == 0); - - // Remove the application bar. - APPBARDATA abd = { sizeof(abd), m_hWnd }; - wxVERIFY(::SHAppBarMessage(ABM_REMOVE, &abd)); - - if (m_taskbarList) - m_taskbarList->Release(); -} - - -//bool wxAppBar::GetAppBarPlacement(LPAPPBARPLACEMENT lpPlacement) const -//{ -// wxASSERT(lpPlacement); -// -// if (lpPlacement->dwSize >= sizeof(APPBARPLACEMENT1)) { -// lpPlacement->dwState = (DWORD)m_state; -// lpPlacement->dwFlags = m_flags; -// if (m_state == wxSTATE_FLOAT) { -// // Current application bar's rect is floating rect. -// lpPlacement->rcFloat = m_rect; -// } else if (IsDocked(m_state)) { -// // Application bar is docked. Calc floating rect from m_sizeFloat. -// lpPlacement->rcFloat.left = 0; -// lpPlacement->rcFloat.top = 0; -// lpPlacement->rcFloat.right = m_sizeFloat.cx; -// lpPlacement->rcFloat.bottom = m_sizeFloat.cy; -// } else { -// // Application bar's state is unknown. -// return false; -// } -// lpPlacement->szDocked = m_sizeDocked; -// } -// -// lpPlacement->dwSize = sizeof(*lpPlacement); -// -// return true; -//} -// -// -//bool wxAppBar::SetAppBarPlacement(LPCAPPBARPLACEMENT lpPlacement) -//{ -// wxASSERT(lpPlacement); -// -// if (lpPlacement->dwSize >= sizeof(APPBARPLACEMENT1)) { -// if (lpPlacement->dwState != wxSTATE_FLOAT && !IsDocked(lpPlacement->dwState)) { -// // The state is unknown. Abort, before we mix up internal state. -// return false; -// } -// -// // Clean previous docking/auto-hide settings if required. -// if (IsDocked(m_state) && -// (lpPlacement->dwState == wxSTATE_FLOAT || lpPlacement->dwState != m_state && IsDocked(lpPlacement->dwState))) -// { -// if (IsAutoHide()) -// UnregisterAutoHide(m_state); -// else if (lpPlacement->dwState == wxSTATE_FLOAT) -// UndockAppBar(); -// } -// -// // Update application bar's flags, size and position. -// m_flags |= wxFLAG_POSITIONSET; -// m_sizeDocked = lpPlacement->szDocked; -// if (lpPlacement->dwState == wxSTATE_FLOAT) { -// m_rect = lpPlacement->rcFloat; -// } else if (IsDocked(lpPlacement->dwState)) { -// m_sizeFloat.cx = lpPlacement->rcFloat.right - lpPlacement->rcFloat.left; -// m_sizeFloat.cy = lpPlacement->rcFloat.bottom - lpPlacement->rcFloat.top; -// GetDockedRect(lpPlacement->dwState, &m_rect); -// } else { -// // Application bar's state is unknown. -// wxFAIL; -// return false; -// } -// -// // Notify about the change of state. -// OnChangeState(lpPlacement->dwState); -// m_state = lpPlacement->dwState; -// -// SetAutoHide(lpPlacement->dwFlags & wxFLAG_AUTOHIDE); -// SetAlwaysOnTop(lpPlacement->dwFlags & wxFLAG_ALWAYSONTOP); -// } -// -// return true; -//} - - -void wxAppBar::MinimiseToEdge(wxState edge, wxWindow *wnd) -{ - wxASSERT(IsDocked(edge)); - - WXHWND hWnd; - if (!wnd) { - // No other window was specified. Minimize ourself. - wnd = this; - hWnd = m_hWnd; - } else - hWnd = wnd->GetHWND(); - - // If our window is hidden, there's nothing we can do. - if (hWnd == m_hWnd && !::IsWindowVisible(m_hWnd)) - return; - - if (m_state == wxSTATE_FLOAT) { - // Remember the last floating size. - RECT rect = {}; - wxVERIFY(::GetWindowRect(hWnd, &rect)); - m_sizeFloat.cx = rect.right - rect.left; - m_sizeFloat.cy = rect.bottom - rect.top; - } - - RECT rectTo; - if (IsAutoHide()) - GetAutoHideRect(edge, false, &rectTo); - else - GetDockedRect(edge, &rectTo); - - if (::wxGetDoWndAnimation()) { - // Do the animation. - RECT rectFrom; - wxVERIFY(::GetWindowRect(hWnd, &rectFrom)); - wxVERIFY(::DrawAnimatedRects(hWnd, IDANI_CAPTION, &rectFrom, &rectTo)); - } - - // Notify about the change of state. - OnChangeState(edge); - m_state = edge; - - if (hWnd != m_hWnd) { - // Hide the source window. - wnd->Hide(); - // ::SetWindowLong(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) &~ WS_VISIBLE); - - // Show the application bar. - Show(); - } else { - if (IsAutoHide()) { - // Register auto-hide application bar. - RegisterAutoHide(edge); - } else { - // Auto-hide failed or wasn't desired at all. - DockAppBar(edge); - } - } - - ::SetActiveWindow(m_hWnd); -} - - -void wxAppBar::MaximiseFromEdge(const RECT* rect) -{ - wxASSERT(::IsWindowVisible(m_hWnd)); - - RECT rectTo; - - if (!rect) { - // Calculate the destination rect. - rectTo.left = (::GetSystemMetrics(SM_CXSCREEN) - m_sizeFloat.cx) / 2; - rectTo.top = (::GetSystemMetrics(SM_CYSCREEN) - m_sizeFloat.cy) / 2; - rectTo.right = rectTo.left + m_sizeFloat.cx; - rectTo.bottom = rectTo.top + m_sizeFloat.cy; - - rect = &rectTo; - } else { - m_sizeFloat.cx = rect->right - rect->left; - m_sizeFloat.cy = rect->bottom - rect->top; - } - - if (::wxGetDoWndAnimation()) { - // Do the animation. - RECT rectFrom; - wxVERIFY(::GetWindowRect(m_hWnd, &rectFrom)); - wxVERIFY(::DrawAnimatedRects(m_hWnd, IDANI_CAPTION, &rectFrom, rect)); - } - - // Clean previous docking/auto-hide settings if required. - if (IsDocked(m_state)) { - if (IsAutoHide()) - UnregisterAutoHide(m_state); - else - UndockAppBar(); - } - - // Notify about the change of state. - OnChangeState(wxSTATE_FLOAT); - m_state = wxSTATE_FLOAT; - - wxVERIFY(::SetWindowPos(m_hWnd, GetZWnd(wxSTATE_FLOAT, m_flags), rect->left, rect->top, rect->right - rect->left, rect->bottom - rect->top, SWP_NOACTIVATE | SWP_DRAWFRAME | SWP_FRAMECHANGED)); -} - - -void wxAppBar::MaximiseFromEdge(wxWindow *wnd) -{ - wxASSERT(wnd); - wxASSERT(::IsWindowVisible(m_hWnd)); - - WXHWND hWnd = wnd->GetHWND(); - - RECT rectTo = {}; - wxVERIFY(::GetWindowRect(hWnd, &rectTo)); - m_sizeFloat.cx = rectTo.right - rectTo.left; - m_sizeFloat.cy = rectTo.bottom - rectTo.top; - - if (::wxGetDoWndAnimation()) { - // Do the animation. - RECT rectFrom; - wxVERIFY(::GetWindowRect(m_hWnd, &rectFrom)); - wxVERIFY(::DrawAnimatedRects(hWnd, IDANI_CAPTION, &rectFrom, &rectTo)); - } - - // Hide our window and show the destination window. - Hide(); - wnd->Show(); - // ::SetWindowLong(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) | WS_VISIBLE); - wxVERIFY(::SetForegroundWindow(hWnd)); - ::SetActiveWindow(hWnd); - // wxVERIFY(::RedrawWindow(hWnd, NULL, NULL, RDW_UPDATENOW | RDW_ALLCHILDREN | RDW_FRAME | RDW_INVALIDATE | RDW_ERASE)); -} - - -void wxAppBar::ShowAutoHideAppBar(bool bShow) -{ - RECT rcEnd; - bool - bFullDragOn, - bHidden = GetAutoHidden(), - bVisible = ::IsWindowVisible(m_hWnd) ? true : false; - - if (!IsAutoHide() || bHidden != bShow) { - // We're not setup for auto-hide or already in the desired state. - return; - } - - // Get our end window location. - GetAutoHideRect(m_state, !bHidden, &rcEnd); - - if (bVisible) { - RECT rcStart; - - // Only slide the window if the user has FullDrag turned on. - if (!::SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, &bFullDragOn, 0)) - bFullDragOn = false; - - // Get our start window location. - GetAutoHideRect(m_state, bHidden, &rcStart); - - if (bFullDragOn && (rcStart.left != rcEnd.left || rcStart.top != rcEnd.top || rcStart.right != rcEnd.right || rcStart.bottom != rcEnd.bottom)) { - // Get our starting and ending time. - DWORD dwTimeStart = ::GetTickCount(); - DWORD dwTimeElapsed; - RECT rcDelta; - - // Calculate difference between ending and starting rectangle. - rcDelta.left = rcEnd.left - rcStart.left; - rcDelta.top = rcEnd.top - rcStart.top; - rcDelta.right = rcEnd.right - rcStart.right; - rcDelta.bottom = rcEnd.bottom - rcStart.bottom; - - while ((dwTimeElapsed = ::GetTickCount() - dwTimeStart) < wxABT_AUTOHIDETIME) { - // Do the linear interpolation. - RECT rect; - rect.left = rcStart.left + ::MulDiv(rcDelta.left, dwTimeElapsed, wxABT_AUTOHIDETIME); - rect.top = rcStart.top + ::MulDiv(rcDelta.top, dwTimeElapsed, wxABT_AUTOHIDETIME); - rect.right = rcStart.right + ::MulDiv(rcDelta.right, dwTimeElapsed, wxABT_AUTOHIDETIME); - rect.bottom = rcStart.bottom + ::MulDiv(rcDelta.bottom, dwTimeElapsed, wxABT_AUTOHIDETIME); - - // Show the window at its changed position - wxVERIFY(::SetWindowPos(m_hWnd, NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER | SWP_NOACTIVATE)); - wxVERIFY(::UpdateWindow(m_hWnd)); - } - } - } - - if (bShow) - m_flags &= ~wxFLAG_AUTOHIDDEN; - else - m_flags |= wxFLAG_AUTOHIDDEN; - - if (bVisible) { - wxVERIFY(::SetWindowPos(m_hWnd, NULL, rcEnd.left, rcEnd.top, rcEnd.right - rcEnd.left, rcEnd.bottom - rcEnd.top, SWP_NOZORDER | SWP_NOACTIVATE)); - wxVERIFY(::UpdateWindow(m_hWnd)); - // Reset auto-hide timer. - m_timerID = ::SetTimer(m_hWnd, wxABT_AUTOHIDETIMERID, wxABT_AUTOHIDETIMERINTERVAL, NULL); - } -} - - -void wxAppBar::OnChangeState(wxState stateNew) -{ - if (stateNew == wxSTATE_FLOAT) { - if (m_flags & wxFLAG_HIDETASKBARTABWHENFLOATING) { - // Hide our application bar's entry on the Windows's taskbar. - wxModifyStyleEx(m_hWnd, 0, WS_EX_TOOLWINDOW); - if (m_taskbarList) - wxVERIFY(SUCCEEDED(m_taskbarList->DeleteTab(m_hWnd))); - } else if (m_flags & wxFLAG_HIDETASKBARTABWHENDOCKED) { - // Show our application bar's entry on the Windows's taskbar. - wxModifyStyleEx(m_hWnd, WS_EX_TOOLWINDOW, 0); - if (m_taskbarList) - wxVERIFY(SUCCEEDED(m_taskbarList->AddTab(m_hWnd))); - } - } else if (IsDocked(stateNew)) { - if (m_flags & wxFLAG_HIDETASKBARTABWHENDOCKED) { - // Hide our application bar's entry on the Windows's taskbar. - wxModifyStyleEx(m_hWnd, 0, WS_EX_TOOLWINDOW); - if (m_taskbarList) - wxVERIFY(SUCCEEDED(m_taskbarList->DeleteTab(m_hWnd))); - } else if (m_flags & wxFLAG_HIDETASKBARTABWHENFLOATING) { - // Show our application bar's entry on the Windows's taskbar. - wxModifyStyleEx(m_hWnd, WS_EX_TOOLWINDOW, 0); - if (m_taskbarList) - wxVERIFY(SUCCEEDED(m_taskbarList->AddTab(m_hWnd))); - } - } else { - // Unknown state. - wxFAIL; - } -} - - -void wxAppBar::OnChangeTaskBarState(UINT_PTR state) -{ - if (state != m_stateTaskBar) { - // No change, no fun. - return; - } - - if ((m_flags & wxFLAG_ALWAYSONTOPTASKBAR) && - (m_stateTaskBar & ABS_ALWAYSONTOP) != (state & ABS_ALWAYSONTOP)) { - // Always-on-top state of the taskbar changed and we're supposed to mimic it. - SetAlwaysOnTop((state & ABS_ALWAYSONTOP) ? true : false); - } - - if ((m_flags & wxFLAG_AUTOHIDETASKBAR) && - (m_stateTaskBar & ABS_AUTOHIDE) != (state & ABS_AUTOHIDE)) { - // Auto-hide state of the taskbar changed and we're supposed to mimic it. - SetAutoHide((state & ABS_AUTOHIDE) ? true : false); - } - - // Remember the state. - m_stateTaskBar = state; -} - - -void wxAppBar::OnWindowsArrange(bool WXUNUSED(bBeginning)) -{ -} - - -void wxAppBar::OnAutoHideDenied() -{ - wxMessageBox(wxT("There is already an auto hidden bar on this edge.\nOnly one auto hidden bar is allowed on each edge.\nAuto-hide feature is now off."), wxT("Warning"), wxOK | wxICON_WARNING, this); -} - - -WXLRESULT wxAppBar::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) -{ - switch (message) { - case WM_SHOWWINDOW: - if (wParam) { - // Do the false change of state notification, to allow initialization. - OnChangeState(m_state); - - if (IsDocked(m_state)) { - if (IsAutoHide()) { - // Register auto-hide application bar. - RegisterAutoHide(m_state); - } else { - // Auto-hide failed or wasn't desired at all. - DockAppBar(m_state); - } - } - - // We're all set. Show the window now. - return wxFrame::MSWWindowProc(message, wParam, lParam); - } else { - // Hide the window first, to avoid flicker. - WXLRESULT lResult = wxFrame::MSWWindowProc(message, wParam, lParam); - - // Clean previous docking/auto-hide settings if required. - if (IsDocked(m_state)) { - if (IsAutoHide()) - UnregisterAutoHide(m_state); - else - UndockAppBar(); - } - - return lResult; - } - - case WM_WINDOWPOSCHANGING: { - if (m_state != m_stateDesired && IsDocked(m_stateDesired)) { - wxASSERT(lParam); - LPWINDOWPOS lpwndpos = (LPWINDOWPOS)lParam; - - // When about to get docked, fix position and size to avoid Aero Snap interfering with window size. - RECT rect; - GetDockedRect(m_stateDesired, &rect); - lpwndpos->x = rect.left; - lpwndpos->y = rect.top; - lpwndpos->cx = rect.right - rect.left; - lpwndpos->cy = rect.bottom - rect.top; - lpwndpos->flags &= ~(SWP_NOMOVE | SWP_NOSIZE); - } - - return wxFrame::MSWWindowProc(message, wParam, lParam); - } - - case WM_WINDOWPOSCHANGED: { - WXLRESULT lResult = wxFrame::MSWWindowProc(message, wParam, lParam); - - if (IsDocked(m_state)) { - // When our window changes position, tell the Shell so that any - // auto-hidden application bar on our edge stays on top of our window making it - // always accessible to the user. - APPBARDATA abd = { sizeof(abd), m_hWnd }; - wxVERIFY(::SHAppBarMessage(ABM_WINDOWPOSCHANGED, &abd)); - } - - return lResult; - } - - case WM_ENTERSIZEMOVE: - m_stateDesired = m_state; - return wxFrame::MSWWindowProc(message, wParam, lParam); - - case WM_EXITSIZEMOVE: { - WXLRESULT lResult = wxFrame::MSWWindowProc(message, wParam, lParam); - - // Clean previous docking/auto-hide settings if required. - if (IsDocked(m_state) && - (m_stateDesired == wxSTATE_FLOAT || m_stateDesired != m_state && IsDocked(m_stateDesired))) - { - if (IsAutoHide()) - UnregisterAutoHide(m_state); - else if (m_stateDesired == wxSTATE_FLOAT) - UndockAppBar(); - } - - // Setup new docking/auto-hide settings. - if (IsDocked(m_stateDesired)) { - if (IsAutoHide()) { - // Application bar should be auto-hide. Try to setup it as so. - // Register auto-hide application bar. - RegisterAutoHide(m_stateDesired); - } else { - // Auto-hide failed or wasn't desired at all. - DockAppBar(m_stateDesired); - } - } - - // Notify about the change of state. - OnChangeState(m_stateDesired); - m_state = m_stateDesired; - m_stateDesired = wxSTATE_UNKNOWN; - - return lResult; - } - - case WM_MOVING: { - WXLRESULT lResult = wxFrame::MSWWindowProc(message, wParam, lParam); - - wxASSERT(lParam); - LPRECT lpRect = (LPRECT)lParam; - - // Phase 1. - Determine the desired state (which screen edge or floating) according to the mouse position. - - wxState uStateDesiredPrev = m_stateDesired; - DWORD dwPoint = ::GetMessagePos(); - wxPoint ptMouse(GET_X_LPARAM(dwPoint), GET_Y_LPARAM(dwPoint)); - - m_stateDesired = wxSTATE_UNKNOWN; - - if ((m_flags & wxFLAG_ALLOWFLOAT) && (::GetKeyState(VK_CONTROL) < 0 || !(m_flags & wxFLAG_ALLOWDOCKANY))) { - // The application bar's style allows floating and user is holding down the Ctrl key, or docking is disabled anyway, so we'll force float. - m_stateDesired = wxSTATE_FLOAT; - } else { - RECT rcWorkArea = {}; - INT iDist, iDistMin = INT_MAX; - - // Get the rectangle that bounds the size of the screen - // minus any docked (but not-autohidden) AppBars. - wxVERIFY(::SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWorkArea, 0)); - - // Test all four edges, to find the closest one. - if ((m_flags & wxFLAG_ALLOWDOCKTOP) && (iDist = ptMouse.y - rcWorkArea.top) < iDistMin) { - m_stateDesired = wxSTATE_TOP; - iDistMin = iDist; - } - if ((m_flags & wxFLAG_ALLOWDOCKBOTTOM) && (iDist = rcWorkArea.bottom - ptMouse.y) < iDistMin) { - m_stateDesired = wxSTATE_BOTTOM; - iDistMin = iDist; - } - if ((m_flags & wxFLAG_ALLOWDOCKLEFT) && (iDist = ptMouse.x - rcWorkArea.left) < iDistMin) { - m_stateDesired = wxSTATE_LEFT; - iDistMin = iDist; - } - if ((m_flags & wxFLAG_ALLOWDOCKRIGHT) && (iDist = rcWorkArea.right - ptMouse.x) < iDistMin) { - m_stateDesired = wxSTATE_RIGHT; - iDistMin = iDist; - } - if ((m_flags & wxFLAG_ALLOWFLOAT) && (iDist = wxMax(::GetSystemMetrics(SM_CXVSCROLL), ::GetSystemMetrics(SM_CYHSCROLL))) < iDistMin) { - m_stateDesired = wxSTATE_FLOAT; - iDistMin = iDist; - } - } - - // We must had come up with some useful state. - wxASSERT(m_stateDesired != wxSTATE_UNKNOWN); - - // Phase 2. - Calculate the desired rectangle, according to the desired state. - - if (m_stateDesired == wxSTATE_FLOAT) { - if (IsDocked(uStateDesiredPrev)) { - // We just switched from docked to floating state. Align the window according to the mouse pointer. - lpRect->left = ptMouse.x - m_sizeFloat.cx / 2; - lpRect->top = ptMouse.y; - - // We also resize back to floating window size. - lpRect->right = lpRect->left + m_sizeFloat.cx; - lpRect->bottom = lpRect->top + m_sizeFloat.cy; - } - } else if (IsDocked(m_stateDesired)) { - if (IsAutoHide()) { - // Calculate auto-hide window rect. - GetAutoHideRect(m_stateDesired, false, lpRect); - } else { - // Calculate docked window rect. - GetDockedRect(m_stateDesired, lpRect); - } - } else { - // Window is not floating. It's not docked either. Then what? - wxFAIL; - } - - if (m_stateDesired != uStateDesiredPrev) { - // Notify about the proposed change of state, but don't change the state yet. - OnChangeState(m_stateDesired); - } - - return lResult; - } - - case WM_SIZING: { - wxASSERT(lParam); - LPRECT lpRect = (LPRECT)lParam; - - if (m_stateDesired == wxSTATE_FLOAT) { - // Remember the floating window size. - m_sizeFloat.cx = lpRect->right - lpRect->left; - m_sizeFloat.cy = lpRect->bottom - lpRect->top; - } else if (IsDocked(m_stateDesired)) { - // Remember the docked window size. - if (IsDockedVert(m_stateDesired)) - m_sizeDocked.cx = lpRect->right - lpRect->left; - else - m_sizeDocked.cy = lpRect->bottom - lpRect->top; - } else { - // Unknown state. - wxFAIL; - } - - return wxFrame::MSWWindowProc(message, wParam, lParam); - } - - case WM_GETMINMAXINFO: { - WXLRESULT lResult = wxFrame::MSWWindowProc(message, wParam, lParam); - - wxASSERT(lParam); - LPMINMAXINFO lpMMI = (LPMINMAXINFO)lParam; - - // Convert client size to window size. - RECT rectClient = {}; - wxVERIFY(::GetClientRect(m_hWnd, &rectClient)); - if (rectClient.right - rectClient.left && rectClient.bottom - rectClient.top) { - RECT rectWindow = {}; - wxVERIFY(::GetWindowRect(m_hWnd, &rectWindow)); - lpMMI->ptMinTrackSize.x = m_sizeMin.cx + (rectWindow.right - rectWindow.left) - (rectClient.right - rectClient.left); - lpMMI->ptMinTrackSize.y = m_sizeMin.cy + (rectWindow.bottom - rectWindow.top ) - (rectClient.bottom - rectClient.top ); - } - - return lResult; - } - - case WM_NCMOUSEMOVE: - // If we are a docked, auto-hidden application bar, shown us - // when the user moves over our non-client area - ShowAutoHideAppBar(true); - - return wxFrame::MSWWindowProc(message, wParam, lParam); - - case WM_NCHITTEST: { - // Find out what the base class thinks is the hit test code. - WXLRESULT lResult = wxFrame::MSWWindowProc(message, wParam, lParam); - - if (HTSIZEFIRST <= lResult && lResult <= HTSIZELAST) { - if (GetAllowSizing()) { - if (IsDocked(m_state)) { - // When the application bar is docked, the user can resize only one edge. - // This next section determines which edge the user can resize. - // To allow resizing, the application bar window must have the WS_THICKFRAME style. - - RECT rcClient = {}; - wxPoint point(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); - - // Resizing IS allowed for the edge that the application bar is docked on. - // Get the location of the appbar's client area in screen coordinates. - wxVERIFY(::GetClientRect(m_hWnd, &rcClient)); - wxVERIFY(::ClientToScreen(m_hWnd, (LPPOINT)&rcClient)); - wxVERIFY(::ClientToScreen(m_hWnd, ((LPPOINT)&rcClient) + 1)); - - // Assume that we can't resize - lResult = HTBORDER; - - switch (m_state) { - case wxSTATE_LEFT: if (point.x > rcClient.right) lResult = HTRIGHT; break; - case wxSTATE_TOP: if (point.y > rcClient.bottom) lResult = HTBOTTOM; break; - case wxSTATE_RIGHT: if (point.x < rcClient.left) lResult = HTLEFT; break; - case wxSTATE_BOTTOM: if (point.y < rcClient.top) lResult = HTTOP; break; - } - } - } else { - // The sizing is locked. Pretend that the mouse is not on a resize border. - lResult = HTBORDER; - } - } - - return lResult; - } - - case WM_ACTIVATE: { - WXLRESULT lResult = wxFrame::MSWWindowProc(message, wParam, lParam); - - if (IsDocked(m_state)) { - // When our window changes activation state, tell the Shell so that any - // auto-hidden application bar on our edge stays on top of our window making it - // always accessible to the user. - APPBARDATA abd = { sizeof(abd), m_hWnd }; - wxVERIFY(::SHAppBarMessage(ABM_ACTIVATE, &abd)); - - if (LOWORD(wParam) == WA_INACTIVE && IsAutoHide()) { - // Hide the application bar if we are docked and auto-hidden. - ShowAutoHideAppBar(false); - } - } - - return lResult; - } - - case WM_TIMER: - if (wParam == wxABT_AUTOHIDETIMERID) { - if (!GetAutoHidden() && - IsDocked(m_state) && - GetActiveWindow() != m_hWnd) - { - // Get the position of the mouse and the application bar's position - // Everything must be in screen coordinates. - DWORD dwPoint = ::GetMessagePos(); - wxPoint pointMouse(GET_X_LPARAM(dwPoint), GET_Y_LPARAM(dwPoint)); - RECT rect = {}; - wxVERIFY(::GetWindowRect(m_hWnd, &rect)); - wxRect rectBounds(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top); - - // Add a little margin around the application bar - rectBounds.Inflate(2 * ::GetSystemMetrics(SM_CXDOUBLECLK), 2 * ::GetSystemMetrics(SM_CYDOUBLECLK)); - if (!rectBounds.Contains(pointMouse)) { - // If the mouse is NOT over or near the application bar, hide it. - ShowAutoHideAppBar(false); - } - } - - return 0; - } else - return wxFrame::MSWWindowProc(message, wParam, lParam); - - default: - if (message == WM_AB_NOTIFY) { - switch (wParam) { - case ABN_FULLSCREENAPP: - if (lParam) - m_flags |= wxFLAG_FULLSCREENAPPOPEN; - else - m_flags &= ~wxFLAG_FULLSCREENAPPOPEN; - OnChangeTaskBarState(GetTaskBarState()); - - if (::IsWindowVisible(m_hWnd)) { - // Set the Z-order. - wxVERIFY(::SetWindowPos(m_hWnd, GetZWnd(m_state, m_flags), 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOSENDCHANGING)); - } - break; - - case ABN_POSCHANGED: - if (IsDocked(m_state) && !IsAutoHide()) - DockAppBar(m_state); - break; - - case ABN_STATECHANGE: - // Taskbar's state changed. - OnChangeTaskBarState(GetTaskBarState()); - break; - - case ABN_WINDOWARRANGE: - OnWindowsArrange(lParam ? true : false); - break; - - default: - // Unknown message. - wxFAIL; - break; - } - - return 0; - } else - return wxFrame::MSWWindowProc(message, wParam, lParam); - } -} diff --git a/lib/wxExtend/src/stdafx.cpp b/lib/wxExtend/src/stdafx.cpp deleted file mode 100644 index 2ff81d0..0000000 --- a/lib/wxExtend/src/stdafx.cpp +++ /dev/null @@ -1,20 +0,0 @@ -/* - Copyright 2016 Amebis - - This file is part of wxExtend. - - wxExtend is free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wxExtend is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with wxExtend. If not, see . -*/ - -#include "stdafx.h" diff --git a/lib/wxExtend/src/stdafx.h b/lib/wxExtend/src/stdafx.h deleted file mode 100644 index e2693c8..0000000 --- a/lib/wxExtend/src/stdafx.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - Copyright 2016 Amebis - - This file is part of wxExtend. - - wxExtend is free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wxExtend is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with wxExtend. If not, see . -*/ - -#pragma once - -#include "../include/wxex/appbar.h" - -#include "../include/wxex/common.h" - -#include -#include