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) {
|
2013-10-17 21:57:31 +02:00
|
|
|
moveCursor(m_cursorPos + nbElement);
|
2013-09-27 23:02:30 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case moveWord:
|
|
|
|
// TODO : ...
|
|
|
|
break;
|
|
|
|
case moveEnd:
|
|
|
|
// TODO : ...
|
2013-10-17 22:23:11 +02:00
|
|
|
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) {
|
2013-10-17 21:57:31 +02:00
|
|
|
moveCursor(m_cursorPos - nbElement);
|
2013-09-27 23:02:30 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case moveWord:
|
|
|
|
// TODO : ...
|
|
|
|
break;
|
|
|
|
case moveEnd:
|
2013-10-17 22:23:11 +02:00
|
|
|
nbElement = startLine(m_cursorPos);
|
|
|
|
moveCursor(nbElement+1);
|
2013-09-27 23:02:30 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-10-17 21:57:31 +02:00
|
|
|
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) {
|
2013-10-17 21:57:31 +02:00
|
|
|
// TODO : Remove this +1 !!!
|
|
|
|
m_cursorPreferredCol = getScreenSize(lineStartPos+1, m_cursorPos, _textDrawer);
|
2013-09-27 23:02:30 +02:00
|
|
|
}
|
2013-09-30 00:08:52 +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
|
2013-10-17 21:57:31 +02:00
|
|
|
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);
|
2013-10-17 21:57:31 +02:00
|
|
|
float posStore = m_cursorPreferredCol;
|
|
|
|
moveCursor(newPos);
|
|
|
|
m_cursorPreferredCol = posStore;
|
2013-09-27 23:02:30 +02:00
|
|
|
}
|
|
|
|
|
2013-10-17 21:57:31 +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) {
|
2013-10-17 21:57:31 +02:00
|
|
|
// TODO : Remove this +1 !!!
|
|
|
|
m_cursorPreferredCol = getScreenSize(lineStartPos+1, m_cursorPos, _textDrawer);
|
2013-09-27 23:02:30 +02:00
|
|
|
}
|
2013-09-30 00:08:52 +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
|
2013-10-17 21:57:31 +02:00
|
|
|
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);
|
2013-10-17 21:57:31 +02:00
|
|
|
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 ) {
|
2013-10-17 22:23:11 +02:00
|
|
|
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) {
|
2013-09-30 00:08:52 +02:00
|
|
|
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) {
|
2013-09-30 00:08:52 +02:00
|
|
|
nbElementBuffer = 1;
|
|
|
|
}
|
2013-09-27 23:02:30 +02:00
|
|
|
}
|
|
|
|
_result = 0;
|
|
|
|
return false;
|
|
|
|
}
|
2013-10-17 22:23:11 +02:00
|
|
|
|
|
|
|
|
2013-10-09 22:00:24 +02:00
|
|
|
// TODO : vec2 _displaySize
|
|
|
|
bool appl::Buffer::onEventEntry(const ewol::EventEntry& _event, ewol::Text& _testDrawer) {
|
2013-09-30 00:08:52 +02:00
|
|
|
//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;
|
|
|
|
}
|
2013-10-17 22:23:11 +02:00
|
|
|
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);
|
2013-10-17 22:23:11 +02:00
|
|
|
if (hasTextSelected()) {
|
2013-10-18 21:01:11 +02:00
|
|
|
esize_t startPos = getStartSelectionPos();
|
|
|
|
esize_t endPos = getStopSelectionPos();
|
2013-10-17 22:23:11 +02:00
|
|
|
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
|
|
|
}
|
2013-10-17 22:23:11 +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);
|
2013-10-17 22:23:11 +02:00
|
|
|
if (hasTextSelected()) {
|
2013-10-18 21:01:11 +02:00
|
|
|
esize_t startPos = getStartSelectionPos();
|
|
|
|
esize_t endPos = getStopSelectionPos();
|
2013-10-17 22:23:11 +02:00
|
|
|
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
|
|
|
}
|
2013-10-17 22:23:11 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
m_selectMode = false;
|
|
|
|
// normal adding char ...
|
|
|
|
char output[5];
|
|
|
|
int32_t nbElement = localValue.getUtf8(output);
|
|
|
|
if (hasTextSelected()) {
|
2013-10-18 21:01:11 +02:00
|
|
|
esize_t startPos = getStartSelectionPos();
|
|
|
|
esize_t endPos = getStopSelectionPos();
|
2013-10-17 22:23:11 +02:00
|
|
|
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
|
|
|
}
|
2013-10-17 22:23:11 +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>");
|
2013-10-17 21:57:31 +02:00
|
|
|
moveCursorUp(1, _testDrawer);
|
2013-09-27 23:02:30 +02:00
|
|
|
break;
|
|
|
|
case ewol::keyEvent::keyboardDown:
|
|
|
|
//APPL_INFO("keyEvent : <DOWN>");
|
2013-10-17 21:57:31 +02:00
|
|
|
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-09-26 22:16:40 +02:00
|
|
|
|
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) {
|
2013-10-17 21:57:31 +02:00
|
|
|
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) {
|
2013-10-17 21:57:31 +02:00
|
|
|
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) {
|
2013-10-17 21:57:31 +02:00
|
|
|
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) {
|
2013-10-17 21:57:31 +02:00
|
|
|
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()) {
|
2013-10-17 21:57:31 +02:00
|
|
|
esize_t newPos = getMousePosition(_relativePos, _textDrawer);
|
|
|
|
moveCursor(newPos);
|
2013-10-16 21:55:45 +02:00
|
|
|
ewol::clipBoard::request(ewol::clipBoard::clipboardSelection);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2013-10-17 21:57:31 +02:00
|
|
|
void appl::Buffer::moveCursor(esize_t _pos) {
|
|
|
|
m_cursorPreferredCol = -1;
|
2013-10-16 21:55:45 +02:00
|
|
|
// selecting mode ...
|
2013-10-17 21:57:31 +02:00
|
|
|
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
|
2013-10-17 21:57:31 +02:00
|
|
|
m_cursorPos = _pos;
|
2013-10-16 21:55:45 +02:00
|
|
|
m_cursorSelectPos = -1;
|
|
|
|
}
|
|
|
|
|
2013-10-17 21:57:31 +02:00
|
|
|
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
|
|
|
{
|
2013-10-17 21:57:31 +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
|
|
|
}
|
|
|
|
|
2013-10-17 21:57:31 +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
|
|
|
{
|
2013-10-17 21:57:31 +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
|
|
|
|
2013-10-17 21:57:31 +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
|
|
|
}
|
|
|
|
|
2013-10-17 21:57:31 +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-09-26 22:16:40 +02:00
|
|
|
|
2013-10-09 22:00:24 +02:00
|
|
|
esize_t appl::Buffer::get(esize_t _pos, etk::UniChar& _value, unicode::charset_te _charset) const {
|
2013-09-26 22:16:40 +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;
|
|
|
|
}
|
2013-09-26 22:16:40 +02:00
|
|
|
if (_charset == unicode::EDN_CHARSET_UTF8) {
|
|
|
|
char tmpVal[5];
|
2013-09-27 23:02:30 +02:00
|
|
|
memset(tmpVal, 0, sizeof(tmpVal));
|
2013-09-26 22:16:40 +02:00
|
|
|
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];
|
|
|
|
}
|
2013-09-26 22:16:40 +02:00
|
|
|
// transform ...
|
2013-10-07 22:04:21 +02:00
|
|
|
int32_t nbElement = _value.setUtf8(tmpVal);
|
2013-09-26 22:16:40 +02:00
|
|
|
return nbElement;
|
|
|
|
}
|
2013-10-07 22:04:21 +02:00
|
|
|
// TODO :: need to trancode iso == > UNICODE ...
|
|
|
|
_value.set(m_data[_pos]);
|
2013-09-26 22:16:40 +02:00
|
|
|
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;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2013-09-30 00:08:52 +02:00
|
|
|
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();
|
2013-09-30 00:08:52 +02:00
|
|
|
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);
|
2013-09-30 00:08:52 +02:00
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
2013-10-07 22:04:21 +02:00
|
|
|
// convert ASCII control codes to readable character sequences
|
2013-09-30 00:08:52 +02:00
|
|
|
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('>'));
|
2013-09-30 00:08:52 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (_value == etk::UniChar::Return) {
|
|
|
|
// nothing to display...
|
2013-10-16 21:55:45 +02:00
|
|
|
_out.append(etk::UniChar::Return);
|
2013-09-30 00:08:52 +02:00
|
|
|
return;
|
|
|
|
}
|
2013-10-07 22:04:21 +02:00
|
|
|
if (_value.get() <= 31) {
|
|
|
|
_out.append(etk::UniChar('<'));
|
|
|
|
const char * tmp = ControlCodeTable[_value.get()];
|
2013-09-30 00:08:52 +02:00
|
|
|
while (*tmp!='\0') {
|
2013-10-07 22:04:21 +02:00
|
|
|
_out.append(etk::UniChar(*tmp));
|
2013-09-30 00:08:52 +02:00
|
|
|
tmp++;
|
|
|
|
}
|
2013-10-07 22:04:21 +02:00
|
|
|
_out.append(etk::UniChar('>'));
|
2013-09-30 00:08:52 +02:00
|
|
|
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('>'));
|
2013-09-30 00:08:52 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
// nothing to do ...
|
2013-10-07 22:04:21 +02:00
|
|
|
_out.append(_value);
|
2013-09-30 00:08:52 +02:00
|
|
|
//APPL_DEBUG("plop : " << _out);
|
|
|
|
}
|
|
|
|
|
2013-10-17 21:57:31 +02:00
|
|
|
// TODO : No more used !!!
|
2013-10-09 22:00:24 +02:00
|
|
|
int32_t appl::Buffer::countDispChars(esize_t _posStart, esize_t _posEnd) {
|
2013-09-30 00:08:52 +02:00
|
|
|
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 ) {
|
2013-09-30 00:08:52 +02:00
|
|
|
// get the element value:
|
2013-10-07 22:04:21 +02:00
|
|
|
bufferElementSize = get(iii, value);
|
2013-09-30 00:08:52 +02:00
|
|
|
//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) {
|
2013-09-30 00:08:52 +02:00
|
|
|
bufferElementSize = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//APPL_DEBUG(" result=" << charCount);
|
|
|
|
return charCount;
|
|
|
|
}
|
|
|
|
|
2013-10-17 21:57:31 +02:00
|
|
|
// TODO : No more used !!!
|
2013-10-09 22:00:24 +02:00
|
|
|
esize_t appl::Buffer::countForwardDispChars(esize_t _posStart, int32_t _nChars) {
|
2013-09-30 00:08:52 +02:00
|
|
|
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 ) {
|
2013-09-30 00:08:52 +02:00
|
|
|
// get the element value:
|
2013-10-07 22:04:21 +02:00
|
|
|
bufferElementSize = get(iii, value);
|
2013-09-30 00:08:52 +02:00
|
|
|
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) {
|
2013-09-30 00:08:52 +02:00
|
|
|
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) {
|
2013-09-30 00:08:52 +02:00
|
|
|
if (_nLines <= 0) {
|
|
|
|
return _startPos;
|
2013-10-07 22:04:21 +02:00
|
|
|
} else if (_startPos > m_data.size() ) {
|
|
|
|
return m_data.size();
|
2013-09-30 00:08:52 +02:00
|
|
|
}
|
|
|
|
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 ) {
|
2013-09-30 00:08:52 +02:00
|
|
|
// get the element value:
|
2013-10-07 22:04:21 +02:00
|
|
|
bufferElementSize = get(iii, value);
|
2013-09-30 00:08:52 +02:00
|
|
|
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 );
|
2013-09-30 00:08:52 +02:00
|
|
|
return iii+1;
|
|
|
|
}
|
|
|
|
}
|
2013-10-07 22:04:21 +02:00
|
|
|
if (bufferElementSize <= 0) {
|
2013-09-30 00:08:52 +02:00
|
|
|
bufferElementSize = 1;
|
|
|
|
}
|
|
|
|
}
|
2013-10-07 22:04:21 +02:00
|
|
|
//APPL_INFO(" == > (2) at position=" << myPosIt.Position() );
|
|
|
|
return m_data.size();
|
2013-09-30 00:08:52 +02:00
|
|
|
}
|
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) {
|
2013-09-30 00:08:52 +02:00
|
|
|
if (_startPos <= 0) {
|
|
|
|
return 0;
|
2013-10-07 22:04:21 +02:00
|
|
|
} else if (_startPos > m_data.size() ) {
|
|
|
|
_startPos = m_data.size();
|
2013-09-30 00:08:52 +02:00
|
|
|
}
|
|
|
|
//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 ) {
|
2013-09-30 00:08:52 +02:00
|
|
|
// get the element value:
|
2013-10-07 22:04:21 +02:00
|
|
|
bufferElementSize = getBack(iii, value);
|
2013-09-30 00:08:52 +02:00
|
|
|
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 );
|
2013-09-30 00:08:52 +02:00
|
|
|
return iii+1;
|
|
|
|
}
|
|
|
|
}
|
2013-10-07 22:04:21 +02:00
|
|
|
if (bufferElementSize <= 0) {
|
2013-09-30 00:08:52 +02:00
|
|
|
bufferElementSize = 1;
|
|
|
|
}
|
|
|
|
}
|
2013-10-07 22:04:21 +02:00
|
|
|
//APPL_INFO(" == > (2) at position=0");
|
2013-09-30 00:08:52 +02:00
|
|
|
return 0;
|
|
|
|
}
|
2013-10-18 21:01:11 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|