Adjust PostIt/FullScreen behaviour to mix well together.

Fixes a few glitches, makes use of WM_POPUP style.

git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository@395 f5eea248-9336-0410-98b8-ebc06183d4e3
pull/343/head^2
harrybharry 16 years ago
parent 28082233e3
commit 00682573a1

@ -69,7 +69,7 @@ struct SortTaskListPred
};
Notepad_plus::Notepad_plus(): Window(), _mainWindowStatus(0), _pDocTab(NULL), _pEditView(NULL),
_pMainSplitter(NULL), _isfullScreen(false),
_pMainSplitter(NULL),
_recordingMacro(false), _pTrayIco(NULL), _isUDDocked(false), _isRTL(false),
_linkTriggered(true), _isDocModifing(false), _isHotspotDblClicked(false), _sysMenuEntering(false),
_autoCompleteMain(&_mainEditView), _autoCompleteSub(&_subEditView), _smartHighlighter(&_findReplaceDlg),
@ -3363,59 +3363,7 @@ void Notepad_plus::command(int id)
case IDM_VIEW_POSTIT :
{
DWORD dwStyle = GetWindowLong(_hSelf, GWL_STYLE);
bool isPostItOn = (WS_CAPTION & dwStyle) == 0;
if (isPostItOn)
{
dwStyle |= (WS_CAPTION | WS_SIZEBOX);
::SetWindowLong(_hSelf, GWL_STYLE, dwStyle);
if (_beforePostIt.isStatusbarShown)
::SendMessage(_hSelf, NPPM_HIDESTATUSBAR, 0, FALSE);
if (_beforePostIt.isMenuShown)
::SendMessage(_hSelf, NPPM_HIDEMENU, 0, FALSE);
if (_beforePostIt.isToolbarShown)
::SendMessage(_hSelf, NPPM_HIDETOOLBAR, 0, FALSE);
if (_beforePostIt.isTabbarShown)
::SendMessage(_hSelf, NPPM_HIDETABBAR, 0, FALSE);
if (!_beforePostIt.isAlwaysOnTop)
::SendMessage(_hSelf, WM_COMMAND, IDM_VIEW_ALWAYSONTOP, 0);
_beforePostIt.isPostIt = false;
}
else // PostIt
{
NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI();
// get current status before switch to postIt
_beforePostIt.isPostIt = true;
_beforePostIt.isSizable = true;
_beforePostIt.isAlwaysOnTop = ::GetMenuState(_mainMenuHandle, IDM_VIEW_ALWAYSONTOP, MF_BYCOMMAND) == MF_CHECKED;
_beforePostIt.isMenuShown = ::SendMessage(_hSelf, NPPM_ISMENUHIDDEN, 0, 0) != TRUE;
_beforePostIt.isToolbarShown = ::SendMessage(_hSelf, NPPM_ISTOOLBARHIDDEN, 0, 0) != TRUE;
_beforePostIt.isTabbarShown = ::SendMessage(_hSelf, NPPM_ISTABBARHIDDEN, 0, 0) != TRUE;
_beforePostIt.isStatusbarShown = nppGUI._statusBarShow;
// PostIt!
dwStyle &= ~(WS_CAPTION | WS_SIZEBOX);
::SetWindowLong(_hSelf, GWL_STYLE, dwStyle);
if (nppGUI._statusBarShow)
::SendMessage(_hSelf, NPPM_HIDESTATUSBAR, 0, TRUE);
if (_beforePostIt.isMenuShown)
::SendMessage(_hSelf, NPPM_HIDEMENU, 0, TRUE);
if (_beforePostIt.isTabbarShown)
::SendMessage(_hSelf, NPPM_HIDETABBAR, 0, TRUE);
if (_beforePostIt.isToolbarShown)
::SendMessage(_hSelf, NPPM_HIDETOOLBAR, 0, TRUE);
if (!_beforePostIt.isAlwaysOnTop)
::SendMessage(_hSelf, WM_COMMAND, IDM_VIEW_ALWAYSONTOP, 0);
}
//::SendMessage(_hSelf, WM_SIZE, 0, 0);
postItToggle();
}
break;
@ -8199,11 +8147,10 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa
return FALSE;
}
if (_isfullScreen) //closing, return to windowed mode
if (_beforeSpecialView.isFullScreen) //closing, return to windowed mode
fullScreenToggle();
if (_beforePostIt.isPostIt)
::SendMessage(_hSelf, WM_COMMAND, IDM_VIEW_POSTIT, 0);
if (_beforeSpecialView.isPostIt) //closing, return to windowed mode
postItToggle();
if (_configStyleDlg.isCreated() && ::IsWindowVisible(_configStyleDlg.getHSelf()))
_configStyleDlg.restoreGlobalOverrideValues();
@ -8676,14 +8623,12 @@ LRESULT CALLBACK Notepad_plus::Notepad_plus_Proc(HWND hwnd, UINT Message, WPARAM
void Notepad_plus::fullScreenToggle()
{
RECT fullscreenArea; //RECT used to calculate window fullscrene size
_isfullScreen = !_isfullScreen;
if (_isfullScreen)
if (!_beforeSpecialView.isFullScreen) //toggle fullscreen on
{
_winPlace.length = sizeof(_winPlace);
::GetWindowPlacement(_hSelf, &_winPlace);
_beforeSpecialView._winPlace.length = sizeof(_beforeSpecialView._winPlace);
::GetWindowPlacement(_hSelf, &_beforeSpecialView._winPlace);
RECT fullscreenArea; //RECT used to calculate window fullscreen size
//Preset view area, in case something fails, primary monitor values
fullscreenArea.top = 0;
fullscreenArea.left = 0;
@ -8695,63 +8640,82 @@ void Notepad_plus::fullScreenToggle()
HMONITOR currentMonitor; //Handle to monitor where fullscreen should go
MONITORINFO mi; //Info of that monitor
//Caution, this will not work on windows 95, so probably add some checking of some sorts like Unicode checks, IF 95 were to be supported
currentMonitor = MonitorFromWindow(_hSelf, MONITOR_DEFAULTTONEAREST); //should always be valid monitor handle
currentMonitor = ::MonitorFromWindow(_hSelf, MONITOR_DEFAULTTONEAREST); //should always be valid monitor handle
mi.cbSize = sizeof(MONITORINFO);
if (GetMonitorInfo(currentMonitor, &mi) != FALSE)
if (::GetMonitorInfo(currentMonitor, &mi) != FALSE)
{
fullscreenArea = mi.rcMonitor;
fullscreenArea.right -= fullscreenArea.left;
fullscreenArea.bottom -= fullscreenArea.top;
}
}
//Hide menu
::SetMenu(_hSelf, NULL);
//Hide window so windows can properly update it
::ShowWindow(_hSelf, SW_HIDE);
//Setup GUI
if (!_beforeSpecialView.isPostIt)
{
//only change the GUI if not already done by postit
_beforeSpecialView.isMenuShown = ::SendMessage(_hSelf, NPPM_ISMENUHIDDEN, 0, 0) != TRUE;
if (_beforeSpecialView.isMenuShown)
::SendMessage(_hSelf, NPPM_HIDEMENU, 0, TRUE);
//Hide rebar
_rebarTop.display(false);
_rebarBottom.display(false);
}
//Hide window so windows can properly update it
::ShowWindow(_hSelf, SW_HIDE);
//Set popup style for fullscreen window and store the old style
_prevStyles = ::SetWindowLongPtr( _hSelf, GWL_STYLE, WS_POPUP );
if (!_prevStyles) { //something went wrong, use default settings
_prevStyles = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN;
if (!_beforeSpecialView.isPostIt)
{
_beforeSpecialView.preStyle = ::SetWindowLongPtr( _hSelf, GWL_STYLE, WS_POPUP );
if (!_beforeSpecialView.preStyle) { //something went wrong, use default settings
_beforeSpecialView.preStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN;
}
}
//Set topmost window, show the window and redraw it
::SetWindowPos(_hSelf, HWND_TOPMOST, fullscreenArea.left, fullscreenArea.top, fullscreenArea.right, fullscreenArea.bottom, SWP_NOZORDER);
//Set fullscreen window, highest non-top z-order, show the window and redraw it (refreshing the windowmanager cache aswell)
::ShowWindow(_hSelf, SW_SHOW);
::SendMessage(_hSelf, WM_SIZE, 0, 0);
::SetWindowPos(_hSelf, HWND_TOP, fullscreenArea.left, fullscreenArea.top, fullscreenArea.right, fullscreenArea.bottom, SWP_NOZORDER|SWP_DRAWFRAME|SWP_FRAMECHANGED);
::SetForegroundWindow(_hSelf);
}
else
else //toggle fullscreen off
{
//Hide window for updating, restore style and menu then restore position and Z-Order
::ShowWindow(_hSelf, SW_HIDE);
NppGUI & nppGUI = (NppGUI &)((NppParameters::getInstance())->getNppGUI());
if (nppGUI._menuBarShow)
::SetMenu(_hSelf, _mainMenuHandle);
::SetWindowLongPtr( _hSelf, GWL_STYLE, _prevStyles);
::SetWindowPos(_hSelf, HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOREDRAW|SWP_NOZORDER);
//Setup GUI
if (!_beforeSpecialView.isPostIt)
{
//only change the GUI if postit isnt active
if (_beforeSpecialView.isMenuShown)
::SendMessage(_hSelf, NPPM_HIDEMENU, 0, FALSE);
//Show rebar
_rebarTop.display(true);
_rebarBottom.display(true);
}
//Set old style if not fullscreen
if (!_beforeSpecialView.isPostIt)
{
::SetWindowLongPtr( _hSelf, GWL_STYLE, _beforeSpecialView.preStyle);
//Redraw the window and refresh windowmanager cache, dont do anything else, sizing is done later on
::SetWindowPos(_hSelf, HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_DRAWFRAME|SWP_FRAMECHANGED);
::ShowWindow(_hSelf, SW_SHOW);
}
if (_winPlace.length)
if (_beforeSpecialView._winPlace.length)
{
if (_winPlace.showCmd == SW_SHOWMAXIMIZED)
if (_beforeSpecialView._winPlace.showCmd == SW_SHOWMAXIMIZED)
{
::ShowWindow(_hSelf, SW_RESTORE);
//::ShowWindow(_hSelf, SW_RESTORE);
::ShowWindow(_hSelf, SW_SHOWMAXIMIZED);
}
else
{
::SetWindowPlacement(_hSelf, &_winPlace);
::SendMessage(_hSelf, WM_SIZE, 0, 0);
::SetWindowPlacement(_hSelf, &_beforeSpecialView._winPlace);
}
}
else //fallback
@ -8759,9 +8723,95 @@ void Notepad_plus::fullScreenToggle()
::ShowWindow(_hSelf, SW_SHOW);
}
}
::SetForegroundWindow(_hSelf);
//::SetForegroundWindow(_hSelf);
_beforeSpecialView.isFullScreen = !_beforeSpecialView.isFullScreen;
::SendMessage(_hSelf, WM_SIZE, 0, 0);
}
void Notepad_plus::postItToggle()
{
NppParameters * pNppParam = NppParameters::getInstance();
if (!_beforeSpecialView.isPostIt) // PostIt disabled, enable it
{
NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI();
// get current status before switch to postIt
//check these always
{
_beforeSpecialView.isAlwaysOnTop = ::GetMenuState(_mainMenuHandle, IDM_VIEW_ALWAYSONTOP, MF_BYCOMMAND) == MF_CHECKED;
_beforeSpecialView.isTabbarShown = ::SendMessage(_hSelf, NPPM_ISTABBARHIDDEN, 0, 0) != TRUE;
_beforeSpecialView.isStatusbarShown = nppGUI._statusBarShow;
if (nppGUI._statusBarShow)
::SendMessage(_hSelf, NPPM_HIDESTATUSBAR, 0, TRUE);
if (_beforeSpecialView.isTabbarShown)
::SendMessage(_hSelf, NPPM_HIDETABBAR, 0, TRUE);
if (!_beforeSpecialView.isAlwaysOnTop)
::SendMessage(_hSelf, WM_COMMAND, IDM_VIEW_ALWAYSONTOP, 0);
}
//Only check these if not fullscreen
if (!_beforeSpecialView.isFullScreen)
{
_beforeSpecialView.isMenuShown = ::SendMessage(_hSelf, NPPM_ISMENUHIDDEN, 0, 0) != TRUE;
if (_beforeSpecialView.isMenuShown)
::SendMessage(_hSelf, NPPM_HIDEMENU, 0, TRUE);
//Hide rebar
_rebarTop.display(false);
_rebarBottom.display(false);
}
// PostIt!
//Set popup style for fullscreen window and store the old style
if (!_beforeSpecialView.isFullScreen)
{
//Hide window so windows can properly update it
::ShowWindow(_hSelf, SW_HIDE);
_beforeSpecialView.preStyle = ::SetWindowLongPtr( _hSelf, GWL_STYLE, WS_POPUP );
if (!_beforeSpecialView.preStyle) { //something went wrong, use default settings
_beforeSpecialView.preStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN;
}
//Redraw the window and refresh windowmanager cache, dont do anything else, sizing is done later on
::SetWindowPos(_hSelf, HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_DRAWFRAME|SWP_FRAMECHANGED);
::ShowWindow(_hSelf, SW_SHOW);
}
}
else //PostIt enabled, disable it
{
//Setup GUI
if (!_beforeSpecialView.isFullScreen)
{
//only change the these parts of GUI if not already done by fullscreen
if (_beforeSpecialView.isMenuShown)
::SendMessage(_hSelf, NPPM_HIDEMENU, 0, FALSE);
//Show rebar
_rebarTop.display(true);
_rebarBottom.display(true);
}
//Do this GUI config always
if (_beforeSpecialView.isStatusbarShown)
::SendMessage(_hSelf, NPPM_HIDESTATUSBAR, 0, FALSE);
if (_beforeSpecialView.isTabbarShown)
::SendMessage(_hSelf, NPPM_HIDETABBAR, 0, FALSE);
if (!_beforeSpecialView.isAlwaysOnTop)
::SendMessage(_hSelf, WM_COMMAND, IDM_VIEW_ALWAYSONTOP, 0);
//restore window style if not fullscreen
if (!_beforeSpecialView.isFullScreen)
{
//dwStyle |= (WS_CAPTION | WS_SIZEBOX);
::ShowWindow(_hSelf, SW_HIDE);
::SetWindowLongPtr(_hSelf, GWL_STYLE, _beforeSpecialView.preStyle);
//Redraw the window and refresh windowmanager cache, dont do anything else, sizing is done later on
::SetWindowPos(_hSelf, HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_DRAWFRAME|SWP_FRAMECHANGED);
::ShowWindow(_hSelf, SW_SHOW);
}
}
_beforeSpecialView.isPostIt = !_beforeSpecialView.isPostIt;
::SendMessage(_hSelf, WM_SIZE, 0, 0);
}
void Notepad_plus::doSynScorll(HWND whichView)
{

@ -86,16 +86,29 @@ struct iconLocator {
: listIndex(iList), iconIndex(iIcon), iconLocation(iconLoc){};
};
struct PostItConf {
bool isPostIt; // WS_CAPTION
bool isSizable; // WS_SIZEBOX
bool isAlwaysOnTop;
struct VisibleGUIConf {
bool isPostIt;
bool isFullScreen;
//Used by both views
bool isMenuShown;
bool isToolbarShown;
//bool isToolbarShown; //toolbar forcefully hidden by hiding rebar
DWORD_PTR preStyle;
//used by postit only
bool isTabbarShown;
bool isAlwaysOnTop;
bool isStatusbarShown;
PostItConf() : isPostIt(false), isSizable(true), isAlwaysOnTop(false),\
isMenuShown(true), isToolbarShown(true), isTabbarShown(true), isStatusbarShown(true){};
//used by fullscreen only
WINDOWPLACEMENT _winPlace;
VisibleGUIConf() : isPostIt(false), isFullScreen(false),
isAlwaysOnTop(false), isMenuShown(true), isTabbarShown(true),
isStatusbarShown(true), preStyle(WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN)
{
_winPlace.length = 0;
};
};
class FileDialog;
@ -269,13 +282,10 @@ private:
HMENU _mainMenuHandle;
bool _sysMenuEntering;
LONG_PTR _prevStyles;
// For FullScreen feature
bool _isfullScreen;
RECT _rcWorkArea;
WINDOWPLACEMENT _winPlace;
// For FullScreen/PostIt features
VisibleGUIConf _beforeSpecialView;
void fullScreenToggle();
void postItToggle();
// Keystroke macro recording and playback
Macro _macro;
@ -381,8 +391,6 @@ private:
//User dialog docking
void dockUserDlg();
void undockUserDlg();
//PostItConf _postIt;
PostItConf _beforePostIt;
//View visibility
void showView(int whichOne);

Loading…
Cancel
Save