mirror of
				https://github.com/notepad-plus-plus/notepad-plus-plus.git
				synced 2025-11-04 05:23:56 +01:00 
			
		
		
		
	git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository/trunk@1015 f5eea248-9336-0410-98b8-ebc06183d4e3
		
			
				
	
	
		
			237 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			237 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// This file is part of Notepad++ project
 | 
						|
// Copyright (C)2003 Don HO <don.h@free.fr>
 | 
						|
//
 | 
						|
// This program 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 2 of the License, or (at your option) any later version.
 | 
						|
//
 | 
						|
// Note that the GPL places important restrictions on "derived works", yet
 | 
						|
// it does not provide a detailed definition of that term.  To avoid      
 | 
						|
// misunderstandings, we consider an application to constitute a          
 | 
						|
// "derivative work" for the purpose of this license if it does any of the
 | 
						|
// following:                                                             
 | 
						|
// 1. Integrates source code from Notepad++.
 | 
						|
// 2. Integrates/includes/aggregates Notepad++ into a proprietary executable
 | 
						|
//    installer, such as those produced by InstallShield.
 | 
						|
// 3. Links to a library or executes a program that does any of the above.
 | 
						|
//
 | 
						|
// This program 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 this program; if not, write to the Free Software
 | 
						|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
						|
 | 
						|
 | 
						|
#include "precompiledHeaders.h"
 | 
						|
#include "Notepad_plus_Window.h"
 | 
						|
 | 
						|
const TCHAR Notepad_plus_Window::_className[32] = TEXT("Notepad++");
 | 
						|
HWND Notepad_plus_Window::gNppHWND = NULL;
 | 
						|
 | 
						|
void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLine, CmdLineParams *cmdLineParams)
 | 
						|
{
 | 
						|
	time_t timestampBegin = 0;
 | 
						|
	if (cmdLineParams->_showLoadingTime)
 | 
						|
		timestampBegin = time(NULL);
 | 
						|
 | 
						|
	Window::init(hInst, parent);
 | 
						|
	WNDCLASS nppClass;
 | 
						|
 | 
						|
	nppClass.style = CS_BYTEALIGNWINDOW | CS_DBLCLKS;
 | 
						|
	nppClass.lpfnWndProc = Notepad_plus_Proc;
 | 
						|
	nppClass.cbClsExtra = 0;
 | 
						|
	nppClass.cbWndExtra = 0;
 | 
						|
	nppClass.hInstance = _hInst;
 | 
						|
	nppClass.hIcon = ::LoadIcon(hInst, MAKEINTRESOURCE(IDI_M30ICON));
 | 
						|
	nppClass.hCursor = ::LoadCursor(NULL, IDC_ARROW);
 | 
						|
	nppClass.hbrBackground = ::CreateSolidBrush(::GetSysColor(COLOR_MENU));
 | 
						|
	nppClass.lpszMenuName = MAKEINTRESOURCE(IDR_M30_MENU);
 | 
						|
	nppClass.lpszClassName = _className;
 | 
						|
 | 
						|
	_isPrelaunch = cmdLineParams->_isPreLaunch;
 | 
						|
 | 
						|
	if (!::RegisterClass(&nppClass))
 | 
						|
	{
 | 
						|
		throw std::runtime_error("Notepad_plus_Window::init : RegisterClass() function failed");
 | 
						|
	}
 | 
						|
 | 
						|
	RECT workAreaRect;
 | 
						|
	::SystemParametersInfo(SPI_GETWORKAREA, 0, &workAreaRect, 0);
 | 
						|
 | 
						|
	NppParameters *pNppParams = NppParameters::getInstance();
 | 
						|
	const NppGUI & nppGUI = pNppParams->getNppGUI();
 | 
						|
 | 
						|
	if (cmdLineParams->_isNoPlugin)
 | 
						|
		_notepad_plus_plus_core._pluginsManager.disable();
 | 
						|
	
 | 
						|
	_hSelf = ::CreateWindowEx(
 | 
						|
					WS_EX_ACCEPTFILES | (_notepad_plus_plus_core._nativeLangSpeaker.isRTL()?WS_EX_LAYOUTRTL:0),\
 | 
						|
					_className,\
 | 
						|
					TEXT("Notepad++"),\
 | 
						|
					WS_OVERLAPPEDWINDOW	| WS_CLIPCHILDREN,\
 | 
						|
					// CreateWindowEx bug : set all 0 to walk around the pb
 | 
						|
					0, 0, 0, 0,\
 | 
						|
					_hParent,\
 | 
						|
					NULL,\
 | 
						|
					_hInst,\
 | 
						|
					(LPVOID)this); // pass the ptr of this instantiated object
 | 
						|
                                   // for retrieve it in Notepad_plus_Proc from 
 | 
						|
                                   // the CREATESTRUCT.lpCreateParams afterward.
 | 
						|
 | 
						|
	if (!_hSelf)
 | 
						|
	{
 | 
						|
		throw std::runtime_error("Notepad_plus_Window::init : CreateWindowEx() function return null");
 | 
						|
	}
 | 
						|
 | 
						|
	_notepad_plus_plus_core.staticCheckMenuAndTB();
 | 
						|
 | 
						|
	gNppHWND = _hSelf;
 | 
						|
 | 
						|
	// In setting the startup window position, take into account that the last-saved
 | 
						|
	// position might have assumed a second monitor that's no longer available.
 | 
						|
	POINT newUpperLeft;
 | 
						|
	newUpperLeft.x = nppGUI._appPos.left;
 | 
						|
	newUpperLeft.y = nppGUI._appPos.top;
 | 
						|
 | 
						|
	// GetSystemMetrics does not support the multi-monitor values on Windows NT and Windows 95.
 | 
						|
	winVer winVersion = pNppParams->getWinVersion();
 | 
						|
	if ((winVersion != WV_95) && (winVersion != WV_NT)) 
 | 
						|
	{
 | 
						|
		int margin = ::GetSystemMetrics(SM_CYSMCAPTION);
 | 
						|
		if (newUpperLeft.x > ::GetSystemMetrics(SM_CXVIRTUALSCREEN)-margin)
 | 
						|
			newUpperLeft.x = workAreaRect.right - nppGUI._appPos.right;
 | 
						|
		if (newUpperLeft.x + nppGUI._appPos.right < ::GetSystemMetrics(SM_XVIRTUALSCREEN)+margin)
 | 
						|
			newUpperLeft.x = workAreaRect.left;
 | 
						|
		if (newUpperLeft.y > ::GetSystemMetrics(SM_CYVIRTUALSCREEN)-margin)
 | 
						|
			newUpperLeft.y = workAreaRect.bottom - nppGUI._appPos.bottom;
 | 
						|
		if (newUpperLeft.y + nppGUI._appPos.bottom < ::GetSystemMetrics(SM_YVIRTUALSCREEN)+margin)
 | 
						|
			newUpperLeft.y = workAreaRect.top;
 | 
						|
	}
 | 
						|
 | 
						|
	if (cmdLineParams->isPointValid())
 | 
						|
		::MoveWindow(_hSelf, cmdLineParams->_point.x, cmdLineParams->_point.y, nppGUI._appPos.right, nppGUI._appPos.bottom, TRUE);
 | 
						|
	else
 | 
						|
		::MoveWindow(_hSelf, newUpperLeft.x, newUpperLeft.y, nppGUI._appPos.right, nppGUI._appPos.bottom, TRUE);
 | 
						|
	
 | 
						|
	if (nppGUI._tabStatus & TAB_MULTILINE)
 | 
						|
		::SendMessage(_hSelf, WM_COMMAND, IDM_VIEW_DRAWTABBAR_MULTILINE, 0);
 | 
						|
 | 
						|
	if (!nppGUI._menuBarShow)
 | 
						|
		::SetMenu(_hSelf, NULL);
 | 
						|
	
 | 
						|
	if (cmdLineParams->_isNoTab || (nppGUI._tabStatus & TAB_HIDE))
 | 
						|
	{
 | 
						|
		::SendMessage(_hSelf, NPPM_HIDETABBAR, 0, TRUE);
 | 
						|
	}
 | 
						|
 | 
						|
	if (cmdLineParams->_alwaysOnTop)
 | 
						|
	{
 | 
						|
		::SendMessage(_hSelf, WM_COMMAND, IDM_VIEW_ALWAYSONTOP, 0);
 | 
						|
	}
 | 
						|
    _notepad_plus_plus_core._rememberThisSession = !cmdLineParams->_isNoSession;
 | 
						|
	if (nppGUI._rememberLastSession && !cmdLineParams->_isNoSession)
 | 
						|
	{
 | 
						|
		_notepad_plus_plus_core.loadLastSession();
 | 
						|
	}
 | 
						|
 | 
						|
	if (!cmdLineParams->_isPreLaunch)
 | 
						|
	{
 | 
						|
		if (cmdLineParams->isPointValid())
 | 
						|
			::ShowWindow(_hSelf, SW_SHOW);
 | 
						|
		else
 | 
						|
			::ShowWindow(_hSelf, nppGUI._isMaximized?SW_MAXIMIZE:SW_SHOW);
 | 
						|
	}
 | 
						|
	else
 | 
						|
	{
 | 
						|
		_notepad_plus_plus_core._pTrayIco = new trayIconControler(_hSelf, IDI_M30ICON, IDC_MINIMIZED_TRAY, ::LoadIcon(_hInst, MAKEINTRESOURCE(IDI_M30ICON)), TEXT(""));
 | 
						|
		_notepad_plus_plus_core._pTrayIco->doTrayIcon(ADD);
 | 
						|
	}
 | 
						|
 | 
						|
    if (cmdLine)
 | 
						|
    {
 | 
						|
		_notepad_plus_plus_core.loadCommandlineParams(cmdLine, cmdLineParams);
 | 
						|
    }
 | 
						|
 | 
						|
	vector<generic_string> fileNames;
 | 
						|
	vector<generic_string> patterns;
 | 
						|
	patterns.push_back(TEXT("*.xml"));
 | 
						|
	
 | 
						|
	generic_string nppDir = pNppParams->getNppPath();
 | 
						|
#ifdef UNICODE
 | 
						|
	LocalizationSwitcher & localizationSwitcher = pNppParams->getLocalizationSwitcher();
 | 
						|
	wstring localizationDir = nppDir;
 | 
						|
	PathAppend(localizationDir, TEXT("localization\\"));
 | 
						|
 | 
						|
	_notepad_plus_plus_core.getMatchedFileNames(localizationDir.c_str(), patterns, fileNames, false, false);
 | 
						|
	for (size_t i = 0 ; i < fileNames.size() ; i++)
 | 
						|
	{
 | 
						|
		localizationSwitcher.addLanguageFromXml(fileNames[i].c_str());
 | 
						|
	}
 | 
						|
#endif
 | 
						|
 | 
						|
	fileNames.clear();
 | 
						|
	ThemeSwitcher & themeSwitcher = pNppParams->getThemeSwitcher();
 | 
						|
	
 | 
						|
	//  Get themes from both npp install themes dir and app data themes dir with the per user
 | 
						|
	//  overriding default themes of the same name.
 | 
						|
 | 
						|
	generic_string themeDir;
 | 
						|
    if (pNppParams->getAppDataNppDir() && pNppParams->getAppDataNppDir()[0])
 | 
						|
    {
 | 
						|
        themeDir = pNppParams->getAppDataNppDir();
 | 
						|
	    PathAppend(themeDir, TEXT("themes\\"));
 | 
						|
	    _notepad_plus_plus_core.getMatchedFileNames(themeDir.c_str(), patterns, fileNames, false, false);
 | 
						|
	    for (size_t i = 0 ; i < fileNames.size() ; i++)
 | 
						|
	    {
 | 
						|
		    themeSwitcher.addThemeFromXml(fileNames[i].c_str());
 | 
						|
	    }
 | 
						|
    }
 | 
						|
	fileNames.clear();
 | 
						|
	themeDir.clear();
 | 
						|
	themeDir = nppDir.c_str(); // <- should use the pointer to avoid the constructor of copy
 | 
						|
	PathAppend(themeDir, TEXT("themes\\"));
 | 
						|
	_notepad_plus_plus_core.getMatchedFileNames(themeDir.c_str(), patterns, fileNames, false, false);
 | 
						|
	for (size_t i = 0 ; i < fileNames.size() ; i++)
 | 
						|
	{
 | 
						|
		generic_string themeName( themeSwitcher.getThemeFromXmlFileName(fileNames[i].c_str()) );
 | 
						|
		if (! themeSwitcher.themeNameExists(themeName.c_str()) ) 
 | 
						|
		{
 | 
						|
			themeSwitcher.addThemeFromXml(fileNames[i].c_str());
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	for (size_t i = 0 ; i < _notepad_plus_plus_core._internalFuncIDs.size() ; i++)
 | 
						|
		::SendMessage(_hSelf, WM_COMMAND, _notepad_plus_plus_core._internalFuncIDs[i], 0);
 | 
						|
 | 
						|
	// Notify plugins that Notepad++ is ready
 | 
						|
	SCNotification scnN;
 | 
						|
	scnN.nmhdr.code = NPPN_READY;
 | 
						|
	scnN.nmhdr.hwndFrom = _hSelf;
 | 
						|
	scnN.nmhdr.idFrom = 0;
 | 
						|
	_notepad_plus_plus_core._pluginsManager.notify(&scnN);
 | 
						|
 | 
						|
	if (cmdLineParams->_showLoadingTime)
 | 
						|
	{
 | 
						|
		time_t timestampEnd = time(NULL);
 | 
						|
		double loadTime = difftime(timestampEnd, timestampBegin);
 | 
						|
 | 
						|
		char dest[256];
 | 
						|
		sprintf(dest, "Loading time : %.2lf seconds", loadTime);
 | 
						|
		::MessageBoxA(NULL, dest, "", MB_OK);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
bool Notepad_plus_Window::isDlgsMsg(MSG *msg, bool unicodeSupported) const 
 | 
						|
{
 | 
						|
	for (size_t i = 0; i < _notepad_plus_plus_core._hModelessDlgs.size(); i++)
 | 
						|
	{
 | 
						|
		if (unicodeSupported?(::IsDialogMessageW(_notepad_plus_plus_core._hModelessDlgs[i], msg)):(::IsDialogMessageA(_notepad_plus_plus_core._hModelessDlgs[i], msg)))
 | 
						|
			return true;
 | 
						|
	}
 | 
						|
	return false;
 | 
						|
}
 |