New feature: File browser
This commit is contained in:
parent
576de36a12
commit
07ce6c2516
@ -885,5 +885,13 @@ bool str2Clipboard(const generic_string &str2cpy, HWND hwnd)
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool matchInList(const TCHAR *fileName, const std::vector<generic_string> & patterns)
|
||||
{
|
||||
for (size_t i = 0, len = patterns.size(); i < len; ++i)
|
||||
{
|
||||
if (PathMatchSpec(fileName, patterns[i].c_str()))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -88,7 +88,7 @@ generic_string BuildMenuFileName(int filenameLen, unsigned int pos, const generi
|
||||
std::string getFileContent(const TCHAR *file2read);
|
||||
generic_string relativeFilePathToFullFilePath(const TCHAR *relativeFilePath);
|
||||
void writeFileContent(const TCHAR *file2write, const char *content2write);
|
||||
|
||||
bool matchInList(const TCHAR *fileName, const std::vector<generic_string> & patterns);
|
||||
|
||||
class WcharMbcsConvertor final
|
||||
{
|
||||
|
@ -27,7 +27,7 @@
|
||||
|
||||
|
||||
#include "Parameters.h"
|
||||
#include "Process.h"
|
||||
#include "Processus.h"
|
||||
|
||||
|
||||
void Process::run()
|
@ -29,6 +29,8 @@
|
||||
#ifndef PROCESSUS_H
|
||||
#define PROCESSUS_H
|
||||
|
||||
#include "common.h"
|
||||
|
||||
enum progType {WIN32_PROG, CONSOLE_PROG};
|
||||
|
||||
class Process
|
@ -47,6 +47,7 @@
|
||||
#include "ProjectPanel.h"
|
||||
#include "documentMap.h"
|
||||
#include "functionListPanel.h"
|
||||
#include "fileBrowser.h"
|
||||
#include "LongRunningOperation.h"
|
||||
|
||||
using namespace std;
|
||||
@ -193,6 +194,7 @@ Notepad_plus::~Notepad_plus()
|
||||
delete _pProjectPanel_3;
|
||||
delete _pDocMap;
|
||||
delete _pFuncList;
|
||||
delete _pFileBrowser;
|
||||
}
|
||||
|
||||
LRESULT Notepad_plus::init(HWND hwnd)
|
||||
@ -1090,16 +1092,6 @@ bool Notepad_plus::replaceInOpenedFiles() {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Notepad_plus::matchInList(const TCHAR *fileName, const vector<generic_string> & patterns)
|
||||
{
|
||||
for (size_t i = 0, len = patterns.size() ; i < len ; ++i)
|
||||
{
|
||||
if (PathMatchSpec(fileName, patterns[i].c_str()))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void Notepad_plus::wsTabConvert(spaceTab whichWay)
|
||||
{
|
||||
@ -1435,7 +1427,6 @@ void Notepad_plus::getMatchedFileNames(const TCHAR *dir, const vector<generic_st
|
||||
::FindClose(hFile);
|
||||
}
|
||||
|
||||
|
||||
bool Notepad_plus::replaceInFiles()
|
||||
{
|
||||
const TCHAR *dir2Search = _findReplaceDlg.getDir2Search();
|
||||
@ -2969,18 +2960,84 @@ void Notepad_plus::dropFiles(HDROP hdrop)
|
||||
|
||||
int filesDropped = ::DragQueryFile(hdrop, 0xffffffff, NULL, 0);
|
||||
BufferID lastOpened = BUFFER_INVALID;
|
||||
for (int i = 0 ; i < filesDropped ; ++i)
|
||||
|
||||
vector<generic_string> folderPaths;
|
||||
vector<generic_string> filePaths;
|
||||
for (int i = 0; i < filesDropped; ++i)
|
||||
{
|
||||
TCHAR pathDropped[MAX_PATH];
|
||||
::DragQueryFile(hdrop, i, pathDropped, MAX_PATH);
|
||||
if (::PathIsDirectory(pathDropped))
|
||||
{
|
||||
size_t len = lstrlen(pathDropped);
|
||||
if (len > 0 && pathDropped[len - 1] != TCHAR('\\'))
|
||||
{
|
||||
pathDropped[len] = TCHAR('\\');
|
||||
pathDropped[len + 1] = TCHAR('\0');
|
||||
}
|
||||
folderPaths.push_back(pathDropped);
|
||||
}
|
||||
else
|
||||
{
|
||||
filePaths.push_back(pathDropped);
|
||||
}
|
||||
}
|
||||
|
||||
bool isOldMode = false;
|
||||
|
||||
if (isOldMode || folderPaths.size() == 0) // old mode or new mode + only files
|
||||
{
|
||||
|
||||
BufferID lastOpened = BUFFER_INVALID;
|
||||
for (int i = 0; i < filesDropped; ++i)
|
||||
{
|
||||
TCHAR pathDropped[MAX_PATH];
|
||||
::DragQueryFile(hdrop, i, pathDropped, MAX_PATH);
|
||||
BufferID test = doOpen(pathDropped);
|
||||
if (test != BUFFER_INVALID)
|
||||
lastOpened = test;
|
||||
//setLangStatus(_pEditView->getCurrentDocType());
|
||||
}
|
||||
if (lastOpened != BUFFER_INVALID) {
|
||||
switchToFile(lastOpened);
|
||||
}
|
||||
}
|
||||
else if (not isOldMode && (folderPaths.size() != 0 && filePaths.size() != 0)) // new mode && both folders & files
|
||||
{
|
||||
// display error & do nothing
|
||||
}
|
||||
else if (not isOldMode && (folderPaths.size() != 0 && filePaths.size() == 0)) // new mode && only folders
|
||||
{
|
||||
launchFileBrowser();
|
||||
|
||||
// process new mode
|
||||
|
||||
for (int i = 0; i < filesDropped; ++i)
|
||||
{
|
||||
_pFileBrowser->addRootFolder(folderPaths[i]);
|
||||
}
|
||||
|
||||
/*
|
||||
for (int i = 0; i < filesDropped; ++i)
|
||||
{
|
||||
if (not _pFileBrowser->isAlreadyExist(folderPaths[i]))
|
||||
{
|
||||
vector<generic_string> patterns2Match;
|
||||
patterns2Match.push_back(TEXT("*.*"));
|
||||
|
||||
FolderInfo directoryStructure;
|
||||
getDirectoryStructure(folderPaths[i].c_str(), patterns2Match, directoryStructure, true, false);
|
||||
_pFileBrowser->setDirectoryStructure(directoryStructure);
|
||||
}
|
||||
int j = 0;
|
||||
j++;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
if (lastOpened != BUFFER_INVALID)
|
||||
{
|
||||
switchToFile(lastOpened);
|
||||
}
|
||||
::DragFinish(hdrop);
|
||||
// Put Notepad_plus to forefront
|
||||
// May not work for Win2k, but OK for lower versions
|
||||
@ -4607,6 +4664,7 @@ void Notepad_plus::notifyBufferChanged(Buffer * buffer, int mask)
|
||||
|
||||
// Then we ask user to update
|
||||
didDialog = true;
|
||||
|
||||
if (doReloadOrNot(buffer->getFullPathName(), buffer->isDirty()) != IDYES)
|
||||
break; //abort
|
||||
}
|
||||
@ -5294,6 +5352,45 @@ void Notepad_plus::launchAnsiCharPanel()
|
||||
_pAnsiCharPanel->display();
|
||||
}
|
||||
|
||||
void Notepad_plus::launchFileBrowser()
|
||||
{
|
||||
if (!_pFileBrowser)
|
||||
{
|
||||
_pFileBrowser = new FileBrowser;
|
||||
_pFileBrowser->init(_pPublicInterface->getHinst(), _pPublicInterface->getHSelf());
|
||||
|
||||
tTbData data;
|
||||
memset(&data, 0, sizeof(data));
|
||||
_pFileBrowser->create(&data);
|
||||
data.pszName = TEXT("ST");
|
||||
|
||||
::SendMessage(_pPublicInterface->getHSelf(), NPPM_MODELESSDIALOG, MODELESSDIALOGREMOVE, (WPARAM)_pFileBrowser->getHSelf());
|
||||
// define the default docking behaviour
|
||||
data.uMask = DWS_DF_CONT_LEFT | DWS_ICONTAB;
|
||||
data.hIconTab = (HICON)::LoadImage(_pPublicInterface->getHinst(), MAKEINTRESOURCE(IDR_PROJECTPANEL_ICO), IMAGE_ICON, 14, 14, LR_LOADMAP3DCOLORS | LR_LOADTRANSPARENT);
|
||||
data.pszModuleName = NPP_INTERNAL_FUCTION_STR;
|
||||
|
||||
NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance())->getNativeLangSpeaker();
|
||||
generic_string title_temp = pNativeSpeaker->getAttrNameStr(PM_PROJECTPANELTITLE, "FileBrowser", "PanelTitle");
|
||||
|
||||
static TCHAR title[32];
|
||||
if (title_temp.length() < 32)
|
||||
{
|
||||
lstrcpy(title, title_temp.c_str());
|
||||
data.pszName = title;
|
||||
}
|
||||
::SendMessage(_pPublicInterface->getHSelf(), NPPM_DMMREGASDCKDLG, 0, (LPARAM)&data);
|
||||
|
||||
COLORREF fgColor = (NppParameters::getInstance())->getCurrentDefaultFgColor();
|
||||
COLORREF bgColor = (NppParameters::getInstance())->getCurrentDefaultBgColor();
|
||||
|
||||
_pFileBrowser->setBackgroundColor(bgColor);
|
||||
_pFileBrowser->setForegroundColor(fgColor);
|
||||
}
|
||||
|
||||
_pFileBrowser->display();
|
||||
}
|
||||
|
||||
|
||||
void Notepad_plus::launchProjectPanel(int cmdID, ProjectPanel ** pProjPanel, int panelID)
|
||||
{
|
||||
|
@ -105,7 +105,7 @@
|
||||
#endif //DOCKINGMANAGER_H
|
||||
|
||||
#ifndef PROCESSUS_H
|
||||
#include "Process.h"
|
||||
#include "Processus.h"
|
||||
#endif //PROCESSUS_H
|
||||
|
||||
#ifndef AUTOCOMPLETION_H
|
||||
@ -195,9 +195,7 @@ class VerticalFileSwitcher;
|
||||
class ProjectPanel;
|
||||
class DocumentMap;
|
||||
class FunctionListPanel;
|
||||
|
||||
|
||||
|
||||
class FileBrowser;
|
||||
|
||||
|
||||
class Notepad_plus final
|
||||
@ -421,6 +419,8 @@ private:
|
||||
ProjectPanel* _pProjectPanel_2 = nullptr;
|
||||
ProjectPanel* _pProjectPanel_3 = nullptr;
|
||||
|
||||
FileBrowser* _pFileBrowser = nullptr;
|
||||
|
||||
DocumentMap* _pDocMap = nullptr;
|
||||
FunctionListPanel* _pFuncList = nullptr;
|
||||
|
||||
@ -589,9 +589,7 @@ private:
|
||||
bool findInOpenedFiles();
|
||||
bool findInCurrentFile();
|
||||
|
||||
bool matchInList(const TCHAR *fileName, const std::vector<generic_string> & patterns);
|
||||
void getMatchedFileNames(const TCHAR *dir, const std::vector<generic_string> & patterns, std::vector<generic_string> & fileNames, bool isRecursive, bool isInHiddenDir);
|
||||
|
||||
void doSynScorll(HWND hW);
|
||||
void setWorkingDir(const TCHAR *dir);
|
||||
bool str2Cliboard(const generic_string & str2cpy);
|
||||
@ -623,6 +621,7 @@ private:
|
||||
void launchProjectPanel(int cmdID, ProjectPanel ** pProjPanel, int panelID);
|
||||
void launchDocMap();
|
||||
void launchFunctionList();
|
||||
void launchFileBrowser();
|
||||
void showAllQuotes() const;
|
||||
static DWORD WINAPI threadTextPlayer(void *text2display);
|
||||
static DWORD WINAPI threadTextTroller(void *params);
|
||||
@ -640,6 +639,8 @@ private:
|
||||
}
|
||||
|
||||
static DWORD WINAPI backupDocument(void *params);
|
||||
//static DWORD WINAPI monitorFileOnChange(void * params);
|
||||
//static DWORD WINAPI monitorDirectoryOnChange(void * params);
|
||||
};
|
||||
|
||||
|
||||
|
@ -37,8 +37,117 @@
|
||||
|
||||
using namespace std;
|
||||
|
||||
/*
|
||||
struct monitorFileParams {
|
||||
WCHAR _fullFilePath[MAX_PATH];
|
||||
};
|
||||
|
||||
DWORD WINAPI Notepad_plus::monitorFileOnChange(void * params)
|
||||
{
|
||||
monitorFileParams *mfp = (monitorFileParams *)params;
|
||||
|
||||
//Le répertoire à surveiller :
|
||||
WCHAR folderToMonitor[MAX_PATH];
|
||||
//::MessageBoxW(NULL, mfp->_fullFilePath, TEXT("PATH AFTER thread"), MB_OK);
|
||||
lstrcpy(folderToMonitor, mfp->_fullFilePath);
|
||||
|
||||
|
||||
//::PathRemoveFileSpecW(folderToMonitor);
|
||||
|
||||
HANDLE hDirectory = ::CreateFile(folderToMonitor,
|
||||
FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||
NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
|
||||
|
||||
// buffer qui va récuppérer les informations de mise à jour
|
||||
const int MAX_BUFFER = 1024;
|
||||
BYTE buffer[MAX_BUFFER];
|
||||
DWORD nombreDeByteRetournes = 0;
|
||||
|
||||
bool cond = true;
|
||||
while (cond)
|
||||
{
|
||||
::Sleep(1000);
|
||||
// surveille un changement dans le répertoire : il attend tant que rien ne se passe : c’est synchrone.
|
||||
BOOL res = ReadDirectoryChangesW(hDirectory, buffer, MAX_BUFFER,
|
||||
TRUE, FILE_NOTIFY_CHANGE_LAST_WRITE, &nombreDeByteRetournes, NULL, NULL);
|
||||
|
||||
if (res == FALSE)
|
||||
continue;
|
||||
|
||||
// puis on transforme le buffer pour être lisible.
|
||||
FILE_NOTIFY_INFORMATION *notifyInfo = (FILE_NOTIFY_INFORMATION *)buffer;
|
||||
|
||||
wchar_t fn[MAX_PATH];
|
||||
memset(fn, 0, MAX_PATH*sizeof(wchar_t));
|
||||
if (notifyInfo->Action != FILE_ACTION_MODIFIED)
|
||||
continue;
|
||||
|
||||
// affiche le fichier qui a été modifié.
|
||||
if (notifyInfo->FileNameLength <= 0)
|
||||
continue;
|
||||
|
||||
TCHAR str2Display[512];
|
||||
generic_strncpy(fn, notifyInfo->FileName, notifyInfo->FileNameLength / sizeof(wchar_t));
|
||||
generic_sprintf(str2Display, TEXT("offset : %d\raction : %d\rfn len : %d\rfn : %s"), notifyInfo->NextEntryOffset, notifyInfo->Action, notifyInfo->FileNameLength, notifyInfo->FileName);
|
||||
// on peut vérifier avec ceci :
|
||||
//printInt(notifyInfo->NextEntryOffset);
|
||||
//printInt(notifyInfo->FileNameLength);
|
||||
MessageBox(NULL, str2Display, TEXT("name"), MB_OK);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
DWORD WINAPI Notepad_plus::monitorDirectoryOnChange(void * params)
|
||||
{
|
||||
monitorFileParams *mfp = (monitorFileParams *)params;
|
||||
|
||||
//Le répertoire à surveiller :
|
||||
WCHAR folderToMonitor[MAX_PATH];
|
||||
//::MessageBoxW(NULL, mfp->_fullFilePath, TEXT("PATH AFTER thread"), MB_OK);
|
||||
lstrcpy(folderToMonitor, mfp->_fullFilePath);
|
||||
|
||||
|
||||
//::PathRemoveFileSpecW(folderToMonitor);
|
||||
|
||||
HANDLE hDirectory = ::CreateFile(folderToMonitor,
|
||||
FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
||||
NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL);
|
||||
|
||||
// buffer qui va récuppérer les informations de mise à jour
|
||||
const int MAX_BUFFER = 1024;
|
||||
BYTE buffer[MAX_BUFFER];
|
||||
DWORD nombreDeByteRetournes = 0;
|
||||
|
||||
bool cond = true;
|
||||
while (cond)
|
||||
{
|
||||
::Sleep(1000);
|
||||
// surveille un changement dans le répertoire : il attend tant que rien ne se passe : c’est synchrone.
|
||||
ReadDirectoryChangesW(hDirectory, buffer, MAX_BUFFER,
|
||||
TRUE, FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_FILE_NAME, &nombreDeByteRetournes, NULL, NULL);
|
||||
// puis on transforme le buffer pour être lisible.
|
||||
FILE_NOTIFY_INFORMATION *notifyInfo = (FILE_NOTIFY_INFORMATION *)buffer;
|
||||
|
||||
wchar_t fn[MAX_PATH];
|
||||
memset(fn, 0, MAX_PATH*sizeof(wchar_t));
|
||||
|
||||
//if (notifyInfo->Action != FILE_ACTION_MODIFIED)
|
||||
if (notifyInfo->Action != FILE_ACTION_ADDED && notifyInfo->Action != FILE_ACTION_REMOVED && notifyInfo->Action != FILE_ACTION_RENAMED_OLD_NAME && notifyInfo->Action != FILE_ACTION_RENAMED_NEW_NAME)
|
||||
continue;
|
||||
|
||||
// affiche le fichier qui a été modifié.
|
||||
//if (notifyInfo->FileNameLength <= 0)
|
||||
//continue;
|
||||
|
||||
generic_strncpy(fn, notifyInfo->FileName, notifyInfo->FileNameLength / sizeof(wchar_t));
|
||||
|
||||
// on peut vérifier avec ceci :
|
||||
//printInt(notifyInfo->FileNameLength);
|
||||
MessageBox(NULL, fn, TEXT("name"), MB_OK);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
*/
|
||||
|
||||
BufferID Notepad_plus::doOpen(const generic_string& fileName, bool isRecursive, bool isReadOnly, int encoding, const TCHAR *backupFileName, time_t fileNameTimestamp)
|
||||
{
|
||||
@ -256,6 +365,20 @@ BufferID Notepad_plus::doOpen(const generic_string& fileName, bool isRecursive,
|
||||
_pluginsManager.notify(&scnN);
|
||||
if (_pFileSwitcherPanel)
|
||||
_pFileSwitcherPanel->newItem(buf, currentView());
|
||||
|
||||
/*
|
||||
if (::PathFileExists(longFileName))
|
||||
{
|
||||
// Thread to
|
||||
monitorFileParams *params = new monitorFileParams;
|
||||
lstrcpy(params->_fullFilePath, longFileName);
|
||||
//::MessageBoxW(NULL, params._fullFilePath, TEXT("PATH b4 thread"), MB_OK);
|
||||
//HANDLE hThread = ::CreateThread(NULL, 0, monitorFileOnChange, params, 0, NULL);
|
||||
HANDLE hThread = ::CreateThread(NULL, 0, monitorFileOnChange, params, 0, NULL);
|
||||
::CloseHandle(hThread);
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
1232
PowerEditor/src/WinControls/FileBrowser/fileBrowser.cpp
Normal file
1232
PowerEditor/src/WinControls/FileBrowser/fileBrowser.cpp
Normal file
File diff suppressed because it is too large
Load Diff
191
PowerEditor/src/WinControls/FileBrowser/fileBrowser.h
Normal file
191
PowerEditor/src/WinControls/FileBrowser/fileBrowser.h
Normal file
@ -0,0 +1,191 @@
|
||||
// This file is part of Notepad++ project
|
||||
// Copyright (C)2003 Don HO <don.h@free.fr>
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// Note that the GPL places important restrictions on "derived works", yet
|
||||
// it does not provide a detailed definition of that term. To avoid
|
||||
// misunderstandings, we consider an application to constitute a
|
||||
// "derivative work" for the purpose of this license if it does any of the
|
||||
// following:
|
||||
// 1. Integrates source code from Notepad++.
|
||||
// 2. Integrates/includes/aggregates Notepad++ into a proprietary executable
|
||||
// installer, such as those produced by InstallShield.
|
||||
// 3. Links to a library or executes a program that does any of the above.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
|
||||
#ifndef FILEBROWSER_H
|
||||
#define FILEBROWSER_H
|
||||
|
||||
//#include <windows.h>
|
||||
#ifndef DOCKINGDLGINTERFACE_H
|
||||
#include "DockingDlgInterface.h"
|
||||
#endif //DOCKINGDLGINTERFACE_H
|
||||
|
||||
#include "TreeView.h"
|
||||
#include "fileBrowser_rc.h"
|
||||
|
||||
#define PM_NEWFOLDERNAME TEXT("Folder Name")
|
||||
#define PM_NEWPROJECTNAME TEXT("Project Name")
|
||||
|
||||
#define PM_SAVEWORKSPACE TEXT("Save")
|
||||
#define PM_SAVEASWORKSPACE TEXT("Save As...")
|
||||
#define PM_SAVEACOPYASWORKSPACE TEXT("Save a Copy As...")
|
||||
#define PM_NEWPROJECTWORKSPACE TEXT("Add New Project")
|
||||
|
||||
#define PM_EDITRENAME TEXT("Rename")
|
||||
#define PM_EDITNEWFOLDER TEXT("Add Folder")
|
||||
#define PM_EDITADDFILES TEXT("Add Files...")
|
||||
#define PM_EDITADDFILESRECUSIVELY TEXT("Add Files from Directory...")
|
||||
#define PM_EDITREMOVE TEXT("Remove\tDEL")
|
||||
#define PM_EDITMODIFYFILE TEXT("Modify File Path")
|
||||
|
||||
#define PM_WORKSPACEMENUENTRY TEXT("Workspace")
|
||||
#define PM_EDITMENUENTRY TEXT("Edit")
|
||||
|
||||
#define PM_MOVEUPENTRY TEXT("Move Up\tCtrl+Up")
|
||||
#define PM_MOVEDOWNENTRY TEXT("Move Down\tCtrl+Down")
|
||||
|
||||
class TiXmlNode;
|
||||
|
||||
class changeInfo final
|
||||
{
|
||||
friend class FolderInfo;
|
||||
public:
|
||||
enum folderChangeAction{
|
||||
add, remove, rename
|
||||
};
|
||||
|
||||
private:
|
||||
bool isFile; // true: file, false: folder
|
||||
generic_string _fullFilePath;
|
||||
std::vector<generic_string> _relativePath;
|
||||
folderChangeAction _action;
|
||||
};
|
||||
|
||||
class FileInfo final
|
||||
{
|
||||
friend class FileBrowser;
|
||||
friend class FolderInfo;
|
||||
|
||||
public:
|
||||
FileInfo(const generic_string & fn) { _path = fn; };
|
||||
generic_string getLabel() { return ::PathFindFileName(_path.c_str()); };
|
||||
|
||||
private:
|
||||
generic_string _path;
|
||||
};
|
||||
|
||||
class FolderInfo final
|
||||
{
|
||||
friend class FileBrowser;
|
||||
friend class FolderUpdater;
|
||||
|
||||
public:
|
||||
void setPath(generic_string dn) { _path = dn; };
|
||||
void addFile(generic_string fn) { _files.push_back(FileInfo(fn)); };
|
||||
void addSubFolder(FolderInfo subDirectoryStructure) { _subFolders.push_back(subDirectoryStructure); };
|
||||
bool compare(const FolderInfo & struct2compare, std::vector<changeInfo> & result);
|
||||
static bool makeDiff(FolderInfo & struct1, FolderInfo & struct2static, std::vector<changeInfo> result);
|
||||
generic_string getLabel();
|
||||
|
||||
private:
|
||||
std::vector<FolderInfo> _subFolders;
|
||||
std::vector<FileInfo> _files;
|
||||
generic_string _path;
|
||||
generic_string _contentHash;
|
||||
};
|
||||
|
||||
enum BrowserNodeType {
|
||||
browserNodeType_root = 0, browserNodeType_folder = 2, browserNodeType_file = 3
|
||||
};
|
||||
|
||||
class FolderUpdater {
|
||||
friend class FileBrowser;
|
||||
public:
|
||||
FolderUpdater(FolderInfo fi, HWND hFileBrowser) : _rootFolder(fi), _hFileBrowser(hFileBrowser) {};
|
||||
~FolderUpdater() {};
|
||||
bool updateTree(changeInfo changeInfo); // postMessage to FileBrowser to upgrade GUI
|
||||
|
||||
void startWatcher();
|
||||
void stopWatcher();
|
||||
|
||||
|
||||
private:
|
||||
FolderInfo _rootFolder;
|
||||
HWND _hFileBrowser = nullptr;
|
||||
bool _toBeContinued = true;
|
||||
HANDLE _watchThreadHandle = nullptr;
|
||||
HANDLE _mutex = nullptr;
|
||||
|
||||
static DWORD WINAPI watching(void *param);
|
||||
};
|
||||
|
||||
class FileBrowser : public DockingDlgInterface {
|
||||
public:
|
||||
FileBrowser(): DockingDlgInterface(IDD_FILEBROWSER) {};
|
||||
~FileBrowser();
|
||||
void init(HINSTANCE hInst, HWND hPere) {
|
||||
DockingDlgInterface::init(hInst, hPere);
|
||||
}
|
||||
|
||||
virtual void display(bool toShow = true) const {
|
||||
DockingDlgInterface::display(toShow);
|
||||
};
|
||||
|
||||
void setParent(HWND parent2set){
|
||||
_hParent = parent2set;
|
||||
};
|
||||
|
||||
virtual void setBackgroundColor(COLORREF bgColour) {
|
||||
TreeView_SetBkColor(_treeView.getHSelf(), bgColour);
|
||||
};
|
||||
virtual void setForegroundColor(COLORREF fgColour) {
|
||||
TreeView_SetTextColor(_treeView.getHSelf(), fgColour);
|
||||
};
|
||||
|
||||
void addRootFolder(generic_string);
|
||||
|
||||
protected:
|
||||
TreeView _treeView;
|
||||
HIMAGELIST _hImaLst;
|
||||
HWND _hToolbarMenu = NULL;
|
||||
HMENU _hWorkSpaceMenu = NULL;
|
||||
HMENU _hProjectMenu = NULL;
|
||||
HMENU _hFolderMenu = NULL;
|
||||
HMENU _hFileMenu = NULL;
|
||||
std::vector<FolderUpdater> _folderUpdaters;
|
||||
|
||||
void initMenus();
|
||||
void destroyMenus();
|
||||
BOOL setImageList(int root_clean_id, int root_dirty_id, int project_id, int open_node_id, int closed_node_id, int leaf_id, int ivalid_leaf_id);
|
||||
void addFiles(HTREEITEM hTreeItem);
|
||||
void recursiveAddFilesFrom(const TCHAR *folderPath, HTREEITEM hTreeItem);
|
||||
HTREEITEM addFolder(HTREEITEM hTreeItem, const TCHAR *folderName);
|
||||
|
||||
generic_string getRelativePath(const generic_string & fn, const TCHAR *workSpaceFileName);
|
||||
void buildProjectXml(TiXmlNode *root, HTREEITEM hItem, const TCHAR* fn2write);
|
||||
BrowserNodeType getNodeType(HTREEITEM hItem);
|
||||
void popupMenuCmd(int cmdID);
|
||||
POINT getMenuDisplayPoint(int iButton);
|
||||
virtual INT_PTR CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam);
|
||||
void notified(LPNMHDR notification);
|
||||
void showContextMenu(int x, int y);
|
||||
void openSelectFile();
|
||||
void getDirectoryStructure(const TCHAR *dir, const std::vector<generic_string> & patterns, FolderInfo & directoryStructure, bool isRecursive, bool isInHiddenDir);
|
||||
HTREEITEM createFolderItemsFromDirStruct(HTREEITEM hParentItem, const FolderInfo & directoryStructure);
|
||||
};
|
||||
|
||||
#endif // FILEBROWSER_H
|
52
PowerEditor/src/WinControls/FileBrowser/fileBrowser.rc
Normal file
52
PowerEditor/src/WinControls/FileBrowser/fileBrowser.rc
Normal file
@ -0,0 +1,52 @@
|
||||
// This file is part of Notepad++ project
|
||||
// Copyright (C)2003 Don HO <don.h@free.fr>
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// Note that the GPL places important restrictions on "derived works", yet
|
||||
// it does not provide a detailed definition of that term. To avoid
|
||||
// misunderstandings, we consider an application to constitute a
|
||||
// "derivative work" for the purpose of this license if it does any of the
|
||||
// following:
|
||||
// 1. Integrates source code from Notepad++.
|
||||
// 2. Integrates/includes/aggregates Notepad++ into a proprietary executable
|
||||
// installer, such as those produced by InstallShield.
|
||||
// 3. Links to a library or executes a program that does any of the above.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
|
||||
#include <windows.h>
|
||||
#include "FileBrowser_rc.h"
|
||||
|
||||
IDD_FILEBROWSER DIALOGEX 26, 41, 142, 324
|
||||
STYLE DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
EXSTYLE WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE
|
||||
CAPTION "File Browser"
|
||||
FONT 8, "MS Sans Serif", 0, 0, 0x0
|
||||
BEGIN
|
||||
//CONTROL "",ID_PROJECTTREEVIEW,"SysTreeView32", TVS_HASBUTTONS | TVS_EDITLABELS | TVS_INFOTIP | TVS_HASLINES | WS_BORDER | WS_HSCROLL | WS_TABSTOP,7,7,172,93
|
||||
END
|
||||
|
||||
/*
|
||||
IDD_FILERELOCALIZER_DIALOG DIALOGEX 0, 0, 350, 48
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
EXSTYLE WS_EX_TOOLWINDOW
|
||||
CAPTION "Change file full path name"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
DEFPUSHBUTTON "OK",IDOK,235,27,50,14
|
||||
PUSHBUTTON "Cancel",IDCANCEL,290,27,50,14
|
||||
EDITTEXT IDC_EDIT_FILEFULLPATHNAME,7,7,335,14,ES_AUTOHSCROLL
|
||||
END
|
||||
*/
|
51
PowerEditor/src/WinControls/FileBrowser/fileBrowser_rc.h
Normal file
51
PowerEditor/src/WinControls/FileBrowser/fileBrowser_rc.h
Normal file
@ -0,0 +1,51 @@
|
||||
// This file is part of Notepad++ project
|
||||
// Copyright (C)2003 Don HO <don.h@free.fr>
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU General Public License
|
||||
// as published by the Free Software Foundation; either
|
||||
// version 2 of the License, or (at your option) any later version.
|
||||
//
|
||||
// Note that the GPL places important restrictions on "derived works", yet
|
||||
// it does not provide a detailed definition of that term. To avoid
|
||||
// misunderstandings, we consider an application to constitute a
|
||||
// "derivative work" for the purpose of this license if it does any of the
|
||||
// following:
|
||||
// 1. Integrates source code from Notepad++.
|
||||
// 2. Integrates/includes/aggregates Notepad++ into a proprietary executable
|
||||
// installer, such as those produced by InstallShield.
|
||||
// 3. Links to a library or executes a program that does any of the above.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
|
||||
#ifndef FILEBROWSER_RC_H
|
||||
#define FILEBROWSER_RC_H
|
||||
|
||||
#define IDD_FILEBROWSER 3500
|
||||
|
||||
#define IDD_FILEBROWSER_MENU (IDD_FILEBROWSER + 10)
|
||||
#define IDM_FILEBROWSER_RENAME (IDD_FILEBROWSER_MENU + 1)
|
||||
#define IDM_FILEBROWSER_NEWFOLDER (IDD_FILEBROWSER_MENU + 2)
|
||||
#define IDM_FILEBROWSER_ADDFILES (IDD_FILEBROWSER_MENU + 3)
|
||||
#define IDM_FILEBROWSER_DELETEFOLDER (IDD_FILEBROWSER_MENU + 4)
|
||||
#define IDM_FILEBROWSER_DELETEFILE (IDD_FILEBROWSER_MENU + 5)
|
||||
#define IDM_FILEBROWSER_MODIFYFILEPATH (IDD_FILEBROWSER_MENU + 6)
|
||||
#define IDM_FILEBROWSER_MOVEUP (IDD_FILEBROWSER_MENU + 8)
|
||||
#define IDM_FILEBROWSER_MOVEDOWN (IDD_FILEBROWSER_MENU + 9)
|
||||
|
||||
#define IDD_FILEBROWSER_CTRL (IDD_FILEBROWSER + 30)
|
||||
#define ID_FILEBROWSERTREEVIEW (IDD_FILEBROWSER_CTRL + 1)
|
||||
#define IDB_FILEBROWSER_BTN (IDD_FILEBROWSER_CTRL + 2)
|
||||
#define IDB_FILEBROWSER_EDIT_BTN (IDD_FILEBROWSER_CTRL + 3)
|
||||
|
||||
|
||||
#endif // FILEBROWSER_RC_H
|
||||
|
@ -0,0 +1,112 @@
|
||||
//
|
||||
// The MIT License
|
||||
//
|
||||
// Copyright (c) 2010 James E Beveridge
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
|
||||
// This sample code is for my blog entry titled, "Understanding ReadDirectoryChangesW"
|
||||
// http://qualapps.blogspot.com/2010/05/understanding-readdirectorychangesw.html
|
||||
// See ReadMe.txt for overview information.
|
||||
|
||||
#include "ReadDirectoryChanges.h"
|
||||
#include "ReadDirectoryChangesPrivate.h"
|
||||
|
||||
using namespace ReadDirectoryChangesPrivate;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// CReadDirectoryChanges
|
||||
|
||||
CReadDirectoryChanges::CReadDirectoryChanges(int nMaxCount)
|
||||
: m_Notifications(nMaxCount)
|
||||
{
|
||||
m_hThread = NULL;
|
||||
m_dwThreadId= 0;
|
||||
m_pServer = new CReadChangesServer(this);
|
||||
}
|
||||
|
||||
CReadDirectoryChanges::~CReadDirectoryChanges()
|
||||
{
|
||||
Terminate();
|
||||
delete m_pServer;
|
||||
}
|
||||
|
||||
void CReadDirectoryChanges::Init()
|
||||
{
|
||||
//
|
||||
// Kick off the worker thread, which will be
|
||||
// managed by CReadChangesServer.
|
||||
//
|
||||
m_hThread = (HANDLE)_beginthreadex(NULL,
|
||||
0,
|
||||
CReadChangesServer::ThreadStartProc,
|
||||
m_pServer,
|
||||
0,
|
||||
&m_dwThreadId
|
||||
);
|
||||
}
|
||||
|
||||
void CReadDirectoryChanges::Terminate()
|
||||
{
|
||||
if (m_hThread)
|
||||
{
|
||||
::QueueUserAPC(CReadChangesServer::TerminateProc, m_hThread, (ULONG_PTR)m_pServer);
|
||||
::WaitForSingleObjectEx(m_hThread, 10000, true);
|
||||
::CloseHandle(m_hThread);
|
||||
|
||||
m_hThread = NULL;
|
||||
m_dwThreadId = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void CReadDirectoryChanges::AddDirectory( LPCTSTR szDirectory, BOOL bWatchSubtree, DWORD dwNotifyFilter, DWORD dwBufferSize )
|
||||
{
|
||||
if (!m_hThread)
|
||||
Init();
|
||||
|
||||
CReadChangesRequest* pRequest = new CReadChangesRequest(m_pServer, szDirectory, bWatchSubtree, dwNotifyFilter, dwBufferSize);
|
||||
QueueUserAPC(CReadChangesServer::AddDirectoryProc, m_hThread, (ULONG_PTR)pRequest);
|
||||
}
|
||||
|
||||
void CReadDirectoryChanges::Push(DWORD dwAction, CStringW& wstrFilename)
|
||||
{
|
||||
TDirectoryChangeNotification dirChangeNotif = TDirectoryChangeNotification(dwAction, wstrFilename);
|
||||
m_Notifications.push(dirChangeNotif);
|
||||
}
|
||||
|
||||
bool CReadDirectoryChanges::Pop(DWORD& dwAction, CStringW& wstrFilename)
|
||||
{
|
||||
TDirectoryChangeNotification pair;
|
||||
if (!m_Notifications.pop(pair))
|
||||
return false;
|
||||
|
||||
dwAction = pair.first;
|
||||
wstrFilename = pair.second;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CReadDirectoryChanges::CheckOverflow()
|
||||
{
|
||||
bool b = m_Notifications.overflow();
|
||||
if (b)
|
||||
m_Notifications.clear();
|
||||
return b;
|
||||
}
|
@ -0,0 +1,164 @@
|
||||
//
|
||||
// The MIT License
|
||||
//
|
||||
// Copyright (c) 2010 James E Beveridge
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
|
||||
// This sample code is for my blog entry titled, "Understanding ReadDirectoryChangesW"
|
||||
// http://qualapps.blogspot.com/2010/05/understanding-readdirectorychangesw.html
|
||||
// See ReadMe.txt for overview information.
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include "targetver.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#ifndef VC_EXTRALEAN
|
||||
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
|
||||
#endif
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit
|
||||
|
||||
#include <atlbase.h>
|
||||
#include <atlstr.h>
|
||||
|
||||
#include <vector>
|
||||
#include <list>
|
||||
|
||||
using namespace std;
|
||||
|
||||
#include "ThreadSafeQueue.h"
|
||||
|
||||
typedef pair<DWORD,CStringW> TDirectoryChangeNotification;
|
||||
|
||||
namespace ReadDirectoryChangesPrivate
|
||||
{
|
||||
class CReadChangesServer;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Track changes to filesystem directories and report them
|
||||
/// to the caller via a thread-safe queue.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// <para>
|
||||
/// This sample code is based on my blog entry titled, "Understanding ReadDirectoryChangesW"
|
||||
/// http://qualapps.blogspot.com/2010/05/understanding-readdirectorychangesw.html
|
||||
/// </para><para>
|
||||
/// All functions in CReadDirectoryChangesServer run in
|
||||
/// the context of the calling thread.
|
||||
/// </para>
|
||||
/// <example><code>
|
||||
/// CReadDirectoryChanges changes;
|
||||
/// changes.AddDirectory(_T("C:\\"), false, dwNotificationFlags);
|
||||
///
|
||||
/// const HANDLE handles[] = { hStopEvent, changes.GetWaitHandle() };
|
||||
///
|
||||
/// while (!bTerminate)
|
||||
/// {
|
||||
/// ::MsgWaitForMultipleObjectsEx(
|
||||
/// _countof(handles),
|
||||
/// handles,
|
||||
/// INFINITE,
|
||||
/// QS_ALLINPUT,
|
||||
/// MWMO_INPUTAVAILABLE | MWMO_ALERTABLE);
|
||||
/// switch (rc)
|
||||
/// {
|
||||
/// case WAIT_OBJECT_0 + 0:
|
||||
/// bTerminate = true;
|
||||
/// break;
|
||||
/// case WAIT_OBJECT_0 + 1:
|
||||
/// // We've received a notification in the queue.
|
||||
/// {
|
||||
/// DWORD dwAction;
|
||||
/// CStringW wstrFilename;
|
||||
/// changes.Pop(dwAction, wstrFilename);
|
||||
/// wprintf(L"%s %s\n", ExplainAction(dwAction), wstrFilename);
|
||||
/// }
|
||||
/// break;
|
||||
/// case WAIT_OBJECT_0 + _countof(handles):
|
||||
/// // Get and dispatch message
|
||||
/// break;
|
||||
/// case WAIT_IO_COMPLETION:
|
||||
/// // APC complete.No action needed.
|
||||
/// break;
|
||||
/// }
|
||||
/// }
|
||||
/// </code></example>
|
||||
/// </remarks>
|
||||
class CReadDirectoryChanges
|
||||
{
|
||||
public:
|
||||
CReadDirectoryChanges(int nMaxChanges=1000);
|
||||
~CReadDirectoryChanges();
|
||||
|
||||
void Init();
|
||||
void Terminate();
|
||||
|
||||
/// <summary>
|
||||
/// Add a new directory to be monitored.
|
||||
/// </summary>
|
||||
/// <param name="wszDirectory">Directory to monitor.</param>
|
||||
/// <param name="bWatchSubtree">True to also monitor subdirectories.</param>
|
||||
/// <param name="dwNotifyFilter">The types of file system events to monitor, such as FILE_NOTIFY_CHANGE_ATTRIBUTES.</param>
|
||||
/// <param name="dwBufferSize">The size of the buffer used for overlapped I/O.</param>
|
||||
/// <remarks>
|
||||
/// <para>
|
||||
/// This function will make an APC call to the worker thread to issue a new
|
||||
/// ReadDirectoryChangesW call for the given directory with the given flags.
|
||||
/// </para>
|
||||
/// </remarks>
|
||||
void AddDirectory( LPCTSTR wszDirectory, BOOL bWatchSubtree, DWORD dwNotifyFilter, DWORD dwBufferSize=16384 );
|
||||
|
||||
/// <summary>
|
||||
/// Return a handle for the Win32 Wait... functions that will be
|
||||
/// signaled when there is a queue entry.
|
||||
/// </summary>
|
||||
HANDLE GetWaitHandle() { return m_Notifications.GetWaitHandle(); }
|
||||
|
||||
bool Pop(DWORD& dwAction, CStringW& wstrFilename);
|
||||
|
||||
// "Push" is for usage by ReadChangesRequest. Not intended for external usage.
|
||||
void Push(DWORD dwAction, CStringW& wstrFilename);
|
||||
|
||||
// Check if the queue overflowed. If so, clear it and return true.
|
||||
bool CheckOverflow();
|
||||
|
||||
unsigned int GetThreadId() { return m_dwThreadId; }
|
||||
|
||||
protected:
|
||||
ReadDirectoryChangesPrivate::CReadChangesServer* m_pServer;
|
||||
|
||||
HANDLE m_hThread;
|
||||
|
||||
unsigned int m_dwThreadId;
|
||||
|
||||
CThreadSafeQueue<TDirectoryChangeNotification> m_Notifications;
|
||||
};
|
@ -0,0 +1,178 @@
|
||||
//
|
||||
// The MIT License
|
||||
//
|
||||
// Copyright (c) 2010 James E Beveridge
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
|
||||
// This sample code is for my blog entry titled, "Understanding ReadDirectoryChangesW"
|
||||
// http://qualapps.blogspot.com/2010/05/understanding-readdirectorychangesw.html
|
||||
// See ReadMe.txt for overview information.
|
||||
|
||||
#include "ReadDirectoryChanges.h"
|
||||
#include "ReadDirectoryChangesPrivate.h"
|
||||
|
||||
|
||||
// The namespace is a convenience to emphasize that these are internals
|
||||
// interfaces. The namespace can be safely removed if you need to.
|
||||
namespace ReadDirectoryChangesPrivate
|
||||
{
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// CReadChangesRequest
|
||||
|
||||
CReadChangesRequest::CReadChangesRequest(CReadChangesServer* pServer, LPCTSTR sz, BOOL b, DWORD dw, DWORD size)
|
||||
{
|
||||
m_pServer = pServer;
|
||||
m_dwFilterFlags = dw;
|
||||
m_bIncludeChildren = b;
|
||||
m_wstrDirectory = sz;
|
||||
m_hDirectory = 0;
|
||||
|
||||
::ZeroMemory(&m_Overlapped, sizeof(OVERLAPPED));
|
||||
|
||||
// The hEvent member is not used when there is a completion
|
||||
// function, so it's ok to use it to point to the object.
|
||||
m_Overlapped.hEvent = this;
|
||||
|
||||
m_Buffer.resize(size);
|
||||
m_BackupBuffer.resize(size);
|
||||
}
|
||||
|
||||
|
||||
CReadChangesRequest::~CReadChangesRequest()
|
||||
{
|
||||
// RequestTermination() must have been called successfully.
|
||||
_ASSERTE(m_hDirectory == NULL);
|
||||
}
|
||||
|
||||
|
||||
bool CReadChangesRequest::OpenDirectory()
|
||||
{
|
||||
// Allow this routine to be called redundantly.
|
||||
if (m_hDirectory)
|
||||
return true;
|
||||
|
||||
m_hDirectory = ::CreateFileW(
|
||||
m_wstrDirectory, // pointer to the file name
|
||||
FILE_LIST_DIRECTORY, // access (read/write) mode
|
||||
FILE_SHARE_READ // share mode
|
||||
| FILE_SHARE_WRITE
|
||||
| FILE_SHARE_DELETE,
|
||||
NULL, // security descriptor
|
||||
OPEN_EXISTING, // how to create
|
||||
FILE_FLAG_BACKUP_SEMANTICS // file attributes
|
||||
| FILE_FLAG_OVERLAPPED,
|
||||
NULL); // file with attributes to copy
|
||||
|
||||
if (m_hDirectory == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CReadChangesRequest::BeginRead()
|
||||
{
|
||||
DWORD dwBytes=0;
|
||||
|
||||
// This call needs to be reissued after every APC.
|
||||
::ReadDirectoryChangesW(
|
||||
m_hDirectory, // handle to directory
|
||||
&m_Buffer[0], // read results buffer
|
||||
m_Buffer.size(), // length of buffer
|
||||
m_bIncludeChildren, // monitoring option
|
||||
m_dwFilterFlags, // filter conditions
|
||||
&dwBytes, // bytes returned
|
||||
&m_Overlapped, // overlapped buffer
|
||||
&NotificationCompletion); // completion routine
|
||||
}
|
||||
|
||||
//static
|
||||
VOID CALLBACK CReadChangesRequest::NotificationCompletion(
|
||||
DWORD dwErrorCode, // completion code
|
||||
DWORD dwNumberOfBytesTransfered, // number of bytes transferred
|
||||
LPOVERLAPPED lpOverlapped) // I/O information buffer
|
||||
{
|
||||
CReadChangesRequest* pBlock = (CReadChangesRequest*)lpOverlapped->hEvent;
|
||||
|
||||
if (dwErrorCode == ERROR_OPERATION_ABORTED)
|
||||
{
|
||||
::InterlockedDecrement(&pBlock->m_pServer->m_nOutstandingRequests);
|
||||
delete pBlock;
|
||||
return;
|
||||
}
|
||||
|
||||
// Can't use sizeof(FILE_NOTIFY_INFORMATION) because
|
||||
// the structure is padded to 16 bytes.
|
||||
_ASSERTE(dwNumberOfBytesTransfered >= offsetof(FILE_NOTIFY_INFORMATION, FileName) + sizeof(WCHAR));
|
||||
|
||||
// This might mean overflow? Not sure.
|
||||
if(!dwNumberOfBytesTransfered)
|
||||
return;
|
||||
|
||||
pBlock->BackupBuffer(dwNumberOfBytesTransfered);
|
||||
|
||||
// Get the new read issued as fast as possible. The documentation
|
||||
// says that the original OVERLAPPED structure will not be used
|
||||
// again once the completion routine is called.
|
||||
pBlock->BeginRead();
|
||||
|
||||
pBlock->ProcessNotification();
|
||||
}
|
||||
|
||||
void CReadChangesRequest::ProcessNotification()
|
||||
{
|
||||
BYTE* pBase = m_BackupBuffer.data();
|
||||
|
||||
for (;;)
|
||||
{
|
||||
FILE_NOTIFY_INFORMATION& fni = (FILE_NOTIFY_INFORMATION&)*pBase;
|
||||
|
||||
CStringW wstrFilename(fni.FileName, fni.FileNameLength/sizeof(wchar_t));
|
||||
// Handle a trailing backslash, such as for a root directory.
|
||||
if (wstrFilename.Right(1) != L"\\")
|
||||
wstrFilename = m_wstrDirectory + L"\\" + wstrFilename;
|
||||
else
|
||||
wstrFilename = m_wstrDirectory + wstrFilename;
|
||||
|
||||
// If it could be a short filename, expand it.
|
||||
LPCWSTR wszFilename = PathFindFileNameW(wstrFilename);
|
||||
int len = lstrlenW(wszFilename);
|
||||
// The maximum length of an 8.3 filename is twelve, including the dot.
|
||||
if (len <= 12 && wcschr(wszFilename, L'~'))
|
||||
{
|
||||
// Convert to the long filename form. Unfortunately, this
|
||||
// does not work for deletions, so it's an imperfect fix.
|
||||
wchar_t wbuf[MAX_PATH];
|
||||
if (::GetLongPathNameW(wstrFilename, wbuf, _countof(wbuf)) > 0)
|
||||
wstrFilename = wbuf;
|
||||
}
|
||||
|
||||
m_pServer->m_pBase->Push(fni.Action, wstrFilename);
|
||||
|
||||
if (!fni.NextEntryOffset)
|
||||
break;
|
||||
pBase += fni.NextEntryOffset;
|
||||
};
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,177 @@
|
||||
//
|
||||
// The MIT License
|
||||
//
|
||||
// Copyright (c) 2010 James E Beveridge
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
|
||||
// This sample code is for my blog entry titled, "Understanding ReadDirectoryChangesW"
|
||||
// http://qualapps.blogspot.com/2010/05/understanding-readdirectorychangesw.html
|
||||
// See ReadMe.txt for overview information.
|
||||
|
||||
class CReadDirectoryChanges;
|
||||
|
||||
namespace ReadDirectoryChangesPrivate
|
||||
{
|
||||
|
||||
class CReadChangesServer;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// All functions in CReadChangesRequest run in the context of the worker thread.
|
||||
// One instance of this object is created for each call to AddDirectory().
|
||||
class CReadChangesRequest
|
||||
{
|
||||
public:
|
||||
CReadChangesRequest(CReadChangesServer* pServer, LPCTSTR sz, BOOL b, DWORD dw, DWORD size);
|
||||
|
||||
~CReadChangesRequest();
|
||||
|
||||
bool OpenDirectory();
|
||||
|
||||
void BeginRead();
|
||||
|
||||
// The dwSize is the actual number of bytes sent to the APC.
|
||||
void BackupBuffer(DWORD dwSize)
|
||||
{
|
||||
// We could just swap back and forth between the two
|
||||
// buffers, but this code is easier to understand and debug.
|
||||
memcpy(&m_BackupBuffer[0], &m_Buffer[0], dwSize);
|
||||
}
|
||||
|
||||
void ProcessNotification();
|
||||
|
||||
void RequestTermination()
|
||||
{
|
||||
::CancelIo(m_hDirectory);
|
||||
::CloseHandle(m_hDirectory);
|
||||
m_hDirectory = nullptr;
|
||||
}
|
||||
|
||||
CReadChangesServer* m_pServer;
|
||||
|
||||
protected:
|
||||
|
||||
static VOID CALLBACK NotificationCompletion(
|
||||
DWORD dwErrorCode, // completion code
|
||||
DWORD dwNumberOfBytesTransfered, // number of bytes transferred
|
||||
LPOVERLAPPED lpOverlapped); // I/O information buffer
|
||||
|
||||
// Parameters from the caller for ReadDirectoryChangesW().
|
||||
DWORD m_dwFilterFlags;
|
||||
BOOL m_bIncludeChildren;
|
||||
CStringW m_wstrDirectory;
|
||||
|
||||
// Result of calling CreateFile().
|
||||
HANDLE m_hDirectory;
|
||||
|
||||
// Required parameter for ReadDirectoryChangesW().
|
||||
OVERLAPPED m_Overlapped;
|
||||
|
||||
// Data buffer for the request.
|
||||
// Since the memory is allocated by malloc, it will always
|
||||
// be aligned as required by ReadDirectoryChangesW().
|
||||
vector<BYTE> m_Buffer;
|
||||
|
||||
// Double buffer strategy so that we can issue a new read
|
||||
// request before we process the current buffer.
|
||||
vector<BYTE> m_BackupBuffer;
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// All functions in CReadChangesServer run in the context of the worker thread.
|
||||
// One instance of this object is allocated for each instance of CReadDirectoryChanges.
|
||||
// This class is responsible for thread startup, orderly thread shutdown, and shimming
|
||||
// the various C++ member functions with C-style Win32 functions.
|
||||
class CReadChangesServer
|
||||
{
|
||||
public:
|
||||
CReadChangesServer(CReadDirectoryChanges* pParent)
|
||||
{
|
||||
m_bTerminate=false; m_nOutstandingRequests=0;m_pBase=pParent;
|
||||
}
|
||||
|
||||
static unsigned int WINAPI ThreadStartProc(LPVOID arg)
|
||||
{
|
||||
CReadChangesServer* pServer = (CReadChangesServer*)arg;
|
||||
pServer->Run();
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Called by QueueUserAPC to start orderly shutdown.
|
||||
static void CALLBACK TerminateProc(__in ULONG_PTR arg)
|
||||
{
|
||||
CReadChangesServer* pServer = (CReadChangesServer*)arg;
|
||||
pServer->RequestTermination();
|
||||
}
|
||||
|
||||
// Called by QueueUserAPC to add another directory.
|
||||
static void CALLBACK AddDirectoryProc(__in ULONG_PTR arg)
|
||||
{
|
||||
CReadChangesRequest* pRequest = (CReadChangesRequest*)arg;
|
||||
pRequest->m_pServer->AddDirectory(pRequest);
|
||||
}
|
||||
|
||||
CReadDirectoryChanges* m_pBase;
|
||||
|
||||
volatile DWORD m_nOutstandingRequests;
|
||||
|
||||
protected:
|
||||
|
||||
void Run()
|
||||
{
|
||||
while (m_nOutstandingRequests || !m_bTerminate)
|
||||
{
|
||||
::SleepEx(INFINITE, true);
|
||||
}
|
||||
}
|
||||
|
||||
void AddDirectory( CReadChangesRequest* pBlock )
|
||||
{
|
||||
if (pBlock->OpenDirectory())
|
||||
{
|
||||
::InterlockedIncrement(&pBlock->m_pServer->m_nOutstandingRequests);
|
||||
m_pBlocks.push_back(pBlock);
|
||||
pBlock->BeginRead();
|
||||
}
|
||||
else
|
||||
delete pBlock;
|
||||
}
|
||||
|
||||
void RequestTermination()
|
||||
{
|
||||
m_bTerminate = true;
|
||||
|
||||
for (DWORD i=0; i<m_pBlocks.size(); ++i)
|
||||
{
|
||||
// Each Request object will delete itself.
|
||||
m_pBlocks[i]->RequestTermination();
|
||||
}
|
||||
|
||||
m_pBlocks.clear();
|
||||
}
|
||||
|
||||
vector<CReadChangesRequest*> m_pBlocks;
|
||||
|
||||
bool m_bTerminate;
|
||||
};
|
||||
|
||||
}
|
@ -0,0 +1,116 @@
|
||||
//
|
||||
// The MIT License
|
||||
//
|
||||
// Copyright (c) 2010 James E Beveridge
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
|
||||
// This sample code is for my blog entry titled, "Understanding ReadDirectoryChangesW"
|
||||
// http://qualapps.blogspot.com/2010/05/understanding-readdirectorychangesw.html
|
||||
// See ReadMe.txt for overview information.
|
||||
|
||||
#include <list>
|
||||
|
||||
template <typename C>
|
||||
class CThreadSafeQueue : protected std::list<C>
|
||||
{
|
||||
public:
|
||||
CThreadSafeQueue(int nMaxCount)
|
||||
{
|
||||
m_bOverflow = false;
|
||||
|
||||
m_hSemaphore = ::CreateSemaphore(
|
||||
NULL, // no security attributes
|
||||
0, // initial count
|
||||
nMaxCount, // max count
|
||||
NULL); // anonymous
|
||||
}
|
||||
|
||||
~CThreadSafeQueue()
|
||||
{
|
||||
::CloseHandle(m_hSemaphore);
|
||||
m_hSemaphore = NULL;
|
||||
}
|
||||
|
||||
void push(C& c)
|
||||
{
|
||||
CComCritSecLock<CComAutoCriticalSection> lock( m_Crit, true );
|
||||
push_back( c );
|
||||
lock.Unlock();
|
||||
|
||||
if (!::ReleaseSemaphore(m_hSemaphore, 1, NULL))
|
||||
{
|
||||
// If the semaphore is full, then take back the entry.
|
||||
lock.Lock();
|
||||
pop_back();
|
||||
if (GetLastError() == ERROR_TOO_MANY_POSTS)
|
||||
{
|
||||
m_bOverflow = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool pop(C& c)
|
||||
{
|
||||
CComCritSecLock<CComAutoCriticalSection> lock( m_Crit, true );
|
||||
|
||||
// If the user calls pop() more than once after the
|
||||
// semaphore is signaled, then the semaphore count will
|
||||
// get out of sync. We fix that when the queue empties.
|
||||
if (empty())
|
||||
{
|
||||
while (::WaitForSingleObject(m_hSemaphore, 0) != WAIT_TIMEOUT)
|
||||
1;
|
||||
return false;
|
||||
}
|
||||
|
||||
c = front();
|
||||
pop_front();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// If overflow, use this to clear the queue.
|
||||
void clear()
|
||||
{
|
||||
CComCritSecLock<CComAutoCriticalSection> lock( m_Crit, true );
|
||||
|
||||
for (DWORD i=0; i<size(); i++)
|
||||
WaitForSingleObject(m_hSemaphore, 0);
|
||||
|
||||
__super::clear();
|
||||
|
||||
m_bOverflow = false;
|
||||
}
|
||||
|
||||
bool overflow()
|
||||
{
|
||||
return m_bOverflow;
|
||||
}
|
||||
|
||||
HANDLE GetWaitHandle() { return m_hSemaphore; }
|
||||
|
||||
protected:
|
||||
HANDLE m_hSemaphore;
|
||||
|
||||
CComAutoCriticalSection m_Crit;
|
||||
|
||||
bool m_bOverflow;
|
||||
};
|
@ -0,0 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
// Including SDKDDKVer.h defines the highest available Windows platform.
|
||||
|
||||
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
|
||||
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
|
||||
|
||||
#include <SDKDDKVer.h>
|
@ -346,6 +346,8 @@
|
||||
//See functionListPanel_rc.h
|
||||
//#define IDD_FUNCLIST_PANEL 3400
|
||||
|
||||
//See fileBrowser_rc.h
|
||||
//#define IDD_FILEBROWSER 3500
|
||||
|
||||
// See regExtDlg.h
|
||||
//#define IDD_REGEXT 4000
|
||||
|
@ -26,7 +26,7 @@
|
||||
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
#include "Notepad_plus_Window.h"
|
||||
#include "Process.h"
|
||||
#include "Processus.h"
|
||||
#include "Win32Exception.h" //Win32 exception
|
||||
#include "MiniDumper.h" //Write dump files
|
||||
|
||||
|
@ -94,7 +94,7 @@
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>
|
||||
<AdditionalIncludeDirectories>..\src\WinControls\AboutDlg;..\..\scintilla\include;..\include;..\src\WinControls;..\src\WinControls\ImageListSet;..\src\WinControls\OpenSaveFileDialog;..\src\WinControls\SplitterContainer;..\src\WinControls\StaticDialog;..\src\WinControls\TabBar;..\src\WinControls\ToolBar;..\src\MISC\Process;..\src\ScitillaComponent;..\src\MISC;..\src\MISC\SysMsg;..\src\WinControls\StatusBar;..\src;..\src\WinControls\StaticDialog\RunDlg;..\src\tinyxml;..\src\WinControls\ColourPicker;..\src\Win32Explr;..\src\MISC\RegExt;..\src\WinControls\TrayIcon;..\src\WinControls\shortcut;..\src\WinControls\Grid;..\src\WinControls\ContextMenu;..\src\MISC\PluginsManager;..\src\WinControls\Preference;..\src\WinControls\WindowsDlg;..\src\WinControls\TaskList;..\src\WinControls\DockingWnd;..\src\WinControls\ToolTip;..\src\MISC\Exception;..\src\MISC\Common;..\src\tinyxml\tinyXmlA;..\src\WinControls\AnsiCharPanel;..\src\WinControls\ClipboardHistory;..\src\WinControls\FindCharsInRange;..\src\WinControls\VerticalFileSwitcher;..\src\WinControls\ProjectPanel;..\src\WinControls\DocumentMap;..\src\WinControls\FunctionList;..\src\uchardet;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>..\src\WinControls\AboutDlg;..\..\scintilla\include;..\include;..\src\WinControls;..\src\WinControls\ImageListSet;..\src\WinControls\OpenSaveFileDialog;..\src\WinControls\SplitterContainer;..\src\WinControls\StaticDialog;..\src\WinControls\TabBar;..\src\WinControls\ToolBar;..\src\MISC\Process;..\src\ScitillaComponent;..\src\MISC;..\src\MISC\SysMsg;..\src\WinControls\StatusBar;..\src;..\src\WinControls\StaticDialog\RunDlg;..\src\tinyxml;..\src\WinControls\ColourPicker;..\src\Win32Explr;..\src\MISC\RegExt;..\src\WinControls\TrayIcon;..\src\WinControls\shortcut;..\src\WinControls\Grid;..\src\WinControls\ContextMenu;..\src\MISC\PluginsManager;..\src\WinControls\Preference;..\src\WinControls\WindowsDlg;..\src\WinControls\TaskList;..\src\WinControls\DockingWnd;..\src\WinControls\ToolTip;..\src\MISC\Exception;..\src\MISC\Common;..\src\tinyxml\tinyXmlA;..\src\WinControls\AnsiCharPanel;..\src\WinControls\ClipboardHistory;..\src\WinControls\FindCharsInRange;..\src\WinControls\VerticalFileSwitcher;..\src\WinControls\ProjectPanel;..\src\WinControls\DocumentMap;..\src\WinControls\FunctionList;..\src\uchardet;..\src\WinControls\FileBrowser;..\src\WinControls\ReadDirectoryChanges;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_WIN32_WINNT=0x0501;_WINDOWS;_USE_64BIT_TIME_T;TIXML_USE_STL;TIXMLA_USE_STL;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ExceptionHandling>Async</ExceptionHandling>
|
||||
<BasicRuntimeChecks>UninitializedLocalUsageCheck</BasicRuntimeChecks>
|
||||
@ -167,7 +167,7 @@
|
||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>false</OmitFramePointers>
|
||||
<WholeProgramOptimization>false</WholeProgramOptimization>
|
||||
<AdditionalIncludeDirectories>..\src\WinControls\AboutDlg;..\..\scintilla\include;..\include;..\src\WinControls;..\src\WinControls\ImageListSet;..\src\WinControls\OpenSaveFileDialog;..\src\WinControls\SplitterContainer;..\src\WinControls\StaticDialog;..\src\WinControls\TabBar;..\src\WinControls\ToolBar;..\src\MISC\Process;..\src\ScitillaComponent;..\src\MISC;..\src\MISC\SysMsg;..\src\WinControls\StatusBar;..\src;..\src\WinControls\StaticDialog\RunDlg;..\src\tinyxml;..\src\WinControls\ColourPicker;..\src\Win32Explr;..\src\MISC\RegExt;..\src\WinControls\TrayIcon;..\src\WinControls\shortcut;..\src\WinControls\Grid;..\src\WinControls\ContextMenu;..\src\MISC\PluginsManager;..\src\WinControls\Preference;..\src\WinControls\WindowsDlg;..\src\WinControls\TaskList;..\src\WinControls\DockingWnd;..\src\WinControls\ToolTip;..\src\MISC\Exception;..\src\MISC\Common;..\src\tinyxml\tinyXmlA;..\src\WinControls\AnsiCharPanel;..\src\WinControls\ClipboardHistory;..\src\WinControls\FindCharsInRange;..\src\WinControls\VerticalFileSwitcher;..\src\WinControls\ProjectPanel;..\src\WinControls\DocumentMap;..\src\WinControls\FunctionList;..\src\uchardet;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>..\src\WinControls\AboutDlg;..\..\scintilla\include;..\include;..\src\WinControls;..\src\WinControls\ImageListSet;..\src\WinControls\OpenSaveFileDialog;..\src\WinControls\SplitterContainer;..\src\WinControls\StaticDialog;..\src\WinControls\TabBar;..\src\WinControls\ToolBar;..\src\MISC\Process;..\src\ScitillaComponent;..\src\MISC;..\src\MISC\SysMsg;..\src\WinControls\StatusBar;..\src;..\src\WinControls\StaticDialog\RunDlg;..\src\tinyxml;..\src\WinControls\ColourPicker;..\src\Win32Explr;..\src\MISC\RegExt;..\src\WinControls\TrayIcon;..\src\WinControls\shortcut;..\src\WinControls\Grid;..\src\WinControls\ContextMenu;..\src\MISC\PluginsManager;..\src\WinControls\Preference;..\src\WinControls\WindowsDlg;..\src\WinControls\TaskList;..\src\WinControls\DockingWnd;..\src\WinControls\ToolTip;..\src\MISC\Exception;..\src\MISC\Common;..\src\tinyxml\tinyXmlA;..\src\WinControls\AnsiCharPanel;..\src\WinControls\ClipboardHistory;..\src\WinControls\FindCharsInRange;..\src\WinControls\VerticalFileSwitcher;..\src\WinControls\ProjectPanel;..\src\WinControls\DocumentMap;..\src\WinControls\FunctionList;..\src\uchardet;..\src\WinControls\FileBrowser;..\src\WinControls\ReadDirectoryChanges;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;_WIN32_WINNT=0x0501;NDEBUG;_WINDOWS;_USE_64BIT_TIME_T;TIXML_USE_STL;TIXMLA_USE_STL;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessToFile>false</PreprocessToFile>
|
||||
<PreprocessSuppressLineNumbers>false</PreprocessSuppressLineNumbers>
|
||||
@ -263,9 +263,11 @@ copy ..\src\contextMenu.xml ..\bin64\contextMenu.xml
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\src\MISC\Common\LongRunningOperation.cpp" />
|
||||
<ClCompile Include="..\src\MISC\Common\mutex.cpp" />
|
||||
<ClCompile Include="..\src\MISC\Process\Processus.cpp" />
|
||||
<ClCompile Include="..\src\WinControls\AboutDlg\AboutDlg.cpp" />
|
||||
<ClCompile Include="..\src\WinControls\AnsiCharPanel\ansiCharPanel.cpp" />
|
||||
<ClCompile Include="..\src\ScitillaComponent\AutoCompletion.cpp" />
|
||||
<ClCompile Include="..\src\WinControls\FileBrowser\fileBrowser.cpp" />
|
||||
<ClCompile Include="..\src\WinControls\Grid\BabyGrid.cpp" />
|
||||
<ClCompile Include="..\src\WinControls\Grid\BabyGridWrapper.cpp" />
|
||||
<ClCompile Include="..\src\ScitillaComponent\Buffer.cpp" />
|
||||
@ -276,6 +278,8 @@ copy ..\src\contextMenu.xml ..\bin64\contextMenu.xml
|
||||
<ClCompile Include="..\src\ScitillaComponent\columnEditor.cpp" />
|
||||
<ClCompile Include="..\src\MISC\Common\Common.cpp" />
|
||||
<ClCompile Include="..\src\WinControls\ContextMenu\ContextMenu.cpp" />
|
||||
<ClCompile Include="..\src\WinControls\ReadDirectoryChanges\ReadDirectoryChanges.cpp" />
|
||||
<ClCompile Include="..\src\WinControls\ReadDirectoryChanges\ReadDirectoryChangesPrivate.cpp" />
|
||||
<ClCompile Include="..\src\WinControls\TabBar\ControlsTab.cpp" />
|
||||
<ClCompile Include="..\src\WinControls\DockingWnd\DockingCont.cpp" />
|
||||
<ClCompile Include="..\src\WinControls\DockingWnd\DockingManager.cpp" />
|
||||
@ -332,7 +336,6 @@ copy ..\src\contextMenu.xml ..\bin64\contextMenu.xml
|
||||
<ClCompile Include="..\src\Misc\PluginsManager\PluginsManager.cpp" />
|
||||
<ClCompile Include="..\src\WinControls\Preference\preferenceDlg.cpp" />
|
||||
<ClCompile Include="..\src\ScitillaComponent\Printer.cpp" />
|
||||
<ClCompile Include="..\src\MISC\Process\Process.cpp" />
|
||||
<ClCompile Include="..\src\WinControls\ProjectPanel\ProjectPanel.cpp" />
|
||||
<ClCompile Include="..\src\MISC\RegExt\regExtDlg.cpp" />
|
||||
<ClCompile Include="..\src\WinControls\StaticDialog\RunDlg\RunDlg.cpp" />
|
||||
@ -491,6 +494,7 @@ copy ..\src\contextMenu.xml ..\bin64\contextMenu.xml
|
||||
<ResourceCompile Include="..\src\ScitillaComponent\columnEditor.rc" />
|
||||
<ResourceCompile Include="..\src\WinControls\DockingWnd\DockingGUIWidget.rc" />
|
||||
<ResourceCompile Include="..\src\WinControls\DocumentMap\documentMap.rc" />
|
||||
<ResourceCompile Include="..\src\WinControls\FileBrowser\fileBrowser.rc" />
|
||||
<ResourceCompile Include="..\src\WinControls\FindCharsInRange\findCharsInRange.rc" />
|
||||
<ResourceCompile Include="..\src\ScitillaComponent\FindReplaceDlg.rc" />
|
||||
<ResourceCompile Include="..\src\WinControls\FunctionList\functionListPanel.rc" />
|
||||
@ -517,9 +521,12 @@ copy ..\src\contextMenu.xml ..\bin64\contextMenu.xml
|
||||
<ClInclude Include="..\src\MISC\Common\LongRunningOperation.h" />
|
||||
<ClInclude Include="..\src\MISC\Common\mutex.h" />
|
||||
<ClInclude Include="..\src\MISC\Common\mutex.hxx" />
|
||||
<ClInclude Include="..\src\MISC\Process\Processus.h" />
|
||||
<ClInclude Include="..\src\WinControls\AboutDlg\AboutDlg.h" />
|
||||
<ClInclude Include="..\src\WinControls\AnsiCharPanel\ansiCharPanel.h" />
|
||||
<ClInclude Include="..\src\ScitillaComponent\AutoCompletion.h" />
|
||||
<ClInclude Include="..\src\WinControls\FileBrowser\fileBrowser.h" />
|
||||
<ClInclude Include="..\src\WinControls\FileBrowser\fileBrowser_rc.h" />
|
||||
<ClInclude Include="..\src\WinControls\Grid\BabyGrid.h" />
|
||||
<ClInclude Include="..\src\WinControls\Grid\BabyGridWrapper.h" />
|
||||
<ClInclude Include="..\src\ScitillaComponent\Buffer.h" />
|
||||
@ -532,6 +539,9 @@ copy ..\src\contextMenu.xml ..\bin64\contextMenu.xml
|
||||
<ClInclude Include="..\src\ScitillaComponent\columnEditor.h" />
|
||||
<ClInclude Include="..\src\MISC\Common\Common.h" />
|
||||
<ClInclude Include="..\src\WinControls\ContextMenu\ContextMenu.h" />
|
||||
<ClInclude Include="..\src\WinControls\ReadDirectoryChanges\ReadDirectoryChanges.h" />
|
||||
<ClInclude Include="..\src\WinControls\ReadDirectoryChanges\ReadDirectoryChangesPrivate.h" />
|
||||
<ClInclude Include="..\src\WinControls\ReadDirectoryChanges\ThreadSafeQueue.h" />
|
||||
<ClInclude Include="..\src\WinControls\TabBar\ControlsTab.h" />
|
||||
<ClInclude Include="..\src\WinControls\DockingWnd\Docking.h" />
|
||||
<ClInclude Include="..\src\WinControls\DockingWnd\DockingCont.h" />
|
||||
@ -589,7 +599,6 @@ copy ..\src\contextMenu.xml ..\bin64\contextMenu.xml
|
||||
<ClInclude Include="..\src\WinControls\Preference\preferenceDlg.h" />
|
||||
<ClInclude Include="..\src\ScitillaComponent\Printer.h" />
|
||||
<ClInclude Include="..\src\uchardet\prmem.h" />
|
||||
<ClInclude Include="..\src\MISC\Process\Process.h" />
|
||||
<ClInclude Include="..\src\WinControls\ProjectPanel\ProjectPanel.h" />
|
||||
<ClInclude Include="..\src\WinControls\ProjectPanel\ProjectPanel_rc.h" />
|
||||
<ClInclude Include="..\src\MISC\RegExt\regExtDlg.h" />
|
||||
|
Loading…
Reference in New Issue
Block a user