425 lines
14 KiB
C++
425 lines
14 KiB
C++
/**
|
|
* @author Edouard DUPIN
|
|
*
|
|
* @copyright 2010, Edouard DUPIN, all right reserved
|
|
*
|
|
* @license GPL v3 (see license file)
|
|
*/
|
|
|
|
#ifndef __APPL_TEXT_VIEWER_H__
|
|
#define __APPL_TEXT_VIEWER_H__
|
|
|
|
#include <appl/debug.h>
|
|
#include <appl/Buffer.h>
|
|
#include <appl/globalMsg.h>
|
|
|
|
#include <ewol/widget/WidgetScrolled.h>
|
|
#include <ewol/compositing/Text.h>
|
|
#include <ewol/compositing/TextDF.h>
|
|
#include <ewol/compositing/Drawing.h>
|
|
#include <appl/BufferManager.h>
|
|
#include <appl/Gui/ViewerManager.h>
|
|
#include <utility>
|
|
|
|
namespace appl {
|
|
class textPluginManager;
|
|
class TextViewer : public ewol::widget::WidgetScrolled {
|
|
private:
|
|
std::shared_ptr<appl::GlyphPainting> m_paintingProperties; //!< element painting property
|
|
int32_t m_colorBackground;
|
|
int32_t m_colorSpace;
|
|
int32_t m_colorTabulation;
|
|
int32_t m_colorCursor;
|
|
int32_t m_colorLineNumber;
|
|
int32_t m_colorSelection;
|
|
int32_t m_colorNormal;
|
|
private:
|
|
std::shared_ptr<appl::BufferManager> m_bufferManager; //!< handle on the buffer manager
|
|
std::shared_ptr<appl::textPluginManager> m_pluginManager; //!< Plugin manager interface
|
|
std::shared_ptr<appl::ViewerManager> m_viewerManager; //!< handle on the buffer manager
|
|
protected:
|
|
TextViewer();
|
|
void init(const std::string& _fontName="", int32_t _fontSize=-1);
|
|
public:
|
|
DECLARE_FACTORY(TextViewer);
|
|
virtual ~TextViewer();
|
|
private:
|
|
std::shared_ptr<appl::Buffer> m_buffer; //!< pointer on the current buffer to display (can be null if the buffer is remover or in state of changing buffer)
|
|
public:
|
|
/**
|
|
* @brief Get the buffer property (only for the class : template <typename TYPE> class TextViewerPluginData)
|
|
* @return pointer on buffer
|
|
*/
|
|
std::shared_ptr<appl::Buffer> internalGetBuffer() {
|
|
return m_buffer;
|
|
}
|
|
private:
|
|
ewol::compositing::Text m_displayText; //!< Text display properties.
|
|
ewol::compositing::Drawing m_displayDrawing; //!< Other diaplay requested.
|
|
std::vector<std::pair<std::weak_ptr<appl::Buffer>, vec2>> m_drawingRemenber;
|
|
public:
|
|
void setFontSize(int32_t _size);
|
|
void setFontName(const std::string& _fontName);
|
|
protected: // derived function
|
|
virtual void onDraw();
|
|
public: // Derived function
|
|
virtual bool calculateMinSize();
|
|
virtual void onRegenerateDisplay();
|
|
virtual bool onEventInput(const ewol::event::Input& _event);
|
|
virtual bool onEventEntry(const ewol::event::Entry& _event);
|
|
virtual void onEventClipboard(enum ewol::context::clipBoard::clipboardListe _clipboardID);
|
|
virtual void onGetFocus();
|
|
virtual void onLostFocus();
|
|
virtual void changeZoom(float _range);
|
|
private:
|
|
float m_lastOffsetDisplay; //!< Line number ofssed in the display
|
|
private:
|
|
bool m_insertMode; //!< the insert mode is enable
|
|
public:
|
|
/**
|
|
* @brief Update the scrolling position from the cursor position,
|
|
* it might be be all time in the display screen.
|
|
*/
|
|
void updateScrolling();
|
|
// TODO : Doc : write data on buffer
|
|
bool moveCursor(const appl::Buffer::Iterator& _pos);
|
|
bool write(const std::string& _data);
|
|
bool write(const std::string& _data, const appl::Buffer::Iterator& _pos);
|
|
bool replace(const std::string& _data, const appl::Buffer::Iterator& _pos, const appl::Buffer::Iterator& _posEnd);
|
|
bool replace(const std::string& _data);
|
|
bool replace(const std::u32string& _data) {
|
|
return replace(etk::to_string(_data));
|
|
}
|
|
/**
|
|
* @brief Remove selected data ...
|
|
*/
|
|
void remove();
|
|
/**
|
|
* @brief Remove selected data ... (No plugin call)
|
|
*/
|
|
void removeDirect() {
|
|
if (m_buffer==nullptr) {
|
|
return;
|
|
}
|
|
m_buffer->removeSelection();
|
|
updateScrolling();
|
|
}
|
|
|
|
/**
|
|
* @brief copy data in the _data ref value.
|
|
* @param[out] _data Output stream to copy.
|
|
* @return true of no error occured.
|
|
*/
|
|
bool copy(std::string& _data) {
|
|
if (m_buffer==nullptr) {
|
|
return false;
|
|
}
|
|
return m_buffer->copy(_data);
|
|
}
|
|
/**
|
|
* @brief copy data in the _data ref value.
|
|
* @param[out] _data Output stream to copy.
|
|
* @param[in] _pos Position to add the data.
|
|
* @param[in] _posEnd End position to end replace the data.
|
|
*/
|
|
void copy(std::string& _data, const appl::Buffer::Iterator& _pos, const appl::Buffer::Iterator& _posEnd) {
|
|
if (m_buffer==nullptr) {
|
|
return;
|
|
}
|
|
m_buffer->copy(_data, _pos, _posEnd);
|
|
}
|
|
/**
|
|
* @brief Write data at a specific position (No plugin call)
|
|
* @param[in] _data Data to insert in the buffer
|
|
* @param[in] _pos Position to add the data.
|
|
* @return true if the write is done corectly
|
|
*/
|
|
bool writeDirect(const std::string& _data, const appl::Buffer::Iterator& _pos) {
|
|
if (m_buffer==nullptr) {
|
|
return false;
|
|
}
|
|
bool ret = m_buffer->write(_data, _pos);
|
|
updateScrolling();
|
|
return ret;
|
|
}
|
|
/**
|
|
* @brief Write data at a specific position (No plugin call)
|
|
* @param[in] _data Data to insert in the buffer
|
|
* @param[in] _pos Position to add the data.
|
|
* @param[in] _posEnd End position to end replace the data.
|
|
* @return true if the write is done corectly
|
|
*/
|
|
bool replaceDirect(const std::string& _data, const appl::Buffer::Iterator& _pos, const appl::Buffer::Iterator& _posEnd) {
|
|
if (m_buffer==nullptr) {
|
|
return false;
|
|
}
|
|
bool ret = m_buffer->replace(_data, _pos, _posEnd);
|
|
updateScrolling();
|
|
return ret;
|
|
}
|
|
|
|
appl::Buffer::Iterator getMousePosition(const vec2& _relativePos);
|
|
void mouseEventDouble();
|
|
void mouseEventTriple();
|
|
private:
|
|
enum moveMode {
|
|
moveLetter,
|
|
moveWord,
|
|
moveEnd
|
|
};
|
|
/**
|
|
* Move the cursor right in the line (no stop of a new line)
|
|
* @param[in] _mode Moving mode char, word, ...
|
|
*/
|
|
void moveCursorRight(moveMode _mode = moveLetter);
|
|
/**
|
|
* Move the cursor left in the line (no stop of a new line)
|
|
* @param[in] _mode Moving mode char, word, ...
|
|
*/
|
|
void moveCursorLeft(moveMode _mode = moveLetter);
|
|
/**
|
|
* @brief Move the cursor at an other position upper.
|
|
* @param[in] _nbLine number of up line that might be moved
|
|
*/
|
|
void moveCursorUp(uint32_t _nbLine);
|
|
/**
|
|
* @brief Move the cursor at an other position under.
|
|
* @param[in] _nbLine number of down line that might be moved
|
|
*/
|
|
void moveCursorDown(uint32_t _nbLine);
|
|
|
|
appl::Buffer::Iterator getPosSize(const appl::Buffer::Iterator& _startLinePos, float _distance);
|
|
float getScreenSize(const appl::Buffer::Iterator& _startLinePos, const appl::Buffer::Iterator& _stopPos);
|
|
private:
|
|
/**
|
|
* @brief Set the current buffer selected
|
|
*/
|
|
void setCurrentSelect();
|
|
/**
|
|
* @brief Check if the current buffer is last selected
|
|
* @return true if selected last
|
|
*/
|
|
bool isSelectedLast();
|
|
public:
|
|
/**
|
|
* @brief get the path of the current buffer
|
|
* @return Path of the buffer (remove the ended name)
|
|
*/
|
|
virtual std::string getBufferPath();
|
|
/**
|
|
* @brief Check if the buffer is availlable
|
|
* @return true if a display buffer is present, false otherwise.
|
|
*/
|
|
virtual bool hasBuffer() {
|
|
return m_buffer != nullptr;
|
|
}
|
|
/**
|
|
* @brief Get the status of selection.
|
|
* @return true if we have a current selection, false otherwise.
|
|
*/
|
|
virtual bool hasTextSelected() {
|
|
if (m_buffer==nullptr) {
|
|
return false;
|
|
}
|
|
return m_buffer->hasTextSelected();
|
|
}
|
|
/**
|
|
* @brief Remove Selection of the buffer.
|
|
*/
|
|
virtual void unSelect() {
|
|
if (m_buffer==nullptr) {
|
|
return;
|
|
}
|
|
m_buffer->unSelect();
|
|
}
|
|
/**
|
|
* @brief Select a section of text.
|
|
* @param[in] _start Start position of the selection
|
|
* @param[in] _stop Stop position of the selection (the curor is set at this position)
|
|
*/
|
|
virtual void select(const appl::Buffer::Iterator& _start, const appl::Buffer::Iterator& _stop) {
|
|
if (m_buffer==nullptr) {
|
|
return;
|
|
}
|
|
moveCursor(_stop);
|
|
m_buffer->setSelectionPos(_start);
|
|
}
|
|
/**
|
|
* @brief Find a string in the buffer.
|
|
* @param[in] _pos Position to start the search of the element.
|
|
* @param[in] _search String to search.
|
|
* @param[out] _resultStart Find element start position.
|
|
* @param[out] _resultStop Find element end position.
|
|
* @param[in] _caseSensitive (optional) Search making attention of the case [default true]
|
|
* @return true if pos if fined.
|
|
*/
|
|
virtual bool find(const appl::Buffer::Iterator& _pos,
|
|
const std::u32string& _search,
|
|
appl::Buffer::Iterator& _resultStart,
|
|
appl::Buffer::Iterator& _resultStop,
|
|
bool _caseSensitive = true) {
|
|
if (m_buffer==nullptr) {
|
|
return false;
|
|
}
|
|
bool ret = m_buffer->search(_pos, _search, _resultStart, _caseSensitive);
|
|
if (ret == true) {
|
|
_resultStop = _resultStart + _search.size();
|
|
}
|
|
return ret;
|
|
}
|
|
/**
|
|
* @brief revers find a string in the buffer.
|
|
* @param[in] _pos Position to start the search of the element.
|
|
* @param[in] _search String to search.
|
|
* @param[out] _resultStart Find element start position.
|
|
* @param[out] _resultStop Find element end position.
|
|
* @param[in] _caseSensitive (optional) Search making attention of the case [default true]
|
|
* @return true if pos if fined.
|
|
*/
|
|
virtual bool rfind(const appl::Buffer::Iterator& _pos,
|
|
const std::u32string& _search,
|
|
appl::Buffer::Iterator& _resultStart,
|
|
appl::Buffer::Iterator& _resultStop,
|
|
bool _caseSensitive = true) {
|
|
if (m_buffer==nullptr) {
|
|
return false;
|
|
}
|
|
bool ret = m_buffer->searchBack(_pos, _search, _resultStart, _caseSensitive);
|
|
if (ret == true) {
|
|
_resultStop = _resultStart + _search.size();
|
|
}
|
|
return ret;
|
|
}
|
|
/**
|
|
* @brief Get the position of selection around (select word).
|
|
* @param[in] _pos Position to start the selection.
|
|
* @param[out] _beginPos Position where the element start.
|
|
* @param[out] _endPos Position where the element stop.
|
|
* @return true if we find a selection around.
|
|
*/
|
|
bool getPosAround(const appl::Buffer::Iterator& _pos,
|
|
appl::Buffer::Iterator &_beginPos,
|
|
appl::Buffer::Iterator &_endPos) {
|
|
if (m_buffer==nullptr) {
|
|
return false;
|
|
}
|
|
return m_buffer->getPosAround(_pos, _beginPos, _endPos);
|
|
}
|
|
/**
|
|
* @brief Get an iterator an an specific position
|
|
* @param[in] _pos Requested position of the iterator.
|
|
* @return The Iterator
|
|
*/
|
|
appl::Buffer::Iterator position(int64_t _pos) {
|
|
if (m_buffer==nullptr) {
|
|
return appl::Buffer::Iterator();
|
|
}
|
|
return m_buffer->position(_pos);
|
|
}
|
|
/**
|
|
* @brief Get the cursor position.
|
|
* @return The iterator on the cursor position
|
|
*/
|
|
appl::Buffer::Iterator cursor() {
|
|
if (m_buffer==nullptr) {
|
|
return appl::Buffer::Iterator();
|
|
}
|
|
return m_buffer->cursor();
|
|
}
|
|
/**
|
|
* @brief Get the begin position.
|
|
* @return The iterator on the begin position
|
|
*/
|
|
appl::Buffer::Iterator begin() {
|
|
if (m_buffer==nullptr) {
|
|
return appl::Buffer::Iterator();
|
|
}
|
|
return m_buffer->begin();
|
|
}
|
|
/**
|
|
* @brief Get the end position.
|
|
* @return The iterator on the end position
|
|
*/
|
|
appl::Buffer::Iterator end() {
|
|
if (m_buffer==nullptr) {
|
|
return appl::Buffer::Iterator();
|
|
}
|
|
return m_buffer->end();
|
|
}
|
|
/**
|
|
* @brief Get an Iterator on the start selection.
|
|
* @return The Iterator
|
|
*/
|
|
appl::Buffer::Iterator selectStart() {
|
|
if (m_buffer==nullptr) {
|
|
return appl::Buffer::Iterator();
|
|
}
|
|
return m_buffer->selectStart();
|
|
}
|
|
/**
|
|
* @brief Get an Iterator on the stop selection.
|
|
* @return The Iterator
|
|
*/
|
|
appl::Buffer::Iterator selectStop() {
|
|
if (m_buffer==nullptr) {
|
|
return appl::Buffer::Iterator();
|
|
}
|
|
return m_buffer->selectStop();
|
|
}
|
|
/**
|
|
* @brief get the start of a line with the position in the buffer.
|
|
* @param[in] _pos position in the buffer.
|
|
* @return The position in the buffer of the start of the line.
|
|
*/
|
|
appl::Buffer::Iterator getStartLine(const appl::Buffer::Iterator& _pos) {
|
|
if (m_buffer==nullptr) {
|
|
return appl::Buffer::Iterator();
|
|
}
|
|
return m_buffer->getStartLine(_pos);
|
|
}
|
|
/**
|
|
* @brief get the end of a line with the position in the buffer.
|
|
* @param[in] _pos position in the buffer.
|
|
* @return The position in the buffer of the end of the line.
|
|
*/
|
|
appl::Buffer::Iterator getEndLine(const appl::Buffer::Iterator& _pos) {
|
|
if (m_buffer==nullptr) {
|
|
return appl::Buffer::Iterator();
|
|
}
|
|
return m_buffer->getEndLine(_pos);
|
|
}
|
|
/**
|
|
* @brief Register of the arrival of a Multicast message
|
|
* @param[in] _messageId Event Id waiting for...
|
|
*/
|
|
// TODO : Remove
|
|
void ext_registerMultiCast(const char* const _messageId) {
|
|
//registerMultiCast(_messageId);
|
|
}
|
|
/**
|
|
* @brief add a specific shortcut with his description
|
|
* @param[in] _descriptiveString Description string of the shortcut
|
|
* @param[in] _generateEventName Event generic of the element
|
|
*/
|
|
virtual void ext_shortCutAdd(const std::string& _descriptiveString,
|
|
const std::string& _generateEventName) {
|
|
shortCutAdd(_descriptiveString, _generateEventName);
|
|
}
|
|
/**
|
|
* @brief Remove a specific shortcut with his event name
|
|
* @param[in] _generateEventName Event of the element shortcut
|
|
*/
|
|
virtual void ext_shortCutRm(const std::string& _generateEventName) {
|
|
shortCutRemove(_generateEventName);
|
|
}
|
|
private: // callback fundtions
|
|
void onCallbackIsModify();
|
|
void onCallbackShortCut(const std::string& _value);
|
|
void onCallbackSelectChange();
|
|
void onCallbackselectNewFile(const std::string& _value);
|
|
};
|
|
};
|
|
|
|
#endif
|
|
|