TextFeld.h 19 KB

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