summaryrefslogtreecommitdiff
path: root/src/interface/RichLabel.cpp
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2013-03-22 14:14:17 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2013-03-22 14:14:17 (GMT)
commit9abe51526cac2634af0541c3de69834dd30e9f78 (patch)
tree6ae4deadfe00a83094b9d288d8c11d8ce823577a /src/interface/RichLabel.cpp
parent2c311b9a36a88fadd96f3d39acb1ab2590835d81 (diff)
downloadpowder-9abe51526cac2634af0541c3de69834dd30e9f78.zip
powder-9abe51526cac2634af0541c3de69834dd30e9f78.tar.gz
Move all GUI source files into gui/
Diffstat (limited to 'src/interface/RichLabel.cpp')
-rw-r--r--src/interface/RichLabel.cpp198
1 files changed, 0 insertions, 198 deletions
diff --git a/src/interface/RichLabel.cpp b/src/interface/RichLabel.cpp
deleted file mode 100644
index 84dc500..0000000
--- a/src/interface/RichLabel.cpp
+++ /dev/null
@@ -1,198 +0,0 @@
-#include <vector>
-#include <exception>
-
-#include "RichLabel.h"
-#include "Misc.h"
-#include "interface/Point.h"
-#include "interface/Component.h"
-#include "graphics/Graphics.h"
-
-using namespace ui;
-
-struct RichTextParseException: public std::exception {
- std::string message;
-public:
- RichTextParseException(std::string message_ = "Parse error"): message(message_) {}
- const char * what() const throw()
- {
- return message.c_str();
- }
- ~RichTextParseException() throw() {};
-};
-
-RichLabel::RichLabel(Point position, Point size, std::string labelText):
- Component(position, size),
- textSource(labelText),
- displayText("")
-{
- updateRichText();
-}
-
-RichLabel::~RichLabel()
-{
-
-}
-
-void RichLabel::updateRichText()
-{
- regions.clear();
- displayText = "";
-
- if(textSource.length())
- {
-
- enum State { ReadText, ReadData, ReadRegion, ReadDataStart };
- State state = ReadText;
-
- int currentDataPos = 0;
- char * currentData = new char[textSource.length()+1];
- std::fill(currentData, currentData+textSource.length()+1, 0);
-
- int finalTextPos = 0;
- char * finalText = new char[textSource.length()+1];
- std::fill(finalText, finalText+textSource.length()+1, 0);
-
- int originalTextPos = 0;
- char * originalText = new char[textSource.length()+1];
- std::copy(textSource.begin(), textSource.end(), originalText);
- originalText[textSource.length()] = 0;
-
- int stackPos = -1;
- RichTextRegion * regionsStack = new RichTextRegion[256];
-
- try
- {
- while(originalText[originalTextPos])
- {
- char current = originalText[originalTextPos];
-
- if(state == ReadText)
- {
- 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 == '}')
- {
- if(stackPos >= 0)
- {
- currentData[currentDataPos] = 0;
- regionsStack[stackPos].actionData = std::string(currentData);
- regions.push_back(regionsStack[stackPos]);
- stackPos--;
- }
- else
- {
- throw RichTextParseException("Unexpected '}'");
- }
- }
- else
- {
- finalText[finalTextPos++] = current;
- finalText[finalTextPos] = 0;
- if(stackPos >= 0)
- {
- regionsStack[stackPos].finish = finalTextPos;
- }
- }
- }
- else if(state == ReadData)
- {
- if(current == '|')
- {
- state = ReadText;
- }
- else
- {
- currentData[currentDataPos++] = current;
- currentData[currentDataPos] = 0;
- }
- }
- else if(state == ReadDataStart)
- {
- if(current != ':')
- {
- throw RichTextParseException("Expected ':'");
- }
- state = ReadData;
- currentDataPos = 0;
- }
- else if(state == ReadRegion)
- {
- if(stackPos >= 0)
- {
- regionsStack[stackPos].action = current;
- state = ReadDataStart;
- }
- else
- {
- throw RichTextParseException();
- }
- }
-
- originalTextPos++;
- }
-
- if(stackPos != -1)
- throw RichTextParseException("Unclosed region");
-
- 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;
- }
- TextPosition(displayText);
-}
-
-void RichLabel::SetText(std::string text)
-{
- textSource = text;
- updateRichText();
-}
-
-std::string RichLabel::GetDisplayText()
-{
- return displayText;
-}
-
-std::string RichLabel::GetText()
-{
- return textSource;
-}
-
-void RichLabel::Draw(const Point& screenPos)
-{
- Graphics * g = ui::Engine::Ref().g;
- ui::Colour textColour = Appearance.TextInactive;
- g->drawtext(screenPos.X+textPosition.X, screenPos.Y+textPosition.Y, displayText, textColour.Red, textColour.Green, textColour.Blue, 255);
-}
-
-void RichLabel::OnMouseClick(int x, int y, unsigned button)
-{
- int cursorPosition = Graphics::CharIndexAtPosition((char*)displayText.c_str(), x-textPosition.X, y-textPosition.Y);
- for(std::vector<RichTextRegion>::iterator iter = regions.begin(), end = regions.end(); iter != end; ++iter)
- {
- if((*iter).start <= cursorPosition && (*iter).finish >= cursorPosition)
- {
- switch((*iter).action)
- {
- case 'a':
- OpenURI((*iter).actionData);
- break;
- }
- }
- }
-}