summaryrefslogtreecommitdiff
path: root/src/unite/internal/state.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/unite/internal/state.h')
-rw-r--r--src/unite/internal/state.h219
1 files changed, 219 insertions, 0 deletions
diff --git a/src/unite/internal/state.h b/src/unite/internal/state.h
new file mode 100644
index 0000000..e294372
--- /dev/null
+++ b/src/unite/internal/state.h
@@ -0,0 +1,219 @@
+#ifndef FQTERM_UNITE_STATE
+#define FQTERM_UNITE_STATE
+
+#include <QByteArray>
+#include "session.h"
+
+namespace FQTerm {
+class FQTermUniteDecode;
+typedef bool (FQTermUniteDecode:: *StateFunc)();
+
+struct StateOption {
+ int byte; // char value to look for; -1==end/default
+ StateFunc action;
+ StateOption *nextState;
+};
+
+
+
+class FQTermUniteDecode {
+public:
+ FQTermUniteDecode();
+ virtual ~FQTermUniteDecode() {}
+ //should return number of chars consumed
+ virtual int processInput(const QByteArray& input);
+protected:
+ virtual bool keyReceived(int key) = 0;
+ //tab = 7, backspace = 8, delete is *[3~, page up is 5~, page down is 6~, home is 1~, end is 4~, double esc is double esc,
+ //up is A, down is B, left is D, right is C.
+ //F1 - F12 11~ 12~ 13~ 14~ 15~ 17~ 18~ 19~ 20~ 21~ 23~ 24~
+ //static char* specialKeys[];
+ enum SPECIALKEY{SPECIALKEYSTART = 0x10000, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12,
+ UP, DOWN, LEFT, RIGHT, DOUBLEESC, INSERT, HOME, END, PGUP, PGDOWN, DELETE};
+
+ // Virtual Keys: move cursor
+ bool cursorLeft();
+ bool cursorDown();
+ bool cursorRight();
+ bool cursorUp();
+
+ // other escape sequence actions
+ bool normalInput();
+
+ //double esc pressed
+ bool doubleEsc();
+
+ // action parameters
+ bool clearParam();
+ bool paramDigit();
+ //function key map
+ bool functionKey();
+private:
+ // ********** decoder states ****************
+ StateOption *current_state_;
+ int param_; //valid when > 0.
+ const char* data_;
+ int inputLength_;
+ int currentByte_;
+ QByteArray leftToDecode_;
+ struct EscStateMachine {
+ static StateOption normal_state_[], esc_state_[], bracket_state_[];
+ };
+};
+
+class FQTermUniteState : public QObject,
+ public FQTermUniteDecode {
+ Q_OBJECT;
+public:
+ FQTermUniteState(FQTermUniteSessionContext* context);
+ virtual ~FQTermUniteState() {}
+ virtual void initialize() = 0;
+
+
+protected:
+ //util functions
+ //cursor manipulations
+ void moveCursorRelative(int dx, int dy);
+ void moveCursorAbsolute(int x, int y);
+ void moveCursorHome();
+ //To scroll up, dy < 0, scroll down, dy > 0.
+ void scrollWindow(int dy);
+ void moveCursorNextLine();
+ void saveCursor();
+ void restoreCursor();
+
+ //attr control
+ enum CHARATTR{DEFAULTATTR = -1, CLEARATTR = 0, BOLD = 1, LOWINTENSITY = 2, UNDERLINE = 4, BLINK = 5, REVERSECOLOR = 7, INVISIBLE = 8};
+ void setAttr(int attr);
+ enum CHARCOLOR{BLACK = 0, RED = 1, GREEN = 2, YELLOW = 3, BLUE = 4, PURPLE = 5, INDIGO = 6, WHITE = 7};
+ void setForegroundColor(int color, bool highlight = true);
+ void setBackgroundColor(int color);
+
+ //clear lines/screen
+ enum CLEARLINE{CURSORRIGHT = 0, CURSORLEFT = 1, WHOLELINE = 2};
+ void clearLine(int part);
+ enum CLEARSCREEN{CURSORDOWN = 0, CURSORUP = 1, WHOLESCREEN = 2};
+ void clearScreen(int part);
+
+ //window setting
+ void setWindowRange(int startLine, int endLine);
+
+ QByteArray escape();
+ QByteArray cursorStr();
+ void write(const QByteArray& output);
+ void quit() {context_->quit();}
+ FQTermUniteState* setNextState(int state, bool init = true) {return context_->setCurrentState(state, init);}
+ int row() {return context_->row();}
+ int column() {return context_->column();}
+
+
+ friend struct cursorGuard;
+ struct cursorGuard {
+ cursorGuard(FQTermUniteState& state) : state_(state) {state_.saveCursor();}
+ ~cursorGuard() {state_.restoreCursor();}
+ private:
+ FQTermUniteState& state_;
+ };
+private:
+ FQTermUniteSessionContext* context_;
+ int lastState_;
+};
+
+class FQTermUniteMenu {
+public:
+ FQTermUniteMenu() {current_ = 0;}
+ virtual ~FQTermUniteMenu() {}
+protected:
+ int addEntry(char key);
+ int findEntry(char key);
+ void clearEntry();
+ int currentEntry();
+ int setCurrentEntry(char key);
+ int setCurrentIndex(int index);
+
+ int nextEntry();
+ int prevEntry();
+ virtual void clearPointer(int index) = 0;
+ virtual void drawPointer(int index) = 0;
+ virtual void enterEntry() = 0;
+private:
+ std::vector<char> entries_;
+ int current_;
+};
+
+
+class FQTermWelcomeState : public FQTermUniteState, public FQTermUniteMenu {
+ Q_OBJECT;
+public:
+ FQTermWelcomeState(FQTermUniteSessionContext* context);
+ virtual void initialize();
+protected:
+ virtual bool keyReceived(int key);
+private:
+ virtual void clearPointer(int index);
+ virtual void drawPointer(int index);
+ virtual void enterEntry();
+};
+
+class FQTermExitState : public FQTermUniteState, public FQTermUniteMenu {
+ Q_OBJECT;
+public:
+ FQTermExitState(FQTermUniteSessionContext* context);
+ virtual void initialize();
+protected:
+ virtual bool keyReceived(int key);
+private:
+ virtual void clearPointer(int index);
+ virtual void drawPointer(int index);
+ void enterEntry();
+};
+
+class SplittedArticleBuffer {
+public:
+ SplittedArticleBuffer(const QByteArray& utf8Content, int column, int row = 24);
+ ~SplittedArticleBuffer() {}
+ int count() {return lines_.size();}
+ QByteArray& retriveLine(size_t index) {return lines_[index];}
+private:
+ static int findNextLine(const QString& str, int start, int column);
+ std::vector<QByteArray> lines_;
+};
+
+//TODO: content should be shared.
+//TODO: buffer should be opt-ed.
+class FQTermReadingState : public FQTermUniteState {
+ Q_OBJECT;
+public:
+ FQTermReadingState(FQTermUniteSessionContext* context);
+ ~FQTermReadingState();
+ virtual void initialize();
+ void setFile(const QString& filename);
+ void setReturnState(int state) {returnState_ = state;}
+protected:
+ virtual bool keyReceived(int key);
+private:
+ void drawLines(int count, int yPos);
+ void drawFooter();
+ void adjustLineByDiff(int delta);
+ SplittedArticleBuffer* saBuffer_;
+ QByteArray content_;
+ int currentStartLine_;
+ int returnState_;
+};
+
+
+class FQTermHelpState : public FQTermUniteState, public FQTermUniteMenu {
+ Q_OBJECT;
+public:
+ FQTermHelpState(FQTermUniteSessionContext* context);
+ virtual void initialize();
+protected:
+ virtual bool keyReceived(int key);
+private:
+ virtual void clearPointer(int index);
+ virtual void drawPointer(int index);
+ virtual void enterEntry();
+};
+
+} // namespace FQTerm
+#endif \ No newline at end of file