[DEV] test multiple display of one buffer

This commit is contained in:
Edouard DUPIN 2013-10-30 21:16:38 +01:00
parent 50c1830696
commit 4693119e7d
11 changed files with 185 additions and 34 deletions

View File

@ -1,9 +1,9 @@
{ {
"ednColor": [ "ednColor": [
{ name:"LIST_backgroung1", foreground:"#202020" }, { name:"backgroung1", foreground:"#202020" },
{ name:"LIST_backgroung2", foreground:"#000000" }, { name:"backgroung2", foreground:"#000000" },
{ name:"LIST_backgroungSelected", foreground:"#2f0ba4" }, { name:"backgroungSelected", foreground:"#2f0ba4" },
{ name:"LIST_textNormal", foreground:"#EEEEEE" }, { name:"textNormal", foreground:"#EEEEEE" },
{ name:"LIST_textModify", foreground:"#FF0000" }, { name:"textModify", foreground:"#FF0000" },
] ]
} }

View File

@ -1,9 +1,9 @@
{ {
"ednColor": [ "ednColor": [
{ name:"LIST_backgroung1", foreground:"#d9d7d7"}, { name:"backgroung1", foreground:"#d9d7d7"},
{ name:"LIST_backgroung2", foreground:"#b7b6b6"}, { name:"backgroung2", foreground:"#b7b6b6"},
{ name:"LIST_backgroungSelected", foreground:"#3da3f9"}, { name:"backgroungSelected", foreground:"#3da3f9"},
{ name:"LIST_textNormal", foreground:"#000000"}, { name:"textNormal", foreground:"#000000"},
{ name:"LIST_textModify", foreground:"#FF0000"} { name:"textModify", foreground:"#FF0000"}
] ]
} }

View File

@ -12,6 +12,11 @@
#include <ewol/clipBoard.h> #include <ewol/clipBoard.h>
#include <appl/HighlightManager.h> #include <appl/HighlightManager.h>
const char* const appl::Buffer::eventIsModify = "edn-is-modify";
const char* const appl::Buffer::eventIsSave = "edn-is-save";
const char* const appl::Buffer::eventSelectChange = "edn-select-change";
appl::Buffer::Iterator& appl::Buffer::Iterator::operator++ (void) { appl::Buffer::Iterator& appl::Buffer::Iterator::operator++ (void) {
m_value = etk::UChar::Null; m_value = etk::UChar::Null;
if ( m_data != NULL if ( m_data != NULL
@ -103,7 +108,9 @@ appl::Buffer::Buffer(void) :
m_cursorPreferredCol(-1), m_cursorPreferredCol(-1),
m_nbLines(0), m_nbLines(0),
m_highlight(NULL) { m_highlight(NULL) {
addEventId(eventIsModify);
addEventId(eventIsSave);
addEventId(eventSelectChange);
} }
appl::Buffer::~Buffer(void) { appl::Buffer::~Buffer(void) {
@ -208,11 +215,13 @@ void appl::Buffer::moveCursor(esize_t _pos) {
if (m_cursorPos == m_cursorSelectPos) { if (m_cursorPos == m_cursorSelectPos) {
m_cursorSelectPos = -1; m_cursorSelectPos = -1;
} }
generateEventId(eventSelectChange);
return; return;
} }
// move mode // move mode
m_cursorPos = _pos; m_cursorPos = _pos;
m_cursorSelectPos = -1; m_cursorSelectPos = -1;
generateEventId(eventSelectChange);
} }
bool appl::Buffer::getPosAround(const appl::Buffer::Iterator& _startPos, bool appl::Buffer::getPosAround(const appl::Buffer::Iterator& _startPos,
@ -304,10 +313,12 @@ bool appl::Buffer::getPosAround(const appl::Buffer::Iterator& _startPos,
void appl::Buffer::setSelectionPos(const appl::Buffer::Iterator& _pos) { void appl::Buffer::setSelectionPos(const appl::Buffer::Iterator& _pos) {
m_cursorSelectPos = _pos; m_cursorSelectPos = _pos;
generateEventId(eventSelectChange);
} }
void appl::Buffer::unSelect(void) { void appl::Buffer::unSelect(void) {
m_cursorSelectPos = -1; m_cursorSelectPos = -1;
generateEventId(eventSelectChange);
} }
static const char *ControlCodeTable[32] = { static const char *ControlCodeTable[32] = {
@ -438,6 +449,7 @@ bool appl::Buffer::write(const etk::UString& _data, const appl::Buffer::Iterator
m_selectMode = false; m_selectMode = false;
moveCursor((esize_t)_pos+output.size()); moveCursor((esize_t)_pos+output.size());
countNumberofLine(); // TODO : use more intelligent counter countNumberofLine(); // TODO : use more intelligent counter
generateEventId(eventIsModify);
return true; return true;
} }
@ -448,6 +460,7 @@ bool appl::Buffer::replace(const etk::UString& _data, const appl::Buffer::Iterat
m_selectMode = false; m_selectMode = false;
moveCursor((esize_t)_pos+output.size()); moveCursor((esize_t)_pos+output.size());
countNumberofLine(); // TODO : use more intelligent counter countNumberofLine(); // TODO : use more intelligent counter
generateEventId(eventIsModify);
return true; return true;
} }
@ -460,6 +473,7 @@ void appl::Buffer::removeSelection(void) {
m_selectMode = false; m_selectMode = false;
moveCursor(startPos); moveCursor(startPos);
countNumberofLine(); // TODO : use more intelligent counter countNumberofLine(); // TODO : use more intelligent counter
generateEventId(eventIsModify);
} }
} }

View File

@ -260,6 +260,10 @@ namespace appl {
}; };
friend class Buffer; friend class Buffer;
}; };
public:
static const char* const eventIsModify;
static const char* const eventIsSave;
static const char* const eventSelectChange;
public: public:
Buffer(void); Buffer(void);
~Buffer(void); ~Buffer(void);

View File

@ -69,9 +69,23 @@ void appl::BufferManager::onObjectRemove(ewol::EObject * _removeObject) {
} }
} }
bool appl::BufferManager::exist(const etk::UString& _fileName) {
for (esize_t iii = 0; iii < m_list.size(); ++iii) {
if (m_list[iii] == NULL) {
continue;
}
if (m_list[iii]->getFileName() == _fileName) {
return true;
}
}
return false;
}
void appl::BufferManager::open(const etk::UString& _fileName) { void appl::BufferManager::open(const etk::UString& _fileName) {
if (exist(_fileName) == false) {
(void)get(_fileName, true); (void)get(_fileName, true);
sendMultiCast(appl::MsgSelectNewFile, _fileName); sendMultiCast(appl::MsgSelectNewFile, _fileName);
}
} }
void appl::BufferManager::onReceiveMessage(const ewol::EMessage& _msg) { void appl::BufferManager::onReceiveMessage(const ewol::EMessage& _msg) {

View File

@ -34,6 +34,12 @@ namespace appl {
* @param[in] _fileName Name of the file to open or create. * @param[in] _fileName Name of the file to open or create.
*/ */
void open(const etk::UString& _fileName); void open(const etk::UString& _fileName);
/**
* @brief Check if a buffer is already open.
* @param[in] _fileName name of the file.
* @return true if the buffer is already open.
*/
bool exist(const etk::UString& _fileName);
/* /*
appl::Buffer* get(esize_t _bufferID); appl::Buffer* get(esize_t _bufferID);
esize_t size(void); esize_t size(void);

View File

@ -44,8 +44,19 @@ BufferView::BufferView(void) {
registerMultiCast(ednMsgBufferListChange); registerMultiCast(ednMsgBufferListChange);
registerMultiCast(ednMsgBufferState); registerMultiCast(ednMsgBufferState);
registerMultiCast(ednMsgBufferId); registerMultiCast(ednMsgBufferId);
registerMultiCast(appl::MsgSelectNewFile);
m_selectedID = -1; m_selectedID = -1;
m_selectedIdRequested = -1; m_selectedIdRequested = -1;
// load buffer manager:
m_bufferManager = appl::BufferManager::keep();
// load color properties
m_paintingProperties = appl::GlyphPainting::keep("THEME:COLOR:bufferList.json");
// get all id properties ...
m_colorBackground1 = m_paintingProperties->request("backgroung1");
m_colorBackground2 = m_paintingProperties->request("backgroung2");
m_colorBackgroundSelect = m_paintingProperties->request("backgroungSelected");
m_colorTextNormal = m_paintingProperties->request("textNormal");
m_colorTextModify = m_paintingProperties->request("textModify");
} }
BufferView::~BufferView(void) { BufferView::~BufferView(void) {
@ -60,10 +71,27 @@ void BufferView::removeAllElement(void) {
} }
} }
m_list.clear(); m_list.clear();
if (m_bufferManager != NULL) {
appl::BufferManager::release(m_bufferManager);
}
} }
void BufferView::onReceiveMessage(const ewol::EMessage& _msg) { void BufferView::onReceiveMessage(const ewol::EMessage& _msg) {
widget::List::onReceiveMessage(_msg); widget::List::onReceiveMessage(_msg);
if (_msg.getMessage() == appl::MsgSelectNewFile) {
appl::Buffer* buffer = m_bufferManager->get(_msg.getData());
if (buffer == NULL) {
APPL_ERROR("event on element nor exist : " << _msg.getData());
return;
}
appl::dataBufferStruct* tmp = new appl::dataBufferStruct(_msg.getData(), buffer);
if (tmp == NULL) {
APPL_ERROR("Allocation error of the tmp buffer list element");
return;
}
m_list.pushBack(tmp);
markToRedraw();
}
if (_msg.getMessage() == ednMsgBufferListChange) { if (_msg.getMessage() == ednMsgBufferListChange) {
// clean The list // clean The list
removeAllElement(); removeAllElement();
@ -104,9 +132,24 @@ void BufferView::onReceiveMessage(const ewol::EMessage& _msg) {
} }
} }
void BufferView::onObjectRemove(ewol::EObject* _removeObject) {
widget::List::onObjectRemove(_removeObject);
for (esize_t iii=0; iii<m_list.size(); iii++) {
if (m_list[iii] == NULL) {
continue;
}
if (m_list[iii]->m_buffer != _removeObject) {
continue;
}
m_list.remove(iii);
markToRedraw();
return;
}
}
etk::Color<> BufferView::getBasicBG(void) { etk::Color<> BufferView::getBasicBG(void) {
return etk::color::none; //ColorizeManager::get(COLOR_LIST_BG_1); return (*m_paintingProperties)[m_colorBackground1].getForeground();
} }
uint32_t BufferView::getNuberOfColomn(void) { uint32_t BufferView::getNuberOfColomn(void) {
@ -123,6 +166,39 @@ uint32_t BufferView::getNuberOfRaw(void) {
} }
bool BufferView::getElement(int32_t _colomn, int32_t _raw, etk::UString& _myTextToWrite, etk::Color<>& _fg, etk::Color<>& _bg) { bool BufferView::getElement(int32_t _colomn, int32_t _raw, etk::UString& _myTextToWrite, etk::Color<>& _fg, etk::Color<>& _bg) {
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) {
_fg = (*m_paintingProperties)[m_colorTextModify].getForeground();
} else */ {
_fg = (*m_paintingProperties)[m_colorTextModify].getForeground();
}
if (_raw%2 == 0) {
_bg = (*m_paintingProperties)[m_colorBackground1].getForeground();
} else {
_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; bool isModify;
basicColor_te selectFG = COLOR_LIST_TEXT_NORMAL; basicColor_te selectFG = COLOR_LIST_TEXT_NORMAL;
@ -173,8 +249,8 @@ bool BufferView::onItemEvent(int32_t _IdInput, ewol::keyEvent::status_te _typeEv
if( _raw >= 0 if( _raw >= 0
&& _raw<m_list.size() && _raw<m_list.size()
&& NULL != m_list[_raw]) { && NULL != m_list[_raw]) {
m_selectedIdRequested = m_list[_raw]->m_bufferID; //m_selectedIdRequested = m_list[_raw]->m_buffer;
sendMultiCast(ednMsgBufferId, m_list[_raw]->m_bufferID); //sendMultiCast(ednMsgBufferId, m_list[_raw]->m_buffer);
} }
} }
markToRedraw(); markToRedraw();

View File

@ -21,12 +21,10 @@ namespace appl
{ {
public: public:
etk::FSNode m_bufferName; etk::FSNode m_bufferName;
uint32_t m_bufferID; appl::Buffer* m_buffer;
bool m_isModify; dataBufferStruct(const etk::UString& _bufferName, appl::Buffer* _buffer) :
dataBufferStruct(etk::FSNode& _bufferName, int32_t _bufferID, bool _isModify) :
m_bufferName(_bufferName), m_bufferName(_bufferName),
m_bufferID(_bufferID), m_buffer(_buffer) {
m_isModify(_isModify) {
}; };
~dataBufferStruct(void) { }; ~dataBufferStruct(void) { };
@ -35,6 +33,15 @@ namespace appl
class BufferView : public widget::List class BufferView : public widget::List
{ {
private:
appl::BufferManager* m_bufferManager; //!< handle on the buffer manager
private:
appl::GlyphPainting* m_paintingProperties; //!< element painting property
esize_t m_colorBackground1;
esize_t m_colorBackground2;
esize_t m_colorBackgroundSelect;
esize_t m_colorTextNormal;
esize_t m_colorTextModify;
private: private:
int32_t m_selectedIdRequested; int32_t m_selectedIdRequested;
int32_t m_selectedID; int32_t m_selectedID;
@ -47,6 +54,7 @@ class BufferView : public widget::List
const char * const getObjectType(void) { return "ApplBufferView"; }; const char * const getObjectType(void) { return "ApplBufferView"; };
// Derived function // Derived function
virtual void onReceiveMessage(const ewol::EMessage& _msg); virtual void onReceiveMessage(const ewol::EMessage& _msg);
virtual void onObjectRemove(ewol::EObject* _removeObject);
protected: protected:
// function call to display the list : // function call to display the list :
virtual etk::Color<> getBasicBG(void); virtual etk::Color<> getBasicBG(void);

View File

@ -136,6 +136,11 @@ MainWindows::MainWindows(void) {
mySizerHori->subWidgetAdd(mySizerVert2); mySizerHori->subWidgetAdd(mySizerVert2);
// main buffer Area : // main buffer Area :
myTextView = new appl::TextViewer("FreeMono;DejaVuSansMono;FreeSerif", 11);
myTextView->setExpand(bvec2(true,true));
myTextView->setFill(bvec2(true,true));
mySizerVert2->subWidgetAdd(myTextView);
myTextView = new appl::TextViewer("FreeMono;DejaVuSansMono;FreeSerif", 11); myTextView = new appl::TextViewer("FreeMono;DejaVuSansMono;FreeSerif", 11);
myTextView->setExpand(bvec2(true,true)); myTextView->setExpand(bvec2(true,true));
myTextView->setFill(bvec2(true,true)); myTextView->setFill(bvec2(true,true));

View File

@ -30,7 +30,6 @@ class MainWindows : public ewol::Windows {
virtual void onObjectRemove(ewol::EObject * _removeObject); virtual void onObjectRemove(ewol::EObject * _removeObject);
}; };
#define EDN_CAST_MAIN_WINDOWS(curentPointer) EWOL_CAST(TYPE_EOBJECT_EDN_MAIN_WINDOWS,MainWindows,curentPointer)
#endif #endif

View File

@ -213,13 +213,15 @@ void appl::TextViewer::onRegenerateDisplay(void) {
countNbLine += 1; countNbLine += 1;
countColomn = 0; countColomn = 0;
maxSizeX = etk_max(m_displayText.getPos().x(), maxSizeX); maxSizeX = etk_max(m_displayText.getPos().x(), maxSizeX);
// display the end line position // Display the end line position only if we have the focus ...
if (getFocus() == true) {
if (it >= selectPosStart && it < selectPosStop) { if (it >= selectPosStart && it < selectPosStop) {
ewol::Drawing& draw = m_displayText.getDrawing(); ewol::Drawing& draw = m_displayText.getDrawing();
draw.setColor(etk::Color<>(0xFF0000FF)); draw.setColor(etk::Color<>(0xFF0000FF));
draw.setPos(m_displayText.getPos() + tmpLetterSize/4.0f); draw.setPos(m_displayText.getPos() + tmpLetterSize/4.0f);
draw.rectangle(m_displayText.getPos() + tmpLetterSize*3.0f/4.0f); draw.rectangle(m_displayText.getPos() + tmpLetterSize*3.0f/4.0f);
} }
}
m_displayText.forceLineReturn(); m_displayText.forceLineReturn();
m_displayText.setPos(vec3(-m_originScrooled.x()+m_lastOffsetDisplay, m_displayText.getPos().y(), 0.0f)); m_displayText.setPos(vec3(-m_originScrooled.x()+m_lastOffsetDisplay, m_displayText.getPos().y(), 0.0f));
if (m_displayText.getPos().y() < -20.0f ) { if (m_displayText.getPos().y() < -20.0f ) {
@ -250,16 +252,21 @@ void appl::TextViewer::onRegenerateDisplay(void) {
} }
} }
m_buffer->expand(countColomn, *it, stringToDisplay); m_buffer->expand(countColomn, *it, stringToDisplay);
// Display selection only if we have the focus ...
if (getFocus() == true) {
if (it >= selectPosStart && it < selectPosStop) { if (it >= selectPosStart && it < selectPosStop) {
m_displayText.setColor((*m_paintingProperties)[m_colorSelection].getForeground()); m_displayText.setColor((*m_paintingProperties)[m_colorSelection].getForeground());
m_displayText.setColorBg((*m_paintingProperties)[m_colorSelection].getBackground()); m_displayText.setColorBg((*m_paintingProperties)[m_colorSelection].getBackground());
} }
}
//APPL_DEBUG("display : '" << currentValue << "' == > '" << stringToDisplay << "'"); //APPL_DEBUG("display : '" << currentValue << "' == > '" << stringToDisplay << "'");
m_displayText.print(stringToDisplay); m_displayText.print(stringToDisplay);
countColomn += stringToDisplay.size(); countColomn += stringToDisplay.size();
} }
maxSizeX = etk_max(m_displayText.getPos().x(), maxSizeX); maxSizeX = etk_max(m_displayText.getPos().x(), maxSizeX);
if (tmpCursorPosition.z()!=-1) { // Display cursor only if we have the focus ...
if ( tmpCursorPosition.z() != -1
&& getFocus() == true) {
// display the cursor: // display the cursor:
//APPL_DEBUG("display cursor at position : " << tmpCursorPosition); //APPL_DEBUG("display cursor at position : " << tmpCursorPosition);
m_displayText.setPos(tmpCursorPosition); m_displayText.setPos(tmpCursorPosition);
@ -528,19 +535,37 @@ void appl::TextViewer::onEventClipboard(ewol::clipBoard::clipboardListe_te _clip
} }
void appl::TextViewer::onReceiveMessage(const ewol::EMessage& _msg) { void appl::TextViewer::onReceiveMessage(const ewol::EMessage& _msg) {
// First call plugin widget::WidgetScrooled::onReceiveMessage(_msg);
//APPL_DEBUG("receive msg: " << _msg); //APPL_DEBUG("receive msg: " << _msg);
// First call plugin
if (appl::textPluginManager::onReceiveMessage(*this, _msg) == true) { if (appl::textPluginManager::onReceiveMessage(*this, _msg) == true) {
markToRedraw(); markToRedraw();
return; return;
} }
if (_msg.getMessage() == appl::MsgSelectNewFile) { if (_msg.getMessage() == appl::MsgSelectNewFile) {
if (m_buffer != NULL) {
m_buffer->unRegisterOnEvent(this);
}
m_buffer = m_bufferManager->get(_msg.getData()); m_buffer = m_bufferManager->get(_msg.getData());
if (m_buffer != NULL) {
m_buffer->registerOnEvent(this, appl::Buffer::eventIsModify);
m_buffer->registerOnEvent(this, appl::Buffer::eventSelectChange);
} }
markToRedraw(); markToRedraw();
return;
}
if (_msg.getMessage() == appl::Buffer::eventIsModify) {
markToRedraw();
return;
}
if (_msg.getMessage() == appl::Buffer::eventSelectChange) {
markToRedraw();
return;
}
} }
void appl::TextViewer::onObjectRemove(ewol::EObject* _removeObject) { void appl::TextViewer::onObjectRemove(ewol::EObject* _removeObject) {
widget::WidgetScrooled::onObjectRemove(_removeObject);
if (m_buffer == _removeObject) { if (m_buffer == _removeObject) {
m_buffer = NULL; m_buffer = NULL;
markToRedraw(); markToRedraw();