TextFeld.h 17 KB

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