#pragma once #include "Array.h" #include "Zeichnung.h" namespace Framework { class Schrift; //! Schrift.h class Text; //! Text.h class AlphaFeld; //! AlphaFeld.h class Rahmen; //! Rahmen.h class TextFeld; //! from this file class VScrollBar; //! Scroll.h class HScrollBar; //! Scroll.h class TextRenderer; struct TextStyle { int beginIndex; unsigned char fontSize; int fontColor; int selectedColor; int selectedBackcroundColor; bool underlined; bool selected; int interactParam; unsigned char rendererIndex; DLLEXPORT bool equals(const TextStyle& rhs); }; //! Manages a text field class TextFeld : public ZeichnungHintergrund { public: class TextStyleManager : public virtual ReferenceCounter { protected: RCArray* renderer; Array textStyle; int index; int styleIndex; TextStyle current; Text* text; public: DLLEXPORT TextStyleManager(); DLLEXPORT virtual ~TextStyleManager(); //! Sets the style of a text section //! \param begin The start position of the section //! \param end The end position of the section (not included) DLLEXPORT void setTextStyle(int begin, int end, TextStyle style); //! Removes a text section //! \param begin The index of the first affected character //! \param end The index of the first character after the section DLLEXPORT void removeText(int begin, int end); //! Inserts text at a specific position //! \param pos The position of the new text section //! \param text The new text DLLEXPORT void insertText(int pos, const char* text); //! Removes unneeded identical styles DLLEXPORT void cleanupStyles(); //! Returns a reference to the style object DLLEXPORT TextStyle& currentStyle(); //! Returns the current text renderer DLLEXPORT TextRenderer* zCurrentRenderer(); //! Changes the content of the style object to the style of the //! next character. Returns 0 if there is no next character DLLEXPORT bool nextStyle(); //! Changes the content of the style object to the style of the //! specified character \param index The index of the character //! to jump to. Returns 0 if the character does not exist DLLEXPORT bool stepTo(int index); //! Changes the content of the style object to the style of the //! first character DLLEXPORT void resetIteration(); //! Returns the style of a specific character //! \param index The index of the character DLLEXPORT TextStyle getTextStyle(int index) const; friend TextFeld; }; class Style : public ZeichnungHintergrund::Style { public: //! If this flag is not set, all line breaks are automatically //! removed from the text static const __int64 Mehrzeilig = 0x001000; //! If this flag is set, the text is placed exactly in the //! horizontal center of the field static const __int64 HCenter = 0x002000; //! If this flag is set, the text is placed exactly in the //! vertical center of the field static const __int64 VCenter = 0x004000; //! If this flag is set, the text can be edited by the user static const __int64 Editierbar = 0x2000000; //! Automatically inserts line breaks during rendering so that the //! width of the text field is not exceeded. The text itself is not //! modified. Requires Style Mehrzeilig static const __int64 AutoLineBreak = 0x4000000; //! Combines the flags HCenter and VCenter static const __int64 Center = HCenter | VCenter; //! Combines the flags Sichtbar, Erlaubt, Rahmen, //! Buffered, VCenter static const __int64 TextFeld = Sichtbar | Erlaubt | Rahmen | Buffered | VCenter | Editierbar; //! Combines the flags Sichtbar, //! Mehrzeilig static const __int64 Text = Sichtbar | Mehrzeilig | Erlaubt; //! Combines the flags Sichtbar, Erlaubt, Rahmen, //! Hintergrund, Mehrzeilig, VScroll static const __int64 TextGebiet = Sichtbar | Erlaubt | Rahmen | Hintergrund | Editierbar | Mehrzeilig | VScroll; //! Combines the flags VScroll and HScroll static const __int64 Scroll = VScroll | HScroll; }; private: TextStyleManager* tm; Text* autoLineBreakSpacing; unsigned char showChar; int cpos; double tickVal; bool mausKlick; std::function charEvent; int getTextHeight() const; int getTextWidth() const; //! Processes mouse messages //! \param me The event triggered by the mouse input DLLEXPORT virtual void doMausEreignis( MausEreignis& me, bool userRet) override; public: //! Constructor DLLEXPORT TextFeld(); //! Destructor DLLEXPORT virtual ~TextFeld(); //! charEvent: a function called when the mouse is on a specific //! character and the interactParam in the style is != 0 //! \param charEvent charEvent( charIndex, interactParam, mausEreignis ); DLLEXPORT void setCharEvent( std::function charEvent); //! Sets a pointer to the text in the text field //! \param txt The pointer to the text DLLEXPORT void setTextZ(Text* txt); //! Sets the text of the text field //! \param txt The text DLLEXPORT void setText(Text* txt); //! Sets the text of the text field //! \param txt The text DLLEXPORT void setText(const char* txt); // Sets the text with styles // txt: the text // format: \x1: enables underline // \x2FF: sets the font size for the following text. // FF is a two-digit hex value // \x3AARRGGBB: sets the font color. // AARRGGBB is an 8-digit hex value with two characters // each for alpha, red, green and blue // \x4AARRGGBB: sets the color of the selected text. // AARRGGBB is an 8-digit hex value with two characters // each for alpha, red, green and blue // \x5AARRGGBB: sets the background color of the selected text. // AARRGGBB is an 8-digit hex value with two characters // each for alpha, red, green and blue // \x6FF: sets text renderer index. // FF is a two-digit hex value // \x7: disables underline // \x8FFFFFFFF: set interact param. // FFFFFFFF is an 8-digit hex value DLLEXPORT void setFormattedText(const char* txt); //! Inserts line breaks so that the text does not exceed the width //! of the text field \param spacing A text inserted directly after //! each inserted line break DLLEXPORT void addLineBreaks(const char* spacing = ""); //! Inserts line breaks into the text txt so that the text does not //! exceed the width of the text field \param txt The text to insert //! line breaks into \param spacing A text inserted directly after //! each inserted line break \return The text with line breaks DLLEXPORT Text addLineBreaksToText(const char* txt, const char* spacing = "", bool includeFormat = 1) const; //! Sets a character sequence that is inserted after each line break //! added with the AutoLineBreak style DLLEXPORT void setAutoLineBreakSpacing(const char* spacing); //! Sets the style of a text section //! \param begin The start position of the section //! \param end The end position of the section (not included) DLLEXPORT void setTextStyle(int begin, int end, TextStyle style); //! Appends a line to the text //! \param zeile The new line DLLEXPORT void addZeile(const char* zeile); //! Appends a line to the text //! \param zeile The new line //! \param color The color of the line DLLEXPORT void addZeile(const char* zeile, int color); //! Deselects all text sections DLLEXPORT void deselectAuswahl(); //! Sets the selected text section //! pos1: The cursor position in the text //! pos2: The position in the text up to which the text should be //! colored DLLEXPORT void setAuswahl(int pos1, int pos2); //! Sets the selected text section //! \param auswahl A point with x as cursor position and y as the //! position up to which the text should be colored DLLEXPORT void setAuswahl(Punkt& auswahl); //! Sets the selected text section //! pos1: The cursor position in the text //! pos2: The position in the text up to which the text should be //! colored DLLEXPORT void addAuswahl(int pos1, int pos2); //! Sets the selected text section //! \param auswahl A point with x as cursor position and y as the //! position up to which the text should be colored DLLEXPORT void addAuswahl(Punkt& auswahl); //! Sets the selected text section //! \param begin The cursor position in the text //! \param end The position in the text up to which the text should be //! colored DLLEXPORT void invertAuswahl(int begin, int end); //! Replaces all selected text sections with a text //! \param text The new text DLLEXPORT void replaceAuswahl(const char* text); //! Sets the TextRenderer to use //! \param textRd The text renderer DLLEXPORT void setTextRendererZ(TextRenderer* textRd); //! Adds a TextRenderer //! \param textRd The text renderer DLLEXPORT void addTextRendererZ(TextRenderer* textRd); //! Sets the TextRenderers to use //! \param textRd The text renderers DLLEXPORT void setTextRendererZ(RCArray* textRd); //! Sets a pointer to the font //! \param schrift The font to use for text drawing. DLLEXPORT void setSchriftZ(Schrift* schrift); //! Sets a pointer to the font //! \param rendererIndex The index of the renderer whose font should //! be set \param schrift The font to use for text drawing. DLLEXPORT void setSchriftZ(int rendererIndex, Schrift* schrift); //! Sets the font size (default: 12) //! \param gr The font size to use for text drawing DLLEXPORT void setSchriftSize(unsigned char gr); //! Sets the font size (default: 12) //! \param begin The index of the first affected character //! \param end The index of the first unaffected character //! \param gr The font size to use for text drawing DLLEXPORT void setSchriftSize(int begin, int end, unsigned char gr); //! Sets the font color //! \param fc The color to use for text drawing DLLEXPORT void setSchriftFarbe(int fc); //! Sets the font color //! \param begin The index of the first affected character //! \param end The index of the first unaffected character //! \param fc The color to use for text drawing DLLEXPORT void setSchriftFarbe(int begin, int end, int fc); //! Sets a character to use for drawing, regardless of the text //! field's text (requires drawing flag: Rahmen) //! \param c The character to draw //! Example: setShowChar( '*' ); for password text fields DLLEXPORT void setSchowChar(unsigned char c); //! Scrolls to a specific line (requires drawing flag: VScroll) //! \param zeile The index of the line that should be the top visible line DLLEXPORT void setVScrollZuZeile(int zeile); //! Scrolls to a specific position in the text. Without the Erlaubt //! flag, always scrolls to the bottom. (requires drawing flag: //! VScroll) \param pos The index of the character to scroll to. //! By default scrolls to the cursor position DLLEXPORT void updateVScroll(int pos = -1); //! Scrolls to a specific position in the text. Requires the Erlaubt //! flag. (requires drawing flag: HScroll) \param pos The index of //! the character to scroll to. By default scrolls to the cursor position DLLEXPORT void updateHScroll(int pos = -1); //! Returns the width in pixels needed to fully display the current //! text with the current styles DLLEXPORT int getNeededWidth(); //! Returns the height in pixels needed to fully display the current //! text with the current styles DLLEXPORT int getNeededHeight(); //! Updates the object. Called by the framework //! \param tickVal The time in seconds since the last call of this //! function \return 1 if something changed and the image needs to be //! redrawn. 0 otherwise DLLEXPORT virtual bool tick(double tickval) override; //! Processes keyboard messages //! \param me The event triggered by the keyboard input DLLEXPORT void doTastaturEreignis(TastaturEreignis& te) override; //! Draws the object to zRObj if it is visible //! \param zRObj The image to draw into DLLEXPORT virtual void render(Bild& zRObj) override; //! Returns the text from the text field DLLEXPORT Text* getText() const; //! Returns the text from the text field without increased reference //! counter DLLEXPORT Text* zText() const; //! Returns the font. //! \return 0 if the font was not set DLLEXPORT Schrift* getSchrift() const; //! Returns the font without increased reference counter //! \return 0 if the font was not set DLLEXPORT Schrift* zSchrift() const; //! Returns the font. //! \param rendererIndex The index of the renderer whose font should //! be returned \return 0 if the font was not set DLLEXPORT Schrift* getSchrift(int rendererIndex) const; //! Returns the font without increased reference counter //! \param rendererIndex The index of the renderer whose font should //! be returned \return 0 if the font was not set DLLEXPORT Schrift* zSchrift(int rendererIndex) const; //! Returns the TextRenderer. //! \return 0 if the TextRenderer was not set DLLEXPORT TextRenderer* getTextRenderer() const; //! Returns the TextRenderer without increased reference counter //! \return 0 if the TextRenderer was not set DLLEXPORT TextRenderer* zTextRenderer() const; //! Returns the TextRenderer. //! \param index The index of the renderer to return //! \return 0 if the TextRenderer was not set DLLEXPORT TextRenderer* getTextRenderer(int index) const; //! Returns the TextRenderer without increased reference counter //! \param index The index of the renderer to return //! \return 0 if the TextRenderer was not set DLLEXPORT TextRenderer* zTextRenderer(int index) const; //! Returns the font size DLLEXPORT unsigned char getSchriftSize() const; //! Returns the font size //! \param index The index of the character DLLEXPORT unsigned char getSchriftSize(int index) const; //! Returns the font color in A8R8G8B8 format DLLEXPORT int getSchriftFarbe() const; //! Returns the font color in A8R8G8B8 format //! \param index The index of the character DLLEXPORT int getSchriftFarbe(int index) const; //! Returns the display character DLLEXPORT unsigned char getShowChar() const; //! Returns the cursor position DLLEXPORT int getCursorPos() const; //! Returns 1 if the character is selected //! \param index The index of the character DLLEXPORT bool isCharSelected(int index) const; //! Returns the index of the character located under the mouse //! \param mx The x position of the mouse relative to the text field //! position \param my The y position of the mouse relative to the //! text field position \return -1 if no character is at the position DLLEXPORT int getTextIndexAt(int mx, int my) const; //! Returns the index of the character before which the cursor is //! placed when clicking with the mouse \param mx The x position of //! the mouse relative to the text field position \param my The y //! position of the mouse relative to the text field position DLLEXPORT int getCurserPosAt(int mx, int my) const; //! Returns the style of a specific character //! \param index The index of the character DLLEXPORT TextStyle getTextStyle(int index) const; //! Returns the character sequence inserted after each line break //! when using the AutoLineBreak style DLLEXPORT Text getAutoLineBreakSpacing() const; //! Creates a complete copy of the text field that can be modified //! without affecting the original DLLEXPORT Zeichnung* dublizieren() const override; }; } // namespace Framework