/** * @author Edouard DUPIN * * @copyright 2010, Edouard DUPIN, all right reserved * * @license GPL v3 (see license file) */ #include #include #include #include #include #include #include #include #include #include #undef __class__ #define __class__ "CodeView" void CodeView::init(void) { m_label = "CodeView is disable ..."; m_bufferID = -1; m_buttunOneSelected = false; m_lineNumberList.clear(); m_textColorFg = etk::color::black; m_textColorBg = etk::color::black; m_textColorBg.setA(0x40); setCanHaveFocus(true); RegisterMultiCast(ednMsgBufferId); RegisterMultiCast(ednMsgGuiCopy); RegisterMultiCast(ednMsgGuiPaste); RegisterMultiCast(ednMsgGuiCut); RegisterMultiCast(ednMsgGuiRedo); RegisterMultiCast(ednMsgGuiUndo); RegisterMultiCast(ednMsgGuiRm); RegisterMultiCast(ednMsgGuiSelect); RegisterMultiCast(ednMsgGuiChangeCharset); RegisterMultiCast(ednMsgGuiFind); RegisterMultiCast(ednMsgGuiReplace); RegisterMultiCast(ednMsgGuiGotoLine); setLimitScrolling(0.2); ShortCutAdd("ctrl+w", ednMsgGuiRm, "Line"); ShortCutAdd("ctrl+shift+w", ednMsgGuiRm, "Paragraph"); ShortCutAdd("ctrl+x", ednMsgGuiCut, "STD"); ShortCutAdd("ctrl+c", ednMsgGuiCopy, "STD"); ShortCutAdd("ctrl+v", ednMsgGuiPaste, "STD"); ShortCutAdd("ctrl+a", ednMsgGuiSelect, "ALL"); ShortCutAdd("ctrl+shift+a", ednMsgGuiSelect, "NONE"); } CodeView::CodeView(etk::UString fontName, int32_t fontSize) : m_displayText(fontName, fontSize) { init(); } CodeView::CodeView(void) { init(); } CodeView::~CodeView(void) { } /** * @brief Check if the number of reference buffer is good or not ... * @param[in] bufferID id of the current Buffer that needed to have a reference */ void CodeView::updateNumberOfLineReference(int32_t bufferID) { vec2 tmpCoord(0,0); if (m_lineNumberList.size() <= bufferID) { // update the number of elements : for (int32_t iii=m_lineNumberList.size(); iii <= bufferID; iii++) { // add start line at 0 : m_lineNumberList.pushBack(tmpCoord); } } } bool CodeView::calculateMinSize(void) { m_minSize.setValue(50,50); return true; } void CodeView::calculateMaxSize(void) { m_maxSize.setX(2048); int32_t letterHeight = m_displayText.calculateSize(etk::UChar('A')).y(); BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { m_maxSize.setY(tmpBuffer->getNumberOfLine() * letterHeight); } else { m_maxSize.setY(50); } } void CodeView::onDraw(void) { m_displayDrawing.draw(); m_displayText.draw(); WidgetScrooled::onDraw(); } void CodeView::onRegenerateDisplay(void) { if (true == needRedraw()) { int64_t startTime = ewol::getTime(); // For the scrooling windows calculateMaxSize(); m_displayDrawing.clear(); m_displayText.clear(); // reset the background : m_displayDrawing.setPos(vec3(-2048, -2048, 0)); m_displayDrawing.setColor(ColorizeManager::get(COLOR_CODE_BASIC_BG)); m_displayDrawing.rectangleWidth(vec3(4096, 4096, 0) ); BufferText* tmpBuffer = BufferManager::get(m_bufferID); if( NULL != tmpBuffer && true == tmpBuffer->needToUpdateDisplayPosition() ) { vec2 borderWidth = BufferManager::get(m_bufferID)->getBorderSize(); bool centerRequested = false; // TODO : set it back ... vec2 currentPosition = BufferManager::get(m_bufferID)->getPosition(999/*m_OObjectTextNormal.getFontID()*/, centerRequested); setScrollingPositionDynamic(borderWidth, currentPosition, centerRequested); } // else : nothing to do ... // generate the objects : if (-1 == m_bufferID) { m_displayText.setTextAlignement(10, m_size.x()-20, ewol::Text::alignLeft); m_displayDrawing.setColor(0x00000022); m_displayDrawing.setPos(vec3(10, 0, 0)); m_displayDrawing.rectangle(vec3((int32_t)m_size.x()-20, 1500, 0) ); m_displayText.setRelPos(vec3(10, 0, 0)); // nothing to display : etk::UString tmpString("
\n" "\n" " \n" " edn - Editeur De N'ours\n" " \n" "\n" "
\n" "
\n" "\n" " \n" " No Buffer Availlable to display\n" " \n" "\n"); m_displayText.setPos(vec3(0.0f, m_size.y(), 0.0f) ); m_displayText.forceLineReturn(); m_displayText.printDecorated(tmpString); } else { BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->display(m_displayText, m_originScrooled.x(), m_originScrooled.y(), m_size.x(), m_size.y()); } // set the current size of the windows setMaxSize(BufferManager::get(m_bufferID)->getMaxSize()); } int64_t stopTime = ewol::getTime(); APPL_DEBUG("Display Code Generation = " << stopTime - startTime << " micro-s"); // call the herited class... WidgetScrooled::onRegenerateDisplay(); } } bool CodeView::onEventEntry(const ewol::EventEntry& _event) { if (_event.getType() == ewol::keyEvent::keyboardChar) { //APPL_DEBUG("KB EVENT : \"" << UTF8_data << "\" size=" << strlen(UTF8_data) << "type=" << (int32_t)typeEvent); if (_event.getStatus() == ewol::keyEvent::statusDown) { BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->addChar(_event.getChar()); } markToRedraw(); } return true; } // move events ... if (_event.getStatus() == ewol::keyEvent::statusDown) { BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->cursorMove(_event.getType()); } markToRedraw(); } return true; } void CodeView::onEventClipboard(ewol::clipBoard::clipboardListe_te _clipboardID) { BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->Paste(_clipboardID); } markToRedraw(); } bool CodeView::onEventInput(const ewol::EventInput& _event) { vec2 relativePos = relativePosition(_event.getPos()); //APPL_DEBUG("Event at pos : " << _event.getPos() << " == > " << relativePos ); // corection for the openGl abstraction //relativePos.y = m_size.y - relativePos.y; vec2 limitedPos = relativePos; limitedPos.setValue(etk_avg(1, limitedPos.x(), m_size.x()-1), etk_avg(1, limitedPos.y(), m_size.y()-1)); if (true == WidgetScrooled::onEventInput(_event)) { keepFocus(); // nothing to do ... done on upper widget ... return true; } if (m_bufferID < 0) { return false; } if (1 == _event.getId()) { if (ewol::keyEvent::typeMouse == _event.getType()) { if (ewol::keyEvent::statusDown == _event.getStatus()) { m_buttunOneSelected = true; keepFocus(); // TODO : set something good BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->MouseEvent(limitedPos); } markToRedraw(); } else if (ewol::keyEvent::statusUp == _event.getStatus()) { m_buttunOneSelected = false; BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->Copy(ewol::clipBoard::clipboardSelection); } markToRedraw(); } } if (ewol::keyEvent::statusSingle == _event.getStatus()) { if (ewol::keyEvent::typeMouse == _event.getType()) { keepFocus(); BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->MouseEvent(limitedPos); } markToRedraw(); } else { // nothing to do ... } } else if (ewol::keyEvent::statusDouble == _event.getStatus()) { BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->MouseEventDouble(); } markToRedraw(); } else if (ewol::keyEvent::statusTriple == _event.getStatus()) { BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->MouseEventTriple(); } markToRedraw(); } else if (ewol::keyEvent::statusMove == _event.getStatus()) { if (true == m_buttunOneSelected) { int xxx, yyy; xxx = relativePos.x(); yyy = relativePos.y(); if (xxx<0) { xxx = 0; } if (yyy<0) { yyy = 0; } //APPL_INFO("mouse-motion BT1 %d, %d", xxx, yyy); // TODO : set something good BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->MouseSelectFromCursorTo(limitedPos); } markToRedraw(); } } } else if (2 == _event.getId()) { if (ewol::keyEvent::statusSingle == _event.getStatus()) { // TODO : set something good BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->MouseEvent(limitedPos); } ewol::clipBoard::Request(ewol::clipBoard::clipboardSelection); keepFocus(); } } return true; } void CodeView::onReceiveMessage(const ewol::EMessage& _msg) { widget::WidgetScrooled::onReceiveMessage(_msg); APPL_DEBUG("Extern Event : " << _msg.getCaller() << " type : " << _msg.GetMessage() << " data=\"" << _msg.GetData() << "\""); if(_msg.getMessage() == ednMsgBufferId) { //keep the reference of the display offset : if( m_bufferID >= 0 && m_bufferID < m_lineNumberList.size()) { m_lineNumberList[m_bufferID] = m_originScrooled; } int32_t bufferID = 0; sscanf(_msg.getData().c_str(), "%d", &bufferID); APPL_INFO("Select a new Buffer ... " << bufferID); // set the new buffer ID m_bufferID = bufferID; // update the start display position... updateNumberOfLineReference(m_bufferID); // set back if needed the display position ... if( m_bufferID >= 0 && m_bufferID < m_lineNumberList.size()) { m_originScrooled = m_lineNumberList[m_bufferID]; } } else if (_msg.getMessage() == ednMsgGuiCopy) { BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->Copy(ewol::clipBoard::clipboardStd); } } else if (_msg.getMessage() == ednMsgGuiCut) { BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->Cut(ewol::clipBoard::clipboardStd); } } else if (_msg.getMessage() == ednMsgGuiPaste) { ewol::clipBoard::Request(ewol::clipBoard::clipboardStd); } else if (_msg.getMessage() == ednMsgGuiUndo) { BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->Undo(); } } else if (_msg.getMessage() == ednMsgGuiRedo) { BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->Redo(); } } else if (_msg.getMessage() == ednMsgGuiRm) { // data : "Word" "Line" "Paragraph" if (_msg.getData() == "Word") { APPL_WARNING(" on event " << _msg.getMessage() << " data=\"" << _msg.GetData() << "\" == > not coded" ); } else if (_msg.getData() == "Line") { BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->removeLine(); } } else if (_msg.getData() == "Paragraph") { APPL_WARNING(" on event " << _msg.getMessage() << " data=\"" << _msg.GetData() << "\" == > not coded" ); } else { APPL_ERROR(" on event " << _msg.getMessage() << " unknow data=\"" << _msg.GetData() << "\"" ); } } else if (_msg.getMessage() == ednMsgGuiSelect) { // data : "ALL" "NONE" if (_msg.getData() == "ALL") { BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->SelectAll(); } } else if (_msg.getData() == "NONE") { BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->SelectNone(); } } else { APPL_ERROR(" on event " << _msg.getMessage() << " unknow data=\"" << _msg.GetData() << "\"" ); } } else if (_msg.getMessage() == ednMsgGuiChangeCharset) { // data : "UTF-8" "ISO-8859-1" "ISO-8859-15" if (_msg.getData() == "UTF-8") { BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->setCharset(unicode::EDN_CHARSET_UTF8); } } else if (_msg.getData() == "ISO-8859-1") { BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->setCharset(unicode::EDN_CHARSET_ISO_8859_1); } } else if (_msg.getData() == "ISO-8859-15") { BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->setCharset(unicode::EDN_CHARSET_ISO_8859_15); } } else { APPL_ERROR(" on event " << _msg.getMessage() << " unknow data=\"" << _msg.GetData() << "\"" ); } } else if (_msg.getMessage() == ednMsgGuiFind) { etk::UString myDataString; SearchData::getSearch(myDataString); if (_msg.getData() == "Next") { BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->Search(myDataString, false, SearchData::getCase(), SearchData::GetWrap(), SearchData::GetRegExp() ); } } else if (_msg.getData() == "Previous") { BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->Search(myDataString, true, SearchData::getCase(), SearchData::GetWrap(), SearchData::GetRegExp() ); } } } else if (_msg.getMessage() == ednMsgGuiReplace) { etk::UString myDataString; SearchData::getReplace(myDataString); if (_msg.getData() == "Normal") { BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->Replace(myDataString); } } else if (_msg.getData() == "All") { } } else if (_msg.getMessage() == ednMsgGuiGotoLine) { int32_t lineID = 0; sscanf(_msg.getData().c_str(), "%d", &lineID); APPL_INFO("Goto line : " << lineID); BufferText* tmpBuffer = BufferManager::get(m_bufferID); if (NULL!=tmpBuffer) { tmpBuffer->JumpAtLine(lineID); } } // force redraw of the widget markToRedraw(); } void CodeView::onGetFocus(void) { /* ewol::widgetMessageMultiCast::Send(getWidgetId(), ednMsgBufferId, m_bufferID); */ ShowKeyboard(); APPL_INFO("Focus - In"); } void CodeView::onLostFocus(void) { HideKeyboard(); APPL_INFO("Focus - out"); } void CodeView::setFontSize(int32_t size) { m_displayText.setFontSize(size); setScrollingSize(size*3.0*1.46); // 1.46 is a magic nmber ... } void CodeView::setFontName(etk::UString fontName) { m_displayText.setFontName(fontName); }