[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 <ewol/widget/meta/StdPopUp.h>
#include <appl/Gui/WorkerSaveFile.h>
#include <appl/Gui/WorkerSaveAllFile.h>
#include <appl/Gui/WorkerCloseFile.h>
#include <appl/Gui/WorkerCloseAllFile.h>
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) {

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 <appl/debug.h>
#include <appl/Gui/WorkerCloseFile.h>
#include <ewol/widget/meta/StdPopUp.h>
#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 : <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 {
class WorkerCloseFile : public ewol::EObject {
public:
static const char* eventCloseDone;
public:
// note : if == "" ==> current ...
WorkerCloseFile(const std::string& _bufferName);

View File

@ -8,10 +8,10 @@
#include <ewol/renderer/eContext.h>
#include <appl/debug.h>
#include <appl/Gui/WorkerSaveFile.h>
#include <appl/Gui/WorkerSaveAllFile.h>
#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;

View File

@ -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 : <br/><i>" + tmpBuffer->getFileName() + "</i>");
} else {
generateEventId(eventSaveDone);
}
}
}

View File

@ -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;