|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855 |
- /*
- ==============================================================================
-
- This file is part of the JUCE library.
- Copyright (c) 2022 - Raw Material Software Limited
-
- JUCE is an open source library subject to commercial or open-source
- licensing.
-
- By using JUCE, you agree to the terms of both the JUCE 7 End-User License
- Agreement and JUCE Privacy Policy.
-
- End User License Agreement: www.juce.com/juce-7-licence
- Privacy Policy: www.juce.com/juce-privacy-policy
-
- Or: You may also use this code under the terms of the GPL v3 (see
- www.gnu.org/licenses).
-
- JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
- EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
- DISCLAIMED.
-
- ==============================================================================
- */
-
- namespace juce
- {
-
- //==============================================================================
- /**
- An editable text box.
-
- A TextEditor can either be in single- or multi-line mode, and supports mixed
- fonts and colours.
-
- @see TextEditor::Listener, Label
-
- @tags{GUI}
- */
- class JUCE_API TextEditor : public Component,
- public TextInputTarget,
- public SettableTooltipClient
- {
- public:
- //==============================================================================
- /** Creates a new, empty text editor.
-
- @param componentName the name to pass to the component for it to use as its name
- @param passwordCharacter if this is not zero, this character will be used as a replacement
- for all characters that are drawn on screen - e.g. to create
- a password-style textbox containing circular blobs instead of text,
- you could set this value to 0x25cf, which is the unicode character
- for a black splodge (not all fonts include this, though), or 0x2022,
- which is a bullet (probably the best choice for linux).
- */
- explicit TextEditor (const String& componentName = String(),
- juce_wchar passwordCharacter = 0);
-
- /** Destructor. */
- ~TextEditor() override;
-
- //==============================================================================
- /** Puts the editor into either multi- or single-line mode.
-
- By default, the editor will be in single-line mode, so use this if you need a multi-line
- editor.
-
- See also the setReturnKeyStartsNewLine() method, which will also need to be turned
- on if you want a multi-line editor with line-breaks.
-
- @param shouldBeMultiLine whether the editor should be multi- or single-line.
- @param shouldWordWrap sets whether long lines should be broken up in multi-line editors.
- If this is false and scrollbars are enabled a horizontal scrollbar
- will be shown.
-
- @see isMultiLine, setReturnKeyStartsNewLine, setScrollbarsShown
- */
- void setMultiLine (bool shouldBeMultiLine,
- bool shouldWordWrap = true);
-
- /** Returns true if the editor is in multi-line mode. */
- bool isMultiLine() const;
-
- //==============================================================================
- /** Changes the behaviour of the return key.
-
- If set to true, the return key will insert a new-line into the text; if false
- it will trigger a call to the TextEditor::Listener::textEditorReturnKeyPressed()
- method. By default this is set to false, and when true it will only insert
- new-lines when in multi-line mode (see setMultiLine()).
- */
- void setReturnKeyStartsNewLine (bool shouldStartNewLine);
-
- /** Returns the value set by setReturnKeyStartsNewLine().
- See setReturnKeyStartsNewLine() for more info.
- */
- bool getReturnKeyStartsNewLine() const { return returnKeyStartsNewLine; }
-
- /** Indicates whether the tab key should be accepted and used to input a tab character,
- or whether it gets ignored.
-
- By default the tab key is ignored, so that it can be used to switch keyboard focus
- between components.
- */
- void setTabKeyUsedAsCharacter (bool shouldTabKeyBeUsed);
-
- /** Returns true if the tab key is being used for input.
- @see setTabKeyUsedAsCharacter
- */
- bool isTabKeyUsedAsCharacter() const { return tabKeyUsed; }
-
- /** This can be used to change whether escape and return keypress events are
- propagated up to the parent component.
- The default here is true, meaning that these events are not allowed to reach the
- parent, but you may want to allow them through so that they can trigger other
- actions, e.g. closing a dialog box, etc.
- */
- void setEscapeAndReturnKeysConsumed (bool shouldBeConsumed) noexcept;
-
- //==============================================================================
- /** Changes the editor to read-only mode.
-
- By default, the text editor is not read-only. If you're making it read-only, you
- might also want to call setCaretVisible (false) to get rid of the caret.
-
- The text can still be highlighted and copied when in read-only mode.
-
- @see isReadOnly, setCaretVisible
- */
- void setReadOnly (bool shouldBeReadOnly);
-
- /** Returns true if the editor is in read-only mode. */
- bool isReadOnly() const noexcept;
-
- //==============================================================================
- /** Makes the caret visible or invisible.
- By default the caret is visible.
- @see setCaretColour, setCaretPosition
- */
- void setCaretVisible (bool shouldBeVisible);
-
- /** Returns true if the caret is enabled.
- @see setCaretVisible
- */
- bool isCaretVisible() const noexcept { return caretVisible && ! isReadOnly(); }
-
- //==============================================================================
- /** Enables or disables scrollbars (this only applies when in multi-line mode).
-
- When the text gets too long to fit in the component, a scrollbar can appear to
- allow it to be scrolled. Even when this is enabled, the scrollbar will be hidden
- unless it's needed.
-
- By default scrollbars are enabled.
- */
- void setScrollbarsShown (bool shouldBeEnabled);
-
- /** Returns true if scrollbars are enabled.
- @see setScrollbarsShown
- */
- bool areScrollbarsShown() const noexcept { return scrollbarVisible; }
-
- /** Changes the password character used to disguise the text.
-
- @param passwordCharacter if this is not zero, this character will be used as a replacement
- for all characters that are drawn on screen - e.g. to create
- a password-style textbox containing circular blobs instead of text,
- you could set this value to 0x25cf, which is the unicode character
- for a black splodge (not all fonts include this, though), or 0x2022,
- which is a bullet (probably the best choice for linux).
- */
- void setPasswordCharacter (juce_wchar passwordCharacter);
-
- /** Returns the current password character.
- @see setPasswordCharacter
- */
- juce_wchar getPasswordCharacter() const noexcept { return passwordCharacter; }
-
- //==============================================================================
- /** Allows a right-click menu to appear for the editor.
-
- (This defaults to being enabled).
-
- If enabled, right-clicking (or command-clicking on the Mac) will pop up a menu
- of options such as cut/copy/paste, undo/redo, etc.
- */
- void setPopupMenuEnabled (bool menuEnabled);
-
- /** Returns true if the right-click menu is enabled.
- @see setPopupMenuEnabled
- */
- bool isPopupMenuEnabled() const noexcept { return popupMenuEnabled; }
-
- /** Returns true if a popup-menu is currently being displayed. */
- bool isPopupMenuCurrentlyActive() const noexcept { return menuActive; }
-
- //==============================================================================
- /** A set of colour IDs to use to change the colour of various aspects of the editor.
-
- These constants can be used either via the Component::setColour(), or LookAndFeel::setColour()
- methods.
-
- NB: You can also set the caret colour using CaretComponent::caretColourId
-
- @see Component::setColour, Component::findColour, LookAndFeel::setColour, LookAndFeel::findColour
- */
- enum ColourIds
- {
- backgroundColourId = 0x1000200, /**< The colour to use for the text component's background - this can be
- transparent if necessary. */
-
- textColourId = 0x1000201, /**< The colour that will be used when text is added to the editor. Note
- that because the editor can contain multiple colours, calling this
- method won't change the colour of existing text - to do that, use
- the applyColourToAllText() method */
-
- highlightColourId = 0x1000202, /**< The colour with which to fill the background of highlighted sections of
- the text - this can be transparent if you don't want to show any
- highlighting.*/
-
- highlightedTextColourId = 0x1000203, /**< The colour with which to draw the text in highlighted sections. */
-
- outlineColourId = 0x1000205, /**< If this is non-transparent, it will be used to draw a box around
- the edge of the component. */
-
- focusedOutlineColourId = 0x1000206, /**< If this is non-transparent, it will be used to draw a box around
- the edge of the component when it has focus. */
-
- shadowColourId = 0x1000207, /**< If this is non-transparent, it'll be used to draw an inner shadow
- around the edge of the editor. */
- };
-
- //==============================================================================
- /** Sets the font to use for newly added text.
-
- This will change the font that will be used next time any text is added or entered
- into the editor. It won't change the font of any existing text - to do that, use
- applyFontToAllText() instead.
-
- @see applyFontToAllText
- */
- void setFont (const Font& newFont);
-
- /** Applies a font to all the text in the editor.
-
- If the changeCurrentFont argument is true then this will also set the
- new font as the font to be used for any new text that's added.
-
- @see setFont
- */
- void applyFontToAllText (const Font& newFont, bool changeCurrentFont = true);
-
- /** Returns the font that's currently being used for new text.
-
- @see setFont
- */
- const Font& getFont() const noexcept { return currentFont; }
-
- /** Applies a colour to all the text in the editor.
-
- If the changeCurrentTextColour argument is true then this will also set the
- new colour as the colour to be used for any new text that's added.
- */
- void applyColourToAllText (const Colour& newColour, bool changeCurrentTextColour = true);
-
- /** Sets whether whitespace should be underlined when the editor font is underlined.
-
- @see isWhitespaceUnderlined
- */
- void setWhitespaceUnderlined (bool shouldUnderlineWhitespace) noexcept { underlineWhitespace = shouldUnderlineWhitespace; }
-
- /** Returns true if whitespace is underlined for underlined fonts.
-
- @see setWhitespaceIsUnderlined
- */
- bool isWhitespaceUnderlined() const noexcept { return underlineWhitespace; }
-
- //==============================================================================
- /** If set to true, focusing on the editor will highlight all its text.
-
- (Set to false by default).
-
- This is useful for boxes where you expect the user to re-enter all the
- text when they focus on the component, rather than editing what's already there.
- */
- void setSelectAllWhenFocused (bool shouldSelectAll);
-
- /** When the text editor is empty, it can be set to display a message.
-
- This is handy for things like telling the user what to type in the box - the
- string is only displayed, it's not taken to actually be the contents of
- the editor.
- */
- void setTextToShowWhenEmpty (const String& text, Colour colourToUse);
-
- /** Returns the text that will be shown when the text editor is empty.
-
- @see setTextToShowWhenEmpty
- */
- String getTextToShowWhenEmpty() const noexcept { return textToShowWhenEmpty; }
-
- //==============================================================================
- /** Changes the size of the scrollbars that are used.
- Handy if you need smaller scrollbars for a small text box.
- */
- void setScrollBarThickness (int newThicknessPixels);
-
- //==============================================================================
- /**
- Receives callbacks from a TextEditor component when it changes.
-
- @see TextEditor::addListener
- */
- class JUCE_API Listener
- {
- public:
- /** Destructor. */
- virtual ~Listener() = default;
-
- /** Called when the user changes the text in some way. */
- virtual void textEditorTextChanged (TextEditor&) {}
-
- /** Called when the user presses the return key. */
- virtual void textEditorReturnKeyPressed (TextEditor&) {}
-
- /** Called when the user presses the escape key. */
- virtual void textEditorEscapeKeyPressed (TextEditor&) {}
-
- /** Called when the text editor loses focus. */
- virtual void textEditorFocusLost (TextEditor&) {}
- };
-
- /** Registers a listener to be told when things happen to the text.
- @see removeListener
- */
- void addListener (Listener* newListener);
-
- /** Deregisters a listener.
- @see addListener
- */
- void removeListener (Listener* listenerToRemove);
-
- //==============================================================================
- /** You can assign a lambda to this callback object to have it called when the text is changed. */
- std::function<void()> onTextChange;
-
- /** You can assign a lambda to this callback object to have it called when the return key is pressed. */
- std::function<void()> onReturnKey;
-
- /** You can assign a lambda to this callback object to have it called when the escape key is pressed. */
- std::function<void()> onEscapeKey;
-
- /** You can assign a lambda to this callback object to have it called when the editor loses key focus. */
- std::function<void()> onFocusLost;
-
- //==============================================================================
- /** Returns the entire contents of the editor. */
- String getText() const;
-
- /** Returns a section of the contents of the editor. */
- String getTextInRange (const Range<int>& textRange) const override;
-
- /** Returns true if there are no characters in the editor.
- This is far more efficient than calling getText().isEmpty().
- */
- bool isEmpty() const;
-
- /** Sets the entire content of the editor.
-
- This will clear the editor and insert the given text (using the current text colour
- and font). You can set the current text colour using
- @code setColour (TextEditor::textColourId, ...);
- @endcode
-
- @param newText the text to add
- @param sendTextChangeMessage if true, this will cause a change message to
- be sent to all the listeners.
- @see insertTextAtCaret
- */
- void setText (const String& newText,
- bool sendTextChangeMessage = true);
-
- /** Returns a Value object that can be used to get or set the text.
-
- Bear in mind that this operate quite slowly if your text box contains large
- amounts of text, as it needs to dynamically build the string that's involved.
- It's best used for small text boxes.
- */
- Value& getTextValue();
-
- /** Inserts some text at the current caret position.
-
- If a section of the text is highlighted, it will be replaced by
- this string, otherwise it will be inserted.
-
- To delete a section of text, you can use setHighlightedRegion() to
- highlight it, and call insertTextAtCaret (String()).
-
- @see setCaretPosition, getCaretPosition, setHighlightedRegion
- */
- void insertTextAtCaret (const String& textToInsert) override;
-
- /** Deletes all the text from the editor. */
- void clear();
-
- /** Deletes the currently selected region.
- This doesn't copy the deleted section to the clipboard - if you need to do that, call copy() first.
- @see copy, paste, SystemClipboard
- */
- void cut();
-
- /** Copies the currently selected region to the clipboard.
- @see cut, paste, SystemClipboard
- */
- void copy();
-
- /** Pastes the contents of the clipboard into the editor at the caret position.
- @see cut, copy, SystemClipboard
- */
- void paste();
-
- //==============================================================================
- /** Returns the current index of the caret.
- @see setCaretPosition
- */
- int getCaretPosition() const;
-
- /** Moves the caret to be in front of a given character.
- @see getCaretPosition, moveCaretToEnd
- */
- void setCaretPosition (int newIndex);
-
- /** Attempts to scroll the text editor so that the caret ends up at
- a specified position.
-
- This won't affect the caret's position within the text, it tries to scroll
- the entire editor vertically and horizontally so that the caret is sitting
- at the given position (relative to the top-left of this component).
-
- Depending on the amount of text available, it might not be possible to
- scroll far enough for the caret to reach this exact position, but it
- will go as far as it can in that direction.
- */
- void scrollEditorToPositionCaret (int desiredCaretX, int desiredCaretY);
-
- /** Get the graphical position of the caret.
-
- The rectangle returned is relative to the component's top-left corner.
- @see scrollEditorToPositionCaret
- */
- Rectangle<int> getCaretRectangle() override;
-
- /** Selects a section of the text. */
- void setHighlightedRegion (const Range<int>& newSelection) override;
-
- /** Returns the range of characters that are selected.
- If nothing is selected, this will return an empty range.
- @see setHighlightedRegion
- */
- Range<int> getHighlightedRegion() const override { return selection; }
-
- /** Returns the section of text that is currently selected. */
- String getHighlightedText() const;
-
- /** Finds the index of the character at a given position.
- The coordinates are relative to the component's top-left.
- */
- int getTextIndexAt (int x, int y) const;
-
- /** Counts the number of characters in the text.
-
- This is quicker than getting the text as a string if you just need to know
- the length.
- */
- int getTotalNumChars() const;
-
- /** Returns the total width of the text, as it is currently laid-out.
-
- This may be larger than the size of the TextEditor, and can change when
- the TextEditor is resized or the text changes.
- */
- int getTextWidth() const;
-
- /** Returns the maximum height of the text, as it is currently laid-out.
-
- This may be larger than the size of the TextEditor, and can change when
- the TextEditor is resized or the text changes.
- */
- int getTextHeight() const;
-
- /** Changes the size of the gap at the top and left-edge of the editor.
- By default there's a gap of 4 pixels.
- */
- void setIndents (int newLeftIndent, int newTopIndent);
-
- /** Returns the gap at the top edge of the editor.
- @see setIndents
- */
- int getTopIndent() const noexcept { return topIndent; }
-
- /** Returns the gap at the left edge of the editor.
- @see setIndents
- */
- int getLeftIndent() const noexcept { return leftIndent; }
-
- /** Changes the size of border left around the edge of the component.
- @see getBorder
- */
- void setBorder (BorderSize<int> border);
-
- /** Returns the size of border around the edge of the component.
- @see setBorder
- */
- BorderSize<int> getBorder() const;
-
- /** Used to disable the auto-scrolling which keeps the caret visible.
-
- If true (the default), the editor will scroll when the caret moves offscreen. If
- set to false, it won't.
- */
- void setScrollToShowCursor (bool shouldScrollToShowCaret);
-
- /** Modifies the justification of the text within the editor window. */
- void setJustification (Justification newJustification);
-
- /** Returns the type of justification, as set in setJustification(). */
- Justification getJustificationType() const noexcept { return justification; }
-
- /** Sets the line spacing of the TextEditor.
- The default (and minimum) value is 1.0 and values > 1.0 will increase the line spacing as a
- multiple of the line height e.g. for double-spacing call this method with an argument of 2.0.
- */
- void setLineSpacing (float newLineSpacing) noexcept { lineSpacing = jmax (1.0f, newLineSpacing); }
-
- /** Returns the current line spacing of the TextEditor. */
- float getLineSpacing() const noexcept { return lineSpacing; }
-
- /** Returns the bounding box for a range of text in the editor. As the range may span
- multiple lines, this method returns a RectangleList.
-
- The bounds are relative to the component's top-left and may extend beyond the bounds
- of the component if the text is long and word wrapping is disabled.
- */
- RectangleList<int> getTextBounds (Range<int> textRange);
-
- //==============================================================================
- void moveCaretToEnd();
- bool moveCaretLeft (bool moveInWholeWordSteps, bool selecting);
- bool moveCaretRight (bool moveInWholeWordSteps, bool selecting);
- bool moveCaretUp (bool selecting);
- bool moveCaretDown (bool selecting);
- bool pageUp (bool selecting);
- bool pageDown (bool selecting);
- bool scrollDown();
- bool scrollUp();
- bool moveCaretToTop (bool selecting);
- bool moveCaretToStartOfLine (bool selecting);
- bool moveCaretToEnd (bool selecting);
- bool moveCaretToEndOfLine (bool selecting);
- bool deleteBackwards (bool moveInWholeWordSteps);
- bool deleteForwards (bool moveInWholeWordSteps);
- bool copyToClipboard();
- bool cutToClipboard();
- bool pasteFromClipboard();
- bool selectAll();
- bool undo();
- bool redo();
-
- //==============================================================================
- /** This adds the items to the popup menu.
-
- By default it adds the cut/copy/paste items, but you can override this if
- you need to replace these with your own items.
-
- If you want to add your own items to the existing ones, you can override this,
- call the base class's addPopupMenuItems() method, then append your own items.
-
- When the menu has been shown, performPopupMenuAction() will be called to
- perform the item that the user has chosen.
-
- The default menu items will be added using item IDs from the
- StandardApplicationCommandIDs namespace.
-
- If this was triggered by a mouse-click, the mouseClickEvent parameter will be
- a pointer to the info about it, or may be null if the menu is being triggered
- by some other means.
-
- @see performPopupMenuAction, setPopupMenuEnabled, isPopupMenuEnabled
- */
- virtual void addPopupMenuItems (PopupMenu& menuToAddTo,
- const MouseEvent* mouseClickEvent);
-
- /** This is called to perform one of the items that was shown on the popup menu.
-
- If you've overridden addPopupMenuItems(), you should also override this
- to perform the actions that you've added.
-
- If you've overridden addPopupMenuItems() but have still left the default items
- on the menu, remember to call the superclass's performPopupMenuAction()
- so that it can perform the default actions if that's what the user clicked on.
-
- @see addPopupMenuItems, setPopupMenuEnabled, isPopupMenuEnabled
- */
- virtual void performPopupMenuAction (int menuItemID);
-
- //==============================================================================
- /** Base class for input filters that can be applied to a TextEditor to restrict
- the text that can be entered.
- */
- class JUCE_API InputFilter
- {
- public:
- InputFilter() = default;
- virtual ~InputFilter() = default;
-
- /** This method is called whenever text is entered into the editor.
- An implementation of this class should should check the input string,
- and return an edited version of it that should be used.
- */
- virtual String filterNewText (TextEditor&, const String& newInput) = 0;
- };
-
- /** An input filter for a TextEditor that limits the length of text and/or the
- characters that it may contain.
- */
- class JUCE_API LengthAndCharacterRestriction : public InputFilter
- {
- public:
- /** Creates a filter that limits the length of text, and/or the characters that it can contain.
- @param maxNumChars if this is > 0, it sets a maximum length limit; if <= 0, no
- limit is set
- @param allowedCharacters if this is non-empty, then only characters that occur in
- this string are allowed to be entered into the editor.
- */
- LengthAndCharacterRestriction (int maxNumChars, const String& allowedCharacters);
-
- String filterNewText (TextEditor&, const String&) override;
-
- private:
- String allowedCharacters;
- int maxLength;
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LengthAndCharacterRestriction)
- };
-
- /** Sets an input filter that should be applied to this editor.
- The filter can be nullptr, to remove any existing filters.
- If takeOwnership is true, then the filter will be owned and deleted by the editor
- when no longer needed.
- */
- void setInputFilter (InputFilter* newFilter, bool takeOwnership);
-
- /** Returns the current InputFilter, as set by setInputFilter(). */
- InputFilter* getInputFilter() const noexcept { return inputFilter; }
-
- /** Sets limits on the characters that can be entered.
- This is just a shortcut that passes an instance of the LengthAndCharacterRestriction
- class to setInputFilter().
-
- @param maxTextLength if this is > 0, it sets a maximum length limit; if 0, no
- limit is set
- @param allowedCharacters if this is non-empty, then only characters that occur in
- this string are allowed to be entered into the editor.
- */
- void setInputRestrictions (int maxTextLength,
- const String& allowedCharacters = String());
-
- /** Sets the type of virtual keyboard that should be displayed when this editor has
- focus.
- */
- void setKeyboardType (VirtualKeyboardType type) noexcept { keyboardType = type; }
-
- /** Sets the behaviour of mouse/touch interactions outside this component.
-
- If true, then presses outside of the TextEditor will dismiss the virtual keyboard.
- If false, then the virtual keyboard will remain onscreen for as long as the TextEditor has
- keyboard focus.
- */
- void setClicksOutsideDismissVirtualKeyboard (bool);
-
- /** Returns true if the editor is configured to hide the virtual keyboard when the mouse is
- pressed on another component.
- */
- bool getClicksOutsideDismissVirtualKeyboard() const { return clicksOutsideDismissVirtualKeyboard; }
-
- //==============================================================================
- /** This abstract base class is implemented by LookAndFeel classes to provide
- TextEditor drawing functionality.
- */
- struct JUCE_API LookAndFeelMethods
- {
- virtual ~LookAndFeelMethods() = default;
-
- virtual void fillTextEditorBackground (Graphics&, int width, int height, TextEditor&) = 0;
- virtual void drawTextEditorOutline (Graphics&, int width, int height, TextEditor&) = 0;
-
- virtual CaretComponent* createCaretComponent (Component* keyFocusOwner) = 0;
- };
-
- //==============================================================================
- /** @internal */
- void paint (Graphics&) override;
- /** @internal */
- void paintOverChildren (Graphics&) override;
- /** @internal */
- void mouseDown (const MouseEvent&) override;
- /** @internal */
- void mouseUp (const MouseEvent&) override;
- /** @internal */
- void mouseDrag (const MouseEvent&) override;
- /** @internal */
- void mouseDoubleClick (const MouseEvent&) override;
- /** @internal */
- void mouseWheelMove (const MouseEvent&, const MouseWheelDetails&) override;
- /** @internal */
- bool keyPressed (const KeyPress&) override;
- /** @internal */
- bool keyStateChanged (bool) override;
- /** @internal */
- void focusGained (FocusChangeType) override;
- /** @internal */
- void focusLost (FocusChangeType) override;
- /** @internal */
- void resized() override;
- /** @internal */
- void enablementChanged() override;
- /** @internal */
- void lookAndFeelChanged() override;
- /** @internal */
- void parentHierarchyChanged() override;
- /** @internal */
- bool isTextInputActive() const override;
- /** @internal */
- void setTemporaryUnderlining (const Array<Range<int>>&) override;
- /** @internal */
- VirtualKeyboardType getKeyboardType() override { return keyboardType; }
-
- protected:
- //==============================================================================
- /** Scrolls the minimum distance needed to get the caret into view. */
- void scrollToMakeSureCursorIsVisible();
-
- /** Used internally to dispatch a text-change message. */
- void textChanged();
-
- /** Begins a new transaction in the UndoManager. */
- void newTransaction();
-
- /** Can be overridden to intercept return key presses directly */
- virtual void returnPressed();
-
- /** Can be overridden to intercept escape key presses directly */
- virtual void escapePressed();
-
- private:
- //==============================================================================
- JUCE_PUBLIC_IN_DLL_BUILD (class UniformTextSection)
- struct Iterator;
- struct TextHolderComponent;
- struct TextEditorViewport;
- struct InsertAction;
- struct RemoveAction;
- class EditorAccessibilityHandler;
-
- std::unique_ptr<Viewport> viewport;
- TextHolderComponent* textHolder;
- BorderSize<int> borderSize { 1, 1, 1, 3 };
- Justification justification { Justification::topLeft };
-
- bool readOnly = false;
- bool caretVisible = true;
- bool multiline = false;
- bool wordWrap = false;
- bool returnKeyStartsNewLine = false;
- bool popupMenuEnabled = true;
- bool selectAllTextWhenFocused = false;
- bool scrollbarVisible = true;
- bool wasFocused = false;
- bool keepCaretOnScreen = true;
- bool tabKeyUsed = false;
- bool menuActive = false;
- bool valueTextNeedsUpdating = false;
- bool consumeEscAndReturnKeys = true;
- bool underlineWhitespace = true;
- bool mouseDownInEditor = false;
- bool clicksOutsideDismissVirtualKeyboard = false;
-
- UndoManager undoManager;
- std::unique_ptr<CaretComponent> caret;
- Range<int> selection;
- int leftIndent = 4, topIndent = 4;
- unsigned int lastTransactionTime = 0;
- Font currentFont { 14.0f };
- mutable int totalNumChars = 0;
- int caretPosition = 0;
- OwnedArray<UniformTextSection> sections;
- String textToShowWhenEmpty;
- Colour colourForTextWhenEmpty;
- juce_wchar passwordCharacter;
- OptionalScopedPointer<InputFilter> inputFilter;
- Value textValue;
- VirtualKeyboardType keyboardType = TextInputTarget::textKeyboard;
- float lineSpacing = 1.0f;
-
- enum DragType
- {
- notDragging,
- draggingSelectionStart,
- draggingSelectionEnd
- };
-
- DragType dragType = notDragging;
-
- ListenerList<Listener> listeners;
- Array<Range<int>> underlinedSections;
-
- std::unique_ptr<AccessibilityHandler> createAccessibilityHandler() override;
- void moveCaret (int newCaretPos);
- void moveCaretTo (int newPosition, bool isSelecting);
- void recreateCaret();
- void handleCommandMessage (int) override;
- void coalesceSimilarSections();
- void splitSection (int sectionIndex, int charToSplitAt);
- void clearInternal (UndoManager*);
- void insert (const String&, int insertIndex, const Font&, Colour, UndoManager*, int newCaretPos);
- void reinsert (int insertIndex, const OwnedArray<UniformTextSection>&);
- void remove (Range<int>, UndoManager*, int caretPositionToMoveTo);
- void getCharPosition (int index, Point<float>&, float& lineHeight) const;
- Rectangle<float> getCaretRectangleFloat() const;
- void updateCaretPosition();
- void updateValueFromText();
- void textWasChangedByValue();
- int indexAtPosition (float x, float y) const;
- int findWordBreakAfter (int position) const;
- int findWordBreakBefore (int position) const;
- bool moveCaretWithTransaction (int newPos, bool selecting);
- void drawContent (Graphics&);
- void checkLayout();
- int getWordWrapWidth() const;
- int getMaximumTextWidth() const;
- int getMaximumTextHeight() const;
- void timerCallbackInt();
- void checkFocus();
- void repaintText (Range<int>);
- void scrollByLines (int deltaLines);
- bool undoOrRedo (bool shouldUndo);
- UndoManager* getUndoManager() noexcept;
- void setSelection (Range<int>) noexcept;
- Point<int> getTextOffset() const noexcept;
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TextEditor)
- };
-
-
- } // namespace juce
|