From b8c8283a5d9a4329d1a3bb558d62d2fa9f1d22e9 Mon Sep 17 00:00:00 2001 From: Don Ho Date: Wed, 11 Nov 2009 23:55:18 +0000 Subject: [PATCH] [NEW_FEATURE] (Author : Slurdge) Add system tray context menu and new command argument "-systemtray". [NEW_FEATURE] Add new command argument "--help". git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository/trunk@558 f5eea248-9336-0410-98b8-ebc06183d4e3 --- PowerEditor/src/Notepad_plus.cpp | 136 ++++++++++++++++++++++++------- PowerEditor/src/Notepad_plus.h | 1 + PowerEditor/src/Notepad_plus.rc | 15 ++++ PowerEditor/src/Parameters.h | 1 + PowerEditor/src/menuCmdID.h | 7 ++ PowerEditor/src/resource.h | 2 + PowerEditor/src/winmain.cpp | 44 ++++++---- 7 files changed, 162 insertions(+), 44 deletions(-) diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index 457db7dc3..18e03fe54 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -204,6 +204,8 @@ void Notepad_plus::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLine, CmdL nppClass.lpszMenuName = MAKEINTRESOURCE(IDR_M30_MENU); nppClass.lpszClassName = _className; + _isPrelaunch = cmdLineParams->_isPreLaunch; + if (!::RegisterClass(&nppClass)) { systemMessage(TEXT("System Err")); @@ -260,6 +262,7 @@ void Notepad_plus::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLine, CmdL 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 @@ -282,10 +285,18 @@ void Notepad_plus::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLine, CmdL loadLastSession(); } - if (cmdLineParams->isPointValid()) - ::ShowWindow(_hSelf, SW_SHOW); + if (!cmdLineParams->_isPreLaunch) + { + if (cmdLineParams->isPointValid()) + ::ShowWindow(_hSelf, SW_SHOW); + else + ::ShowWindow(_hSelf, nppGUI._isMaximized?SW_MAXIMIZE:SW_SHOW); + } else - ::ShowWindow(_hSelf, nppGUI._isMaximized?SW_MAXIMIZE:SW_SHOW); + { + _pTrayIco = new trayIconControler(_hSelf, IDI_M30ICON, IDC_MINIMIZED_TRAY, ::LoadIcon(_hInst, MAKEINTRESOURCE(IDI_M30ICON)), TEXT("")); + _pTrayIco->doTrayIcon(ADD); + } if (cmdLine) { @@ -690,7 +701,8 @@ BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isReadOnly) if (_pTrayIco->isInTray()) { ::ShowWindow(_hSelf, SW_SHOW); - _pTrayIco->doTrayIcon(REMOVE); + if (!_isPrelaunch) + _pTrayIco->doTrayIcon(REMOVE); ::SendMessage(_hSelf, WM_SIZE, 0, 0); } } @@ -767,7 +779,8 @@ BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isReadOnly) if (_pTrayIco->isInTray()) { ::ShowWindow(_hSelf, SW_SHOW); - _pTrayIco->doTrayIcon(REMOVE); + if (!_isPrelaunch) + _pTrayIco->doTrayIcon(REMOVE); ::SendMessage(_hSelf, WM_SIZE, 0, 0); } } @@ -3405,11 +3418,9 @@ void Notepad_plus::command(int id) switch (id) { case IDM_FILE_NEW: - { fileNew(); - } - break; - + break; + case IDM_FILE_OPEN: fileOpen(); break; @@ -4656,13 +4667,7 @@ void Notepad_plus::command(int id) ::ShellExecute(NULL, TEXT("open"), TEXT("http://sourceforge.net/apps/mediawiki/notepad-plus/index.php?title=Main_Page"), NULL, NULL, SW_SHOWNORMAL); break; } -/* - case IDM_WIKIFAQ: - { - ::ShellExecute(NULL, TEXT("open"), TEXT("http://notepad-plus.wiki.sourceforge.net/FAQ"), NULL, NULL, SW_SHOWNORMAL); - break; - } -*/ + case IDM_FORUM: { ::ShellExecute(NULL, TEXT("open"), TEXT("http://sourceforge.net/forum/?group_id=95717"), NULL, NULL, SW_SHOWNORMAL); @@ -4841,6 +4846,53 @@ void Notepad_plus::command(int id) } break; + + case IDM_POPUP_FILE_NEW: + { + NppGUI & nppGUI = (NppGUI &)((NppParameters::getInstance())->getNppGUI()); + ::ShowWindow(_hSelf, nppGUI._isMaximized?SW_MAXIMIZE:SW_SHOW); + fileNew(); + } + break; + + case IDM_POPUP_FILE_ACTIVATE_OR_NEW: + { + NppGUI & nppGUI = (NppGUI &)((NppParameters::getInstance())->getNppGUI()); + ::ShowWindow(_hSelf, nppGUI._isMaximized?SW_MAXIMIZE:SW_SHOW); + } + break; + + case IDM_POPUP_FILE_NEW_AND_PASTE: + { + NppGUI & nppGUI = (NppGUI &)((NppParameters::getInstance())->getNppGUI()); + ::ShowWindow(_hSelf, nppGUI._isMaximized?SW_MAXIMIZE:SW_SHOW); + BufferID bufferID = _pEditView->getCurrentBufferID(); + Buffer * buf = MainFileManager->getBufferByID(bufferID); + if (!buf->isUntitled() || buf->docLength() != 0) + { + fileNew(); + } + command(IDM_EDIT_PASTE); + } + break; + + case IDM_POPUP_FILE_OPEN: + { + NppGUI & nppGUI = (NppGUI &)((NppParameters::getInstance())->getNppGUI()); + ::ShowWindow(_hSelf, nppGUI._isMaximized?SW_MAXIMIZE:SW_SHOW); + fileOpen(); + } + break; + + case IDM_POPUP_CLOSE: + { + _isPrelaunch = false; + _pTrayIco->doTrayIcon(REMOVE); + if (!::IsWindowVisible(_hSelf)) + ::SendMessage(_hSelf, WM_CLOSE, 0,0); + } + break; + default : if (id > IDM_FILEMENU_LASTONE && id < (IDM_FILEMENU_LASTONE + _lastRecentFileList.getMaxNbLRF() + 1)) { @@ -7654,7 +7706,7 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa _dockingManager.init(_hInst, hwnd, &_pMainWindow); - if (nppGUI._isMinimizedToTray) + if (nppGUI._isMinimizedToTray && _pTrayIco == NULL) _pTrayIco = new trayIconControler(_hSelf, IDI_M30ICON, IDC_MINIMIZED_TRAY, ::LoadIcon(_hInst, MAKEINTRESOURCE(IDI_M30ICON)), TEXT("")); checkSyncState(); @@ -9152,6 +9204,11 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa case WM_QUERYENDSESSION: case WM_CLOSE: { + if (!_isPrelaunch) + { + _pTrayIco->doTrayIcon(REMOVE); + } + const NppGUI & nppgui = pNppParam->getNppGUI(); Session currentSession; if (nppgui._rememberLastSession) @@ -9200,8 +9257,16 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa saveSession(currentSession); - //Sends WM_DESTROY, Notepad++ will end - ::DestroyWindow(hwnd); + if (!_isPrelaunch) + { + //Sends WM_DESTROY, Notepad++ will end + ::DestroyWindow(hwnd); + } + else + { + SendMessage(_hSelf, WM_SYSCOMMAND, SC_MINIMIZE, 0); + } + return TRUE; } @@ -9253,18 +9318,31 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa case WM_LBUTTONUP : _pEditView->getFocus(); ::ShowWindow(_hSelf, SW_SHOW); - _pTrayIco->doTrayIcon(REMOVE); + if (!_isPrelaunch) + _pTrayIco->doTrayIcon(REMOVE); ::SendMessage(_hSelf, WM_SIZE, 0, 0); return TRUE; -/* - case WM_RBUTTONUP: - { - POINT p; - GetCursorPos(&p); - TrackPopupMenu(hTrayIconMenu, TPM_LEFTALIGN, p.x, p.y, 0, hwnd, NULL); - return TRUE; - } -*/ + + case WM_MBUTTONUP: + command(IDM_POPUP_FILE_NEW_AND_PASTE); + return TRUE; + + case WM_RBUTTONUP: + { + POINT p; + GetCursorPos(&p); + + HMENU hmenu; // menu template + HMENU hTrayIconMenu; // shortcut menu + hmenu = LoadMenu(_hInst, MAKEINTRESOURCE(IDR_POPUP_MENU)); + hTrayIconMenu = GetSubMenu(hmenu, 0); + SetForegroundWindow(_hSelf); + TrackPopupMenu(hTrayIconMenu, TPM_LEFTALIGN, p.x, p.y, 0, _hSelf, NULL); + PostMessage(_hSelf, WM_NULL, 0, 0); + DestroyMenu(hmenu); + return TRUE; + } + } return TRUE; } diff --git a/PowerEditor/src/Notepad_plus.h b/PowerEditor/src/Notepad_plus.h index fb38afa50..24aeded32 100644 --- a/PowerEditor/src/Notepad_plus.h +++ b/PowerEditor/src/Notepad_plus.h @@ -329,6 +329,7 @@ private: HMENU _mainMenuHandle; bool _sysMenuEntering; + bool _isPrelaunch; // For FullScreen/PostIt features VisibleGUIConf _beforeSpecialView; diff --git a/PowerEditor/src/Notepad_plus.rc b/PowerEditor/src/Notepad_plus.rc index 417106ace..22aee87dc 100644 --- a/PowerEditor/src/Notepad_plus.rc +++ b/PowerEditor/src/Notepad_plus.rc @@ -594,6 +594,21 @@ BEGIN MENUITEM "X", IDM_FILE_CLOSE, HELP END +IDR_POPUP_MENU MENU +BEGIN + POPUP "Popup" + BEGIN + MENUITEM "Activate or New", IDM_POPUP_FILE_ACTIVATE_OR_NEW + MENUITEM SEPARATOR + MENUITEM "New", IDM_POPUP_FILE_NEW + MENUITEM "New and Paste", IDM_POPUP_FILE_NEW_AND_PASTE + MENUITEM "Open...", IDM_POPUP_FILE_OPEN + MENUITEM "Find in Files...", IDM_SEARCH_FINDINFILES + MENUITEM SEPARATOR + MENUITEM "Close Tray Icon", IDM_POPUP_CLOSE + END +END + IDD_ABOUTBOX DIALOGEX 0, 0, 271, 240 STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_BORDER | WS_SYSMENU FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x1 diff --git a/PowerEditor/src/Parameters.h b/PowerEditor/src/Parameters.h index 8424a3c92..b99f718dc 100644 --- a/PowerEditor/src/Parameters.h +++ b/PowerEditor/src/Parameters.h @@ -157,6 +157,7 @@ struct CmdLineParams { bool _isReadOnly; bool _isNoSession; bool _isNoTab; + bool _isPreLaunch; int _line2go; int _column2go; diff --git a/PowerEditor/src/menuCmdID.h b/PowerEditor/src/menuCmdID.h index ab4930226..b6b4e2bc7 100644 --- a/PowerEditor/src/menuCmdID.h +++ b/PowerEditor/src/menuCmdID.h @@ -309,4 +309,11 @@ #define IDM_EXECUTE (IDM + 9000) +#define IDM_POPUP (IDM + 3050) + #define IDM_POPUP_FILE_ACTIVATE_OR_NEW (IDM_POPUP + 1) + #define IDM_POPUP_FILE_NEW (IDM_POPUP + 2) + #define IDM_POPUP_FILE_NEW_AND_PASTE (IDM_POPUP + 3) + #define IDM_POPUP_FILE_OPEN (IDM_POPUP + 4) + #define IDM_POPUP_CLOSE (IDM_POPUP + 5) + #endif //MENUCMDID_H diff --git a/PowerEditor/src/resource.h b/PowerEditor/src/resource.h index 955cea3dc..e485d310c 100644 --- a/PowerEditor/src/resource.h +++ b/PowerEditor/src/resource.h @@ -230,6 +230,8 @@ #define IDR_M30_MENU 1500 +#define IDR_POPUP_MENU 1501 + // #define IDD_FIND_REPLACE_DLG 1600 #define IDD_ABOUTBOX 1700 diff --git a/PowerEditor/src/winmain.cpp b/PowerEditor/src/winmain.cpp index 8d25ad18b..9cec9f112 100644 --- a/PowerEditor/src/winmain.cpp +++ b/PowerEditor/src/winmain.cpp @@ -136,28 +136,34 @@ int getNumberFromParam(char paramName, ParamVector & params, bool & isParamePres isParamePresent = true; return generic_atoi(numStr.c_str()); }; -/* -int getLn2GoFromParam(ParamVector & params) { - generic_string lineNumStr; - if (!getParamVal('n', params, lineNumStr)) - return -1; - return generic_atoi(lineNumStr.c_str()); -}; -int getPointXFromParam(ParamVector & params) { - generic_string pointXStr; - if (!getParamVal('x', params, pointXStr)) - return -1; - return generic_atoi(pointXStr.c_str()); -}; -*/ const TCHAR FLAG_MULTI_INSTANCE[] = TEXT("-multiInst"); const TCHAR FLAG_NO_PLUGIN[] = TEXT("-noPlugin"); const TCHAR FLAG_READONLY[] = TEXT("-ro"); const TCHAR FLAG_NOSESSION[] = TEXT("-nosession"); const TCHAR FLAG_NOTABBAR[] = TEXT("-notabbar"); +const TCHAR FLAG_SYSTRAY[] = TEXT("-systemtray"); +const TCHAR FLAG_HELP[] = TEXT("--help"); +const TCHAR COMMAND_ARG_HELP[] = TEXT("Usage :\r\ +\r\ +notepad++ [--help] [-multiInst] [-noPlugins] [-lLanguage] [-nLineNumber] [-cColumnNumber] [-xPos] [-yPos] [-nosession] [-notabbar] [-ro] [-systemtray] [fullFilePathName]\r\ +\r\ + --help : This help message\r\ + -multiInst : Launch another Notepad++ instance\r\ + -noPlugins : Launch Notepad++ without loading any plugin\r\ + -l : Launch Notepad++ by applying indicated language to the file to open\r\ + -n : Launch Notepad++ by scrolling indicated line on the file to open\r\ + -c : Launch Notepad++ on scrolling indicated column on the file to open\r\ + -x : Launch Notepad++ by indicating its left side position on the screen\r\ + -y : Launch Notepad++ by indicating its top position on the screen\r\ + -nosession : Launch Notepad++ without any session\r\ + -notabbar : Launch Notepad++ without tabbar\r\ + -ro : Launch Notepad++ and make the file to open read only\r\ + -systemtray : Launch Notepad++ directly in system tray\r\ + fullFilePathName : file name to open (absolute or relative path name)\r\ +"); void doException(Notepad_plus & notepad_plus_plus); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) @@ -175,18 +181,26 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) TheFirstOne = false; bool isParamePresent; - CmdLineParams cmdLineParams; + bool showHelp = isInList(FLAG_HELP, params); bool isMultiInst = isInList(FLAG_MULTI_INSTANCE, params); + + CmdLineParams cmdLineParams; cmdLineParams._isNoTab = isInList(FLAG_NOTABBAR, params); cmdLineParams._isNoPlugin = isInList(FLAG_NO_PLUGIN, params); cmdLineParams._isReadOnly = isInList(FLAG_READONLY, params); cmdLineParams._isNoSession = isInList(FLAG_NOSESSION, params); + cmdLineParams._isPreLaunch = isInList(FLAG_SYSTRAY, params); cmdLineParams._langType = getLangTypeFromParam(params); cmdLineParams._line2go = getNumberFromParam('n', params, isParamePresent); cmdLineParams._column2go = getNumberFromParam('c', params, isParamePresent); cmdLineParams._point.x = getNumberFromParam('x', params, cmdLineParams._isPointXValid); cmdLineParams._point.y = getNumberFromParam('y', params, cmdLineParams._isPointYValid); + if (showHelp) + { + ::MessageBox(NULL, COMMAND_ARG_HELP, TEXT("Notepad++ Command Argument Help"), MB_OK); + } + NppParameters *pNppParameters = NppParameters::getInstance(); // override the settings if notepad style is present if (pNppParameters->asNotepadStyle())