[DEV] multiple save and close start to work

This commit is contained in:
Edouard DUPIN 2013-11-17 20:37:06 +01:00
parent e32253cd98
commit 9ca83d1718
8 changed files with 209 additions and 14 deletions

View File

@ -33,7 +33,9 @@
#include <date/date.h> #include <date/date.h>
#include <ewol/widget/meta/StdPopUp.h> #include <ewol/widget/meta/StdPopUp.h>
#include <appl/Gui/WorkerSaveFile.h> #include <appl/Gui/WorkerSaveFile.h>
#include <appl/Gui/WorkerSaveAllFile.h>
#include <appl/Gui/WorkerCloseFile.h> #include <appl/Gui/WorkerCloseFile.h>
#include <appl/Gui/WorkerCloseAllFile.h>
namespace appl namespace appl
{ {
@ -357,7 +359,7 @@ void MainWindows::onReceiveMessage(const ewol::EMessage& _msg) {
} else if (_msg.getMessage() == ednMsgGuiSave) { } else if (_msg.getMessage() == ednMsgGuiSave) {
APPL_DEBUG("Request saving the file : " << _msg.getData()); APPL_DEBUG("Request saving the file : " << _msg.getData());
if (to_lower(_msg.getData()) == "current") { if (to_lower(_msg.getData()) == "current") {
appl::WorkerSaveFile* tmpWorker = new appl::WorkerSaveFile(""); appl::WorkerSaveFile* tmpWorker = new appl::WorkerSaveFile("", false);
#if 0 #if 0
appl::Buffer* tmpBuffer = m_bufferManager->getBufferSelected(); appl::Buffer* tmpBuffer = m_bufferManager->getBufferSelected();
if (tmpBuffer == NULL) { if (tmpBuffer == NULL) {

View File

@ -0,0 +1,93 @@
/**
* @author Edouard DUPIN
*
* @copyright 2010, Edouard DUPIN, all right reserved
*
* @license GPL v3 (see license file)
*/
#include <ewol/renderer/eContext.h>
#include <appl/debug.h>
#include <appl/Gui/WorkerCloseAllFile.h>
#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();
}
}

View File

@ -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 <appl/BufferManager.h>
#include <appl/Gui/WorkerCloseFile.h>
namespace appl {
class WorkerCloseAllFile : public ewol::EObject {
public:
WorkerCloseAllFile(void);
virtual ~WorkerCloseAllFile(void);
private:
std::vector<std::string> 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

View File

@ -9,19 +9,23 @@
#include <ewol/renderer/eContext.h> #include <ewol/renderer/eContext.h>
#include <appl/debug.h> #include <appl/debug.h>
#include <appl/Gui/WorkerCloseFile.h> #include <appl/Gui/WorkerCloseFile.h>
#include <ewol/widget/meta/StdPopUp.h>
#undef __class__ #undef __class__
#define __class__ "WorkerCloseFile" #define __class__ "WorkerCloseFile"
const char* appl::WorkerCloseFile::eventCloseDone = "close-file-done";
static const char* s_saveAsValidate = "save-as-validate"; static const char* s_saveAsValidate = "save-as-validate";
static const char* s_saveValidate = "save-validate"; static const char* s_saveValidate = "save-validate";
static const char* s_closeValidate = "close-validate"; static const char* s_closeValidate = "close-validate";
static const char* s_saveAsDone = "save-as-done";
appl::WorkerCloseFile::WorkerCloseFile(const std::string& _bufferName) : appl::WorkerCloseFile::WorkerCloseFile(const std::string& _bufferName) :
m_closeAfter(_close),
m_bufferName(_bufferName), m_bufferName(_bufferName),
m_worker(NULL), m_worker(NULL),
m_bufferManager(NULL) { m_bufferManager(NULL) {
addEventId(eventCloseDone);
// load buffer manager: // load buffer manager:
m_bufferManager = appl::BufferManager::keep(); m_bufferManager = appl::BufferManager::keep();
@ -30,6 +34,16 @@ appl::WorkerCloseFile::WorkerCloseFile(const std::string& _bufferName) :
autoDestroy(); autoDestroy();
return; 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) { if (m_bufferManager->exist(m_bufferName) == false) {
APPL_ERROR("Try to close an non-existant file :" << m_bufferName); APPL_ERROR("Try to close an non-existant file :" << m_bufferName);
autoDestroy(); autoDestroy();
@ -43,8 +57,7 @@ appl::WorkerCloseFile::WorkerCloseFile(const std::string& _bufferName) :
} }
if (tmpBuffer->isModify() == false) { if (tmpBuffer->isModify() == false) {
tmpBuffer->removeObject(); tmpBuffer->removeObject();
// TODO : Send message ... generateEventId(eventCloseDone);
autoDestroy(); autoDestroy();
return; return;
} }
@ -94,10 +107,45 @@ void appl::WorkerCloseFile::onReceiveMessage(const ewol::EMessage& _msg) {
APPL_DEBUG("have message : " << _msg); APPL_DEBUG("have message : " << _msg);
if (_msg.getMessage() == s_saveAsValidate) { 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_saveValidate) {
if (m_bufferManager->exist(m_bufferName) == false) {
} else if (_msg.getMessage() == s_closeValidate) { 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 : <br/><i>" + tmpBuffer->getFileName() + "</i>");
} 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;
} }
} }

View File

@ -15,6 +15,8 @@
namespace appl { namespace appl {
class WorkerCloseFile : public ewol::EObject { class WorkerCloseFile : public ewol::EObject {
public:
static const char* eventCloseDone;
public: public:
// note : if == "" ==> current ... // note : if == "" ==> current ...
WorkerCloseFile(const std::string& _bufferName); WorkerCloseFile(const std::string& _bufferName);

View File

@ -8,10 +8,10 @@
#include <ewol/renderer/eContext.h> #include <ewol/renderer/eContext.h>
#include <appl/debug.h> #include <appl/debug.h>
#include <appl/Gui/WorkerSaveFile.h> #include <appl/Gui/WorkerSaveAllFile.h>
#undef __class__ #undef __class__
#define __class__ "WorkerSaveFile" #define __class__ "WorkerSaveAllFile"
static const char* s_saveAsDone = "save-as-done"; static const char* s_saveAsDone = "save-as-done";
@ -49,7 +49,7 @@ appl::WorkerSaveAllFile::WorkerSaveAllFile(void) :
// create the worker : // create the worker :
m_worker = new appl::WorkerSaveFile(m_bufferNameList.front()); m_worker = new appl::WorkerSaveFile(m_bufferNameList.front());
// remove first element : // remove first element :
m_bufferNameList.pop_front(); m_bufferNameList.erase(m_bufferNameList.begin());
if (m_bufferNameList.size() == 0) { if (m_bufferNameList.size() == 0) {
autoDestroy(); autoDestroy();
return; return;
@ -74,7 +74,7 @@ void appl::WorkerSaveAllFile::onReceiveMessage(const ewol::EMessage& _msg) {
// create the worker : // create the worker :
m_worker = new appl::WorkerSaveFile(m_bufferNameList.front()); m_worker = new appl::WorkerSaveFile(m_bufferNameList.front());
// remove first element : // remove first element :
m_bufferNameList.pop_front(); m_bufferNameList.erase(m_bufferNameList.begin());
if (m_bufferNameList.size() == 0) { if (m_bufferNameList.size() == 0) {
autoDestroy(); autoDestroy();
return; return;

View File

@ -13,7 +13,7 @@
#undef __class__ #undef __class__
#define __class__ "WorkerSaveFile" #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"; static const char* s_saveAsValidate = "save-as-validate";
@ -30,7 +30,16 @@ appl::WorkerSaveFile::WorkerSaveFile(const std::string& _bufferName, bool _force
autoDestroy(); autoDestroy();
return; 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) { if (m_bufferManager->exist(m_bufferName) == false) {
APPL_ERROR("Try to save an non-existant file :" << m_bufferName); APPL_ERROR("Try to save an non-existant file :" << m_bufferName);
autoDestroy(); autoDestroy();
@ -42,6 +51,14 @@ appl::WorkerSaveFile::WorkerSaveFile(const std::string& _bufferName, bool _force
autoDestroy(); autoDestroy();
return; return;
} }
if (_forceSaveAs == false) {
if (tmpBuffer->hasFileName() == true) {
tmpBuffer->storeFile();
generateEventId(eventSaveDone);
autoDestroy();
return;
}
}
m_chooser = new widget::FileChooser(); m_chooser = new widget::FileChooser();
if (NULL == m_chooser) { if (NULL == m_chooser) {
APPL_ERROR("Can not allocate widget == > display might be in error"); APPL_ERROR("Can not allocate widget == > display might be in error");
@ -93,6 +110,8 @@ void appl::WorkerSaveFile::onReceiveMessage(const ewol::EMessage& _msg) {
return; return;
} }
tmpWindows->displayWarningMessage("We can not save the file : <br/><i>" + tmpBuffer->getFileName() + "</i>"); tmpWindows->displayWarningMessage("We can not save the file : <br/><i>" + tmpBuffer->getFileName() + "</i>");
} else {
generateEventId(eventSaveDone);
} }
} }
} }

View File

@ -17,7 +17,7 @@ namespace appl {
public: public:
static const char* eventSaveDone; static const char* eventSaveDone;
public: public:
WorkerSaveFile(const std::string& _bufferName, bool _forceSaveAs=false); WorkerSaveFile(const std::string& _bufferName, bool _forceSaveAs=true);
virtual ~WorkerSaveFile(void); virtual ~WorkerSaveFile(void);
private: private:
std::string m_bufferName; std::string m_bufferName;