/** * @author Edouard DUPIN * * @copyright 2010, Edouard DUPIN, all right reserved * * @license GPL v3 (see license file) */ #include #include #include #include #include #undef __class__ #define __class__ "classBufferManager" class classBufferManager: public ewol::EObject { public: // Constructeur classBufferManager(void); ~classBufferManager(void); const char * const GetObjectType(void) { return "ApplBufferManager"; } public: virtual void OnReceiveMessage(const ewol::EMessage& _msg); private: // return the ID of the buffer allocated // create a buffer with no element int32_t Create(void); // open curent filename int32_t Open(etk::FSNode &myFile); bool Remove(int32_t BufferID); public: int32_t GetSelected(void) { return m_idSelected;}; //void SetSelected(int32_t id) {m_idSelected = id;}; BufferText* Get(int32_t BufferID); bool Exist(int32_t BufferID); bool Exist(etk::FSNode &myFile); 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); int32_t WitchBuffer(int32_t iEmeElement); private: etk::Vector listBuffer; //!< element List of the char Elements void RemoveAll(void); //!< remove all buffer int32_t m_idSelected; }; // Constructeur classBufferManager::classBufferManager(void) { m_idSelected = -1; RegisterMultiCast(ednMsgGuiNew); RegisterMultiCast(ednMsgOpenFile); RegisterMultiCast(ednMsgGuiClose); RegisterMultiCast(ednMsgGuiSave); RegisterMultiCast(ednMsgCodeViewSelectedId); RegisterMultiCast(ednMsgBufferId); } classBufferManager::~classBufferManager(void) { //clean All Buffer APPL_INFO("~classBufferManager::RemoveAll();"); RemoveAll(); // clear The list of Buffer APPL_INFO("~classBufferManager::listBuffer.Clear();"); listBuffer.Clear(); } void classBufferManager::OnReceiveMessage(const ewol::EMessage& _msg) { ewol::EObject::OnReceiveMessage(_msg); if (_msg.GetMessage() == ednMsgBufferId) { // select a new buffer ID : if (_msg.GetData() == "") { APPL_ERROR("Request select buffer ID = \"\" "); } else { int32_t newID = -1; sscanf(_msg.GetData().c_str(), "%d", &newID); if(true == Exist(newID)) { m_idSelected = newID; } else { m_idSelected = -1; APPL_ERROR("Request a non existant ID : " << newID << " reset to -1..."); } } } else if (_msg.GetMessage() == ednMsgGuiNew) { int32_t newOne = Create(); if (-1 != newOne) { m_idSelected = newOne; SendMultiCast(ednMsgBufferId, m_idSelected); SendMultiCast(ednMsgBufferListChange); } } 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 << "\""); } } else { APPL_ERROR("Request to open an Unknox element file : " << myFile << " type:" << myFile.GetNodeType()); } } } else if (_msg.GetMessage() == ednMsgGuiSave) { if (_msg.GetData() == "") { APPL_ERROR("Null data for close file ... "); } else { if (_msg.GetData() == "current") { // Check buffer existence if(true == Exist(m_idSelected)) { // If no name ==> request a Gui display ... if (Get(m_idSelected)->HaveName() == false) { SendMultiCast(ednMsgGuiSaveAs, "current"); } else { Get(m_idSelected)->Save(); } } } else { int32_t newId; sscanf(_msg.GetData().c_str(), "%d", &newId); if (false == Exist(newId)) { APPL_ERROR("Request a save As with a non existant ID=" << newId); } else { // If no name ==> request a Gui display ... if (Get(newId)->HaveName() == false) { SendMultiCast(ednMsgGuiSaveAs, newId); } else { Get(m_idSelected)->Save(); } } SendMultiCast(ednMsgBufferState, "saved"); } } } else if (_msg.GetMessage() == ednMsgGuiClose) { if (_msg.GetData() == "") { APPL_ERROR("Null data for close file ... "); } else { if (_msg.GetData() == "All") { } else { int32_t closeID = -1; if (_msg.GetData() == "current") { closeID = m_idSelected; APPL_DEBUG("Close specific buffer ID" << closeID); } else { // close specific buffer ... sscanf(_msg.GetData().c_str(), "%d", &closeID); APPL_DEBUG("Close specific buffer ID="<< closeID); } if(true == Exist(closeID)) { // 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) { 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); } // Remove requested buffer Remove(closeID); SendMultiCast(ednMsgBufferListChange); } else { APPL_ERROR("Request Close of a non existant ID : " << closeID); } } } } else if (_msg.GetMessage() == ednMsgCodeViewSelectedId) { //Change the selected buffer if (_msg.GetData() == "") { APPL_ERROR("Null data for changing buffer ID file ... "); } else { int32_t newId; sscanf(_msg.GetData().c_str(), "%d", &newId); if (true == Exist(newId)) { m_idSelected = newId; } else { APPL_ERROR("code biew request the selection of an non -existant buffer ==> reset to -1"); m_idSelected = -1; } SendMultiCast(ednMsgBufferId, m_idSelected); SendMultiCast(ednMsgBufferListChange); } } /* switch (id) { // Check buffer existence if(true == Exist(dataID)) { // If no name ==> request a Gui display ... if (Get(dataID)->HaveName() == false) { SendMessage(APPL_MSG__GUI_SHOW_SAVE_AS, dataID); } else { Get(dataID)->Save(); } } break; } */ } /** * @brief Remove all buffer opened * * @param[in,out] --- * * @return --- * */ void classBufferManager::RemoveAll(void) { int32_t i; for (i=0; i we open it ... return GetId(myFile); } } BufferText * classBufferManager::Get(int32_t BufferID) { // possible special case : -1; if (-1 >= BufferID) { return NULL; } // check if the Buffer existed if (BufferID < listBuffer.Size()) { // check if the buffer already existed if (NULL != listBuffer[BufferID]) { return listBuffer[BufferID]; } else { APPL_ERROR("non existing Buffer " << BufferID); } } else { APPL_ERROR("call an non existing Buffer number too hight : " << BufferID << " > " << listBuffer.Size()); } return NULL; } bool classBufferManager::Exist(int32_t BufferID) { if (-1 >= BufferID) { return false; } // check if the Buffer existed if (BufferID < listBuffer.Size()) { // check if the buffer already existed if (NULL != listBuffer[BufferID]) { return true; } } return false; } bool classBufferManager::Exist(etk::FSNode &myFile ) { if (-1 == GetId(myFile)) { return false; } return true; } int32_t classBufferManager::GetId(etk::FSNode &myFile) { int32_t iii; // check if the Buffer existed for (iii=0; iii < listBuffer.Size(); iii++) { // check if the buffer already existed if (NULL != listBuffer[iii]) { if ( listBuffer[iii]->GetFileName() == myFile) { return iii; } } } return -1; } // return the number of buffer (open in the past) if 5 buffer open and 4 close ==> return 5 uint32_t classBufferManager::Size(void) { return listBuffer.Size(); } // nb of opens file Now ... uint32_t classBufferManager::SizeOpen(void) { uint32_t jjj = 0; // check if the Buffer existed for (int32_t iii=0; iii= BufferID) { return false; } // check if the Buffer existed if (BufferID < listBuffer.Size()) { // check if the buffer already existed if (NULL != listBuffer[BufferID]) { // TODO : Check if it saved... /* if (false == IsSaved(BufferID) ) { APPL_INFO("Buffer " << BufferID << " : Not Saved", BufferID); } */ // Delete the Buffer delete( listBuffer[BufferID] ); listBuffer[BufferID] = NULL; /* ewol::widgetMessageMultiCast::Send(GetWidgetId(), ednMsgBufferListChange); */ return true; } else { APPL_INFO("non existing Buffer " << BufferID); return false; } } else { APPL_INFO("call an non existing Buffer number too hight : " << BufferID << " > " << listBuffer.Size()); return false; } } /** * @brief to get the element 14 in the buffer * * @param[in,out] --- * * @return --- * */ int32_t classBufferManager::WitchBuffer(int32_t iEmeElement) { int32_t i; for (i=0; i already exist, just unlink the previous ..."); localManager = NULL; } localManager = new classBufferManager(); if (NULL == localManager) { EWOL_CRITICAL("Allocation of classBufferManager not done ..."); } } void BufferManager::UnInit(void) { if (NULL == localManager) { EWOL_ERROR("classBufferManager ==> request UnInit, but does not exist ..."); return; } delete(localManager); localManager = NULL; } int32_t BufferManager::GetSelected(void) { if (NULL == localManager) { EWOL_ERROR("classBufferManager ==> request UnInit, but does not exist ..."); return -1; } return localManager->GetSelected(); } BufferText * BufferManager::Get(int32_t BufferID) { if (NULL == localManager) { EWOL_ERROR("classBufferManager ==> request UnInit, but does not exist ..."); return NULL; } return localManager->Get(BufferID); } bool BufferManager::Exist(int32_t BufferID) { if (NULL == localManager) { EWOL_ERROR("classBufferManager ==> request UnInit, but does not exist ..."); return false; } return localManager->Exist(BufferID); } bool BufferManager::Exist(etk::FSNode &myFile) { if (NULL == localManager) { EWOL_ERROR("classBufferManager ==> request UnInit, but does not exist ..."); return false; } return localManager->Exist(myFile); } int32_t BufferManager::GetId(etk::FSNode &myFile) { if (NULL == localManager) { EWOL_ERROR("classBufferManager ==> request UnInit, but does not exist ..."); return -1; } return localManager->GetId(myFile); } uint32_t BufferManager::Size(void) { if (NULL == localManager) { EWOL_ERROR("classBufferManager ==> request UnInit, but does not exist ..."); return 0; } return localManager->Size(); } uint32_t BufferManager::SizeOpen(void) { if (NULL == localManager) { EWOL_ERROR("classBufferManager ==> request UnInit, but does not exist ..."); return 0; } return localManager->SizeOpen(); } int32_t BufferManager::WitchBuffer(int32_t iEmeElement) { if (NULL == localManager) { EWOL_ERROR("classBufferManager ==> request UnInit, but does not exist ..."); return -1; } return localManager->WitchBuffer(iEmeElement); }