diff options
Diffstat (limited to 'src/interface/RichLabel.cpp')
| -rw-r--r-- | src/interface/RichLabel.cpp | 174 |
1 files changed, 92 insertions, 82 deletions
diff --git a/src/interface/RichLabel.cpp b/src/interface/RichLabel.cpp index 3ee12ce..01d35fc 100644 --- a/src/interface/RichLabel.cpp +++ b/src/interface/RichLabel.cpp @@ -22,7 +22,8 @@ public: RichLabel::RichLabel(Point position, Point size, std::string labelText): Component(position, size), - textSource(labelText) + textSource(labelText), + displayText("") { updateRichText(); } @@ -35,114 +36,123 @@ RichLabel::~RichLabel() void RichLabel::updateRichText() { regions.clear(); + displayText = ""; - enum State { ReadText, ReadData, ReadRegion, ReadDataStart }; - State state = ReadText; + if(textSource.length()) + { - int currentDataPos = 0; - char * currentData = new char[textSource.length()+1]; + enum State { ReadText, ReadData, ReadRegion, ReadDataStart }; + State state = ReadText; - int finalTextPos = 0; - char * finalText = new char[textSource.length()+1]; + int currentDataPos = 0; + char * currentData = new char[textSource.length()+1]; + std::fill(currentData, currentData+textSource.length()+1, 0); - int originalTextPos = 0; - char * originalText = new char[textSource.length()+1]; - std::copy(textSource.begin(), textSource.end(), originalText); + int finalTextPos = 0; + char * finalText = new char[textSource.length()+1]; + std::fill(finalText, finalText+textSource.length()+1, 0); - int stackPos = -1; - RichTextRegion * regionsStack = new RichTextRegion[256]; + int originalTextPos = 0; + char * originalText = new char[textSource.length()+1]; + std::copy(textSource.begin(), textSource.end(), originalText); - try - { - while(originalText[originalTextPos]) - { - char current = originalText[originalTextPos]; + int stackPos = -1; + RichTextRegion * regionsStack = new RichTextRegion[256]; - if(state == ReadText) + try + { + while(originalText[originalTextPos]) { - if(current == '{') - { - if(stackPos > 255) - throw RichTextParseException("Too many nested regions"); - stackPos++; - regionsStack[stackPos].start = finalTextPos; - regionsStack[stackPos].finish = finalTextPos; - state = ReadRegion; - } - else if(current == '}') + char current = originalText[originalTextPos]; + + if(state == ReadText) { - if(stackPos >= 0) + if(current == '{') { - currentData[currentDataPos] = 0; - regionsStack[stackPos].actionData = std::string(currentData); - regions.push_back(regionsStack[stackPos]); - stackPos--; + if(stackPos > 255) + throw RichTextParseException("Too many nested regions"); + stackPos++; + regionsStack[stackPos].start = finalTextPos; + regionsStack[stackPos].finish = finalTextPos; + state = ReadRegion; + } + else if(current == '}') + { + if(stackPos >= 0) + { + currentData[currentDataPos] = 0; + regionsStack[stackPos].actionData = std::string(currentData); + regions.push_back(regionsStack[stackPos]); + stackPos--; + } + else + { + throw RichTextParseException("Unexpected '}'"); + } } else { - throw RichTextParseException("Unexpected '}'"); + finalText[finalTextPos++] = current; + finalText[finalTextPos] = 0; + if(stackPos >= 0) + { + regionsStack[stackPos].finish = finalTextPos; + } } } - else + else if(state == ReadData) { - finalText[finalTextPos++] = current; - if(stackPos >= 0) + if(current == '|') { - regionsStack[stackPos].finish = finalTextPos; + state = ReadText; + } + else + { + currentData[currentDataPos++] = current; + currentData[currentDataPos] = 0; } } - } - else if(state == ReadData) - { - if(current == '|') - { - state = ReadText; - } - else - { - currentData[currentDataPos++] = current; - } - } - else if(state == ReadDataStart) - { - if(current != ':') - { - throw RichTextParseException("Expected ':'"); - } - state = ReadData; - currentDataPos = 0; - } - else if(state == ReadRegion) - { - if(stackPos >= 0) + else if(state == ReadDataStart) { - regionsStack[stackPos].action = current; - state = ReadDataStart; + if(current != ':') + { + throw RichTextParseException("Expected ':'"); + } + state = ReadData; + currentDataPos = 0; } - else + else if(state == ReadRegion) { - throw RichTextParseException(); + if(stackPos >= 0) + { + regionsStack[stackPos].action = current; + state = ReadDataStart; + } + else + { + throw RichTextParseException(); + } } - } - originalTextPos++; - } + originalTextPos++; + } - if(stackPos != -1) - throw RichTextParseException("Unclosed region"); + if(stackPos != -1) + throw RichTextParseException("Unclosed region"); - finalText[finalTextPos] = 0; - displayText = std::string(finalText); - } - catch (const RichTextParseException & e) - { - displayText = "[Parse exception: " + std::string(e.what()) + "]"; + finalText[finalTextPos] = 0; + displayText = std::string(finalText); + } + catch (const RichTextParseException & e) + { + displayText = "\br[Parse exception: " + std::string(e.what()) + "]"; + regions.clear(); + } + delete[] currentData; + delete[] finalText; + delete[] originalText; + delete[] regionsStack; } - delete[] currentData; - delete[] finalText; - delete[] originalText; - delete[] regionsStack; - TextPosition(displayText); } |
