📄 notepad_plus.cpp.svn-base
字号:
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;
}
}
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::fileOpen()
{
FileDialog fDlg(_hSelf, _hInst);
fDlg.setExtFilter("All types", ".*", NULL);
NppParameters *pNppParam = NppParameters::getInstance();
NppGUI & nppGUI = (NppGUI & )pNppParam->getNppGUI();
int i = 0;
Lang *l = NppParameters::getInstance()->getLangFromIndex(i++);
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])
fDlg.setExtsFilter(getLangDesc(lid, true).c_str(), filters);
}
l = (NppParameters::getInstance())->getLangFromIndex(i++);
}
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());
setLangStatus(_pEditView->getCurrentDocType());
}
}
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)
{
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);
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(<ime);
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(REPLACE_ALL, isEntireDoc);
_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(REPLACE_ALL, isEntireDoc);
_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::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 (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 (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() == "")
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -