From 9ca83d17188d4a18d705041d5dafbe0f22ea9ffd Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Sun, 17 Nov 2013 20:37:06 +0100 Subject: [PATCH] [DEV] multiple save and close start to work --- sources/appl/Gui/MainWindows.cpp | 4 +- sources/appl/Gui/WorkerCloseAllFile.cpp | 93 +++++++++++++++++++++++++ sources/appl/Gui/WorkerCloseAllFile.h | 31 +++++++++ sources/appl/Gui/WorkerCloseFile.cpp | 60 ++++++++++++++-- sources/appl/Gui/WorkerCloseFile.h | 2 + sources/appl/Gui/WorkerSaveAllFile.cpp | 8 +-- sources/appl/Gui/WorkerSaveFile.cpp | 23 +++++- sources/appl/Gui/WorkerSaveFile.h | 2 +- 8 files changed, 209 insertions(+), 14 deletions(-) diff --git a/sources/appl/Gui/MainWindows.cpp b/sources/appl/Gui/MainWindows.cpp index 62299d4..1b4fe1f 100644 --- a/sources/appl/Gui/MainWindows.cpp +++ b/sources/appl/Gui/MainWindows.cpp @@ -33,7 +33,9 @@ #include #include #include +#include #include +#include namespace appl { @@ -357,7 +359,7 @@ void MainWindows::onReceiveMessage(const ewol::EMessage& _msg) { } else if (_msg.getMessage() == ednMsgGuiSave) { APPL_DEBUG("Request saving the file : " << _msg.getData()); if (to_lower(_msg.getData()) == "current") { - appl::WorkerSaveFile* tmpWorker = new appl::WorkerSaveFile(""); + appl::WorkerSaveFile* tmpWorker = new appl::WorkerSaveFile("", false); #if 0 appl::Buffer* tmpBuffer = m_bufferManager->getBufferSelected(); if (tmpBuffer == NULL) { diff --git a/sources/appl/Gui/WorkerCloseAllFile.cpp b/sources/appl/Gui/WorkerCloseAllFile.cpp index e69de29..76a8cea 100644 --- a/sources/appl/Gui/WorkerCloseAllFile.cpp +++ b/sources/appl/Gui/WorkerCloseAllFile.cpp @@ -0,0 +1,93 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2010, Edouard DUPIN, all right reserved + * + * @license GPL v3 (see license file) + */ + +#include +#include +#include + +#undef __class__ +#define __class__ "WorkerCloseAllFile" + +static const char* s_closeDone = "close-done"; + +appl::WorkerCloseAllFile::WorkerCloseAllFile(void) : + m_worker(NULL), + m_bufferManager(NULL) { + // load buffer manager: + m_bufferManager = appl::BufferManager::keep(); + + if (m_bufferManager == NULL) { + APPL_ERROR("can not call unexistant buffer manager ... "); + autoDestroy(); + return; + } + // List all current open file : + for (int64_t iii=m_bufferManager->size()-1; iii>=0; --iii) { + appl::Buffer* tmpBuffer = m_bufferManager->get(iii); + if (tmpBuffer == NULL) { + continue; + } + if (tmpBuffer->isModify() == false) { + tmpBuffer->removeObject(); + continue; + } + m_bufferNameList.push_back(tmpBuffer->getFileName()); + } + // checkif an element has something to do in the queue + if (m_bufferNameList.size() == 0) { + autoDestroy(); + return; + } + // create the worker : + m_worker = new appl::WorkerCloseFile(m_bufferNameList.front()); + // remove first element : + m_bufferNameList.erase(m_bufferNameList.begin()); + if (m_bufferNameList.size() == 0) { + autoDestroy(); + return; + } + m_worker->registerOnEvent(this, appl::WorkerCloseFile::eventCloseDone, s_closeDone); +} + +appl::WorkerCloseAllFile::~WorkerCloseAllFile(void) { + appl::BufferManager::release(m_bufferManager); +} + +void appl::WorkerCloseAllFile::onReceiveMessage(const ewol::EMessage& _msg) { + if (m_bufferManager == NULL) { + // nothing to do in this case ==> can do nothing ... + return; + } + if (_msg.getMessage() == s_closeDone) { + if (m_bufferNameList.size() == 0) { + autoDestroy(); + return; + } + // create the worker : + m_worker = new appl::WorkerCloseFile(m_bufferNameList.front()); + // remove first element : + m_bufferNameList.erase(m_bufferNameList.begin()); + if (m_bufferNameList.size() == 0) { + autoDestroy(); + return; + } + m_worker->registerOnEvent(this, appl::WorkerCloseFile::eventCloseDone, s_closeDone); + } +} + +void appl::WorkerCloseAllFile::onObjectRemove(ewol::EObject* _removeObject) { + if (_removeObject == m_worker) { + m_worker = NULL; + APPL_VERBOSE("AutoRemove After saving sub widget ..."); + autoDestroy(); + } else if (_removeObject == m_bufferManager) { + m_bufferManager = NULL; + autoDestroy(); + } +} + diff --git a/sources/appl/Gui/WorkerCloseAllFile.h b/sources/appl/Gui/WorkerCloseAllFile.h index e69de29..e210e6c 100644 --- a/sources/appl/Gui/WorkerCloseAllFile.h +++ b/sources/appl/Gui/WorkerCloseAllFile.h @@ -0,0 +1,31 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2010, Edouard DUPIN, all right reserved + * + * @license GPL v3 (see license file) + */ + +#ifndef __WORKER_CLOSE_ALL_FILE_H__ +#define __WORKER_CLOSE_ALL_FILE_H__ + +#include +#include + +namespace appl { + class WorkerCloseAllFile : public ewol::EObject { + public: + WorkerCloseAllFile(void); + virtual ~WorkerCloseAllFile(void); + private: + std::vector m_bufferNameList; + appl::WorkerCloseFile* m_worker; //! pop-up element that is open... + appl::BufferManager* m_bufferManager; //!< handle on the buffer manager + public: // derived function + virtual void onReceiveMessage(const ewol::EMessage& _msg); + virtual void onObjectRemove(ewol::EObject * _removeObject); + }; +}; + +#endif + diff --git a/sources/appl/Gui/WorkerCloseFile.cpp b/sources/appl/Gui/WorkerCloseFile.cpp index 89116a8..2e617b1 100644 --- a/sources/appl/Gui/WorkerCloseFile.cpp +++ b/sources/appl/Gui/WorkerCloseFile.cpp @@ -9,19 +9,23 @@ #include #include #include +#include #undef __class__ #define __class__ "WorkerCloseFile" +const char* appl::WorkerCloseFile::eventCloseDone = "close-file-done"; + static const char* s_saveAsValidate = "save-as-validate"; static const char* s_saveValidate = "save-validate"; static const char* s_closeValidate = "close-validate"; +static const char* s_saveAsDone = "save-as-done"; appl::WorkerCloseFile::WorkerCloseFile(const std::string& _bufferName) : - m_closeAfter(_close), m_bufferName(_bufferName), m_worker(NULL), m_bufferManager(NULL) { + addEventId(eventCloseDone); // load buffer manager: m_bufferManager = appl::BufferManager::keep(); @@ -30,6 +34,16 @@ appl::WorkerCloseFile::WorkerCloseFile(const std::string& _bufferName) : autoDestroy(); return; } + if (m_bufferName == "") { + // need to find the curent file ... + appl::Buffer* tmpp = m_bufferManager->getBufferSelected(); + if (tmpp == NULL) { + APPL_ERROR("No selected buffer now ..."); + autoDestroy(); + return; + } + m_bufferName = tmpp->getFileName(); + } if (m_bufferManager->exist(m_bufferName) == false) { APPL_ERROR("Try to close an non-existant file :" << m_bufferName); autoDestroy(); @@ -43,8 +57,7 @@ appl::WorkerCloseFile::WorkerCloseFile(const std::string& _bufferName) : } if (tmpBuffer->isModify() == false) { tmpBuffer->removeObject(); - // TODO : Send message ... - + generateEventId(eventCloseDone); autoDestroy(); return; } @@ -94,10 +107,45 @@ void appl::WorkerCloseFile::onReceiveMessage(const ewol::EMessage& _msg) { APPL_DEBUG("have message : " << _msg); if (_msg.getMessage() == s_saveAsValidate) { + appl::WorkerSaveFile* tmpWorker = new appl::WorkerSaveFile(m_bufferName); + m_worker->registerOnEvent(this, appl::WorkerSaveFile::eventSaveDone, s_saveAsDone); } else if (_msg.getMessage() == s_saveValidate) { - - } else if (_msg.getMessage() == s_closeValidate) { - + if (m_bufferManager->exist(m_bufferName) == false) { + APPL_ERROR("Try to close an non-existant file :" << m_bufferName); + autoDestroy(); + return; + } + appl::Buffer* tmpBuffer = m_bufferManager->get(m_bufferName); + if (tmpBuffer == NULL) { + APPL_ERROR("Error to get the buffer : " << m_bufferName); + autoDestroy(); + return; + } + if (tmpBuffer->storeFile() == false) { + ewol::Windows* tmpWindows = ewol::getContext().getWindows(); + if (tmpWindows == NULL) { + return; + } + tmpWindows->displayWarningMessage("We can not save the file :
" + tmpBuffer->getFileName() + ""); + } else { + generateEventId(eventCloseDone); + } + } else if ( _msg.getMessage() == s_closeValidate + || _msg.getMessage() == s_saveAsDone) { + if (m_bufferManager->exist(m_bufferName) == false) { + APPL_ERROR("Try to close an non-existant file :" << m_bufferName); + autoDestroy(); + return; + } + appl::Buffer* tmpBuffer = m_bufferManager->get(m_bufferName); + if (tmpBuffer == NULL) { + APPL_ERROR("Error to get the buffer : " << m_bufferName); + autoDestroy(); + return; + } + tmpBuffer->removeObject(); + generateEventId(eventCloseDone); + tmpBuffer = NULL; } } diff --git a/sources/appl/Gui/WorkerCloseFile.h b/sources/appl/Gui/WorkerCloseFile.h index da5fa3f..914145b 100644 --- a/sources/appl/Gui/WorkerCloseFile.h +++ b/sources/appl/Gui/WorkerCloseFile.h @@ -15,6 +15,8 @@ namespace appl { class WorkerCloseFile : public ewol::EObject { + public: + static const char* eventCloseDone; public: // note : if == "" ==> current ... WorkerCloseFile(const std::string& _bufferName); diff --git a/sources/appl/Gui/WorkerSaveAllFile.cpp b/sources/appl/Gui/WorkerSaveAllFile.cpp index eb29b18..0f26263 100644 --- a/sources/appl/Gui/WorkerSaveAllFile.cpp +++ b/sources/appl/Gui/WorkerSaveAllFile.cpp @@ -8,10 +8,10 @@ #include #include -#include +#include #undef __class__ -#define __class__ "WorkerSaveFile" +#define __class__ "WorkerSaveAllFile" static const char* s_saveAsDone = "save-as-done"; @@ -49,7 +49,7 @@ appl::WorkerSaveAllFile::WorkerSaveAllFile(void) : // create the worker : m_worker = new appl::WorkerSaveFile(m_bufferNameList.front()); // remove first element : - m_bufferNameList.pop_front(); + m_bufferNameList.erase(m_bufferNameList.begin()); if (m_bufferNameList.size() == 0) { autoDestroy(); return; @@ -74,7 +74,7 @@ void appl::WorkerSaveAllFile::onReceiveMessage(const ewol::EMessage& _msg) { // create the worker : m_worker = new appl::WorkerSaveFile(m_bufferNameList.front()); // remove first element : - m_bufferNameList.pop_front(); + m_bufferNameList.erase(m_bufferNameList.begin()); if (m_bufferNameList.size() == 0) { autoDestroy(); return; diff --git a/sources/appl/Gui/WorkerSaveFile.cpp b/sources/appl/Gui/WorkerSaveFile.cpp index a0b1d19..f37dd0f 100644 --- a/sources/appl/Gui/WorkerSaveFile.cpp +++ b/sources/appl/Gui/WorkerSaveFile.cpp @@ -13,7 +13,7 @@ #undef __class__ #define __class__ "WorkerSaveFile" -static const char* appl::WorkerSaveFile::eventSaveDone = "save-file-done"; +const char* appl::WorkerSaveFile::eventSaveDone = "save-file-done"; static const char* s_saveAsValidate = "save-as-validate"; @@ -30,7 +30,16 @@ appl::WorkerSaveFile::WorkerSaveFile(const std::string& _bufferName, bool _force autoDestroy(); return; } - // TODO : if "" ==> it is current buffer selected ... + if (m_bufferName == "") { + // need to find the curent file ... + appl::Buffer* tmpp = m_bufferManager->getBufferSelected(); + if (tmpp == NULL) { + APPL_ERROR("No selected buffer now ..."); + autoDestroy(); + return; + } + m_bufferName = tmpp->getFileName(); + } if (m_bufferManager->exist(m_bufferName) == false) { APPL_ERROR("Try to save an non-existant file :" << m_bufferName); autoDestroy(); @@ -42,6 +51,14 @@ appl::WorkerSaveFile::WorkerSaveFile(const std::string& _bufferName, bool _force autoDestroy(); return; } + if (_forceSaveAs == false) { + if (tmpBuffer->hasFileName() == true) { + tmpBuffer->storeFile(); + generateEventId(eventSaveDone); + autoDestroy(); + return; + } + } m_chooser = new widget::FileChooser(); if (NULL == m_chooser) { APPL_ERROR("Can not allocate widget == > display might be in error"); @@ -93,6 +110,8 @@ void appl::WorkerSaveFile::onReceiveMessage(const ewol::EMessage& _msg) { return; } tmpWindows->displayWarningMessage("We can not save the file :
" + tmpBuffer->getFileName() + ""); + } else { + generateEventId(eventSaveDone); } } } diff --git a/sources/appl/Gui/WorkerSaveFile.h b/sources/appl/Gui/WorkerSaveFile.h index dd68411..77109d0 100644 --- a/sources/appl/Gui/WorkerSaveFile.h +++ b/sources/appl/Gui/WorkerSaveFile.h @@ -17,7 +17,7 @@ namespace appl { public: static const char* eventSaveDone; public: - WorkerSaveFile(const std::string& _bufferName, bool _forceSaveAs=false); + WorkerSaveFile(const std::string& _bufferName, bool _forceSaveAs=true); virtual ~WorkerSaveFile(void); private: std::string m_bufferName;