[DEV] add store

This commit is contained in:
Edouard DUPIN 2013-11-07 21:08:57 +01:00
parent 4693119e7d
commit 4731dae6e4
11 changed files with 278 additions and 88 deletions

View File

@ -122,6 +122,7 @@ appl::Buffer::~Buffer(void) {
bool appl::Buffer::loadFile(const etk::UString& _name) {
APPL_DEBUG("Load file : '" << _name << "'");
m_fileName = _name;
m_isModify = true;
setHighlightType("");
etk::FSNode file(m_fileName);
if (file.exist() == false) {
@ -132,13 +133,40 @@ bool appl::Buffer::loadFile(const etk::UString& _name) {
if (true == m_data.dumpFrom(file) ) {
countNumberofLine();
tryFindHighlightType();
m_isModify = false;
return true;
}
return false;
}
void appl::Buffer::setFileName(const etk::UString& _name) {
// TODO : ...
if (m_fileName == _name) {
return;
}
m_fileName = _name;
setModification(true);
}
bool appl::Buffer::storeFile(void) {
etk::FSNode file(m_fileName);
if (true == m_data.dumpIn(file) ) {
APPL_INFO("saving file : " << file);
setModification(false);
return true;
}
return false;
}
void appl::Buffer::setModification(bool _status) {
if (m_isModify == _status) {
return;
}
m_isModify = _status;
if (m_isModify == true) {
generateEventId(eventIsModify);
} else {
generateEventId(eventIsSave);
}
}
@ -449,7 +477,7 @@ bool appl::Buffer::write(const etk::UString& _data, const appl::Buffer::Iterator
m_selectMode = false;
moveCursor((esize_t)_pos+output.size());
countNumberofLine(); // TODO : use more intelligent counter
generateEventId(eventIsModify);
setModification(true);
return true;
}
@ -460,7 +488,7 @@ bool appl::Buffer::replace(const etk::UString& _data, const appl::Buffer::Iterat
m_selectMode = false;
moveCursor((esize_t)_pos+output.size());
countNumberofLine(); // TODO : use more intelligent counter
generateEventId(eventIsModify);
setModification(true);
return true;
}
@ -473,7 +501,7 @@ void appl::Buffer::removeSelection(void) {
m_selectMode = false;
moveCursor(startPos);
countNumberofLine(); // TODO : use more intelligent counter
generateEventId(eventIsModify);
setModification(true);
}
}

View File

@ -276,9 +276,38 @@ namespace appl {
const etk::UString& getFileName(void) {
return m_fileName;
}
/**
* @brief Load A specific file in this buffer.
* @param[in] _name name of the file.
* @return true if file corectly opened.
*/
bool loadFile(const etk::UString& _name);
/**
* @brief Set a file name at this buffer (no saving ...)
* @param[in] _name name of the file.
*/
void setFileName(const etk::UString& _name);
/**
* @brief save the file in the specify path.
* @return true is saving well done
*/
bool storeFile(void);
protected:
bool m_isModify; //!< true if the file is modify
public:
/**
* @breif get the status of file modification.
* @return true if file is modify.
*/
bool isModify(void) {
return m_isModify;
}
/**
* @brief Set the file modification status.
* @param[in] _status New modification status.
*/
void setModification(bool _status);
protected:
etk::Buffer m_data; //!< copy of the file buffer
public:
etk::Buffer& getData(void) {

View File

@ -16,7 +16,8 @@
#define __class__ "BufferManager"
appl::BufferManager::BufferManager(void) :
ewol::Resource("???BufferManager???") {
ewol::Resource("???BufferManager???"),
m_bufferSelected(NULL) {
}
@ -57,8 +58,15 @@ appl::Buffer* appl::BufferManager::get(const etk::UString& _fileName, bool _crea
}
return NULL;
}
void appl::BufferManager::setBufferSelected(appl::Buffer* _bufferSelected) {
m_bufferSelected = _bufferSelected;
sendMultiCast(appl::MsgSelectChange, "");
}
void appl::BufferManager::onObjectRemove(ewol::EObject * _removeObject) {
if (m_bufferSelected == _removeObject) {
setBufferSelected(NULL);
}
for (esize_t iii = 0; iii < m_list.size(); ++iii) {
if (m_list[iii] != _removeObject) {
continue;

View File

@ -40,10 +40,36 @@ namespace appl {
* @return true if the buffer is already open.
*/
bool exist(const etk::UString& _fileName);
/*
appl::Buffer* get(esize_t _bufferID);
esize_t size(void);
*/
/**
* @brief Get count of all buffer availlable.
* @return Number of buffer
*/
esize_t size(void) const {
return m_list.size();
}
/**
* @brief Get a pointer on a buffer Id (never remember this ID!!!).
* @param[in] _id Number of buffer
* @return pointer on the buffer
*/
appl::Buffer* get(esize_t _id) {
return m_list[_id];
}
private:
appl::Buffer* m_bufferSelected;
public:
/**
* @brief Set the current buffer selected
* @param[in] _bufferSelected Pointer on the buffer selected
*/
void setBufferSelected(appl::Buffer* _bufferSelected);
/**
* @brief Get the current buffer selected
* @return Pointer on the buffer selected
*/
appl::Buffer* getBufferSelected(void) {
return m_bufferSelected;
};
public: // herited function
void onReceiveMessage(const ewol::EMessage& _msg);
void onObjectRemove(ewol::EObject * _removeObject);

View File

@ -45,6 +45,7 @@ BufferView::BufferView(void) {
registerMultiCast(ednMsgBufferState);
registerMultiCast(ednMsgBufferId);
registerMultiCast(appl::MsgSelectNewFile);
registerMultiCast(appl::MsgSelectChange);
m_selectedID = -1;
m_selectedIdRequested = -1;
// load buffer manager:
@ -84,6 +85,8 @@ void BufferView::onReceiveMessage(const ewol::EMessage& _msg) {
APPL_ERROR("event on element nor exist : " << _msg.getData());
return;
}
buffer->registerOnEvent(this, appl::Buffer::eventIsSave);
buffer->registerOnEvent(this, appl::Buffer::eventIsModify);
appl::dataBufferStruct* tmp = new appl::dataBufferStruct(_msg.getData(), buffer);
if (tmp == NULL) {
APPL_ERROR("Allocation error of the tmp buffer list element");
@ -91,6 +94,37 @@ void BufferView::onReceiveMessage(const ewol::EMessage& _msg) {
}
m_list.pushBack(tmp);
markToRedraw();
return;
}
if (_msg.getMessage() == appl::Buffer::eventIsSave) {
markToRedraw();
return;
}
if (_msg.getMessage() == appl::Buffer::eventIsModify) {
markToRedraw();
return;
}
APPL_DEBUG("message : " << _msg);
if (_msg.getMessage() == appl::MsgSelectChange) {
m_selectedID = -1;
appl::Buffer* tmpBuffer = NULL;
if (m_bufferManager != NULL) {
tmpBuffer = m_bufferManager->getBufferSelected();
}
if (tmpBuffer != NULL) {
for (esize_t iii=0; iii<m_list.size(); iii++) {
if (m_list[iii] == NULL) {
continue;
}
if (m_list[iii]->m_buffer != tmpBuffer) {
continue;
}
m_selectedID = iii;
break;
}
}
markToRedraw();
return;
}
if (_msg.getMessage() == ednMsgBufferListChange) {
// clean The list
@ -170,10 +204,11 @@ bool BufferView::getElement(int32_t _colomn, int32_t _raw, etk::UString& _myText
&& _raw<m_list.size()
&& NULL != m_list[_raw]) {
_myTextToWrite = m_list[_raw]->m_bufferName.getNameFile();
/*
if (true == m_list[_raw]->m_isModify) {
_fg = (*m_paintingProperties)[m_colorTextModify].getForeground();
} else */ {
if ( m_list[_raw]->m_buffer != NULL
&& m_list[_raw]->m_buffer->isModify() == false) {
_fg = (*m_paintingProperties)[m_colorTextNormal].getForeground();
} else {
_fg = (*m_paintingProperties)[m_colorTextModify].getForeground();
}
if (_raw%2 == 0) {
@ -182,63 +217,12 @@ bool BufferView::getElement(int32_t _colomn, int32_t _raw, etk::UString& _myText
_bg = (*m_paintingProperties)[m_colorBackground2].getForeground();
}
// the buffer change of selection ...
/*
if (m_selectedIdRequested == m_list[_raw]->m_bufferID) {
m_selectedID = _raw;
// stop searching
m_selectedIdRequested = -1;
// set the raw visible :
setRawVisible(m_selectedID);
}
*/
/*
if (m_selectedID == _raw) {
_bg = (*m_paintingProperties)[m_colorBackgroundSelect].getForeground();
}
*/
} else {
_myTextToWrite = "ERROR";
}
/*
bool isModify;
basicColor_te selectFG = COLOR_LIST_TEXT_NORMAL;
basicColor_te selectBG = COLOR_LIST_BG_1;
// when requested a new display selection == > reset the previous one ...
if (m_selectedIdRequested != -1) {
m_selectedID = -1;
}
if( _raw >= 0
&& _raw<m_list.size()
&& NULL != m_list[_raw]) {
_myTextToWrite = m_list[_raw]->m_bufferName.getNameFile();
if (true == m_list[_raw]->m_isModify) {
selectFG = COLOR_LIST_TEXT_MODIFY;
} else {
selectFG = COLOR_LIST_TEXT_NORMAL;
}
if (_raw%2 == 0) {
selectBG = COLOR_LIST_BG_1;
} else {
selectBG = COLOR_LIST_BG_2;
}
// the buffer change of selection ...
if (m_selectedIdRequested == m_list[_raw]->m_bufferID) {
m_selectedID = _raw;
// stop searching
m_selectedIdRequested = -1;
// set the raw visible :
setRawVisible(m_selectedID);
}
if (m_selectedID == _raw) {
selectBG = COLOR_LIST_BG_SELECTED;
}
} else {
_myTextToWrite = "ERROR";
}
_fg = ColorizeManager::get(selectFG);
_bg = ColorizeManager::get(selectBG);
*/
return true;
}
@ -249,11 +233,14 @@ bool BufferView::onItemEvent(int32_t _IdInput, ewol::keyEvent::status_te _typeEv
if( _raw >= 0
&& _raw<m_list.size()
&& NULL != m_list[_raw]) {
//m_selectedIdRequested = m_list[_raw]->m_buffer;
//sendMultiCast(ednMsgBufferId, m_list[_raw]->m_buffer);
if (m_list[_raw]->m_buffer != NULL) {
sendMultiCast(appl::MsgSelectNewFile, m_list[_raw]->m_buffer->getFileName());
m_selectedID = _raw;
markToRedraw();
return true;
}
}
}
markToRedraw();
return false;
}

View File

@ -122,6 +122,9 @@ MainWindows::MainWindows(void) {
BufferView * myBufferView = NULL;
widget::Menu * myMenu = NULL;
// load buffer manager:
m_bufferManager = appl::BufferManager::keep();
mySizerVert = new widget::Sizer(widget::Sizer::modeVert);
setSubWidget(mySizerVert);
@ -270,7 +273,9 @@ MainWindows::MainWindows(void) {
MainWindows::~MainWindows(void) {
if (m_bufferManager != NULL) {
appl::BufferManager::release(m_bufferManager);
}
}
@ -285,22 +290,80 @@ void MainWindows::onReceiveMessage(const ewol::EMessage& _msg) {
// open file Section ...
if (_msg.getMessage() == ednMsgGuiOpen) {
widget::FileChooser* tmpWidget = new widget::FileChooser();
if (tmpWidget == NULL) {
APPL_ERROR("Can not open File chooser !!! ");
return;
}
tmpWidget->setTitle("Open files ...");
tmpWidget->setValidateLabel("Open");
/*
if (BufferManager::getSelected()!=-1) {
BufferText * myBuffer = BufferManager::get(BufferManager::getSelected());
if (NULL!=myBuffer) {
etk::FSNode tmpFile = myBuffer->getFileName();
tmpWidget->setFolder(tmpFile.getNameFolder());
}
if (m_bufferManager == NULL) {
APPL_ERROR("can not call unexistant buffer manager ... ");
return;
}
*/
// Get a ref on the buffer selected (if null, no buffer was selected ...)
appl::Buffer* tmpBuffer = m_bufferManager->getBufferSelected();
if (tmpBuffer != NULL) {
etk::FSNode tmpFile = tmpBuffer->getFileName();
tmpWidget->setFolder(tmpFile.getNameFolder());
}
// apply widget pop-up ...
popUpWidgetPush(tmpWidget);
tmpWidget->registerOnEvent(this, ewolEventFileChooserValidate, ednEventPopUpFileSelected);
} else if (_msg.getMessage() == ednEventPopUpFileSelected) {
APPL_DEBUG("Request opening the file : " << _msg.getData());
sendMultiCast(ednMsgOpenFile, _msg.getData());
if (m_bufferManager == NULL) {
APPL_ERROR("can not call unexistant buffer manager ... ");
return;
}
m_bufferManager->open(_msg.getData());
} else if (_msg.getMessage() == ednMsgGuiSave) {
APPL_DEBUG("Request saving the file : " << _msg.getData());
if (m_bufferManager == NULL) {
APPL_ERROR("can not call unexistant buffer manager ... ");
return;
}
if (_msg.getData().toLower() == "current") {
appl::Buffer* tmpBuffer = m_bufferManager->getBufferSelected();
if (tmpBuffer == NULL) {
APPL_WARNING("No buffer selected !!! ");
createPopUpMessage(widget::Windows::messageTypeError, "No buffer selected !!!");
return;
}
// Note : for direct saving, we do not chack the saving status ==> all time saving ...
if (tmpBuffer->getFileName() == "") {
// TODO : Has no name ==> must generate a a save AS !!!
APPL_TODO("Has no name ==> must generate a a save AS");
return;
}
if (tmpBuffer->storeFile() == false) {
// TODO : Generate a pop-up to inform error...
APPL_ERROR("can not save the file !!! '" << tmpBuffer->getFileName() << "'");
}
return;
} else if (_msg.getData().toLower() == "all") {
APPL_TODO("Need to save all the buffers ... ");
for (esize_t iii=0; iii < m_bufferManager->size(); ++iii) {
appl::Buffer* tmpBuffer = m_bufferManager->get(iii);
if (tmpBuffer == NULL) {
continue;
}
if (tmpBuffer->isModify() == false) {
continue;
}
if (tmpBuffer->getFileName() == "") {
// TODO : Has no name ==> must generate a a save AS !!!
APPL_TODO("Has no name ==> must generate a a save AS");
continue;
}
if (tmpBuffer->storeFile() == false) {
// TODO : Generate a pop-up to inform error...
APPL_ERROR("can not save the file !!! '" << tmpBuffer->getFileName() << "'");
}
}
return;
} else {
APPL_ERROR("UNKNOW request : " << _msg);
}
} else if (_msg.getMessage() == ednMsgGuiSaveAs) {
if (_msg.getData() == "") {
APPL_ERROR("Null data for Save As file ... ");
@ -311,6 +374,7 @@ void MainWindows::onReceiveMessage(const ewol::EMessage& _msg) {
} else {
sscanf(_msg.getData().c_str(), "%d", &m_currentSavingAsIdBuffer);
}
/*
if (false == BufferManager::exist(m_currentSavingAsIdBuffer)) {
APPL_ERROR("Request saveAs on non existant Buffer ID=" << m_currentSavingAsIdBuffer);

View File

@ -15,6 +15,7 @@
#include <appl/Gui/BufferView.h>
#include <appl/BufferManager.h>
#include <ewol/widget/Label.h>
#include <appl/BufferManager.h>
class MainWindows : public ewol::Windows {
private:
@ -24,6 +25,8 @@ class MainWindows : public ewol::Windows {
// Constructeur
MainWindows(void);
~MainWindows(void);
private:
appl::BufferManager* m_bufferManager; //!< handle on the buffer manager
public: // Derived function
virtual const char * const getObjectType(void) { return "MainWindows"; };
virtual void onReceiveMessage(const ewol::EMessage& _msg);

View File

@ -65,6 +65,8 @@ appl::TextViewer::TextViewer(const etk::UString& _fontName, int32_t _fontSize) :
m_buffer->loadFile("./example.txt");
*/
appl::textPluginManager::connect(*this);
// last created has focus ...
setCurrentSelect();
}
appl::TextViewer::~TextViewer(void) {
@ -390,10 +392,12 @@ bool appl::TextViewer::onEventEntry(const ewol::EventEntry& _event) {
}
bool appl::TextViewer::onEventInput(const ewol::EventInput& _event) {
if (_event.getId() != 0) {
keepFocus();
}
if (m_buffer == NULL) {
return false;
}
keepFocus();
// First call the scrolling widget :
if (WidgetScrooled::onEventInput(_event) == true) {
markToRedraw();
@ -542,6 +546,19 @@ void appl::TextViewer::onReceiveMessage(const ewol::EMessage& _msg) {
markToRedraw();
return;
}
// event needed even if selection of buffer is not done ...
if (_msg.getMessage() == appl::Buffer::eventIsModify) {
markToRedraw();
return;
}
if (_msg.getMessage() == appl::Buffer::eventSelectChange) {
markToRedraw();
return;
}
// If not the last buffer selected, then no event parsing ...
if (isSelectedLast() == false) {
return;
}
if (_msg.getMessage() == appl::MsgSelectNewFile) {
if (m_buffer != NULL) {
m_buffer->unRegisterOnEvent(this);
@ -551,14 +568,9 @@ void appl::TextViewer::onReceiveMessage(const ewol::EMessage& _msg) {
m_buffer->registerOnEvent(this, appl::Buffer::eventIsModify);
m_buffer->registerOnEvent(this, appl::Buffer::eventSelectChange);
}
markToRedraw();
return;
}
if (_msg.getMessage() == appl::Buffer::eventIsModify) {
markToRedraw();
return;
}
if (_msg.getMessage() == appl::Buffer::eventSelectChange) {
if (m_bufferManager != NULL) {
m_bufferManager->setBufferSelected(m_buffer);
}
markToRedraw();
return;
}
@ -575,11 +587,14 @@ void appl::TextViewer::onObjectRemove(ewol::EObject* _removeObject) {
void appl::TextViewer::onGetFocus(void) {
showKeyboard();
APPL_INFO("Focus - In");
setCurrentSelect();
markToRedraw();
}
void appl::TextViewer::onLostFocus(void) {
hideKeyboard();
APPL_INFO("Focus - out");
markToRedraw();
}
void appl::TextViewer::setFontSize(int32_t _size) {
@ -591,8 +606,6 @@ void appl::TextViewer::setFontName(const etk::UString& _fontName) {
m_displayText.setFontName(_fontName);
}
bool appl::TextViewer::moveCursor(const appl::Buffer::Iterator& _pos) {
if (m_buffer == NULL) {
return false;
@ -826,3 +839,22 @@ float appl::TextViewer::getScreenSize(const appl::Buffer::Iterator& _startLinePo
}
return ret;
}
appl::TextViewer* appl::TextViewer::m_currentBufferSelect = NULL;
void appl::TextViewer::setCurrentSelect(void) {
if (this == m_currentBufferSelect) {
return;
}
m_currentBufferSelect = this;
if (m_bufferManager != NULL) {
m_bufferManager->setBufferSelected(m_buffer);
}
}
bool appl::TextViewer::isSelectedLast(void) {
if (this == m_currentBufferSelect) {
return true;
}
return false;
}

View File

@ -112,6 +112,17 @@ namespace appl {
appl::Buffer::Iterator getPosSize(const appl::Buffer::Iterator& _startLinePos, float _distance);
float getScreenSize(const appl::Buffer::Iterator& _startLinePos, const appl::Buffer::Iterator& _stopPos);
private:
static TextViewer* m_currentBufferSelect; //!< to know which buffer is currently last selected
/**
* @brief Set the current buffer selected
*/
void setCurrentSelect(void);
/**
* @brief Check if the current buffer is last selected
* @return true if selected last
*/
bool isSelectedLast(void);
};
};

View File

@ -59,5 +59,6 @@ extern const char* const ednMsgBufferColor = "edn-Msg-Buffer-Color";
extern const char* const appl::MsgSelectNewFile = "edn-msg-select-new-file";
extern const char* const appl::MsgSelectChange = "edn-msg-select-change";

View File

@ -59,6 +59,7 @@
namespace appl {
extern const char* const MsgSelectNewFile; // data : "buffer/name"
extern const char* const MsgSelectChange; // data : ""
};
#endif