notepad-plus-plus-legacy/PowerEditor/src/Notepad_plus.cpp
donho 1eb46eaca3 [NEW_FEATURE] Add hilite all in Incremental search.
git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository@189 f5eea248-9336-0410-98b8-ebc06183d4e3
2008-04-25 18:34:25 +00:00

8337 lines
234 KiB
C++
Raw Blame History

//this file is part of notepad++
//Copyright (C)2003 Don HO ( donho@altern.org )
//
//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.
//
//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.
#ifndef _WIN32_IE
#define _WIN32_IE 0x500
#endif
//#define INCLUDE_DEPRECATED_FEATURES 1
#include <shlwapi.h>
#include "Notepad_plus.h"
#include "SysMsg.h"
#include "FileDialog.h"
#include "resource.h"
#include "printer.h"
#include "FileNameStringSplitter.h"
#include "lesDlgs.h"
#include "Utf8_16.h"
#include "regExtDlg.h"
#include "RunDlg.h"
#include "ShortcutMapper.h"
#include "preferenceDlg.h"
#include "TaskListDlg.h"
#include <time.h>
#include <algorithm>
const char Notepad_plus::_className[32] = NOTEPAD_PP_CLASS_NAME;
const char *urlHttpRegExpr = "http://[a-z0-9_\\-\\+.:?&@=/%#]*";
int docTabIconIDs[] = {IDI_SAVED_ICON, IDI_UNSAVED_ICON, IDI_READONLY_ICON};
enum tb_stat {tb_saved, tb_unsaved, tb_ro};
struct SortTaskListPred
{
ScintillaEditView *_views[2];
SortTaskListPred(ScintillaEditView &p, ScintillaEditView &s)
{
_views[MAIN_VIEW] = &p;
_views[SUB_VIEW] = &s;
}
bool operator()(const TaskLstFnStatus &l, const TaskLstFnStatus &r) const {
return _views[l._iView]->getBufferAt(l._docIndex).getRecentTag() > _views[r._iView]->getBufferAt(r._docIndex).getRecentTag();
}
};
Notepad_plus::Notepad_plus(): Window(), _mainWindowStatus(0), _pDocTab(NULL), _pEditView(NULL),
_pMainSplitter(NULL), _isfullScreen(false),
_recordingMacro(false), _pTrayIco(NULL), _isUDDocked(false), _isRTL(false),
_linkTriggered(true), _isDocModifing(false), _isHotspotDblClicked(false), _isSaving(false), _sysMenuEntering(false)
{
ZeroMemory(&_prevSelectedRange, sizeof(_prevSelectedRange));
_winVersion = (NppParameters::getInstance())->getWinVersion();
TiXmlDocument *nativeLangDocRoot = (NppParameters::getInstance())->getNativeLang();
if (nativeLangDocRoot)
{
_nativeLang = nativeLangDocRoot->FirstChild("NotepadPlus");
if (_nativeLang)
{
_nativeLang = _nativeLang->FirstChild("Native-Langue");
if (_nativeLang)
{
TiXmlElement *element = _nativeLang->ToElement();
const char *rtl = element->Attribute("RTL");
if (rtl)
_isRTL = (strcmp(rtl, "yes") == 0);
}
}
}
else
_nativeLang = NULL;
TiXmlDocument *toolIconsDocRoot = (NppParameters::getInstance())->getToolIcons();
if (toolIconsDocRoot)
{
_toolIcons = toolIconsDocRoot->FirstChild("NotepadPlus");
if (_toolIcons)
{
if ((_toolIcons = _toolIcons->FirstChild("ToolBarIcons")))
{
if ((_toolIcons = _toolIcons->FirstChild("Theme")))
{
const char *themeDir = (_toolIcons->ToElement())->Attribute("pathPrefix");
for (TiXmlNode *childNode = _toolIcons->FirstChildElement("Icon");
childNode ;
childNode = childNode->NextSibling("Icon") )
{
int iIcon;
const char *res = (childNode->ToElement())->Attribute("id", &iIcon);
if (res)
{
TiXmlNode *grandChildNode = childNode->FirstChildElement("normal");
if (grandChildNode)
{
TiXmlNode *valueNode = grandChildNode->FirstChild();
//putain, enfin!!!
if (valueNode)
{
string locator = themeDir?themeDir:"";
locator += valueNode->Value();
_customIconVect.push_back(iconLocator(0, iIcon, locator));
}
}
grandChildNode = childNode->FirstChildElement("hover");
if (grandChildNode)
{
TiXmlNode *valueNode = grandChildNode->FirstChild();
//putain, enfin!!!
if (valueNode)
{
string locator = themeDir?themeDir:"";
locator += valueNode->Value();
_customIconVect.push_back(iconLocator(1, iIcon, locator));
}
}
grandChildNode = childNode->FirstChildElement("disabled");
if (grandChildNode)
{
TiXmlNode *valueNode = grandChildNode->FirstChild();
//putain, enfin!!!
if (valueNode)
{
string locator = themeDir?themeDir:"";
locator += valueNode->Value();
_customIconVect.push_back(iconLocator(2, iIcon, locator));
}
}
}
}
}
}
}
}
else
_toolIcons = NULL;
}
// ATTENTION : the order of the destruction is very important
// because if the parent's window hadle is destroyed before
// the destruction of its childrens' windows handle,
// its childrens' windows handle will be destroyed automatically!
Notepad_plus::~Notepad_plus()
{
(NppParameters::getInstance())->destroyInstance();
if (_pTrayIco)
delete _pTrayIco;
}
void Notepad_plus::init(HINSTANCE hInst, HWND parent, const char *cmdLine, CmdLineParams *cmdLineParams)
{
Window::init(hInst, parent);
WNDCLASS nppClass;
nppClass.style = CS_BYTEALIGNWINDOW | CS_DBLCLKS;//CS_HREDRAW | CS_VREDRAW;
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;
if (!::RegisterClass(&nppClass))
{
systemMessage("System Err");
throw int(98);
}
RECT workAreaRect;
::SystemParametersInfo(SPI_GETWORKAREA, 0, &workAreaRect, 0);
const NppGUI & nppGUI = (NppParameters::getInstance())->getNppGUI();
if (cmdLineParams->_isNoPlugin)
_pluginsManager.disable();
_hSelf = ::CreateWindowEx(
WS_EX_ACCEPTFILES | (_isRTL?WS_EX_LAYOUTRTL:0),\
_className,\
"Notepad++",\
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,\
// CreateWindowEx bug : set all 0 to walk arround the pb
0, 0, 0, 0,\
_hParent,\
NULL,\
_hInst,\
(LPVOID)this); // pass the ptr of this instantiated object
// for retrive it in Notepad_plus_Proc from
// the CREATESTRUCT.lpCreateParams afterward.
if (!_hSelf)
{
systemMessage("System Err");
throw int(777);
}
// 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 + workAreaRect.left;
newUpperLeft.y = nppGUI._appPos.top + workAreaRect.top;
// GetSystemMetrics does not support the multi-monitor values on Windows NT and Windows 95.
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;
}
::MoveWindow(_hSelf, newUpperLeft.x, newUpperLeft.y, nppGUI._appPos.right, nppGUI._appPos.bottom, TRUE);
if (nppGUI._rememberLastSession && !cmdLineParams->_isNoSession)
{
loadLastSession();
}
if (cmdLine)
{
char currPath[MAX_PATH];
::GetCurrentDirectory(sizeof currPath, currPath);
::SetCurrentDirectory(currPath);
LangType lt = cmdLineParams->_langType;
int ln = cmdLineParams->_line2go;
if (PathFileExists(cmdLine))
{
doOpen(cmdLine, cmdLineParams->_isReadOnly);
if (lt != L_TXT)
_pEditView->setCurrentDocType(lt);
if (ln > 0)
_pEditView->execute(SCI_GOTOLINE, ln-1);
}
else
{
FileNameStringSplitter fnss(cmdLine);
char *pFn = NULL;
for (int i = 0 ; i < fnss.size() ; i++)
{
pFn = (char *)fnss.getFileName(i);
doOpen((const char *)pFn, cmdLineParams->_isReadOnly);
if (lt != L_TXT)
_pEditView->setCurrentDocType(lt);
if (ln > 0)
_pEditView->execute(SCI_GOTOLINE, ln-1);
}
}
// restore the doc type to L_TXT
//(NppParameters::getInstance())->setDefLang(L_TXT);
}
::GetModuleFileName(NULL, _nppPath, MAX_PATH);
setTitleWith(_pEditView->getCurrentTitle());
if (nppGUI._tabStatus & TAB_MULTILINE)
::SendMessage(_hSelf, WM_COMMAND, IDM_VIEW_DRAWTABBAR_MULTILINE, 0);
// Notify plugins that Notepad++ is ready
SCNotification scnN;
scnN.nmhdr.code = NPPN_READY;
scnN.nmhdr.hwndFrom = _hSelf;
scnN.nmhdr.idFrom = 0;
_pluginsManager.notify(&scnN);
if (!nppGUI._menuBarShow)
::SetMenu(_hSelf, NULL);
::ShowWindow(_hSelf, nppGUI._isMaximized?SW_MAXIMIZE:SW_SHOW);
if (cmdLineParams->_isNoTab || (nppGUI._tabStatus & TAB_HIDE))
{
::SendMessage(_hSelf, NPPM_HIDETABBAR, 0, TRUE);
}
}
void Notepad_plus::killAllChildren()
{
_toolBar.destroy();
_rebarTop.destroy();
_rebarBottom.destroy();
if (_pMainSplitter)
{
_pMainSplitter->destroy();
delete _pMainSplitter;
}
_mainDocTab.destroy();
_subDocTab.destroy();
_mainEditView.destroy();
_subEditView.destroy();
_invisibleEditView.destroy();
_subSplitter.destroy();
_statusBar.destroy();
_scintillaCtrls4Plugins.destroy();
_dockingManager.destroy();
}
void Notepad_plus::destroy()
{
::DestroyWindow(_hSelf);
}
bool Notepad_plus::saveGUIParams()
{
NppGUI & nppGUI = (NppGUI &)(NppParameters::getInstance())->getNppGUI();
nppGUI._statusBarShow = _statusBar.isVisible();
nppGUI._toolbarShow = _rebarTop.getIDVisible(REBAR_BAR_TOOLBAR);
nppGUI._toolBarStatus = _toolBar.getState();
nppGUI._tabStatus = (TabBarPlus::doDragNDropOrNot()?TAB_DRAWTOPBAR:0) | \
(TabBarPlus::drawTopBar()?TAB_DRAGNDROP:0) | \
(TabBarPlus::drawInactiveTab()?TAB_DRAWINACTIVETAB:0) | \
(_toReduceTabBar?TAB_REDUCE:0) | \
(TabBarPlus::drawTabCloseButton()?TAB_CLOSEBUTTON:0) | \
(TabBarPlus::isDbClk2Close()?TAB_DBCLK2CLOSE:0) | \
(TabBarPlus::isVertical() ? TAB_VERTICAL:0) | \
(TabBarPlus::isMultiLine() ? TAB_MULTILINE:0) |\
(nppGUI._tabStatus & TAB_HIDE);
nppGUI._splitterPos = _subSplitter.isVertical()?POS_VERTICAL:POS_HORIZOTAL;
UserDefineDialog *udd = _pEditView->getUserDefineDlg();
bool b = udd->isDocked();
nppGUI._userDefineDlgStatus = (b?UDD_DOCKED:0) | (udd->isVisible()?UDD_SHOW:0);
// Save the position
WINDOWPLACEMENT posInfo;
posInfo.length = sizeof(WINDOWPLACEMENT);
::GetWindowPlacement(_hSelf, &posInfo);
nppGUI._appPos.left = posInfo.rcNormalPosition.left;
nppGUI._appPos.top = posInfo.rcNormalPosition.top;
nppGUI._appPos.right = posInfo.rcNormalPosition.right - posInfo.rcNormalPosition.left;
nppGUI._appPos.bottom = posInfo.rcNormalPosition.bottom - posInfo.rcNormalPosition.top;
nppGUI._isMaximized = (IsZoomed(_hSelf) || (posInfo.flags & WPF_RESTORETOMAXIMIZED));
saveDockingParams();
return (NppParameters::getInstance())->writeGUIParams();
}
void Notepad_plus::saveDockingParams()
{
NppGUI & nppGUI = (NppGUI &)(NppParameters::getInstance())->getNppGUI();
// Save the docking information
nppGUI._dockingData._leftWidth = _dockingManager.getDockedContSize(CONT_LEFT);
nppGUI._dockingData._rightWidth = _dockingManager.getDockedContSize(CONT_RIGHT);
nppGUI._dockingData._topHeight = _dockingManager.getDockedContSize(CONT_TOP);
nppGUI._dockingData._bottomHight = _dockingManager.getDockedContSize(CONT_BOTTOM);
// clear the conatainer tab information (active tab)
nppGUI._dockingData._containerTabInfo.clear();
// create a vector to save the current information
vector<PlugingDlgDockingInfo> vPluginDockInfo;
vector<FloatingWindowInfo> vFloatingWindowInfo;
// save every container
vector<DockingCont*> vCont = _dockingManager.getContainerInfo();
for (size_t i = 0 ; i < vCont.size() ; i++)
{
// save at first the visible Tb's
vector<tTbData *> vDataVis = vCont[i]->getDataOfVisTb();
for (size_t j = 0 ; j < vDataVis.size() ; j++)
{
if (vDataVis[j]->pszName && vDataVis[j]->pszName[0])
{
PlugingDlgDockingInfo pddi(vDataVis[j]->pszModuleName, vDataVis[j]->dlgID, i, vDataVis[j]->iPrevCont, true);
vPluginDockInfo.push_back(pddi);
}
}
// save the hidden Tb's
vector<tTbData *> vDataAll = vCont[i]->getDataOfAllTb();
for (size_t j = 0 ; j < vDataAll.size() ; j++)
{
if ((vDataAll[j]->pszName && vDataAll[j]->pszName[0]) && (!vCont[i]->isTbVis(vDataAll[j])))
{
PlugingDlgDockingInfo pddi(vDataAll[j]->pszModuleName, vDataAll[j]->dlgID, i, vDataAll[j]->iPrevCont, false);
vPluginDockInfo.push_back(pddi);
}
}
// save the position, when container is a floated one
if (i >= DOCKCONT_MAX)
{
RECT rc;
vCont[i]->getWindowRect(rc);
FloatingWindowInfo fwi(i, rc.left, rc.top, rc.right, rc.bottom);
vFloatingWindowInfo.push_back(fwi);
}
// save the active tab
ContainerTabInfo act(i, vCont[i]->getActiveTb());
nppGUI._dockingData._containerTabInfo.push_back(act);
}
// add the missing information and store it in nppGUI
unsigned char floatContArray[50];
memset(floatContArray, 0, 50);
for (size_t i = 0 ; i < nppGUI._dockingData._pluginDockInfo.size() ; i++)
{
BOOL isStored = FALSE;
for (size_t j = 0; j < vPluginDockInfo.size(); j++)
{
if (nppGUI._dockingData._pluginDockInfo[i] == vPluginDockInfo[j])
{
isStored = TRUE;
break;
}
}
if (isStored == FALSE)
{
int floatCont = 0;
if (nppGUI._dockingData._pluginDockInfo[i]._currContainer >= DOCKCONT_MAX)
floatCont = nppGUI._dockingData._pluginDockInfo[i]._currContainer;
else
floatCont = nppGUI._dockingData._pluginDockInfo[i]._prevContainer;
if (floatContArray[floatCont] == 0)
{
RECT *pRc = nppGUI._dockingData.getFloatingRCFrom(floatCont);
if (pRc)
vFloatingWindowInfo.push_back(FloatingWindowInfo(floatCont, pRc->left, pRc->top, pRc->right, pRc->bottom));
floatContArray[floatCont] = 1;
}
vPluginDockInfo.push_back(nppGUI._dockingData._pluginDockInfo[i]);
}
}
nppGUI._dockingData._pluginDockInfo = vPluginDockInfo;
nppGUI._dockingData._flaotingWindowInfo = vFloatingWindowInfo;
}
// return true if all the session files are loaded
// return false if one or more sessions files fail to load (and session is modify to remove invalid files)
bool Notepad_plus::loadSession(Session & session)
{
bool allSessionFilesLoaded = true;
size_t i = 0;
for ( ; i < session.nbMainFiles() ; )
{
const char *pFn = session._mainViewFiles[i]._fileName.c_str();
if (PathFileExists(pFn))
{
doOpen(pFn);
const char *pLn = session._mainViewFiles[i]._langName.c_str();
setLangFromName(pLn);
_pEditView->getCurrentBuffer().setPosition(session._mainViewFiles[i]);
_pEditView->restoreCurrentPos();
for (size_t j = 0 ; j < session._mainViewFiles[i].marks.size() ; j++)
bookmarkAdd(session._mainViewFiles[i].marks[j]);
i++;
}
else
{
vector<sessionFileInfo>::iterator posIt = session._mainViewFiles.begin() + i;
session._mainViewFiles.erase(posIt);
allSessionFilesLoaded = false;
}
}
bool isSubViewOpened = false;
for (size_t k = 0 ; k < session.nbSubFiles() ; k++)
{
const char *pFn = session._subViewFiles[k]._fileName.c_str();
if (PathFileExists(pFn))
{
if (doOpen(pFn))
{
if (!isSubViewOpened)
{
docGotoAnotherEditView(MODE_TRANSFER);
isSubViewOpened = true;
}
}
else // switch back to Main view where this file is already opened
{
docGotoAnotherEditView(MODE_CLONE);
isSubViewOpened = true;
}
const char *pLn = session._subViewFiles[k]._langName.c_str();
setLangFromName(pLn);
_pEditView->getCurrentBuffer().setPosition(session._subViewFiles[k]);
_pEditView->restoreCurrentPos();
for (size_t j = 0 ; j < session._subViewFiles[k].marks.size() ; j++)
bookmarkAdd(session._subViewFiles[k].marks[j]);
}
else
{
vector<sessionFileInfo>::iterator posIt = session._subViewFiles.begin() + k;
session._subViewFiles.erase(posIt);
allSessionFilesLoaded = false;
}
}
if (session._activeMainIndex < (size_t)_mainDocTab.nbItem())//session.nbMainFiles())
_mainDocTab.activate(session._activeMainIndex);
if (session._activeSubIndex < (size_t)_subDocTab.nbItem())//session.nbSubFiles())
_subDocTab.activate(session._activeSubIndex);
if ((session.nbSubFiles() > 0) && (session._activeView == MAIN_VIEW || session._activeView == SUB_VIEW))
switchEditViewTo(session._activeView);
else
switchEditViewTo(MAIN_VIEW);
return allSessionFilesLoaded;
}
bool Notepad_plus::doSimpleOpen(const char *fileName)
{
Utf8_16_Read UnicodeConvertor;
FILE *fp = fopen(fileName, "rb");
if (fp)
{
_pEditView->execute(SCI_CLEARALL, 0);
_pEditView->setCurrentTitle(fileName);
char data[blockSize];
size_t lenFile = fread(data, 1, sizeof(data), fp);
bool isNotEmpty = (lenFile != 0);
while (lenFile > 0)
{
lenFile = UnicodeConvertor.convert(data, lenFile);
_pEditView->execute(SCI_ADDTEXT, lenFile, reinterpret_cast<LPARAM>(UnicodeConvertor.getNewBuf()));
lenFile = int(fread(data, 1, sizeof(data), fp));
}
fclose(fp);
UniMode unicodeMode = static_cast<UniMode>(UnicodeConvertor.getEncoding());
(_pEditView->getCurrentBuffer()).setUnicodeMode(unicodeMode);
if (unicodeMode != uni8Bit)
// Override the code page if Unicode
_pEditView->execute(SCI_SETCODEPAGE, SC_CP_UTF8);
// Then replace the caret to the begining
_pEditView->execute(SCI_GOTOPOS, 0);
return true;
}
else
{
char msg[MAX_PATH + 100];
strcpy(msg, "Can not open file \"");
strcat(msg, fileName);
strcat(msg, "\".");
::MessageBox(_hSelf, msg, "Open File error", MB_OK);
return false;
}
}
bool Notepad_plus::doOpen(const char *fileName, bool isReadOnly)
{
char longFileName[MAX_PATH];
::GetFullPathName(fileName, MAX_PATH, longFileName, NULL);
if (switchToFile(longFileName))
{
if (_pTrayIco)
{
if (_pTrayIco->isInTray())
{
::ShowWindow(_hSelf, SW_SHOW);
_pTrayIco->doTrayIcon(REMOVE);
::SendMessage(_hSelf, WM_SIZE, 0, 0);
}
}
return false;
}
if (!PathFileExists(longFileName))
{
char str2display[MAX_PATH*2];
char longFileDir[MAX_PATH];
strcpy(longFileDir, longFileName);
PathRemoveFileSpec(longFileDir);
if (PathFileExists(longFileDir))
{
sprintf(str2display, "%s doesn't exist. Create it?", longFileName);
if (::MessageBox(_hSelf, str2display, "Create new file", MB_YESNO) == IDYES)
{
FILE *f = fopen(longFileName, "w");
fclose(f);
}
else
{
_lastRecentFileList.remove(longFileName);
return false;
}
}
else
{
_lastRecentFileList.remove(longFileName);
return false;
}
}
// if file2open matches the ext of user defined session file ext, then it'll be opened as a session
const char *definedSessionExt = NppParameters::getInstance()->getNppGUI()._definedSessionExt.c_str();
if (*definedSessionExt != '\0')
{
char fncp[MAX_PATH];
strcpy(fncp, longFileName);
char *pExt = PathFindExtension(fncp);
string usrSessionExt = "";
if (*definedSessionExt != '.')
{
usrSessionExt += ".";
}
usrSessionExt += definedSessionExt;
if (!strcmp(pExt, usrSessionExt.c_str()))
{
return fileLoadSession(longFileName);
}
}
Utf8_16_Read UnicodeConvertor;
bool isNewDoc2Close = false;
FILE *fp = fopen(longFileName, "rb");
if (fp)
{
// Notify plugins that current file is just opened
SCNotification scnN;
scnN.nmhdr.code = NPPN_FILEBEFOREOPEN;
scnN.nmhdr.hwndFrom = _hSelf;
scnN.nmhdr.idFrom = 0;
_pluginsManager.notify(&scnN);
if ((_pEditView->getNbDoc() == 1)
&& Buffer::isUntitled(_pEditView->getCurrentTitle())
&& (!_pEditView->isCurrentDocDirty()) && (_pEditView->getCurrentDocLen() == 0))
{
isNewDoc2Close = true;
}
setTitleWith(_pDocTab->newDoc(longFileName));
// It's VERY IMPORTANT to reset the view
_pEditView->execute(SCI_CLEARALL);
char data[blockSize];
size_t lenFile = fread(data, 1, sizeof(data), fp);
bool isNotEmpty = (lenFile != 0);
while (lenFile > 0)
{
lenFile = UnicodeConvertor.convert(data, lenFile);
_pEditView->execute(SCI_ADDTEXT, lenFile, reinterpret_cast<LPARAM>(UnicodeConvertor.getNewBuf()));
lenFile = int(fread(data, 1, sizeof(data), fp));
}
fclose(fp);
// 3 formats : WIN_FORMAT, UNIX_FORMAT and MAC_FORMAT
(_pEditView->getCurrentBuffer()).determinateFormat(isNotEmpty?UnicodeConvertor.getNewBuf():(char *)(""));
_pEditView->execute(SCI_SETEOLMODE, _pEditView->getCurrentBuffer().getFormat());
// detect if it's a binary file (non ascii file)
//(_pEditView->getCurrentBuffer()).detectBin(isNotEmpty?UnicodeConvertor.getNewBuf():(char *)(""));
UniMode unicodeMode = static_cast<UniMode>(UnicodeConvertor.getEncoding());
(_pEditView->getCurrentBuffer()).setUnicodeMode(unicodeMode);
if (unicodeMode != uni8Bit)
// Override the code page if Unicode
_pEditView->execute(SCI_SETCODEPAGE, SC_CP_UTF8);
if (isReadOnly)
(_pEditView->getCurrentBuffer()).setReadOnly(true);
_pEditView->getFocus();
_pEditView->execute(SCI_SETSAVEPOINT);
_pEditView->execute(EM_EMPTYUNDOBUFFER);
// if file is read only, we set the view read only
_pEditView->execute(SCI_SETREADONLY, _pEditView->isCurrentBufReadOnly());
if (isNewDoc2Close)
_pDocTab->closeDocAt(0);
int numLines = int(_pEditView->execute(SCI_GETLINECOUNT));
char numLineStr[32];
itoa(numLines, numLineStr, 10);
int nbDigit = strlen(numLineStr);
if (_pEditView->increaseMaxNbDigit(nbDigit))
_pEditView->setLineNumberWidth(_pEditView->hasMarginShowed(ScintillaEditView::_SC_MARGE_LINENUMBER));
// Then replace the caret to the begining
_pEditView->execute(SCI_GOTOPOS, 0);
_lastRecentFileList.remove(longFileName);
if (_pTrayIco)
{
if (_pTrayIco->isInTray())
{
::ShowWindow(_hSelf, SW_SHOW);
_pTrayIco->doTrayIcon(REMOVE);
::SendMessage(_hSelf, WM_SIZE, 0, 0);
}
}
PathRemoveFileSpec(longFileName);
_linkTriggered = true;
_isDocModifing = false;
setWorkingDir(longFileName);
// Notify plugins that current file is just opened
scnN.nmhdr.code = NPPN_FILEOPENED;
_pluginsManager.notify(&scnN);
return true;
}
else
{
char msg[MAX_PATH + 100];
strcpy(msg, "Can not open file \"");
//strcat(msg, fullPath);
strcat(msg, longFileName);
strcat(msg, "\".");
::MessageBox(_hSelf, msg, "ERR", MB_OK);
_lastRecentFileList.remove(longFileName);
return false;
}
}
void Notepad_plus::fileNew()
{
setTitleWith(_pDocTab->newDoc(NULL));
setWorkingDir(NULL);
}
bool Notepad_plus::fileReload()
{
const char * fn = _pEditView->getCurrentTitle();
if (Buffer::isUntitled(fn)) return false;
if (::MessageBox(_hSelf, "Do you want to reload the current file?", "Reload", MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL) == IDYES)
reload(fn);
return true;
}
string exts2Filters(string exts) {
const char *extStr = exts.c_str();
char aExt[MAX_PATH];
string filters("");
int j = 0;
bool stop = false;
for (size_t i = 0 ; i < exts.length() ; i++)
{
if (extStr[i] == ' ')
{
if (!stop)
{
aExt[j] = '\0';
stop = true;
if (aExt[0])
{
filters += "*.";
filters += aExt;
filters += ";";
}
j = 0;
}
}
else
{
aExt[j] = extStr[i];
stop = false;
j++;
}
}
if (j > 0)
{
aExt[j] = '\0';
if (aExt[0])
{
filters += "*.";
filters += aExt;
filters += ";";
}
}
// remove the last ';'
filters = filters.substr(0, filters.length()-1);
return filters;
};
void Notepad_plus::setFileOpenSaveDlgFilters(FileDialog & fDlg)
{
NppParameters *pNppParam = NppParameters::getInstance();
NppGUI & nppGUI = (NppGUI & )pNppParam->getNppGUI();
int i = 0;
Lang *l = NppParameters::getInstance()->getLangFromIndex(i++);
LangType curl = _pEditView->getCurrentBuffer().getLangType();
while (l)
{
LangType lid = l->getLangID();
bool inExcludedList = false;
for (size_t j = 0 ; j < nppGUI._excludedLangList.size() ; j++)
{
if (lid == nppGUI._excludedLangList[j]._langType)
{
inExcludedList = true;
break;
}
}
if (!inExcludedList)
{
const char *defList = l->getDefaultExtList();
const char *userList = NULL;
LexerStylerArray &lsa = (NppParameters::getInstance())->getLStylerArray();
const char *lName = l->getLangName();
LexerStyler *pLS = lsa.getLexerStylerByName(lName);
if (pLS)
userList = pLS->getLexerUserExt();
std::string list("");
if (defList)
list += defList;
if (userList)
{
list += " ";
list += userList;
}
string stringFilters = exts2Filters(list);
const char *filters = stringFilters.c_str();
if (filters[0])
{
int nbExt = fDlg.setExtsFilter(getLangDesc(lid, true).c_str(), filters);
}
}
l = (NppParameters::getInstance())->getLangFromIndex(i++);
}
}
void Notepad_plus::fileOpen()
{
FileDialog fDlg(_hSelf, _hInst);
fDlg.setExtFilter("All types", ".*", NULL);
setFileOpenSaveDlgFilters(fDlg);
if (stringVector *pfns = fDlg.doOpenMultiFilesDlg())
{
int sz = int(pfns->size());
for (int i = 0 ; i < sz ; i++)
doOpen((pfns->at(i)).c_str(), fDlg.isReadOnly());
}
}
bool Notepad_plus::doReload(const char *fileName, bool alert)
{
char longFileName[MAX_PATH] ="";
::GetFullPathName(fileName, MAX_PATH, longFileName, NULL);
if (switchToFile(longFileName))
{
if (alert)
{
if (::MessageBox(_hSelf, "Do you want to reload the current file?", "Reload", MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL) == IDYES)
reload(longFileName);
}
else
reload(longFileName);
return true;
}
return false;
}
bool Notepad_plus::doSave(const char *filename, UniMode mode)
{
bool isHidden = false;
bool isSys = false;
DWORD attrib;
if (PathFileExists(filename))
{
attrib = ::GetFileAttributes(filename);
if (attrib != INVALID_FILE_ATTRIBUTES)
{
isHidden = (attrib & FILE_ATTRIBUTE_HIDDEN) != 0;
if (isHidden)
::SetFileAttributes(filename, attrib & ~FILE_ATTRIBUTE_HIDDEN);
isSys = (attrib & FILE_ATTRIBUTE_SYSTEM) != 0;
if (isSys)
::SetFileAttributes(filename, attrib & ~FILE_ATTRIBUTE_SYSTEM);
}
}
if (mode == uniCookie)
mode = uni8Bit;
Utf8_16_Write UnicodeConvertor;
if (_pEditView->execute(SCI_GETCODEPAGE) != 0)
UnicodeConvertor.setEncoding(static_cast<UniMode>(mode));
FILE *fp = UnicodeConvertor.fopen(filename, "wb");
if (fp)
{
// Notify plugins that current file is about to be saved
SCNotification scnN;
scnN.nmhdr.code = NPPN_FILEBEFORESAVE;
scnN.nmhdr.hwndFrom = _hSelf;
scnN.nmhdr.idFrom = 0;
_pluginsManager.notify(&scnN);
char data[blockSize + 1];
int lengthDoc = _pEditView->getCurrentDocLen();
for (int i = 0; i < lengthDoc; i += blockSize)
{
int grabSize = lengthDoc - i;
if (grabSize > blockSize)
grabSize = blockSize;
_pEditView->getText(data, i, i + grabSize);
UnicodeConvertor.fwrite(data, grabSize);
}
UnicodeConvertor.fclose();
_pEditView->updateCurrentBufTimeStamp();
_pEditView->execute(SCI_SETSAVEPOINT);
if (isHidden)
::SetFileAttributes(filename, attrib | FILE_ATTRIBUTE_HIDDEN);
if (isSys)
::SetFileAttributes(filename, attrib | FILE_ATTRIBUTE_SYSTEM);
scnN.nmhdr.code = NPPN_FILESAVED;
_pluginsManager.notify(&scnN);
return true;
}
::MessageBox(_hSelf, "Please check whether if this file is opened in another program", "Save failed", MB_OK);
return false;
}
bool Notepad_plus::fileSave()
{
if (_pEditView->isCurrentDocDirty())
{
const char *fn = _pEditView->getCurrentTitle();
if (Buffer::isUntitled(fn))
{
return fileSaveAs();
}
else
{
const NppGUI & nppgui = (NppParameters::getInstance())->getNppGUI();
BackupFeature backup = nppgui._backup;
if (backup == bak_simple)
{
//copy fn to fn.backup
string fn_bak(fn);
if ((nppgui._useDir) && (nppgui._backupDir[0] != '\0'))
{
char path[MAX_PATH];
char *name;
strcpy(path, fn);
name = ::PathFindFileName(path);
fn_bak = nppgui._backupDir;
fn_bak += "\\";
fn_bak += name;
}
else
{
fn_bak = fn;
}
fn_bak += ".bak";
::CopyFile(fn, fn_bak.c_str(), FALSE);
}
else if (backup == bak_verbose)
{
char path[MAX_PATH];
char *name;
string fn_dateTime_bak;
strcpy(path, fn);
name = ::PathFindFileName(path);
::PathRemoveFileSpec(path);
if ((nppgui._useDir) && (nppgui._backupDir[0] != '\0'))
{//printStr(nppgui._backupDir);
fn_dateTime_bak = nppgui._backupDir;
fn_dateTime_bak += "\\";
}
else
{
const char *bakDir = "nppBackup";
fn_dateTime_bak = path;
fn_dateTime_bak += "\\";
fn_dateTime_bak += bakDir;
fn_dateTime_bak += "\\";
if (!::PathFileExists(fn_dateTime_bak.c_str()))
{
::CreateDirectory(bakDir, NULL);
}
}
fn_dateTime_bak += name;
const int temBufLen = 32;
char tmpbuf[temBufLen];
time_t ltime = time(0);
struct tm *today;
today = localtime(&ltime);
strftime(tmpbuf, temBufLen, "%Y-%m-%d_%H%M%S", today);
fn_dateTime_bak += ".";
fn_dateTime_bak += tmpbuf;
fn_dateTime_bak += ".bak";
::CopyFile(fn, fn_dateTime_bak.c_str(), FALSE);
}
return doSave(fn, _pEditView->getCurrentBuffer().getUnicodeMode());
}
}
return false;
}
bool Notepad_plus::fileSaveAll() {
int iCurrent = _pEditView->getCurrentDocIndex();
if (_mainWindowStatus & TWO_VIEWS_MASK)
{
switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW);
int iCur = _pEditView->getCurrentDocIndex();
for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++)
{
_pDocTab->activate(i);
if (!_pEditView->getCurrentBuffer().isReadOnly())
fileSave();
}
_pDocTab->activate(iCur);
switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW);
}
for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++)
{
_pDocTab->activate(i);
if (!_pEditView->getCurrentBuffer().isReadOnly())
fileSave();
}
_pDocTab->activate(iCurrent);
return true;
}
bool Notepad_plus::replaceAllFiles() {
int iCurrent = _pEditView->getCurrentDocIndex();
int nbTotal = 0;
const bool isEntireDoc = true;
if (_mainWindowStatus & TWO_VIEWS_MASK)
{
switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW);
int iCur = _pEditView->getCurrentDocIndex();
for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++)
{
_pDocTab->activate(i);
if (!_pEditView->getCurrentBuffer().isReadOnly())
{
_pEditView->execute(SCI_BEGINUNDOACTION);
nbTotal += _findReplaceDlg.processAll(ProcessReplaceAll, NULL, NULL, isEntireDoc, NULL);
_pEditView->execute(SCI_ENDUNDOACTION);
}
}
_pDocTab->activate(iCur);
switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW);
}
for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++)
{
_pDocTab->activate(i);
if (!_pEditView->getCurrentBuffer().isReadOnly())
{
_pEditView->execute(SCI_BEGINUNDOACTION);
nbTotal += _findReplaceDlg.processAll(ProcessReplaceAll, NULL, NULL, isEntireDoc, NULL);
_pEditView->execute(SCI_ENDUNDOACTION);
}
}
_pDocTab->activate(iCurrent);
char result[64];
if (nbTotal < 0)
strcpy(result, "The regular expression to search is formed badly");
else
{
itoa(nbTotal, result, 10);
strcat(result, " tokens are replaced.");
}
::MessageBox(_hSelf, result, "", MB_OK);
return true;
}
bool Notepad_plus::matchInList(const char *fileName, const vector<string> & patterns)
{
for (size_t i = 0 ; i < patterns.size() ; i++)
{
if (PathMatchSpec(fileName, patterns[i].c_str()))
return true;
}
return false;
}
void Notepad_plus::saveUserDefineLangs()
{
if (ScintillaEditView::getUserDefineDlg()->isDirty())
(NppParameters::getInstance())->writeUserDefinedLang();
}
void Notepad_plus::saveShortcuts()
{
NppParameters::getInstance()->writeShortcuts();
}
void Notepad_plus::saveSession(const Session & session)
{
(NppParameters::getInstance())->writeSession(session);
}
void Notepad_plus::doTrimTrailing()
{
_pEditView->execute(SCI_BEGINUNDOACTION);
int nbLines = _pEditView->execute(SCI_GETLINECOUNT);
for (int line = 0 ; line < nbLines ; line++)
{
int lineStart = _pEditView->execute(SCI_POSITIONFROMLINE,line);
int lineEnd = _pEditView->execute(SCI_GETLINEENDPOSITION,line);
int i = lineEnd - 1;
char c = (char)_pEditView->execute(SCI_GETCHARAT,i);
for ( ; (i >= lineStart) && (c == ' ') || (c == '\t') ; c = (char)_pEditView->execute(SCI_GETCHARAT,i))
i--;
if (i < (lineEnd - 1))
{
_pEditView->execute(SCI_SETTARGETSTART, i + 1);
_pEditView->execute(SCI_SETTARGETEND, lineEnd);
_pEditView->execute(SCI_REPLACETARGET, 0, (LPARAM)"");
}
}
_pEditView->execute(SCI_ENDUNDOACTION);
}
void Notepad_plus::loadLastSession()
{
Session lastSession = (NppParameters::getInstance())->getSession();
loadSession(lastSession);
}
void Notepad_plus::getMatchedFileNames(const char *dir, const vector<string> & patterns, vector<string> & fileNames, bool isRecursive)
{
string dirFilter(dir);
dirFilter += "*.*";
WIN32_FIND_DATA foundData;
HANDLE hFile = ::FindFirstFile(dirFilter.c_str(), &foundData);
if (hFile != INVALID_HANDLE_VALUE)
{
if (foundData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (foundData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
{
// branles rien
}
else if (isRecursive)
{
if ((strcmp(foundData.cFileName, ".")) && (strcmp(foundData.cFileName, "..")))
{
string pathDir(dir);
pathDir += foundData.cFileName;
pathDir += "\\";
getMatchedFileNames(pathDir.c_str(), patterns, fileNames, isRecursive);
}
}
}
else
{
if (matchInList(foundData.cFileName, patterns))
{
string pathFile(dir);
pathFile += foundData.cFileName;
fileNames.push_back(pathFile.c_str());
}
}
}
while (::FindNextFile(hFile, &foundData))
{
if (foundData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (foundData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
{
// branles rien
}
else if (isRecursive)
{
if ((strcmp(foundData.cFileName, ".")) && (strcmp(foundData.cFileName, "..")))
{
string pathDir(dir);
pathDir += foundData.cFileName;
pathDir += "\\";
getMatchedFileNames(pathDir.c_str(), patterns, fileNames, isRecursive);
}
}
}
else
{
if (matchInList(foundData.cFileName, patterns))
{
string pathFile(dir);
pathFile += foundData.cFileName;
fileNames.push_back(pathFile.c_str());
}
}
}
::FindClose(hFile);
}
bool Notepad_plus::findInFiles(bool isRecursive)
{
int nbTotal = 0;
ScintillaEditView *pOldView = _pEditView;
_pEditView = &_invisibleEditView;
_findReplaceDlg.setFinderReadOnly(false);
if (!_findReplaceDlg.isFinderEmpty())
_findReplaceDlg.clearFinder();
const char *dir2Search = _findReplaceDlg.getDir2Search();
if (!dir2Search[0] || !::PathFileExists(dir2Search))
{
return false;
}
vector<string> patterns2Match;
if (_findReplaceDlg.getFilters() == "")
_findReplaceDlg.setFindInFilesDirFilter(NULL, "*.*");
_findReplaceDlg.getPatterns(patterns2Match);
vector<string> fileNames;
getMatchedFileNames(dir2Search, patterns2Match, fileNames, isRecursive);
for (size_t i = 0 ; i < fileNames.size() ; i++)
{
const char *fn = fileNames[i].c_str();
if (doSimpleOpen(fn))
nbTotal += _findReplaceDlg.processAll(ProcessFindAll, NULL, NULL, true, fn);
}
_findReplaceDlg.setFinderReadOnly();
_findReplaceDlg.putFindResult(nbTotal);
_pEditView = pOldView;
return true;
}
bool Notepad_plus::findInOpenedFiles() {
int iCurrent = _pEditView->getCurrentDocIndex();
int nbTotal = 0;
const bool isEntireDoc = true;
_findReplaceDlg.setFinderReadOnly(false);
//_findReplaceDlg.setFinderStyle();
//_pFinder->defineDocType(L_TXT);
//_pFinder->execute(SCI_STYLESETSIZE, STYLE_DEFAULT, 8);
if (!_findReplaceDlg.isFinderEmpty())
_findReplaceDlg.clearFinder();
_findReplaceDlg.setSearchWord2Finder();
if (_mainWindowStatus & TWO_VIEWS_MASK)
{
switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW);
int iCur = _pEditView->getCurrentDocIndex();
for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++)
{
_pDocTab->activate(i);
_pEditView->execute(SCI_BEGINUNDOACTION);
nbTotal += _findReplaceDlg.processAll(ProcessFindAll, NULL, NULL, isEntireDoc, _pEditView->getCurrentTitle());
_pEditView->execute(SCI_ENDUNDOACTION);
}
_pDocTab->activate(iCur);
switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW);
}
for (size_t i = 0 ; i < _pEditView->getNbDoc() ; i++)
{
_pDocTab->activate(i);
_pEditView->execute(SCI_BEGINUNDOACTION);
nbTotal += _findReplaceDlg.processAll(ProcessFindAll, NULL, NULL, isEntireDoc, _pEditView->getCurrentTitle());
_pEditView->execute(SCI_ENDUNDOACTION);
}
_pDocTab->activate(iCurrent);
_findReplaceDlg.setFinderReadOnly();
_findReplaceDlg.putFindResult(nbTotal);
return true;
}
bool Notepad_plus::fileSaveAs()
{
FileDialog fDlg(_hSelf, _hInst);
fDlg.setExtFilter("All types", ".*", NULL);
setFileOpenSaveDlgFilters(fDlg);
char str[MAX_PATH];
strcpy(str, _pEditView->getCurrentTitle());
fDlg.setDefFileName(PathFindFileName(str));
int currentDocIndex = _pEditView->getCurrentDocIndex();
_isSaving = true;
char *pfn = fDlg.doSaveDlg();
_isSaving = false;
if (pfn)
{
int i = _pEditView->findDocIndexByName(pfn);
if ((i == -1) || (i == currentDocIndex))
{
doSave(pfn, _pEditView->getCurrentBuffer().getUnicodeMode());
_pEditView->setCurrentTitle(pfn);
_pEditView->setCurrentDocReadOnly(false);
_pDocTab->updateCurrentTabItem(PathFindFileName(pfn));
setTitleWith(pfn);
setLangStatus(_pEditView->getCurrentDocType());
checkLangsMenu(-1);
return true;
}
else
{
::MessageBox(_hSelf, "The file is already opened in the Notepad++.", "ERROR", MB_OK | MB_ICONSTOP);
_pDocTab->activate(i);
return false;
}
checkModifiedDocument();
}
else // cancel button is pressed
{
checkModifiedDocument();
return false;
}
}
void Notepad_plus::filePrint(bool showDialog)
{
Printer printer;
int startPos = int(_pEditView->execute(SCI_GETSELECTIONSTART));
int endPos = int(_pEditView->execute(SCI_GETSELECTIONEND));
printer.init(_hInst, _hSelf, _pEditView, showDialog, startPos, endPos);
printer.doPrint();
}
void Notepad_plus::enableCommand(int cmdID, bool doEnable, int which) const
{
if (which & MENU)
{
enableMenu(cmdID, doEnable);
}
if (which & TOOLBAR)
{
_toolBar.enable(cmdID, doEnable);
}
}
void Notepad_plus::checkClipboard()
{
bool hasSelection = _pEditView->execute(SCI_GETSELECTIONSTART) != _pEditView->execute(SCI_GETSELECTIONEND);
bool canPaste = (_pEditView->execute(SCI_CANPASTE) != 0);
enableCommand(IDM_EDIT_CUT, hasSelection, MENU | TOOLBAR);
enableCommand(IDM_EDIT_COPY, hasSelection, MENU | TOOLBAR);
enableCommand(IDM_EDIT_PASTE, canPaste, MENU | TOOLBAR);
enableCommand(IDM_EDIT_DELETE, hasSelection, MENU | TOOLBAR);
enableCommand(IDM_EDIT_UPPERCASE, hasSelection, MENU);
enableCommand(IDM_EDIT_LOWERCASE, hasSelection, MENU);
enableCommand(IDM_EDIT_BLOCK_COMMENT, hasSelection, MENU);
enableCommand(IDM_EDIT_BLOCK_COMMENT_SET, hasSelection, MENU);
enableCommand(IDM_EDIT_BLOCK_UNCOMMENT, hasSelection, MENU);
enableCommand(IDM_EDIT_STREAM_COMMENT, hasSelection, MENU);
}
void Notepad_plus::checkDocState()
{
bool isCurrentDirty = _pEditView->isCurrentDocDirty();
bool isSeveralDirty = (!_pEditView->isAllDocsClean()) || (!getNonCurrentEditView()->isAllDocsClean());
enableCommand(IDM_FILE_SAVE, isCurrentDirty, MENU | TOOLBAR);
enableCommand(IDM_FILE_SAVEALL, isSeveralDirty, MENU | TOOLBAR);
bool isSysReadOnly = _pEditView->isCurrentBufSysReadOnly();
if (isSysReadOnly)
{
::CheckMenuItem(_mainMenuHandle, IDM_EDIT_SETREADONLY, MF_BYCOMMAND | MF_UNCHECKED);
enableCommand(IDM_EDIT_SETREADONLY, false, MENU);
enableCommand(IDM_EDIT_CLEARREADONLY, true, MENU);
}
else
{
enableCommand(IDM_EDIT_SETREADONLY, true, MENU);
enableCommand(IDM_EDIT_CLEARREADONLY, false, MENU);
bool isUserReadOnly = _pEditView->isCurrentBufUserReadOnly();
::CheckMenuItem(_mainMenuHandle, IDM_EDIT_SETREADONLY, MF_BYCOMMAND | (isUserReadOnly?MF_CHECKED:MF_UNCHECKED));
}
enableConvertMenuItems((_pEditView->getCurrentBuffer()).getFormat());
checkUnicodeMenuItems((_pEditView->getCurrentBuffer()).getUnicodeMode());
checkLangsMenu(-1);
}
void Notepad_plus::checkUndoState()
{
enableCommand(IDM_EDIT_UNDO, _pEditView->execute(SCI_CANUNDO) != 0, MENU | TOOLBAR);
enableCommand(IDM_EDIT_REDO, _pEditView->execute(SCI_CANREDO) != 0, MENU | TOOLBAR);
}
void Notepad_plus::checkMacroState()
{
enableCommand(IDM_MACRO_STARTRECORDINGMACRO, !_recordingMacro, MENU | TOOLBAR);
enableCommand(IDM_MACRO_STOPRECORDINGMACRO, _recordingMacro, MENU | TOOLBAR);
enableCommand(IDM_MACRO_PLAYBACKRECORDEDMACRO, !_macro.empty() && !_recordingMacro, MENU | TOOLBAR);
enableCommand(IDM_MACRO_SAVECURRENTMACRO, !_macro.empty() && !_recordingMacro, MENU | TOOLBAR);
enableCommand(IDM_MACRO_RUNMULTIMACRODLG, (!_macro.empty() && !_recordingMacro) || !((NppParameters::getInstance())->getMacroList()).empty(), MENU | TOOLBAR);
}
void Notepad_plus::checkSyncState()
{
bool canDoSync = _mainDocTab.isVisible() && _subDocTab.isVisible();
if (!canDoSync)
{
_syncInfo._isSynScollV = false;
_syncInfo._isSynScollH = false;
checkMenuItem(IDM_VIEW_SYNSCROLLV, false);
checkMenuItem(IDM_VIEW_SYNSCROLLH, false);
_toolBar.setCheck(IDM_VIEW_SYNSCROLLV, false);
_toolBar.setCheck(IDM_VIEW_SYNSCROLLH, false);
}
enableCommand(IDM_VIEW_SYNSCROLLV, canDoSync, MENU | TOOLBAR);
enableCommand(IDM_VIEW_SYNSCROLLH, canDoSync, MENU | TOOLBAR);
}
void Notepad_plus::synchronise()
{
Buffer & bufSrc = _pEditView->getCurrentBuffer();
const char *fn = bufSrc.getFileName();
int i = getNonCurrentDocTab()->find(fn);
if (i != -1)
{
Buffer & bufDest = getNonCurrentEditView()->getBufferAt(i);
bufDest.synchroniseWith(bufSrc);
getNonCurrentDocTab()->updateTabItem(i);
}
}
void Notepad_plus::checkLangsMenu(int id) const
{
if (id == -1)
{
id = (NppParameters::getInstance())->langTypeToCommandID(_pEditView->getCurrentDocType());
if (id == IDM_LANG_USER)
{
if (_pEditView->getCurrentBuffer().isUserDefineLangExt())
{
const char *userLangName = _pEditView->getCurrentBuffer().getUserDefineLangName();
char menuLangName[16];
for (int i = IDM_LANG_USER + 1 ; i <= IDM_LANG_USER_LIMIT ; i++)
{
if (::GetMenuString(_mainMenuHandle, i, menuLangName, sizeof(menuLangName), MF_BYCOMMAND))
if (!strcmp(userLangName, menuLangName))
{
::CheckMenuRadioItem(_mainMenuHandle, IDM_LANG_C, IDM_LANG_USER_LIMIT, i, MF_BYCOMMAND);
return;
}
}
}
}
}
::CheckMenuRadioItem(_mainMenuHandle, IDM_LANG_C, IDM_LANG_USER_LIMIT, id, MF_BYCOMMAND);
}
string Notepad_plus::getLangDesc(LangType langType, bool shortDesc)
{
if ((langType >= L_EXTERNAL) && (langType < NppParameters::getInstance()->L_END))
{
ExternalLangContainer & elc = NppParameters::getInstance()->getELCFromIndex(langType - L_EXTERNAL);
if (shortDesc)
return string(elc._name);
else
return string(elc._desc);
}
static const int maxChar = 64;
static char langDescArray[][maxChar] = {
"Normal text", "Normal text file",
"PHP", "PHP Hypertext Preprocessor file",
"C", "C source file",
"C++", "C++ source file",
"C#", "C# source file",
"Objective-C", "Objective-C source file",
"Java", "Java source file",
"RC", "Windows Resource file",
"HTML", "Hyper Text Markup Language file",
"XML", "eXtensible Markup Language file",
"Makefile", "Makefile",
"Pascal", "Pascal source file",
"Batch", "Batch file",
"ini", "MS ini file",
"NFO", "MSDOS Style/ASCII Art",
"udf", "User Define File",
"ASP", "Active Server Pages script file",
"SQL", "Structured Query Language file",
"VB", "Visual Basic file",
"JavaScript", "JavaScript file",
"CSS", "Cascade Style Sheets File",
"Perl", "Perl source file",
"Python", "Python file",
"Lua", "Lua source File",
"TeX", "TeX file",
"Fortran", "Fortran source file",
"Shell", "Unix script file",
"Flash Action", "Flash Action script file",
"NSIS", "Nullsoft Scriptable Install System script file",
"TCL", "Tool Command Language file",
"Lisp", "List Processing language file",
"Scheme", "Scheme file",
"Assembly", "Assembly language source file",
"Diff", "Diff file",
"Properties file", "Properties file",
"Postscript", "Postscript file",
"Ruby", "Ruby file",
"Smalltalk", "Smalltalk file",
"VHDL", "VHSIC Hardware Description Language file",
"KiXtart", "KiXtart file",
"AutoIt", "AutoIt",
"CAML", "Categorical Abstract Machine Language",
"Ada", "Ada file",
"Verilog", "Verilog file",
"MATLAB", "MATrix LABoratory",
"Haskell", "Haskell",
"Inno", "Inno Setup script",
"Internal Search", "Internal Search",
"CMAKEFILE", "CMAKEFILE",
"YAML", "YAML Ain't Markup Language"
};
int index = (int(langType)) * 2 + (shortDesc?0:1);
if (index >= sizeof(langDescArray)/maxChar)
index = 0;
string str2Show = langDescArray[index];
if (langType == L_USER)
{
Buffer & currentBuf = _pEditView->getCurrentBuffer();
if (currentBuf.isUserDefineLangExt())
{
str2Show += " - ";
str2Show += currentBuf.getUserDefineLangName();
}
}
return str2Show;
}
void Notepad_plus::getApiFileName(LangType langType, string &fn)
{
switch (langType)
{
case L_C: fn = "c"; break;
case L_CPP: fn = "cpp"; break;
case L_OBJC: fn = "objC"; break;
case L_JAVA: fn = "java"; break;
case L_CS : fn = "cs"; break;
case L_XML: fn = "xml"; break;
case L_JS: fn = "javascript"; break;
case L_PHP: fn = "php"; break;
case L_VB:
case L_ASP: fn = "vb"; break;
case L_CSS: fn = "css"; break;
case L_LUA: fn = "lua"; break;
case L_PERL: fn = "perl"; break;
case L_PASCAL: fn = "pascal"; break;
case L_PYTHON: fn = "python"; break;
case L_TEX : fn = "tex"; break;
case L_FORTRAN : fn = "fortran"; break;
case L_BASH : fn = "bash"; break;
case L_FLASH : fn = "flash"; break;
case L_NSIS : fn = "nsis"; break;
case L_TCL : fn = "tcl"; break;
case L_LISP : fn = "lisp"; break;
case L_SCHEME : fn = "scheme"; break;
case L_ASM :
fn = "asm"; break;
case L_DIFF :
fn = "diff"; break;
/*
case L_PROPS :
fn = "Properties file"; break;
*/
case L_PS :
fn = "postscript"; break;
case L_RUBY :
fn = "ruby"; break;
case L_SMALLTALK :
fn = "smalltalk"; break;
case L_VHDL :
fn = "vhdl"; break;
case L_KIX :
fn = "kix"; break;
case L_AU3 :
fn = "autoit"; break;
case L_CAML :
fn = "caml"; break;
case L_ADA :
fn = "ada"; break;
case L_VERILOG :
fn = "verilog"; break;
case L_MATLAB :
fn = "matlab"; break;
case L_HASKELL :
fn = "haskell"; break;
case L_INNO :
fn = "inno"; break;
case L_CMAKE :
fn = "cmake"; break;
case L_YAML :
fn = "yaml"; break;
case L_USER :
{
Buffer & currentBuf = _pEditView->getCurrentBuffer();
if (currentBuf.isUserDefineLangExt())
{
fn = currentBuf.getUserDefineLangName();
}
break;
}
default:
if (langType >= L_EXTERNAL && langType < NppParameters::getInstance()->L_END)
fn = NppParameters::getInstance()->getELCFromIndex(langType - L_EXTERNAL)._name;
else
fn = "text";
}
}
BOOL Notepad_plus::notify(SCNotification *notification)
{
//Important, keep track of which element generated the message
bool isFromPrimary = (_mainEditView.getHSelf() == notification->nmhdr.hwndFrom);
ScintillaEditView * notifyView = isFromPrimary?&_mainEditView:&_subEditView;
DocTabView *notifyDocTab = isFromPrimary?&_mainDocTab:&_subDocTab;
switch (notification->nmhdr.code)
{
case SCN_MODIFIED:
{
if ((notification->modificationType & SC_MOD_DELETETEXT) || (notification->modificationType & SC_MOD_INSERTTEXT))
{
_linkTriggered = true;
_isDocModifing = true;
::InvalidateRect(notifyView->getHSelf(), NULL, TRUE);
}
if (notification->modificationType & SC_MOD_CHANGEFOLD)
{
notifyView->foldChanged(notification->line,
notification->foldLevelNow, notification->foldLevelPrev);
}
}
break;
case SCN_SAVEPOINTREACHED:
notifyView->setCurrentDocState(false);
notifyDocTab->updateCurrentTabItem();
checkDocState();
synchronise();
break;
case SCN_SAVEPOINTLEFT:
notifyView->setCurrentDocState(true);
notifyDocTab->updateCurrentTabItem();
checkDocState();
synchronise();
break;
case SCN_MODIFYATTEMPTRO :
// on fout rien
break;
case SCN_KEY:
break;
case TCN_TABDROPPEDOUTSIDE:
case TCN_TABDROPPED:
{
TabBarPlus *sender = reinterpret_cast<TabBarPlus *>(notification->nmhdr.idFrom);
int destIndex = sender->getTabDraggedIndex();
int scrIndex = sender->getSrcTabIndex();
// if the dragNdrop tab is not the current view tab,
// we have to set it to the current view tab
if (notification->nmhdr.hwndFrom != _pDocTab->getHSelf())
switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW);
_pEditView->sortBuffer(destIndex, scrIndex);
_pEditView->setCurrentIndex(destIndex);
if (notification->nmhdr.code == TCN_TABDROPPEDOUTSIDE)
{
POINT p = sender->getDraggingPoint();
//It's the coordinate of screen, so we can call
//"WindowFromPoint" function without converting the point
HWND hWin = ::WindowFromPoint(p);
if (hWin == _pEditView->getHSelf()) // In the same view group
{
if (!_tabPopupDropMenu.isCreated())
{
char goToView[64] = "Go to another View";
char cloneToView[64] = "Clone to another View";
const char *pGoToView = goToView;
const char *pCloneToView = cloneToView;
if (_nativeLang)
{
TiXmlNode *tabBarMenu = _nativeLang->FirstChild("Menu");
if (tabBarMenu)
tabBarMenu = tabBarMenu->FirstChild("TabBar");
if (tabBarMenu)
{
for (TiXmlNode *childNode = tabBarMenu->FirstChildElement("Item");
childNode ;
childNode = childNode->NextSibling("Item") )
{
TiXmlElement *element = childNode->ToElement();
int ordre;
element->Attribute("order", &ordre);
if (ordre == 5)
pGoToView = element->Attribute("name");
else if (ordre == 6)
pCloneToView = element->Attribute("name");
}
}
if (!pGoToView || !pGoToView[0])
pGoToView = goToView;
if (!pCloneToView || !pCloneToView[0])
pCloneToView = cloneToView;
}
vector<MenuItemUnit> itemUnitArray;
itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_GOTO_ANOTHER_VIEW, pGoToView));
itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_CLONE_TO_ANOTHER_VIEW, pCloneToView));
_tabPopupDropMenu.create(_hSelf, itemUnitArray);
}
_tabPopupDropMenu.display(p);
}
else if ((hWin == getNonCurrentDocTab()->getHSelf()) ||
(hWin == getNonCurrentEditView()->getHSelf())) // In the another view group
{
if (::GetKeyState(VK_LCONTROL) & 0x80000000)
docGotoAnotherEditView(MODE_CLONE);
else
docGotoAnotherEditView(MODE_TRANSFER);
}
//else on fout rien!!! // It's non view group
}
break;
}
case TCN_TABDELETE:
{
if (notification->nmhdr.hwndFrom != _pDocTab->getHSelf())
switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW);
fileClose();
break;
}
case TCN_SELCHANGE:
{
char fullPath[MAX_PATH];
if (notification->nmhdr.hwndFrom == _mainDocTab.getHSelf())
{
strcpy(fullPath, _mainDocTab.clickedUpdate());
switchEditViewTo(MAIN_VIEW);
}
else if (notification->nmhdr.hwndFrom == _subDocTab.getHSelf())
{
strcpy(fullPath, _subDocTab.clickedUpdate());
switchEditViewTo(SUB_VIEW);
}
PathRemoveFileSpec(fullPath);
setWorkingDir(fullPath);
//_pEditView->execute(SCI_SETLEXER, SCLEX_CONTAINER)
_linkTriggered = true;
break;
}
case NM_CLICK :
{
if (notification->nmhdr.hwndFrom == _statusBar.getHSelf())
{
LPNMMOUSE lpnm = (LPNMMOUSE)notification;
if (lpnm->dwItemSpec == DWORD(STATUSBAR_TYPING_MODE))
{
bool isOverTypeMode = (_pEditView->execute(SCI_GETOVERTYPE) != 0);
_pEditView->execute(SCI_SETOVERTYPE, !isOverTypeMode);
_statusBar.setText((_pEditView->execute(SCI_GETOVERTYPE))?"OVR":"INS", STATUSBAR_TYPING_MODE);
}
}
else if (notification->nmhdr.hwndFrom == _mainDocTab.getHSelf())
{
switchEditViewTo(MAIN_VIEW);
}
else if (notification->nmhdr.hwndFrom == _subDocTab.getHSelf())
{
switchEditViewTo(SUB_VIEW);
}
break;
}
case NM_DBLCLK :
{
if (notification->nmhdr.hwndFrom == _statusBar.getHSelf())
{
LPNMMOUSE lpnm = (LPNMMOUSE)notification;
if (lpnm->dwItemSpec == DWORD(STATUSBAR_CUR_POS))
{
bool isFirstTime = !_goToLineDlg.isCreated();
_goToLineDlg.doDialog(_isRTL);
if (isFirstTime)
changeDlgLang(_goToLineDlg.getHSelf(), "GoToLine");
}
}
break;
}
case NM_RCLICK :
{
if (notification->nmhdr.hwndFrom == _mainDocTab.getHSelf())
{
switchEditViewTo(MAIN_VIEW);
}
else if (notification->nmhdr.hwndFrom == _subDocTab.getHSelf())
{
switchEditViewTo(SUB_VIEW);
}
else // From tool bar or Status Bar
return TRUE;
//break;
POINT p, clientPoint;
::GetCursorPos(&p);
clientPoint.x = p.x;
clientPoint.y = p.y;
if (!_tabPopupMenu.isCreated())
{
char close[32] = "Close me";
char closeBut[32] = "Close all but me";
char save[32] = "Save me";
char saveAs[32] = "Save me As...";
char print[32] = "Print me";
char readOnly[32] = "Read only";
char clearReadOnly[32] = "Clear read only flag";
char goToView[32] = "Go to another View";
char cloneToView[32] = "Clone to another View";
char cilpFullPath[32] = "Full file path to Clipboard";
char cilpFileName[32] = "File name to Clipboard";
char cilpCurrentDir[32] = "Current dir path to Clipboard";
const char *pClose = close;
const char *pCloseBut = closeBut;
const char *pSave = save;
const char *pSaveAs = saveAs;
const char *pPrint = print;
const char *pReadOnly = readOnly;
const char *pClearReadOnly = clearReadOnly;
const char *pGoToView = goToView;
const char *pCloneToView = cloneToView;
const char *pCilpFullPath = cilpFullPath;
const char *pCilpFileName = cilpFileName;
const char *pCilpCurrentDir = cilpCurrentDir;
if (_nativeLang)
{
TiXmlNode *tabBarMenu = _nativeLang->FirstChild("Menu");
if (tabBarMenu)
{
tabBarMenu = tabBarMenu->FirstChild("TabBar");
if (tabBarMenu)
{
for (TiXmlNode *childNode = tabBarMenu->FirstChildElement("Item");
childNode ;
childNode = childNode->NextSibling("Item") )
{
TiXmlElement *element = childNode->ToElement();
int ordre;
element->Attribute("order", &ordre);
switch (ordre)
{
case 0 :
pClose = element->Attribute("name"); break;
case 1 :
pCloseBut = element->Attribute("name"); break;
case 2 :
pSave = element->Attribute("name"); break;
case 3 :
pSaveAs = element->Attribute("name"); break;
case 4 :
pPrint = element->Attribute("name"); break;
case 5 :
pGoToView = element->Attribute("name"); break;
case 6 :
pCloneToView = element->Attribute("name"); break;
}
}
}
}
if (!pClose || !pClose[0])
pClose = close;
if (!pCloseBut || !pCloseBut[0])
pCloseBut = cloneToView;
if (!pSave || !pSave[0])
pSave = save;
if (!pSaveAs || !pSaveAs[0])
pSaveAs = saveAs;
if (!pPrint || !pPrint[0])
pPrint = print;
if (!pGoToView || !pGoToView[0])
pGoToView = goToView;
if (!pCloneToView || !pCloneToView[0])
pCloneToView = cloneToView;
}
vector<MenuItemUnit> itemUnitArray;
itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CLOSE, pClose));
itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CLOSEALL_BUT_CURRENT, pCloseBut));
itemUnitArray.push_back(MenuItemUnit(IDM_FILE_SAVE, pSave));
itemUnitArray.push_back(MenuItemUnit(IDM_FILE_SAVEAS, pSaveAs));
itemUnitArray.push_back(MenuItemUnit(IDM_FILE_PRINT, pPrint));
itemUnitArray.push_back(MenuItemUnit(0, NULL));
itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_SETREADONLY, pReadOnly));
itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_CLEARREADONLY, pClearReadOnly));
itemUnitArray.push_back(MenuItemUnit(0, NULL));
itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_FULLPATHTOCLIP, pCilpFullPath));
itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_FILENAMETOCLIP, pCilpFileName));
itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_CURRENTDIRTOCLIP, pCilpCurrentDir));
itemUnitArray.push_back(MenuItemUnit(0, NULL));
itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_GOTO_ANOTHER_VIEW, pGoToView));
itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_CLONE_TO_ANOTHER_VIEW, pCloneToView));
_tabPopupMenu.create(_hSelf, itemUnitArray);
}
::ScreenToClient(_pDocTab->getHSelf(), &clientPoint);
::SendMessage(_pDocTab->getHSelf(), WM_LBUTTONDOWN, 2, MAKELONG(clientPoint.x, clientPoint.y));
bool isEnable = ((::GetMenuState(_mainMenuHandle, IDM_FILE_SAVE, MF_BYCOMMAND)&MF_DISABLED) == 0);
_tabPopupMenu.enableItem(IDM_FILE_SAVE, isEnable);
bool isUserReadOnly = _pEditView->isCurrentBufUserReadOnly();
_tabPopupMenu.checkItem(IDM_EDIT_SETREADONLY, isUserReadOnly);
bool isSysReadOnly = _pEditView->isCurrentBufSysReadOnly();
_tabPopupMenu.enableItem(IDM_EDIT_SETREADONLY, !isSysReadOnly);
_tabPopupMenu.enableItem(IDM_EDIT_CLEARREADONLY, isSysReadOnly);
_tabPopupMenu.display(p);
return TRUE;
}
case SCN_MARGINCLICK:
{
if (notification->nmhdr.hwndFrom == _mainEditView.getHSelf())
switchEditViewTo(MAIN_VIEW);
else if (notification->nmhdr.hwndFrom == _subEditView.getHSelf())
switchEditViewTo(SUB_VIEW);
if (notification->margin == ScintillaEditView::_SC_MARGE_FOLDER)
{
_pEditView->marginClick(notification->position, notification->modifiers);
}
else if (notification->margin == ScintillaEditView::_SC_MARGE_SYBOLE)
{
int lineClick = int(_pEditView->execute(SCI_LINEFROMPOSITION, notification->position));
if (!showLines(lineClick))
bookmarkToggle(lineClick);
}
break;
}
case SCN_CHARADDED:
{
charAdded(static_cast<char>(notification->ch));
static const NppGUI & nppGUI = NppParameters::getInstance()->getNppGUI();
char s[64];
notifyView->getWordToCurrentPos(s, sizeof(s));
if (strlen(s) >= nppGUI._autocFromLen)
{
if (nppGUI._autocStatus == nppGUI.autoc_word)
autoCompFromCurrentFile(false);
else if (nppGUI._autocStatus == nppGUI.autoc_func)
showAutoComp();
}
break;
}
case SCN_DOUBLECLICK :
{
if (_isHotspotDblClicked)
{
int pos = notifyView->execute(SCI_GETCURRENTPOS);
notifyView->execute(SCI_SETCURRENTPOS, pos);
notifyView->execute(SCI_SETANCHOR, pos);
_isHotspotDblClicked = false;
}
else
{
markSelectedText();
}
}
break;
case SCN_UPDATEUI:
braceMatch();
markSelectedText();
updateStatusBar();
break;
case TTN_GETDISPINFO:
{
LPTOOLTIPTEXT lpttt;
lpttt = (LPTOOLTIPTEXT)notification;
lpttt->hinst = _hInst;
// Specify the resource identifier of the descriptive
// text for the given button.
int idButton = int(lpttt->hdr.idFrom);
static string tip;
getNameStrFromCmd(idButton, tip);
lpttt->lpszText = (LPSTR)tip.c_str();
}
break;
case SCN_ZOOM:
notifyView->setLineNumberWidth(_pEditView->hasMarginShowed(ScintillaEditView::_SC_MARGE_LINENUMBER));
break;
case SCN_MACRORECORD:
_macro.push_back(recordedMacroStep(notification->message, notification->wParam, notification->lParam));
break;
case SCN_PAINTED:
{
if (_syncInfo.doSync())
doSynScorll(HWND(notification->nmhdr.hwndFrom));
if (_linkTriggered)
{
int urlAction = (NppParameters::getInstance())->getNppGUI()._styleURL;
if ((urlAction == 1) || (urlAction == 2))
addHotSpot(_isDocModifing);
_linkTriggered = false;
_isDocModifing = false;
}
break;
}
case SCN_HOTSPOTDOUBLECLICK :
{
notifyView->execute(SCI_SETWORDCHARS, 0, (LPARAM)"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-+.:?&@=/%#");
int pos = notifyView->execute(SCI_GETCURRENTPOS);
int startPos = static_cast<int>(notifyView->execute(SCI_WORDSTARTPOSITION, pos, false));
int endPos = static_cast<int>(notifyView->execute(SCI_WORDENDPOSITION, pos, false));
notifyView->execute(SCI_SETTARGETSTART, startPos);
notifyView->execute(SCI_SETTARGETEND, endPos);
int posFound = notifyView->execute(SCI_SEARCHINTARGET, strlen(urlHttpRegExpr), (LPARAM)urlHttpRegExpr);
if (posFound != -1)
{
startPos = int(notifyView->execute(SCI_GETTARGETSTART));
endPos = int(notifyView->execute(SCI_GETTARGETEND));
}
char currentWord[MAX_PATH*2];
notifyView->getText(currentWord, startPos, endPos);
::ShellExecute(_hSelf, "open", currentWord, NULL, NULL, SW_SHOW);
_isHotspotDblClicked = true;
notifyView->execute(SCI_SETCHARSDEFAULT);
break;
}
case SCN_NEEDSHOWN :
{
int begin = notifyView->execute(SCI_LINEFROMPOSITION, notification->position);
int end = notifyView->execute(SCI_LINEFROMPOSITION, notification->position + notification->length);
int firstLine = begin < end ? begin : end;
int lastLine = begin > end ? begin : end;
for (int line = firstLine; line <= lastLine; line++) {
notifyView->execute(SCI_ENSUREVISIBLE, line, 0);
}
break;
}
case RBN_HEIGHTCHANGE:
{
SendMessage(_hSelf, WM_SIZE, 0, 0);
break;
}
case RBN_CHEVRONPUSHED:
{
NMREBARCHEVRON * lpnm = (NMREBARCHEVRON*) notification;
ReBar * notifRebar = &_rebarTop;
if (_rebarBottom.getHSelf() == lpnm->hdr.hwndFrom)
notifRebar = &_rebarBottom;
//If N++ ID, use proper object
switch(lpnm->wID) {
case REBAR_BAR_TOOLBAR: {
POINT pt;
pt.x = lpnm->rc.left;
pt.y = lpnm->rc.bottom;
ClientToScreen(notifRebar->getHSelf(), &pt);
_toolBar.doPopop(pt);
return TRUE;
break; }
}
//Else forward notification to window of rebarband
REBARBANDINFO rbBand;
rbBand.cbSize = sizeof(rbBand);
rbBand.fMask = RBBIM_CHILD;
::SendMessage(notifRebar->getHSelf(), RB_GETBANDINFO, lpnm->uBand, (LPARAM)&rbBand);
::SendMessage(rbBand.hwndChild, WM_NOTIFY, 0, (LPARAM)lpnm);
break;
}
default :
break;
}
return FALSE;
}
void Notepad_plus::findMatchingBracePos(int & braceAtCaret, int & braceOpposite)
{
int caretPos = int(_pEditView->execute(SCI_GETCURRENTPOS));
braceAtCaret = -1;
braceOpposite = -1;
char charBefore = '\0';
//char styleBefore = '\0';
int lengthDoc = int(_pEditView->execute(SCI_GETLENGTH));
if ((lengthDoc > 0) && (caretPos > 0))
{
charBefore = char(_pEditView->execute(SCI_GETCHARAT, caretPos - 1, 0));
}
// Priority goes to character before caret
if (charBefore && strchr("[](){}", charBefore))
{
braceAtCaret = caretPos - 1;
}
if (lengthDoc > 0 && (braceAtCaret < 0))
{
// No brace found so check other side
char charAfter = char(_pEditView->execute(SCI_GETCHARAT, caretPos, 0));
if (charAfter && strchr("[](){}", charAfter))
{
braceAtCaret = caretPos;
}
}
if (braceAtCaret >= 0)
braceOpposite = int(_pEditView->execute(SCI_BRACEMATCH, braceAtCaret, 0));
}
void Notepad_plus::braceMatch()
{
int braceAtCaret = -1;
int braceOpposite = -1;
findMatchingBracePos(braceAtCaret, braceOpposite);
if ((braceAtCaret != -1) && (braceOpposite == -1))
{
_pEditView->execute(SCI_BRACEBADLIGHT, braceAtCaret);
_pEditView->execute(SCI_SETHIGHLIGHTGUIDE);
}
else
{
_pEditView->execute(SCI_BRACEHIGHLIGHT, braceAtCaret, braceOpposite);
if (_pEditView->isShownIndentGuide())
{
int columnAtCaret = int(_pEditView->execute(SCI_GETCOLUMN, braceAtCaret));
int columnOpposite = int(_pEditView->execute(SCI_GETCOLUMN, braceOpposite));
_pEditView->execute(SCI_SETHIGHLIGHTGUIDE, (columnAtCaret < columnOpposite)?columnAtCaret:columnOpposite);
}
}
enableCommand(IDM_SEARCH_GOTOMATCHINGBRACE, (braceAtCaret != -1) && (braceOpposite != -1), MENU | TOOLBAR);
}
void Notepad_plus::charAdded(char chAdded)
{
bool indentMaintain = NppParameters::getInstance()->getNppGUI()._maitainIndent;
if (indentMaintain)
MaintainIndentation(chAdded);
}
void Notepad_plus::addHotSpot(bool docIsModifing)
{
//bool docIsModifing = true;
int posBegin2style = 0;
if (docIsModifing)
posBegin2style = _pEditView->execute(SCI_GETCURRENTPOS);
int endStyle = _pEditView->execute(SCI_GETENDSTYLED);
if (docIsModifing)
{
posBegin2style = _pEditView->execute(SCI_GETCURRENTPOS);
if (posBegin2style > 0) posBegin2style--;
unsigned char ch = (unsigned char)_pEditView->execute(SCI_GETCHARAT, posBegin2style);
// determinating the type of EOF to make sure how many steps should we be back
if ((ch == 0x0A) || (ch == 0x0D))
{
int eolMode = _pEditView->execute(SCI_GETEOLMODE);
if ((eolMode == SC_EOL_CRLF) && (posBegin2style > 1))
posBegin2style -= 2;
else if (posBegin2style > 0)
posBegin2style -= 1;
}
ch = (unsigned char)_pEditView->execute(SCI_GETCHARAT, posBegin2style);
while ((posBegin2style > 0) && ((ch != 0x0A) && (ch != 0x0D)))
{
ch = (unsigned char)_pEditView->execute(SCI_GETCHARAT, posBegin2style--);
}
}
int style_hotspot = 30;
int startPos = 0;
int endPos = _pEditView->execute(SCI_GETTEXTLENGTH);
_pEditView->execute(SCI_SETSEARCHFLAGS, SCFIND_REGEXP|SCFIND_POSIX);
_pEditView->execute(SCI_SETTARGETSTART, startPos);
_pEditView->execute(SCI_SETTARGETEND, endPos);
vector<pair<int, int> > hotspotStylers;
//char *regExprStr0 = "http://[a-z0-9_-+.:?=/%]*";//"http://[^ \\t\\\"]*";
//char *regExprStr1 = "[a-zA-Z0-9._]+@[a-zA-Z0-9_]+.[a-zA-Z0-9_]+";
int posFound = _pEditView->execute(SCI_SEARCHINTARGET, strlen(urlHttpRegExpr), (LPARAM)urlHttpRegExpr);
while (posFound != -1)
{
int start = int(_pEditView->execute(SCI_GETTARGETSTART));
int end = int(_pEditView->execute(SCI_GETTARGETEND));
int foundTextLen = end - start;
int idStyle = _pEditView->execute(SCI_GETSTYLEAT, posFound);
if (end < posBegin2style - 1)
{
if (style_hotspot > 1)
style_hotspot--;
}
else
{
int fs = -1;
for (size_t i = 0 ; i < hotspotStylers.size() ; i++)
{
if (hotspotStylers[i].second == idStyle)
{
fs = hotspotStylers[i].first;
break;
}
}
if (fs != -1)
{
_pEditView->execute(SCI_STARTSTYLING, start, 0xFF);
_pEditView->execute(SCI_SETSTYLING, foundTextLen, fs);
}
else
{
pair<int, int> p(style_hotspot, idStyle);
hotspotStylers.push_back(p);
int activeFG = 0xFF0000;
char fontName[256];
Style hotspotStyle;
_pEditView->execute(SCI_STYLEGETFONT, idStyle, (LPARAM)fontName);
hotspotStyle._fgColor = _pEditView->execute(SCI_STYLEGETFORE, idStyle);
hotspotStyle._bgColor = _pEditView->execute(SCI_STYLEGETBACK, idStyle);
hotspotStyle._fontSize = _pEditView->execute(SCI_STYLEGETSIZE, idStyle);
int isBold = _pEditView->execute(SCI_STYLEGETBOLD, idStyle);
int isItalic = _pEditView->execute(SCI_STYLEGETITALIC, idStyle);
int isUnderline = _pEditView->execute(SCI_STYLEGETUNDERLINE, idStyle);
hotspotStyle._fontStyle = (isBold?FONTSTYLE_BOLD:0) | (isItalic?FONTSTYLE_ITALIC:0) | (isUnderline?FONTSTYLE_UNDERLINE:0);
int fontStyle = (isBold?FONTSTYLE_BOLD:0) | (isItalic?FONTSTYLE_ITALIC:0) | (isUnderline?FONTSTYLE_UNDERLINE:0);
int urlAction = (NppParameters::getInstance())->getNppGUI()._styleURL;
if (urlAction == 2)
hotspotStyle._fontStyle |= FONTSTYLE_UNDERLINE;
_pEditView->setStyle(hotspotStyle);
_pEditView->execute(SCI_STYLESETHOTSPOT, style_hotspot, TRUE);
_pEditView->execute(SCI_SETHOTSPOTACTIVEFORE, TRUE, activeFG);
_pEditView->execute(SCI_SETHOTSPOTSINGLELINE, style_hotspot, 0);
_pEditView->execute(SCI_STARTSTYLING, start, 0x1F);
_pEditView->execute(SCI_SETSTYLING, foundTextLen, style_hotspot);
if (style_hotspot > 1)
style_hotspot--;
}
}
_pEditView->execute(SCI_SETTARGETSTART, posFound + foundTextLen);
_pEditView->execute(SCI_SETTARGETEND, endPos);
posFound = _pEditView->execute(SCI_SEARCHINTARGET, strlen(urlHttpRegExpr), (LPARAM)urlHttpRegExpr);
}
_pEditView->execute(SCI_STARTSTYLING, endStyle, 0xFF);
_pEditView->execute(SCI_SETSTYLING, 0, 0);
}
void Notepad_plus::MaintainIndentation(char ch)
{
int eolMode = int(_pEditView->execute(SCI_GETEOLMODE));
int curLine = int(_pEditView->getCurrentLineNumber());
int lastLine = curLine - 1;
int indentAmount = 0;
if (((eolMode == SC_EOL_CRLF || eolMode == SC_EOL_LF) && ch == '\n') ||
(eolMode == SC_EOL_CR && ch == '\r'))
{
while (lastLine >= 0 && _pEditView->getLineLength(lastLine) == 0)
lastLine--;
if (lastLine >= 0) {
indentAmount = _pEditView->getLineIndent(lastLine);
}
if (indentAmount > 0) {
_pEditView->setLineIndent(curLine, indentAmount);
}
}
}
void Notepad_plus::specialCmd(int id, int param)
{
if ((param != 1) && (param != 2)) return;
NppParameters *pNppParam = NppParameters::getInstance();
ScintillaEditView *pEditView = (param == 1)?&_mainEditView:&_subEditView;
switch (id)
{
case IDM_VIEW_LINENUMBER:
case IDM_VIEW_SYMBOLMARGIN:
case IDM_VIEW_FOLDERMAGIN:
{
int margin;
if (id == IDM_VIEW_LINENUMBER)
margin = ScintillaEditView::_SC_MARGE_LINENUMBER;
else if (id == IDM_VIEW_SYMBOLMARGIN)
margin = ScintillaEditView::_SC_MARGE_SYBOLE;
else
margin = ScintillaEditView::_SC_MARGE_FOLDER;
if (pEditView->hasMarginShowed(margin))
pEditView->showMargin(margin, false);
else
pEditView->showMargin(margin);
break;
}
case IDM_VIEW_FOLDERMAGIN_SIMPLE:
case IDM_VIEW_FOLDERMAGIN_ARROW:
case IDM_VIEW_FOLDERMAGIN_CIRCLE:
case IDM_VIEW_FOLDERMAGIN_BOX:
{
int checkedID = getFolderMarginStyle();
if (checkedID == id) return;
folderStyle fStyle = (id == IDM_VIEW_FOLDERMAGIN_SIMPLE)?FOLDER_STYLE_SIMPLE:\
((id == IDM_VIEW_FOLDERMAGIN_ARROW)?FOLDER_STYLE_ARROW:\
((id == IDM_VIEW_FOLDERMAGIN_CIRCLE)?FOLDER_STYLE_CIRCLE:FOLDER_STYLE_BOX));
pEditView->setMakerStyle(fStyle);
break;
}
case IDM_VIEW_CURLINE_HILITING:
{
COLORREF colour = pNppParam->getCurLineHilitingColour();
pEditView->setCurrentLineHiLiting(!_pEditView->isCurrentLineHiLiting(), colour);
break;
}
case IDM_VIEW_EDGEBACKGROUND:
case IDM_VIEW_EDGELINE:
case IDM_VIEW_EDGENONE:
{
int mode;
switch (id)
{
case IDM_VIEW_EDGELINE:
{
mode = EDGE_LINE;
break;
}
case IDM_VIEW_EDGEBACKGROUND:
{
mode = EDGE_BACKGROUND;
break;
}
default :
mode = EDGE_NONE;
}
pEditView->execute(SCI_SETEDGEMODE, mode);
break;
}
case IDM_SETTING_EDGE_SIZE :
{
ValueDlg nbColumnEdgeDlg;
ScintillaViewParams & svp = (ScintillaViewParams &)pNppParam->getSVP(param == 1?SCIV_PRIMARY:SCIV_SECOND);
nbColumnEdgeDlg.init(_hInst, _hSelf, svp._edgeNbColumn, "Nb of column:");
nbColumnEdgeDlg.setNBNumber(3);
POINT p;
::GetCursorPos(&p);
::ScreenToClient(_hParent, &p);
int size = nbColumnEdgeDlg.doDialog(p, _isRTL);
if (size != -1)
{
svp._edgeNbColumn = size;
pEditView->execute(SCI_SETEDGECOLUMN, size);
}
break;
}
}
}
void Notepad_plus::command(int id)
{
NppParameters *pNppParam = NppParameters::getInstance();
switch (id)
{
case IDM_FILE_NEW:
fileNew();
break;
case IDM_FILE_OPEN:
fileOpen();
break;
case IDM_FILE_RELOAD:
fileReload();
break;
case IDM_FILE_CLOSE:
fileClose();
checkSyncState();
break;
case IDM_FILE_CLOSEALL:
fileCloseAll();
checkSyncState();
break;
case IDM_FILE_CLOSEALL_BUT_CURRENT :
fileCloseAllButCurrent();
checkSyncState();
break;
case IDM_FILE_SAVE :
fileSave();
break;
case IDM_FILE_SAVEALL :
fileSaveAll();
break;
case IDM_FILE_SAVEAS :
fileSaveAs();
break;
case IDM_FILE_LOADSESSION:
fileLoadSession();
break;
case IDM_FILE_SAVESESSION:
fileSaveSession();
break;
case IDM_FILE_PRINTNOW :
filePrint(false);
break;
case IDM_FILE_PRINT :
filePrint(true);
break;
case IDM_FILE_EXIT:
::SendMessage(_hSelf, WM_CLOSE, 0, 0);
break;
case IDM_EDIT_UNDO:
_pEditView->execute(WM_UNDO);
checkClipboard();
checkUndoState();
break;
case IDM_EDIT_REDO:
_pEditView->execute(SCI_REDO);
checkClipboard();
checkUndoState();
break;
case IDM_EDIT_CUT:
_pEditView->execute(WM_CUT);
break;
case IDM_EDIT_COPY:
_pEditView->execute(WM_COPY);
checkClipboard();
break;
case IDM_EDIT_PASTE:
{
int eolMode = int(_pEditView->execute(SCI_GETEOLMODE));
_pEditView->execute(SCI_PASTE);
_pEditView->execute(SCI_CONVERTEOLS, eolMode);
}
break;
case IDM_EDIT_DELETE:
_pEditView->execute(WM_CLEAR);
break;
case IDM_MACRO_STARTRECORDINGMACRO:
case IDM_MACRO_STOPRECORDINGMACRO:
case IDC_EDIT_TOGGLEMACRORECORDING:
{
//static HCURSOR originalCur;
if (_recordingMacro)
{
// STOP !!!
_mainEditView.execute(SCI_STOPRECORD);
//_mainEditView.execute(SCI_ENDUNDOACTION);
_subEditView.execute(SCI_STOPRECORD);
//_subEditView.execute(SCI_ENDUNDOACTION);
//::SetCursor(originalCur);
_mainEditView.execute(SCI_SETCURSOR, (LPARAM)SC_CURSORNORMAL);
_subEditView.execute(SCI_SETCURSOR, (LPARAM)SC_CURSORNORMAL);
_recordingMacro = false;
_runMacroDlg.initMacroList();
}
else
{
//originalCur = ::LoadCursor(_hInst, MAKEINTRESOURCE(IDC_MACRO_RECORDING));
//::SetCursor(originalCur);
_mainEditView.execute(SCI_SETCURSOR, 9);
_subEditView.execute(SCI_SETCURSOR, 9);
_macro.clear();
// START !!!
_mainEditView.execute(SCI_STARTRECORD);
//_mainEditView.execute(SCI_BEGINUNDOACTION);
_subEditView.execute(SCI_STARTRECORD);
//_subEditView.execute(SCI_BEGINUNDOACTION);
_recordingMacro = true;
}
checkMacroState();
break;
}
case IDM_MACRO_PLAYBACKRECORDEDMACRO:
if (!_recordingMacro) // if we're not currently recording, then playback the recorded keystrokes
{
_pEditView->execute(SCI_BEGINUNDOACTION);
for (Macro::iterator step = _macro.begin(); step != _macro.end(); step++)
step->PlayBack(this, _pEditView);
_pEditView->execute(SCI_ENDUNDOACTION);
}
break;
case IDM_MACRO_RUNMULTIMACRODLG :
{
if (!_recordingMacro) // if we're not currently recording, then playback the recorded keystrokes
{
bool isFirstTime = !_runMacroDlg.isCreated();
_runMacroDlg.doDialog(_isRTL);
if (isFirstTime)
{
changeDlgLang(_runMacroDlg.getHSelf(), "MultiMacro");
}
break;
}
}
break;
case IDM_MACRO_SAVECURRENTMACRO :
{
if (addCurrentMacro())
_runMacroDlg.initMacroList();
break;
}
case IDM_EDIT_FULLPATHTOCLIP :
{
str2Cliboard(_pEditView->getCurrentTitle());
}
break;
case IDM_EDIT_CURRENTDIRTOCLIP :
{
char dir[MAX_PATH];
strcpy(dir, _pEditView->getCurrentTitle());
PathRemoveFileSpec((LPSTR)dir);
str2Cliboard(dir);
}
break;
case IDM_EDIT_FILENAMETOCLIP :
{
str2Cliboard(PathFindFileName((LPSTR)_pEditView->getCurrentTitle()));
}
break;
case IDM_SEARCH_FIND :
case IDM_SEARCH_REPLACE :
{
const int strSize = 64;
char str[strSize];
bool isFirstTime = !_findReplaceDlg.isCreated();
if (_nativeLang)
{
TiXmlNode *dlgNode = _nativeLang->FirstChild("Dialog");
if (dlgNode)
{
dlgNode = searchDlgNode(dlgNode, "Find");
if (dlgNode)
{
const char *titre1 = (dlgNode->ToElement())->Attribute("titleFind");
const char *titre2 = (dlgNode->ToElement())->Attribute("titleReplace");
const char *titre3 = (dlgNode->ToElement())->Attribute("titleFindInFiles");
if (titre1 && titre2 && titre3)
{
pNppParam->getFindDlgTabTitiles()._find = titre1;
pNppParam->getFindDlgTabTitiles()._replace = titre2;
pNppParam->getFindDlgTabTitiles()._findInFiles = titre3;
}
}
}
}
_findReplaceDlg.doDialog((id == IDM_SEARCH_FIND)?FIND_DLG:REPLACE_DLG, _isRTL);
_pEditView->getSelectedText(str, strSize);
_findReplaceDlg.setSearchText(str, _pEditView->getCurrentBuffer()._unicodeMode != uni8Bit);
if (isFirstTime)
changeDlgLang(_findReplaceDlg.getHSelf(), "Find");
break;
}
case IDM_SEARCH_FINDINFILES :
{
::SendMessage(_hSelf, NPPM_LAUNCHFINDINFILESDLG, 0, 0);
break;
}
case IDM_SEARCH_FINDINCREMENT :
{
const int strSize = 64;
char str[strSize];
_incrementFindDlg.display();
_pEditView->getSelectedText(str, strSize);
_incrementFindDlg.setSearchText(str, _pEditView->getCurrentBuffer()._unicodeMode != uni8Bit);
}
break;
case IDM_SEARCH_FINDNEXT :
case IDM_SEARCH_FINDPREV :
{
if (!_findReplaceDlg.isCreated())
return;
_findReplaceDlg.setSearchDirection(id == IDM_SEARCH_FINDNEXT?DIR_DOWN:DIR_UP);
string s = _findReplaceDlg.getText2search();
_findReplaceDlg.processFindNext(s.c_str());
break;
}
break;
case IDM_SEARCH_VOLATILE_FINDNEXT :
case IDM_SEARCH_VOLATILE_FINDPREV :
{
char text2Find[MAX_PATH];
_pEditView->getSelectedText(text2Find, sizeof(text2Find));
FindOption op;
op._isWholeWord = false;
op._whichDirection = (id == IDM_SEARCH_VOLATILE_FINDNEXT?DIR_DOWN:DIR_UP);
_findReplaceDlg.processFindNext(text2Find, &op);
break;
}
case IDM_SEARCH_MARKALL :
{
const int strSize = 64;
char text2Find[strSize];
_pEditView->getSelectedText(text2Find, sizeof(text2Find));
FindOption op;
op._isWholeWord = false;
//op._whichDirection = (id == IDM_SEARCH_VOLATILE_FINDNEXT?DIR_DOWN:DIR_UP);
_findReplaceDlg.markAll(text2Find);
break;
}
case IDM_SEARCH_UNMARKALL :
{
_pEditView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE);
break;
}
case IDM_SEARCH_GOTOLINE :
{
bool isFirstTime = !_goToLineDlg.isCreated();
_goToLineDlg.doDialog(_isRTL);
if (isFirstTime)
changeDlgLang(_goToLineDlg.getHSelf(), "GoToLine");
break;
}
case IDM_EDIT_COLUMNMODE :
{
bool isFirstTime = !_colEditorDlg.isCreated();
_colEditorDlg.doDialog(_isRTL);
if (isFirstTime)
changeDlgLang(_colEditorDlg.getHSelf(), "ColumnEditor");
break;
}
case IDM_SEARCH_GOTOMATCHINGBRACE :
{
int braceAtCaret = -1;
int braceOpposite = -1;
findMatchingBracePos(braceAtCaret, braceOpposite);
if (braceOpposite != -1)
_pEditView->execute(SCI_GOTOPOS, braceOpposite);
break;
}
case IDM_SEARCH_TOGGLE_BOOKMARK :
bookmarkToggle(-1);
break;
case IDM_SEARCH_NEXT_BOOKMARK:
bookmarkNext(true);
break;
case IDM_SEARCH_PREV_BOOKMARK:
bookmarkNext(false);
break;
case IDM_SEARCH_CLEAR_BOOKMARKS:
bookmarkClearAll();
break;
case IDM_VIEW_USER_DLG :
{
bool isUDDlgVisible = false;
UserDefineDialog *udd = _pEditView->getUserDefineDlg();
if (!udd->isCreated())
{
_pEditView->doUserDefineDlg(true, _isRTL);
changeUserDefineLang();
if (_isUDDocked)
::SendMessage(udd->getHSelf(), WM_COMMAND, IDC_DOCK_BUTTON, 0);
}
else
{
isUDDlgVisible = udd->isVisible();
bool isUDDlgDocked = udd->isDocked();
if ((isUDDlgDocked)&&(isUDDlgVisible))
{
::ShowWindow(_pMainSplitter->getHSelf(), SW_HIDE);
if (_mainWindowStatus & TWO_VIEWS_MASK)
_pMainWindow = &_subSplitter;
else
_pMainWindow = _pDocTab;
::SendMessage(_hSelf, WM_SIZE, 0, 0);
udd->display(false);
_mainWindowStatus &= ~DOCK_MASK;
}
else if ((isUDDlgDocked)&&(!isUDDlgVisible))
{
if (!_pMainSplitter)
{
_pMainSplitter = new SplitterContainer;
_pMainSplitter->init(_hInst, _hSelf);
Window *pWindow;
if (_mainWindowStatus & TWO_VIEWS_MASK)
pWindow = &_subSplitter;
else
pWindow = _pDocTab;
_pMainSplitter->create(pWindow, ScintillaEditView::getUserDefineDlg(), 8, RIGHT_FIX, 45);
}
_pMainWindow = _pMainSplitter;
_pMainSplitter->setWin0((_mainWindowStatus & TWO_VIEWS_MASK)?(Window *)&_subSplitter:(Window *)_pDocTab);
::SendMessage(_hSelf, WM_SIZE, 0, 0);
_pMainWindow->display();
_mainWindowStatus |= DOCK_MASK;
}
else if ((!isUDDlgDocked)&&(isUDDlgVisible))
{
udd->display(false);
}
else //((!isUDDlgDocked)&&(!isUDDlgVisible))
udd->display();
}
checkMenuItem(IDM_VIEW_USER_DLG, !isUDDlgVisible);
_toolBar.setCheck(IDM_VIEW_USER_DLG, !isUDDlgVisible);
break;
}
case IDM_EDIT_SELECTALL:
_pEditView->execute(SCI_SELECTALL);
checkClipboard();
break;
case IDM_EDIT_INS_TAB:
_pEditView->execute(SCI_TAB);
break;
case IDM_EDIT_RMV_TAB:
_pEditView->execute(SCI_BACKTAB);
break;
case IDM_EDIT_DUP_LINE:
_pEditView->execute(SCI_LINEDUPLICATE);
break;
case IDM_EDIT_SPLIT_LINES:
_pEditView->execute(SCI_TARGETFROMSELECTION);
_pEditView->execute(SCI_LINESSPLIT);
break;
case IDM_EDIT_JOIN_LINES:
_pEditView->execute(SCI_TARGETFROMSELECTION);
_pEditView->execute(SCI_LINESJOIN);
break;
case IDM_EDIT_LINE_UP:
_pEditView->currentLineUp();
break;
case IDM_EDIT_LINE_DOWN:
_pEditView->currentLineDown();
break;
case IDM_EDIT_UPPERCASE:
_pEditView->convertSelectedTextToUpperCase();
break;
case IDM_EDIT_LOWERCASE:
_pEditView->convertSelectedTextToLowerCase();
break;
case IDM_EDIT_BLOCK_COMMENT:
doBlockComment(cm_toggle);
break;
case IDM_EDIT_BLOCK_COMMENT_SET:
doBlockComment(cm_comment);
break;
case IDM_EDIT_BLOCK_UNCOMMENT:
doBlockComment(cm_uncomment);
break;
case IDM_EDIT_STREAM_COMMENT:
doStreamComment();
break;
case IDM_EDIT_TRIMTRAILING:
doTrimTrailing();
break;
case IDM_EDIT_SETREADONLY:
{
int check = (::GetMenuState(_mainMenuHandle, id, MF_BYCOMMAND) == MF_CHECKED)?MF_UNCHECKED:MF_CHECKED;
::CheckMenuItem(_mainMenuHandle, id, MF_BYCOMMAND | check);
_pEditView->setCurrentDocReadOnlyByUser(check == MF_CHECKED);
_pDocTab->updateCurrentTabItem();
}
break;
case IDM_EDIT_CLEARREADONLY:
{
DWORD dwFileAttribs = ::GetFileAttributes(_pEditView->getCurrentBuffer().getFileName());
dwFileAttribs ^= FILE_ATTRIBUTE_READONLY;
::SetFileAttributes(_pEditView->getCurrentBuffer().getFileName(), dwFileAttribs);
_pEditView->execute(SCI_SETREADONLY,false);
_pEditView->updateCurrentDocSysReadOnlyStat();
_pDocTab->updateCurrentTabItem();
enableCommand(IDM_EDIT_SETREADONLY, true, MENU);
}
break;
case IDM_VIEW_FULLSCREENTOGGLE :
fullScreenToggle();
break;
case IDM_VIEW_ALWAYSONTOP:
{
int check = (::GetMenuState(_mainMenuHandle, id, MF_BYCOMMAND) == MF_CHECKED)?MF_UNCHECKED:MF_CHECKED;
::CheckMenuItem(_mainMenuHandle, id, MF_BYCOMMAND | check);
SetWindowPos(_hSelf, check == MF_CHECKED?HWND_TOPMOST:HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
}
break;
case IDM_VIEW_FOLD_CURRENT :
case IDM_VIEW_UNFOLD_CURRENT :
_pEditView->foldCurrentPos((id==IDM_VIEW_FOLD_CURRENT)?fold_collapse:fold_uncollapse);
break;
case IDM_VIEW_TOGGLE_FOLDALL:
case IDM_VIEW_TOGGLE_UNFOLDALL:
{
_pEditView->foldAll((id==IDM_VIEW_TOGGLE_FOLDALL)?fold_collapse:fold_uncollapse);
}
break;
case IDM_VIEW_FOLD_1:
case IDM_VIEW_FOLD_2:
case IDM_VIEW_FOLD_3:
case IDM_VIEW_FOLD_4:
case IDM_VIEW_FOLD_5:
case IDM_VIEW_FOLD_6:
case IDM_VIEW_FOLD_7:
case IDM_VIEW_FOLD_8:
_pEditView->collapse(id - IDM_VIEW_FOLD - 1, fold_collapse);
break;
case IDM_VIEW_UNFOLD_1:
case IDM_VIEW_UNFOLD_2:
case IDM_VIEW_UNFOLD_3:
case IDM_VIEW_UNFOLD_4:
case IDM_VIEW_UNFOLD_5:
case IDM_VIEW_UNFOLD_6:
case IDM_VIEW_UNFOLD_7:
case IDM_VIEW_UNFOLD_8:
_pEditView->collapse(id - IDM_VIEW_UNFOLD - 1, fold_uncollapse);
break;
case IDM_VIEW_TOOLBAR_HIDE:
{
bool toSet = !_rebarTop.getIDVisible(REBAR_BAR_TOOLBAR);
_rebarTop.setIDVisible(REBAR_BAR_TOOLBAR, toSet);
}
break;
case IDM_VIEW_TOOLBAR_REDUCE:
{
toolBarStatusType state = _toolBar.getState();
if (state != TB_SMALL)
{
_toolBar.reduce();
changeToolBarIcons();
}
}
break;
case IDM_VIEW_TOOLBAR_ENLARGE:
{
toolBarStatusType state = _toolBar.getState();
if (state != TB_LARGE)
{
_toolBar.enlarge();
changeToolBarIcons();
}
}
break;
case IDM_VIEW_TOOLBAR_STANDARD:
{
toolBarStatusType state = _toolBar.getState();
if (state != TB_STANDARD)
{
_toolBar.setToUglyIcons();
}
}
break;
case IDM_VIEW_REDUCETABBAR :
{
_toReduceTabBar = !_toReduceTabBar;
//Resize the icon
int iconSize = _toReduceTabBar?12:18;
//Resize the tab height
int tabHeight = _toReduceTabBar?20:25;
TabCtrl_SetItemSize(_mainDocTab.getHSelf(), 45, tabHeight);
TabCtrl_SetItemSize(_subDocTab.getHSelf(), 45, tabHeight);
_docTabIconList.setIconSize(iconSize);
//change the font
int stockedFont = _toReduceTabBar?DEFAULT_GUI_FONT:SYSTEM_FONT;
HFONT hf = (HFONT)::GetStockObject(stockedFont);
if (hf)
{
::SendMessage(_mainDocTab.getHSelf(), WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE, 0));
::SendMessage(_subDocTab.getHSelf(), WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE, 0));
}
::SendMessage(_hSelf, WM_SIZE, 0, 0);
break;
}
case IDM_VIEW_REFRESHTABAR :
{
::SendMessage(_hSelf, WM_SIZE, 0, 0);
break;
}
case IDM_VIEW_LOCKTABBAR:
{
bool isDrag = TabBarPlus::doDragNDropOrNot();
TabBarPlus::doDragNDrop(!isDrag);
//checkMenuItem(IDM_VIEW_LOCKTABBAR, isDrag);
break;
}
case IDM_VIEW_DRAWTABBAR_INACIVETAB:
{
TabBarPlus::setDrawInactiveTab(!TabBarPlus::drawInactiveTab());
//TabBarPlus::setDrawInactiveTab(!TabBarPlus::drawInactiveTab(), _subDocTab.getHSelf());
break;
}
case IDM_VIEW_DRAWTABBAR_TOPBAR:
{
TabBarPlus::setDrawTopBar(!TabBarPlus::drawTopBar());
break;
}
case IDM_VIEW_DRAWTABBAR_CLOSEBOTTUN :
{
TabBarPlus::setDrawTabCloseButton(!TabBarPlus::drawTabCloseButton());
// This part is just for updating (redraw) the tabs
{
int tabHeight = TabBarPlus::drawTabCloseButton()?21:20;
TabCtrl_SetItemSize(_mainDocTab.getHSelf(), 45, tabHeight);
TabCtrl_SetItemSize(_subDocTab.getHSelf(), 45, tabHeight);
}
::SendMessage(_hSelf, WM_SIZE, 0, 0);
break;
}
case IDM_VIEW_DRAWTABBAR_DBCLK2CLOSE :
{
TabBarPlus::setDbClk2Close(!TabBarPlus::isDbClk2Close());
break;
}
case IDM_VIEW_DRAWTABBAR_VERTICAL :
{
TabBarPlus::setVertical(!TabBarPlus::isVertical());
::SendMessage(_hSelf, WM_SIZE, 0, 0);
break;
}
case IDM_VIEW_DRAWTABBAR_MULTILINE :
{
TabBarPlus::setMultiLine(!TabBarPlus::isMultiLine());
::SendMessage(_hSelf, WM_SIZE, 0, 0);
break;
}
case IDM_VIEW_STATUSBAR:
{
RECT rc;
getClientRect(rc);
NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI();
nppGUI._statusBarShow = !nppGUI._statusBarShow;
_statusBar.display(nppGUI._statusBarShow);
::SendMessage(_hSelf, WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right));
break;
}
case IDM_VIEW_HIDEMENU :
{
NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI();
nppGUI._menuBarShow = !nppGUI._menuBarShow;
if (nppGUI._menuBarShow)
::SetMenu(_hSelf, _mainMenuHandle);
else
::SetMenu(_hSelf, NULL);
break;
}
case IDM_VIEW_TAB_SPACE:
{
bool isChecked = !(::GetMenuState(_mainMenuHandle, IDM_VIEW_TAB_SPACE, MF_BYCOMMAND) == MF_CHECKED);
::CheckMenuItem(_mainMenuHandle, IDM_VIEW_EOL, MF_BYCOMMAND | MF_UNCHECKED);
::CheckMenuItem(_mainMenuHandle, IDM_VIEW_ALL_CHARACTERS, MF_BYCOMMAND | MF_UNCHECKED);
::CheckMenuItem(_mainMenuHandle, IDM_VIEW_TAB_SPACE, MF_BYCOMMAND | (isChecked?MF_CHECKED:MF_UNCHECKED));
_toolBar.setCheck(IDM_VIEW_ALL_CHARACTERS, false);
_pEditView->showEOL(false);
_pEditView->showWSAndTab(isChecked);
break;
}
case IDM_VIEW_EOL:
{
bool isChecked = !(::GetMenuState(_mainMenuHandle, IDM_VIEW_EOL, MF_BYCOMMAND) == MF_CHECKED);
::CheckMenuItem(_mainMenuHandle, IDM_VIEW_TAB_SPACE, MF_BYCOMMAND | MF_UNCHECKED);
::CheckMenuItem(_mainMenuHandle, IDM_VIEW_EOL, MF_BYCOMMAND | (isChecked?MF_CHECKED:MF_UNCHECKED));
::CheckMenuItem(_mainMenuHandle, IDM_VIEW_ALL_CHARACTERS, MF_BYCOMMAND | MF_UNCHECKED);
_toolBar.setCheck(IDM_VIEW_ALL_CHARACTERS, false);
_pEditView->showEOL(isChecked);
_pEditView->showWSAndTab(false);
break;
}
case IDM_VIEW_ALL_CHARACTERS:
{
bool isChecked = !(::GetMenuState(_mainMenuHandle, id, MF_BYCOMMAND) == MF_CHECKED);
::CheckMenuItem(_mainMenuHandle, IDM_VIEW_EOL, MF_BYCOMMAND | MF_UNCHECKED);
::CheckMenuItem(_mainMenuHandle, IDM_VIEW_TAB_SPACE, MF_BYCOMMAND | MF_UNCHECKED);
::CheckMenuItem(_mainMenuHandle, IDM_VIEW_ALL_CHARACTERS, MF_BYCOMMAND | (isChecked?MF_CHECKED:MF_UNCHECKED));
_pEditView->showInvisibleChars(isChecked);
_toolBar.setCheck(IDM_VIEW_ALL_CHARACTERS, isChecked);
break;
}
case IDM_VIEW_INDENT_GUIDE:
{
_pEditView->showIndentGuideLine(!_pEditView->isShownIndentGuide());
_toolBar.setCheck(IDM_VIEW_INDENT_GUIDE, _pEditView->isShownIndentGuide());
checkMenuItem(IDM_VIEW_INDENT_GUIDE, _pEditView->isShownIndentGuide());
break;
}
case IDM_VIEW_WRAP:
{
bool isWraped = !_pEditView->isWrap();
_pEditView->wrap(isWraped);
_toolBar.setCheck(IDM_VIEW_WRAP, isWraped);
checkMenuItem(IDM_VIEW_WRAP, isWraped);
break;
}
case IDM_VIEW_WRAP_SYMBOL:
{
_pEditView->showWrapSymbol(!_pEditView->isWrapSymbolVisible());
checkMenuItem(IDM_VIEW_WRAP_SYMBOL, _pEditView->isWrapSymbolVisible());
break;
}
case IDM_VIEW_HIDELINES:
{
CharacterRange range = _pEditView->getSelection();
int startLine = _pEditView->execute(SCI_LINEFROMPOSITION, range.cpMin);
int endLine = _pEditView->execute(SCI_LINEFROMPOSITION, range.cpMax);
if (startLine == 0)
startLine = 1;
if (endLine == _pEditView->getNbLine())
endLine -= 1;
_pEditView->execute(SCI_HIDELINES, startLine, endLine);
_pEditView->execute(SCI_MARKERADD, startLine-1, MARK_HIDELINESBEGIN);
_pEditView->execute(SCI_MARKERADD, endLine+1, MARK_HIDELINESEND);
_hideLinesMarks.push_back(pair<int, int>(startLine-1, endLine+1));
break;
}
case IDM_VIEW_ZOOMIN:
{
_pEditView->execute(SCI_ZOOMIN);
break;
}
case IDM_VIEW_ZOOMOUT:
_pEditView->execute(SCI_ZOOMOUT);
break;
case IDM_VIEW_ZOOMRESTORE:
_pEditView->execute(SCI_SETZOOM, _zoomOriginalValue);
break;
case IDM_VIEW_SYNSCROLLV:
{
_syncInfo._isSynScollV = !_syncInfo._isSynScollV;
checkMenuItem(IDM_VIEW_SYNSCROLLV, _syncInfo._isSynScollV);
_toolBar.setCheck(IDM_VIEW_SYNSCROLLV, _syncInfo._isSynScollV);
if (_syncInfo._isSynScollV)
{
int mainCurrentLine = _mainEditView.execute(SCI_GETFIRSTVISIBLELINE);
int subCurrentLine = _subEditView.execute(SCI_GETFIRSTVISIBLELINE);
_syncInfo._line = mainCurrentLine - subCurrentLine;
}
}
break;
case IDM_VIEW_SYNSCROLLH:
{
_syncInfo._isSynScollH = !_syncInfo._isSynScollH;
checkMenuItem(IDM_VIEW_SYNSCROLLH, _syncInfo._isSynScollH);
_toolBar.setCheck(IDM_VIEW_SYNSCROLLH, _syncInfo._isSynScollH);
if (_syncInfo._isSynScollH)
{
int mxoffset = _mainEditView.execute(SCI_GETXOFFSET);
int pixel = int(_mainEditView.execute(SCI_TEXTWIDTH, STYLE_DEFAULT, (LPARAM)"P"));
int mainColumn = mxoffset/pixel;
int sxoffset = _subEditView.execute(SCI_GETXOFFSET);
pixel = int(_subEditView.execute(SCI_TEXTWIDTH, STYLE_DEFAULT, (LPARAM)"P"));
int subColumn = sxoffset/pixel;
_syncInfo._column = mainColumn - subColumn;
}
}
break;
case IDM_EXECUTE:
{
bool isFirstTime = !_runDlg.isCreated();
_runDlg.doDialog(_isRTL);
if (isFirstTime)
changeDlgLang(_runDlg.getHSelf(), "Run");
break;
}
case IDM_FORMAT_TODOS :
case IDM_FORMAT_TOUNIX :
case IDM_FORMAT_TOMAC :
{
int f = int((id == IDM_FORMAT_TODOS)?SC_EOL_CRLF:(id == IDM_FORMAT_TOUNIX)?SC_EOL_LF:SC_EOL_CR);
_pEditView->execute(SCI_SETEOLMODE, f);
_pEditView->execute(SCI_CONVERTEOLS, f);
(_pEditView->getCurrentBuffer()).setFormat((formatType)f);
enableConvertMenuItems((formatType)f);
setDisplayFormat((formatType)f);
break;
}
case IDM_FORMAT_ANSI :
case IDM_FORMAT_UTF_8 :
case IDM_FORMAT_UCS_2BE :
case IDM_FORMAT_UCS_2LE :
case IDM_FORMAT_AS_UTF_8 :
{
UniMode um;
switch (id)
{
case IDM_FORMAT_AS_UTF_8:
um = uniCookie;
break;
case IDM_FORMAT_UTF_8:
um = uniUTF8;
break;
case IDM_FORMAT_UCS_2BE:
um = uni16BE;
break;
case IDM_FORMAT_UCS_2LE:
um = uni16LE;
break;
default : // IDM_FORMAT_ANSI
um = uni8Bit;
}
if (_pEditView->getCurrentBuffer().getUnicodeMode() != um)
{
_pEditView->getCurrentBuffer().setUnicodeMode(um);
_pDocTab->updateCurrentTabItem();
checkDocState();
synchronise();
_pEditView->execute(SCI_SETCODEPAGE, (um != uni8Bit)?SC_CP_UTF8:0);
checkUnicodeMenuItems(um);
setUniModeText(um);
}
break;
}
case IDM_FORMAT_CONV2_ANSI:
case IDM_FORMAT_CONV2_AS_UTF_8:
case IDM_FORMAT_CONV2_UTF_8:
case IDM_FORMAT_CONV2_UCS_2BE:
case IDM_FORMAT_CONV2_UCS_2LE:
{
int idEncoding = -1;
Buffer & currentBuffer = _pEditView->getCurrentBuffer();
UniMode um = currentBuffer._unicodeMode;
switch(id)
{
case IDM_FORMAT_CONV2_ANSI:
{
if (um == uni8Bit)
return;
idEncoding = IDM_FORMAT_ANSI;
break;
}
case IDM_FORMAT_CONV2_AS_UTF_8:
{
idEncoding = IDM_FORMAT_AS_UTF_8;
if (um == uniCookie)
return;
if (um != uni8Bit)
{
::SendMessage(_hSelf, WM_COMMAND, idEncoding, 0);
_pEditView->execute(SCI_EMPTYUNDOBUFFER);
return;
}
break;
}
case IDM_FORMAT_CONV2_UTF_8:
{
idEncoding = IDM_FORMAT_UTF_8;
if (um == uniUTF8)
return;
if (um != uni8Bit)
{
::SendMessage(_hSelf, WM_COMMAND, idEncoding, 0);
_pEditView->execute(SCI_EMPTYUNDOBUFFER);
return;
}
break;
}
case IDM_FORMAT_CONV2_UCS_2BE:
{
idEncoding = IDM_FORMAT_UCS_2BE;
if (um == uni16BE)
return;
if (um != uni8Bit)
{
::SendMessage(_hSelf, WM_COMMAND, idEncoding, 0);
_pEditView->execute(SCI_EMPTYUNDOBUFFER);
return;
}
break;
}
case IDM_FORMAT_CONV2_UCS_2LE:
{
idEncoding = IDM_FORMAT_UCS_2LE;
if (um == uni16LE)
return;
if (um != uni8Bit)
{
::SendMessage(_hSelf, WM_COMMAND, idEncoding, 0);
_pEditView->execute(SCI_EMPTYUNDOBUFFER);
return;
}
break;
}
}
if (idEncoding != -1)
{
// Save the current clipboard content
::OpenClipboard(_hSelf);
HANDLE clipboardData = ::GetClipboardData(CF_TEXT);
int len = ::GlobalSize(clipboardData);
LPVOID clipboardDataPtr = ::GlobalLock(clipboardData);
HANDLE allocClipboardData = ::GlobalAlloc(GMEM_MOVEABLE, len);
LPVOID clipboardData2 = ::GlobalLock(allocClipboardData);
::memcpy(clipboardData2, clipboardDataPtr, len);
::GlobalUnlock(clipboardData);
::GlobalUnlock(allocClipboardData);
::CloseClipboard();
_pEditView->saveCurrentPos();
// Cut all text
int docLen = _pEditView->getCurrentDocLen();
_pEditView->execute(SCI_COPYRANGE, 0, docLen);
_pEditView->execute(SCI_CLEARALL);
// Change to the proper buffer, save buffer status
::SendMessage(_hSelf, WM_COMMAND, idEncoding, 0);
// Paste the texte, restore buffer status
_pEditView->execute(SCI_PASTE);
_pEditView->restoreCurrentPos();
// Restore the previous clipboard data
::OpenClipboard(_hSelf);
::EmptyClipboard();
::SetClipboardData(CF_TEXT, clipboardData2);
::CloseClipboard();
//Do not free anything, EmptyClipboard does that
//::GlobalFree(allocClipboardData);
_pEditView->execute(SCI_EMPTYUNDOBUFFER);
}
break;
}
case IDM_SETTING_TAB_REPLCESPACE:
{
NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI());
nppgui._tabReplacedBySpace = !nppgui._tabReplacedBySpace;
_pEditView->execute(SCI_SETUSETABS, !nppgui._tabReplacedBySpace);
//checkMenuItem(IDM_SETTING_TAB_REPLCESPACE, nppgui._tabReplacedBySpace);
break;
}
case IDM_SETTING_TAB_SIZE:
{
ValueDlg tabSizeDlg;
NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI());
tabSizeDlg.init(_hInst, _hSelf, nppgui._tabSize, "Tab Size : ");
POINT p;
::GetCursorPos(&p);
::ScreenToClient(_hParent, &p);
int size = tabSizeDlg.doDialog(p, _isRTL);
if (size != -1)
{
nppgui._tabSize = size;
_pEditView->execute(SCI_SETTABWIDTH, nppgui._tabSize);
}
break;
}
case IDM_SETTING_AUTOCNBCHAR:
{
const int NB_MIN_CHAR = 1;
const int NB_MAX_CHAR = 9;
ValueDlg valDlg;
NppGUI & nppGUI = (NppGUI &)((NppParameters::getInstance())->getNppGUI());
valDlg.init(_hInst, _hSelf, nppGUI._autocFromLen, "Nb char : ");
POINT p;
::GetCursorPos(&p);
::ScreenToClient(_hParent, &p);
int size = valDlg.doDialog(p, _isRTL);
if (size != -1)
{
if (size > NB_MAX_CHAR)
size = NB_MAX_CHAR;
else if (size < NB_MIN_CHAR)
size = NB_MIN_CHAR;
nppGUI._autocFromLen = size;
}
break;
}
case IDM_SETTING_HISTORY_SIZE :
{
ValueDlg nbHistoryDlg;
NppParameters *pNppParam = NppParameters::getInstance();
nbHistoryDlg.init(_hInst, _hSelf, pNppParam->getNbMaxFile(), "Max File : ");
POINT p;
::GetCursorPos(&p);
::ScreenToClient(_hParent, &p);
int size = nbHistoryDlg.doDialog(p, _isRTL);
if (size != -1)
{
if (size > NB_MAX_LRF_FILE)
size = NB_MAX_LRF_FILE;
pNppParam->setNbMaxFile(size);
_lastRecentFileList.setUserMaxNbLRF(size);
}
break;
}
case IDM_SETTING_FILEASSOCIATION_DLG :
{
RegExtDlg regExtDlg;
regExtDlg.init(_hInst, _hSelf);
regExtDlg.doDialog(_isRTL);
break;
}
case IDM_SETTING_SHORTCUT_MAPPER :
{
ShortcutMapper shortcutMapper;
shortcutMapper.init(_hInst, _hSelf);
changeShortcutmapperLang(&shortcutMapper);
shortcutMapper.doDialog(_isRTL);
shortcutMapper.destroy();
break;
}
case IDM_SETTING_PREFERECE :
{
bool isFirstTime = !_preference.isCreated();
_preference.doDialog(_isRTL);
if (isFirstTime)
{
changePrefereceDlgLang();
}
break;
}
case IDM_VIEW_GOTO_ANOTHER_VIEW:
docGotoAnotherEditView(MODE_TRANSFER);
checkSyncState();
break;
case IDM_VIEW_CLONE_TO_ANOTHER_VIEW:
docGotoAnotherEditView(MODE_CLONE);
checkSyncState();
break;
case IDM_ABOUT:
{
bool isFirstTime = !_aboutDlg.isCreated();
_aboutDlg.doDialog();
if (isFirstTime && _nativeLang)
{
const char *lang = (_nativeLang->ToElement())->Attribute("name");
if (lang && !strcmp(lang, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>c<EFBFBD><EFBFBD>"))
{
char *authorName = "<EFBFBD>J<EFBFBD><EFBFBD><EFBFBD>^";
HWND hItem = ::GetDlgItem(_aboutDlg.getHSelf(), IDC_AUTHOR_NAME);
::SetWindowText(hItem, authorName);
}
}
break;
}
case IDM_HOMESWEETHOME :
{
::ShellExecute(NULL, "open", "http://notepad-plus.sourceforge.net/", NULL, NULL, SW_SHOWNORMAL);
break;
}
case IDM_PROJECTPAGE :
{
::ShellExecute(NULL, "open", "http://sourceforge.net/projects/notepad-plus/", NULL, NULL, SW_SHOWNORMAL);
break;
}
case IDM_ONLINEHELP:
{
::ShellExecute(NULL, "open", "http://notepad-plus.sourceforge.net/uk/generalFAQ.php", NULL, NULL, SW_SHOWNORMAL);
break;
}
case IDM_WIKIFAQ:
{
::ShellExecute(NULL, "open", "http://notepad-plus.wiki.sourceforge.net/FAQ", NULL, NULL, SW_SHOWNORMAL);
break;
}
case IDM_FORUM:
{
::ShellExecute(NULL, "open", "http://sourceforge.net/forum/?group_id=95717", NULL, NULL, SW_SHOWNORMAL);
break;
}
case IDM_PLUGINSHOME:
{
::ShellExecute(NULL, "open", "https://sourceforge.net/projects/npp-plugins/", NULL, NULL, SW_SHOWNORMAL);
break;
}
case IDM_UPDATE_NPP :
{
string updaterDir = pNppParam->getNppPath();
updaterDir += "\\updater\\";
string updaterFullPath = updaterDir + "gup.exe";
string param = "-verbose -v";
param += VERSION_VALUE;
Process updater(updaterFullPath.c_str(), param.c_str(), updaterDir.c_str());
updater.run();
break;
}
case IDM_EDIT_AUTOCOMPLETE :
showAutoComp();
break;
case IDM_EDIT_AUTOCOMPLETE_CURRENTFILE :
//MessageBox(NULL, "IDM_EDIT_AUTOCOMPLETE_CURRENTFILE", "", MB_OK);
autoCompFromCurrentFile();
break;
case IDM_LANGSTYLE_CONFIG_DLG :
{
bool isFirstTime = !_configStyleDlg.isCreated();
_configStyleDlg.doDialog(_isRTL);
if (isFirstTime)
changeConfigLang();
break;
}
case IDM_LANG_C :
setLanguage(id, L_C);
break;
case IDM_LANG_CPP :
setLanguage(id, L_CPP);
break;
case IDM_LANG_JAVA :
setLanguage(id, L_JAVA);
break;
case IDM_LANG_CS :
setLanguage(id, L_CS);
break;
case IDM_LANG_HTML :
setLanguage(id, L_HTML);
break;
case IDM_LANG_XML :
setLanguage(id, L_XML);
break;
case IDM_LANG_JS :
setLanguage(id, L_JS);
break;
case IDM_LANG_PHP :
setLanguage(id, L_PHP);
break;
case IDM_LANG_ASP :
setLanguage(id, L_ASP);
break;
case IDM_LANG_CSS :
setLanguage(id, L_CSS);
break;
case IDM_LANG_LUA :
setLanguage(id, L_LUA);
break;
case IDM_LANG_PERL :
setLanguage(id, L_PERL);
break;
case IDM_LANG_PYTHON :
setLanguage(id, L_PYTHON);
break;
case IDM_LANG_PASCAL :
setLanguage(id, L_PASCAL);
break;
case IDM_LANG_BATCH :
setLanguage(id, L_BATCH);
break;
case IDM_LANG_OBJC :
setLanguage(id, L_OBJC);
break;
case IDM_LANG_VB :
setLanguage(id, L_VB);
break;
case IDM_LANG_SQL :
setLanguage(id, L_SQL);
break;
case IDM_LANG_ASCII :
setLanguage(id, L_NFO);
break;
case IDM_LANG_TEXT :
setLanguage(id, L_TXT);
break;
case IDM_LANG_RC :
setLanguage(id, L_RC);
break;
case IDM_LANG_MAKEFILE :
setLanguage(id, L_MAKEFILE);
break;
case IDM_LANG_INI :
setLanguage(id, L_INI);
break;
case IDM_LANG_TEX :
setLanguage(id, L_TEX);
break;
case IDM_LANG_FORTRAN :
setLanguage(id, L_FORTRAN);
break;
case IDM_LANG_SH :
setLanguage(id, L_BASH);
break;
case IDM_LANG_FLASH :
setLanguage(id, L_FLASH);
break;
case IDM_LANG_NSIS :
setLanguage(id, L_NSIS);
break;
case IDM_LANG_TCL :
setLanguage(id, L_TCL);
break;
case IDM_LANG_LISP :
setLanguage(id, L_LISP);
break;
case IDM_LANG_SCHEME :
setLanguage(id, L_SCHEME);
break;
case IDM_LANG_ASM :
setLanguage(id, L_ASM);
break;
case IDM_LANG_DIFF :
setLanguage(id, L_DIFF);
break;
case IDM_LANG_PROPS :
setLanguage(id, L_PROPS);
break;
case IDM_LANG_PS:
setLanguage(id, L_PS);
break;
case IDM_LANG_RUBY:
setLanguage(id, L_RUBY);
break;
case IDM_LANG_SMALLTALK:
setLanguage(id, L_SMALLTALK);
break;
case IDM_LANG_VHDL :
setLanguage(id, L_VHDL);
break;
case IDM_LANG_KIX :
setLanguage(id, L_KIX);
break;
case IDM_LANG_CAML :
setLanguage(id, L_CAML);
break;
case IDM_LANG_ADA :
setLanguage(id, L_ADA);
break;
case IDM_LANG_VERILOG :
setLanguage(id, L_VERILOG);
break;
case IDM_LANG_MATLAB :
setLanguage(id, L_MATLAB);
break;
case IDM_LANG_HASKELL :
setLanguage(id, L_HASKELL);
break;
case IDM_LANG_AU3 :
setLanguage(id, L_AU3);
break;
case IDM_LANG_INNO :
setLanguage(id, L_INNO);
break;
case IDM_LANG_CMAKE :
setLanguage(id, L_CMAKE);
break;
case IDM_LANG_YAML :
setLanguage(id, L_YAML);
break;
case IDM_LANG_USER :
setLanguage(id, L_USER);
break;
case IDC_PREV_DOC :
case IDC_NEXT_DOC :
{
int nbDoc = _mainDocTab.isVisible()?_mainEditView.getNbDoc():0;
nbDoc += _subDocTab.isVisible()?_subEditView.getNbDoc():0;
bool doTaskList = ((NppParameters::getInstance())->getNppGUI())._doTaskList;
if (nbDoc > 1)
{
bool direction = (id == IDC_NEXT_DOC)?dirDown:dirUp;
if (!doTaskList)
{
activateNextDoc(direction);
}
else
{
TaskListDlg tld;
HIMAGELIST hImgLst = _docTabIconList.getHandle();
tld.init(_hInst, _hSelf, hImgLst, direction);
tld.doDialog();
}
}
_linkTriggered = true;
}
break;
case IDM_OPEN_ALL_RECENT_FILE :
for (int i = IDM_FILEMENU_LASTONE + 1 ; i < (IDM_FILEMENU_LASTONE + _lastRecentFileList.getMaxNbLRF() + 1) ; i++)
{
char fn[MAX_PATH];
int res = ::GetMenuString(_mainMenuHandle, i, fn, sizeof(fn), MF_BYCOMMAND);
if (res)
{
doOpen(fn);
}
}
break;
case IDM_CLEAN_RECENT_FILE_LIST :
for (int i = IDM_FILEMENU_LASTONE + 1 ; i < (IDM_FILEMENU_LASTONE + _lastRecentFileList.getMaxNbLRF() + 1) ; i++)
{
char fn[MAX_PATH];
int res = ::GetMenuString(_mainMenuHandle, i, fn, sizeof(fn), MF_BYCOMMAND);
if (res)
{
_lastRecentFileList.remove(fn);
}
}
break;
case IDM_EDIT_RTL :
case IDM_EDIT_LTR :
{
long exStyle = ::GetWindowLong(_pEditView->getHSelf(), GWL_EXSTYLE);
exStyle = (id == IDM_EDIT_RTL)?exStyle|WS_EX_LAYOUTRTL:exStyle&(~WS_EX_LAYOUTRTL);
::SetWindowLong(_pEditView->getHSelf(), GWL_EXSTYLE, exStyle);
_pEditView->defineDocType(_pEditView->getCurrentDocType());
_pEditView->redraw();
}
break;
case IDM_WINDOW_WINDOWS :
{
WindowsDlg _windowsDlg;
_windowsDlg.init(_hInst, _hSelf, _pEditView);
TiXmlNode *dlgNode = NULL;
if (_nativeLang)
{
dlgNode = _nativeLang->FirstChild("Dialog");
if (dlgNode)
dlgNode = searchDlgNode(dlgNode, "Window");
}
_windowsDlg.doDialog(dlgNode);
//changeDlgLang(_windowsDlg.getHSelf(), "Window");
}
break;
default :
if (id > IDM_FILE_EXIT && id < (IDM_FILE_EXIT + _lastRecentFileList.getMaxNbLRF() + 1))
{
char fn[MAX_PATH];
int res = ::GetMenuString(_mainMenuHandle, id, fn, sizeof(fn), MF_BYCOMMAND);
if (res)
{
if (doOpen(fn))
{
setLangStatus(_pEditView->getCurrentDocType());
}
}
}
else if ((id > IDM_LANG_USER) && (id < IDM_LANG_USER_LIMIT))
{
char langName[langNameLenMax];
::GetMenuString(_mainMenuHandle, id, langName, sizeof(langName), MF_BYCOMMAND);
_pEditView->setCurrentDocUserType(langName);
setLangStatus(L_USER);
checkLangsMenu(id);
}
else if ((id >= IDM_LANG_EXTERNAL) && (id <= IDM_LANG_EXTERNAL_LIMIT))
{
setLanguage(id, (LangType)(id - IDM_LANG_EXTERNAL + L_EXTERNAL));
}
else if ((id >= ID_MACRO) && (id < ID_MACRO_LIMIT))
{
int i = id - ID_MACRO;
vector<MacroShortcut> & theMacros = pNppParam->getMacroList();
Macro macro = theMacros[i].getMacro();
_pEditView->execute(SCI_BEGINUNDOACTION);
for (Macro::iterator step = macro.begin(); step != macro.end(); step++)
step->PlayBack(this, _pEditView);
_pEditView->execute(SCI_ENDUNDOACTION);
}
else if ((id >= ID_USER_CMD) && (id < ID_USER_CMD_LIMIT))
{
int i = id - ID_USER_CMD;
vector<UserCommand> & theUserCommands = pNppParam->getUserCommandList();
UserCommand ucmd = theUserCommands[i];
Command cmd(ucmd.getCmd());
cmd.run(_hSelf);
}
else if ((id >= ID_PLUGINS_CMD) && (id < ID_PLUGINS_CMD_LIMIT))
{
int i = id - ID_PLUGINS_CMD;
_pluginsManager.runPluginCommand(i);
}
else if ((id >= IDM_WINDOW_MRU_FIRST) && (id <= IDM_WINDOW_MRU_LIMIT))
{
activateDoc(id-IDM_WINDOW_MRU_FIRST);
}
}
if (_recordingMacro)
switch (id)
{
case IDM_FILE_NEW :
case IDM_FILE_CLOSE :
case IDM_FILE_CLOSEALL :
case IDM_FILE_CLOSEALL_BUT_CURRENT :
case IDM_FILE_SAVE :
case IDM_FILE_SAVEALL :
case IDM_EDIT_UNDO:
case IDM_EDIT_REDO:
case IDM_EDIT_CUT:
case IDM_EDIT_COPY:
//case IDM_EDIT_PASTE:
case IDM_EDIT_DELETE:
case IDM_SEARCH_FINDNEXT :
case IDM_SEARCH_FINDPREV :
case IDM_SEARCH_MARKALL :
case IDM_SEARCH_UNMARKALL :
case IDM_SEARCH_GOTOMATCHINGBRACE :
case IDM_SEARCH_TOGGLE_BOOKMARK :
case IDM_SEARCH_NEXT_BOOKMARK:
case IDM_SEARCH_PREV_BOOKMARK:
case IDM_SEARCH_CLEAR_BOOKMARKS:
case IDM_EDIT_SELECTALL:
case IDM_EDIT_INS_TAB:
case IDM_EDIT_RMV_TAB:
case IDM_EDIT_DUP_LINE:
case IDM_EDIT_TRANSPOSE_LINE:
case IDM_EDIT_SPLIT_LINES:
case IDM_EDIT_JOIN_LINES:
case IDM_EDIT_LINE_UP:
case IDM_EDIT_LINE_DOWN:
case IDM_EDIT_UPPERCASE:
case IDM_EDIT_LOWERCASE:
case IDM_EDIT_BLOCK_COMMENT:
case IDM_EDIT_BLOCK_COMMENT_SET:
case IDM_EDIT_BLOCK_UNCOMMENT:
case IDM_EDIT_STREAM_COMMENT:
case IDM_EDIT_TRIMTRAILING:
case IDM_EDIT_SETREADONLY :
case IDM_EDIT_FULLPATHTOCLIP :
case IDM_EDIT_FILENAMETOCLIP :
case IDM_EDIT_CURRENTDIRTOCLIP :
case IDM_EDIT_CLEARREADONLY :
case IDM_EDIT_RTL :
case IDM_EDIT_LTR :
case IDM_VIEW_FULLSCREENTOGGLE :
case IDM_VIEW_ALWAYSONTOP :
case IDM_VIEW_WRAP :
case IDM_VIEW_FOLD_CURRENT :
case IDM_VIEW_UNFOLD_CURRENT :
case IDM_VIEW_TOGGLE_FOLDALL:
case IDM_VIEW_TOGGLE_UNFOLDALL:
case IDM_VIEW_FOLD_1:
case IDM_VIEW_FOLD_2:
case IDM_VIEW_FOLD_3:
case IDM_VIEW_FOLD_4:
case IDM_VIEW_FOLD_5:
case IDM_VIEW_FOLD_6:
case IDM_VIEW_FOLD_7:
case IDM_VIEW_FOLD_8:
case IDM_VIEW_UNFOLD_1:
case IDM_VIEW_UNFOLD_2:
case IDM_VIEW_UNFOLD_3:
case IDM_VIEW_UNFOLD_4:
case IDM_VIEW_UNFOLD_5:
case IDM_VIEW_UNFOLD_6:
case IDM_VIEW_UNFOLD_7:
case IDM_VIEW_UNFOLD_8:
case IDM_VIEW_GOTO_ANOTHER_VIEW:
case IDM_VIEW_SYNSCROLLV:
case IDM_VIEW_SYNSCROLLH:
case IDC_PREV_DOC :
case IDC_NEXT_DOC :
_macro.push_back(recordedMacroStep(id));
break;
}
}
void Notepad_plus::setTitleWith(const char *filePath)
{
if (!filePath || !strcmp(filePath, ""))
return;
const size_t str2concatLen = MAX_PATH + 32;
char str2concat[str2concatLen];
strcat(strcpy(str2concat, filePath), " - ");
strcat(str2concat, _className);
::SetWindowText(_hSelf, str2concat);
}
void Notepad_plus::activateNextDoc(bool direction)
{
int nbDoc = _pEditView->getNbDoc();
if (!nbDoc) return;
int curIndex = _pEditView->getCurrentDocIndex();
curIndex += (direction == dirUp)?-1:1;
if (curIndex >= nbDoc)
{
if (getNonCurrentDocTab()->isVisible())
switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW);
curIndex = 0;
}
else if (curIndex < 0)
{
if (getNonCurrentDocTab()->isVisible())
{
switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW);
nbDoc = _pEditView->getNbDoc();
}
curIndex = nbDoc - 1;
}
char *fullPath = _pDocTab->activate(curIndex);
setTitleWith(fullPath);
//checkDocState();
char dirPath[MAX_PATH];
strcpy(dirPath, fullPath);
PathRemoveFileSpec(dirPath);
setWorkingDir(dirPath);
}
void Notepad_plus::activateDoc(int pos)
{
int nbDoc = _pEditView->getNbDoc();
if (!nbDoc) return;
if (pos == _pEditView->getCurrentDocIndex())
{
(_pEditView->getCurrentBuffer()).increaseRecentTag();
return;
}
if (pos >= 0 && pos < nbDoc)
{
char *fullPath = _pDocTab->activate(pos);
setTitleWith(fullPath);
//checkDocState();
char dirPath[MAX_PATH];
strcpy(dirPath, fullPath);
PathRemoveFileSpec(dirPath);
setWorkingDir(dirPath);
}
}
void Notepad_plus::updateStatusBar()
{
char strLnCol[64];
sprintf(strLnCol, "Ln : %d Col : %d Sel : %d",\
(_pEditView->getCurrentLineNumber() + 1), \
(_pEditView->getCurrentColumnNumber() + 1),\
(_pEditView->getSelectedByteNumber()));
_statusBar.setText(strLnCol, STATUSBAR_CUR_POS);
char strDonLen[64];
sprintf(strDonLen, "nb char : %d", _pEditView->getCurrentDocLen());
_statusBar.setText(strDonLen, STATUSBAR_DOC_SIZE);
setDisplayFormat((_pEditView->getCurrentBuffer()).getFormat());
setUniModeText(_pEditView->getCurrentBuffer().getUnicodeMode());
_statusBar.setText(_pEditView->execute(SCI_GETOVERTYPE) ? "OVR" : "INS", STATUSBAR_TYPING_MODE);
}
void Notepad_plus::dropFiles(HDROP hdrop)
{
if (hdrop)
{
// Determinate in which view the file(s) is (are) dropped
POINT p;
::DragQueryPoint(hdrop, &p);
//HWND hWin = ::ChildWindowFromPoint(_hSelf, p);
HWND hWin = ::RealChildWindowFromPoint(_hSelf, p);
if (!hWin) return;
if ((_mainEditView.getHSelf() == hWin) || (_mainDocTab.getHSelf() == hWin))
switchEditViewTo(MAIN_VIEW);
else if ((_subEditView.getHSelf() == hWin) || (_subDocTab.getHSelf() == hWin))
switchEditViewTo(SUB_VIEW);
else
{
::SendMessage(hWin, WM_DROPFILES, (WPARAM)hdrop, 0);
return;
}
int filesDropped = ::DragQueryFile(hdrop, 0xffffffff, NULL, 0);
for (int i = 0 ; i < filesDropped ; ++i)
{
char pathDropped[MAX_PATH];
::DragQueryFile(hdrop, i, pathDropped, sizeof(pathDropped));
doOpen(pathDropped);
//setLangStatus(_pEditView->getCurrentDocType());
}
::DragFinish(hdrop);
// Put Notepad_plus to forefront
// May not work for Win2k, but OK for lower versions
// Note: how to drop a file to an iconic window?
// Actually, it is the Send To command that generates a drop.
if (::IsIconic(_hSelf))
{
::ShowWindow(_hSelf, SW_RESTORE);
}
::SetForegroundWindow(_hSelf);
}
}
void Notepad_plus::checkModifiedDocument()
{
const int NB_VIEW = 2;
struct ViewInfo {
int id;
ScintillaEditView * sv;
DocTabView * dtv;
int currentIndex;
bool toBeActivated;
};
ViewInfo viewInfoArray[NB_VIEW];
// the oder (1.current view 2.non current view) is important
// to synchronize with "hideCurrentView" function
viewInfoArray[0].id = getCurrentView();
viewInfoArray[0].sv = _pEditView;
viewInfoArray[0].dtv = _pDocTab;
viewInfoArray[0].currentIndex = _pEditView->getCurrentDocIndex();
viewInfoArray[0].toBeActivated = false;
viewInfoArray[1].id = getNonCurrentView();
viewInfoArray[1].sv = getNonCurrentEditView();
viewInfoArray[1].dtv = getNonCurrentDocTab();
viewInfoArray[1].currentIndex = viewInfoArray[1].sv->getCurrentDocIndex();
viewInfoArray[1].toBeActivated = false;
NppParameters *pNppParam = NppParameters::getInstance();
const NppGUI & nppGUI = pNppParam->getNppGUI();
bool autoUpdate = (nppGUI._fileAutoDetection == cdAutoUpdate) || (nppGUI._fileAutoDetection == cdAutoUpdateGo2end);
_subEditView.getCurrentDocIndex();
for (int j = 0 ; j < NB_VIEW ; j++)
{
ViewInfo & vi = viewInfoArray[j];
if (vi.sv->isVisible())
{
for (int i = ((vi.sv)->getNbDoc()-1) ; i >= 0 ; i--)
{
Buffer & docBuf = vi.sv->getBufferAt(i);
docFileStaus fStatus = docBuf.checkFileState();
bool update = !docBuf.isDirty() && autoUpdate;
if (fStatus == MODIFIED_FROM_OUTSIDE)
{
// If npp is minimized, bring it up to the top
if (::IsIconic(_hSelf))
::ShowWindow(_hSelf, SW_SHOWNORMAL);
if (update)
{
docBuf._reloadOnSwitchBack = true;
// for 2 views, if it's current doc, then reload immediately
if (vi.currentIndex == i)
{
vi.toBeActivated = true;
if (j == 0) // 0 == current view
{
_activeAppInf._isActivated = false;
}
}
}
else if (doReloadOrNot(docBuf.getFileName()) == IDYES)
{
docBuf._reloadOnSwitchBack = true;
setTitleWith(vi.dtv->activate(i));
// if it's a non current view, make it as the current view
if (j == 1)
switchEditViewTo(getNonCurrentView());
}
if (_activeAppInf._isActivated)
{
int curPos = _pEditView->execute(SCI_GETCURRENTPOS);
::PostMessage(_pEditView->getHSelf(), WM_LBUTTONUP, 0, 0);
::PostMessage(_pEditView->getHSelf(), SCI_SETSEL, curPos, curPos);
_activeAppInf._isActivated = false;
}
docBuf.updatTimeStamp();
}
else if (fStatus == FILE_DELETED && !docBuf._dontBotherMeAnymore)
{
if (::IsIconic(_hSelf))
::ShowWindow(_hSelf, SW_SHOWNORMAL);
if (doCloseOrNot(docBuf.getFileName()) == IDNO)
{
vi.dtv->activate(i);
if ((vi.sv->getNbDoc() == 1) && (_mainWindowStatus & TWO_VIEWS_MASK))
{
setTitleWith(vi.dtv->closeCurrentDoc());
hideCurrentView();
}
else
setTitleWith(vi.dtv->closeCurrentDoc());
}
else
docBuf._dontBotherMeAnymore = true;
if (_activeAppInf._isActivated)
{
int curPos = _pEditView->execute(SCI_GETCURRENTPOS);
::PostMessage(_pEditView->getHSelf(), WM_LBUTTONUP, 0, 0);
::PostMessage(_pEditView->getHSelf(), SCI_SETSEL, curPos, curPos);
_activeAppInf._isActivated = false;
}
}
bool isReadOnly = vi.sv->isCurrentBufReadOnly();
vi.sv->execute(SCI_SETREADONLY, isReadOnly);
}
}
}
if (autoUpdate)
{
if (viewInfoArray[0].toBeActivated)
{
switchEditViewTo(viewInfoArray[0].id);
}
if (viewInfoArray[1].toBeActivated)
{
switchEditViewTo(viewInfoArray[1].id);
switchEditViewTo(viewInfoArray[0].id);
}
}
}
void Notepad_plus::reloadOnSwitchBack()
{
Buffer & buf = _pEditView->getCurrentBuffer();
if (buf._reloadOnSwitchBack)
{
if (_pEditView->isCurrentBufReadOnly())
_pEditView->execute(SCI_SETREADONLY, FALSE);
reload(buf.getFileName());
NppParameters *pNppParam = NppParameters::getInstance();
const NppGUI & nppGUI = pNppParam->getNppGUI();
if (nppGUI._fileAutoDetection == cdAutoUpdateGo2end || nppGUI._fileAutoDetection == cdGo2end)
{
int line = _pEditView->getNbLine();
_pEditView->gotoLine(line);
}
if (_pEditView->isCurrentBufReadOnly())
_pEditView->execute(SCI_SETREADONLY, TRUE);
buf._reloadOnSwitchBack = false;
}
}
void Notepad_plus::hideCurrentView()
{
if (_mainWindowStatus & DOCK_MASK)
{
_pMainSplitter->setWin0(getNonCurrentDocTab());
}
else // otherwise the main window is the spltter container that we just created
_pMainWindow = getNonCurrentDocTab();
_subSplitter.display(false);
_pEditView->display(false);
_pDocTab->display(false);
// resize the main window
::SendMessage(_hSelf, WM_SIZE, 0, 0);
switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW);
//setTitleWith(_pEditView->getCurrentTitle());
_mainWindowStatus &= ~TWO_VIEWS_MASK;
}
bool Notepad_plus::fileClose()
{
// Notify plugins that current file is about to be closed
SCNotification scnN;
scnN.nmhdr.code = NPPN_FILEBEFORECLOSE;
scnN.nmhdr.hwndFrom = _hSelf;
scnN.nmhdr.idFrom = 0;
_pluginsManager.notify(&scnN);
int res;
bool isDirty = _pEditView->isCurrentDocDirty();
//process the fileNamePath into LRF
const char *fileNamePath = _pEditView->getCurrentTitle();
if ((!isDirty) && (Buffer::isUntitled(fileNamePath)) && (_pEditView->getNbDoc() == 1) && (!getNonCurrentDocTab()->isVisible()))
return true;
if (isDirty)
{
if ((res = doSaveOrNot(_pEditView->getCurrentTitle())) == IDYES)
{
if (!fileSave()) // the cancel button of savdialog is pressed
return false;
}
else if (res == IDCANCEL)
return false;
// else IDNO we continue
}
//si ce n'est pas untited(avec prefixe "new "), on fait le traitement
if (!Buffer::isUntitled(fileNamePath))
{
_lastRecentFileList.add(fileNamePath);
}
if ((_pEditView->getNbDoc() == 1) && (_mainWindowStatus & TWO_VIEWS_MASK))
{
_pDocTab->closeCurrentDoc();
hideCurrentView();
scnN.nmhdr.code = NPPN_FILECLOSED;
_pluginsManager.notify(&scnN);
return true;
}
char fullPath[MAX_PATH];
strcpy(fullPath, _pDocTab->closeCurrentDoc());
setTitleWith(fullPath);
PathRemoveFileSpec(fullPath);
setWorkingDir(fullPath);
//updateStatusBar();
//dynamicCheckMenuAndTB();
//setLangStatus(_pEditView->getCurrentDocType());
//checkDocState();
_linkTriggered = true;
::SendMessage(_hSelf, NPPM_INTERNAL_DOCSWITCHIN, 0, 0);
// Notify plugins that current file is closed
scnN.nmhdr.code = NPPN_FILECLOSED;
_pluginsManager.notify(&scnN);
return true;
}
bool Notepad_plus::fileCloseAll()
{
if (_mainWindowStatus & TWO_VIEWS_MASK)
{
while (_pEditView->getNbDoc() > 1)
if (!fileClose())
return false;
if (!fileClose())
return false;
}
while (_pEditView->getNbDoc() > 1)
if (!fileClose())
return false;
return fileClose();
}
bool Notepad_plus::fileCloseAllButCurrent()
{
int curIndex = _pEditView->getCurrentDocIndex();
_pEditView->activateDocAt(0);
for (int i = 0 ; i < curIndex ; i++)
if (!fileClose())
{
curIndex -= i;
_pDocTab->activate(curIndex);
return false;
}
if (_pEditView->getNbDoc() > 1)
{
_pDocTab->activate(1);
while (_pEditView->getNbDoc() > 1)
if (!fileClose())
return false;
}
if (_mainWindowStatus & TWO_VIEWS_MASK)
{
switchEditViewTo(getNonCurrentView());
while (_pEditView->getNbDoc() > 1)
if (!fileClose())
return false;
return fileClose();
}
return true;
}
void Notepad_plus::reload(const char *fileName)
{
Utf8_16_Read UnicodeConvertor;
Buffer & buffer = _pEditView->getCurrentBuffer();
FILE *fp = fopen(fileName, "rb");
if (fp)
{
// It's VERY IMPORTANT to reset the view
_pEditView->execute(SCI_CLEARALL);
char data[blockSize];
size_t lenFile = fread(data, 1, sizeof(data), fp);
while (lenFile > 0) {
lenFile = UnicodeConvertor.convert(data, lenFile);
_pEditView->execute(SCI_ADDTEXT, lenFile, reinterpret_cast<LPARAM>(UnicodeConvertor.getNewBuf()));
lenFile = int(fread(data, 1, sizeof(data), fp));
}
fclose(fp);
UniMode unicodeMode = static_cast<UniMode>(UnicodeConvertor.getEncoding());
buffer.setUnicodeMode(unicodeMode);
if (unicodeMode != uni8Bit)
// Override the code page if Unicode
_pEditView->execute(SCI_SETCODEPAGE, SC_CP_UTF8);
_pEditView->getFocus();
_pEditView->execute(SCI_SETSAVEPOINT);
_pEditView->execute(EM_EMPTYUNDOBUFFER);
_pEditView->restoreCurrentPos();
}
else
{
char msg[MAX_PATH + 100];
strcpy(msg, "Can not open file \"");
strcat(msg, fileName);
strcat(msg, "\".");
::MessageBox(_hSelf, msg, "ERR", MB_OK);
}
}
void Notepad_plus::getMainClientRect(RECT &rc) const
{
getClientRect(rc);
rc.top += _rebarTop.getHeight();
rc.bottom -= rc.top + _rebarBottom.getHeight() + _statusBar.getHeight();
}
void Notepad_plus::dockUserDlg()
{
if (!_pMainSplitter)
{
_pMainSplitter = new SplitterContainer;
_pMainSplitter->init(_hInst, _hSelf);
Window *pWindow;
if (_mainWindowStatus & TWO_VIEWS_MASK)
pWindow = &_subSplitter;
else
pWindow = _pDocTab;
_pMainSplitter->create(pWindow, ScintillaEditView::getUserDefineDlg(), 8, RIGHT_FIX, 45);
}
if (_mainWindowStatus & TWO_VIEWS_MASK)
_pMainSplitter->setWin0(&_subSplitter);
else
_pMainSplitter->setWin0(_pDocTab);
_pMainSplitter->display();
_mainWindowStatus |= DOCK_MASK;
_pMainWindow = _pMainSplitter;
::SendMessage(_hSelf, WM_SIZE, 0, 0);
}
void Notepad_plus::undockUserDlg()
{
// a cause de surchargement de "display"
::ShowWindow(_pMainSplitter->getHSelf(), SW_HIDE);
if (_mainWindowStatus & TWO_VIEWS_MASK)
_pMainWindow = &_subSplitter;
else
_pMainWindow = _pDocTab;
::SendMessage(_hSelf, WM_SIZE, 0, 0);
_mainWindowStatus &= ~DOCK_MASK;
(ScintillaEditView::getUserDefineDlg())->display();
//(_pEditView->getUserDefineDlg())->display();
}
void Notepad_plus::docGotoAnotherEditView(bool mode)
{
if (!(_mainWindowStatus & TWO_VIEWS_MASK))
{
// if there's dock dialog, it means there's also a splitter container
// we replace the right window by sub-spltter container that we just created
if (_mainWindowStatus & DOCK_MASK)
{
_pMainSplitter->setWin0(&_subSplitter);
_pMainWindow = _pMainSplitter;
}
else // otherwise the main window is the spltter container that we just created
_pMainWindow = &_subSplitter;
// resize the main window
::SendMessage(_hSelf, WM_SIZE, 0, 0);
getNonCurrentEditView()->display();
getNonCurrentDocTab()->display();
_pMainWindow->display();
// update the main window status
_mainWindowStatus |= TWO_VIEWS_MASK;
}
// Bon, define the source view and the dest view
// source view
DocTabView *pSrcDocTab;
ScintillaEditView *pSrcEditView;
if (getCurrentView() == MAIN_VIEW)
{
// make dest view
switchEditViewTo(SUB_VIEW);
// make source view
pSrcDocTab = &_mainDocTab;
pSrcEditView = &_mainEditView;
}
else
{
// make dest view : _pDocTab & _pEditView
switchEditViewTo(MAIN_VIEW);
// make source view
pSrcDocTab = &_subDocTab;
pSrcEditView = &_subEditView;
}
// Maintenant, we begin to manipulate the source and the dest:
// 1. Save the current position of the source view to transfer
pSrcEditView->saveCurrentPos();
// 2. Retrieve the current buffer from the source
Buffer & buf = pSrcEditView->getCurrentBuffer();
// 3. See if the file to transfer exist in the dest view
// if so, we don't transfer the file(buffer)
// but activate the opened document in the dest view then beat it
int i;
if ( (i = _pDocTab->find(buf.getFileName())) != -1)
{
setTitleWith(_pDocTab->activate(i));
_pDocTab->getFocus();
return;
}
// 4. Transfer the file (buffer) into the dest view
bool isNewDoc2Close = false;
if ((_pEditView->getNbDoc() == 1)
&& Buffer::isUntitled(_pEditView->getCurrentTitle())
&& (!_pEditView->isCurrentDocDirty()) && (_pEditView->getCurrentDocLen() == 0))
{
isNewDoc2Close = true;
}
setTitleWith(_pDocTab->newDoc(buf));
_pDocTab->updateCurrentTabItem(NULL);
if (isNewDoc2Close)
_pDocTab->closeDocAt(0);
// 5. If it's the clone mode, we keep the document to transfer
// in the source view (do nothing). If it's the transfer mode
// we remove the file (buffer) from the source view
if (mode != MODE_CLONE)
{
// Make focus to the source view
switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW);
if (_pEditView->getNbDoc() == 1)
{
// close the current doc in the dest view
_pDocTab->closeCurrentDoc();
hideCurrentView();
}
else
{
// close the current doc in the dest view
_pDocTab->closeCurrentDoc();
// return to state where the focus is on dest view
switchEditViewTo((getCurrentView() == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW);
}
}
//printInt(getCurrentView());
_linkTriggered = true;
}
void Notepad_plus::bookmarkNext(bool forwardScan)
{
int lineno = _pEditView->getCurrentLineNumber();
int sci_marker = SCI_MARKERNEXT;
int lineStart = lineno + 1; //Scan starting from next line
int lineRetry = 0; //If not found, try from the beginning
if (!forwardScan)
{
lineStart = lineno - 1; //Scan starting from previous line
lineRetry = int(_pEditView->execute(SCI_GETLINECOUNT)); //If not found, try from the end
sci_marker = SCI_MARKERPREVIOUS;
}
int nextLine = int(_pEditView->execute(sci_marker, lineStart, 1 << MARK_BOOKMARK));
if (nextLine < 0)
nextLine = int(_pEditView->execute(sci_marker, lineRetry, 1 << MARK_BOOKMARK));
if (nextLine < 0)
return;
_pEditView->execute(SCI_ENSUREVISIBLEENFORCEPOLICY, nextLine);
_pEditView->execute(SCI_GOTOLINE, nextLine);
}
int Notepad_plus::switchEditViewTo(int gid)
{
int oldView = getCurrentView();
_pDocTab = (gid == MAIN_VIEW)?&_mainDocTab:&_subDocTab;
_pEditView = (gid == MAIN_VIEW)?&_mainEditView:&_subEditView;
_pEditView->beSwitched();
_pEditView->getFocus();
//checkDocState();
setTitleWith(_pEditView->getCurrentTitle());
::InvalidateRect(_mainDocTab.getHSelf(), NULL, TRUE);
::InvalidateRect(_subDocTab.getHSelf(), NULL, TRUE);
::SendMessage(_hSelf, NPPM_INTERNAL_DOCSWITCHIN, 0, 0);
return oldView;
}
void Notepad_plus::dynamicCheckMenuAndTB() const
{
// Visibility of 3 margins
checkMenuItem(IDM_VIEW_LINENUMBER, _pEditView->hasMarginShowed(ScintillaEditView::_SC_MARGE_LINENUMBER));
checkMenuItem(IDM_VIEW_SYMBOLMARGIN, _pEditView->hasMarginShowed(ScintillaEditView::_SC_MARGE_SYBOLE));
checkMenuItem(IDM_VIEW_FOLDERMAGIN, _pEditView->hasMarginShowed(ScintillaEditView::_SC_MARGE_FOLDER));
// Folder margin style
checkFolderMarginStyleMenu(getFolderMaginStyleIDFrom(_pEditView->getFolderStyle()));
// Visibility of invisible characters
bool wsTabShow = _pEditView->isInvisibleCharsShown();
bool eolShow = _pEditView->isEolVisible();
bool onlyWS = false;
bool onlyEOL = false;
bool bothWSEOL = false;
if (wsTabShow)
{
if (eolShow)
{
bothWSEOL = true;
}
else
{
onlyWS = true;
}
}
else if (eolShow)
{
onlyEOL = true;
}
checkMenuItem(IDM_VIEW_TAB_SPACE, onlyWS);
checkMenuItem(IDM_VIEW_EOL, onlyEOL);
checkMenuItem(IDM_VIEW_ALL_CHARACTERS, bothWSEOL);
_toolBar.setCheck(IDM_VIEW_ALL_CHARACTERS, bothWSEOL);
// Visibility of the indentation guide line
bool b = _pEditView->isShownIndentGuide();
checkMenuItem(IDM_VIEW_INDENT_GUIDE, b);
_toolBar.setCheck(IDM_VIEW_INDENT_GUIDE, b);
// Edge Line
int mode = int(_pEditView->execute(SCI_GETEDGEMODE));
checkMenuItem(IDM_VIEW_EDGEBACKGROUND, (MF_BYCOMMAND | ((mode == EDGE_NONE)||(mode == EDGE_LINE))?MF_UNCHECKED:MF_CHECKED) != 0);
checkMenuItem(IDM_VIEW_EDGELINE, (MF_BYCOMMAND | ((mode == EDGE_NONE)||(mode == EDGE_BACKGROUND))?MF_UNCHECKED:MF_CHECKED) != 0);
// Current Line Highlighting
checkMenuItem(IDM_VIEW_CURLINE_HILITING, _pEditView->isCurrentLineHiLiting());
// Wrap
b = _pEditView->isWrap();
checkMenuItem(IDM_VIEW_WRAP, b);
_toolBar.setCheck(IDM_VIEW_WRAP, b);
checkMenuItem(IDM_VIEW_WRAP_SYMBOL, _pEditView->isWrapSymbolVisible());
//Format conversion
enableConvertMenuItems((_pEditView->getCurrentBuffer()).getFormat());
checkUnicodeMenuItems((_pEditView->getCurrentBuffer()).getUnicodeMode());
//Syncronized scrolling
}
void Notepad_plus::checkUnicodeMenuItems(UniMode um) const
{
int id = -1;
switch (um)
{
case uniUTF8 : id = IDM_FORMAT_UTF_8; break;
case uni16BE : id = IDM_FORMAT_UCS_2BE; break;
case uni16LE : id = IDM_FORMAT_UCS_2LE; break;
case uniCookie : id = IDM_FORMAT_AS_UTF_8; break;
default :
id = IDM_FORMAT_ANSI;
}
::CheckMenuRadioItem(_mainMenuHandle, IDM_FORMAT_ANSI, IDM_FORMAT_AS_UTF_8, id, MF_BYCOMMAND);
}
static bool isInList(string word, const vector<string> & wordArray)
{
for (size_t i = 0 ; i < wordArray.size() ; i++)
if (wordArray[i] == word)
return true;
return false;
};
void Notepad_plus::autoCompFromCurrentFile(bool autoInsert)
{
int curPos = int(_pEditView->execute(SCI_GETCURRENTPOS));
int startPos = int(_pEditView->execute(SCI_WORDSTARTPOSITION, curPos, true));
if (curPos == startPos)
return;
const size_t bufSize = 256;
size_t len = (curPos > startPos)?(curPos - startPos):(startPos - curPos);
if (len >= bufSize)
return;
char beginChars[bufSize];
_pEditView->getText(beginChars, startPos, curPos);
string expr("\\<");
expr += beginChars;
expr += "[^ \\t.,;:\"()=<>'+!\\[\\]]*";
//::MessageBox(NULL, expr.c_str(), "", MB_OK);
int docLength = int(_pEditView->execute(SCI_GETLENGTH));
int flags = SCFIND_WORDSTART | SCFIND_MATCHCASE | SCFIND_REGEXP | SCFIND_POSIX;
_pEditView->execute(SCI_SETTARGETSTART, 0);
_pEditView->execute(SCI_SETTARGETEND, docLength);
_pEditView->execute(SCI_SETSEARCHFLAGS, flags);
vector<string> wordArray;
int posFind = int(_pEditView->execute(SCI_SEARCHINTARGET, expr.length(), (LPARAM)expr.c_str()));
while (posFind != -1)
{
int wordStart = int(_pEditView->execute(SCI_GETTARGETSTART));
int wordEnd = int(_pEditView->execute(SCI_GETTARGETEND));
size_t foundTextLen = wordEnd - wordStart;
if (foundTextLen < bufSize)
{
char w[bufSize];
_pEditView->getText(w, wordStart, wordEnd);
if (strcmp(w, beginChars))
if (!isInList(w, wordArray))
wordArray.push_back(w);
}
_pEditView->execute(SCI_SETTARGETSTART, wordEnd/*posFind + foundTextLen*/);
_pEditView->execute(SCI_SETTARGETEND, docLength);
posFind = int(_pEditView->execute(SCI_SEARCHINTARGET, expr.length(), (LPARAM)expr.c_str()));
}
if (wordArray.size() == 0) return;
if (wordArray.size() == 1 && autoInsert)
{
_pEditView->execute(SCI_SETTARGETSTART, startPos);
_pEditView->execute(SCI_SETTARGETEND, curPos);
_pEditView->execute(SCI_REPLACETARGETRE, wordArray[0].length(), (LPARAM)wordArray[0].c_str());
_pEditView->execute(SCI_GOTOPOS, startPos + wordArray[0].length());
return;
}
sort(wordArray.begin(), wordArray.end());
string words("");
for (size_t i = 0 ; i < wordArray.size() ; i++)
{
words += wordArray[i];
if (i != wordArray.size()-1)
words += " ";
}
_pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM(' '));
_pEditView->execute(SCI_AUTOCSETIGNORECASE, 3);
_pEditView->execute(SCI_AUTOCSHOW, curPos - startPos, WPARAM(words.c_str()));
}
void Notepad_plus::showAutoComp()
{
int curPos = int(_pEditView->execute(SCI_GETCURRENTPOS));
int line = _pEditView->getCurrentLineNumber();
int debutLinePos = int(_pEditView->execute(SCI_POSITIONFROMLINE, line ));
int debutMotPos = curPos;
char c = char(_pEditView->execute(SCI_GETCHARAT, debutMotPos-1));
while ((debutMotPos>0)&&(debutMotPos>=debutLinePos)&&((isalnum(c))||(c=='_')))
{
debutMotPos--;
c = char(_pEditView->execute(SCI_GETCHARAT, debutMotPos-1));
}
LangType langType = _pEditView->getCurrentDocType();
if ((langType == L_RC) || (langType == L_HTML) || (langType == L_SQL))
{
int typeIndex = LANG_INDEX_INSTR;
const char *pKeywords = (NppParameters::getInstance())->getWordList(langType, typeIndex);
if (pKeywords)
{
_pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM(' '));
_pEditView->execute(SCI_AUTOCSETIGNORECASE, 3);
_pEditView->execute(SCI_AUTOCSHOW, curPos-debutMotPos, WPARAM(pKeywords));
}
}
else
{
char nppPath[MAX_PATH];
strcpy(nppPath, _nppPath);
PathRemoveFileSpec(nppPath);
string fullFileName = nppPath;
string fileName;
getApiFileName(langType, fileName);
fileName += ".api";
fullFileName += "\\plugins\\APIs\\";
fullFileName += fileName;
FILE* f = fopen( fullFileName.c_str(), "r" );
if (f)
{
fseek( f, 0, SEEK_END );
size_t sz = ftell( f );
fseek( f, 0, SEEK_SET );
char* pData = new char[sz+1];
size_t nbChar = fread(pData, 1, sz, f);
pData[nbChar] = '\0';
fclose( f );
_pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM('\n'));
_pEditView->execute(SCI_AUTOCSETIGNORECASE, 3);
_pEditView->execute(SCI_AUTOCSHOW, curPos-debutMotPos, WPARAM(pData));
delete[] pData;
}
}
}
void Notepad_plus::changeMenuLang(string & pluginsTrans, string & windowTrans)
{
if (!_nativeLang) return;
TiXmlNode *mainMenu = _nativeLang->FirstChild("Menu");
if (!mainMenu) return;
mainMenu = mainMenu->FirstChild("Main");
if (!mainMenu) return;
TiXmlNode *entriesRoot = mainMenu->FirstChild("Entries");
if (!entriesRoot) return;
const char *idName = NULL;
for (TiXmlNode *childNode = entriesRoot->FirstChildElement("Item");
childNode ;
childNode = childNode->NextSibling("Item") )
{
TiXmlElement *element = childNode->ToElement();
int id;
if (element->Attribute("id", &id))
{
const char *name = element->Attribute("name");
::ModifyMenu(_mainMenuHandle, id, MF_BYPOSITION, 0, name);
}
else if (idName = element->Attribute("idName"))
{
const char *name = element->Attribute("name");
if (!strcmp(idName, "Plugins"))
{
pluginsTrans = name;
}
else if (!strcmp(idName, "Window"))
{
windowTrans = name;
}
}
}
TiXmlNode *menuCommandsRoot = mainMenu->FirstChild("Commands");
for (TiXmlNode *childNode = menuCommandsRoot->FirstChildElement("Item");
childNode ;
childNode = childNode->NextSibling("Item") )
{
TiXmlElement *element = childNode->ToElement();
int id;
element->Attribute("id", &id);
const char *name = element->Attribute("name");
::ModifyMenu(_mainMenuHandle, id, MF_BYCOMMAND, id, name);
}
TiXmlNode *subEntriesRoot = mainMenu->FirstChild("SubEntries");
for (TiXmlNode *childNode = subEntriesRoot->FirstChildElement("Item");
childNode ;
childNode = childNode->NextSibling("Item") )
{
TiXmlElement *element = childNode->ToElement();
int x, y;
element->Attribute("posX", &x);
element->Attribute("posY", &y);
const char *name = element->Attribute("name");
::ModifyMenu(::GetSubMenu(_mainMenuHandle, x), y, MF_BYPOSITION, 0, name);
}
::DrawMenuBar(_hSelf);
}
void Notepad_plus::changeConfigLang()
{
if (!_nativeLang) return;
TiXmlNode *styleConfDlgNode = _nativeLang->FirstChild("Dialog");
if (!styleConfDlgNode) return;
styleConfDlgNode = styleConfDlgNode->FirstChild("StyleConfig");
if (!styleConfDlgNode) return;
HWND hDlg = _configStyleDlg.getHSelf();
// Set Title
const char *titre = (styleConfDlgNode->ToElement())->Attribute("title");
if ((titre && titre[0]) && hDlg)
::SetWindowText(hDlg, titre);
for (TiXmlNode *childNode = styleConfDlgNode->FirstChildElement("Item");
childNode ;
childNode = childNode->NextSibling("Item") )
{
TiXmlElement *element = childNode->ToElement();
int id;
const char *sentinel = element->Attribute("id", &id);
const char *name = element->Attribute("name");
if (sentinel && (name && name[0]))
{
HWND hItem = ::GetDlgItem(hDlg, id);
if (hItem)
::SetWindowText(hItem, name);
}
}
hDlg = _configStyleDlg.getHSelf();
styleConfDlgNode = styleConfDlgNode->FirstChild("SubDialog");
for (TiXmlNode *childNode = styleConfDlgNode->FirstChildElement("Item");
childNode ;
childNode = childNode->NextSibling("Item") )
{
TiXmlElement *element = childNode->ToElement();
int id;
const char *sentinel = element->Attribute("id", &id);
const char *name = element->Attribute("name");
if (sentinel && (name && name[0]))
{
HWND hItem = ::GetDlgItem(hDlg, id);
if (hItem)
::SetWindowText(hItem, name);
}
}
}
void Notepad_plus::changeStyleCtrlsLang(HWND hDlg, int *idArray, const char **translatedText)
{
const int iColorStyle = 0;
const int iUnderline = 8;
HWND hItem;
for (int i = iColorStyle ; i < (iUnderline + 1) ; i++)
{
if (translatedText[i] && translatedText[i][0])
{
hItem = ::GetDlgItem(hDlg, idArray[i]);
if (hItem)
::SetWindowText(hItem, translatedText[i]);
}
}
}
void Notepad_plus::changeUserDefineLang()
{
if (!_nativeLang) return;
TiXmlNode *userDefineDlgNode = _nativeLang->FirstChild("Dialog");
if (!userDefineDlgNode) return;
userDefineDlgNode = userDefineDlgNode->FirstChild("UserDefine");
if (!userDefineDlgNode) return;
UserDefineDialog *userDefineDlg = _pEditView->getUserDefineDlg();
HWND hDlg = userDefineDlg->getHSelf();
// Set Title
const char *titre = (userDefineDlgNode->ToElement())->Attribute("title");
if (titre && titre[0])
::SetWindowText(hDlg, titre);
// pour ses propres controls
const int nbControl = 9;
const char *translatedText[nbControl];
for (int i = 0 ; i < nbControl ; i++)
translatedText[i] = NULL;
for (TiXmlNode *childNode = userDefineDlgNode->FirstChildElement("Item");
childNode ;
childNode = childNode->NextSibling("Item") )
{
TiXmlElement *element = childNode->ToElement();
int id;
const char *sentinel = element->Attribute("id", &id);
const char *name = element->Attribute("name");
if (sentinel && (name && name[0]))
{
if (id > 30)
{
HWND hItem = ::GetDlgItem(hDlg, id);
if (hItem)
::SetWindowText(hItem, name);
}
else
{
switch(id)
{
case 0: case 1: case 2: case 3: case 4:
case 5: case 6: case 7: case 8:
translatedText[id] = name; break;
}
}
}
}
const int nbDlg = 4;
HWND hDlgArrary[nbDlg];
hDlgArrary[0] = userDefineDlg->getFolderHandle();
hDlgArrary[1] = userDefineDlg->getKeywordsHandle();
hDlgArrary[2] = userDefineDlg->getCommentHandle();
hDlgArrary[3] = userDefineDlg->getSymbolHandle();
const int nbGrpFolder = 3;
int folderID[nbGrpFolder][nbControl] = {\
{IDC_DEFAULT_COLORSTYLEGROUP_STATIC, IDC_DEFAULT_FG_STATIC, IDC_DEFAULT_BG_STATIC, IDC_DEFAULT_FONTSTYLEGROUP_STATIC, IDC_DEFAULT_FONTNAME_STATIC, IDC_DEFAULT_FONTSIZE_STATIC, IDC_DEFAULT_BOLD_CHECK, IDC_DEFAULT_ITALIC_CHECK, IDC_DEFAULT_UNDERLINE_CHECK},\
{IDC_FOLDEROPEN_COLORSTYLEGROUP_STATIC, IDC_FOLDEROPEN_FG_STATIC, IDC_FOLDEROPEN_BG_STATIC, IDC_FOLDEROPEN_FONTSTYLEGROUP_STATIC, IDC_FOLDEROPEN_FONTNAME_STATIC, IDC_FOLDEROPEN_FONTSIZE_STATIC, IDC_FOLDEROPEN_BOLD_CHECK, IDC_FOLDEROPEN_ITALIC_CHECK, IDC_FOLDEROPEN_UNDERLINE_CHECK},\
{IDC_FOLDERCLOSE_COLORSTYLEGROUP_STATIC, IDC_FOLDERCLOSE_FG_STATIC, IDC_FOLDERCLOSE_BG_STATIC, IDC_FOLDERCLOSE_FONTSTYLEGROUP_STATIC, IDC_FOLDERCLOSE_FONTNAME_STATIC, IDC_FOLDERCLOSE_FONTSIZE_STATIC, IDC_FOLDERCLOSE_BOLD_CHECK, IDC_FOLDERCLOSE_ITALIC_CHECK, IDC_FOLDERCLOSE_UNDERLINE_CHECK}\
};
const int nbGrpKeywords = 4;
int keywordsID[nbGrpKeywords][nbControl] = {\
{IDC_KEYWORD1_COLORSTYLEGROUP_STATIC, IDC_KEYWORD1_FG_STATIC, IDC_KEYWORD1_BG_STATIC, IDC_KEYWORD1_FONTSTYLEGROUP_STATIC, IDC_KEYWORD1_FONTNAME_STATIC, IDC_KEYWORD1_FONTSIZE_STATIC, IDC_KEYWORD1_BOLD_CHECK, IDC_KEYWORD1_ITALIC_CHECK, IDC_KEYWORD1_UNDERLINE_CHECK},\
{IDC_KEYWORD2_COLORSTYLEGROUP_STATIC, IDC_KEYWORD2_FG_STATIC, IDC_KEYWORD2_BG_STATIC, IDC_KEYWORD2_FONTSTYLEGROUP_STATIC, IDC_KEYWORD2_FONTNAME_STATIC, IDC_KEYWORD2_FONTSIZE_STATIC, IDC_KEYWORD2_BOLD_CHECK, IDC_KEYWORD2_ITALIC_CHECK, IDC_KEYWORD2_UNDERLINE_CHECK},\
{IDC_KEYWORD3_COLORSTYLEGROUP_STATIC, IDC_KEYWORD3_FG_STATIC, IDC_KEYWORD3_BG_STATIC, IDC_KEYWORD3_FONTSTYLEGROUP_STATIC, IDC_KEYWORD3_FONTNAME_STATIC, IDC_KEYWORD3_FONTSIZE_STATIC, IDC_KEYWORD3_BOLD_CHECK, IDC_KEYWORD3_ITALIC_CHECK, IDC_KEYWORD3_UNDERLINE_CHECK},\
{IDC_KEYWORD4_COLORSTYLEGROUP_STATIC, IDC_KEYWORD4_FG_STATIC, IDC_KEYWORD4_BG_STATIC, IDC_KEYWORD4_FONTSTYLEGROUP_STATIC, IDC_KEYWORD4_FONTNAME_STATIC, IDC_KEYWORD4_FONTSIZE_STATIC, IDC_KEYWORD4_BOLD_CHECK, IDC_KEYWORD4_ITALIC_CHECK, IDC_KEYWORD4_UNDERLINE_CHECK}\
};
const int nbGrpComment = 3;
int commentID[nbGrpComment][nbControl] = {\
{IDC_COMMENT_COLORSTYLEGROUP_STATIC, IDC_COMMENT_FG_STATIC, IDC_COMMENT_BG_STATIC, IDC_COMMENT_FONTSTYLEGROUP_STATIC, IDC_COMMENT_FONTNAME_STATIC, IDC_COMMENT_FONTSIZE_STATIC, IDC_COMMENT_BOLD_CHECK, IDC_COMMENT_ITALIC_CHECK, IDC_COMMENT_UNDERLINE_CHECK},\
{IDC_NUMBER_COLORSTYLEGROUP_STATIC, IDC_NUMBER_FG_STATIC, IDC_NUMBER_BG_STATIC, IDC_NUMBER_FONTSTYLEGROUP_STATIC, IDC_NUMBER_FONTNAME_STATIC, IDC_NUMBER_FONTSIZE_STATIC, IDC_NUMBER_BOLD_CHECK, IDC_NUMBER_ITALIC_CHECK, IDC_NUMBER_UNDERLINE_CHECK},\
{IDC_COMMENTLINE_COLORSTYLEGROUP_STATIC, IDC_COMMENTLINE_FG_STATIC, IDC_COMMENTLINE_BG_STATIC, IDC_COMMENTLINE_FONTSTYLEGROUP_STATIC, IDC_COMMENTLINE_FONTNAME_STATIC, IDC_COMMENTLINE_FONTSIZE_STATIC, IDC_COMMENTLINE_BOLD_CHECK, IDC_COMMENTLINE_ITALIC_CHECK, IDC_COMMENTLINE_UNDERLINE_CHECK}\
};
const int nbGrpOperator = 3;
int operatorID[nbGrpOperator][nbControl] = {\
{IDC_SYMBOL_COLORSTYLEGROUP_STATIC, IDC_SYMBOL_FG_STATIC, IDC_SYMBOL_BG_STATIC, IDC_SYMBOL_FONTSTYLEGROUP_STATIC, IDC_SYMBOL_FONTNAME_STATIC, IDC_SYMBOL_FONTSIZE_STATIC, IDC_SYMBOL_BOLD_CHECK, IDC_SYMBOL_ITALIC_CHECK, IDC_SYMBOL_UNDERLINE_CHECK},\
{IDC_SYMBOL_COLORSTYLEGROUP2_STATIC, IDC_SYMBOL_FG2_STATIC, IDC_SYMBOL_BG2_STATIC, IDC_SYMBOL_FONTSTYLEGROUP2_STATIC, IDC_SYMBOL_FONTNAME2_STATIC, IDC_SYMBOL_FONTSIZE2_STATIC, IDC_SYMBOL_BOLD2_CHECK, IDC_SYMBOL_ITALIC2_CHECK, IDC_SYMBOL_UNDERLINE2_CHECK},\
{IDC_SYMBOL_COLORSTYLEGROUP3_STATIC, IDC_SYMBOL_FG3_STATIC, IDC_SYMBOL_BG3_STATIC, IDC_SYMBOL_FONTSTYLEGROUP3_STATIC, IDC_SYMBOL_FONTNAME3_STATIC, IDC_SYMBOL_FONTSIZE3_STATIC, IDC_SYMBOL_BOLD3_CHECK, IDC_SYMBOL_ITALIC3_CHECK, IDC_SYMBOL_UNDERLINE3_CHECK}
};
int nbGpArray[nbDlg] = {nbGrpFolder, nbGrpKeywords, nbGrpComment, nbGrpOperator};
const char nodeNameArray[nbDlg][16] = {"Folder", "Keywords", "Comment", "Operator"};
//int **idArrays[nbDlg] = {(int **)folderID, (int **)keywordsID, (int **)commentID, (int **)operatorID};
for (int i = 0 ; i < nbDlg ; i++)
{
for (int j = 0 ; j < nbGpArray[i] ; j++)
{
switch (i)
{
case 0 : changeStyleCtrlsLang(hDlgArrary[i], folderID[j], translatedText); break;
case 1 : changeStyleCtrlsLang(hDlgArrary[i], keywordsID[j], translatedText); break;
case 2 : changeStyleCtrlsLang(hDlgArrary[i], commentID[j], translatedText); break;
case 3 : changeStyleCtrlsLang(hDlgArrary[i], operatorID[j], translatedText); break;
}
}
TiXmlNode *node = userDefineDlgNode->FirstChild(nodeNameArray[i]);
if (node)
{
// Set Title
titre = (node->ToElement())->Attribute("title");
if (titre &&titre[0])
userDefineDlg->setTabName(i, titre);
for (TiXmlNode *childNode = node->FirstChildElement("Item");
childNode ;
childNode = childNode->NextSibling("Item") )
{
TiXmlElement *element = childNode->ToElement();
int id;
const char *sentinel = element->Attribute("id", &id);
const char *name = element->Attribute("name");
if (sentinel && (name && name[0]))
{
HWND hItem = ::GetDlgItem(hDlgArrary[i], id);
if (hItem)
::SetWindowText(hItem, name);
}
}
}
}
}
void Notepad_plus::changePrefereceDlgLang()
{
changeDlgLang(_preference.getHSelf(), "Preference");
char title[64];
changeDlgLang(_preference._barsDlg.getHSelf(), "Global", title);
if (*title)
_preference._ctrlTab.renameTab("Global", title);
changeDlgLang(_preference._marginsDlg.getHSelf(), "Scintillas", title);
if (*title)
_preference._ctrlTab.renameTab("Scintillas", title);
changeDlgLang(_preference._defaultNewDocDlg.getHSelf(), "NewDoc", title);
if (*title)
_preference._ctrlTab.renameTab("NewDoc", title);
changeDlgLang(_preference._fileAssocDlg.getHSelf(), "FileAssoc", title);
if (*title)
_preference._ctrlTab.renameTab("FileAssoc", title);
changeDlgLang(_preference._langMenuDlg.getHSelf(), "LangMenu", title);
if (*title)
_preference._ctrlTab.renameTab("LangMenu", title);
changeDlgLang(_preference._printSettingsDlg.getHSelf(), "Print1", title);
if (*title)
_preference._ctrlTab.renameTab("Print1", title);
changeDlgLang(_preference._printSettings2Dlg.getHSelf(), "Print2", title);
if (*title)
_preference._ctrlTab.renameTab("Print2", title);
changeDlgLang(_preference._settingsDlg.getHSelf(), "MISC", title);
if (*title)
_preference._ctrlTab.renameTab("MISC", title);
changeDlgLang(_preference._backupDlg.getHSelf(), "Backup", title);
if (*title)
_preference._ctrlTab.renameTab("Backup", title);
}
void Notepad_plus::changeShortcutLang()
{
if (!_nativeLang) return;
NppParameters * pNppParam = NppParameters::getInstance();
vector<CommandShortcut> & mainshortcuts = pNppParam->getUserShortcuts();
vector<ScintillaKeyMap> & scinshortcuts = pNppParam->getScintillaKeyList();
int mainSize = (int)mainshortcuts.size();
int scinSize = (int)scinshortcuts.size();
TiXmlNode *shortcuts = _nativeLang->FirstChild("Shortcuts");
if (!shortcuts) return;
shortcuts = shortcuts->FirstChild("Main");
if (!shortcuts) return;
TiXmlNode *entriesRoot = shortcuts->FirstChild("Entries");
if (!entriesRoot) return;
for (TiXmlNode *childNode = entriesRoot->FirstChildElement("Item");
childNode ;
childNode = childNode->NextSibling("Item") )
{
TiXmlElement *element = childNode->ToElement();
int index, id;
if (element->Attribute("index", &index) && element->Attribute("id", &id))
{
if (index > -1 && index < mainSize) { //valid index only
const char *name = element->Attribute("name");
CommandShortcut & csc = mainshortcuts[index];
if (csc.getID() == id) {
csc.setName(name);
}
}
}
}
//Scintilla
shortcuts = _nativeLang->FirstChild("Shortcuts");
if (!shortcuts) return;
shortcuts = shortcuts->FirstChild("Scintilla");
if (!shortcuts) return;
entriesRoot = shortcuts->FirstChild("Entries");
if (!entriesRoot) return;
for (TiXmlNode *childNode = entriesRoot->FirstChildElement("Item");
childNode ;
childNode = childNode->NextSibling("Item") )
{
TiXmlElement *element = childNode->ToElement();
int index;
if (element->Attribute("index", &index))
{
if (index > -1 && index < scinSize) { //valid index only
const char *name = element->Attribute("name");
ScintillaKeyMap & skm = scinshortcuts[index];
skm.setName(name);
}
}
}
}
void Notepad_plus::changeShortcutmapperLang(ShortcutMapper * sm)
{
if (!_nativeLang) return;
TiXmlNode *shortcuts = _nativeLang->FirstChild("Dialog");
if (!shortcuts) return;
shortcuts = shortcuts->FirstChild("ShortcutMapper");
if (!shortcuts) return;
for (TiXmlNode *childNode = shortcuts->FirstChildElement("Item");
childNode ;
childNode = childNode->NextSibling("Item") )
{
TiXmlElement *element = childNode->ToElement();
int index;
if (element->Attribute("index", &index))
{
if (index > -1 && index < 5) { //valid index only
const char *name = element->Attribute("name");
sm->translateTab(index, name);
}
}
}
}
TiXmlNode * searchDlgNode(TiXmlNode *node, const char *dlgTagName)
{
TiXmlNode *dlgNode = node->FirstChild(dlgTagName);
if (dlgNode) return dlgNode;
for (TiXmlNode *childNode = node->FirstChildElement();
childNode ;
childNode = childNode->NextSibling() )
{
dlgNode = searchDlgNode(childNode, dlgTagName);
if (dlgNode) return dlgNode;
}
return NULL;
}
bool Notepad_plus::changeDlgLang(HWND hDlg, const char *dlgTagName, char *title)
{
if (title)
title[0] = '\0';
if (!_nativeLang) return false;
TiXmlNode *dlgNode = _nativeLang->FirstChild("Dialog");
if (!dlgNode) return false;
dlgNode = searchDlgNode(dlgNode, dlgTagName);
if (!dlgNode) return false;
// Set Title
const char *titre = (dlgNode->ToElement())->Attribute("title");
if ((titre && titre[0]) && hDlg)
{
::SetWindowText(hDlg, titre);
if (title)
strcpy(title, titre);
}
// Set the text of child control
for (TiXmlNode *childNode = dlgNode->FirstChildElement("Item");
childNode ;
childNode = childNode->NextSibling("Item") )
{
TiXmlElement *element = childNode->ToElement();
int id;
const char *sentinel = element->Attribute("id", &id);
const char *name = element->Attribute("name");
if (sentinel && (name && name[0]))
{
HWND hItem = ::GetDlgItem(hDlg, id);
if (hItem)
::SetWindowText(hItem, name);
}
}
return true;
}
static string extractSymbol(char prefix, const char *str2extract)
{
bool found = false;
char extracted[128] = "";
for (size_t i = 0, j = 0 ; i < strlen(str2extract) ; i++)
{
if (found)
{
if (!str2extract[i] || str2extract[i] == ' ')
{
extracted[j] = '\0';
return string(extracted);
}
extracted[j++] = str2extract[i];
}
else
{
if (!str2extract[i])
return "";
if (str2extract[i] == prefix)
found = true;
}
}
return string(extracted);
};
bool Notepad_plus::doBlockComment(comment_mode currCommentMode)
{
const char *commentLineSybol;
string symbol;
Buffer & buf = _pEditView->getCurrentBuffer();
if (buf._lang == L_USER)
{
UserLangContainer & userLangContainer = NppParameters::getInstance()->getULCFromName(buf._userLangExt);
//::MessageBox(NULL, userLangContainer._keywordLists[4], "User", MB_OK);
symbol = extractSymbol('0', userLangContainer._keywordLists[4]);
commentLineSybol = symbol.c_str();
}
else
commentLineSybol = buf.getCommentLineSymbol();
if ((!commentLineSybol) || (!commentLineSybol[0]))
return false;
string comment(commentLineSybol);
comment += " ";
string long_comment = comment;
char linebuf[1000];
size_t comment_length = comment.length();
size_t selectionStart = _pEditView->execute(SCI_GETSELECTIONSTART);
size_t selectionEnd = _pEditView->execute(SCI_GETSELECTIONEND);
size_t caretPosition = _pEditView->execute(SCI_GETCURRENTPOS);
// checking if caret is located in _beginning_ of selected block
bool move_caret = caretPosition < selectionEnd;
int selStartLine = _pEditView->execute(SCI_LINEFROMPOSITION, selectionStart);
int selEndLine = _pEditView->execute(SCI_LINEFROMPOSITION, selectionEnd);
int lines = selEndLine - selStartLine;
size_t firstSelLineStart = _pEditView->execute(SCI_POSITIONFROMLINE, selStartLine);
// "caret return" is part of the last selected line
if ((lines > 0) && (selectionEnd == static_cast<size_t>(_pEditView->execute(SCI_POSITIONFROMLINE, selEndLine))))
selEndLine--;
_pEditView->execute(SCI_BEGINUNDOACTION);
for (int i = selStartLine; i <= selEndLine; i++)
{
int lineStart = _pEditView->execute(SCI_POSITIONFROMLINE, i);
int lineIndent = lineStart;
int lineEnd = _pEditView->execute(SCI_GETLINEENDPOSITION, i);
if ((lineEnd - lineIndent) >= static_cast<int>(sizeof(linebuf))) // Avoid buffer size problems
continue;
/*if (props.GetInt(comment_at_line_start.c_str())) {
GetRange(wEditor, lineIndent, lineEnd, linebuf);
} else*/
{
lineIndent = _pEditView->execute(SCI_GETLINEINDENTPOSITION, i);
_pEditView->getText(linebuf, lineIndent, lineEnd);
}
// empty lines are not commented
if (strlen(linebuf) < 1)
continue;
if (currCommentMode != cm_comment)
{
if (memcmp(linebuf, comment.c_str(), comment_length - 1) == 0)
{
if (memcmp(linebuf, long_comment.c_str(), comment_length) == 0)
{
// removing comment with space after it
_pEditView->execute(SCI_SETSEL, lineIndent, lineIndent + comment_length);
_pEditView->execute(SCI_REPLACESEL, 0, (WPARAM)"");
if (i == selStartLine) // is this the first selected line?
selectionStart -= comment_length;
selectionEnd -= comment_length; // every iteration
continue;
}
else
{
// removing comment _without_ space
_pEditView->execute(SCI_SETSEL, lineIndent, lineIndent + comment_length - 1);
_pEditView->execute(SCI_REPLACESEL, 0, (WPARAM)"");
if (i == selStartLine) // is this the first selected line?
selectionStart -= (comment_length - 1);
selectionEnd -= (comment_length - 1); // every iteration
continue;
}
}
}
if ((currCommentMode == cm_toggle) || (currCommentMode == cm_comment))
{
if (i == selStartLine) // is this the first selected line?
selectionStart += comment_length;
selectionEnd += comment_length; // every iteration
_pEditView->execute(SCI_INSERTTEXT, lineIndent, (WPARAM)long_comment.c_str());
}
}
// after uncommenting selection may promote itself to the lines
// before the first initially selected line;
// another problem - if only comment symbol was selected;
if (selectionStart < firstSelLineStart)
{
if (selectionStart >= selectionEnd - (comment_length - 1))
selectionEnd = firstSelLineStart;
selectionStart = firstSelLineStart;
}
if (move_caret)
{
// moving caret to the beginning of selected block
_pEditView->execute(SCI_GOTOPOS, selectionEnd);
_pEditView->execute(SCI_SETCURRENTPOS, selectionStart);
}
else
{
_pEditView->execute(SCI_SETSEL, selectionStart, selectionEnd);
}
_pEditView->execute(SCI_ENDUNDOACTION);
return true;
}
bool Notepad_plus::doStreamComment()
{
const char *commentStart;
const char *commentEnd;
string symbolStart;
string symbolEnd;
Buffer & buf = _pEditView->getCurrentBuffer();
if (buf._lang == L_USER)
{
UserLangContainer & userLangContainer = NppParameters::getInstance()->getULCFromName(buf._userLangExt);
symbolStart = extractSymbol('1', userLangContainer._keywordLists[4]);
commentStart = symbolStart.c_str();
symbolEnd = extractSymbol('2', userLangContainer._keywordLists[4]);
commentEnd = symbolEnd.c_str();
}
else
{
commentStart = _pEditView->getCurrentBuffer().getCommentStart();
commentEnd = _pEditView->getCurrentBuffer().getCommentEnd();
}
if ((!commentStart) || (!commentStart[0]))
return false;
if ((!commentEnd) || (!commentEnd[0]))
return false;
string start_comment(commentStart);
string end_comment(commentEnd);
string white_space(" ");
start_comment += white_space;
white_space += end_comment;
end_comment = white_space;
size_t start_comment_length = start_comment.length();
size_t selectionStart = _pEditView->execute(SCI_GETSELECTIONSTART);
size_t selectionEnd = _pEditView->execute(SCI_GETSELECTIONEND);
size_t caretPosition = _pEditView->execute(SCI_GETCURRENTPOS);
// checking if caret is located in _beginning_ of selected block
bool move_caret = caretPosition < selectionEnd;
// if there is no selection?
if (selectionEnd - selectionStart <= 0)
{
int selLine = _pEditView->execute(SCI_LINEFROMPOSITION, selectionStart);
int lineIndent = _pEditView->execute(SCI_GETLINEINDENTPOSITION, selLine);
int lineEnd = _pEditView->execute(SCI_GETLINEENDPOSITION, selLine);
char linebuf[1000];
_pEditView->getText(linebuf, lineIndent, lineEnd);
int caret = _pEditView->execute(SCI_GETCURRENTPOS);
int line = _pEditView->execute(SCI_LINEFROMPOSITION, caret);
int lineStart = _pEditView->execute(SCI_POSITIONFROMLINE, line);
int current = caret - lineStart;
// checking if we are not inside a word
int startword = current;
int endword = current;
int start_counter = 0;
int end_counter = 0;
while (startword > 0)// && wordCharacters.contains(linebuf[startword - 1]))
{
start_counter++;
startword--;
}
// checking _beginning_ of the word
if (startword == current)
return true; // caret is located _before_ a word
while (linebuf[endword + 1] != '\0') // && wordCharacters.contains(linebuf[endword + 1]))
{
end_counter++;
endword++;
}
selectionStart -= start_counter;
selectionEnd += (end_counter + 1);
}
_pEditView->execute(SCI_BEGINUNDOACTION);
_pEditView->execute(SCI_INSERTTEXT, selectionStart, (WPARAM)start_comment.c_str());
selectionEnd += start_comment_length;
selectionStart += start_comment_length;
_pEditView->execute(SCI_INSERTTEXT, selectionEnd, (WPARAM)end_comment.c_str());
if (move_caret)
{
// moving caret to the beginning of selected block
_pEditView->execute(SCI_GOTOPOS, selectionEnd);
_pEditView->execute(SCI_SETCURRENTPOS, selectionStart);
}
else
{
_pEditView->execute(SCI_SETSEL, selectionStart, selectionEnd);
}
_pEditView->execute(SCI_ENDUNDOACTION);
return true;
}
bool Notepad_plus::saveScintillaParams(bool whichOne)
{
ScintillaViewParams svp;
ScintillaEditView *pView = (whichOne == SCIV_PRIMARY)?&_mainEditView:&_subEditView;
svp._lineNumberMarginShow = pView->hasMarginShowed(ScintillaEditView::_SC_MARGE_LINENUMBER);
svp._bookMarkMarginShow = pView->hasMarginShowed(ScintillaEditView::_SC_MARGE_SYBOLE);
svp._indentGuideLineShow = pView->isShownIndentGuide();
svp._folderStyle = pView->getFolderStyle();
svp._currentLineHilitingShow = pView->isCurrentLineHiLiting();
svp._wrapSymbolShow = pView->isWrapSymbolVisible();
svp._doWrap = pView->isWrap();
svp._edgeMode = int(pView->execute(SCI_GETEDGEMODE));
svp._edgeNbColumn = int(pView->execute(SCI_GETEDGECOLUMN));
svp._zoom = int(pView->execute(SCI_GETZOOM));
svp._whiteSpaceShow = pView->isInvisibleCharsShown();
svp._eolShow = pView->isEolVisible();
return (NppParameters::getInstance())->writeScintillaParams(svp, whichOne);
}
bool Notepad_plus::addCurrentMacro()
{
vector<MacroShortcut> & theMacros = (NppParameters::getInstance())->getMacroList();
int nbMacro = theMacros.size();
int cmdID = ID_MACRO + nbMacro;
MacroShortcut ms(Shortcut(), _macro, cmdID);
ms.init(_hInst, _hSelf);
if (ms.doDialog() != -1)
{
HMENU hMacroMenu = ::GetSubMenu(_mainMenuHandle, MENUINDEX_MACRO);
int const posBase = 6; //separator at index 5
if (nbMacro == 0)
{
::InsertMenu(hMacroMenu, posBase-1, MF_BYPOSITION, (unsigned int)-1, 0); //no separator yet, add one
}
theMacros.push_back(ms);
::InsertMenu(hMacroMenu, posBase + nbMacro, MF_BYPOSITION, cmdID, ms.toMenuItemString().c_str());
_accelerator.updateShortcuts();
return true;
}
return false;
}
void Notepad_plus::changeToolBarIcons()
{
if (!_toolIcons)
return;
for (int i = 0 ; i < int(_customIconVect.size()) ; i++)
_toolBar.changeIcons(_customIconVect[i].listIndex, _customIconVect[i].iconIndex, (_customIconVect[i].iconLocation).c_str());
}
bool Notepad_plus::switchToFile(const char *fileName)
{
if (!fileName) return false;
int i = - 1;
int iView;
if ((i = _mainDocTab.find(fileName)) != -1)
{
iView = MAIN_VIEW;
}
else if ((i = _subDocTab.find(fileName)) != -1)
{
iView = SUB_VIEW;
}
if (i != -1)
{
switchEditViewTo(iView);
setTitleWith(_pDocTab->activate(i));
_pEditView->getFocus();
return true;
}
return false;
}
ToolBarButtonUnit toolBarIcons[] = {
{IDM_FILE_NEW, IDI_NEW_OFF_ICON, IDI_NEW_ON_ICON, IDI_NEW_OFF_ICON, IDR_FILENEW},
{IDM_FILE_OPEN, IDI_OPEN_OFF_ICON, IDI_OPEN_ON_ICON, IDI_NEW_OFF_ICON, IDR_FILEOPEN},
{IDM_FILE_SAVE, IDI_SAVE_OFF_ICON, IDI_SAVE_ON_ICON, IDI_SAVE_DISABLE_ICON, IDR_FILESAVE},
{IDM_FILE_SAVEALL, IDI_SAVEALL_OFF_ICON, IDI_SAVEALL_ON_ICON, IDI_SAVEALL_DISABLE_ICON, IDR_SAVEALL},
{IDM_FILE_CLOSE, IDI_CLOSE_OFF_ICON, IDI_CLOSE_ON_ICON, IDI_CLOSE_OFF_ICON, IDR_CLOSEFILE},
{IDM_FILE_CLOSEALL, IDI_CLOSEALL_OFF_ICON, IDI_CLOSEALL_ON_ICON, IDI_CLOSEALL_OFF_ICON, IDR_CLOSEALL},
{IDM_FILE_PRINTNOW, IDI_PRINT_OFF_ICON, IDI_PRINT_ON_ICON, IDI_PRINT_OFF_ICON, IDR_PRINT},
//-------------------------------------------------------------------------------------//
{0, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON},
//-------------------------------------------------------------------------------------//
{IDM_EDIT_CUT, IDI_CUT_OFF_ICON, IDI_CUT_ON_ICON, IDI_CUT_DISABLE_ICON, IDR_CUT},
{IDM_EDIT_COPY, IDI_COPY_OFF_ICON, IDI_COPY_ON_ICON, IDI_COPY_DISABLE_ICON, IDR_COPY},
{IDM_EDIT_PASTE, IDI_PASTE_OFF_ICON, IDI_PASTE_ON_ICON, IDI_PASTE_DISABLE_ICON, IDR_PASTE},
//-------------------------------------------------------------------------------------//
{0, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON},
//-------------------------------------------------------------------------------------//
{IDM_EDIT_UNDO, IDI_UNDO_OFF_ICON, IDI_UNDO_ON_ICON, IDI_UNDO_DISABLE_ICON, IDR_UNDO},
{IDM_EDIT_REDO, IDI_REDO_OFF_ICON, IDI_REDO_ON_ICON, IDI_REDO_DISABLE_ICON, IDR_REDO},
//-------------------------------------------------------------------------------------//
{0, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON},
//-------------------------------------------------------------------------------------//
{IDM_SEARCH_FIND, IDI_FIND_OFF_ICON, IDI_FIND_ON_ICON, IDI_FIND_OFF_ICON, IDR_FIND},
{IDM_SEARCH_REPLACE, IDI_REPLACE_OFF_ICON, IDI_REPLACE_ON_ICON, IDI_REPLACE_OFF_ICON, IDR_REPLACE},
//-------------------------------------------------------------------------------------//
{0, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON},
//-------------------------------------------------------------------------------------//
{IDM_VIEW_ZOOMIN, IDI_ZOOMIN_OFF_ICON, IDI_ZOOMIN_ON_ICON, IDI_ZOOMIN_OFF_ICON, IDR_ZOOMIN},
{IDM_VIEW_ZOOMOUT, IDI_ZOOMOUT_OFF_ICON, IDI_ZOOMOUT_ON_ICON, IDI_ZOOMOUT_OFF_ICON, IDR_ZOOMOUT},
//-------------------------------------------------------------------------------------//
{0, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON},
//-------------------------------------------------------------------------------------//
{IDM_VIEW_SYNSCROLLV, IDI_SYNCV_OFF_ICON, IDI_SYNCV_ON_ICON, IDI_SYNCV_DISABLE_ICON, IDR_SYNCV},
{IDM_VIEW_SYNSCROLLH, IDI_SYNCH_OFF_ICON, IDI_SYNCH_ON_ICON, IDI_SYNCH_DISABLE_ICON, IDR_SYNCH},
//-------------------------------------------------------------------------------------//
{0, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON},
//-------------------------------------------------------------------------------------//
{IDM_VIEW_WRAP, IDI_VIEW_WRAP_OFF_ICON, IDI_VIEW_WRAP_ON_ICON, IDI_VIEW_WRAP_OFF_ICON, IDR_WRAP},
{IDM_VIEW_ALL_CHARACTERS, IDI_VIEW_ALL_CHAR_OFF_ICON, IDI_VIEW_ALL_CHAR_ON_ICON, IDI_VIEW_ALL_CHAR_OFF_ICON, IDR_INVISIBLECHAR},
{IDM_VIEW_INDENT_GUIDE, IDI_VIEW_INDENT_OFF_ICON, IDI_VIEW_INDENT_ON_ICON, IDI_VIEW_INDENT_OFF_ICON, IDR_INDENTGUIDE},
{IDM_VIEW_USER_DLG, IDI_VIEW_UD_DLG_OFF_ICON, IDI_VIEW_UD_DLG_ON_ICON, IDI_VIEW_UD_DLG_OFF_ICON, IDR_SHOWPANNEL},
//-------------------------------------------------------------------------------------//
{0, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON},
//-------------------------------------------------------------------------------------//
{IDM_MACRO_STARTRECORDINGMACRO, IDI_STARTRECORD_OFF_ICON, IDI_STARTRECORD_ON_ICON, IDI_STARTRECORD_DISABLE_ICON, IDR_STARTRECORD},
{IDM_MACRO_STOPRECORDINGMACRO, IDI_STOPRECORD_OFF_ICON, IDI_STOPRECORD_ON_ICON, IDI_STOPRECORD_DISABLE_ICON, IDR_STOPRECORD},
{IDM_MACRO_PLAYBACKRECORDEDMACRO, IDI_PLAYRECORD_OFF_ICON, IDI_PLAYRECORD_ON_ICON, IDI_PLAYRECORD_DISABLE_ICON, IDR_PLAYRECORD},
{IDM_MACRO_RUNMULTIMACRODLG, IDI_MMPLAY_OFF_ICON, IDI_MMPLAY_ON_ICON, IDI_MMPLAY_DIS_ICON, IDR_M_PLAYRECORD},
{IDM_MACRO_SAVECURRENTMACRO, IDI_SAVERECORD_OFF_ICON, IDI_SAVERECORD_ON_ICON, IDI_SAVERECORD_DISABLE_ICON, IDR_SAVERECORD}
};
void Notepad_plus::getTaskListInfo(TaskListInfo *tli)
{
int iView = getCurrentView();
ScintillaEditView & currentView = (iView == MAIN_VIEW)?_mainEditView:_subEditView;
ScintillaEditView & nonCurrentView = (iView == MAIN_VIEW)?_subEditView:_mainEditView;
int nonCurrentiView = (iView == MAIN_VIEW)?SUB_VIEW:MAIN_VIEW;
size_t currentNbDoc = currentView.getNbDoc();
size_t nonCurrentNbDoc;
tli->_currentIndex = 0;
if (iView == MAIN_VIEW)
{
nonCurrentNbDoc = _subDocTab.isVisible()?_subEditView.getNbDoc():0;
}
else
{
nonCurrentNbDoc = _mainDocTab.isVisible()?_mainEditView.getNbDoc():0;
}
for (size_t i = 0 ; i < currentNbDoc ; i++)
{
Buffer & b = currentView.getBufferAt(i);
int status = b.isReadOnly()?tb_ro:(b.isDirty()?tb_unsaved:tb_saved);
tli->_tlfsLst.push_back(TaskLstFnStatus(iView,i,b._fullPathName, status));
}
for (size_t i = 0 ; i < nonCurrentNbDoc ; i++)
{
Buffer & b = nonCurrentView.getBufferAt(i);
int status = b.isReadOnly()?tb_ro:(b.isDirty()?tb_unsaved:tb_saved);
tli->_tlfsLst.push_back(TaskLstFnStatus(nonCurrentiView,i,b._fullPathName, status));
}
}
LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
LRESULT result = FALSE;
NppParameters *pNppParam = NppParameters::getInstance();
switch (Message)
{
case WM_NCACTIVATE:
{
// Note: lParam is -1 to prevent endless loops of calls
::SendMessage(_dockingManager.getHSelf(), WM_NCACTIVATE, wParam, (LPARAM)-1);
return ::DefWindowProc(hwnd, Message, wParam, lParam);
}
case WM_CREATE:
{
char * acTop_xpm[] = {
"14 14 4 1", //0
" c #FFFFFF", //1
". c #000000", //2
"+ c #A400B7", //3
"@ c #DE25F4", //4
"++++++++++++++",
" +@@@@@@@@@@. ",
" +@@@@@@@@. ",
" +@@@@@@. ",
" +@@@@. ",
" +@@. ",
" +. ",
" ",
" ",
" @@ ",
" @@ ",
" ",
" @@ ",
" @@ "};
char * acBottom_xpm[] = {
"14 14 4 1", //0
" c #FFFFFF", //1
". c #000000", //2
"+ c #A400B7", //3
"@ c #DE25F4", //4
" @@ ",
" @@ ",
" ",
" @@ ",
" @@ ",
" ",
" ",
" +. ",
" +@@. ",
" +@@@@. ",
" +@@@@@@. ",
" +@@@@@@@@. ",
" +@@@@@@@@@@. ",
".............."};
pNppParam->setFontList(hwnd);
NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI();
// Menu
_mainMenuHandle = ::GetMenu(_hSelf);
_pDocTab = &_mainDocTab;
_pEditView = &_mainEditView;
const ScintillaViewParams & svp1 = pNppParam->getSVP(SCIV_PRIMARY);
const ScintillaViewParams & svp2 = pNppParam->getSVP(SCIV_SECOND);
_mainEditView.init(_hInst, hwnd);
_subEditView.init(_hInst, hwnd);
_mainEditView.display();
_mainEditView.execute(SCI_MARKERDEFINEPIXMAP, MARK_HIDELINESBEGIN, (LPARAM)acTop_xpm);
_mainEditView.execute(SCI_MARKERDEFINEPIXMAP, MARK_HIDELINESEND, (LPARAM)acBottom_xpm);
_subEditView.execute(SCI_MARKERDEFINEPIXMAP, MARK_HIDELINESBEGIN, (LPARAM)acTop_xpm);
_subEditView.execute(SCI_MARKERDEFINEPIXMAP, MARK_HIDELINESEND, (LPARAM)acBottom_xpm);
_invisibleEditView.init(_hInst, hwnd);
_invisibleEditView.execute(SCI_SETUNDOCOLLECTION);
_invisibleEditView.execute(SCI_EMPTYUNDOBUFFER);
_invisibleEditView.attatchDefaultDoc(0);
// Configuration of 2 scintilla views
_mainEditView.showMargin(ScintillaEditView::_SC_MARGE_LINENUMBER, svp1._lineNumberMarginShow);
_subEditView.showMargin(ScintillaEditView::_SC_MARGE_LINENUMBER, svp2._lineNumberMarginShow);
_mainEditView.showMargin(ScintillaEditView::_SC_MARGE_SYBOLE, svp1._bookMarkMarginShow);
_subEditView.showMargin(ScintillaEditView::_SC_MARGE_SYBOLE, svp2._bookMarkMarginShow);
_mainEditView.showIndentGuideLine(svp1._indentGuideLineShow);
_subEditView.showIndentGuideLine(svp2._indentGuideLineShow);
_configStyleDlg.init(_hInst, _hSelf);
_preference.init(_hInst, _hSelf);
//Marker Margin config
_mainEditView.setMakerStyle(svp1._folderStyle);
_subEditView.setMakerStyle(svp2._folderStyle);
_mainEditView.execute(SCI_SETCARETLINEVISIBLE, svp1._currentLineHilitingShow);
_subEditView.execute(SCI_SETCARETLINEVISIBLE, svp2._currentLineHilitingShow);
_mainEditView.execute(SCI_SETCARETLINEVISIBLEALWAYS, true);
_subEditView.execute(SCI_SETCARETLINEVISIBLEALWAYS, true);
_mainEditView.wrap(svp1._doWrap);
_subEditView.wrap(svp2._doWrap);
_mainEditView.execute(SCI_SETEDGECOLUMN, svp1._edgeNbColumn);
_mainEditView.execute(SCI_SETEDGEMODE, svp1._edgeMode);
_subEditView.execute(SCI_SETEDGECOLUMN, svp2._edgeNbColumn);
_subEditView.execute(SCI_SETEDGEMODE, svp2._edgeMode);
_mainEditView.showEOL(svp1._eolShow);
_subEditView.showEOL(svp2._eolShow);
_mainEditView.showWSAndTab(svp1._whiteSpaceShow);
_subEditView.showWSAndTab(svp2._whiteSpaceShow);
_mainEditView.showWrapSymbol(svp1._wrapSymbolShow);
_subEditView.showWrapSymbol(svp2._wrapSymbolShow);
_mainEditView.performGlobalStyles();
_subEditView.performGlobalStyles();
if (pNppParam->hasCustomContextMenu())
{
_mainEditView.execute(SCI_USEPOPUP, FALSE);
_subEditView.execute(SCI_USEPOPUP, FALSE);
}
_zoomOriginalValue = _pEditView->execute(SCI_GETZOOM);
_mainEditView.execute(SCI_SETZOOM, svp1._zoom);
_subEditView.execute(SCI_SETZOOM, svp2._zoom);
int tabBarStatus = nppGUI._tabStatus;
_toReduceTabBar = ((tabBarStatus & TAB_REDUCE) != 0);
_docTabIconList.create(_toReduceTabBar?13:20, _hInst, docTabIconIDs, sizeof(docTabIconIDs)/sizeof(int));
_subDocTab.init(_hInst, hwnd, &_subEditView, &_docTabIconList);
const char * str = _mainDocTab.init(_hInst, hwnd, &_mainEditView, &_docTabIconList);
setTitleWith(str);
TabBarPlus::doDragNDrop(true);
if (_toReduceTabBar)
{
HFONT hf = (HFONT)::GetStockObject(DEFAULT_GUI_FONT);
if (hf)
{
::SendMessage(_mainDocTab.getHSelf(), WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE, 0));
::SendMessage(_subDocTab.getHSelf(), WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE, 0));
}
TabCtrl_SetItemSize(_mainDocTab.getHSelf(), 45, 20);
TabCtrl_SetItemSize(_subDocTab.getHSelf(), 45, 20);
}
_mainDocTab.display();
TabBarPlus::doDragNDrop((tabBarStatus & TAB_DRAGNDROP) != 0);
TabBarPlus::setDrawTopBar((tabBarStatus & TAB_DRAWTOPBAR) != 0);
TabBarPlus::setDrawInactiveTab((tabBarStatus & TAB_DRAWINACTIVETAB) != 0);
TabBarPlus::setDrawTabCloseButton((tabBarStatus & TAB_CLOSEBUTTON) != 0);
TabBarPlus::setDbClk2Close((tabBarStatus & TAB_DBCLK2CLOSE) != 0);
TabBarPlus::setVertical((tabBarStatus & TAB_VERTICAL) != 0);
//TabBarPlus::setMultiLine((tabBarStatus & TAB_MULTILINE) != 0);
//--Splitter Section--//
bool isVertical = (nppGUI._splitterPos == POS_VERTICAL);
_subSplitter.init(_hInst, _hSelf);
_subSplitter.create(&_mainDocTab, &_subDocTab, 8, DYNAMIC, 50, isVertical);
//--Status Bar Section--//
bool willBeShown = nppGUI._statusBarShow;
_statusBar.init(_hInst, hwnd, 6);
_statusBar.setPartWidth(STATUSBAR_DOC_SIZE, 180);
_statusBar.setPartWidth(STATUSBAR_CUR_POS, 250);
_statusBar.setPartWidth(STATUSBAR_EOF_FORMAT, 80);
_statusBar.setPartWidth(STATUSBAR_UNICODE_TYPE, 100);
_statusBar.setPartWidth(STATUSBAR_TYPING_MODE, 30);
_statusBar.display(willBeShown);
_pMainWindow = &_mainDocTab;
_dockingManager.init(_hInst, hwnd, &_pMainWindow);
//dynamicCheckMenuAndTB();
_mainEditView.defineDocType(L_TXT);
if (nppGUI._isMinimizedToTray)
_pTrayIco = new trayIconControler(_hSelf, IDI_M30ICON, IDC_MINIMIZED_TRAY, ::LoadIcon(_hInst, MAKEINTRESOURCE(IDI_M30ICON)), "");
checkSyncState();
// Plugin Manager
NppData nppData;
nppData._nppHandle = _hSelf;
nppData._scintillaMainHandle = _mainEditView.getHSelf();
nppData._scintillaSecondHandle = _subEditView.getHSelf();
_scintillaCtrls4Plugins.init(_hInst, hwnd);
_pluginsManager.init(nppData);
_pluginsManager.loadPlugins();
const char *appDataNpp = pNppParam->getAppDataNppDir();
if (appDataNpp[0])
_pluginsManager.loadPlugins(appDataNpp);
// Menu
string pluginsTrans, windowTrans;
changeMenuLang(pluginsTrans, windowTrans);
// Macro Menu
std::vector<MacroShortcut> & macros = pNppParam->getMacroList();
HMENU hMacroMenu = ::GetSubMenu(_mainMenuHandle, MENUINDEX_MACRO);
size_t const posBase = 6;
size_t nbMacro = macros.size();
if (nbMacro >= 1)
::InsertMenu(hMacroMenu, posBase - 1, MF_BYPOSITION, (unsigned int)-1, 0);
for (size_t i = 0 ; i < nbMacro ; i++)
{
::InsertMenu(hMacroMenu, posBase + i, MF_BYPOSITION, ID_MACRO + i, macros[i].toMenuItemString().c_str());
}
// Run Menu
std::vector<UserCommand> & userCommands = pNppParam->getUserCommandList();
HMENU hRunMenu = ::GetSubMenu(_mainMenuHandle, MENUINDEX_RUN);
int const runPosBase = 2;
size_t nbUserCommand = userCommands.size();
if (nbUserCommand >= 1)
::InsertMenu(hRunMenu, runPosBase - 1, MF_BYPOSITION, (unsigned int)-1, 0);
for (size_t i = 0 ; i < nbUserCommand ; i++)
{
::InsertMenu(hRunMenu, runPosBase + i, MF_BYPOSITION, ID_USER_CMD + i, userCommands[i].toMenuItemString().c_str());
}
// Updater menu item
if (!nppGUI._doesExistUpdater)
{
//::MessageBox(NULL, "pas de updater", "", MB_OK);
::DeleteMenu(_mainMenuHandle, IDM_UPDATE_NPP, MF_BYCOMMAND);
::DrawMenuBar(hwnd);
}
//Languages Menu
HMENU hLangMenu = ::GetSubMenu(_mainMenuHandle, MENUINDEX_LANGUAGE);
// Add external languages to menu
for (int i = 0 ; i < pNppParam->getNbExternalLang() ; i++)
{
ExternalLangContainer & externalLangContainer = pNppParam->getELCFromIndex(i);
int numLangs = ::GetMenuItemCount(hLangMenu);
char buffer[100];
int x;
for(x = 0; (x == 0 || strcmp(externalLangContainer._name, buffer) > 0) && x < numLangs; x++)
{
::GetMenuString(hLangMenu, x, buffer, sizeof(buffer), MF_BYPOSITION);
}
::InsertMenu(hLangMenu, x-1, MF_BYPOSITION, IDM_LANG_EXTERNAL + i, externalLangContainer._name);
}
if (nppGUI._excludedLangList.size() > 0)
{
for (size_t i = 0 ; i < nppGUI._excludedLangList.size() ; i++)
{
int cmdID = pNppParam->langTypeToCommandID(nppGUI._excludedLangList[i]._langType);
char itemName[256];
::GetMenuString(hLangMenu, cmdID, itemName, sizeof(itemName), MF_BYCOMMAND);
nppGUI._excludedLangList[i]._cmdID = cmdID;
nppGUI._excludedLangList[i]._langName = itemName;
::DeleteMenu(hLangMenu, cmdID, MF_BYCOMMAND);
DrawMenuBar(_hSelf);
}
}
// Add User Define Languages Entry
int udlpos = ::GetMenuItemCount(hLangMenu) - 1;
for (int i = 0 ; i < pNppParam->getNbUserLang() ; i++)
{
UserLangContainer & userLangContainer = pNppParam->getULCFromIndex(i);
::InsertMenu(hLangMenu, udlpos + i, MF_BYPOSITION, IDM_LANG_USER + i + 1, userLangContainer.getName());
}
//Plugin menu
_pluginsManager.setMenu(_mainMenuHandle, pluginsTrans.c_str());
//Windows menu
_windowsMenu.init(_hInst, _mainMenuHandle, windowTrans.c_str());
//Add recent files
HMENU hFileMenu = ::GetSubMenu(_mainMenuHandle, MENUINDEX_FILE);
int nbLRFile = pNppParam->getNbLRFile();
int pos = 16;
_lastRecentFileList.initMenu(hFileMenu, IDM_FILEMENU_LASTONE + 1, pos);
for (int i = 0 ; i < nbLRFile ; i++)
{
string * stdStr = pNppParam->getLRFile(i);
if (nppGUI._checkHistoryFiles)
{
if (PathFileExists(stdStr->c_str()))
{
_lastRecentFileList.add(stdStr->c_str());
}
}
else
{
_lastRecentFileList.add(stdStr->c_str());
}
}
//The menu is loaded, add in all the accelerators
// Update context menu strings
vector<MenuItemUnit> & tmp = pNppParam->getContextMenuItems();
size_t len = tmp.size();
char menuName[nameLenMax];
*menuName = 0;
size_t j, stlen;
for (size_t i = 0 ; i < len ; i++)
{
if (tmp[i]._itemName == "") {
::GetMenuString(_mainMenuHandle, tmp[i]._cmdID, menuName, 64, MF_BYCOMMAND);
stlen = strlen(menuName);
j = 0;
for(size_t k = 0; k < stlen; k++) {
if (menuName[k] == '\t') {
menuName[k] = 0;
break;
} else if (menuName[k] == '&') {
//skip
} else {
menuName[j] = menuName[k];
j++;
}
}
menuName[j] = 0;
tmp[i]._itemName = menuName;
}
}
//Input all the menu item names into shortcut list
//This will automatically do all translations, since menu translation has been done already
vector<CommandShortcut> & shortcuts = pNppParam->getUserShortcuts();
len = shortcuts.size();
int readI;
for(size_t i = 0; i < len; i++) {
CommandShortcut & csc = shortcuts[i];
if (!csc.getName()[0]) { //no predefined name, get name from menu and use that
if (::GetMenuString(_mainMenuHandle, csc.getID(), menuName, 64, MF_BYCOMMAND)) {
readI = 0;
while(menuName[readI] != 0)
{
if (menuName[readI] == '\t')
{
menuName[readI] = 0;
break;
}
readI++;
}
}
csc.setName(menuName);
}
}
//Translate non-menu shortcuts
changeShortcutLang();
//Update plugin shortcuts, all plugin commands should be available now
pNppParam->reloadPluginCmds();
// Shortcut Accelerator : should be the last one since it will capture all the shortcuts
_accelerator.init(_mainMenuHandle, _hSelf);
pNppParam->setAccelerator(&_accelerator);
// Scintilla key accelerator
vector<HWND> scints;
scints.push_back(_mainEditView.getHSelf());
scints.push_back(_subEditView.getHSelf());
_scintaccelerator.init(&scints, _mainMenuHandle, _hSelf);
pNppParam->setScintillaAccelerator(&_scintaccelerator);
_scintaccelerator.updateKeys();
::DrawMenuBar(_hSelf);
//-- Tool Bar Section --//
toolBarStatusType tbStatus = nppGUI._toolBarStatus;
willBeShown = nppGUI._toolbarShow;
// To notify plugins that toolbar icons can be registered
SCNotification scnN;
scnN.nmhdr.code = NPPN_TBMODIFICATION;
scnN.nmhdr.hwndFrom = _hSelf;
scnN.nmhdr.idFrom = 0;
_pluginsManager.notify(&scnN);
_toolBar.init(_hInst, hwnd, tbStatus, toolBarIcons, sizeof(toolBarIcons)/sizeof(ToolBarButtonUnit));
changeToolBarIcons();
_rebarTop.init(_hInst, hwnd);
_rebarBottom.init(_hInst, hwnd);
_toolBar.addToRebar(&_rebarTop);
_rebarTop.setIDVisible(REBAR_BAR_TOOLBAR, willBeShown);
//--Init dialogs--//
_findReplaceDlg.init(_hInst, hwnd, &_pEditView);
_incrementFindDlg.init(_hInst, hwnd, &_findReplaceDlg, _isRTL);
_incrementFindDlg.addToRebar(&_rebarBottom);
_goToLineDlg.init(_hInst, hwnd, &_pEditView);
_colEditorDlg.init(_hInst, hwnd, &_pEditView);
_aboutDlg.init(_hInst, hwnd);
_runDlg.init(_hInst, hwnd);
_runMacroDlg.init(_hInst, hwnd);
//--User Define Dialog Section--//
int uddStatus = nppGUI._userDefineDlgStatus;
UserDefineDialog *udd = _pEditView->getUserDefineDlg();
bool uddShow = false;
switch (uddStatus)
{
case UDD_SHOW : // show & undocked
udd->doDialog(true, _isRTL);
changeUserDefineLang();
uddShow = true;
break;
case UDD_DOCKED : { // hide & docked
_isUDDocked = true;
break;}
case (UDD_SHOW | UDD_DOCKED) : // show & docked
udd->doDialog(true, _isRTL);
changeUserDefineLang();
::SendMessage(udd->getHSelf(), WM_COMMAND, IDC_DOCK_BUTTON, 0);
uddShow = true;
break;
default : // hide & undocked
break;
}
// UserDefine Dialog
checkMenuItem(IDM_VIEW_USER_DLG, uddShow);
_toolBar.setCheck(IDM_VIEW_USER_DLG, uddShow);
//launch the plugin dlg memorized at the last session
DockingManagerData &dmd = nppGUI._dockingData;
_dockingManager.setDockedContSize(CONT_LEFT , nppGUI._dockingData._leftWidth);
_dockingManager.setDockedContSize(CONT_RIGHT , nppGUI._dockingData._rightWidth);
_dockingManager.setDockedContSize(CONT_TOP , nppGUI._dockingData._topHeight);
_dockingManager.setDockedContSize(CONT_BOTTOM, nppGUI._dockingData._bottomHight);
for (size_t i = 0 ; i < dmd._pluginDockInfo.size() ; i++)
{
PlugingDlgDockingInfo & pdi = dmd._pluginDockInfo[i];
if (pdi._isVisible)
_pluginsManager.runPluginCommand(pdi._name, pdi._internalID);
}
for (size_t i = 0 ; i < dmd._containerTabInfo.size() ; i++)
{
ContainerTabInfo & cti = dmd._containerTabInfo[i];
_dockingManager.setActiveTab(cti._cont, cti._activeTab);
}
::SetFocus(_mainEditView.getHSelf());
result = TRUE;
}
break;
case WM_DRAWITEM :
{
DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *)lParam;
if (dis->CtlType == ODT_TAB)
{
return ::SendMessage(dis->hwndItem, WM_DRAWITEM, wParam, lParam);
}
}
case WM_DOCK_USERDEFINE_DLG:
{
dockUserDlg();
return TRUE;
}
case WM_UNDOCK_USERDEFINE_DLG:
{
undockUserDlg();
return TRUE;
}
case WM_REMOVE_USERLANG:
{
char name[256];
strcpy(name, (char *)lParam);
_mainEditView.removeUserLang(name);
_subEditView.removeUserLang(name);
return TRUE;
}
case WM_RENAME_USERLANG:
{
char oldName[256];
char newName[256];
strcpy(oldName, (char *)lParam);
strcpy(newName, (char *)wParam);
_mainEditView.renameUserLang(oldName, newName);
_subEditView.renameUserLang(oldName, newName);
return TRUE;
}
case WM_CLOSE_USERDEFINE_DLG :
{
checkMenuItem(IDM_VIEW_USER_DLG, false);
_toolBar.setCheck(IDM_VIEW_USER_DLG, false);
return TRUE;
}
case WM_REPLACEALL_INOPENEDDOC :
{
replaceAllFiles();
return TRUE;
}
case WM_FINDALL_INOPENEDDOC :
{
findInOpenedFiles();
return TRUE;
}
case WM_FINDINFILES :
{
bool isRecursive = lParam == TRUE;
findInFiles(isRecursive);
return TRUE;
}
case NPPM_LAUNCHFINDINFILESDLG :
{
const int strSize = 64;
char str[strSize];
bool isFirstTime = !_findReplaceDlg.isCreated();
_findReplaceDlg.doDialog(FIND_DLG, _isRTL);
_pEditView->getSelectedText(str, strSize);
_findReplaceDlg.setSearchText(str);
if (isFirstTime)
changeDlgLang(_findReplaceDlg.getHSelf(), "Find");
_findReplaceDlg.launchFindInFilesDlg();
const char *dir = NULL;
char currentDir[MAX_PATH];
string fltr;
if (wParam)
dir = (const char *)wParam;
else
{
::GetCurrentDirectory(MAX_PATH, currentDir);
dir = currentDir;
}
if (lParam)
{
fltr = (const char *)lParam;
}
else
{
LangType lt = _pEditView->getCurrentDocType();
const char *ext = NppParameters::getInstance()->getLangExtFromLangType(lt);
if (ext && ext[0])
{
string filtres = "";
vector<string> vStr;
cutString(ext, vStr);
for (size_t i = 0 ; i < vStr.size() ; i++)
{
filtres += "*.";
filtres += vStr[i] + " ";
}
fltr = filtres;
}
else
fltr = "*.*";
}
_findReplaceDlg.setFindInFilesDirFilter(dir, fltr.c_str());
return TRUE;
}
case WM_DOOPEN:
{
doOpen((const char *)lParam);
}
break;
case NPPM_RELOADFILE:
{
doReload((const char *)lParam, wParam != 0);
}
break;
case NPPM_SWITCHTOFILE :
{
return switchToFile((const char *)lParam);
}
case NPPM_SAVECURRENTFILE:
{
return fileSave();
}
break;
case NPPM_SAVEALLFILES:
{
return fileSaveAll();
}
break;
case WM_SIZE:
{
RECT rc;
getClientRect(rc);
if (lParam == 0) {
lParam = MAKELPARAM(rc.right - rc.left, rc.bottom - rc.top);
}
::MoveWindow(_rebarTop.getHSelf(), 0, 0, rc.right, _rebarTop.getHeight(), TRUE);
_statusBar.adjustParts(rc.right);
::SendMessage(_statusBar.getHSelf(), WM_SIZE, wParam, lParam);
int rebarBottomHeight = _rebarBottom.getHeight();
int statusBarHeight = _statusBar.getHeight();
::MoveWindow(_rebarBottom.getHSelf(), 0, rc.bottom - rebarBottomHeight - statusBarHeight, rc.right, rebarBottomHeight, TRUE);
getMainClientRect(rc);
_dockingManager.reSizeTo(rc);
//_pMainWindow->reSizeTo(rc);
result = TRUE;
}
break;
case WM_MOVE:
{
result = TRUE;
}
break;
case WM_MOVING:
{
result = FALSE;
}
break;
case WM_SIZING:
{
result = FALSE;
}
break;
case WM_COPYDATA :
{
//const DWORD LASTBYTEMASK = 0x000000FF;
COPYDATASTRUCT *pCopyData = (COPYDATASTRUCT *)lParam;
switch (pCopyData->dwData)
{
case COPYDATA_PARAMS :
{
pNppParam->setCmdlineParam(*((CmdLineParams *)pCopyData->lpData));
break;
}
case COPYDATA_FILENAMES :
{
CmdLineParams & cmdLineParams = pNppParam->getCmdLineParams();
LangType lt = cmdLineParams._langType;//LangType(pCopyData->dwData & LASTBYTEMASK);
int ln = cmdLineParams._line2go;
int currentDocIndex = _pEditView->getCurrentDocIndex();
int currentView = getCurrentView();
FileNameStringSplitter fnss((char *)pCopyData->lpData);
char *pFn = NULL;
for (int i = 0 ; i < fnss.size() ; i++)
{
pFn = (char *)fnss.getFileName(i);
bool res = doOpen((const char *)pFn, cmdLineParams._isReadOnly);
if (!res)
continue;
if (lt != L_TXT)
{
_pEditView->setCurrentDocType(lt);
setLangStatus(lt);
checkLangsMenu(-1);
}
_pEditView->execute(SCI_GOTOLINE, ln-1);
}
if (_isSaving == true)
{
switchEditViewTo(currentView);
setTitleWith(_pDocTab->activate(currentDocIndex));
return true;
}
break;
}
}
return TRUE;
}
case WM_COMMAND:
if (HIWORD(wParam) == SCEN_SETFOCUS)
{
switchEditViewTo((lParam == (LPARAM)_mainEditView.getHSelf())?MAIN_VIEW:SUB_VIEW);
}
else
{
if ((lParam == 1) || (lParam == 2))
{
specialCmd(LOWORD(wParam), lParam);
}
else
command(LOWORD(wParam));
}
return TRUE;
case NPPM_MENUCOMMAND :
command(lParam);
return TRUE;
case NPPM_GETFULLCURRENTPATH :
case NPPM_GETCURRENTDIRECTORY :
case NPPM_GETFILENAME :
case NPPM_GETNAMEPART :
case NPPM_GETEXTPART :
{
char str[MAX_PATH];
// par defaut : NPPM_GETCURRENTDIRECTORY
char *fileStr = strcpy(str, _pEditView->getCurrentTitle());
if (Message == NPPM_GETCURRENTDIRECTORY)
PathRemoveFileSpec(str);
else if (Message == NPPM_GETFILENAME)
fileStr = PathFindFileName(str);
else if (Message == NPPM_GETNAMEPART)
{
fileStr = PathFindFileName(str);
PathRemoveExtension(fileStr);
}
else if (Message == NPPM_GETEXTPART)
fileStr = PathFindExtension(str);
// For the compability reason, if wParam is 0, then we assume the size of string buffer (lParam) is large enough.
// otherwise we check if the string buffer size is enough for the string to copy.
if (wParam != 0)
{
if (strlen(fileStr) >= wParam)
{
::MessageBox(_hSelf, "Allocated buffer size is not enough to copy the string.", "NPPM error", MB_OK);
return FALSE;
}
}
strcpy((char *)lParam, fileStr);
return TRUE;
}
case NPPM_GETCURRENTWORD :
{
const int strSize = MAX_PATH;
char str[strSize];
_pEditView->getSelectedText((char *)str, strSize);
// For the compability reason, if wParam is 0, then we assume the size of string buffer (lParam) is large enough.
// otherwise we check if the string buffer size is enough for the string to copy.
if (wParam != 0)
{
if (strlen(str) >= wParam) //buffer too small
{
::MessageBox(_hSelf, "Allocated buffer size is not enough to copy the string.", "NPPM_GETCURRENTWORD error", MB_OK);
return FALSE;
}
else //buffer large enough, perform safe copy
{
lstrcpyn((char *)lParam, str, wParam);
return TRUE;
}
}
strcpy((char *)lParam, str);
return TRUE;
}
case NPPM_GETNPPDIRECTORY :
{
const int strSize = MAX_PATH;
char str[strSize];
::GetModuleFileName(NULL, str, strSize);
PathRemoveFileSpec(str);
// For the compability reason, if wParam is 0, then we assume the size of string buffer (lParam) is large enough.
// otherwise we check if the string buffer size is enough for the string to copy.
if (wParam != 0)
{
if (strlen(str) >= wParam)
{
::MessageBox(_hSelf, "Allocated buffer size is not enough to copy the string.", "NPPM_GETNPPDIRECTORY error", MB_OK);
return FALSE;
}
}
strcpy((char *)lParam, str);
return TRUE;
}
case NPPM_GETCURRENTSCINTILLA :
{
*((int *)lParam) = (_pEditView == &_mainEditView)?0:1;
return TRUE;
}
case NPPM_GETCURRENTLANGTYPE :
{
*((LangType *)lParam) = _pEditView->getCurrentDocType();
return TRUE;
}
case NPPM_SETCURRENTLANGTYPE :
{
_pEditView->setCurrentDocType((LangType)lParam);
return TRUE;
}
case NPPM_GETNBOPENFILES :
{
int nbDocPrimary = _mainEditView.getNbDoc();
int nbDocSecond = _subEditView.getNbDoc();
if (lParam == ALL_OPEN_FILES)
return nbDocPrimary + nbDocSecond;
else if (lParam == PRIMARY_VIEW)
return nbDocPrimary;
else if (lParam == SECOND_VIEW)
return nbDocSecond;
}
case NPPM_GETOPENFILENAMESPRIMARY :
{
if (!wParam) return 0;
char **fileNames = (char **)wParam;
size_t nbFileNames = lParam;
size_t i = 0;
for ( ; i < nbFileNames ; i++)
{
strcpy(fileNames[i], _mainEditView.getBufferAt(i).getFileName());
}
return i;
}
case NPPM_GETOPENFILENAMESSECOND :
{
if (!wParam) return 0;
char **fileNames = (char **)wParam;
size_t nbFileNames = lParam;
size_t i = 0;
for ( ; i < nbFileNames ; i++)
{
strcpy(fileNames[i], _subEditView.getBufferAt(i).getFileName());
}
return i;
}
case NPPM_GETOPENFILENAMES :
{
if (!wParam) return 0;
char **fileNames = (char **)wParam;
int nbFileNames = lParam;
int j = 0;
for (size_t i = 0 ; i < _mainEditView.getNbDoc() && j < nbFileNames ; i++)
{
strcpy(fileNames[j++], _mainEditView.getBufferAt(i).getFileName());
}
for (size_t i = 0 ; i < _subEditView.getNbDoc() && j < nbFileNames ; i++)
{
strcpy(fileNames[j++], _subEditView.getBufferAt(i).getFileName());
}
return j;
}
case WM_GETTASKLISTINFO :
{
if (!wParam) return 0;
TaskListInfo * tli = (TaskListInfo *)wParam;
getTaskListInfo(tli);
if (NppParameters::getInstance()->getNppGUI()._styleMRU)
{
tli->_currentIndex = 0;
std::sort(tli->_tlfsLst.begin(),tli->_tlfsLst.end(),SortTaskListPred(_mainEditView,_subEditView));
}
else
{
for(int idx = 0; idx < (int)tli->_tlfsLst.size(); ++idx)
{
if(tli->_tlfsLst[idx]._iView == getCurrentView() &&
tli->_tlfsLst[idx]._docIndex == getCurrentEditView()->getCurrentDocIndex())
{
tli->_currentIndex = idx;
break;
}
}
}
return TRUE;
}
case WM_MOUSEWHEEL :
{
if (LOWORD(wParam) & MK_RBUTTON)
{
// redirect to the IDC_PREV_DOC or IDC_NEXT_DOC so that we have the unified process
pNppParam->_isTaskListRBUTTONUP_Active = true;
short zDelta = (short) HIWORD(wParam);
return ::SendMessage(_hSelf, WM_COMMAND, zDelta>0?IDC_PREV_DOC:IDC_NEXT_DOC, 0);
}
return TRUE;
}
case WM_APPCOMMAND :
{
switch(GET_APPCOMMAND_LPARAM(lParam))
{
case APPCOMMAND_BROWSER_BACKWARD :
case APPCOMMAND_BROWSER_FORWARD :
int nbDoc = _mainDocTab.isVisible()?_mainEditView.getNbDoc():0;
nbDoc += _subDocTab.isVisible()?_subEditView.getNbDoc():0;
if (nbDoc > 1)
activateNextDoc((GET_APPCOMMAND_LPARAM(lParam) == APPCOMMAND_BROWSER_FORWARD)?dirDown:dirUp);
_linkTriggered = true;
}
return ::DefWindowProc(hwnd, Message, wParam, lParam);
}
case NPPM_GETNBSESSIONFILES :
{
const char *sessionFileName = (const char *)lParam;
if ((!sessionFileName) || (sessionFileName[0] == '\0')) return 0;
Session session2Load;
if (pNppParam->loadSession(session2Load, sessionFileName))
{
return session2Load.nbMainFiles() + session2Load.nbSubFiles();
}
return 0;
}
case NPPM_GETSESSIONFILES :
{
const char *sessionFileName = (const char *)lParam;
char **sessionFileArray = (char **)wParam;
if ((!sessionFileName) || (sessionFileName[0] == '\0')) return FALSE;
Session session2Load;
if (pNppParam->loadSession(session2Load, sessionFileName))
{
size_t i = 0;
for ( ; i < session2Load.nbMainFiles() ; )
{
const char *pFn = session2Load._mainViewFiles[i]._fileName.c_str();
strcpy(sessionFileArray[i++], pFn);
}
for (size_t j = 0 ; j < session2Load.nbSubFiles() ; j++)
{
const char *pFn = session2Load._subViewFiles[j]._fileName.c_str();
// comment to remove
/*
// make sure that the same file is not cloned in another view
bool foundInMainView = false;
for (size_t k = 0 ; k < session2Load.nbMainFiles() ; k++)
{
const char *pFnMain = session2Load._mainViewFiles[k]._fileName.c_str();
if (strcmp(pFn, pFnMain) == 0)
{
foundInMainView = true;
break;
}
}
if (!foundInMainView)
*/
strcpy(sessionFileArray[i++], pFn);
}
return TRUE;
}
return FALSE;
}
case NPPM_DECODESCI:
{
/* convert to ASCII */
Utf8_16_Write UnicodeConvertor;
UINT length = 0;
char* buffer = NULL;
ScintillaEditView *pSci;
if (wParam == MAIN_VIEW)
pSci = &_mainEditView;
else if (wParam == SUB_VIEW)
pSci = &_subEditView;
else
return -1;
/* get text of current scintilla */
length = pSci->execute(SCI_GETTEXTLENGTH, 0, 0) + 1;
buffer = new char[length];
pSci->execute(SCI_GETTEXT, length, (LPARAM)buffer);
/* convert here */
UniMode unicodeMode = pSci->getCurrentBuffer().getUnicodeMode();
UnicodeConvertor.setEncoding(unicodeMode);
length = UnicodeConvertor.convert(buffer, length-1);
/* set text in target */
pSci->execute(SCI_CLEARALL);
pSci->execute(SCI_ADDTEXT, length, (LPARAM)UnicodeConvertor.getNewBuf());
pSci->execute(SCI_EMPTYUNDOBUFFER);
pSci->execute(SCI_SETCODEPAGE);
/* set cursor position */
pSci->execute(SCI_GOTOPOS);
/* clean buffer */
delete [] buffer;
return unicodeMode;
}
case NPPM_ENCODESCI:
{
// convert
Utf8_16_Read UnicodeConvertor;
UINT length = 0;
char* buffer = NULL;
ScintillaEditView *pSci;
if (wParam == MAIN_VIEW)
pSci = &_mainEditView;
else if (wParam == SUB_VIEW)
pSci = &_subEditView;
else
return -1;
// get text of current scintilla
length = pSci->execute(SCI_GETTEXTLENGTH, 0, 0) + 1;
buffer = (char*)new char[length];
pSci->execute(SCI_GETTEXT, length, (LPARAM)buffer);
length = UnicodeConvertor.convert(buffer, length-1);
// set text in target
pSci->execute(SCI_CLEARALL);
pSci->execute(SCI_ADDTEXT, length, (LPARAM)UnicodeConvertor.getNewBuf());
pSci->execute(SCI_EMPTYUNDOBUFFER);
// set cursor position
pSci->execute(SCI_GOTOPOS);
// clean buffer
delete [] buffer;
// set new encoding if BOM was changed by other programms
UniMode um = UnicodeConvertor.getEncoding();
(pSci->getCurrentBuffer()).setUnicodeMode(um);
checkUnicodeMenuItems(um);
// Override the code page if Unicode
if (um != uni8Bit)
_pEditView->execute(SCI_SETCODEPAGE, SC_CP_UTF8);
return um;
}
case NPPM_ACTIVATEDOC :
case NPPM_TRIGGERTABBARCONTEXTMENU:
{
// similar to NPPM_ACTIVEDOC
int whichView = ((wParam != MAIN_VIEW) && (wParam != SUB_VIEW))?getCurrentView():wParam;
int index = lParam;
switchEditViewTo(whichView);
activateDoc(index);
if (Message == NPPM_TRIGGERTABBARCONTEXTMENU)
{
// open here tab menu
NMHDR nmhdr;
nmhdr.code = NM_RCLICK;
nmhdr.hwndFrom = (whichView == MAIN_VIEW)?_mainDocTab.getHSelf():_subDocTab.getHSelf();
nmhdr.idFrom = ::GetDlgCtrlID(nmhdr.hwndFrom);
::SendMessage(_hSelf, WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr);
}
return TRUE;
}
case NPPM_GETNPPVERSION:
{
char verStr[16] = VERSION_VALUE;
char mainVerStr[16];
char auxVerStr[16];
bool isDot = false;
int j =0;
int k = 0;
for (int i = 0 ; verStr[i] ; i++)
{
if (verStr[i] == '.')
isDot = true;
else
{
if (!isDot)
mainVerStr[j++] = verStr[i];
else
auxVerStr[k++] = verStr[i];
}
}
mainVerStr[j] = '\0';
auxVerStr[k] = '\0';
int mainVer, auxVer = 0;
if (mainVerStr)
mainVer = atoi(mainVerStr);
if (auxVerStr)
auxVer = atoi(auxVerStr);
return MAKELONG(auxVer, mainVer);
}
case WM_ISCURRENTMACRORECORDED :
return (!_macro.empty() && !_recordingMacro);
case WM_MACRODLGRUNMACRO:
{
if (!_recordingMacro) // if we're not currently recording, then playback the recorded keystrokes
{
int times = 1;
if (_runMacroDlg.getMode() == RM_RUN_MULTI)
{
times = _runMacroDlg.getTimes();
}
else if (_runMacroDlg.getMode() == RM_RUN_EOF)
{
times = -1;
}
else
{
break;
}
int counter = 0;
int lastLine = int(_pEditView->execute(SCI_GETLINECOUNT)) - 1;
int currLine = _pEditView->getCurrentLineNumber();
int indexMacro = _runMacroDlg.getMacro2Exec();
int deltaLastLine = 0;
int deltaCurrLine = 0;
Macro m = _macro;
if (indexMacro != -1)
{
vector<MacroShortcut> & ms = pNppParam->getMacroList();
m = ms[indexMacro].getMacro();
}
_pEditView->execute(SCI_BEGINUNDOACTION);
while (true)
{
for (Macro::iterator step = m.begin(); step != m.end(); step++)
step->PlayBack(this, _pEditView);
counter++;
if ( times >= 0 )
{
if ( counter >= times ) break;
}
else // run until eof
{
bool cursorMovedUp = deltaCurrLine < 0;
deltaLastLine = int(_pEditView->execute(SCI_GETLINECOUNT)) - 1 - lastLine;
deltaCurrLine = _pEditView->getCurrentLineNumber() - currLine;
if (( deltaCurrLine == 0 ) // line no. not changed?
&& (deltaLastLine >= 0)) // and no lines removed?
break; // exit
// Update the line count, but only if the number of lines remaining is shrinking.
// Otherwise, the macro playback may never end.
if (deltaLastLine < deltaCurrLine)
lastLine += deltaLastLine;
// save current line
currLine += deltaCurrLine;
// eof?
if ((currLine >= lastLine) || (currLine < 0)
|| ((deltaCurrLine == 0) && (currLine == 0) && ((deltaLastLine >= 0) || cursorMovedUp)))
break;
}
}
_pEditView->execute(SCI_ENDUNDOACTION);
}
}
break;
case NPPM_CREATESCINTILLAHANDLE :
{
return (LRESULT)_scintillaCtrls4Plugins.createSintilla((lParam == NULL?_hSelf:(HWND)lParam));
}
case NPPM_DESTROYSCINTILLAHANDLE :
{
return _scintillaCtrls4Plugins.destroyScintilla((HWND)lParam);
}
case NPPM_GETNBUSERLANG :
{
if (lParam)
*((int *)lParam) = IDM_LANG_USER;
return pNppParam->getNbUserLang();
}
case NPPM_GETCURRENTDOCINDEX :
{
if (lParam == SUB_VIEW)
{
if (!_subDocTab.isVisible())
return -1;
return _subEditView.getCurrentDocIndex();
}
else //MAIN_VIEW
{
if (!_mainDocTab.isVisible())
return -1;
return _mainEditView.getCurrentDocIndex();
}
}
case NPPM_SETSTATUSBAR :
{
char *str2set = (char *)lParam;
if (!str2set || !str2set[0])
return FALSE;
switch (wParam)
{
case STATUSBAR_DOC_TYPE :
case STATUSBAR_DOC_SIZE :
case STATUSBAR_CUR_POS :
case STATUSBAR_EOF_FORMAT :
case STATUSBAR_UNICODE_TYPE :
case STATUSBAR_TYPING_MODE :
_statusBar.setText(str2set, wParam);
return TRUE;
default :
return FALSE;
}
}
case NPPM_GETMENUHANDLE :
{
if (wParam == NPPPLUGINMENU)
return (LRESULT)_pluginsManager.getMenuHandle();
else
return NULL;
}
case NPPM_LOADSESSION :
{
fileLoadSession((const char *)lParam);
return TRUE;
}
case NPPM_SAVECURRENTSESSION :
{
return (LRESULT)fileSaveSession(0, NULL, (const char *)lParam);
}
case NPPM_SAVESESSION :
{
sessionInfo *pSi = (sessionInfo *)lParam;
return (LRESULT)fileSaveSession(pSi->nbFile, pSi->files, pSi->sessionFilePathName);
}
case NPPM_INTERNAL_CLEARSCINTILLAKEY :
{
_mainEditView.execute(SCI_CLEARCMDKEY, wParam);
_subEditView.execute(SCI_CLEARCMDKEY, wParam);
return TRUE;
}
case NPPM_INTERNAL_BINDSCINTILLAKEY :
{
_mainEditView.execute(SCI_ASSIGNCMDKEY, wParam, lParam);
_subEditView.execute(SCI_ASSIGNCMDKEY, wParam, lParam);
return TRUE;
}
case NPPM_INTERNAL_CMDLIST_MODIFIED :
{
//changeMenuShortcut(lParam, (const char *)wParam);
::DrawMenuBar(_hSelf);
return TRUE;
}
case NPPM_INTERNAL_MACROLIST_MODIFIED :
{
return TRUE;
}
case NPPM_INTERNAL_USERCMDLIST_MODIFIED :
{
return TRUE;
}
case NPPM_INTERNAL_SCINTILLAKEYMODIFIED :
{
return TRUE;
}
case NPPM_INTERNAL_PLUGINCMDLIST_MODIFIED :
{
return TRUE;
}
case NPPM_INTERNAL_DOCSWITCHOFF :
{
removeHideLinesBookmarks();
return TRUE;
}
case NPPM_INTERNAL_DOCSWITCHIN :
{
_hideLinesMarks.empty();
checkDocState();
dynamicCheckMenuAndTB();
setLangStatus(_pEditView->getCurrentDocType());
updateStatusBar();
reloadOnSwitchBack();
return TRUE;
}
case NPPM_INTERNAL_ISTABBARREDUCED :
{
return _toReduceTabBar?TRUE:FALSE;
}
case NPPM_INTERNAL_MARKALL :
{
markSelectedTextInc(bool(wParam));
return TRUE;
}
// ADD: success->hwnd; failure->NULL
// REMOVE: success->NULL; failure->hwnd
case NPPM_MODELESSDIALOG :
{
if (wParam == MODELESSDIALOGADD)
{
for (size_t i = 0 ; i < _hModelessDlgs.size() ; i++)
if (_hModelessDlgs[i] == (HWND)lParam)
return NULL;
_hModelessDlgs.push_back((HWND)lParam);
return lParam;
}
else if (wParam == MODELESSDIALOGREMOVE)
{
for (size_t i = 0 ; i < _hModelessDlgs.size() ; i++)
if (_hModelessDlgs[i] == (HWND)lParam)
{
vector<HWND>::iterator hDlg = _hModelessDlgs.begin() + i;
_hModelessDlgs.erase(hDlg);
return NULL;
}
return lParam;
}
return TRUE;
}
case WM_CONTEXTMENU :
{
if (pNppParam->_isTaskListRBUTTONUP_Active)
{
pNppParam->_isTaskListRBUTTONUP_Active = false;
}
else
{
if ((HWND(wParam) == _mainEditView.getHSelf()) || (HWND(wParam) == _subEditView.getHSelf()))
{
POINT p;
::GetCursorPos(&p);
ContextMenu scintillaContextmenu;
vector<MenuItemUnit> & tmp = pNppParam->getContextMenuItems();
vector<bool> isEnable;
for (size_t i = 0 ; i < tmp.size() ; i++)
{
isEnable.push_back((::GetMenuState(_mainMenuHandle, tmp[i]._cmdID, MF_BYCOMMAND)&MF_DISABLED) == 0);
}
scintillaContextmenu.create(_hSelf, tmp);
for (size_t i = 0 ; i < isEnable.size() ; i++)
scintillaContextmenu.enableItem(tmp[i]._cmdID, isEnable[i]);
scintillaContextmenu.display(p);
return TRUE;
}
}
return ::DefWindowProc(hwnd, Message, wParam, lParam);
}
case WM_NOTIFY:
{
checkClipboard();
checkUndoState();
checkMacroState();
_pluginsManager.notify(reinterpret_cast<SCNotification *>(lParam));
return notify(reinterpret_cast<SCNotification *>(lParam));
}
case NPPM_CHECKDOCSTATUS :
case WM_ACTIVATEAPP :
{
if (wParam == TRUE) // if npp is about to be activated
{
const NppGUI & nppgui = pNppParam->getNppGUI();
if (LOWORD(wParam) && (nppgui._fileAutoDetection != cdDisabled))
{
_activeAppInf._isActivated = true;
checkModifiedDocument();
return FALSE;
}
}
break;
}
case NPPM_GETCHECKDOCOPT :
{
return (LRESULT)((NppGUI &)(pNppParam->getNppGUI()))._fileAutoDetection;
}
case NPPM_SETCHECKDOCOPT :
{
((NppGUI &)(pNppParam->getNppGUI()))._fileAutoDetection = (ChangeDetect)wParam;
return TRUE;
}
case NPPM_ENABLECHECKDOCOPT:
{
NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI());
if (wParam == CHECKDOCOPT_NONE)
nppgui._fileAutoDetection = cdDisabled;
else if (wParam == CHECKDOCOPT_UPDATESILENTLY)
nppgui._fileAutoDetection = cdAutoUpdate;
else if (wParam == CHECKDOCOPT_UPDATEGO2END)
nppgui._fileAutoDetection = cdGo2end;
else if (wParam == (CHECKDOCOPT_UPDATESILENTLY | CHECKDOCOPT_UPDATEGO2END))
nppgui._fileAutoDetection = cdAutoUpdateGo2end;
return TRUE;
}
case WM_ACTIVATE :
_pEditView->getFocus();
return TRUE;
case WM_DROPFILES:
{
dropFiles(reinterpret_cast<HDROP>(wParam));
return TRUE;
}
case WM_UPDATESCINTILLAS:
{
_mainEditView.defineDocType(_mainEditView.getCurrentDocType());
_subEditView.defineDocType(_subEditView.getCurrentDocType());
_mainEditView.performGlobalStyles();
_subEditView.performGlobalStyles();
return TRUE;
}
//case WM_ENDSESSION:
case WM_QUERYENDSESSION:
case WM_CLOSE:
{
if (_isfullScreen)
fullScreenToggle();
const NppGUI & nppgui = pNppParam->getNppGUI();
if (_configStyleDlg.isCreated() && ::IsWindowVisible(_configStyleDlg.getHSelf()))
_configStyleDlg.restoreGlobalOverrideValues();
Session currentSession;
if (nppgui._rememberLastSession)
getCurrentOpenedFiles(currentSession);
if (fileCloseAll())
{
SCNotification scnN;
scnN.nmhdr.code = NPPN_SHUTDOWN;
scnN.nmhdr.hwndFrom = _hSelf;
scnN.nmhdr.idFrom = 0;
_pluginsManager.notify(&scnN);
_lastRecentFileList.saveLRFL();
saveScintillaParams(SCIV_PRIMARY);
saveScintillaParams(SCIV_SECOND);
saveGUIParams();
saveUserDefineLangs();
saveShortcuts();
if (nppgui._rememberLastSession)
saveSession(currentSession);
::DestroyWindow(hwnd);
}
return TRUE;
}
case WM_DESTROY:
{
killAllChildren();
::PostQuitMessage(0);
return TRUE;
}
case WM_SYSCOMMAND:
{
NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI());
if ((nppgui._isMinimizedToTray) && (wParam == SC_MINIMIZE))
{
if (!_pTrayIco)
_pTrayIco = new trayIconControler(_hSelf, IDI_M30ICON, IDC_MINIMIZED_TRAY, ::LoadIcon(_hInst, MAKEINTRESOURCE(IDI_M30ICON)), "");
_pTrayIco->doTrayIcon(ADD);
::ShowWindow(hwnd, SW_HIDE);
return TRUE;
}
if (wParam == SC_KEYMENU && lParam == VK_SPACE)
{
_sysMenuEntering = true;
}
else if (wParam == 0xF093) //it should be SC_MOUSEMENU. A bug?
{
_sysMenuEntering = true;
}
return ::DefWindowProc(hwnd, Message, wParam, lParam);
}
case WM_LBUTTONDBLCLK:
{
::SendMessage(_hSelf, WM_COMMAND, IDM_FILE_NEW, 0);
return TRUE;
}
case IDC_MINIMIZED_TRAY:
{
switch (lParam)
{
//case WM_LBUTTONDBLCLK:
case WM_LBUTTONUP :
_pEditView->getFocus();
::ShowWindow(_hSelf, SW_SHOW);
_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;
}
*/
}
return TRUE;
}
case NPPM_DMMSHOW:
{
_dockingManager.showDockableDlg((HWND)lParam, SW_SHOW);
return TRUE;
}
case NPPM_DMMHIDE:
{
_dockingManager.showDockableDlg((HWND)lParam, SW_HIDE);
return TRUE;
}
case NPPM_DMMUPDATEDISPINFO:
{
if (::IsWindowVisible((HWND)lParam))
_dockingManager.updateContainerInfo((HWND)lParam);
return TRUE;
}
case NPPM_DMMREGASDCKDLG:
{
tTbData *pData = (tTbData *)lParam;
int iCont = -1;
bool isVisible = false;
getIntegralDockingData(*pData, iCont, isVisible);
_dockingManager.createDockableDlg(*pData, iCont, isVisible);
return TRUE;
}
case NPPM_DMMVIEWOTHERTAB:
{
_dockingManager.showDockableDlg((char*)lParam, SW_SHOW);
return TRUE;
}
case NPPM_DMMGETPLUGINHWNDBYNAME : //(const char *windowName, const char *moduleName)
{
if (!lParam) return NULL;
char *moduleName = (char *)lParam;
char *windowName = (char *)wParam;
vector<DockingCont *> dockContainer = _dockingManager.getContainerInfo();
for (size_t i = 0 ; i < dockContainer.size() ; i++)
{
vector<tTbData *> tbData = dockContainer[i]->getDataOfAllTb();
for (size_t j = 0 ; j < tbData.size() ; j++)
{
if (stricmp(moduleName, tbData[j]->pszModuleName) == 0)
{
if (!windowName)
return (LRESULT)tbData[j]->hClient;
else if (stricmp(windowName, tbData[j]->pszName) == 0)
return (LRESULT)tbData[j]->hClient;
}
}
}
return NULL;
}
case NPPM_ADDTOOLBARICON:
{
_toolBar.registerDynBtn((UINT)wParam, (toolbarIcons*)lParam);
return TRUE;
}
case NPPM_SETMENUITEMCHECK:
{
::CheckMenuItem(_mainMenuHandle, (UINT)wParam, MF_BYCOMMAND | ((BOOL)lParam ? MF_CHECKED : MF_UNCHECKED));
_toolBar.setCheck((int)wParam, bool(lParam != 0));
return TRUE;
}
case NPPM_GETWINDOWSVERSION:
{
return _winVersion;
}
case NPPM_MAKECURRENTBUFFERDIRTY :
{
_pEditView->setCurrentDocState(true);
_pDocTab->updateCurrentTabItem();
checkDocState();
synchronise();
return TRUE;
}
case NPPM_GETENABLETHEMETEXTUREFUNC :
{
return (LRESULT)pNppParam->getEnableThemeDlgTexture();
}
case NPPM_GETPLUGINSCONFIGDIR :
{
if (!lParam || !wParam)
return FALSE;
const char *pluginsConfigDirPrefix = pNppParam->getAppDataNppDir();
if (!pluginsConfigDirPrefix[0])
pluginsConfigDirPrefix = pNppParam->getNppPath();
const char *secondPart = "plugins\\Config";
size_t len = (size_t)wParam;
if (len < strlen(pluginsConfigDirPrefix) + strlen(secondPart))
return FALSE;
char *pluginsConfigDir = (char *)lParam;
strcpy(pluginsConfigDir, pluginsConfigDirPrefix);
::PathAppend(pluginsConfigDir, secondPart);
return TRUE;
}
case NPPM_MSGTOPLUGIN :
{
return _pluginsManager.relayPluginMessages(Message, wParam, lParam);
}
case NPPM_HIDETABBAR :
{
bool hide = (lParam != 0);
bool oldVal = _mainDocTab.setHideTabBarStatus(hide);
_subDocTab.setHideTabBarStatus(hide);
::SendMessage(_hSelf, WM_SIZE, 0, 0);
NppGUI & nppGUI = (NppGUI &)((NppParameters::getInstance())->getNppGUI());
if (hide)
nppGUI._tabStatus |= TAB_HIDE;
else
nppGUI._tabStatus &= ~TAB_HIDE;
return oldVal;
}
case NPPM_ISTABBARHIDE :
{
return _mainDocTab.getHideTabBarStatus();
}
case NPPM_ADDREBAR :
{
if (!lParam)
return FALSE;
_rebarTop.addBand((REBARBANDINFO*)lParam, false);
return TRUE;
}
case NPPM_UPDATEREBAR :
{
if (!lParam || wParam < REBAR_BAR_EXTERNAL)
return FALSE;
_rebarTop.reNew((int)wParam, (REBARBANDINFO*)lParam);
return TRUE;
}
case NPPM_REMOVEREBAR :
{
if (wParam < REBAR_BAR_EXTERNAL)
return FALSE;
_rebarTop.removeBand((int)wParam);
return TRUE;
}
case NPPM_INTERNAL_ISFOCUSEDTAB :
{
ScintillaEditView *cv = getCurrentEditView();
HWND pMainTB = (_mainDocTab.getView() == cv)?_mainDocTab.getHSelf():_subDocTab.getHSelf();
return (HWND)lParam == pMainTB;
}
case NPPM_INTERNAL_GETMENU :
{
return (LRESULT)_mainMenuHandle;
}
case WM_INITMENUPOPUP:
{
_windowsMenu.initPopupMenu((HMENU)wParam, _pEditView);
return TRUE;
}
case WM_ENTERMENULOOP:
{
NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI());
if (!nppgui._menuBarShow && !wParam && !_sysMenuEntering)
::SetMenu(_hSelf, _mainMenuHandle);
return TRUE;
}
case WM_EXITMENULOOP:
{
NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI());
if (!nppgui._menuBarShow && !wParam && !_sysMenuEntering)
::SetMenu(_hSelf, NULL);
_sysMenuEntering = false;
return FALSE;
}
default:
{
if (Message == WDN_NOTIFY)
{
NMWINDLG* nmdlg = (NMWINDLG*)lParam;
switch (nmdlg->type)
{
case WDT_ACTIVATE:
activateDoc(nmdlg->curSel);
nmdlg->processed = TRUE;
break;
case WDT_SAVE:
{
int origPos = _pEditView->getCurrentDocIndex();
for (int i=0, n=nmdlg->nItems; i<n; ++i) {
activateDoc(nmdlg->Items[i]);
fileSave();
}
activateDoc(origPos);
nmdlg->processed = TRUE;
}
break;
case WDT_CLOSE:
{
for (int i=0, n=nmdlg->nItems; i<n; ++i) {
UINT pos = nmdlg->Items[i];
activateDoc(pos);
if (!fileClose())
break;
for (int j=i+1; j<n; ++j)
if (nmdlg->Items[j] > pos)
--nmdlg->Items[j];
nmdlg->Items[i] = 0xFFFFFFFF; // indicate file was closed
}
nmdlg->processed = TRUE;
}
break;
case WDT_SORT:
_pEditView->arrangeBuffers(nmdlg->nItems, nmdlg->Items);
nmdlg->processed = TRUE;
for (int i = _pEditView->getNbDoc()-1 ; i >= 0 ; --i)
{
Buffer & docBuf = _pEditView->getBufferAt(i);
_pDocTab->updateTabItem(i, PathFindFileName(docBuf.getFileName()));
}
activateDoc(nmdlg->curSel);
break;
}
return TRUE;
}
return ::DefWindowProc(hwnd, Message, wParam, lParam);
}
}
_pluginsManager.relayNppMessages(Message, wParam, lParam);
return result;
}
LRESULT CALLBACK Notepad_plus::Notepad_plus_Proc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
static bool isFirstGetMinMaxInfoMsg = true;
switch(Message)
{
case WM_NCCREATE : // First message we get the ptr of instantiated object
// then stock it into GWL_USERDATA index in order to retrieve afterward
{
Notepad_plus *pM30ide = (Notepad_plus *)(((LPCREATESTRUCT)lParam)->lpCreateParams);
pM30ide->_hSelf = hwnd;
::SetWindowLong(hwnd, GWL_USERDATA, (LONG)pM30ide);
return TRUE;
}
default :
{
return ((Notepad_plus *)::GetWindowLong(hwnd, GWL_USERDATA))->runProc(hwnd, Message, wParam, lParam);
}
}
}
void Notepad_plus::fullScreenToggle()
{
HMONITOR currentMonitor; //Handle to monitor where fullscreen should go
MONITORINFO mi; //Info of that monitor
RECT fullscreenArea; //RECT used to calculate window fullscrene size
_isfullScreen = !_isfullScreen;
if (_isfullScreen)
{
_winPlace.length = sizeof(_winPlace);
::GetWindowPlacement(_hSelf, &_winPlace);
//Preset view area, in case something fails, primary monitor values
fullscreenArea.top = 0;
fullscreenArea.left = 0;
fullscreenArea.right = GetSystemMetrics(SM_CXSCREEN);
fullscreenArea.bottom = GetSystemMetrics(SM_CYSCREEN);
//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
mi.cbSize = sizeof(MONITORINFO);
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);
//Hide rebar
_rebarTop.display(false);
_rebarBottom.display(false);
//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;
}
//Set topmost window, show the window and redraw it
::SetWindowPos(_hSelf, HWND_TOPMOST, fullscreenArea.left, fullscreenArea.top, fullscreenArea.right, fullscreenArea.bottom, SWP_NOZORDER);
::ShowWindow(_hSelf, SW_SHOW);
::SendMessage(_hSelf, WM_SIZE, 0, 0);
}
else
{
//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);
//Show rebar
_rebarTop.display(true);
_rebarBottom.display(true);
if (_winPlace.length)
{
if (_winPlace.showCmd == SW_SHOWMAXIMIZED)
{
::ShowWindow(_hSelf, SW_RESTORE);
::ShowWindow(_hSelf, SW_SHOWMAXIMIZED);
}
else
{
::SetWindowPlacement(_hSelf, &_winPlace);
::SendMessage(_hSelf, WM_SIZE, 0, 0);
}
}
else //fallback
{
::ShowWindow(_hSelf, SW_SHOW);
}
}
::SetForegroundWindow(_hSelf);
}
void Notepad_plus::doSynScorll(HWND whichView)
{
int column = 0;
int line = 0;
ScintillaEditView *pView;
// var for Line
int mainCurrentLine, subCurrentLine;
// var for Column
int mxoffset, sxoffset;
int pixel;
int mainColumn, subColumn;
if (whichView == _mainEditView.getHSelf())
{
if (_syncInfo._isSynScollV)
{
// Compute for Line
mainCurrentLine = _mainEditView.execute(SCI_GETFIRSTVISIBLELINE);
subCurrentLine = _subEditView.execute(SCI_GETFIRSTVISIBLELINE);
line = mainCurrentLine - _syncInfo._line - subCurrentLine;
}
if (_syncInfo._isSynScollH)
{
// Compute for Column
mxoffset = _mainEditView.execute(SCI_GETXOFFSET);
pixel = int(_mainEditView.execute(SCI_TEXTWIDTH, STYLE_DEFAULT, (LPARAM)"P"));
mainColumn = mxoffset/pixel;
sxoffset = _subEditView.execute(SCI_GETXOFFSET);
pixel = int(_subEditView.execute(SCI_TEXTWIDTH, STYLE_DEFAULT, (LPARAM)"P"));
subColumn = sxoffset/pixel;
column = mainColumn - _syncInfo._column - subColumn;
}
pView = &_subEditView;
}
else if (whichView == _subEditView.getHSelf())
{
if (_syncInfo._isSynScollV)
{
// Compute for Line
mainCurrentLine = _mainEditView.execute(SCI_GETFIRSTVISIBLELINE);
subCurrentLine = _subEditView.execute(SCI_GETFIRSTVISIBLELINE);
line = subCurrentLine + _syncInfo._line - mainCurrentLine;
}
if (_syncInfo._isSynScollH)
{
// Compute for Column
mxoffset = _mainEditView.execute(SCI_GETXOFFSET);
pixel = int(_mainEditView.execute(SCI_TEXTWIDTH, STYLE_DEFAULT, (LPARAM)"P"));
mainColumn = mxoffset/pixel;
sxoffset = _subEditView.execute(SCI_GETXOFFSET);
pixel = int(_subEditView.execute(SCI_TEXTWIDTH, STYLE_DEFAULT, (LPARAM)"P"));
subColumn = sxoffset/pixel;
column = subColumn + _syncInfo._column - mainColumn;
}
pView = &_mainEditView;
}
else
return;
pView->scroll(column, line);
}
bool Notepad_plus::getIntegralDockingData(tTbData & dockData, int & iCont, bool & isVisible)
{
DockingManagerData & dockingData = (DockingManagerData &)(NppParameters::getInstance())->getNppGUI()._dockingData;
for (size_t i = 0 ; i < dockingData._pluginDockInfo.size() ; i++)
{
const PlugingDlgDockingInfo & pddi = dockingData._pluginDockInfo[i];
if (!stricmp(pddi._name, dockData.pszModuleName) && (pddi._internalID == dockData.dlgID))
{
iCont = pddi._currContainer;
isVisible = pddi._isVisible;
dockData.iPrevCont = pddi._prevContainer;
if (dockData.iPrevCont != -1)
{
int cont = (pddi._currContainer < DOCKCONT_MAX ? pddi._prevContainer : pddi._currContainer);
RECT *pRc = dockingData.getFloatingRCFrom(cont);
if (pRc)
dockData.rcFloat = *pRc;
}
return true;
}
}
return false;
}
void Notepad_plus::getCurrentOpenedFiles(Session & session)
{
_pEditView->saveCurrentPos();
session._activeView = getCurrentView();
int currentDocIndex = session._activeMainIndex = _mainEditView.getCurrentDocIndex();
//int currentDocIndex = _mainEditView.getCurrentDocIndex();
for (size_t i = 0 ; i < _mainEditView.getNbDoc() ; i++)
{
const Buffer & buf = _mainEditView.getBufferAt((size_t)i);
if (!Buffer::isUntitled(buf._fullPathName) && PathFileExists(buf._fullPathName))
{
string languageName = getLangFromMenu( buf );
const char *langName = languageName.c_str();
sessionFileInfo sfi(buf._fullPathName, langName, buf._pos);
_mainEditView.activateDocAt(i);
int maxLine = _mainEditView.execute(SCI_GETLINECOUNT);
for (int j = 0 ; j < maxLine ; j++)
{
if ((_mainEditView.execute(SCI_MARKERGET, j)&(1 << MARK_BOOKMARK)) != 0)
{
sfi.marks.push_back(j);
}
}
session._mainViewFiles.push_back(sfi);
}
}
_mainEditView.activateDocAt(currentDocIndex);
session._activeSubIndex = _subEditView.getCurrentDocIndex();
currentDocIndex = _subEditView.getCurrentDocIndex();
for (size_t i = 0 ; i < _subEditView.getNbDoc() ; i++)
{
const Buffer & buf = _subEditView.getBufferAt((size_t)i);
if (PathFileExists(buf._fullPathName))
{
string languageName = getLangFromMenu( buf );
const char *langName = languageName.c_str();
sessionFileInfo sfi(buf._fullPathName, langName, buf._pos);
_subEditView.activateDocAt(i);
int maxLine = _subEditView.execute(SCI_GETLINECOUNT);
for (int j = 0 ; j < maxLine ; j++)
{
if ((_subEditView.execute(SCI_MARKERGET, j)&(1 << MARK_BOOKMARK)) != 0)
{
sfi.marks.push_back(j);
}
}
session._subViewFiles.push_back(sfi);
}
}
_subEditView.activateDocAt(currentDocIndex);
}
bool Notepad_plus::fileLoadSession(const char *fn)
{
bool result = false;
const char *sessionFileName = NULL;
if (fn == NULL)
{
FileDialog fDlg(_hSelf, _hInst);
fDlg.setExtFilter("All types", ".*", NULL);
const char *ext = NppParameters::getInstance()->getNppGUI()._definedSessionExt.c_str();
string sessionExt = "";
if (*ext != '\0')
{
if (*ext != '.')
sessionExt += ".";
sessionExt += ext;
fDlg.setExtFilter("Session file", sessionExt.c_str(), NULL);
}
sessionFileName = fDlg.doOpenSingleFileDlg();
}
else
{
if (PathFileExists(fn))
sessionFileName = fn;
}
if (sessionFileName)
{
bool isAllSuccessful = true;
Session session2Load;
if ((NppParameters::getInstance())->loadSession(session2Load, sessionFileName))
{
isAllSuccessful = loadSession(session2Load);
result = true;
}
if (!isAllSuccessful)
(NppParameters::getInstance())->writeSession(session2Load, sessionFileName);
}
return result;
}
const char * Notepad_plus::fileSaveSession(size_t nbFile, char ** fileNames, const char *sessionFile2save)
{
if (sessionFile2save)
{
Session currentSession;
if ((nbFile) && (!fileNames))
{
for (size_t i = 0 ; i < nbFile ; i++)
{
if (PathFileExists(fileNames[i]))
currentSession._mainViewFiles.push_back(string(fileNames[i]));
}
}
else
getCurrentOpenedFiles(currentSession);
(NppParameters::getInstance())->writeSession(currentSession, sessionFile2save);
return sessionFile2save;
}
return NULL;
}
const char * Notepad_plus::fileSaveSession(size_t nbFile, char ** fileNames)
{
const char *sessionFileName = NULL;
FileDialog fDlg(_hSelf, _hInst);
const char *ext = NppParameters::getInstance()->getNppGUI()._definedSessionExt.c_str();
fDlg.setExtFilter("All types", ".*", NULL);
string sessionExt = "";
if (*ext != '\0')
{
if (*ext != '.')
sessionExt += ".";
sessionExt += ext;
fDlg.setExtFilter("Session file", sessionExt.c_str(), NULL);
}
sessionFileName = fDlg.doSaveDlg();
return fileSaveSession(nbFile, fileNames, sessionFileName);
}
bool Notepad_plus::str2Cliboard(const char *str2cpy)
{
if (!str2cpy)
return false;
if (!::OpenClipboard(_hSelf))
return false;
::EmptyClipboard();
HGLOBAL hglbCopy = ::GlobalAlloc(GMEM_MOVEABLE, strlen(str2cpy) + 1);
if (hglbCopy == NULL)
{
::CloseClipboard();
return false;
}
// Lock the handle and copy the text to the buffer.
char *pStr = (char *)::GlobalLock(hglbCopy);
strcpy(pStr, str2cpy);
::GlobalUnlock(hglbCopy);
// Place the handle on the clipboard.
::SetClipboardData(CF_TEXT, hglbCopy);
::CloseClipboard();
return true;
}
void Notepad_plus::markSelectedText()
{
const NppGUI & nppGUI = (NppParameters::getInstance())->getNppGUI();
if (!nppGUI._enableSmartHilite)
return;
//Get selection
CharacterRange range = _pEditView->getSelection();
//Dont mark if the selection has not changed.
if (range.cpMin == _prevSelectedRange.cpMin && range.cpMax == _prevSelectedRange.cpMax)
{
return;
}
_prevSelectedRange = range;
//Clear marks
_pEditView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_2);
//If nothing selected, dont mark anything
if (range.cpMin == range.cpMax)
{
return;
}
char text2Find[MAX_PATH];
_pEditView->getSelectedText(text2Find, sizeof(text2Find), false); //do not expand selection (false)
if (!isQualifiedWord(text2Find))
return;
else
{
unsigned char c = (unsigned char)_pEditView->execute(SCI_GETCHARAT, range.cpMax);
if (c)
{
if (isWordChar(char(c)))
return;
}
}
_findReplaceDlg.markAll2(text2Find);
}
void Notepad_plus::markSelectedTextInc(bool enable)
{
if (!enable)
{//printStr("out");
_pEditView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_INC);
return;
}
//Get selection
CharacterRange range = _pEditView->getSelection();
//Dont mark if the selection has not changed.
if (range.cpMin == _prevSelectedRange.cpMin && range.cpMax == _prevSelectedRange.cpMax)
{
_pEditView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_INC);
return;
}
//Clear marks
_pEditView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_INC);
//If nothing selected, dont mark anything
if (range.cpMin == range.cpMax)
{
return;
}
char text2Find[MAX_PATH];
_pEditView->getSelectedText(text2Find, sizeof(text2Find), false); //do not expand selection (false)
_findReplaceDlg.markAllInc(text2Find);
}