From 745ca76a742ca860074b7113e365ea5795a13a45 Mon Sep 17 00:00:00 2001 From: Edouard Dupin Date: Mon, 12 Sep 2011 16:43:13 +0200 Subject: [PATCH] SYS : next step of the new display methode ... --- Makefile | 1 - Sources/Buffer/Buffer.cpp | 156 +++++++++++++---- Sources/Buffer/Buffer.h | 93 +++++++---- Sources/Buffer/BufferAnchor.h | 4 +- Sources/Buffer/BufferEmpty.cpp | 66 +++++--- Sources/Buffer/BufferEmpty.h | 6 +- Sources/Buffer/BufferText.cpp | 186 +++++++++------------ Sources/Buffer/BufferText.h | 80 ++++----- Sources/CustumWidget/CodeView/CodeView.cpp | 49 ++++-- Sources/CustumWidget/CodeView/CodeView.h | 3 + Sources/tools/EdnBuf/EdnBuf.h | 3 +- Sources/tools/EdnBuf/EdnBuf_HighLight.cpp | 76 ++++++++- 12 files changed, 464 insertions(+), 259 deletions(-) diff --git a/Makefile b/Makefile index 770d85e..16efb3b 100644 --- a/Makefile +++ b/Makefile @@ -178,7 +178,6 @@ CXXFILES+= CustumWidget/BufferView/BufferView.cpp \ # Basic Interface : CXXFILES+= Buffer/Buffer.cpp \ - Buffer/BufferAnchor.cpp \ Buffer/BufferText.cpp \ Buffer/BufferEmpty.cpp \ Buffer/BufferManager.cpp \ diff --git a/Sources/Buffer/Buffer.cpp b/Sources/Buffer/Buffer.cpp index fecf21a..f66ffc1 100644 --- a/Sources/Buffer/Buffer.cpp +++ b/Sources/Buffer/Buffer.cpp @@ -48,6 +48,12 @@ Buffer::Buffer() mString += fileBasicID++; SetFileName(mString); m_haveName = false; + // Set basic anchor + bufferAnchorReference_ts tmpAnchor; + tmpAnchor.m_idAnchor = -1; + tmpAnchor.m_lineId = 0; + tmpAnchor.m_bufferPos = 0; + m_AnchorList .PushBack(tmpAnchor); } /** @@ -62,6 +68,12 @@ Buffer::Buffer(Edn::File &newName) { m_fileModify = false; SetFileName(newName); + // Set basic anchor + bufferAnchorReference_ts tmpAnchor; + tmpAnchor.m_idAnchor = -1; + tmpAnchor.m_lineId = 0; + tmpAnchor.m_bufferPos = 0; + m_AnchorList .PushBack(tmpAnchor); } /** @@ -146,11 +158,12 @@ void Buffer::SetLineDisplay(uint32_t lineNumber) * @return --- * */ -int32_t Buffer::Display(DrawerManager &drawer) +void Buffer::DrawLine(DrawerManager &drawer, bufferAnchor_ts &anchor, position_ts &displayStart, position_ts &displaySize) { - return ERR_NONE; + return; } + /** * @brief * @@ -161,9 +174,10 @@ int32_t Buffer::Display(DrawerManager &drawer) * @todo : Set the move up and DOWN... * */ -void Buffer::MouseSelectFromCursorTo(int32_t width, int32_t height) +position_ts Buffer::MouseSelectFromCursorTo(int32_t width, int32_t height) { - // nothing to do + position_ts tmp = {0,0}; + return tmp; } @@ -176,9 +190,10 @@ void Buffer::MouseSelectFromCursorTo(int32_t width, int32_t height) * @return --- * */ -void Buffer::MouseEvent(int32_t width, int32_t height) +position_ts Buffer::MouseEvent(int32_t width, int32_t height) { - // nothing to do + position_ts tmp = {0,0}; + return tmp; } /** @@ -189,9 +204,10 @@ void Buffer::MouseEvent(int32_t width, int32_t height) * @return --- * */ -void Buffer::MouseEventDouble(void) +position_ts Buffer::MouseEventDouble(void) { - // nothing to do + position_ts tmp = {0,0}; + return tmp; } /** @@ -202,9 +218,10 @@ void Buffer::MouseEventDouble(void) * @return --- * */ -void Buffer::MouseEventTriple(void) +position_ts Buffer::MouseEventTriple(void) { - // nothing to do + position_ts tmp = {0,0}; + return tmp; } @@ -243,9 +260,10 @@ void Buffer::ScrollUp(void) * @return --- * */ -void Buffer::cursorMove(int32_t gtkKey) +position_ts Buffer::cursorMove(int32_t gtkKey) { - // nothing to do + position_ts tmp = {0,0}; + return tmp; } /** @@ -256,19 +274,22 @@ void Buffer::cursorMove(int32_t gtkKey) * @return --- * */ -void Buffer::AddChar(char * UTF8data) +position_ts Buffer::AddChar(char * UTF8data) { - // nothing to do + position_ts tmp = {0,0}; + return tmp; } -void Buffer::Search(Edn::String &data, bool back, bool caseSensitive, bool wrap, bool regExp) +position_ts Buffer::Search(Edn::String &data, bool back, bool caseSensitive, bool wrap, bool regExp) { - // nothing to do + position_ts tmp = {0,0}; + return tmp; } -void Buffer::Replace(Edn::String &data) +position_ts Buffer::Replace(Edn::String &data) { - // nothing to do + position_ts tmp = {0,0}; + return tmp; } int32_t Buffer::FindLine(Edn::String &data) @@ -277,9 +298,10 @@ int32_t Buffer::FindLine(Edn::String &data) return 0; } -void Buffer::JumpAtLine(int32_t newLine) +position_ts Buffer::JumpAtLine(int32_t newLine) { - // nothing to do + position_ts tmp = {0,0}; + return tmp; } @@ -319,9 +341,10 @@ void Buffer::Copy(int8_t clipboardID) * @return --- * */ -void Buffer::Cut(int8_t clipboardID) +position_ts Buffer::Cut(int8_t clipboardID) { - // nothing to do + position_ts tmp = {0,0}; + return tmp; } @@ -333,33 +356,98 @@ void Buffer::Cut(int8_t clipboardID) * @return --- * */ -void Buffer::Paste(int8_t clipboardID) +position_ts Buffer::Paste(int8_t clipboardID) { - // nothing to do + position_ts tmp = {0,0}; + return tmp; } -void Buffer::RemoveLine(void) +position_ts Buffer::RemoveLine(void) { - // nothing to do + position_ts tmp = {0,0}; + return tmp; } -void Buffer::SelectAll(void) +position_ts Buffer::SelectAll(void) { - // nothing to do + position_ts tmp = {0,0}; + return tmp; } -void Buffer::SelectNone(void) +position_ts Buffer::SelectNone(void) { - // nothing to do + position_ts tmp = {0,0}; + return tmp; } -void Buffer::Undo(void) +position_ts Buffer::Undo(void) { - // nothing to do + position_ts tmp = {0,0}; + return tmp; } -void Buffer::Redo(void) +position_ts Buffer::Redo(void) { - // nothing to do + position_ts tmp = {0,0}; + return tmp; } + +void Buffer::AnchorAdd(int32_t anchorID) +{ + int32_t localID = AnchorRealId(anchorID); + if (localID >=0) { + EDN_ERROR("AnchorID="<< anchorID << " already exist !!!"); + } else { + bufferAnchorReference_ts tmpAnchor = m_AnchorList[0]; + tmpAnchor.m_idAnchor = anchorID; + m_AnchorList.PushBack(tmpAnchor); + EDN_DEBUG("AnchorID="<< anchorID << " ==> Added"); + } +} + + +void Buffer::AnchorRm(int32_t anchorID) +{ + if (anchorID == -1) { + EDN_ERROR("AnchorID="<< anchorID << " Can not remove this one !!!"); + return; + } + int32_t localID = AnchorRealId(anchorID); + if (localID >=0) { + if (m_AnchorList.Size() == 2) { + m_AnchorList[0] = m_AnchorList[1]; + } + m_AnchorList.Erase(localID); + EDN_DEBUG("AnchorID="<< anchorID << " ==> Remove"); + } else { + EDN_ERROR("AnchorID="<< anchorID << " does not exist !!!"); + } +} + + +bool Buffer::AnchorGet(int32_t anchorID, bufferAnchor_ts & anchor, position_ts &size, int32_t sizePixelX, int32_t sizePixelY) +{ + EDN_ERROR("AnchorID="<< anchorID << " Main buffer ==> can not manage Anchor (type buffer specific)"); + return false; +} + + +bool Buffer::AnchorNext(bufferAnchor_ts & anchor) +{ + EDN_ERROR("AnchorID=?? Main buffer ==> can not manage Anchor (type buffer specific)"); + return false; +} + + +int32_t Buffer::AnchorRealId(int32_t anchorID) +{ + //EDN_DEBUG("Get real ID : " << anchorID << " in the anchor list size()=" << m_AnchorList.Size()); + for(int32_t iii=0; iii < m_AnchorList.Size(); iii++) { + //EDN_DEBUG("check if equal : " << m_AnchorList[iii].m_idAnchor << " id=" << iii); + if (m_AnchorList[iii].m_idAnchor == anchorID) { + return iii; + } + } + return -1; +} \ No newline at end of file diff --git a/Sources/Buffer/Buffer.h b/Sources/Buffer/Buffer.h index c37a360..3593b39 100644 --- a/Sources/Buffer/Buffer.h +++ b/Sources/Buffer/Buffer.h @@ -30,16 +30,34 @@ #include "Display.h" #include "charset.h" #include "Edn.h" -#include "BufferAnchor.h" +//#include "BufferAnchor.h" -typedef struct{ - uint32_t nbTotalLine; //!< Number of line in the buffer - uint32_t nbTotalColomn; //!< Number of line in the buffer - uint32_t startLineDisplay; //!< First line display. - uint32_t startColomnDisplay; //!< First Colomn displayed - uint32_t diplayableColomn; //!< NB colomn that can be displayed - uint32_t diplayableLine; //!< NB Line that can be displayed -}infoStatBuffer_ts; +extern "C" +{ + typedef struct{ + uint32_t nbTotalLine; //!< Number of line in the buffer + uint32_t nbTotalColomn; //!< Number of line in the buffer + uint32_t startLineDisplay; //!< First line display. + uint32_t startColomnDisplay; //!< First Colomn displayed + uint32_t diplayableColomn; //!< NB colomn that can be displayed + uint32_t diplayableLine; //!< NB Line that can be displayed + }infoStatBuffer_ts; + + typedef struct { + int32_t m_idAnchor; + int32_t m_lineId; + int32_t m_bufferPos; + } bufferAnchorReference_ts; + + typedef struct { + int32_t m_lineNumber; + int32_t m_nbIterationMax; + int32_t m_posStart; + int32_t m_posStop; + int32_t m_selectionPosStart; + int32_t m_selectionPosStop; + } bufferAnchor_ts; +} class Buffer { @@ -81,30 +99,33 @@ class Buffer { virtual void GetInfo(infoStatBuffer_ts &infoToUpdate); virtual void SetLineDisplay(uint32_t lineNumber); - virtual int32_t Display(DrawerManager &drawer); - virtual void AddChar(char * UTF8data); - virtual void cursorMove(int32_t gtkKey); - virtual void MouseSelectFromCursorTo(int32_t width, int32_t height); - virtual void MouseEvent(int32_t width, int32_t height); - virtual void MouseEventDouble(void); - virtual void MouseEventTriple(void); - virtual void ScrollDown(void); - virtual void ScrollUp(void); - virtual void RemoveLine(void); - virtual void SelectAll(void); - virtual void SelectNone(void); - virtual void Undo(void); - virtual void Redo(void); - virtual void SetCharset(charset_te newCharset) {}; + virtual void DrawLine(DrawerManager &drawer, bufferAnchor_ts &anchor, position_ts &displayStart, position_ts &displaySize); + // return the new cursor position ... + virtual position_ts AddChar(char * UTF8data); + virtual position_ts cursorMove(int32_t gtkKey); + virtual position_ts MouseSelectFromCursorTo(int32_t width, int32_t height); + virtual position_ts MouseEvent(int32_t width, int32_t height); + virtual position_ts MouseEventDouble(void); + virtual position_ts MouseEventTriple(void); + virtual position_ts RemoveLine(void); + virtual position_ts SelectAll(void); + virtual position_ts SelectNone(void); + virtual position_ts Undo(void); + virtual position_ts Redo(void); + + virtual void SetCharset(charset_te newCharset) {}; + + virtual void ScrollDown(void); // must be deprecated + virtual void ScrollUp(void); // must be deprecated //virtual void SelectAll(void); - virtual void Copy(int8_t clipboardID); - virtual void Cut(int8_t clipboardID); - virtual void Paste(int8_t clipboardID); - virtual void Search(Edn::String &data, bool back, bool caseSensitive, bool wrap, bool regExp); - virtual void Replace(Edn::String &data); + virtual void Copy(int8_t clipboardID); + virtual position_ts Cut(int8_t clipboardID); + virtual position_ts Paste(int8_t clipboardID); + virtual position_ts Search(Edn::String &data, bool back, bool caseSensitive, bool wrap, bool regExp); + virtual position_ts Replace(Edn::String &data); virtual int32_t FindLine(Edn::String &data); - virtual void JumpAtLine(int32_t newLine); + virtual position_ts JumpAtLine(int32_t newLine); virtual int32_t GetCurrentLine(void); protected: @@ -112,6 +133,18 @@ class Buffer { // naming Edn::File m_fileName; //!< filename of the curent buffer bool m_haveName; //!< to know if the file have a name or NOT + + // anchor section + public: + void AnchorAdd(int32_t anchorID); + void AnchorRm(int32_t anchorID); + virtual bool AnchorGet(int32_t anchorID, bufferAnchor_ts & anchor, position_ts &size, int32_t sizePixelX, int32_t sizePixelY); + virtual bool AnchorNext(bufferAnchor_ts & anchor); + + protected: + int32_t AnchorRealId(int32_t anchorID); + Edn::VectorType m_AnchorList; //!< list of all line anchor in the current buffer + }; diff --git a/Sources/Buffer/BufferAnchor.h b/Sources/Buffer/BufferAnchor.h index 196e854..be4ac18 100644 --- a/Sources/Buffer/BufferAnchor.h +++ b/Sources/Buffer/BufferAnchor.h @@ -38,8 +38,8 @@ class BufferAnchor ~BufferAnchor(void); MoveAnchor(int32_t offsetLine); //BufModification(...); - DisplayUpdateFirstLine(void); - DisplayUpdateNextLine(void); + bool DisplayUpdateFirstLine(void); + bool DisplayUpdateNextLine(void); private : int32_t m_lineId; int32_t m_bufferPos; diff --git a/Sources/Buffer/BufferEmpty.cpp b/Sources/Buffer/BufferEmpty.cpp index 032b9fc..0c32bb5 100644 --- a/Sources/Buffer/BufferEmpty.cpp +++ b/Sources/Buffer/BufferEmpty.cpp @@ -67,32 +67,56 @@ BufferEmpty::~BufferEmpty(void) * @return --- * */ -int32_t BufferEmpty::Display(DrawerManager &drawer) +void BufferEmpty::DrawLine(DrawerManager &drawer, bufferAnchor_ts &anchor, position_ts &displayStart, position_ts &displaySize) { - + EDN_DEBUG("Request draw : " << anchor.m_lineNumber); ColorizeManager * myColorManager = ColorizeManager::getInstance(); // Get color : Colorize *myColor = NULL; - // Clean Buffer - drawer.Clean(myColorManager->Get(COLOR_CODE_BASIC_BG) ); - - myColor = myColorManager->Get("normal"); - // Draw the 2 comments Lines : - drawer.Text(myColor, 20,20, "edn - Editeur De N'ours, l'Editeur Desoxyribo-Nucleique"); - //drawer.Flush(); - myColor = myColorManager->Get("commentDoxygen"); - drawer.Text(myColor, 20,25 + Display::GetFontHeight(), "No Buffer Availlable to display"); - drawer.Flush(); - /* - myColor = myColorManager->Get(("SelectedText")); - drawer.Cursor(20, 50); - drawer.EndOfLine(20, 70); - drawer.Tabulation(myColor, 20, 90, 5); - drawer.UTF8UnknownElement(myColor, 20, 120, 3, false); - drawer.Flush(); - */ - return ERR_NONE; + if (anchor.m_lineNumber == 0) { + // Clean Buffer + drawer.Clean(myColorManager->Get(COLOR_CODE_BASIC_BG) ); + myColor = myColorManager->Get("normal"); + drawer.Text(myColor, 20,20, "edn - Editeur De N'ours, l'Editeur Desoxyribo-Nucleique"); + } + if (anchor.m_lineNumber == 1) { + myColor = myColorManager->Get("commentDoxygen"); + drawer.Text(myColor, 20,25 + Display::GetFontHeight(), "No Buffer Availlable to display"); + } + return; } + +bool BufferEmpty::AnchorGet(int32_t anchorID, bufferAnchor_ts & anchor, position_ts &size, int32_t sizePixelX, int32_t sizePixelY) +{ + int32_t localID = AnchorRealId(anchorID); + if (localID >=0) { + EDN_DEBUG("Request anchor"); + size.x = sizePixelX / Display::GetFontWidth(); + size.y = sizePixelY / Display::GetFontHeight(); + anchor.m_nbIterationMax = 2; + anchor.m_lineNumber = m_AnchorList[localID].m_lineId; + anchor.m_posStart = -1; + anchor.m_posStop = -1; + anchor.m_selectionPosStart = -1; + anchor.m_selectionPosStop = -1; + return true; + } else { + return false; + } +} + + +bool BufferEmpty::AnchorNext(bufferAnchor_ts & anchor) +{ + anchor.m_lineNumber++; + EDN_DEBUG("Anchor Next : " << anchor.m_lineNumber); + anchor.m_nbIterationMax--; + if (anchor.m_nbIterationMax<=0) { + return false; + } + return true; +} + diff --git a/Sources/Buffer/BufferEmpty.h b/Sources/Buffer/BufferEmpty.h index 19189a7..7e89741 100644 --- a/Sources/Buffer/BufferEmpty.h +++ b/Sources/Buffer/BufferEmpty.h @@ -32,8 +32,10 @@ class BufferEmpty : public Buffer { public: BufferEmpty(void); virtual ~BufferEmpty(void); - virtual int32_t Display(DrawerManager &drawer); - + void DrawLine(DrawerManager &drawer, bufferAnchor_ts &anchor, position_ts &displayStart, position_ts &displaySize); + bool AnchorGet(int32_t anchorID, bufferAnchor_ts & anchor, position_ts &size, int32_t sizePixelX, int32_t sizePixelY); + bool AnchorNext(bufferAnchor_ts & anchor); + }; diff --git a/Sources/Buffer/BufferText.cpp b/Sources/Buffer/BufferText.cpp index 49eb477..ef13c84 100644 --- a/Sources/Buffer/BufferText.cpp +++ b/Sources/Buffer/BufferText.cpp @@ -141,7 +141,6 @@ BufferText::BufferText(Edn::File &fileName) : Buffer(fileName) SetModify(true); } UpdateWindowsPosition(); - ForceReDraw(true); } @@ -268,19 +267,11 @@ void BufferText::UpdatePointerNumber(void) } -/** - * @brief Display a single line - * - * @param[in,out] --- - * - * @return --- - * - */ -void BufferText::DrawLine(DrawerManager &drawer, int32_t lineNumber, int32_t startPos, int32_t endPos, int32_t selStartPos, int32_t selEndPos) +void BufferText::DrawLine(DrawerManager &drawer, bufferAnchor_ts &anchor, position_ts &displayStart, position_ts &displaySize) { int32_t letterHeight = Display::GetFontHeight(); int32_t letterWidth = Display::GetFontWidth(); - int32_t positionY = letterHeight * (lineNumber - m_displayStart.y - 1); + int32_t positionY = letterHeight * (anchor.m_lineNumber - displayStart.y - 1); int32_t idX = 0; int32_t pixelX = m_nbColoneForLineNumber*letterWidth + 3; @@ -292,18 +283,18 @@ void BufferText::DrawLine(DrawerManager &drawer, int32_t lineNumber, int32_t sta // Regenerate the colorizing if necessary ... displayHLData_ts myDisplayLocalSyntax; - m_EdnBuf.HightlightGenerateLines(myDisplayLocalSyntax, startPos, 1); + m_EdnBuf.HightlightOneLine(myDisplayLocalSyntax, anchor.m_posStart, anchor.m_posStop); // clean the current Line drawer.Rectangle(myColorManager->Get(COLOR_CODE_BASIC_BG), 0, positionY, drawer.GetWidth(), letterHeight); - DrawLineNumber(drawer, lineNumber); + DrawLineNumber(drawer, anchor.m_lineNumber); - bool selHave = selStartPos == -1 ? false : true; + bool selHave = anchor.m_selectionPosStart == -1 ? false : true; char displayChar[MAX_EXP_CHAR_LEN]; memset(displayChar, 0, sizeof(char)*MAX_EXP_CHAR_LEN); int32_t iii; - for (iii=startPos; iii iii) + && anchor.m_selectionPosStart <= iii + && anchor.m_selectionPosStop > iii) { drawer.SpaceText(myColorSelected->GetBG(), pixelX ,positionY , 1); } else if (true == selectColor->HaveBg()) { @@ -353,8 +344,8 @@ void BufferText::DrawLine(DrawerManager &drawer, int32_t lineNumber, int32_t sta && true == globals::IsSetDisplaySpaceChar() ) { if( true == selHave - && selStartPos <= iii - && selEndPos > iii) + && anchor.m_selectionPosStart <= iii + && anchor.m_selectionPosStop > iii) { drawer.SpaceText(myColorSelected->GetBG(), pixelX ,positionY , strlen(tmpDisplayOfset)); } else if (true == selectColor->HaveBg()) { @@ -364,8 +355,8 @@ void BufferText::DrawLine(DrawerManager &drawer, int32_t lineNumber, int32_t sta } } else { if( true == selHave - && selStartPos <= iii - && selEndPos > iii) + && anchor.m_selectionPosStart <= iii + && anchor.m_selectionPosStop > iii) { selectColor = myColorSelected; } @@ -404,67 +395,6 @@ void BufferText::DrawLine(DrawerManager &drawer, int32_t lineNumber, int32_t sta } -/** - * @brief Display the curent buffer with all the probematic imposed by the xharset and the user contraint. - * - * @param[in,out] drawer the basic user drawer of EDN. - * - * @return - * - */ -int32_t BufferText::Display(DrawerManager &drawer) -{ - int32_t letterHeight = Display::GetFontHeight(); - int32_t letterWidth = Display::GetFontWidth(); - // Update the total of line to display in the buffer - UpdatePointerNumber(); - // update the number of element that can be displayed - m_displaySize.x = (drawer.GetWidth()/letterWidth) + 1 - m_nbColoneForLineNumber; - m_displaySize.y = (drawer.GetHeight()/letterHeight) + 1; - EDN_INFO("main DIPLAY " << m_displaySize.x << " char * " << m_displaySize.y << " char"); - - int32_t selStart, selEnd, selRectStart, selRectEnd; - bool selIsRect; - bool selHave = m_EdnBuf.GetSelectionPos(SELECTION_PRIMARY, selStart, selEnd, selIsRect, selRectStart, selRectEnd); - if (false == selHave){ - selStart = -1; - selEnd = -1; - } - - //drawer.Clean(myColorManager->Get(COLOR_CODE_BASIC_BG)); - GTimeVal timeStart; - g_get_current_time(&timeStart); - - int32_t lineStartPos=m_displayStartBufferPos; - int32_t lineEndPos=-1; - int32_t lineIdStart = m_displayStart.y + 1; - int32_t lineIdEnd = m_displayStart.y + m_displaySize.y; - EDN_DEBUG("lineIdStart=" << lineIdStart << " lineIdEnd=" << lineIdEnd ); - int32_t iii; - for (iii=lineIdStart; iii= m_EdnBuf.Size()+1) { - iii++; - break; - } - } - drawer.Flush(); - // Need to clean the end of windows (sometimes)... - if (iiiGet(COLOR_CODE_BASIC_BG), 0, positionY, drawer.GetWidth(), letterHeight*(lineIdEnd+1-iii) ); - } - GTimeVal timeStop; - g_get_current_time(&timeStop); - EDN_DEBUG("Display Generation = " << timeStop.tv_usec - timeStart.tv_usec << " micro-s ==> " << (timeStop.tv_usec - timeStart.tv_usec)/1000. << "ms"); - - return ERR_NONE; -} - - - void BufferText::GetMousePosition(int32_t width, int32_t height, int32_t &x, int32_t &y) { x = (width - 3) / Display::GetFontWidth() - m_nbColoneForLineNumber; @@ -508,7 +438,6 @@ void BufferText::MouseEvent(int32_t width, int32_t height) } m_EdnBuf.Unselect(SELECTION_PRIMARY); - ForceReDraw(true); UpdateWindowsPosition(); } } @@ -558,7 +487,6 @@ void BufferText::MouseSelectFromCursorTo(int32_t width, int32_t height) m_EdnBuf.Select(SELECTION_PRIMARY, selStart, m_cursorPos); } } - ForceReDraw(true); UpdateWindowsPosition(); } @@ -578,7 +506,6 @@ void BufferText::MouseEventDouble(void) if (true == m_EdnBuf.SelectAround(m_cursorPos, beginPos, endPos)) { m_EdnBuf.Select(SELECTION_PRIMARY, beginPos, endPos); m_cursorPos = endPos; - ForceReDraw(true); } // no else } @@ -595,7 +522,6 @@ void BufferText::MouseEventTriple(void) { m_EdnBuf.Select(SELECTION_PRIMARY, m_EdnBuf.StartOfLine(m_cursorPos), m_EdnBuf.EndOfLine(m_cursorPos)); m_cursorPos = m_EdnBuf.EndOfLine(m_cursorPos); - ForceReDraw(true); } void BufferText::RemoveLine(void) @@ -611,13 +537,11 @@ void BufferText::SelectAll(void) { m_EdnBuf.Select(SELECTION_PRIMARY, 0, m_EdnBuf.Size()); m_cursorPos = m_EdnBuf.Size(); - ForceReDraw(true); } void BufferText::SelectNone(void) { m_EdnBuf.Unselect(SELECTION_PRIMARY); - ForceReDraw(true); } /** @@ -922,11 +846,9 @@ void BufferText::UpdateWindowsPosition(bool centerPage) m_displayStart.y = cursorPosition.y - globals::getNbLineBorder(); if (m_displayStart.y < 0) { m_displayStart.y = 0; - ForceReDraw(true); } } else if (m_displayStart.y + m_displaySize.y <= (int32_t)cursorPosition.y + globals::getNbLineBorder() ) { m_displayStart.y = cursorPosition.y - m_displaySize.y + globals::getNbLineBorder() + 1; - ForceReDraw(true); } // Display position (X mode): //EDN_INFO("cursorPosition X : " << cursorPosition.y << " windows " << m_displayStart.y << "=>" << m_displayStart.x + m_displaySize.x); @@ -934,11 +856,9 @@ void BufferText::UpdateWindowsPosition(bool centerPage) m_displayStart.x = cursorPosition.x - globals::getNbColoneBorder(); if (m_displayStart.x < 0) { m_displayStart.x = 0; - ForceReDraw(true); } } else if (m_displayStart.x + m_displaySize.x <= cursorPosition.x + globals::getNbColoneBorder() ) { m_displayStart.x = cursorPosition.x - m_displaySize.x + globals::getNbColoneBorder() + 1; - ForceReDraw(true); } //update the buffer position ID : @@ -957,7 +877,6 @@ void BufferText::UpdateWindowsPosition(bool centerPage) m_displayStart.y = edn_max(m_displayStart.y, 0); m_displayStartBufferPos = m_EdnBuf.CountForwardNLines(0, m_displayStart.y); - ForceReDraw(true); //EDN_DEBUG(" display start : " << m_displayStart.x << "x" << m_displayStart.y); //EDN_DEBUG(" -------------------------------------------------"); } @@ -972,8 +891,9 @@ void BufferText::UpdateWindowsPosition(bool centerPage) * @return --- * */ -void BufferText::AddChar(char * UTF8data) +position_ts BufferText::AddChar(char * UTF8data) { + position_ts tmp = {0,0}; int32_t SelectionStart, SelectionEnd, SelectionRectStart, SelectionRectEnd; bool SelectionIsRect; bool haveSelectionActive = m_EdnBuf.GetSelectionPos(SELECTION_PRIMARY, SelectionStart, SelectionEnd, SelectionIsRect, SelectionRectStart, SelectionRectEnd); @@ -1117,8 +1037,9 @@ int32_t BufferText::FindLine(Edn::String &data) } } -void BufferText::JumpAtLine(int32_t newLine) +position_ts BufferText::JumpAtLine(int32_t newLine) { + position_ts tmp = {0,0}; int32_t positionLine = m_EdnBuf.CountForwardNLines(0, newLine); m_EdnBuf.Unselect(SELECTION_PRIMARY); EDN_DEBUG("jump at the line : " << newLine ); @@ -1141,8 +1062,9 @@ int32_t BufferText::GetCurrentLine(void) -void BufferText::Search(Edn::String &data, bool back, bool caseSensitive, bool wrap, bool regExp) +position_ts BufferText::Search(Edn::String &data, bool back, bool caseSensitive, bool wrap, bool regExp) { + position_ts tmp = {0,0}; EDN_INFO("Search data : \"" << data << "\""); int32_t SelectionStart, SelectionEnd, SelectionRectStart, SelectionRectEnd; @@ -1229,8 +1151,9 @@ void BufferText::Search(Edn::String &data, bool back, bool caseSensitive, bool w } -void BufferText::Replace(Edn::String &data) +position_ts BufferText::Replace(Edn::String &data) { + position_ts tmp = {0,0}; int32_t SelectionStart, SelectionEnd, SelectionRectStart, SelectionRectEnd; bool SelectionIsRect; bool haveSelectionActive = m_EdnBuf.GetSelectionPos(SELECTION_PRIMARY, SelectionStart, SelectionEnd, SelectionIsRect, SelectionRectStart, SelectionRectEnd); @@ -1272,8 +1195,9 @@ void BufferText::Copy(int8_t clipboardID) * @return --- * */ -void BufferText::Cut(int8_t clipboardID) +position_ts BufferText::Cut(int8_t clipboardID) { + position_ts tmp = {0,0}; int32_t SelectionStart, SelectionEnd, SelectionRectStart, SelectionRectEnd; bool SelectionIsRect; @@ -1288,7 +1212,6 @@ void BufferText::Cut(int8_t clipboardID) m_cursorPos = SelectionStart; } UpdateWindowsPosition(); - ForceReDraw(true); SetModify(true); } @@ -1301,8 +1224,9 @@ void BufferText::Cut(int8_t clipboardID) * @return --- * */ -void BufferText::Paste(int8_t clipboardID) +position_ts BufferText::Paste(int8_t clipboardID) { + position_ts tmp = {0,0}; Edn::VectorType mVect; // copy data from the click board : ClipBoard::Get(clipboardID, mVect); @@ -1322,29 +1246,28 @@ void BufferText::Paste(int8_t clipboardID) } UpdateWindowsPosition(); - ForceReDraw(true); SetModify(true); } -void BufferText::Undo(void) +position_ts BufferText::Undo(void) { + position_ts tmp = {0,0}; int32_t newPos = m_EdnBuf.Undo(); if (newPos >= 0) { SetInsertPosition(newPos, true); UpdateWindowsPosition(); - ForceReDraw(true); SetModify(true); } } -void BufferText::Redo(void) +position_ts BufferText::Redo(void) { + position_ts tmp = {0,0}; int32_t newPos = m_EdnBuf.Redo(); if (newPos >= 0) { SetInsertPosition(newPos, true); UpdateWindowsPosition(); - ForceReDraw(true); SetModify(true); } } @@ -1353,6 +1276,51 @@ void BufferText::Redo(void) void BufferText::SetCharset(charset_te newCharset) { m_EdnBuf.SetCharsetType(newCharset); - ForceReDraw(true); } + +bool BufferText::AnchorGet(int32_t anchorID, bufferAnchor_ts & anchor, position_ts &size, int32_t sizePixelX, int32_t sizePixelY) +{ + int32_t localID = AnchorRealId(anchorID); + if (localID >=0) { + // update internal sise of the width of lineID + UpdatePointerNumber(); + // Updata uper size of display + size.x = sizePixelX / Display::GetFontWidth(); + size.y = sizePixelY / Display::GetFontHeight(); + anchor.m_nbIterationMax = size.y; + // update to buffer position + anchor.m_lineNumber = m_AnchorList[localID].m_lineId; + anchor.m_posStart = m_AnchorList[localID].m_bufferPos; + if (anchor.m_posStart >= m_EdnBuf.Size()+1) { + return false; + } + anchor.m_posStop = m_EdnBuf.EndOfLine(anchor.m_posStart); + // Update selection current + int32_t selStart, selEnd, selRectStart, selRectEnd; + bool selIsRect; + bool selHave = m_EdnBuf.GetSelectionPos(SELECTION_PRIMARY, selStart, selEnd, selIsRect, selRectStart, selRectEnd); + if (false == selHave){ + anchor.m_selectionPosStart = -1; + anchor.m_selectionPosStop = -1; + } else { + anchor.m_selectionPosStart = selStart; + anchor.m_selectionPosStop = selEnd; + } + return true; + } else { + return false; + } +} + + +bool BufferText::AnchorNext(bufferAnchor_ts & anchor) +{ + anchor.m_lineNumber++; + anchor.m_posStart = anchor.m_posStop+1; + if (anchor.m_posStart >= m_EdnBuf.Size()+1) { + return false; + } + anchor.m_posStop = m_EdnBuf.EndOfLine(anchor.m_posStart); + return true; +} diff --git a/Sources/Buffer/BufferText.h b/Sources/Buffer/BufferText.h index 9894b96..5d66ec6 100644 --- a/Sources/Buffer/BufferText.h +++ b/Sources/Buffer/BufferText.h @@ -39,50 +39,45 @@ typedef enum { class BufferText : public Buffer { public: - BufferText(void); - BufferText(Edn::File &fileName); - virtual ~BufferText(void); - void Save(void); + BufferText(void); + BufferText(Edn::File &fileName); + virtual ~BufferText(void); + void Save(void); - void GetInfo(infoStatBuffer_ts &infoToUpdate); - void SetLineDisplay(uint32_t lineNumber); + void GetInfo(infoStatBuffer_ts &infoToUpdate); + void SetLineDisplay(uint32_t lineNumber); - int32_t Display(DrawerManager &drawer); - void AddChar(char * UTF8data); - void cursorMove(int32_t gtkKey); - void MouseSelectFromCursorTo(int32_t width, int32_t height); - void MouseEvent(int32_t width, int32_t height); - void MouseEventDouble(void); - void MouseEventTriple(void); - void ScrollDown(void); - void ScrollUp(void); + void DrawLine(DrawerManager &drawer, bufferAnchor_ts &anchor, position_ts &displayStart, position_ts &displaySize); + position_ts AddChar(char * UTF8data); + position_ts cursorMove(int32_t gtkKey); + position_ts MouseSelectFromCursorTo(int32_t width, int32_t height); + position_ts MouseEvent(int32_t width, int32_t height); + position_ts MouseEventDouble(void); + position_ts MouseEventTriple(void); + void ScrollDown(void); + void ScrollUp(void); - void Copy(int8_t clipboardID); - void Cut(int8_t clipboardID); - void Paste(int8_t clipboardID); + void Copy(int8_t clipboardID); + position_ts Cut(int8_t clipboardID); + position_ts Paste(int8_t clipboardID); - void Search(Edn::String &data, bool back, bool caseSensitive, bool wrap, bool regExp); - void Replace(Edn::String &data); - int32_t FindLine(Edn::String &data); - void JumpAtLine(int32_t newLine); - int32_t GetCurrentLine(void); + position_ts Search(Edn::String &data, bool back, bool caseSensitive, bool wrap, bool regExp); + position_ts Replace(Edn::String &data); + int32_t FindLine(Edn::String &data); + position_ts JumpAtLine(int32_t newLine); + int32_t GetCurrentLine(void); - void RemoveLine(void); - void SelectAll(void); - void SelectNone(void); - void Undo(void); - void Redo(void); - void SetCharset(charset_te newCharset); + position_ts RemoveLine(void); + position_ts SelectAll(void); + position_ts SelectNone(void); + position_ts Undo(void); + position_ts Redo(void); + void SetCharset(charset_te newCharset); + + bool AnchorGet(int32_t anchorID, bufferAnchor_ts & anchor, position_ts &size, int32_t sizePixelX, int32_t sizePixelY); + bool AnchorNext(bufferAnchor_ts & anchor); protected: - void NameChange(void); - - // anchor section - public: - void AnchorAdd(int32_t anchorID); - void AnchorRm(int32_t anchorID); - - private: - Edn::VectorType m_AnchorList; //!< list of all line anchor in the current buffer + void NameChange(void); private: // Display @@ -92,9 +87,9 @@ class BufferText : public Buffer { // Direct buffer IO EdnBuf m_EdnBuf; //!< buffer associated on this displayer - position_ts m_displayStart; //!< position where the display is starting - position_ts m_displaySize; //!< number of char displayable in the screan - int32_t m_displayStartBufferPos; //!< position where the buffer start + //position_ts m_displayStart; //!< position where the display is starting + //position_ts m_displaySize; //!< number of char displayable in the screan + //int32_t m_displayStartBufferPos; //!< position where the buffer start // Cursor : int32_t m_cursorPos; //!< position in the buffer of the cursor @@ -122,8 +117,7 @@ class BufferText : public Buffer { void MoveUpDown(int32_t ofset); void DrawLineNumber(DrawerManager &drawer, int32_t lineNumber); void UpdatePointerNumber(void); - void DrawLine(DrawerManager &drawer, int32_t lineNumber, int32_t startPos, int32_t endPos, int32_t selStartPos, int32_t selEndPos); - //void DrawLine(DrawerManager &drawer, int32_t lineNumber, int32_t startPos, int32_t endPos, int32_t selStartPos, int32_t selEndPos); + }; diff --git a/Sources/CustumWidget/CodeView/CodeView.cpp b/Sources/CustumWidget/CodeView/CodeView.cpp index ae585e4..c527eae 100644 --- a/Sources/CustumWidget/CodeView/CodeView.cpp +++ b/Sources/CustumWidget/CodeView/CodeView.cpp @@ -38,15 +38,19 @@ CodeView::CodeView(void) : MsgBroadcast("Code View", EDN_CAT_WORK_AREA) { - m_bufferID = -1; - m_buttunOneSelected = false; - m_shawableAreaX = 0; - m_shawableAreaY = 0; - // Init link with the buffer Manager m_bufferManager = BufferManager::getInstance(); m_colorManager = ColorizeManager::getInstance(); + static int32_t staticIntLocal = 100; + m_displayUniqueId = staticIntLocal++; + + m_bufferID = -1; + m_bufferManager->Get(m_bufferID)->AnchorAdd(m_displayUniqueId); + m_buttunOneSelected = false; + m_shawableAreaX = 0; + m_shawableAreaY = 0; + m_widget = gtk_drawing_area_new(); gtk_widget_set_size_request( m_widget, 200, 100); @@ -98,7 +102,9 @@ void CodeView::OnMessage(int32_t id, int32_t dataID) { case EDN_MSG__CURRENT_CHANGE_BUFFER_ID: //EDN_INFO("Select a new Buffer ... " << dataID); + m_bufferManager->Get(m_bufferID)->AnchorRm(m_displayUniqueId); m_bufferID = dataID; + m_bufferManager->Get(m_bufferID)->AnchorAdd(m_displayUniqueId); // request the dispplay of the curent Editor SendMessage(EDN_MSG__BUFFER_CHANGE_CURRENT, m_bufferID); break; @@ -187,6 +193,7 @@ void CodeView::OnMessage(int32_t id, int32_t dataID) } +//#define COUNT_TIME plop gboolean CodeView::CB_displayDraw( GtkWidget *widget, GdkEventExpose *event, gpointer data) { @@ -225,14 +232,36 @@ gboolean CodeView::CB_displayDraw( GtkWidget *widget, GdkEventExpose *event, gpo myColorManager = ColorizeManager::getInstance(); DrawerManager monDrawer(widget, self->m_shawableAreaX, self->m_shawableAreaY); - //EDN_INFO("Display buffer ID = " << m_bufferID); - (void)self->m_bufferManager->Get(self->m_bufferID)->Display(monDrawer); + Buffer * tmpBuf = self->m_bufferManager->Get(self->m_bufferID); + + #ifdef COUNT_TIME + GTimeVal timeStart; + g_get_current_time(&timeStart); + #endif + bufferAnchor_ts anchor; + + bool enableToWrite = tmpBuf->AnchorGet(self->m_displayUniqueId, anchor, self->m_displaySize, self->m_shawableAreaX, self->m_shawableAreaY); + while (true == enableToWrite) { + tmpBuf->DrawLine(monDrawer, anchor, self->m_displayStart, self->m_displaySize); + enableToWrite = tmpBuf->AnchorNext(anchor); + } + monDrawer.Flush(); + + // Need to clean the end of windows (sometimes)... + /* + if (iiiGet(COLOR_CODE_BASIC_BG), 0, positionY, drawer.GetWidth(), letterHeight*(lineIdEnd+1-iii) ); + } + */ + #ifdef COUNT_TIME + GTimeVal timeStop; + g_get_current_time(&timeStop); + EDN_DEBUG("Display Generation = " << timeStop.tv_usec - timeStart.tv_usec << " micro-s ==> " << (timeStop.tv_usec - timeStart.tv_usec)/1000. << "ms"); + #endif return TRUE; } - - - // sur : émis lors du premier affichage de la GtkDrawingArea gboolean CodeView::CB_displayInit( GtkWidget *widget, gpointer data) { diff --git a/Sources/CustumWidget/CodeView/CodeView.h b/Sources/CustumWidget/CodeView/CodeView.h index 2e5ea48..71d2699 100644 --- a/Sources/CustumWidget/CodeView/CodeView.h +++ b/Sources/CustumWidget/CodeView/CodeView.h @@ -54,6 +54,9 @@ class CodeView : public MsgBroadcast private: // main windows widget : GtkWidget * m_widget; + int32_t m_displayUniqueId; + position_ts m_displayStart; //!< position where the display is starting + position_ts m_displaySize; //!< number of char displayable in the screan // récupération des proprieter général... BufferManager * m_bufferManager; ColorizeManager * m_colorManager; diff --git a/Sources/tools/EdnBuf/EdnBuf.h b/Sources/tools/EdnBuf/EdnBuf.h index 224d9fe..dd9bbda 100644 --- a/Sources/tools/EdnBuf/EdnBuf.h +++ b/Sources/tools/EdnBuf/EdnBuf.h @@ -164,7 +164,8 @@ class EdnBuf { void FindMainHighLightPosition(int32_t startPos, int32_t endPos, int32_t &startId, int32_t &stopId, bool backPreviousNotEnded); public: void SetHLSystem( Highlight * newHLSystem); - void HightlightGenerateLines(displayHLData_ts & MData, int32_t startPos, int32_t nbLines); + void HightlightOneLine(displayHLData_ts & MData, int32_t HLStart, int32_t HLStop); + void HightlightGenerateLines(displayHLData_ts & MData, int32_t startPos, int32_t nbLines); // TODO : deprecated ... colorInformation_ts * GetElementColorAtPosition(displayHLData_ts & MData, int32_t pos); private: colorInformation_ts * GetElementColorAtPosition(int32_t pos, int32_t &starPos); diff --git a/Sources/tools/EdnBuf/EdnBuf_HighLight.cpp b/Sources/tools/EdnBuf/EdnBuf_HighLight.cpp index b42d3f0..48c0b11 100644 --- a/Sources/tools/EdnBuf/EdnBuf_HighLight.cpp +++ b/Sources/tools/EdnBuf/EdnBuf_HighLight.cpp @@ -286,6 +286,71 @@ colorInformation_ts *EdnBuf::GetElementColorAtPosition(int32_t pos, int32_t &sta return NULL; } +//#define COUNT_TIME plop + +void EdnBuf::HightlightOneLine(displayHLData_ts & MData, int32_t HLStart, int32_t HLStop) +{ + MData.posHLPass1 = 0; + MData.posHLPass2 = 0; + if (NULL == m_Highlight) { + return; + } + #ifdef COUNT_TIME + GTimeVal timeStart; + g_get_current_time(&timeStart); + #endif + int32_t startId, stopId; + // find element previous + FindMainHighLightPosition(HLStart, HLStop, startId, stopId, true); + + int32_t k; + //EDN_DEBUG("List of section between : "<< startId << " & " << stopId); + int32_t endSearch = stopId+1; + if (-1 == stopId) { + endSearch = m_HLDataPass1.Size(); + } + for (k=edn_max(startId, 0); k (empty section 1 ) k="< (empty section 2 ) k="< (under section ) k="< (empty section 3 ) k="< (empty section 4 ) k="<