JsonEditor.h 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. #pragma once
  2. #include "DataValidator.h"
  3. #include "JSON.h"
  4. #include "Regex.h"
  5. #include "Stack.h"
  6. #include "Text.h"
  7. #include "UIInitialization.h"
  8. #include "Zeichnung.h"
  9. namespace Framework
  10. {
  11. class TextRenderer;
  12. class TextFeld;
  13. namespace JSON
  14. {
  15. enum JsonStructure
  16. {
  17. OBJECT,
  18. ARRAY,
  19. VALUE
  20. };
  21. enum SyntaxErrorType
  22. {
  23. UNEXPECTED_OBJECT_START,
  24. UNEXPECTED_ARRAY_START,
  25. UNEXPECTED_VALUE,
  26. UNEXPECTED_COMMA,
  27. UNEXPECTED_COLON,
  28. UNEXPECTED_END_OF_OBJECT,
  29. UNEXPECTED_END_OF_ARRAY,
  30. UNEXPECTED_START_OF_STRING,
  31. INVALID_VALUE,
  32. OTHER
  33. };
  34. struct ParserState;
  35. class SyntaxError
  36. {
  37. private:
  38. int start;
  39. int end;
  40. SyntaxErrorType errorType;
  41. public:
  42. DLLEXPORT SyntaxError(
  43. int start, int end, SyntaxErrorType errorType);
  44. DLLEXPORT SyntaxError();
  45. DLLEXPORT int getStart() const;
  46. DLLEXPORT int getEnd() const;
  47. DLLEXPORT SyntaxErrorType getErrorType() const;
  48. friend ParserState;
  49. };
  50. struct ParserState
  51. {
  52. int index;
  53. int keyStart;
  54. int keyEnd;
  55. int valueStart;
  56. int valueEnd;
  57. int errorStart;
  58. JsonStructure parent;
  59. bool inString;
  60. bool escaped;
  61. bool colon;
  62. bool key;
  63. bool value;
  64. bool inValue;
  65. bool valueValidationNeeded;
  66. char openingControllChar;
  67. char closingControllChar;
  68. bool valueExpected;
  69. public:
  70. ParserState(JsonStructure parent, bool valueExpected);
  71. bool next(
  72. const char* current, const char* next, SyntaxError& error);
  73. };
  74. class EditableJsonElement : public ReferenceCounter
  75. {
  76. private:
  77. EditableJsonElement* children;
  78. EditableJsonElement* siblings;
  79. EditableJsonElement* lastChild;
  80. EditableJsonElement* parent;
  81. Array<SyntaxError> errors;
  82. Text content;
  83. Text key;
  84. Text value;
  85. int valueStart;
  86. int keyStart;
  87. bool parsed;
  88. char openingControllChar;
  89. char closingControllChar;
  90. JsonStructure parentStructure;
  91. Regex::Automata<char>* valueValidator;
  92. bool hidden;
  93. int newLineCount;
  94. public:
  95. DLLEXPORT EditableJsonElement(
  96. Regex::Automata<char>* valueValidator);
  97. DLLEXPORT EditableJsonElement(
  98. Regex::Automata<char>* valueValidator, const char* content);
  99. DLLEXPORT ~EditableJsonElement();
  100. private:
  101. DLLEXPORT void setContentOnly(const char** content,
  102. int& startPos,
  103. Array<EditableJsonElement*>& afterList,
  104. Array<EditableJsonElement*>& deleteList);
  105. DLLEXPORT void setContentRecursive(const char** content,
  106. int& startPos,
  107. Array<EditableJsonElement*>& afterList,
  108. Array<EditableJsonElement*>& deleteList);
  109. DLLEXPORT void format(int indent, bool insertNewLine);
  110. DLLEXPORT void formatRecursive(int indent, bool insertNewLine);
  111. DLLEXPORT bool isValueValid(
  112. const char* content, int start, int end);
  113. DLLEXPORT void setContent(const char* content,
  114. int& startPos,
  115. Array<EditableJsonElement*>& afterList);
  116. DLLEXPORT void checkSyntax();
  117. public:
  118. DLLEXPORT void setContent(const char* content);
  119. DLLEXPORT void addChildren(EditableJsonElement* content);
  120. DLLEXPORT void setNextSibling(EditableJsonElement* content);
  121. DLLEXPORT void addSibling(EditableJsonElement* content);
  122. DLLEXPORT void format();
  123. DLLEXPORT const Text& getContent();
  124. DLLEXPORT Text getRecursiveContent();
  125. DLLEXPORT int lineCount();
  126. DLLEXPORT bool lineCount(bool includeChildren,
  127. bool includeSiblings,
  128. EditableJsonElement* stop,
  129. int& count);
  130. DLLEXPORT bool isHidden();
  131. DLLEXPORT void setHidden(bool hidden);
  132. DLLEXPORT EditableJsonElement* zParent();
  133. DLLEXPORT EditableJsonElement* zMextSibling();
  134. DLLEXPORT EditableJsonElement* zFirstChildren();
  135. DLLEXPORT EditableJsonElement* zLastChildren();
  136. DLLEXPORT char getOpeningControllChar();
  137. DLLEXPORT char getClosingControllChar();
  138. DLLEXPORT Text& getKey();
  139. DLLEXPORT Text& getValue();
  140. DLLEXPORT void disconnect();
  141. DLLEXPORT void removeChild(EditableJsonElement* zElement);
  142. DLLEXPORT void getWordBounds(int pos, int* left, int* right);
  143. DLLEXPORT bool hasError(int column) const;
  144. DLLEXPORT SyntaxError getError(int column) const;
  145. DLLEXPORT bool hasError() const;
  146. DLLEXPORT void makeVisible();
  147. DLLEXPORT bool isVisible() const;
  148. DLLEXPORT int getIndent() const;
  149. DLLEXPORT int getColor(int index);
  150. DLLEXPORT void removeUntil(
  151. int startIndex, EditableJsonElement* end, int endIndex);
  152. DLLEXPORT EditableJsonElement* zBefore(
  153. EditableJsonElement* zRoot, bool onlyVisible, int* lineCount);
  154. DLLEXPORT EditableJsonElement* zAfter(
  155. bool onlyVisible, int* lineCount);
  156. };
  157. struct EditorPosition
  158. {
  159. EditableJsonElement* line;
  160. int column;
  161. };
  162. enum ScrollTargetPos
  163. {
  164. Top,
  165. Center,
  166. Bottom
  167. };
  168. class JsonEditor : public ZeichnungHintergrund
  169. {
  170. private:
  171. Regex::Automata<char>* valueValidator;
  172. Validator::DataValidator* validator;
  173. EditableJsonElement* content;
  174. EditorPosition renderStart;
  175. int renderStartOffset;
  176. EditorPosition textCursor;
  177. EditorPosition dragStartPos;
  178. EditorPosition selectionStart;
  179. EditorPosition selectionEnd;
  180. EditorPosition lastClickCursorPos;
  181. TextRenderer* textRenderer;
  182. TextFeld* errorDescription;
  183. int renderStartLine;
  184. int renderStopLine;
  185. int lineCount;
  186. Punkt cursorPos;
  187. Punkt pressedPos;
  188. Punkt dragSart;
  189. double timeSicePress;
  190. bool pressed;
  191. double time;
  192. bool drawCursor;
  193. bool drag;
  194. int renderings;
  195. int renderedLines;
  196. double tps;
  197. bool hasSyntaxError;
  198. Critical cs;
  199. UIInit uiInit;
  200. public:
  201. DLLEXPORT JsonEditor(UIInit uiInit);
  202. DLLEXPORT ~JsonEditor();
  203. protected:
  204. //! Verarbeitet Maus Nachrichten
  205. //! \param me Das Ereignis, was durch die Mauseingabe ausgelößt
  206. //! wurde
  207. DLLEXPORT void doMausEreignis(
  208. MausEreignis& me, bool userRet) override;
  209. DLLEXPORT EditorPosition getScreenPosition(int localX, int localY);
  210. DLLEXPORT void deleteSelection();
  211. DLLEXPORT void unifyPosition(EditorPosition& pos);
  212. DLLEXPORT void fixTree(EditableJsonElement* zElement);
  213. public:
  214. DLLEXPORT void setFont(Schrift* schrift);
  215. DLLEXPORT void setFontSize(int size);
  216. DLLEXPORT void setContent(Text content);
  217. DLLEXPORT void setContent(JSONValue* content);
  218. DLLEXPORT void format();
  219. DLLEXPORT void setValidator(Validator::DataValidator* validator);
  220. //! Verarbeitet ein Tastatur Ereignis. Wird vom Framework
  221. //! automatisch aufgerufen \param te Das Ereignis
  222. DLLEXPORT void doTastaturEreignis(TastaturEreignis& te) override;
  223. //! Updated den Zeichenhintergrund
  224. //! \param tickVal Die vergangene Zeit in Sekunden, die seit dem
  225. //! Letzten Aufruf dieser Funktion verstrichen ist \return 1, wenn
  226. //! das Bild neu gezeichnet werden muss. 0 sonnst
  227. DLLEXPORT bool tick(double tickVal) override;
  228. //! Zeichnet den Hintergrund eines Zeichnunges nach rObj
  229. DLLEXPORT void render(Bild& rObj) override;
  230. DLLEXPORT Text getContent();
  231. DLLEXPORT Text getSelectedContent();
  232. DLLEXPORT JSONValue* getValidContent();
  233. DLLEXPORT void scrollToLine(int line, ScrollTargetPos pos);
  234. DLLEXPORT void scrollToLine(
  235. EditorPosition line, ScrollTargetPos pos);
  236. DLLEXPORT void scrollToLine(
  237. int lineNum, EditorPosition target, ScrollTargetPos pos);
  238. };
  239. } // namespace JSON
  240. } // namespace Framework