From 4693119e7d9d77355560a0c6261c9a95b9a4a87a Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Wed, 30 Oct 2013 21:16:38 +0100 Subject: [PATCH] [DEV] test multiple display of one buffer --- data/theme/colorBlack/bufferList.json | 10 ++-- data/theme/colorWhite/bufferList.json | 10 ++-- sources/appl/Buffer.cpp | 16 +++++- sources/appl/Buffer.h | 4 ++ sources/appl/BufferManager.cpp | 18 +++++- sources/appl/BufferManager.h | 6 ++ sources/appl/Gui/BufferView.cpp | 82 ++++++++++++++++++++++++++- sources/appl/Gui/BufferView.h | 18 ++++-- sources/appl/Gui/MainWindows.cpp | 5 ++ sources/appl/Gui/MainWindows.h | 1 - sources/appl/Gui/TextViewer.cpp | 49 ++++++++++++---- 11 files changed, 185 insertions(+), 34 deletions(-) diff --git a/data/theme/colorBlack/bufferList.json b/data/theme/colorBlack/bufferList.json index e24312a..ad8993d 100644 --- a/data/theme/colorBlack/bufferList.json +++ b/data/theme/colorBlack/bufferList.json @@ -1,9 +1,9 @@ { "ednColor": [ - { name:"LIST_backgroung1", foreground:"#202020" }, - { name:"LIST_backgroung2", foreground:"#000000" }, - { name:"LIST_backgroungSelected", foreground:"#2f0ba4" }, - { name:"LIST_textNormal", foreground:"#EEEEEE" }, - { name:"LIST_textModify", foreground:"#FF0000" }, + { name:"backgroung1", foreground:"#202020" }, + { name:"backgroung2", foreground:"#000000" }, + { name:"backgroungSelected", foreground:"#2f0ba4" }, + { name:"textNormal", foreground:"#EEEEEE" }, + { name:"textModify", foreground:"#FF0000" }, ] } diff --git a/data/theme/colorWhite/bufferList.json b/data/theme/colorWhite/bufferList.json index b174f55..6cae4af 100644 --- a/data/theme/colorWhite/bufferList.json +++ b/data/theme/colorWhite/bufferList.json @@ -1,9 +1,9 @@ { "ednColor": [ - { name:"LIST_backgroung1", foreground:"#d9d7d7"}, - { name:"LIST_backgroung2", foreground:"#b7b6b6"}, - { name:"LIST_backgroungSelected", foreground:"#3da3f9"}, - { name:"LIST_textNormal", foreground:"#000000"}, - { name:"LIST_textModify", foreground:"#FF0000"} + { name:"backgroung1", foreground:"#d9d7d7"}, + { name:"backgroung2", foreground:"#b7b6b6"}, + { name:"backgroungSelected", foreground:"#3da3f9"}, + { name:"textNormal", foreground:"#000000"}, + { name:"textModify", foreground:"#FF0000"} ] } \ No newline at end of file diff --git a/sources/appl/Buffer.cpp b/sources/appl/Buffer.cpp index 81d6580..baf9f07 100644 --- a/sources/appl/Buffer.cpp +++ b/sources/appl/Buffer.cpp @@ -12,6 +12,11 @@ #include #include + +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) { m_value = etk::UChar::Null; if ( m_data != NULL @@ -103,7 +108,9 @@ appl::Buffer::Buffer(void) : m_cursorPreferredCol(-1), m_nbLines(0), m_highlight(NULL) { - + addEventId(eventIsModify); + addEventId(eventIsSave); + addEventId(eventSelectChange); } appl::Buffer::~Buffer(void) { @@ -208,11 +215,13 @@ void appl::Buffer::moveCursor(esize_t _pos) { if (m_cursorPos == m_cursorSelectPos) { m_cursorSelectPos = -1; } + generateEventId(eventSelectChange); return; } // move mode m_cursorPos = _pos; m_cursorSelectPos = -1; + generateEventId(eventSelectChange); } 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) { m_cursorSelectPos = _pos; + generateEventId(eventSelectChange); } void appl::Buffer::unSelect(void) { m_cursorSelectPos = -1; + generateEventId(eventSelectChange); } static const char *ControlCodeTable[32] = { @@ -438,6 +449,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); return true; } @@ -448,6 +460,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); return true; } @@ -460,6 +473,7 @@ void appl::Buffer::removeSelection(void) { m_selectMode = false; moveCursor(startPos); countNumberofLine(); // TODO : use more intelligent counter + generateEventId(eventIsModify); } } diff --git a/sources/appl/Buffer.h b/sources/appl/Buffer.h index 705e7e0..434d7f9 100644 --- a/sources/appl/Buffer.h +++ b/sources/appl/Buffer.h @@ -260,6 +260,10 @@ namespace appl { }; friend class Buffer; }; + public: + static const char* const eventIsModify; + static const char* const eventIsSave; + static const char* const eventSelectChange; public: Buffer(void); ~Buffer(void); diff --git a/sources/appl/BufferManager.cpp b/sources/appl/BufferManager.cpp index 48af404..98f904a 100644 --- a/sources/appl/BufferManager.cpp +++ b/sources/appl/BufferManager.cpp @@ -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)get(_fileName, true); - sendMultiCast(appl::MsgSelectNewFile, _fileName); + if (exist(_fileName) == false) { + (void)get(_fileName, true); + sendMultiCast(appl::MsgSelectNewFile, _fileName); + } } void appl::BufferManager::onReceiveMessage(const ewol::EMessage& _msg) { diff --git a/sources/appl/BufferManager.h b/sources/appl/BufferManager.h index 6c45db5..67ee4cb 100644 --- a/sources/appl/BufferManager.h +++ b/sources/appl/BufferManager.h @@ -34,6 +34,12 @@ namespace appl { * @param[in] _fileName Name of the file to open or create. */ 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); esize_t size(void); diff --git a/sources/appl/Gui/BufferView.cpp b/sources/appl/Gui/BufferView.cpp index abc5a70..d14b779 100644 --- a/sources/appl/Gui/BufferView.cpp +++ b/sources/appl/Gui/BufferView.cpp @@ -44,8 +44,19 @@ BufferView::BufferView(void) { registerMultiCast(ednMsgBufferListChange); registerMultiCast(ednMsgBufferState); registerMultiCast(ednMsgBufferId); + registerMultiCast(appl::MsgSelectNewFile); m_selectedID = -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) { @@ -60,10 +71,27 @@ void BufferView::removeAllElement(void) { } } m_list.clear(); + if (m_bufferManager != NULL) { + appl::BufferManager::release(m_bufferManager); + } } void BufferView::onReceiveMessage(const ewol::EMessage& _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) { // clean The list 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; iiim_buffer != _removeObject) { + continue; + } + m_list.remove(iii); + markToRedraw(); + return; + } +} + 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) { @@ -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) { + if( _raw >= 0 + && _rawm_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; 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 && _rawm_bufferID; - sendMultiCast(ednMsgBufferId, m_list[_raw]->m_bufferID); + //m_selectedIdRequested = m_list[_raw]->m_buffer; + //sendMultiCast(ednMsgBufferId, m_list[_raw]->m_buffer); } } markToRedraw(); diff --git a/sources/appl/Gui/BufferView.h b/sources/appl/Gui/BufferView.h index 2b94e48..41b6e46 100644 --- a/sources/appl/Gui/BufferView.h +++ b/sources/appl/Gui/BufferView.h @@ -21,12 +21,10 @@ namespace appl { public: etk::FSNode m_bufferName; - uint32_t m_bufferID; - bool m_isModify; - dataBufferStruct(etk::FSNode& _bufferName, int32_t _bufferID, bool _isModify) : + appl::Buffer* m_buffer; + dataBufferStruct(const etk::UString& _bufferName, appl::Buffer* _buffer) : m_bufferName(_bufferName), - m_bufferID(_bufferID), - m_isModify(_isModify) { + m_buffer(_buffer) { }; ~dataBufferStruct(void) { }; @@ -35,6 +33,15 @@ namespace appl 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: int32_t m_selectedIdRequested; int32_t m_selectedID; @@ -47,6 +54,7 @@ class BufferView : public widget::List const char * const getObjectType(void) { return "ApplBufferView"; }; // Derived function virtual void onReceiveMessage(const ewol::EMessage& _msg); + virtual void onObjectRemove(ewol::EObject* _removeObject); protected: // function call to display the list : virtual etk::Color<> getBasicBG(void); diff --git a/sources/appl/Gui/MainWindows.cpp b/sources/appl/Gui/MainWindows.cpp index 2b35236..5c0dd5e 100644 --- a/sources/appl/Gui/MainWindows.cpp +++ b/sources/appl/Gui/MainWindows.cpp @@ -136,6 +136,11 @@ MainWindows::MainWindows(void) { mySizerHori->subWidgetAdd(mySizerVert2); // 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->setExpand(bvec2(true,true)); myTextView->setFill(bvec2(true,true)); diff --git a/sources/appl/Gui/MainWindows.h b/sources/appl/Gui/MainWindows.h index 8e2116b..d9e2c21 100644 --- a/sources/appl/Gui/MainWindows.h +++ b/sources/appl/Gui/MainWindows.h @@ -30,7 +30,6 @@ class MainWindows : public ewol::Windows { virtual void onObjectRemove(ewol::EObject * _removeObject); }; -#define EDN_CAST_MAIN_WINDOWS(curentPointer) EWOL_CAST(TYPE_EOBJECT_EDN_MAIN_WINDOWS,MainWindows,curentPointer) #endif diff --git a/sources/appl/Gui/TextViewer.cpp b/sources/appl/Gui/TextViewer.cpp index 78de899..b08fb8d 100644 --- a/sources/appl/Gui/TextViewer.cpp +++ b/sources/appl/Gui/TextViewer.cpp @@ -213,12 +213,14 @@ void appl::TextViewer::onRegenerateDisplay(void) { countNbLine += 1; countColomn = 0; maxSizeX = etk_max(m_displayText.getPos().x(), maxSizeX); - // display the end line position - if (it >= selectPosStart && it < selectPosStop) { - ewol::Drawing& draw = m_displayText.getDrawing(); - draw.setColor(etk::Color<>(0xFF0000FF)); - draw.setPos(m_displayText.getPos() + tmpLetterSize/4.0f); - draw.rectangle(m_displayText.getPos() + tmpLetterSize*3.0f/4.0f); + // Display the end line position only if we have the focus ... + if (getFocus() == true) { + if (it >= selectPosStart && it < selectPosStop) { + ewol::Drawing& draw = m_displayText.getDrawing(); + draw.setColor(etk::Color<>(0xFF0000FF)); + draw.setPos(m_displayText.getPos() + tmpLetterSize/4.0f); + draw.rectangle(m_displayText.getPos() + tmpLetterSize*3.0f/4.0f); + } } m_displayText.forceLineReturn(); m_displayText.setPos(vec3(-m_originScrooled.x()+m_lastOffsetDisplay, m_displayText.getPos().y(), 0.0f)); @@ -250,16 +252,21 @@ void appl::TextViewer::onRegenerateDisplay(void) { } } m_buffer->expand(countColomn, *it, stringToDisplay); - if (it >= selectPosStart && it < selectPosStop) { - m_displayText.setColor((*m_paintingProperties)[m_colorSelection].getForeground()); - m_displayText.setColorBg((*m_paintingProperties)[m_colorSelection].getBackground()); + // Display selection only if we have the focus ... + if (getFocus() == true) { + if (it >= selectPosStart && it < selectPosStop) { + m_displayText.setColor((*m_paintingProperties)[m_colorSelection].getForeground()); + m_displayText.setColorBg((*m_paintingProperties)[m_colorSelection].getBackground()); + } } //APPL_DEBUG("display : '" << currentValue << "' == > '" << stringToDisplay << "'"); m_displayText.print(stringToDisplay); countColomn += stringToDisplay.size(); } 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: //APPL_DEBUG("display cursor at position : " << 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) { - // First call plugin + widget::WidgetScrooled::onReceiveMessage(_msg); //APPL_DEBUG("receive msg: " << _msg); + // First call plugin if (appl::textPluginManager::onReceiveMessage(*this, _msg) == true) { markToRedraw(); return; } if (_msg.getMessage() == appl::MsgSelectNewFile) { + if (m_buffer != NULL) { + m_buffer->unRegisterOnEvent(this); + } 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(); + return; + } + if (_msg.getMessage() == appl::Buffer::eventIsModify) { + markToRedraw(); + return; + } + if (_msg.getMessage() == appl::Buffer::eventSelectChange) { + markToRedraw(); + return; } - markToRedraw(); } void appl::TextViewer::onObjectRemove(ewol::EObject* _removeObject) { + widget::WidgetScrooled::onObjectRemove(_removeObject); if (m_buffer == _removeObject) { m_buffer = NULL; markToRedraw();