mirror of
https://github.com/notepad-plus-plus/notepad-plus-plus.git
synced 2025-07-07 22:14:38 +02:00
Use multiple-files Save dialog in Document list
Fix #13768, fix #13178, close #13776
This commit is contained in:
parent
bdd13c0839
commit
51bddf57ad
@ -173,7 +173,7 @@ public:
|
|||||||
bool fileClose(BufferID id = BUFFER_INVALID, int curView = -1); //use curView to override view to close from
|
bool fileClose(BufferID id = BUFFER_INVALID, int curView = -1); //use curView to override view to close from
|
||||||
bool fileCloseAll(bool doDeleteBackup, bool isSnapshotMode = false);
|
bool fileCloseAll(bool doDeleteBackup, bool isSnapshotMode = false);
|
||||||
bool fileCloseAllButCurrent();
|
bool fileCloseAllButCurrent();
|
||||||
bool fileCloseAllGiven(const std::vector<int>& krvecBufferIndexes);
|
bool fileCloseAllGiven(const std::vector<BufferViewInfo>& krvecBuffer);
|
||||||
bool fileCloseAllToLeft();
|
bool fileCloseAllToLeft();
|
||||||
bool fileCloseAllToRight();
|
bool fileCloseAllToRight();
|
||||||
bool fileCloseAllUnchanged();
|
bool fileCloseAllUnchanged();
|
||||||
|
@ -234,11 +234,10 @@ void Notepad_plus::command(int id)
|
|||||||
case IDM_DOCLIST_FILESCLOSEOTHERS:
|
case IDM_DOCLIST_FILESCLOSEOTHERS:
|
||||||
if (_pDocumentListPanel)
|
if (_pDocumentListPanel)
|
||||||
{
|
{
|
||||||
vector<SwitcherFileInfo> files = _pDocumentListPanel->getSelectedFiles(id == IDM_DOCLIST_FILESCLOSEOTHERS);
|
vector<BufferViewInfo> bufs2Close = _pDocumentListPanel->getSelectedFiles(id == IDM_DOCLIST_FILESCLOSEOTHERS);
|
||||||
for (size_t i = 0, len = files.size(); i < len; ++i)
|
|
||||||
{
|
fileCloseAllGiven(bufs2Close);
|
||||||
fileClose((BufferID)files[i]._bufID, files[i]._iView);
|
|
||||||
}
|
|
||||||
if (id == IDM_DOCLIST_FILESCLOSEOTHERS)
|
if (id == IDM_DOCLIST_FILESCLOSEOTHERS)
|
||||||
{
|
{
|
||||||
// Get current buffer and its view
|
// Get current buffer and its view
|
||||||
|
@ -1213,46 +1213,44 @@ bool Notepad_plus::fileCloseAll(bool doDeleteBackup, bool isSnapshotMode)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Notepad_plus::fileCloseAllGiven(const std::vector<int>& krvecBufferIndexes)
|
bool Notepad_plus::fileCloseAllGiven(const std::vector<BufferViewInfo>& fileInfos)
|
||||||
{
|
{
|
||||||
// First check if we need to save any file.
|
// First check if we need to save any file.
|
||||||
|
|
||||||
bool noSaveToAll = false;
|
bool noSaveToAll = false;
|
||||||
bool saveToAll = false;
|
bool saveToAll = false;
|
||||||
std::vector<int> bufferIndexesToClose;
|
std::vector<BufferViewInfo> buffersToClose;
|
||||||
|
|
||||||
// Count the number of dirty file
|
// Count the number of dirty file
|
||||||
size_t nbDirtyFiles = 0;
|
size_t nbDirtyFiles = 0;
|
||||||
for (const auto& index : krvecBufferIndexes)
|
for (const auto& i : fileInfos)
|
||||||
{
|
{
|
||||||
BufferID id = _pDocTab->getBufferByIndex(index);
|
Buffer* buf = MainFileManager.getBufferByID(i._bufID);
|
||||||
Buffer* buf = MainFileManager.getBufferByID(id);
|
|
||||||
|
|
||||||
if (buf->isDirty())
|
if (buf->isDirty())
|
||||||
++nbDirtyFiles;
|
++nbDirtyFiles;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto& index : krvecBufferIndexes)
|
for (const auto& i : fileInfos)
|
||||||
{
|
{
|
||||||
BufferID id = _pDocTab->getBufferByIndex(index);
|
Buffer* buf = MainFileManager.getBufferByID(i._bufID);
|
||||||
Buffer* buf = MainFileManager.getBufferByID(id);
|
|
||||||
|
|
||||||
if ((buf->isUntitled() && buf->docLength() == 0) || noSaveToAll || !buf->isDirty())
|
if ((buf->isUntitled() && buf->docLength() == 0) || noSaveToAll || !buf->isDirty())
|
||||||
{
|
{
|
||||||
// Do nothing, these documents are already ready to close
|
// Do nothing, these documents are already ready to close
|
||||||
bufferIndexesToClose.push_back(index);
|
buffersToClose.push_back(i);
|
||||||
}
|
}
|
||||||
else if (buf->isDirty() && !noSaveToAll)
|
else if (buf->isDirty() && !noSaveToAll)
|
||||||
{
|
{
|
||||||
if (_activeView == MAIN_VIEW)
|
if (_activeView == MAIN_VIEW)
|
||||||
{
|
{
|
||||||
activateBuffer(id, MAIN_VIEW);
|
activateBuffer(i._bufID, MAIN_VIEW);
|
||||||
if (!activateBuffer(id, SUB_VIEW))
|
if (!activateBuffer(i._bufID, SUB_VIEW))
|
||||||
switchEditViewTo(MAIN_VIEW);
|
switchEditViewTo(MAIN_VIEW);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
activateBuffer(id, SUB_VIEW);
|
activateBuffer(i._bufID, SUB_VIEW);
|
||||||
switchEditViewTo(SUB_VIEW);
|
switchEditViewTo(SUB_VIEW);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1268,17 +1266,17 @@ bool Notepad_plus::fileCloseAllGiven(const std::vector<int>& krvecBufferIndexes)
|
|||||||
|
|
||||||
if (res == IDYES || res == IDRETRY)
|
if (res == IDYES || res == IDRETRY)
|
||||||
{
|
{
|
||||||
if (!fileSave(id))
|
if (!fileSave(i._bufID))
|
||||||
break; // Abort entire procedure, but close whatever processed so far
|
break; // Abort entire procedure, but close whatever processed so far
|
||||||
|
|
||||||
bufferIndexesToClose.push_back(index);
|
buffersToClose.push_back(i);
|
||||||
|
|
||||||
if (res == IDRETRY)
|
if (res == IDRETRY)
|
||||||
saveToAll = true;
|
saveToAll = true;
|
||||||
}
|
}
|
||||||
else if (res == IDNO || res == IDIGNORE)
|
else if (res == IDNO || res == IDIGNORE)
|
||||||
{
|
{
|
||||||
bufferIndexesToClose.push_back(index);
|
buffersToClose.push_back(i);
|
||||||
|
|
||||||
if (res == IDIGNORE)
|
if (res == IDIGNORE)
|
||||||
noSaveToAll = true;
|
noSaveToAll = true;
|
||||||
@ -1292,9 +1290,9 @@ bool Notepad_plus::fileCloseAllGiven(const std::vector<int>& krvecBufferIndexes)
|
|||||||
|
|
||||||
// Now we close.
|
// Now we close.
|
||||||
bool isSnapshotMode = NppParameters::getInstance().getNppGUI().isSnapshotMode();
|
bool isSnapshotMode = NppParameters::getInstance().getNppGUI().isSnapshotMode();
|
||||||
for (const auto& index : bufferIndexesToClose)
|
for (const auto& i : buffersToClose)
|
||||||
{
|
{
|
||||||
doClose(_pDocTab->getBufferByIndex(index), currentView(), isSnapshotMode);
|
doClose(i._bufID, i._iView, isSnapshotMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -1304,32 +1302,32 @@ bool Notepad_plus::fileCloseAllToLeft()
|
|||||||
{
|
{
|
||||||
// Indexes must go from high to low to deal with the fact that when one index is closed, any remaining
|
// Indexes must go from high to low to deal with the fact that when one index is closed, any remaining
|
||||||
// indexes (smaller than the one just closed) will point to the wrong tab.
|
// indexes (smaller than the one just closed) will point to the wrong tab.
|
||||||
std::vector<int> vecIndexesToClose;
|
std::vector<BufferViewInfo> bufsToClose;
|
||||||
for (int i = _pDocTab->getCurrentTabIndex() - 1; i >= 0; i--)
|
for (int i = _pDocTab->getCurrentTabIndex() - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
vecIndexesToClose.push_back(i);
|
bufsToClose.push_back(BufferViewInfo(_pDocTab->getBufferByIndex(i), currentView()));
|
||||||
}
|
}
|
||||||
return fileCloseAllGiven(vecIndexesToClose);
|
return fileCloseAllGiven(bufsToClose);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Notepad_plus::fileCloseAllToRight()
|
bool Notepad_plus::fileCloseAllToRight()
|
||||||
{
|
{
|
||||||
// Indexes must go from high to low to deal with the fact that when one index is closed, any remaining
|
// Indexes must go from high to low to deal with the fact that when one index is closed, any remaining
|
||||||
// indexes (smaller than the one just closed) will point to the wrong tab.
|
// indexes (smaller than the one just closed) will point to the wrong tab.
|
||||||
const int kiActive = _pDocTab->getCurrentTabIndex();
|
const int iActive = _pDocTab->getCurrentTabIndex();
|
||||||
std::vector<int> vecIndexesToClose;
|
std::vector<BufferViewInfo> bufsToClose;
|
||||||
for (int i = int(_pDocTab->nbItem()) - 1; i > kiActive; i--)
|
for (int i = int(_pDocTab->nbItem()) - 1; i > iActive; i--)
|
||||||
{
|
{
|
||||||
vecIndexesToClose.push_back(i);
|
bufsToClose.push_back(BufferViewInfo(_pDocTab->getBufferByIndex(i), currentView()));
|
||||||
}
|
}
|
||||||
return fileCloseAllGiven(vecIndexesToClose);
|
return fileCloseAllGiven(bufsToClose);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Notepad_plus::fileCloseAllUnchanged()
|
bool Notepad_plus::fileCloseAllUnchanged()
|
||||||
{
|
{
|
||||||
// Indexes must go from high to low to deal with the fact that when one index is closed, any remaining
|
// Indexes must go from high to low to deal with the fact that when one index is closed, any remaining
|
||||||
// indexes (smaller than the one just closed) will point to the wrong tab.
|
// indexes (smaller than the one just closed) will point to the wrong tab.
|
||||||
std::vector<int> vecIndexesToClose;
|
std::vector<BufferViewInfo> bufsToClose;
|
||||||
|
|
||||||
for (int i = int(_pDocTab->nbItem()) - 1; i >= 0; i--)
|
for (int i = int(_pDocTab->nbItem()) - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
@ -1337,11 +1335,11 @@ bool Notepad_plus::fileCloseAllUnchanged()
|
|||||||
Buffer* buf = MainFileManager.getBufferByID(id);
|
Buffer* buf = MainFileManager.getBufferByID(id);
|
||||||
if ((buf->isUntitled() && buf->docLength() == 0) || !buf->isDirty())
|
if ((buf->isUntitled() && buf->docLength() == 0) || !buf->isDirty())
|
||||||
{
|
{
|
||||||
vecIndexesToClose.push_back(i);
|
bufsToClose.push_back(BufferViewInfo(_pDocTab->getBufferByIndex(i), currentView()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return fileCloseAllGiven(vecIndexesToClose);
|
return fileCloseAllGiven(bufsToClose);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Notepad_plus::fileCloseAllButCurrent()
|
bool Notepad_plus::fileCloseAllButCurrent()
|
||||||
|
@ -56,6 +56,14 @@ enum SavingStatus {
|
|||||||
SaveWritingFailed = 2
|
SaveWritingFailed = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct BufferViewInfo {
|
||||||
|
BufferID _bufID = 0;
|
||||||
|
int _iView = 0;
|
||||||
|
|
||||||
|
BufferViewInfo() = delete;
|
||||||
|
BufferViewInfo(BufferID buf, int view) : _bufID(buf), _iView(view) {};
|
||||||
|
};
|
||||||
|
|
||||||
const TCHAR UNTITLED_STR[] = TEXT("new ");
|
const TCHAR UNTITLED_STR[] = TEXT("new ");
|
||||||
|
|
||||||
//File manager class maintains all buffers
|
//File manager class maintains all buffers
|
||||||
|
@ -82,7 +82,7 @@ public:
|
|||||||
return _fileListView.nbSelectedFiles();
|
return _fileListView.nbSelectedFiles();
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<SwitcherFileInfo> getSelectedFiles(bool reverse = false) const {
|
std::vector<BufferViewInfo> getSelectedFiles(bool reverse = false) const {
|
||||||
return _fileListView.getSelectedFiles(reverse);
|
return _fileListView.getSelectedFiles(reverse);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -443,9 +443,9 @@ void VerticalFileSwitcherListView::resizeColumns(int totalWidth)
|
|||||||
ListView_SetColumnWidth(_hSelf, 0, totalWidth - totalColWidthDynExceptName);
|
ListView_SetColumnWidth(_hSelf, 0, totalWidth - totalColWidthDynExceptName);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<SwitcherFileInfo> VerticalFileSwitcherListView::getSelectedFiles(bool reverse) const
|
std::vector<BufferViewInfo> VerticalFileSwitcherListView::getSelectedFiles(bool reverse) const
|
||||||
{
|
{
|
||||||
std::vector<SwitcherFileInfo> files;
|
std::vector<BufferViewInfo> files;
|
||||||
LVITEM item{};
|
LVITEM item{};
|
||||||
int nbItem = ListView_GetItemCount(_hSelf);
|
int nbItem = ListView_GetItemCount(_hSelf);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@ -460,7 +460,7 @@ std::vector<SwitcherFileInfo> VerticalFileSwitcherListView::getSelectedFiles(boo
|
|||||||
ListView_GetItem(_hSelf, &item);
|
ListView_GetItem(_hSelf, &item);
|
||||||
|
|
||||||
TaskLstFnStatus *tlfs = (TaskLstFnStatus *)item.lParam;
|
TaskLstFnStatus *tlfs = (TaskLstFnStatus *)item.lParam;
|
||||||
files.push_back(SwitcherFileInfo(static_cast<BufferID>(tlfs->_bufID), tlfs->_iView));
|
files.push_back(BufferViewInfo(static_cast<BufferID>(tlfs->_bufID), tlfs->_iView));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,9 +19,7 @@
|
|||||||
|
|
||||||
#include "Window.h"
|
#include "Window.h"
|
||||||
#include "TaskListDlg.h"
|
#include "TaskListDlg.h"
|
||||||
|
#include "Buffer.h"
|
||||||
class Buffer;
|
|
||||||
typedef Buffer * BufferID; //each buffer has unique ID by which it can be retrieved
|
|
||||||
|
|
||||||
#define SORT_DIRECTION_NONE -1
|
#define SORT_DIRECTION_NONE -1
|
||||||
#define SORT_DIRECTION_UP 0
|
#define SORT_DIRECTION_UP 0
|
||||||
@ -33,13 +31,6 @@ typedef Buffer * BufferID; //each buffer has unique ID by which it can be retrie
|
|||||||
#define FS_CLMNPATH "ColumnPath"
|
#define FS_CLMNPATH "ColumnPath"
|
||||||
#define FS_LVGROUPS "ListGroups"
|
#define FS_LVGROUPS "ListGroups"
|
||||||
|
|
||||||
struct SwitcherFileInfo {
|
|
||||||
BufferID _bufID = 0;
|
|
||||||
int _iView = 0;
|
|
||||||
|
|
||||||
SwitcherFileInfo() = delete;
|
|
||||||
SwitcherFileInfo(BufferID buf, int view) : _bufID(buf), _iView(view){};
|
|
||||||
};
|
|
||||||
|
|
||||||
class VerticalFileSwitcherListView : public Window
|
class VerticalFileSwitcherListView : public Window
|
||||||
{
|
{
|
||||||
@ -70,7 +61,7 @@ public:
|
|||||||
return static_cast<int32_t>(SendMessage(_hSelf, LVM_GETSELECTEDCOUNT, 0, 0));
|
return static_cast<int32_t>(SendMessage(_hSelf, LVM_GETSELECTEDCOUNT, 0, 0));
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<SwitcherFileInfo> getSelectedFiles(bool reverse = false) const;
|
std::vector<BufferViewInfo> getSelectedFiles(bool reverse = false) const;
|
||||||
void reload();
|
void reload();
|
||||||
void ensureVisibleCurrentItem() const {
|
void ensureVisibleCurrentItem() const {
|
||||||
ListView_EnsureVisible(_hSelf, _currentIndex, false);
|
ListView_EnsureVisible(_hSelf, _currentIndex, false);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user