diff --git a/sources/appl/Buffer/Buffer.cpp b/sources/appl/Buffer/Buffer.cpp index f6b1d88..1ff82c9 100644 --- a/sources/appl/Buffer/Buffer.cpp +++ b/sources/appl/Buffer/Buffer.cpp @@ -36,7 +36,6 @@ void appl::Buffer::setFileName(const etk::UString& _name) { } void appl::Buffer::moveCursorRight(appl::Buffer::moveMode _mode) { - m_cursorPreferredCol = -1; etk::UniChar value; esize_t nbElement; switch (_mode) { @@ -44,7 +43,7 @@ void appl::Buffer::moveCursorRight(appl::Buffer::moveMode _mode) { case moveLetter: nbElement = get(m_cursorPos, value); if (nbElement>0) { - m_cursorPos += nbElement; + moveCursor(m_cursorPos + nbElement); } break; case moveWord: @@ -58,7 +57,6 @@ void appl::Buffer::moveCursorRight(appl::Buffer::moveMode _mode) { } void appl::Buffer::moveCursorLeft(appl::Buffer::moveMode _mode) { - m_cursorPreferredCol = -1; etk::UniChar value; esize_t nbElement; switch (_mode) { @@ -66,7 +64,7 @@ void appl::Buffer::moveCursorLeft(appl::Buffer::moveMode _mode) { case moveLetter: nbElement = getBack(m_cursorPos-1, value); if (nbElement>0) { - m_cursorPos -= nbElement; + moveCursor(m_cursorPos - nbElement); } break; case moveWord: @@ -78,7 +76,7 @@ void appl::Buffer::moveCursorLeft(appl::Buffer::moveMode _mode) { } } -void appl::Buffer::moveCursorUp(esize_t _nbLine) { +void appl::Buffer::moveCursorUp(esize_t _nbLine, ewol::Text& _textDrawer) { // find the position of the start of the line. esize_t lineStartPos = startLine(m_cursorPos); // check if we can go up ... @@ -87,20 +85,22 @@ void appl::Buffer::moveCursorUp(esize_t _nbLine) { } // Decide what column to move to, if there's a preferred column use that if (m_cursorPreferredCol < 0) { - m_cursorPreferredCol = countDispChars(lineStartPos, m_cursorPos); + // TODO : Remove this +1 !!! + m_cursorPreferredCol = getScreenSize(lineStartPos+1, m_cursorPos, _textDrawer); } EWOL_DEBUG("ploop : " << m_cursorPreferredCol); // get the previous line esize_t prevLineStartPos = countBackwardNLines(lineStartPos, _nbLine); //APPL_INFO("Move line UP result : prevLineStartPos=" << prevLineStartPos); // get the display char position - esize_t newPos = countForwardDispChars(prevLineStartPos, m_cursorPreferredCol); + esize_t newPos = getPosSize(prevLineStartPos, m_cursorPreferredCol, _textDrawer); //APPL_INFO("Move to colomn : column=" << column << " newPos=" << newPos); - //SetInsertPosition(newPos); - m_cursorPos = newPos; + float posStore = m_cursorPreferredCol; + moveCursor(newPos); + m_cursorPreferredCol = posStore; } -void appl::Buffer::moveCursorDown(esize_t _nbLine) { +void appl::Buffer::moveCursorDown(esize_t _nbLine, ewol::Text& _textDrawer) { // check if we are not at the end of Buffer if (m_cursorPos == m_data.size() ) { return; @@ -109,17 +109,19 @@ void appl::Buffer::moveCursorDown(esize_t _nbLine) { esize_t lineStartPos = startLine(m_cursorPos); if (m_cursorPreferredCol < 0) { - m_cursorPreferredCol = countDispChars(lineStartPos, m_cursorPos); + // TODO : Remove this +1 !!! + m_cursorPreferredCol = getScreenSize(lineStartPos+1, m_cursorPos, _textDrawer); } EWOL_DEBUG("ploop : " << m_cursorPreferredCol); // get the next line : esize_t nextLineStartPos = countForwardNLines(lineStartPos, _nbLine); //APPL_INFO("Move line DOWN result : nextLineStartPos=" << nextLineStartPos); // get the display char position - esize_t newPos = countForwardDispChars(nextLineStartPos, m_cursorPreferredCol); + esize_t newPos = getPosSize(nextLineStartPos, m_cursorPreferredCol, _textDrawer); //APPL_INFO("Move to colomn : column=" << column << " newPos=" << newPos); - //SetInsertPosition(newPos); - m_cursorPos = newPos; + float posStore = m_cursorPreferredCol; + moveCursor(newPos); + m_cursorPreferredCol = posStore; } esize_t appl::Buffer::startLine(esize_t _pos) { @@ -232,11 +234,11 @@ bool appl::Buffer::onEventEntry(const ewol::EventEntry& _event, ewol::Text& _tes break; case ewol::keyEvent::keyboardUp: //APPL_INFO("keyEvent : "); - moveCursorUp(1); + moveCursorUp(1, _testDrawer); break; case ewol::keyEvent::keyboardDown: //APPL_INFO("keyEvent : "); - moveCursorDown(1); + moveCursorDown(1, _testDrawer); break; case ewol::keyEvent::keyboardPageUp: //APPL_INFO("keyEvent : "); @@ -273,12 +275,14 @@ bool appl::Buffer::onEventInput(const ewol::EventInput& _event, ewol::Text& _tex // mouse selection : if (_event.getType() == ewol::keyEvent::typeMouse) { if (_event.getStatus() == ewol::keyEvent::statusDown) { - m_buttunOneSelected = true; - moveCursorAtPosition(_relativePos, _textDrawer); + esize_t newPos = getMousePosition(_relativePos, _textDrawer); + moveCursor(newPos); + m_selectMode = true; return true; } else if (_event.getStatus() == ewol::keyEvent::statusUp) { - m_buttunOneSelected = false; - moveCursorAtPosition(_relativePos, _textDrawer); + esize_t newPos = getMousePosition(_relativePos, _textDrawer); + moveCursor(newPos); + m_selectMode = false; // TODO : Copy selection : //tmpBuffer->Copy(ewol::clipBoard::clipboardSelection); return true; @@ -286,7 +290,8 @@ bool appl::Buffer::onEventInput(const ewol::EventInput& _event, ewol::Text& _tex } if (_event.getStatus() == ewol::keyEvent::statusSingle) { if (_event.getType() == ewol::keyEvent::typeMouse) { - moveCursorAtPosition(_relativePos, _textDrawer); + esize_t newPos = getMousePosition(_relativePos, _textDrawer); + moveCursor(newPos); return true; } } else if (_event.getStatus() == ewol::keyEvent::statusDouble) { @@ -296,46 +301,218 @@ bool appl::Buffer::onEventInput(const ewol::EventInput& _event, ewol::Text& _tex mouseEventTriple(); return true; } else if (_event.getStatus() == ewol::keyEvent::statusMove) { - if (m_buttunOneSelected == true) { - moveCursorAtPosition(_relativePos, _textDrawer); + if (m_selectMode == true) { + esize_t newPos = getMousePosition(_relativePos, _textDrawer); + moveCursor(newPos); return true; } } } else if (2 == _event.getId()) { if (ewol::keyEvent::statusSingle == _event.getStatus()) { - moveCursorAtPosition(_relativePos, _textDrawer); + esize_t newPos = getMousePosition(_relativePos, _textDrawer); + moveCursor(newPos); ewol::clipBoard::request(ewol::clipBoard::clipboardSelection); } } return false; } -void appl::Buffer::moveCursorAtPosition(const vec2& _relativePos, ewol::Text& _textDrawer) -{ +void appl::Buffer::moveCursor(esize_t _pos) { + m_cursorPreferredCol = -1; // selecting mode ... - if (m_buttunOneSelected == true) { - esize_t newPos = getMousePosition(_relativePos, _textDrawer); - APPL_DEBUG("Select : " << m_cursorPos << " ==> " << newPos); - m_cursorSelectPos = newPos; + if (m_selectMode == true) { + if (m_cursorSelectPos == -1) { + m_cursorSelectPos = m_cursorPos; + } + //APPL_DEBUG("Select : " << m_cursorSelectPos << " ==> " << newPos); + m_cursorPos = _pos; + if (m_cursorPos == m_cursorSelectPos) { + m_cursorSelectPos = -1; + } return; } // move mode - esize_t newPos = getMousePosition(_relativePos, _textDrawer); - m_cursorPos = newPos; + m_cursorPos = _pos; m_cursorSelectPos = -1; } -void appl::Buffer::mouseEventDouble(void) -{ - +bool appl::Buffer::selectAround(int32_t _startPos, int32_t &_beginPos, int32_t &_endPos) { + esize_t bufferElementSize; + esize_t previousElementSize; + etk::UniChar currentValue; + get(_startPos, currentValue); + if ( currentValue == etk::UniChar::Tabulation + || currentValue == etk::UniChar::Space) { + APPL_DEBUG("select spacer"); + // special case we are looking for separation + for (_beginPos=_startPos; + _beginPos>=0; + previousElementSize = bufferElementSize, + _beginPos-=bufferElementSize) { + bufferElementSize = getBack(_beginPos, currentValue); + if ( currentValue != etk::UniChar::Tabulation + && currentValue != etk::UniChar::Space) { + _beginPos += previousElementSize; + break; + } + } + // special case we are looking for separation + for (_endPos=_startPos; + _endPos=0; + previousElementSize = bufferElementSize, + _beginPos-=bufferElementSize) { + bufferElementSize = getBack(_beginPos, currentValue); + if ( currentValue != '_' + && true == currentValue.isSpecialChar()) { + _beginPos += previousElementSize; + break; + } + } + // Search forward + for (_endPos=_startPos; + _endPos=0; + previousElementSize = bufferElementSize, + _beginPos-=bufferElementSize) { + bufferElementSize = getBack(_beginPos, currentValue); + if (comparechar != currentValue) { + _beginPos += previousElementSize; + break; + } + } + // Search forward + for (_endPos=_startPos; + _endPos '" << stringToDisplay << "'"); + //m_displayText.setPos(positionCurentDisplay); + for (esize_t kkk=0; kkk= _distance) { + return iii; + } + countColomn += stringToDisplay.size(); + } + return m_data.size(); +} + +// TODO : Rename ... +float appl::Buffer::getScreenSize(esize_t _startLinePos, esize_t _stopPos, ewol::Text& _textDrawer) +{ + float ret = 0; + esize_t bufferElementSize; + etk::UniChar currentValue; + esize_t countColomn = 0; + etk::UString stringToDisplay; + _textDrawer.clear(); + esize_t previousElementPos = 0; + + APPL_DEBUG("search in " << _startLinePos << " " << _stopPos); + for (esize_t iii=_startLinePos; + iii '" << stringToDisplay << "'"); + //m_displayText.setPos(positionCurentDisplay); + for (esize_t kkk=0; kkkm_cursorPos, m_buffer->m_cursorSelectPos); + int32_t selectPosStop = etk_max(m_buffer->m_cursorPos, m_buffer->m_cursorSelectPos); + if (m_buffer->m_cursorSelectPos<0) { + selectPosStart = -1; + selectPosStop = -1; + } for (int32_t iii=0; iiim_cursorPos) { // need to display the cursor : tmpCursorPosition = positionCurentDisplay; } + if (iii >= selectPosStart && iii < selectPosStop) { + isSelect = true; + } else { + isSelect = false; + } bufferElementSize = m_buffer->get(iii, currentValue); //APPL_DEBUG(" element size : " << iii << " : " << bufferElementSize); if (currentValue == etk::UniChar::Return) { @@ -148,11 +160,14 @@ void appl::TextViewer::onRegenerateDisplay(void) { continue; } m_buffer->expand(countColomn, currentValue, stringToDisplay); + if (isSelect == true) { + m_displayText.setColorBg(etk::Color<>(0x00FF00FF)); + } else { + m_displayText.setColorBg(etk::Color<>(0x00000000)); + } //APPL_DEBUG("display : '" << currentValue << "' == > '" << stringToDisplay << "'"); //m_displayText.setPos(positionCurentDisplay); - for (esize_t kkk=0; kkk