edn/sources/appl/Buffer/Buffer.cpp

878 lines
25 KiB
C++
Raw Normal View History

2013-09-19 22:23:31 +02:00
/**
* @author Edouard DUPIN
*
* @copyright 2010, Edouard DUPIN, all right reserved
*
* @license GPL v3 (see license file)
*/
#include <appl/Buffer/Buffer.h>
#include <appl/Debug.h>
2013-10-16 21:55:45 +02:00
#include <ewol/clipBoard.h>
2013-09-19 22:23:31 +02:00
2013-09-26 22:15:39 +02:00
appl::Buffer::Buffer(void) :
2013-10-09 22:00:24 +02:00
m_cursorPos(0),
2013-10-16 21:55:45 +02:00
m_cursorSelectPos(-1),
2013-10-09 22:00:24 +02:00
m_cursorPreferredCol(-1) {
2013-09-26 22:15:39 +02:00
}
2013-09-19 22:23:31 +02:00
2013-10-09 22:00:24 +02:00
bool appl::Buffer::loadFile(const etk::UString& _name) {
2013-09-19 22:23:31 +02:00
APPL_DEBUG("Load file : '" << _name << "'");
m_fileName = _name;
etk::FSNode file(m_fileName);
2013-10-09 22:00:24 +02:00
if (file.exist() == false) {
2013-09-19 22:23:31 +02:00
return false;
}
2013-10-09 22:00:24 +02:00
if (true == m_data.dumpFrom(file) ) {
2013-09-19 22:23:31 +02:00
return true;
}
return false;
}
2013-10-09 22:00:24 +02:00
void appl::Buffer::setFileName(const etk::UString& _name) {
2013-09-19 22:23:31 +02:00
// TODO : ...
}
2013-10-09 22:00:24 +02:00
void appl::Buffer::moveCursorRight(appl::Buffer::moveMode _mode) {
2013-09-27 23:02:30 +02:00
etk::UniChar value;
esize_t nbElement;
switch (_mode) {
default:
case moveLetter:
2013-10-07 22:04:21 +02:00
nbElement = get(m_cursorPos, value);
2013-09-27 23:02:30 +02:00
if (nbElement>0) {
moveCursor(m_cursorPos + nbElement);
2013-09-27 23:02:30 +02:00
}
break;
case moveWord:
// TODO : ...
break;
case moveEnd:
// TODO : ...
nbElement = endLine(m_cursorPos);
moveCursor(nbElement);
2013-09-27 23:02:30 +02:00
break;
}
}
2013-10-09 22:00:24 +02:00
void appl::Buffer::moveCursorLeft(appl::Buffer::moveMode _mode) {
2013-09-27 23:02:30 +02:00
etk::UniChar value;
esize_t nbElement;
switch (_mode) {
default:
case moveLetter:
2013-10-07 22:04:21 +02:00
nbElement = getBack(m_cursorPos-1, value);
2013-09-27 23:02:30 +02:00
if (nbElement>0) {
moveCursor(m_cursorPos - nbElement);
2013-09-27 23:02:30 +02:00
}
break;
case moveWord:
// TODO : ...
break;
case moveEnd:
nbElement = startLine(m_cursorPos);
moveCursor(nbElement+1);
2013-09-27 23:02:30 +02:00
break;
}
}
void appl::Buffer::moveCursorUp(esize_t _nbLine, ewol::Text& _textDrawer) {
2013-10-07 22:04:21 +02:00
// find the position of the start of the line.
2013-10-09 22:00:24 +02:00
esize_t lineStartPos = startLine(m_cursorPos);
2013-09-27 23:02:30 +02:00
// check if we can go up ...
if (lineStartPos == 0) {
return;
}
// Decide what column to move to, if there's a preferred column use that
if (m_cursorPreferredCol < 0) {
// TODO : Remove this +1 !!!
m_cursorPreferredCol = getScreenSize(lineStartPos+1, m_cursorPos, _textDrawer);
2013-09-27 23:02:30 +02:00
}
EWOL_DEBUG("ploop : " << m_cursorPreferredCol);
2013-10-07 22:04:21 +02:00
// get the previous line
2013-10-09 22:00:24 +02:00
esize_t prevLineStartPos = countBackwardNLines(lineStartPos, _nbLine);
2013-10-07 22:04:21 +02:00
//APPL_INFO("Move line UP result : prevLineStartPos=" << prevLineStartPos);
// get the display char position
esize_t newPos = getPosSize(prevLineStartPos, m_cursorPreferredCol, _textDrawer);
2013-09-27 23:02:30 +02:00
//APPL_INFO("Move to colomn : column=" << column << " newPos=" << newPos);
float posStore = m_cursorPreferredCol;
moveCursor(newPos);
m_cursorPreferredCol = posStore;
2013-09-27 23:02:30 +02:00
}
void appl::Buffer::moveCursorDown(esize_t _nbLine, ewol::Text& _textDrawer) {
2013-09-27 23:02:30 +02:00
// check if we are not at the end of Buffer
2013-10-07 22:04:21 +02:00
if (m_cursorPos == m_data.size() ) {
2013-09-27 23:02:30 +02:00
return;
}
2013-10-07 22:04:21 +02:00
// find the position of the start of the line.
2013-10-09 22:00:24 +02:00
esize_t lineStartPos = startLine(m_cursorPos);
2013-09-27 23:02:30 +02:00
if (m_cursorPreferredCol < 0) {
// TODO : Remove this +1 !!!
m_cursorPreferredCol = getScreenSize(lineStartPos+1, m_cursorPos, _textDrawer);
2013-09-27 23:02:30 +02:00
}
EWOL_DEBUG("ploop : " << m_cursorPreferredCol);
2013-09-27 23:02:30 +02:00
// get the next line :
2013-10-09 22:00:24 +02:00
esize_t nextLineStartPos = countForwardNLines(lineStartPos, _nbLine);
2013-10-07 22:04:21 +02:00
//APPL_INFO("Move line DOWN result : nextLineStartPos=" << nextLineStartPos);
// get the display char position
esize_t newPos = getPosSize(nextLineStartPos, m_cursorPreferredCol, _textDrawer);
2013-09-27 23:02:30 +02:00
//APPL_INFO("Move to colomn : column=" << column << " newPos=" << newPos);
float posStore = m_cursorPreferredCol;
moveCursor(newPos);
m_cursorPreferredCol = posStore;
2013-09-27 23:02:30 +02:00
}
2013-10-09 22:00:24 +02:00
esize_t appl::Buffer::startLine(esize_t _pos) {
2013-09-27 23:02:30 +02:00
esize_t startPos;
2013-10-09 22:00:24 +02:00
if (false == searchBack(_pos, etk::UniChar::Return, startPos)) {
2013-09-27 23:02:30 +02:00
return 0;
}
return startPos + 1;
}
2013-10-09 22:00:24 +02:00
esize_t appl::Buffer::endLine(esize_t _pos) {
2013-09-27 23:02:30 +02:00
esize_t endPos;
2013-10-09 22:00:24 +02:00
if (false == search(_pos, etk::UniChar::Return, endPos)) {
2013-10-07 22:04:21 +02:00
endPos = m_data.size();
2013-09-27 23:02:30 +02:00
}
return endPos;
}
2013-10-09 22:00:24 +02:00
bool appl::Buffer::search(esize_t _pos, const etk::UniChar& _search, esize_t& _result) {
2013-09-27 23:02:30 +02:00
// move in the string
esize_t nbElementBuffer = 0;
etk::UniChar value;
2013-10-07 22:04:21 +02:00
for(esize_t iii=_pos ; iii<m_data.size() ; iii+=nbElementBuffer ) {
nbElementBuffer = get(iii, value);
2013-09-27 23:02:30 +02:00
if (value == _search) {
_result = iii;
return true;
}
2013-10-07 22:04:21 +02:00
if (nbElementBuffer <= 0) {
nbElementBuffer = 1;
}
2013-09-27 23:02:30 +02:00
}
2013-10-07 22:04:21 +02:00
_result = m_data.size();
2013-09-27 23:02:30 +02:00
return false;
}
2013-10-09 22:00:24 +02:00
bool appl::Buffer::searchBack(esize_t _pos, const etk::UniChar& _search, esize_t& _result) {
2013-09-27 23:02:30 +02:00
// move in the string
esize_t nbElementBuffer = 0;
etk::UniChar value;
2013-10-07 22:04:21 +02:00
for(esize_t iii=_pos-1 ; iii >= 0 ; iii-=nbElementBuffer ) {
nbElementBuffer = getBack(iii, value);
2013-09-27 23:02:30 +02:00
if (value == _search) {
_result = iii-nbElementBuffer;
return true;
}
2013-10-07 22:04:21 +02:00
if (nbElementBuffer <= 0) {
nbElementBuffer = 1;
}
2013-09-27 23:02:30 +02:00
}
_result = 0;
return false;
}
2013-10-09 22:00:24 +02:00
// TODO : vec2 _displaySize
bool appl::Buffer::onEventEntry(const ewol::EventEntry& _event, ewol::Text& _testDrawer) {
//APPL_DEBUG(" event : " << _event);
2013-10-07 22:04:21 +02:00
if (_event.getType() == ewol::keyEvent::keyboardChar) {
2013-09-26 22:15:39 +02:00
//APPL_DEBUG("KB EVENT : \"" << UTF8_data << "\" size=" << strlen(UTF8_data) << "type=" << (int32_t)typeEvent);
2013-10-07 22:04:21 +02:00
if (_event.getStatus() != ewol::keyEvent::statusDown) {
2013-09-26 22:15:39 +02:00
return false;
}
etk::UniChar localValue = _event.getChar();
if (localValue == etk::UniChar::Tabulation) {
if (hasTextSelected()) {
// TODO : Special tabulation multiline indentation ...
/*
int32_t nbSelectedLines = m_EdnBuf.CountLines(SelectionStart, SelectionEnd);
if (1 < nbSelectedLines) {
if (true == _event.getSpecialKey().isSetShift() ) {
m_cursorPos = m_EdnBuf.UnIndent();
} else {
m_cursorPos = m_EdnBuf.Indent();
}
}
*/
return true;
}
} else if (localValue == etk::UniChar::Return) {
if (true == _event.getSpecialKey().isSetShift()) {
localValue = etk::UniChar::CarrierReturn;
} else {
/*
m_data.insert(m_cursorPos, '\n');
if (true == globals::isSetAutoIndent() ) {
int32_t l_lineStart;
// get the begin of the line or the begin of the line befor selection
if (false == haveSelectionActive) {
l_lineStart = m_EdnBuf.StartOfLine(m_cursorPos);
} else {
l_lineStart = m_EdnBuf.StartOfLine(SelectionStart);
}
// add same characters in the temporar buffer
for (int32_t kk=l_lineStart; kk<m_cursorPos; kk++) {
if (' ' == m_EdnBuf[kk]) {
tmpVect.pushBack(' ');
} else if('\t' == m_EdnBuf[kk]) {
tmpVect.pushBack('\t');
} else {
break;
}
}
}
m_selectMode = false;
moveCursor(m_cursorPos + 1);
return true;
*/
}
} else if (localValue == etk::UniChar::Suppress ) {
2013-09-27 23:02:30 +02:00
//APPL_INFO("keyEvent : <suppr> pos=" << m_cursorPos);
if (hasTextSelected()) {
esize_t startPos = getStartSelectionPos();
esize_t endPos = getStopSelectionPos();
m_data.remove(startPos, endPos-startPos);
m_selectMode = false;
moveCursor(startPos);
} else {
etk::UniChar value;
esize_t nbElement = get(m_cursorPos, value);
if (nbElement>0) {
m_data.remove(m_cursorPos, nbElement);
}
2013-09-27 23:02:30 +02:00
}
return true;
} else if (localValue == etk::UniChar::Delete) {
2013-09-27 23:02:30 +02:00
//APPL_INFO("keyEvent : <del> pos=" << m_cursorPos);
if (hasTextSelected()) {
esize_t startPos = getStartSelectionPos();
esize_t endPos = getStopSelectionPos();
m_data.remove(startPos, endPos-startPos);
m_selectMode = false;
moveCursor(startPos);
} else {
etk::UniChar value;
esize_t nbElement = getBack(m_cursorPos-1, value);
if (nbElement>0) {
m_data.remove(m_cursorPos-nbElement, nbElement);
m_selectMode = false;
moveCursor(m_cursorPos-nbElement);
}
2013-09-27 23:02:30 +02:00
}
return true;
}
m_selectMode = false;
// normal adding char ...
char output[5];
int32_t nbElement = localValue.getUtf8(output);
if (hasTextSelected()) {
esize_t startPos = getStartSelectionPos();
esize_t endPos = getStopSelectionPos();
m_data.replace(startPos, endPos-startPos, (int8_t*)output, nbElement);
moveCursor(startPos+nbElement);
2013-09-26 22:15:39 +02:00
} else {
2013-10-07 22:04:21 +02:00
if (_event.getSpecialKey().isSetInsert() == false) {
m_data.insert(m_cursorPos, (int8_t*)output, nbElement);
2013-09-30 22:32:36 +02:00
} else {
etk::UniChar value;
2013-10-07 22:04:21 +02:00
esize_t nbElementRemove = get(m_cursorPos, value);
2013-10-09 22:00:24 +02:00
m_data.replace(m_cursorPos, nbElementRemove, (int8_t*)output, nbElement);
2013-09-30 22:32:36 +02:00
}
moveCursor(m_cursorPos+nbElement);
2013-09-26 22:15:39 +02:00
}
return true;
}
// move events ...
2013-10-07 22:04:21 +02:00
if (_event.getStatus() == ewol::keyEvent::statusDown) {
2013-09-27 23:02:30 +02:00
bool needUpdatePosition = true;
// check selection event ...
2013-10-07 22:04:21 +02:00
switch(_event.getType()) {
2013-09-27 23:02:30 +02:00
case ewol::keyEvent::keyboardLeft:
//APPL_INFO("keyEvent : <LEFT>");
2013-10-09 22:00:24 +02:00
moveCursorLeft();
2013-09-27 23:02:30 +02:00
break;
case ewol::keyEvent::keyboardRight:
//APPL_INFO("keyEvent : <RIGHT>");
2013-10-09 22:00:24 +02:00
moveCursorRight();
2013-09-27 23:02:30 +02:00
break;
case ewol::keyEvent::keyboardUp:
//APPL_INFO("keyEvent : <UP>");
moveCursorUp(1, _testDrawer);
2013-09-27 23:02:30 +02:00
break;
case ewol::keyEvent::keyboardDown:
//APPL_INFO("keyEvent : <DOWN>");
moveCursorDown(1, _testDrawer);
2013-09-27 23:02:30 +02:00
break;
case ewol::keyEvent::keyboardPageUp:
//APPL_INFO("keyEvent : <PAGE-UP>");
//TextDMoveUp(m_displaySize.y());
break;
case ewol::keyEvent::keyboardPageDown:
//APPL_INFO("keyEvent : <PAGE-DOWN>");
//TextDMoveDown(m_displaySize.y());
break;
case ewol::keyEvent::keyboardStart:
//APPL_INFO("keyEvent : <Start of line>");
2013-10-09 22:00:24 +02:00
moveCursorLeft(moveEnd);
2013-09-27 23:02:30 +02:00
break;
case ewol::keyEvent::keyboardEnd:
//APPL_INFO("keyEvent : <End of line>");
2013-10-09 22:00:24 +02:00
moveCursorRight(moveEnd);
2013-09-27 23:02:30 +02:00
break;
default:
break;
}
/*
if ( true == needUpdatePosition) {
RequestUpdateOfThePosition();
}
*/
2013-09-26 22:15:39 +02:00
return true;
}
return false;
}
2013-10-16 21:55:45 +02:00
bool appl::Buffer::onEventInput(const ewol::EventInput& _event, ewol::Text& _textDrawer, const vec2& _relativePos)
{
if (_event.getId() == 1) {
// mouse selection :
if (_event.getType() == ewol::keyEvent::typeMouse) {
if (_event.getStatus() == ewol::keyEvent::statusDown) {
esize_t newPos = getMousePosition(_relativePos, _textDrawer);
moveCursor(newPos);
m_selectMode = true;
2013-10-16 21:55:45 +02:00
return true;
} else if (_event.getStatus() == ewol::keyEvent::statusUp) {
esize_t newPos = getMousePosition(_relativePos, _textDrawer);
moveCursor(newPos);
m_selectMode = false;
2013-10-16 21:55:45 +02:00
// TODO : Copy selection :
//tmpBuffer->Copy(ewol::clipBoard::clipboardSelection);
return true;
}
}
if (_event.getStatus() == ewol::keyEvent::statusSingle) {
if (_event.getType() == ewol::keyEvent::typeMouse) {
esize_t newPos = getMousePosition(_relativePos, _textDrawer);
moveCursor(newPos);
2013-10-16 21:55:45 +02:00
return true;
}
} else if (_event.getStatus() == ewol::keyEvent::statusDouble) {
mouseEventDouble();
return true;
} else if (_event.getStatus() == ewol::keyEvent::statusTriple) {
mouseEventTriple();
return true;
} else if (_event.getStatus() == ewol::keyEvent::statusMove) {
if (m_selectMode == true) {
esize_t newPos = getMousePosition(_relativePos, _textDrawer);
moveCursor(newPos);
2013-10-16 21:55:45 +02:00
return true;
}
}
} else if (2 == _event.getId()) {
if (ewol::keyEvent::statusSingle == _event.getStatus()) {
esize_t newPos = getMousePosition(_relativePos, _textDrawer);
moveCursor(newPos);
2013-10-16 21:55:45 +02:00
ewol::clipBoard::request(ewol::clipBoard::clipboardSelection);
}
}
return false;
}
void appl::Buffer::moveCursor(esize_t _pos) {
m_cursorPreferredCol = -1;
2013-10-16 21:55:45 +02:00
// selecting mode ...
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;
}
2013-10-16 21:55:45 +02:00
return;
}
// move mode
m_cursorPos = _pos;
2013-10-16 21:55:45 +02:00
m_cursorSelectPos = -1;
}
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<m_data.size();
_endPos+=bufferElementSize) {
bufferElementSize = get(_endPos, currentValue);
if ( currentValue != etk::UniChar::Tabulation
&& currentValue != etk::UniChar::Space) {
break;
}
}
return true;
} else if( false == currentValue.isSpecialChar()){
APPL_DEBUG("select normal Char");
// Search back
for (_beginPos=_startPos;
_beginPos>=0;
previousElementSize = bufferElementSize,
_beginPos-=bufferElementSize) {
bufferElementSize = getBack(_beginPos, currentValue);
if ( currentValue != '_'
&& true == currentValue.isSpecialChar()) {
_beginPos += previousElementSize;
break;
}
}
// Search forward
for (_endPos=_startPos;
_endPos<m_data.size();
_endPos+=bufferElementSize) {
bufferElementSize = get(_endPos, currentValue);
if ( currentValue != '_'
&& true == currentValue.isSpecialChar()) {
break;
}
}
return true;
} else {
etk::UniChar comparechar = currentValue;
APPL_DEBUG("select same char");
// Search back
for (_beginPos=_startPos;
_beginPos>=0;
previousElementSize = bufferElementSize,
_beginPos-=bufferElementSize) {
bufferElementSize = getBack(_beginPos, currentValue);
if (comparechar != currentValue) {
_beginPos += previousElementSize;
break;
}
}
// Search forward
for (_endPos=_startPos;
_endPos<m_data.size();
_endPos+=bufferElementSize) {
bufferElementSize = get(_endPos, currentValue);
if (comparechar != currentValue) {
break;
}
}
return true;
}
_beginPos = 0;
_endPos = 0;
return false;
}
void appl::Buffer::mouseEventDouble(void) {
//m_selectMode = false;
esize_t beginPos, endPos;
if (true == selectAround(m_cursorPos, beginPos, endPos)) {
moveCursor(endPos);
m_cursorSelectPos = beginPos;
}
// TODO : copy(ewol::clipBoard::clipboardSelection);
}
void appl::Buffer::mouseEventTriple(void) {
//m_selectMode = false;
moveCursor(endLine(m_cursorPos));
m_cursorSelectPos = startLine(m_cursorPos);
// TODO : copy(ewol::clipBoard::clipboardSelection);
}
// TODO : Rename ...
esize_t appl::Buffer::getPosSize(esize_t _startLinePos, float _distance, ewol::Text& _textDrawer)
2013-10-16 21:55:45 +02:00
{
esize_t bufferElementSize;
etk::UniChar currentValue;
esize_t countColomn = 0;
etk::UString stringToDisplay;
_textDrawer.clear();
_textDrawer.forceLineReturn();
esize_t previousElementPos = 0;
for (esize_t iii=_startLinePos;
iii<m_data.size();
previousElementPos=iii, iii+=bufferElementSize) {
bufferElementSize = get(iii, currentValue);
if (bufferElementSize == 0) {
bufferElementSize = 1;
}
expand(countColomn, currentValue, stringToDisplay);
//APPL_DEBUG("display : '" << currentValue << "' == > '" << stringToDisplay << "'");
//m_displayText.setPos(positionCurentDisplay);
for (esize_t kkk=0; kkk<stringToDisplay.size(); ++kkk) {
if (stringToDisplay[kkk] == etk::UniChar::Return) {
return iii;
} else {
_textDrawer.print(stringToDisplay[kkk]);
}
}
if (_textDrawer.getPos().x() >= _distance) {
return iii;
}
countColomn += stringToDisplay.size();
}
return m_data.size();
2013-10-16 21:55:45 +02:00
}
// TODO : Rename ...
float appl::Buffer::getScreenSize(esize_t _startLinePos, esize_t _stopPos, ewol::Text& _textDrawer)
2013-10-16 21:55:45 +02:00
{
float ret = 0;
esize_t bufferElementSize;
etk::UniChar currentValue;
esize_t countColomn = 0;
etk::UString stringToDisplay;
_textDrawer.clear();
esize_t previousElementPos = 0;
2013-10-16 21:55:45 +02:00
APPL_DEBUG("search in " << _startLinePos << " " << _stopPos);
for (esize_t iii=_startLinePos;
iii<m_data.size() && iii<=_stopPos;
previousElementPos=iii, iii+=bufferElementSize) {
bufferElementSize = get(iii, currentValue);
if (bufferElementSize == 0) {
bufferElementSize = 1;
}
APPL_DEBUG("parse : " << currentValue);
expand(countColomn, currentValue, stringToDisplay);
//APPL_DEBUG("display : '" << currentValue << "' == > '" << stringToDisplay << "'");
//m_displayText.setPos(positionCurentDisplay);
for (esize_t kkk=0; kkk<stringToDisplay.size(); ++kkk) {
if (stringToDisplay[kkk] == etk::UniChar::Return) {
APPL_DEBUG("find \n");
return _textDrawer.getPos().x() + 2; // TODO : Add the +2 for the end of line ...
} else {
_textDrawer.print(stringToDisplay[kkk]);
}
}
ret = _textDrawer.getPos().x();
countColomn += stringToDisplay.size();
}
APPL_DEBUG("end of buffer");
return ret;
2013-10-16 21:55:45 +02:00
}
// TODO : Rename && rework ...
2013-10-16 21:55:45 +02:00
esize_t appl::Buffer::getMousePosition(const vec2& _relativePos, ewol::Text& _textDrawer)
{
esize_t bufferElementSize;
etk::UniChar currentValue;
vec3 tmpLetterSize = _textDrawer.calculateSize((etk::UniChar)'A');
vec3 positionCurentDisplay(0,0,0);
esize_t countColomn = 0;
etk::UString stringToDisplay;
_textDrawer.clear();
_textDrawer.forceLineReturn();
esize_t previousElementPos = 0;
for (esize_t iii=0; iii<m_data.size(); previousElementPos=iii, iii+=bufferElementSize) {
bufferElementSize = get(iii, currentValue);
if (bufferElementSize == 0) {
bufferElementSize = 1;
}
expand(countColomn, currentValue, stringToDisplay);
//APPL_DEBUG("display : '" << currentValue << "' == > '" << stringToDisplay << "'");
//m_displayText.setPos(positionCurentDisplay);
for (esize_t kkk=0; kkk<stringToDisplay.size(); ++kkk) {
if (stringToDisplay[kkk] == etk::UniChar::Return) {
// TODO : Remove this, use the automatic line manager ...
_textDrawer.forceLineReturn();
countColomn = 0;
} else {
_textDrawer.print(stringToDisplay[kkk]);
}
}
if (-_relativePos.y() >= positionCurentDisplay.y()) {
if (-_relativePos.y() < positionCurentDisplay.y()+tmpLetterSize.y()) {
//APPL_DEBUG("line position : " << _textDrawer.getPos() << " " << positionCurentDisplay );
if ( _relativePos.x() >= positionCurentDisplay.x()
&& _relativePos.x() < _textDrawer.getPos().x() ) {
return iii;
}
} else {
return previousElementPos;
}
}
positionCurentDisplay = _textDrawer.getPos();
countColomn += stringToDisplay.size();
}
return m_data.size();
}
2013-10-09 22:00:24 +02:00
esize_t appl::Buffer::get(esize_t _pos, etk::UniChar& _value, unicode::charset_te _charset) const {
_value = '\0';
2013-10-07 22:04:21 +02:00
if (_pos<0 && _pos<m_data.size()) {
2013-09-27 23:02:30 +02:00
return 0;
}
if (_charset == unicode::EDN_CHARSET_UTF8) {
char tmpVal[5];
2013-09-27 23:02:30 +02:00
memset(tmpVal, 0, sizeof(tmpVal));
tmpVal[0] = m_data[_pos];
2013-10-09 22:00:24 +02:00
int8_t nbChar = etk::UniChar::theoricUTF8Len(tmpVal[0]);
2013-10-07 22:04:21 +02:00
for (int32_t iii=1; iii<nbChar && _pos+iii<m_data.size(); ++iii) {
2013-09-27 23:02:30 +02:00
tmpVal[iii] = m_data[_pos+iii];
}
// transform ...
2013-10-07 22:04:21 +02:00
int32_t nbElement = _value.setUtf8(tmpVal);
return nbElement;
}
2013-10-07 22:04:21 +02:00
// TODO :: need to trancode iso == > UNICODE ...
_value.set(m_data[_pos]);
return 1;
}
2013-09-27 23:02:30 +02:00
2013-10-09 22:00:24 +02:00
esize_t appl::Buffer::getBack(esize_t _pos, etk::UniChar& _value, unicode::charset_te _charset) const {
2013-09-27 23:02:30 +02:00
_value = '\0';
2013-10-07 22:04:21 +02:00
if (_pos<0 && _pos<m_data.size()) {
2013-09-27 23:02:30 +02:00
return 0;
}
if (_charset == unicode::EDN_CHARSET_UTF8) {
char tmpVal[5];
char* pointerVal = &tmpVal[4];
memset(tmpVal, 0, sizeof(tmpVal));
*pointerVal = m_data[_pos];
int32_t iii=0;
2013-10-09 22:00:24 +02:00
while( etk::UniChar::theoricUTF8First(*pointerVal) == false
2013-09-27 23:02:30 +02:00
&& pointerVal > tmpVal
&& _pos-iii>0) {
--pointerVal;
++iii;
*pointerVal = m_data[_pos - iii];
};
2013-10-07 22:04:21 +02:00
int32_t nbElement = _value.setUtf8(pointerVal);
2013-09-27 23:02:30 +02:00
return nbElement;
}
2013-10-07 22:04:21 +02:00
_value.set(m_data[_pos]);
2013-09-27 23:02:30 +02:00
return 1;
}
static const char *ControlCodeTable[32] = {
"NUL", "soh", "stx", "etx", "eot", "enq", "ack", "bel", "bs", "ht", "nl", "vt", "np", "cr", "so", "si",
"dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb", "can", "em", "sub", "esc", "fs", "gs", "rs", "us"};
2013-10-09 22:00:24 +02:00
void appl::Buffer::expand(esize_t& _indent, const etk::UniChar& _value, etk::UString& _out) const {
2013-10-07 22:04:21 +02:00
_out.clear();
int32_t tabDist = 4;
if (_value == etk::UniChar::Tabulation) {
int32_t nSpaces = tabDist - (_indent % tabDist);
for (int32_t iii=0; iii<nSpaces; iii++) {
2013-10-07 22:04:21 +02:00
_out.append(etk::UniChar::Space);
}
return;
}
2013-10-07 22:04:21 +02:00
// convert ASCII control codes to readable character sequences
if (_value == etk::UniChar::Null) {
2013-10-07 22:04:21 +02:00
_out.append(etk::UniChar('<'));
_out.append(etk::UniChar('n'));
_out.append(etk::UniChar('u'));
_out.append(etk::UniChar('l'));
_out.append(etk::UniChar('>'));
return;
}
if (_value == etk::UniChar::Return) {
// nothing to display...
2013-10-16 21:55:45 +02:00
_out.append(etk::UniChar::Return);
return;
}
2013-10-07 22:04:21 +02:00
if (_value.get() <= 31) {
_out.append(etk::UniChar('<'));
const char * tmp = ControlCodeTable[_value.get()];
while (*tmp!='\0') {
2013-10-07 22:04:21 +02:00
_out.append(etk::UniChar(*tmp));
tmp++;
}
2013-10-07 22:04:21 +02:00
_out.append(etk::UniChar('>'));
return;
}
if (_value == etk::UniChar::Delete) {
2013-10-07 22:04:21 +02:00
_out.append(etk::UniChar('<'));
_out.append(etk::UniChar('d'));
_out.append(etk::UniChar('e'));
_out.append(etk::UniChar('l'));
_out.append(etk::UniChar('>'));
return;
}
// nothing to do ...
2013-10-07 22:04:21 +02:00
_out.append(_value);
//APPL_DEBUG("plop : " << _out);
}
// TODO : No more used !!!
2013-10-09 22:00:24 +02:00
int32_t appl::Buffer::countDispChars(esize_t _posStart, esize_t _posEnd) {
int32_t charCount = 0;
etk::UString expanded;
esize_t bufferElementSize;
etk::UniChar value;
//APPL_DEBUG("_posStart="<< _posStart << " _posEnd=" << _posEnd);
2013-10-07 22:04:21 +02:00
for(int32_t iii=_posStart; iii<_posEnd && iii<m_data.size() ; iii+=bufferElementSize ) {
// get the element value:
2013-10-07 22:04:21 +02:00
bufferElementSize = get(iii, value);
//APPL_DEBUG(" get : " << value << " size=" << bufferElementSize);
2013-10-09 22:00:24 +02:00
expand(charCount, value, expanded);
2013-10-07 22:04:21 +02:00
charCount += expanded.size();
if (bufferElementSize <= 0) {
bufferElementSize = 1;
}
}
//APPL_DEBUG(" result=" << charCount);
return charCount;
}
// TODO : No more used !!!
2013-10-09 22:00:24 +02:00
esize_t appl::Buffer::countForwardDispChars(esize_t _posStart, int32_t _nChars) {
int32_t charCount = 0;
etk::UString expanded;
esize_t bufferElementSize;
etk::UniChar value;
int32_t iii;
2013-10-07 22:04:21 +02:00
for(iii = _posStart; charCount<_nChars && iii<m_data.size() ; iii+=bufferElementSize ) {
// get the element value:
2013-10-07 22:04:21 +02:00
bufferElementSize = get(iii, value);
if (value == etk::UniChar::Return) {
return iii;
}
2013-10-09 22:00:24 +02:00
expand(charCount, value, expanded);
2013-10-07 22:04:21 +02:00
charCount += expanded.size();
if (bufferElementSize <= 0) {
bufferElementSize = 1;
}
}
//APPL_DEBUG(" result=" << charCount);
return iii;
}
2013-09-27 23:02:30 +02:00
2013-10-09 22:00:24 +02:00
esize_t appl::Buffer::countForwardNLines(esize_t _startPos, int32_t _nLines) {
if (_nLines <= 0) {
return _startPos;
2013-10-07 22:04:21 +02:00
} else if (_startPos > m_data.size() ) {
return m_data.size();
}
esize_t bufferElementSize;
etk::UniChar value;
int32_t lineCount = 0;
//APPL_INFO("startPos=" << startPos << " nLines=" << nLines);
2013-10-07 22:04:21 +02:00
for(int32_t iii = _startPos+1; iii<m_data.size() ; iii+=bufferElementSize ) {
// get the element value:
2013-10-07 22:04:21 +02:00
bufferElementSize = get(iii, value);
if (value == etk::UniChar::Return) {
lineCount++;
if (lineCount == _nLines) {
2013-10-07 22:04:21 +02:00
//APPL_INFO(" == > (1) at position=" << myPosIt.Position()+1 );
return iii+1;
}
}
2013-10-07 22:04:21 +02:00
if (bufferElementSize <= 0) {
bufferElementSize = 1;
}
}
2013-10-07 22:04:21 +02:00
//APPL_INFO(" == > (2) at position=" << myPosIt.Position() );
return m_data.size();
}
2013-09-27 23:02:30 +02:00
2013-10-09 22:00:24 +02:00
esize_t appl::Buffer::countBackwardNLines(esize_t _startPos, int32_t _nLines) {
if (_startPos <= 0) {
return 0;
2013-10-07 22:04:21 +02:00
} else if (_startPos > m_data.size() ) {
_startPos = m_data.size();
}
//APPL_INFO("startPos=" << startPos << " nLines=" << nLines);
esize_t bufferElementSize;
etk::UniChar value;
int32_t lineCount = 0;
2013-10-07 22:04:21 +02:00
for(int32_t iii = _startPos-1; iii >= 0 ; iii-=bufferElementSize ) {
// get the element value:
2013-10-07 22:04:21 +02:00
bufferElementSize = getBack(iii, value);
if (value == etk::UniChar::Return) {
lineCount++;
if (lineCount >= _nLines) {
2013-10-07 22:04:21 +02:00
//APPL_INFO(" == > (1) at position=" << myPosIt.Position()+1 );
return iii+1;
}
}
2013-10-07 22:04:21 +02:00
if (bufferElementSize <= 0) {
bufferElementSize = 1;
}
}
2013-10-07 22:04:21 +02:00
//APPL_INFO(" == > (2) at position=0");
return 0;
}
bool appl::Buffer::copy(etk::UString& _data) {
_data.clear();
if (hasTextSelected() == true) {
esize_t startPos = getStartSelectionPos();
esize_t endPos = getStopSelectionPos();
esize_t bufferElementSize;
etk::UniChar value;
for(int32_t iii = startPos; iii < endPos ; iii+=bufferElementSize ) {
// get the element value:
bufferElementSize = get(iii, value);
_data += value;
if (bufferElementSize <= 0) {
bufferElementSize = 1;
}
}
return true;
}
return false;
}
bool appl::Buffer::paste(const etk::UString& _data) {
etk::Char output = _data.c_str();
if (hasTextSelected() == true) {
esize_t startPos = getStartSelectionPos();
esize_t endPos = getStopSelectionPos();
m_data.replace(m_cursorPos, endPos-startPos, (int8_t*)((void*)output), output.size());
} else {
m_data.insert(m_cursorPos, (int8_t*)((void*)output), output.size());
}
m_selectMode = false;
moveCursor(m_cursorPos+output.size());
return false;
}
void appl::Buffer::removeSelection(void) {
if (hasTextSelected() == true) {
esize_t startPos = getStartSelectionPos();
esize_t endPos = getStopSelectionPos();
m_data.remove(startPos, endPos-startPos);
m_selectMode = false;
moveCursor(startPos);
}
}