edn/sources/appl/Buffer/BufferManager.cpp

521 lines
13 KiB
C++
Raw Normal View History

/**
* @author Edouard DUPIN
2012-11-25 11:55:06 +01:00
*
* @copyright 2010, Edouard DUPIN, all right reserved
*
* @license GPL v3 (see license file)
*/
2012-04-23 10:15:43 +02:00
#include <appl/Debug.h>
2012-04-24 09:42:14 +02:00
#include <appl/global.h>
#include <BufferManager.h>
2013-09-02 06:45:12 +02:00
#include <ewol/renderer/EObject.h>
#include <ewol/renderer/EObjectManager.h>
#undef __class__
#define __class__ "classBufferManager"
2013-10-09 22:00:24 +02:00
#if 0
class classBufferManager: public ewol::EObject {
public:
// Constructeur
classBufferManager(void);
~classBufferManager(void);
2013-10-07 22:04:21 +02:00
const char * const getObjectType(void)
{
2012-07-24 17:48:18 +02:00
return "ApplBufferManager";
}
public:
2013-10-07 22:04:21 +02:00
virtual void onReceiveMessage(const ewol::EMessage& _msg);
private:
// return the ID of the buffer allocated
// create a buffer with no element
2013-10-09 22:00:24 +02:00
int32_t create(void);
// open curent filename
2013-10-07 22:04:21 +02:00
int32_t open(etk::FSNode &myFile);
bool remove(int32_t BufferID);
public:
2013-10-07 22:04:21 +02:00
int32_t getSelected(void) { return m_idSelected;};
//void setSelected(int32_t id) {m_idSelected = id;};
BufferText* get(int32_t BufferID);
2013-10-09 22:00:24 +02:00
bool exist(int32_t BufferID);
bool exist(etk::FSNode &myFile);
2013-10-07 22:04:21 +02:00
int32_t getId(etk::FSNode &myFile);
// return the number of buffer (open in the past) if 5 buffer open and 4 close == > return 5
uint32_t size(void);
uint32_t sizeOpen(void);
2013-10-09 22:00:24 +02:00
int32_t witchBuffer(int32_t iEmeElement);
private:
etk::Vector<BufferText*> listBuffer; //!< element List of the char Elements
2013-10-07 22:04:21 +02:00
void removeAll(void); //!< remove all buffer
int32_t m_idSelected;
};
// Constructeur
classBufferManager::classBufferManager(void)
{
m_idSelected = -1;
2012-02-29 18:06:08 +01:00
RegisterMultiCast(ednMsgGuiNew);
RegisterMultiCast(ednMsgOpenFile);
RegisterMultiCast(ednMsgGuiClose);
RegisterMultiCast(ednMsgGuiSave);
RegisterMultiCast(ednMsgCodeViewSelectedId);
RegisterMultiCast(ednMsgBufferId);
}
classBufferManager::~classBufferManager(void)
{
//clean All Buffer
2013-10-07 22:04:21 +02:00
APPL_INFO("~classBufferManager::removeAll();");
removeAll();
// clear The list of Buffer
2013-10-07 22:04:21 +02:00
APPL_INFO("~classBufferManager::listBuffer.clear();");
listBuffer.clear();
}
2013-10-07 22:04:21 +02:00
void classBufferManager::onReceiveMessage(const ewol::EMessage& _msg)
{
2013-10-07 22:04:21 +02:00
ewol::EObject::onReceiveMessage(_msg);
2012-02-29 18:06:08 +01:00
2013-10-07 22:04:21 +02:00
if (_msg.getMessage() == ednMsgBufferId) {
// select a new buffer ID :
2013-10-07 22:04:21 +02:00
if (_msg.getData() == "") {
2012-04-23 10:15:43 +02:00
APPL_ERROR("Request select buffer ID = \"\" ");
} else {
int32_t newID = -1;
2013-10-07 22:04:21 +02:00
sscanf(_msg.getData().c_str(), "%d", &newID);
if(true == Exist(newID)) {
m_idSelected = newID;
} else {
m_idSelected = -1;
2012-04-23 10:15:43 +02:00
APPL_ERROR("Request a non existant ID : " << newID << " reset to -1...");
}
}
2013-10-07 22:04:21 +02:00
} else if (_msg.getMessage() == ednMsgGuiNew) {
int32_t newOne = Create();
if (-1 != newOne) {
m_idSelected = newOne;
2012-02-29 18:06:08 +01:00
SendMultiCast(ednMsgBufferId, m_idSelected);
SendMultiCast(ednMsgBufferListChange);
}
2013-10-07 22:04:21 +02:00
} else if (_msg.getMessage() == ednMsgOpenFile) {
if (_msg.getData() != "" ) {
etk::FSNode myFile(_msg.getData());
if (myFile.getNodeType() == etk::FSN_FILE) {
APPL_DEBUG("request open file = \"" << _msg.getData() << "\" ?= \"" << myFile << "\"");
int32_t newOne = open(myFile);
if (-1 != newOne) {
m_idSelected = newOne;
SendMultiCast(ednMsgBufferId, m_idSelected);
SendMultiCast(ednMsgBufferListChange);
} else {
// TODO : notify user that we can not open the request file...
APPL_ERROR("Can not open the file : \"" << myFile << "\"");
}
2012-05-10 17:47:52 +02:00
} else {
2013-10-07 22:04:21 +02:00
APPL_ERROR("Request to open an Unknox element file : " << myFile << " type:" << myFile.getNodeType());
2012-02-05 22:03:36 +01:00
}
}
2013-10-07 22:04:21 +02:00
} else if (_msg.getMessage() == ednMsgGuiSave) {
if (_msg.getData() == "") {
2012-04-23 10:15:43 +02:00
APPL_ERROR("Null data for close file ... ");
} else {
2013-10-07 22:04:21 +02:00
if (_msg.getData() == "current") {
// Check buffer existence
if(true == Exist(m_idSelected)) {
2013-10-07 22:04:21 +02:00
// If no name == > request a Gui display ...
if (get(m_idSelected)->haveName() == false) {
2012-02-29 18:06:08 +01:00
SendMultiCast(ednMsgGuiSaveAs, "current");
} else {
2013-10-07 22:04:21 +02:00
get(m_idSelected)->Save();
}
}
} else {
int32_t newId;
2013-10-07 22:04:21 +02:00
sscanf(_msg.getData().c_str(), "%d", &newId);
if (false == Exist(newId)) {
2012-04-23 10:15:43 +02:00
APPL_ERROR("Request a save As with a non existant ID=" << newId);
} else {
2013-10-07 22:04:21 +02:00
// If no name == > request a Gui display ...
if (get(newId)->haveName() == false) {
2012-02-29 18:06:08 +01:00
SendMultiCast(ednMsgGuiSaveAs, newId);
} else {
2013-10-07 22:04:21 +02:00
get(m_idSelected)->Save();
}
}
2012-02-29 18:06:08 +01:00
SendMultiCast(ednMsgBufferState, "saved");
}
}
2013-10-07 22:04:21 +02:00
} else if (_msg.getMessage() == ednMsgGuiClose) {
if (_msg.getData() == "") {
2012-04-23 10:15:43 +02:00
APPL_ERROR("Null data for close file ... ");
} else {
2013-10-07 22:04:21 +02:00
if (_msg.getData() == "All") {
} else {
int32_t closeID = -1;
2013-10-07 22:04:21 +02:00
if (_msg.getData() == "current") {
closeID = m_idSelected;
2012-04-23 10:15:43 +02:00
APPL_DEBUG("Close specific buffer ID" << closeID);
} else {
// close specific buffer ...
2013-10-07 22:04:21 +02:00
sscanf(_msg.getData().c_str(), "%d", &closeID);
2012-04-23 10:15:43 +02:00
APPL_DEBUG("Close specific buffer ID="<< closeID);
}
if(true == Exist(closeID)) {
2013-10-07 22:04:21 +02:00
// get the new display buffer
if (m_idSelected == closeID) {
// Try previous buffer
int32_t destBuffer = -1;
for(int32_t ii=closeID-1; ii >= 0; ii--) {
if (true == Exist(ii) ) {
destBuffer = ii;
break;
}
}
// try next buffer
if (-1 == destBuffer) {
2013-10-07 22:04:21 +02:00
for(int32_t ii=closeID+1; ii < listBuffer.size(); ii++) {
if (true == Exist(ii) ) {
destBuffer = ii;
break;
}
}
}
// set it to the currect display
m_idSelected = destBuffer;
SendMultiCast(ednMsgBufferId, destBuffer);
}
2013-10-07 22:04:21 +02:00
// remove requested buffer
remove(closeID);
2012-02-29 18:06:08 +01:00
SendMultiCast(ednMsgBufferListChange);
} else {
2013-10-07 22:04:21 +02:00
APPL_ERROR("Request close of a non existant ID : " << closeID);
}
}
}
2013-10-07 22:04:21 +02:00
} else if (_msg.getMessage() == ednMsgCodeViewSelectedId) {
//Change the selected buffer
2013-10-07 22:04:21 +02:00
if (_msg.getData() == "") {
2012-04-23 10:15:43 +02:00
APPL_ERROR("Null data for changing buffer ID file ... ");
} else {
int32_t newId;
2013-10-07 22:04:21 +02:00
sscanf(_msg.getData().c_str(), "%d", &newId);
if (true == Exist(newId)) {
m_idSelected = newId;
} else {
2013-10-07 22:04:21 +02:00
APPL_ERROR("code biew request the selection of an non -existant buffer == > reset to -1");
m_idSelected = -1;
}
2012-02-29 18:06:08 +01:00
SendMultiCast(ednMsgBufferId, m_idSelected);
SendMultiCast(ednMsgBufferListChange);
}
}
/*
switch (id)
{
// Check buffer existence
if(true == Exist(dataID)) {
2013-10-07 22:04:21 +02:00
// If no name == > request a Gui display ...
if (get(dataID)->haveName() == false) {
2012-04-23 10:15:43 +02:00
SendMessage(APPL_MSG__GUI_SHOW_SAVE_AS, dataID);
} else {
2013-10-07 22:04:21 +02:00
get(dataID)->Save();
}
}
break;
}
*/
}
2013-10-09 22:00:24 +02:00
void classBufferManager::removeAll(void) {
int32_t i;
2013-10-07 22:04:21 +02:00
for (i=0; i<listBuffer.size(); i++) {
remove(i);
}
2012-02-29 18:06:08 +01:00
SendMultiCast(ednMsgGuiClose, "All");
}
/**
* @brief Create a new buffer with no name and empty
* @return The ID of the curent buffer where the file is loaded
*/
2013-10-09 22:00:24 +02:00
int32_t classBufferManager::create(void) {
// allocate a new Buffer
BufferText *myBuffer = new BufferText();
2013-10-07 22:04:21 +02:00
// add at the list of element
listBuffer.pushBack(myBuffer);
int32_t basicID = listBuffer.size() - 1;
return basicID;
}
/**
* @brief open a file with the name set in parameters
2013-10-09 22:00:24 +02:00
* @param[in] filename curent filename
* @return The ID of the curent buffer where the file is loaded
* @todo : check if this file is not curently open and return the old ID
*/
2013-10-09 22:00:24 +02:00
int32_t classBufferManager::open(etk::FSNode &myFile) {
if (false == exist(myFile)) {
2012-05-10 17:47:52 +02:00
// allocate a new Buffer
BufferText *myBuffer = new BufferText(myFile);
2013-10-07 22:04:21 +02:00
// add at the list of element
listBuffer.pushBack(myBuffer);
return listBuffer.size() - 1;
2012-05-10 17:47:52 +02:00
} else {
2013-10-07 22:04:21 +02:00
// the buffer already existed == > we open it ...
return getId(myFile);
2012-05-10 17:47:52 +02:00
}
}
2013-10-09 22:00:24 +02:00
BufferText * classBufferManager::get(int32_t BufferID) {
// possible special case : -1;
if (-1 >= BufferID) {
return NULL;
}
// check if the Buffer existed
2013-10-07 22:04:21 +02:00
if (BufferID < listBuffer.size()) {
// check if the buffer already existed
if (NULL != listBuffer[BufferID]) {
return listBuffer[BufferID];
} else {
2012-04-23 10:15:43 +02:00
APPL_ERROR("non existing Buffer " << BufferID);
}
} else {
2013-10-07 22:04:21 +02:00
APPL_ERROR("call an non existing Buffer number too hight : " << BufferID << " > " << listBuffer.size());
}
return NULL;
}
2013-10-09 22:00:24 +02:00
bool classBufferManager::exist(int32_t BufferID) {
if (-1 >= BufferID) {
return false;
}
// check if the Buffer existed
2013-10-07 22:04:21 +02:00
if (BufferID < listBuffer.size()) {
// check if the buffer already existed
if (NULL != listBuffer[BufferID]) {
return true;
}
}
return false;
}
2013-10-09 22:00:24 +02:00
bool classBufferManager::exist(etk::FSNode &myFile) {
2013-10-07 22:04:21 +02:00
if (-1 == getId(myFile)) {
return false;
}
return true;
}
2013-10-09 22:00:24 +02:00
int32_t classBufferManager::getId(etk::FSNode &myFile) {
int32_t iii;
// check if the Buffer existed
2013-10-07 22:04:21 +02:00
for (iii=0; iii < listBuffer.size(); iii++) {
// check if the buffer already existed
if (NULL != listBuffer[iii]) {
2013-10-07 22:04:21 +02:00
if ( listBuffer[iii]->getFileName() == myFile) {
return iii;
}
}
}
return -1;
}
2013-10-07 22:04:21 +02:00
// return the number of buffer (open in the past) if 5 buffer open and 4 close == > return 5
2013-10-09 22:00:24 +02:00
uint32_t classBufferManager::size(void) {
2013-10-07 22:04:21 +02:00
return listBuffer.size();
}
// nb of opens file Now ...
2013-10-09 22:00:24 +02:00
uint32_t classBufferManager::sizeOpen(void) {
uint32_t jjj = 0;
// check if the Buffer existed
2013-10-07 22:04:21 +02:00
for (int32_t iii=0; iii<listBuffer.size(); iii++) {
// check if the buffer already existed
if (NULL != listBuffer[iii]) {
jjj++;
}
}
return jjj;
}
2013-10-09 22:00:24 +02:00
bool classBufferManager::remove(int32_t BufferID) {
if (-1 >= BufferID) {
return false;
}
// check if the Buffer existed
2013-10-07 22:04:21 +02:00
if (BufferID < listBuffer.size()) {
// check if the buffer already existed
if (NULL != listBuffer[BufferID]) {
// TODO : Check if it saved...
/*
2013-10-07 22:04:21 +02:00
if (false == isSaved(BufferID) ) {
2012-04-23 10:15:43 +02:00
APPL_INFO("Buffer " << BufferID << " : Not Saved", BufferID);
}
*/
// Delete the Buffer
delete( listBuffer[BufferID] );
listBuffer[BufferID] = NULL;
2012-02-27 18:15:56 +01:00
/*
2013-10-07 22:04:21 +02:00
ewol::widgetMessageMultiCast::Send(getWidgetId(), ednMsgBufferListChange);
2012-02-27 18:15:56 +01:00
*/
return true;
} else {
2012-04-23 10:15:43 +02:00
APPL_INFO("non existing Buffer " << BufferID);
return false;
}
} else {
2013-10-07 22:04:21 +02:00
APPL_INFO("call an non existing Buffer number too hight : " << BufferID << " > " << listBuffer.size());
return false;
}
}
/**
2013-10-09 22:00:24 +02:00
* @brief to get the element 14 in the buffer
*/
2013-10-09 22:00:24 +02:00
int32_t classBufferManager::witchBuffer(int32_t iEmeElement) {
int32_t i;
2013-10-07 22:04:21 +02:00
for (i=0; i<listBuffer.size(); i++) {
if (NULL != listBuffer[i]) {
iEmeElement--;
// find the element :
if (0 == iEmeElement) {
return i;
}
}
}
return -1;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Namespace part :
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static classBufferManager * localManager = NULL;
2013-10-09 22:00:24 +02:00
#endif
void BufferManager::init(void) {
/*
if (NULL != localManager) {
2013-10-07 22:04:21 +02:00
EWOL_ERROR("classBufferManager == > already exist, just unlink the previous ...");
localManager = NULL;
}
localManager = new classBufferManager();
if (NULL == localManager) {
EWOL_CRITICAL("Allocation of classBufferManager not done ...");
}
2013-10-09 22:00:24 +02:00
*/
}
2013-10-09 22:00:24 +02:00
void BufferManager::unInit(void) {
/*
if (NULL == localManager) {
2013-10-07 22:04:21 +02:00
EWOL_ERROR("classBufferManager == > request UnInit, but does not exist ...");
return;
}
delete(localManager);
localManager = NULL;
2013-10-09 22:00:24 +02:00
*/
}
2013-10-09 22:00:24 +02:00
int32_t BufferManager::getSelected(void) {
/*
if (NULL == localManager) {
2013-10-07 22:04:21 +02:00
EWOL_ERROR("classBufferManager == > request UnInit, but does not exist ...");
return -1;
}
2013-10-07 22:04:21 +02:00
return localManager->getSelected();
2013-10-09 22:00:24 +02:00
*/
return -1;
}
2013-10-09 22:00:24 +02:00
appl::Buffer * BufferManager::get(int32_t BufferID) {
/*
if (NULL == localManager) {
2013-10-07 22:04:21 +02:00
EWOL_ERROR("classBufferManager == > request UnInit, but does not exist ...");
return NULL;
}
2013-10-07 22:04:21 +02:00
return localManager->get(BufferID);
2013-10-09 22:00:24 +02:00
*/
return NULL;
}
2013-10-09 22:00:24 +02:00
bool BufferManager::exist(int32_t BufferID) {
/*
if (NULL == localManager) {
2013-10-07 22:04:21 +02:00
EWOL_ERROR("classBufferManager == > request UnInit, but does not exist ...");
return false;
}
2013-10-09 22:00:24 +02:00
return localManager->exist(BufferID);
*/
return false;
}
2013-10-09 22:00:24 +02:00
bool BufferManager::exist(etk::FSNode &myFile) {
/*
if (NULL == localManager) {
2013-10-07 22:04:21 +02:00
EWOL_ERROR("classBufferManager == > request UnInit, but does not exist ...");
return false;
}
2013-10-09 22:00:24 +02:00
return localManager->exist(myFile);
*/
return false;
}
2013-10-09 22:00:24 +02:00
int32_t BufferManager::getId(etk::FSNode &myFile) {
/*
if (NULL == localManager) {
2013-10-07 22:04:21 +02:00
EWOL_ERROR("classBufferManager == > request UnInit, but does not exist ...");
return -1;
}
2013-10-07 22:04:21 +02:00
return localManager->getId(myFile);
2013-10-09 22:00:24 +02:00
*/
return -1;
}
2013-10-09 22:00:24 +02:00
uint32_t BufferManager::size(void) {
/*
if (NULL == localManager) {
2013-10-07 22:04:21 +02:00
EWOL_ERROR("classBufferManager == > request UnInit, but does not exist ...");
return 0;
}
2013-10-07 22:04:21 +02:00
return localManager->size();
2013-10-09 22:00:24 +02:00
*/
return 0;
}
2013-10-09 22:00:24 +02:00
uint32_t BufferManager::sizeOpen(void) {
/*
if (NULL == localManager) {
2013-10-07 22:04:21 +02:00
EWOL_ERROR("classBufferManager == > request UnInit, but does not exist ...");
return 0;
}
2013-10-07 22:04:21 +02:00
return localManager->sizeOpen();
2013-10-09 22:00:24 +02:00
*/
return 0;
}
2013-10-09 22:00:24 +02:00
int32_t BufferManager::witchBuffer(int32_t iEmeElement) {
/*
if (NULL == localManager) {
2013-10-07 22:04:21 +02:00
EWOL_ERROR("classBufferManager == > request UnInit, but does not exist ...");
return -1;
}
2013-10-09 22:00:24 +02:00
return localManager->witchBuffer(iEmeElement);
*/
return -1;
}