TextFeld.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. #ifndef TextFeld_H
  2. #define TextFeld_H
  3. #include "Array.h"
  4. #include "Zeichnung.h"
  5. namespace Framework
  6. {
  7. class Schrift; //! Schrift.h
  8. class Text; //! Text.h
  9. class AlphaFeld; //! AlphaFeld.h
  10. class Rahmen; //! Rahmen.h
  11. class TextFeld; //! aus dieser Datei
  12. class VScrollBar; //! Scroll.h
  13. class HScrollBar; //! Scroll.h
  14. class TextRenderer;
  15. //! Verwaltet ein Textfeld
  16. class TextFeld : public ZeichnungHintergrund
  17. {
  18. public:
  19. struct TextStyle
  20. {
  21. int beginIndex;
  22. unsigned char fontSize;
  23. int fontColor;
  24. int selectedColor;
  25. int selectedBackcroundColor;
  26. bool underlined;
  27. bool selected;
  28. int interactParam;
  29. unsigned char rendererIndex;
  30. DLLEXPORT bool operator==(const TextStyle& rhs);
  31. };
  32. class TextStyleManager : public virtual ReferenceCounter
  33. {
  34. protected:
  35. RCArray<TextRenderer>* renderer;
  36. Array<TextStyle> textStyle;
  37. int index;
  38. int styleIndex;
  39. TextStyle current;
  40. Text* text;
  41. public:
  42. DLLEXPORT TextStyleManager();
  43. DLLEXPORT virtual ~TextStyleManager();
  44. //! Setzt den Style eines Textabschnittes
  45. //! \param begin die startposition des Abschnittes
  46. //! \param end die endposition des Abschnittes (nicht enthalten)
  47. DLLEXPORT void setTextStyle(int begin, int end, TextStyle style);
  48. //! Entfernt einen Textabschnitt
  49. //! \param begin der index des ersten betroffenen zeichens
  50. //! \param end der index des ersten zeichens nach dem abschnitt
  51. DLLEXPORT void removeText(int begin, int end);
  52. //! Fügt ein Text an einer bestimmten Position ein
  53. //! \param pos die position des neuen Textausschnitts
  54. //! \param text der neue Text
  55. DLLEXPORT void insertText(int pos, const char* text);
  56. //! Entfernt nicht benötiegte gleiche styles
  57. DLLEXPORT void cleanupStyles();
  58. //! gibt eine referenz auf das style objekt zurück
  59. DLLEXPORT TextStyle& currentStyle();
  60. //! gibt den aktuellen text renderer zurück
  61. DLLEXPORT TextRenderer* zCurrentRenderer();
  62. //! ändert den inhalt des style objektes auf den style des nächsten
  63. //! zeichens
  64. //! gibt 0 zurück falls es kein weiteres zeichen gibt
  65. DLLEXPORT bool nextStyle();
  66. //! ändert den inhalt des style objektes auf den style des
  67. //! angegebenen zeichens \param index der Index des Zeichens zu dem
  68. //! gesprungen werden soll
  69. //! gibt 0 zurück falls es das zeichen nicht gibt
  70. DLLEXPORT bool stepTo(int index);
  71. //! ändert den inhalt des style objektes auf den style des ersten
  72. //! zeichens
  73. DLLEXPORT void resetIteration();
  74. //! Gibt den Style eines bestimmten zeichens zurück
  75. //! \param index Der index des Zeichens
  76. DLLEXPORT TextStyle getTextStyle(int index) const;
  77. friend TextFeld;
  78. };
  79. class Style : public ZeichnungHintergrund::Style
  80. {
  81. public:
  82. static const __int64 Mehrzeilig
  83. = 0x001000; //! Wenn dieser Flag nicht gesetzt wird, werden alle
  84. //! Zeilenumbrüche automatisch aus dem Text entfernt
  85. static const __int64 HCenter
  86. = 0x002000; //! Wenn dieser Flag gesetzt wird, wird der Text
  87. //! genau in der horizontaen Mitte des Feldes
  88. //! plaziert
  89. static const __int64 VCenter
  90. = 0x004000; //! Wenn dieser Flag gesetzt wird, wird der Text
  91. //! genau in der vertikalen Mitte des Feldes
  92. //! plaziert
  93. static const __int64 Editierbar
  94. = 0x2000000; //! Wenn dieser Flag gesetzt wird, kann der Text
  95. //! durch den Nutzer bearbeitet werden
  96. static const __int64 Center
  97. = HCenter | VCenter; //! Vereint die Flags HCenter und VCenter
  98. static const __int64 TextFeld
  99. = Sichtbar | Erlaubt | Rahmen | Buffered | VCenter
  100. | Editierbar; //! Vereint die Flags Sichtbar, Erlaubt, Rahmen,
  101. //! Buffered, VCenter
  102. static const __int64 Text = Sichtbar | Mehrzeilig
  103. | Erlaubt; //! Vereint die Flags Sichtbar,
  104. //! Mehrfarbig, Mehrzeilig
  105. static const __int64 TextGebiet
  106. = Sichtbar | Erlaubt | Rahmen | Hintergrund | Editierbar
  107. | Mehrzeilig
  108. | VScroll; //! Vereint die Flags Sichtbar, Erlaubt, Rahmen,
  109. //! Hintergrund, Mehrzeilig, Mehrfarbig, VScroll
  110. static const __int64 Scroll
  111. = VScroll | HScroll; //! Vereint die Flags VScroll und HScroll
  112. };
  113. private:
  114. TextStyleManager* tm;
  115. unsigned char showChar;
  116. int cpos;
  117. double tickVal;
  118. bool mausKlick;
  119. std::function<void(int, int, MausEreignis me)> charEvent;
  120. int getTextHeight() const;
  121. int getTextWidth() const;
  122. //! Verarbeitet Maus Nachrichten
  123. //! \param me Das Ereignis, was durch die Mauseingabe ausgelößt wurde
  124. DLLEXPORT virtual void doMausEreignis(
  125. MausEreignis& me, bool userRet) override;
  126. public:
  127. //! Konstruktor
  128. DLLEXPORT TextFeld();
  129. //! Destruktor
  130. DLLEXPORT virtual ~TextFeld();
  131. //! charEvent: eine funktion die aufgerufen wird, wenn sich die maus auf
  132. //! einem bestimmten zeichen befindet und der interactParam im style !=
  133. //! 0 ist \param aufruf charEvent( charIndex, interactParam,
  134. //! mausEreignis );
  135. DLLEXPORT void setCharEvent(
  136. std::function<void(int, int, MausEreignis me)> charEvent);
  137. //! setzt einen Zeiger auf den Text im Textfeld
  138. //! \param txt Der Zeiger auf den Text
  139. DLLEXPORT void setTextZ(Text* txt);
  140. //! setzt den Text des Textfeldes
  141. //! \param txt der Text
  142. DLLEXPORT void setText(Text* txt);
  143. //! setzt den Text des Textfeldes
  144. //! \param txt der Text
  145. DLLEXPORT void setText(const char* txt);
  146. //! setzt den Text mit styles
  147. //! \param txt der Text
  148. //! \param format
  149. //! - \\x1: aktiviert unterschtrich
  150. //! - \\x2\\xY: setzt die schriftgröße auf y für den
  151. //! folgenden text
  152. //! - \\x3\\xA\\xR\\xG\\xB: setzt die schriftfarbe auf
  153. //! ARGB
  154. //! - \\x4\\xA\\xR\\xG\\xB: setzt die farbe des
  155. //! ausgewählten textes
  156. //! - \\x5\\xA\\xR\\xG\\xB: setzt die hintergrundfarbe des
  157. //! ausgewählten textes
  158. //! - \\x6\\xY: setzt text renderer index auf y
  159. //! - \\x7: deaktiviert unterschtrich
  160. //! - \\x8\\xA\\xB\\xC\\xD: set interact param to ABCD
  161. DLLEXPORT void setFormattedText(const char* txt);
  162. //! fügt zeilenumbrüche so ein, dass der text nicht die breite des
  163. //! textfeldes überschreitet \param spacing ein text, der direkt nach
  164. //! jedem eingefügten Zeilenumbruch eingefügt wird
  165. DLLEXPORT void addLineBreaks(const char* spacing = "");
  166. //! Setzt den Style eines Textabschnittes
  167. //! \param begin die startposition des Abschnittes
  168. //! \param end die endposition des Abschnittes (nicht enthalten)
  169. DLLEXPORT void setTextStyle(int begin, int end, TextStyle style);
  170. //! Fügt eine Zeile an den Text an
  171. //! \param zeile Die neue Zeile
  172. DLLEXPORT void addZeile(const char* zeile);
  173. //! Fügt eine Zeile an den Text an
  174. //! \param zeile Die neue Zeile
  175. //! \param color Die Farbe der Zeile
  176. DLLEXPORT void addZeile(const char* zeile, int color);
  177. //! Deselectiert alle textabschnitte
  178. DLLEXPORT void deselectAuswahl();
  179. //! Setzt den ausgewählten textabschnitt fest
  180. //! pos1: Die Cursorposition im Text
  181. //! pos2: Die Position im Text, bis zu der der Text eingefärbt werden
  182. //! soll
  183. DLLEXPORT void setAuswahl(int pos1, int pos2);
  184. //! Setzt den ausgewählten textabschnitt fest
  185. //! \param auswahl Ein punkt mit x als Cursorposition und y als der
  186. //! Position, bis zu der der Text eingefärbt werden soll
  187. DLLEXPORT void setAuswahl(Punkt& auswahl);
  188. //! Setzt den ausgewählten textabschnitt fest
  189. //! pos1: Die Cursorposition im Text
  190. //! pos2: Die Position im Text, bis zu der der Text eingefärbt werden
  191. //! soll
  192. DLLEXPORT void addAuswahl(int pos1, int pos2);
  193. //! Setzt den ausgewählten textabschnitt fest
  194. //! \param auswahl Ein punkt mit x als Cursorposition und y als der
  195. //! Position, bis zu der der Text eingefärbt werden soll
  196. DLLEXPORT void addAuswahl(Punkt& auswahl);
  197. //! Setzt den ausgewählten textabschnitt fest
  198. //! \param begin Die Cursorposition im Text
  199. //! \param end Die Position im Text, bis zu der der Text eingefärbt
  200. //! werden soll
  201. DLLEXPORT void invertAuswahl(int begin, int end);
  202. //! ersetzt alle ausgewählten Textabschnitte mit einem text
  203. //! \param text der neue Text
  204. DLLEXPORT void replaceAuswahl(const char* text);
  205. //! Setzt den verwendeten TextRenderer
  206. //! \param textRd Der Textrenderer
  207. DLLEXPORT void setTextRendererZ(TextRenderer* textRd);
  208. //! Fügt einen TextRenderer hinzu
  209. //! \param textRd Der Textrenderer
  210. DLLEXPORT void addTextRendererZ(TextRenderer* textRd);
  211. //! Setzt die verwendeten TextRenderer
  212. //! \param textRd Die Textrenderer
  213. DLLEXPORT void setTextRendererZ(RCArray<TextRenderer>* textRd);
  214. //! Setzt einen Zeiger zur Schrift
  215. //! \param schrift Die Schrift, die zum Textzeichnen verwendet werden
  216. //! soll.
  217. DLLEXPORT void setSchriftZ(Schrift* schrift);
  218. //! Setzt einen Zeiger zur Schrift
  219. //! \param rendererIndex Der Index des Renderers dessen Schrift gesetzt
  220. //! werden soll \param schrift Die Schrift, die zum Textzeichnen
  221. //! verwendet werden soll.
  222. DLLEXPORT void setSchriftZ(int rendererIndex, Schrift* schrift);
  223. //! Setzt die Schriftgröße (Standart: 12)
  224. //! \param gr Die Schriftgröße, die zum Textzeichnen verwendet werden
  225. //! soll
  226. DLLEXPORT void setSchriftSize(unsigned char gr);
  227. //! Setzt die Schriftgröße (Standart: 12)
  228. //! \param begin Der Index des ersten betroffenen Zeichens
  229. //! \param end Der Index des ersten nicht betroffenen Zeichens
  230. //! \param gr Die Schriftgröße, die zum Textzeichnen verwendet werden
  231. //! soll
  232. DLLEXPORT void setSchriftSize(int begin, int end, unsigned char gr);
  233. //! Setzt die Schrift Farbe
  234. //! \param fc Die Farbe, die zum Textzeichnen verwendet werden soll
  235. DLLEXPORT void setSchriftFarbe(int fc);
  236. //! Setzt die Schrift Farbe
  237. //! \param begin Der Index des ersten betroffenen Zeichens
  238. //! \param end Der Index des ersten nicht betroffenen Zeichens
  239. //! \param fc Die Farbe, die zum Textzeichnen verwendet werden soll
  240. DLLEXPORT void setSchriftFarbe(int begin, int end, int fc);
  241. //! Legt einen Buchstaben fest, der zum zeichnen verwendet werden soll,
  242. //! unabhängig vom Text des Textfeldes (benötigt Flag zum Zeichnen:
  243. //! Rahmen) \param c Der Buchstabe, der gezeichnet werden soll Beispiel:
  244. //! setShowChar( '*' ); Bei Passwort Textfeldern
  245. DLLEXPORT void setSchowChar(unsigned char c);
  246. //! Scrollt zu einer bestimmten Zeile (benötigt Flag zum Zeichnen:
  247. //! VScroll) \param zeile Der Index der Zeile, die als oberste Zeile zu
  248. //! sehen sein soll
  249. DLLEXPORT void setVScrollZuZeile(int zeile);
  250. //! Scrollt zu einer bestimmten Position im Text. Ohne den Flag Erlaubt
  251. //! wrd immer ganz nach unten gescrollt. (benötigt Flag zum Zeichnen:
  252. //! VScroll) \param pos Der Index des Zeichens, zu dem gescrollt werden
  253. //! soll. Standartmäßig wird zur Cursorposition gescrollt
  254. DLLEXPORT void updateVScroll(int pos = -1);
  255. //! Scrollt zu einer bestimmten Position im Text. Benötigt den Flag
  256. //! Erlaubt. (benötigt Flag zum Zeichnen: HScroll) \param pos Der Index
  257. //! des Zeichens, zu dem gescrollt werden soll. Standartmäßig wird zur
  258. //! Cursorposition gescrollt
  259. DLLEXPORT void updateHScroll(int pos = -1);
  260. //! Gibt die breite in pixeln zurück, die benötigt wird um den aktuellen
  261. //! text mit den aktuellen styles voll anzuzeigen
  262. DLLEXPORT int getNeededWidth();
  263. //! Gibt die höhe in pixeln zurück, die benötigt wird um den aktuellen
  264. //! text mit den aktuellen styles voll anzuzeigen
  265. DLLEXPORT int getNeededHeight();
  266. //! Aktualisiert das Objekt. Wird vom Framework aufgerufen
  267. //! \param tickVal Die Zeit in sekunden, die seit dem lezten Aufruf
  268. //! dieser Funktion vergangen ist \return 1, wenn sich etwas verändert
  269. //! hat und das Bild neu gezeichnet werden muss. 0 sonst
  270. DLLEXPORT virtual bool tick(double tickval) override;
  271. //! Verarbeitet Tastatur Nachrichten
  272. //! \param me Das Ereignis, was durch die Tastatureingabe ausgelößt
  273. //! wurde
  274. DLLEXPORT void doTastaturEreignis(TastaturEreignis& te) override;
  275. //! Zeichnet das Objekt nach zRObj, falls es sichtbar ist
  276. //! \param zRObj Das Bild, in welches gezeichnet werden soll
  277. DLLEXPORT virtual void render(Bild& zRObj) override;
  278. //! Gibt den Text aus dem Textfeld zurück
  279. DLLEXPORT Text* getText() const;
  280. //! Gibt den Text aus dem Textfeld ohne erhöhten Reference Counter
  281. //! zurück
  282. DLLEXPORT Text* zText() const;
  283. //! Gibt die Schrift zurück.
  284. //! \return 0, falls die Schrift nicht gesetzt wurde
  285. DLLEXPORT Schrift* getSchrift() const;
  286. //! Gibt die Schrift ohne erhöhten Reference Counter zurük
  287. //! \return 0, falls die Schrift nicht gesetzt wurde
  288. DLLEXPORT Schrift* zSchrift() const;
  289. //! Gibt die Schrift zurück.
  290. //! \param rendererIndex Der Index des Renderers dessen Schrift
  291. //! zurückgegeben werden soll \return 0, falls die Schrift nicht gesetzt
  292. //! wurde
  293. DLLEXPORT Schrift* getSchrift(int rendererIndex) const;
  294. //! Gibt die Schrift ohne erhöhten Reference Counter zurük
  295. //! \param rendererIndex Der Index des Renderers dessen Schrift
  296. //! zurückgegeben werden soll \return 0, falls die Schrift nicht gesetzt
  297. //! wurde
  298. DLLEXPORT Schrift* zSchrift(int rendererIndex) const;
  299. //! Gibt den TextRenderer zurück.
  300. //! \return 0, falls der TextRenderer nicht gesetzt wurde
  301. DLLEXPORT TextRenderer* getTextRenderer() const;
  302. //! Gibt dien TextRenderer ohne erhöhten Reference Counter zurük
  303. //! \return 0, falls der TextRenderer nicht gesetzt wurde
  304. DLLEXPORT TextRenderer* zTextRenderer() const;
  305. //! Gibt den TextRenderer zurück.
  306. //! \param index Der Index des Renderers der zurückgegeben werden soll
  307. //! \return 0, falls der TextRenderer nicht gesetzt wurde
  308. DLLEXPORT TextRenderer* getTextRenderer(int index) const;
  309. //! Gibt dien TextRenderer ohne erhöhten Reference Counter zurük
  310. //! \param index Der Index des Renderers der zurückgegeben werden soll
  311. //! \return 0, falls der TextRenderer nicht gesetzt wurde
  312. DLLEXPORT TextRenderer* zTextRenderer(int index) const;
  313. //! Gibt die Schriftgröße zurück
  314. DLLEXPORT unsigned char getSchriftSize() const;
  315. //! Gibt die Schriftgröße zurück
  316. //! \param index Der Index des Zeichens
  317. DLLEXPORT unsigned char getSchriftSize(int index) const;
  318. //! Gibt die Schriftfarbe im A8R8G8B8 Format zurück
  319. DLLEXPORT int getSchriftFarbe() const;
  320. //! Gibt die Schriftfarbe im A8R8G8B8 Format zurück
  321. //! \param index Der Index des Zeichens
  322. DLLEXPORT int getSchriftFarbe(int index) const;
  323. //! Gibt den Anzeigebuchstabe zurück
  324. DLLEXPORT unsigned char getShowChar() const;
  325. //! Gibt die Cursorposition zurück
  326. DLLEXPORT int getCursorPos() const;
  327. //! Gibt 1 zurück wenn das Zeichen ausgewählt ist
  328. //! \param index Der Index des Zeichens
  329. DLLEXPORT bool isCharSelected(int index) const;
  330. //! Gibt den Index des Zeichens zurück, das sich unter der Maus befindet
  331. //! \param mx die x position der maus relativ zur position des
  332. //! textfeldes \param my die y position der maus relativ zut position
  333. //! des textfeldes \return -1, falls sich an der Position kein zeichen
  334. //! befindet
  335. DLLEXPORT int getTextIndexAt(int mx, int my) const;
  336. //! Gibt den Index des Zeichens zurück, vor dem der curser gesetzt wird,
  337. //! wenn mit der maus geklickt wird \param mx die x position der maus
  338. //! relativ zur position des textfeldes \param my die y position der
  339. //! maus relativ zut position des textfeldes
  340. DLLEXPORT int getCurserPosAt(int mx, int my) const;
  341. //! Gibt den Style eines bestimmten zeichens zurück
  342. //! \param index Der index des Zeichensf
  343. DLLEXPORT TextStyle getTextStyle(int index) const;
  344. //! Erzeugt eine Komplette Kopie des Textfeldes, welches ohne
  345. //! auswirkungen verändert werden kann
  346. DLLEXPORT Zeichnung* dublizieren() const override;
  347. };
  348. } // namespace Framework
  349. #endif