diff options
author | Ansariel <ansariel.hiller@phoenixviewer.com> | 2024-05-22 19:04:52 +0200 |
---|---|---|
committer | Ansariel <ansariel.hiller@phoenixviewer.com> | 2024-05-22 19:04:52 +0200 |
commit | 1b67dd855c41f5a0cda7ec2a68d98071986ca703 (patch) | |
tree | ab243607f74f78200787bba5b9b88f07ef1b966f /indra/llui/lllineeditor.h | |
parent | 6d6eabca44d08d5b97bfe3e941d2b9687c2246ea (diff) | |
parent | e1623bb276f83a43ce7a197e388720c05bdefe61 (diff) |
Merge remote-tracking branch 'origin/main' into DRTVWR-600-maint-A
# Conflicts:
# autobuild.xml
# indra/cmake/CMakeLists.txt
# indra/cmake/GoogleMock.cmake
# indra/llaudio/llaudioengine_fmodstudio.cpp
# indra/llaudio/llaudioengine_fmodstudio.h
# indra/llaudio/lllistener_fmodstudio.cpp
# indra/llaudio/lllistener_fmodstudio.h
# indra/llaudio/llstreamingaudio_fmodstudio.cpp
# indra/llaudio/llstreamingaudio_fmodstudio.h
# indra/llcharacter/llmultigesture.cpp
# indra/llcharacter/llmultigesture.h
# indra/llimage/llimage.cpp
# indra/llimage/llimagepng.cpp
# indra/llimage/llimageworker.cpp
# indra/llimage/tests/llimageworker_test.cpp
# indra/llmessage/tests/llmockhttpclient.h
# indra/llprimitive/llgltfmaterial.h
# indra/llrender/llfontfreetype.cpp
# indra/llui/llcombobox.cpp
# indra/llui/llfolderview.cpp
# indra/llui/llfolderviewmodel.h
# indra/llui/lllineeditor.cpp
# indra/llui/lllineeditor.h
# indra/llui/lltextbase.cpp
# indra/llui/lltextbase.h
# indra/llui/lltexteditor.cpp
# indra/llui/lltextvalidate.cpp
# indra/llui/lltextvalidate.h
# indra/llui/lluictrl.h
# indra/llui/llview.cpp
# indra/llwindow/llwindowmacosx.cpp
# indra/newview/app_settings/settings.xml
# indra/newview/llappearancemgr.cpp
# indra/newview/llappearancemgr.h
# indra/newview/llavatarpropertiesprocessor.cpp
# indra/newview/llavatarpropertiesprocessor.h
# indra/newview/llbreadcrumbview.cpp
# indra/newview/llbreadcrumbview.h
# indra/newview/llbreastmotion.cpp
# indra/newview/llbreastmotion.h
# indra/newview/llconversationmodel.h
# indra/newview/lldensityctrl.cpp
# indra/newview/lldensityctrl.h
# indra/newview/llface.inl
# indra/newview/llfloatereditsky.cpp
# indra/newview/llfloatereditwater.cpp
# indra/newview/llfloateremojipicker.h
# indra/newview/llfloaterimsessiontab.cpp
# indra/newview/llfloaterprofiletexture.cpp
# indra/newview/llfloaterprofiletexture.h
# indra/newview/llgesturemgr.cpp
# indra/newview/llgesturemgr.h
# indra/newview/llimpanel.cpp
# indra/newview/llimpanel.h
# indra/newview/llinventorybridge.cpp
# indra/newview/llinventorybridge.h
# indra/newview/llinventoryclipboard.cpp
# indra/newview/llinventoryclipboard.h
# indra/newview/llinventoryfunctions.cpp
# indra/newview/llinventoryfunctions.h
# indra/newview/llinventorygallery.cpp
# indra/newview/lllistbrowser.cpp
# indra/newview/lllistbrowser.h
# indra/newview/llpanelobjectinventory.cpp
# indra/newview/llpanelprofile.cpp
# indra/newview/llpanelprofile.h
# indra/newview/llpreviewgesture.cpp
# indra/newview/llsavedsettingsglue.cpp
# indra/newview/llsavedsettingsglue.h
# indra/newview/lltooldraganddrop.cpp
# indra/newview/llurllineeditorctrl.cpp
# indra/newview/llvectorperfoptions.cpp
# indra/newview/llvectorperfoptions.h
# indra/newview/llviewerparceloverlay.cpp
# indra/newview/llviewertexlayer.cpp
# indra/newview/llviewertexturelist.cpp
# indra/newview/macmain.h
# indra/test/test.cpp
Diffstat (limited to 'indra/llui/lllineeditor.h')
-rw-r--r-- | indra/llui/lllineeditor.h | 942 |
1 files changed, 472 insertions, 470 deletions
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index afc98af3ab..debc19f7a6 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -1,470 +1,472 @@ -/** - * @file lllineeditor.h - * @brief Text editor widget to let users enter/edit a single line. - * - * Features: - * Text entry of a single line (text, delete, left and right arrow, insert, return). - * Callbacks either on every keystroke or just on the return key. - * Focus (allow multiple text entry widgets) - * Clipboard (cut, copy, and paste) - * Horizontal scrolling to allow strings longer than widget size allows - * Pre-validation (limit which keys can be used) - * Optional line history so previous entries can be recalled by CTRL UP/DOWN - * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#ifndef LL_LLLINEEDITOR_H -#define LL_LLLINEEDITOR_H - -#include "v4color.h" -#include "llframetimer.h" - -#include "lleditmenuhandler.h" -#include "llspellcheckmenuhandler.h" -#include "lluictrl.h" -#include "lluiimage.h" -#include "lluistring.h" -#include "llviewborder.h" - -#include "llpreeditor.h" -#include "lltextvalidate.h" - -class LLFontGL; -class LLLineEditorRollback; -class LLButton; -class LLContextMenu; - -class LLLineEditor -: public LLUICtrl, public LLEditMenuHandler, protected LLPreeditor, public LLSpellCheckMenuHandler -{ -public: - - typedef boost::function<void (LLLineEditor* caller)> keystroke_callback_t; - - struct MaxLength : public LLInitParam::ChoiceBlock<MaxLength> - { - Alternative<S32> bytes, chars; - - MaxLength() : bytes("max_length_bytes", 254), - chars("max_length_chars", 0) - {} - }; - - struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> - { - Optional<std::string> default_text; - Optional<MaxLength> max_length; - Optional<keystroke_callback_t> keystroke_callback; - - Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs> prevalidate_callback; - Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs> prevalidate_input_callback; - - Optional<LLViewBorder::Params> border; - - Optional<LLUIImage*> background_image, - background_image_disabled, - background_image_focused; - - Optional<bool> select_on_focus, - revert_on_esc, - spellcheck, - commit_on_focus_lost, - ignore_tab, - bg_image_always_focused, - show_label_focused, - is_password, - use_bg_color; - - // colors - Optional<LLUIColor> cursor_color, - bg_color, - text_color, - text_readonly_color, - text_tentative_color, - highlight_color, - preedit_bg_color; - - Optional<S32> text_pad_left, - text_pad_right; - - Ignored bg_visible; - - Params(); - }; - - void initFromParams(const LLLineEditor::Params& params); - -protected: - LLLineEditor(const Params&); - friend class LLUICtrlFactory; - friend class LLFloaterEditUI; - void showContextMenu(S32 x, S32 y); - -public: - virtual ~LLLineEditor(); - - // mousehandler overrides - /*virtual*/ bool handleMouseDown(S32 x, S32 y, MASK mask) override; - /*virtual*/ bool handleMouseUp(S32 x, S32 y, MASK mask) override; - /*virtual*/ bool handleHover(S32 x, S32 y, MASK mask) override; - /*virtual*/ bool handleDoubleClick(S32 x,S32 y,MASK mask) override; - /*virtual*/ bool handleMiddleMouseDown(S32 x,S32 y,MASK mask) override; - /*virtual*/ bool handleRightMouseDown(S32 x, S32 y, MASK mask) override; - /*virtual*/ bool handleKeyHere(KEY key, MASK mask) override; - /*virtual*/ bool handleUnicodeCharHere(llwchar uni_char) override; - /*virtual*/ void onMouseCaptureLost() override; - - // LLEditMenuHandler overrides - /*virtual*/ void cut() override; - /*virtual*/ bool canCut() const override; - /*virtual*/ void copy() override; - /*virtual*/ bool canCopy() const override; - /*virtual*/ void paste() override; - /*virtual*/ bool canPaste() const override; - - virtual void updatePrimary(); - virtual void copyPrimary(); - virtual void pastePrimary(); - virtual bool canPastePrimary() const; - - /*virtual*/ void doDelete() override; - /*virtual*/ bool canDoDelete() const override; - - /*virtual*/ void selectAll() override; - /*virtual*/ bool canSelectAll() const override; - - /*virtual*/ void deselect() override; - /*virtual*/ bool canDeselect() const override; - - // LLSpellCheckMenuHandler overrides - /*virtual*/ bool getSpellCheck() const override; - - /*virtual*/ const std::string& getSuggestion(U32 index) const override; - /*virtual*/ U32 getSuggestionCount() const override; - /*virtual*/ void replaceWithSuggestion(U32 index) override; - - /*virtual*/ void addToDictionary() override; - /*virtual*/ bool canAddToDictionary() const override; - - /*virtual*/ void addToIgnore() override; - /*virtual*/ bool canAddToIgnore() const override; - - // Spell checking helper functions - std::string getMisspelledWord(U32 pos) const; - bool isMisspelledWord(U32 pos) const; - void onSpellCheckSettingsChange(); - - // view overrides - /*virtual*/ const std::string getToolTip() const override; - /*virtual*/ void draw() override; - /*virtual*/ void reshape(S32 width, S32 height, bool called_from_parent = true) override; - /*virtual*/ void onFocusReceived() override; - /*virtual*/ void onFocusLost() override; - /*virtual*/ void setEnabled(bool enabled) override; - - // UI control overrides - /*virtual*/ void clear() override; - /*virtual*/ void onTabInto() override; - /*virtual*/ void setFocus(bool b) override; - /*virtual*/ void setRect(const LLRect& rect) override; - /*virtual*/ bool acceptsTextInput() const override; - /*virtual*/ void onCommit() override; - /*virtual*/ bool isDirty() const override; // Returns true if user changed value at all - /*virtual*/ void resetDirty() override; // Clear dirty state - - // assumes UTF8 text - /*virtual*/ void setValue(const LLSD& value) override; - /*virtual*/ LLSD getValue() const override; - /*virtual*/ bool setTextArg(const std::string& key, const LLStringExplicit& text) override; - /*virtual*/ bool setLabelArg(const std::string& key, const LLStringExplicit& text) override; - - void setLabel(const LLStringExplicit &new_label) { mLabel = new_label; } - const std::string& getLabel() { return mLabel.getString(); } - - void setText(const LLStringExplicit &new_text); - - const std::string& getText() const { return mText.getString(); } - LLWString getWText() const { return mText.getWString(); } - LLWString getConvertedText() const; // trimmed text with paragraphs converted to newlines - - S32 getLength() const { return mText.length(); } - - S32 getCursor() const { return mCursorPos; } - void setCursor( S32 pos ); - void setCursorToEnd(); - - // set scroll to earliest position it can reasonable set - void resetScrollPosition(); - - // Selects characters 'start' to 'end'. - void setSelection(S32 start, S32 end); - /*virtual*/ void getSelectionRange(S32 *position, S32 *length) const override; - - void setCommitOnFocusLost( bool b ) { mCommitOnFocusLost = b; } - void setRevertOnEsc( bool b ) { mRevertOnEsc = b; } - void setKeystrokeOnEsc(bool b) { mKeystrokeOnEsc = b; } - - void setCursorColor(const LLColor4& c) { mCursorColor = c; } - const LLColor4& getCursorColor() const { return mCursorColor.get(); } - - void setFgColor( const LLColor4& c ) { mFgColor = c; } - void setReadOnlyFgColor( const LLColor4& c ) { mReadOnlyFgColor = c; } - void setTentativeFgColor(const LLColor4& c) { mTentativeFgColor = c; } - - const LLColor4& getFgColor() const { return mFgColor.get(); } - const LLColor4& getReadOnlyFgColor() const { return mReadOnlyFgColor.get(); } - const LLColor4& getTentativeFgColor() const { return mTentativeFgColor.get(); } - - const LLFontGL* getFont() const { return mGLFont; } - void setFont(const LLFontGL* font); - - void setIgnoreArrowKeys(bool b) { mIgnoreArrowKeys = b; } - void setIgnoreTab(bool b) { mIgnoreTab = b; } - void setPassDelete(bool b) { mPassDelete = b; } - void setDrawAsterixes(bool b); - - // get the cursor position of the beginning/end of the prev/next word in the text - S32 prevWordPos(S32 cursorPos) const; - S32 nextWordPos(S32 cursorPos) const; - - bool hasSelection() const { return (mSelectionStart != mSelectionEnd); } - void startSelection(); - void endSelection(); - void extendSelection(S32 new_cursor_pos); - void deleteSelection(); - - void setSelectAllonFocusReceived(bool b); - void setSelectAllonCommit(bool b) { mSelectAllonCommit = b; } - - void onKeystroke(); - typedef boost::function<void (LLLineEditor* caller, void* user_data)> callback_t; - void setKeystrokeCallback(callback_t callback, void* user_data); - - void setMaxTextLength(S32 max_text_length); - void setMaxTextChars(S32 max_text_chars); - // Manipulate left and right padding for text - void getTextPadding(S32 *left, S32 *right); - void setTextPadding(S32 left, S32 right); - - // Prevalidation controls which keystrokes can affect the editor - void setPrevalidate( LLTextValidate::validate_func_t func ); - // This method sets callback that prevents from: - // - deleting, selecting, typing, cutting, pasting characters that are not valid. - // Also callback that this method sets differs from setPrevalidate in a way that it validates just inputed - // symbols, before existing text is modified, but setPrevalidate validates line after it was modified. - void setPrevalidateInput(LLTextValidate::validate_func_t func); - static bool postvalidateFloat(const std::string &str); - - bool prevalidateInput(const LLWString& wstr); - bool evaluateFloat(); - - // line history support: - void setEnableLineHistory( bool enabled ) { mHaveHistory = enabled; } // switches line history on or off - void updateHistory(); // stores current line in history - - void setReplaceNewlinesWithSpaces(bool replace); - - void resetContextMenu() { setContextMenu(NULL); }; - - void setBgImage(LLPointer<LLUIImage> image) { mBgImage = image; } - void setBgImageFocused(LLPointer<LLUIImage> image) { mBgImageFocused = image; } - - void setShowContextMenu(bool show) { mShowContextMenu = show; } - bool getShowContextMenu() const { return mShowContextMenu; } - - private: - // private helper methods - - void pasteHelper(bool is_primary); - - void removeChar(); - void addChar(const llwchar c); - void setCursorAtLocalPos(S32 local_mouse_x); - S32 findPixelNearestPos(S32 cursor_offset = 0) const; - S32 calcCursorPos(S32 mouse_x); - bool handleSpecialKey(KEY key, MASK mask); - bool handleSelectionKey(KEY key, MASK mask); - bool handleControlKey(KEY key, MASK mask); - S32 handleCommitKey(KEY key, MASK mask); - void updateTextPadding(); - - // Draw the background image depending on enabled/focused state. - void drawBackground(); - - // - // private data members - // - void updateAllowingLanguageInput(); - bool hasPreeditString() const; - // Implementation (overrides) of LLPreeditor - /*virtual*/ void resetPreedit() override; - /*virtual*/ void updatePreedit(const LLWString &preedit_string, - const segment_lengths_t &preedit_segment_lengths, const standouts_t &preedit_standouts, S32 caret_position) override; - /*virtual*/ void markAsPreedit(S32 position, S32 length) override; - /*virtual*/ void getPreeditRange(S32 *position, S32 *length) const override; - /*virtual*/ bool getPreeditLocation(S32 query_position, LLCoordGL *coord, LLRect *bounds, LLRect *control) const override; - /*virtual*/ S32 getPreeditFontSize() const override; - /*virtual*/ LLWString getPreeditString() const override { return getWText(); } - - void setText(const LLStringExplicit &new_text, bool use_size_limit); - - void setContextMenu(LLContextMenu* new_context_menu); - -protected: - LLUIString mText; // The string being edited. - std::string mPrevText; // Saved string for 'ESC' revert - LLUIString mLabel; // text label that is visible when no user text provided - - // line history support: - bool mHaveHistory; // flag for enabled line history - typedef std::vector<std::string> line_history_t; - line_history_t mLineHistory; // line history storage - line_history_t::iterator mCurrentHistoryLine; // currently browsed history line - - LLViewBorder* mBorder; - const LLFontGL* mGLFont; - S32 mMaxLengthBytes; // Max length of the UTF8 string in bytes - S32 mMaxLengthChars; // Maximum number of characters in the string - S32 mCursorPos; // I-beam is just after the mCursorPos-th character. - S32 mScrollHPos; // Horizontal offset from the start of mText. Used for scrolling. - LLFrameTimer mScrollTimer; - S32 mTextPadLeft; // Used to reserve space before the beginning of the text for children. - S32 mTextPadRight; // Used to reserve space after the end of the text for children. - S32 mTextLeftEdge; // Pixels, cached left edge of text based on left padding and width - S32 mTextRightEdge; // Pixels, cached right edge of text based on right padding and width - - bool mCommitOnFocusLost; - bool mRevertOnEsc; - bool mKeystrokeOnEsc; - - keystroke_callback_t mKeystrokeCallback; - - bool mIsSelecting; // Selection for clipboard operations - S32 mSelectionStart; - S32 mSelectionEnd; - S32 mLastSelectionX; - S32 mLastSelectionY; - S32 mLastSelectionStart; - S32 mLastSelectionEnd; - - bool mSpellCheck; - S32 mSpellCheckStart; - S32 mSpellCheckEnd; - LLTimer mSpellCheckTimer; - std::list<std::pair<U32, U32> > mMisspellRanges; - std::vector<std::string> mSuggestionList; - - LLTextValidate::validate_func_t mPrevalidateFunc; - LLTextValidate::validate_func_t mPrevalidateInputFunc; - - LLFrameTimer mKeystrokeTimer; - LLTimer mTripleClickTimer; - - LLUIColor mCursorColor; - LLUIColor mBgColor; - LLUIColor mFgColor; - LLUIColor mReadOnlyFgColor; - LLUIColor mTentativeFgColor; - LLUIColor mHighlightColor; // background for selected text - LLUIColor mPreeditBgColor; // preedit marker background color - - S32 mBorderThickness; - - bool mIgnoreArrowKeys; - bool mIgnoreTab; - bool mDrawAsterixes; - - bool mSelectAllonFocusReceived; - bool mSelectAllonCommit; - bool mPassDelete; - - bool mReadOnly; - - bool mShowImageFocused; - bool mShowLabelFocused; - - bool mUseBgColor; - - LLWString mPreeditWString; - LLWString mPreeditOverwrittenWString; - std::vector<S32> mPreeditPositions; - LLPreeditor::standouts_t mPreeditStandouts; - - LLHandle<LLContextMenu> mContextMenuHandle; - - bool mShowContextMenu; - -private: - // Instances that by default point to the statics but can be overidden in XML. - LLPointer<LLUIImage> mBgImage; - LLPointer<LLUIImage> mBgImageDisabled; - LLPointer<LLUIImage> mBgImageFocused; - - bool mReplaceNewlinesWithSpaces; // if false, will replace pasted newlines with paragraph symbol. - - // private helper class - class LLLineEditorRollback - { - public: - LLLineEditorRollback( LLLineEditor* ed ) - : - mCursorPos( ed->mCursorPos ), - mScrollHPos( ed->mScrollHPos ), - mIsSelecting( ed->mIsSelecting ), - mSelectionStart( ed->mSelectionStart ), - mSelectionEnd( ed->mSelectionEnd ) - { - mText = ed->getText(); - } - - void doRollback( LLLineEditor* ed ) - { - ed->mCursorPos = mCursorPos; - ed->mScrollHPos = mScrollHPos; - ed->mIsSelecting = mIsSelecting; - ed->mSelectionStart = mSelectionStart; - ed->mSelectionEnd = mSelectionEnd; - ed->mText = mText; - ed->mPrevText = mText; - } - - std::string getText() { return mText; } - - private: - std::string mText; - S32 mCursorPos; - S32 mScrollHPos; - bool mIsSelecting; - S32 mSelectionStart; - S32 mSelectionEnd; - }; // end class LLLineEditorRollback - -}; // end class LLLineEditor - -// Build time optimization, generate once in .cpp file -#ifndef LLLINEEDITOR_CPP -extern template class LLLineEditor* LLView::getChild<class LLLineEditor>( - const std::string& name, bool recurse) const; -#endif - -#endif // LL_LINEEDITOR_ +/**
+ * @file lllineeditor.h
+ * @brief Text editor widget to let users enter/edit a single line.
+ *
+ * Features:
+ * Text entry of a single line (text, delete, left and right arrow, insert, return).
+ * Callbacks either on every keystroke or just on the return key.
+ * Focus (allow multiple text entry widgets)
+ * Clipboard (cut, copy, and paste)
+ * Horizontal scrolling to allow strings longer than widget size allows
+ * Pre-validation (limit which keys can be used)
+ * Optional line history so previous entries can be recalled by CTRL UP/DOWN
+ *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLLINEEDITOR_H
+#define LL_LLLINEEDITOR_H
+
+#include "v4color.h"
+#include "llframetimer.h"
+
+#include "lleditmenuhandler.h"
+#include "llspellcheckmenuhandler.h"
+#include "lluictrl.h"
+#include "lluiimage.h"
+#include "lluistring.h"
+#include "llviewborder.h"
+
+#include "llpreeditor.h"
+#include "lltextvalidate.h"
+
+class LLFontGL;
+class LLLineEditorRollback;
+class LLButton;
+class LLContextMenu;
+
+class LLLineEditor
+: public LLUICtrl, public LLEditMenuHandler, protected LLPreeditor, public LLSpellCheckMenuHandler
+{
+public:
+
+ typedef boost::function<void (LLLineEditor* caller)> keystroke_callback_t;
+
+ struct MaxLength : public LLInitParam::ChoiceBlock<MaxLength>
+ {
+ Alternative<S32> bytes, chars;
+
+ MaxLength() : bytes("max_length_bytes", 254),
+ chars("max_length_chars", 0)
+ {}
+ };
+
+ struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
+ {
+ Optional<std::string> default_text;
+ Optional<MaxLength> max_length;
+ Optional<keystroke_callback_t> keystroke_callback;
+
+ Optional<LLTextValidate::Validator, LLTextValidate::Validators> prevalidator;
+ Optional<LLTextValidate::Validator, LLTextValidate::Validators> input_prevalidator;
+
+ Optional<LLViewBorder::Params> border;
+
+ Optional<LLUIImage*> background_image,
+ background_image_disabled,
+ background_image_focused;
+
+ Optional<bool> select_on_focus,
+ revert_on_esc,
+ spellcheck,
+ commit_on_focus_lost,
+ ignore_tab,
+ bg_image_always_focused,
+ show_label_focused,
+ is_password,
+ allow_emoji,
+ use_bg_color;
+
+ // colors
+ Optional<LLUIColor> cursor_color,
+ bg_color,
+ text_color,
+ text_readonly_color,
+ text_tentative_color,
+ highlight_color,
+ preedit_bg_color;
+
+ Optional<S32> text_pad_left,
+ text_pad_right;
+
+ Ignored bg_visible;
+
+ Params();
+ };
+
+ void initFromParams(const LLLineEditor::Params& params);
+
+protected:
+ LLLineEditor(const Params&);
+ friend class LLUICtrlFactory;
+ friend class LLFloaterEditUI;
+ void showContextMenu(S32 x, S32 y);
+
+public:
+ virtual ~LLLineEditor();
+
+ // mousehandler overrides
+ /*virtual*/ bool handleMouseDown(S32 x, S32 y, MASK mask) override;
+ /*virtual*/ bool handleMouseUp(S32 x, S32 y, MASK mask) override;
+ /*virtual*/ bool handleHover(S32 x, S32 y, MASK mask) override;
+ /*virtual*/ bool handleDoubleClick(S32 x,S32 y,MASK mask) override;
+ /*virtual*/ bool handleMiddleMouseDown(S32 x,S32 y,MASK mask) override;
+ /*virtual*/ bool handleRightMouseDown(S32 x, S32 y, MASK mask) override;
+ /*virtual*/ bool handleKeyHere(KEY key, MASK mask) override;
+ /*virtual*/ bool handleUnicodeCharHere(llwchar uni_char) override;
+ /*virtual*/ void onMouseCaptureLost() override;
+
+ // LLEditMenuHandler overrides
+ /*virtual*/ void cut() override;
+ /*virtual*/ bool canCut() const override;
+ /*virtual*/ void copy() override;
+ /*virtual*/ bool canCopy() const override;
+ /*virtual*/ void paste() override;
+ /*virtual*/ bool canPaste() const override;
+
+ virtual void updatePrimary();
+ virtual void copyPrimary();
+ virtual void pastePrimary();
+ virtual bool canPastePrimary() const;
+
+ /*virtual*/ void doDelete() override;
+ /*virtual*/ bool canDoDelete() const override;
+
+ /*virtual*/ void selectAll() override;
+ /*virtual*/ bool canSelectAll() const override;
+
+ /*virtual*/ void deselect() override;
+ /*virtual*/ bool canDeselect() const override;
+
+ // LLSpellCheckMenuHandler overrides
+ /*virtual*/ bool getSpellCheck() const override;
+
+ /*virtual*/ const std::string& getSuggestion(U32 index) const override;
+ /*virtual*/ U32 getSuggestionCount() const override;
+ /*virtual*/ void replaceWithSuggestion(U32 index) override;
+
+ /*virtual*/ void addToDictionary() override;
+ /*virtual*/ bool canAddToDictionary() const override;
+
+ /*virtual*/ void addToIgnore() override;
+ /*virtual*/ bool canAddToIgnore() const override;
+
+ // Spell checking helper functions
+ std::string getMisspelledWord(U32 pos) const;
+ bool isMisspelledWord(U32 pos) const;
+ void onSpellCheckSettingsChange();
+
+ // view overrides
+ /*virtual*/ void draw() override;
+ /*virtual*/ void reshape(S32 width, S32 height, bool called_from_parent = true) override;
+ /*virtual*/ void onFocusReceived() override;
+ /*virtual*/ void onFocusLost() override;
+ /*virtual*/ void setEnabled(bool enabled) override;
+
+ // UI control overrides
+ /*virtual*/ void clear() override;
+ /*virtual*/ void onTabInto() override;
+ /*virtual*/ void setFocus(bool b) override;
+ /*virtual*/ void setRect(const LLRect& rect) override;
+ /*virtual*/ bool acceptsTextInput() const override;
+ /*virtual*/ void onCommit() override;
+ /*virtual*/ bool isDirty() const override; // Returns true if user changed value at all
+ /*virtual*/ void resetDirty() override; // Clear dirty state
+
+ // assumes UTF8 text
+ /*virtual*/ void setValue(const LLSD& value) override;
+ /*virtual*/ LLSD getValue() const override;
+ /*virtual*/ bool setTextArg(const std::string& key, const LLStringExplicit& text) override;
+ /*virtual*/ bool setLabelArg(const std::string& key, const LLStringExplicit& text) override;
+
+ void setLabel(const LLStringExplicit &new_label) { mLabel = new_label; }
+ const std::string& getLabel() { return mLabel.getString(); }
+
+ void setText(const LLStringExplicit &new_text);
+
+ const std::string& getText() const override { return mText.getString(); }
+ LLWString getWText() const { return mText.getWString(); }
+ LLWString getConvertedText() const; // trimmed text with paragraphs converted to newlines
+
+ S32 getLength() const { return mText.length(); }
+
+ S32 getCursor() const { return mCursorPos; }
+ void setCursor( S32 pos );
+ void setCursorToEnd();
+
+ // set scroll to earliest position it can reasonable set
+ void resetScrollPosition();
+
+ // Selects characters 'start' to 'end'.
+ void setSelection(S32 start, S32 end);
+ /*virtual*/ void getSelectionRange(S32 *position, S32 *length) const override;
+
+ void setCommitOnFocusLost( bool b ) { mCommitOnFocusLost = b; }
+ void setRevertOnEsc( bool b ) { mRevertOnEsc = b; }
+ void setKeystrokeOnEsc(bool b) { mKeystrokeOnEsc = b; }
+
+ void setCursorColor(const LLColor4& c) { mCursorColor = c; }
+ const LLColor4& getCursorColor() const { return mCursorColor.get(); }
+
+ void setFgColor( const LLColor4& c ) { mFgColor = c; }
+ void setReadOnlyFgColor( const LLColor4& c ) { mReadOnlyFgColor = c; }
+ void setTentativeFgColor(const LLColor4& c) { mTentativeFgColor = c; }
+
+ const LLColor4& getFgColor() const { return mFgColor.get(); }
+ const LLColor4& getReadOnlyFgColor() const { return mReadOnlyFgColor.get(); }
+ const LLColor4& getTentativeFgColor() const { return mTentativeFgColor.get(); }
+
+ const LLFontGL* getFont() const override { return mGLFont; }
+ void setFont(const LLFontGL* font);
+
+ void setIgnoreArrowKeys(bool b) { mIgnoreArrowKeys = b; }
+ void setIgnoreTab(bool b) { mIgnoreTab = b; }
+ void setPassDelete(bool b) { mPassDelete = b; }
+ void setAllowEmoji(bool b) { mAllowEmoji = b; }
+ void setDrawAsterixes(bool b);
+
+ // get the cursor position of the beginning/end of the prev/next word in the text
+ S32 prevWordPos(S32 cursorPos) const;
+ S32 nextWordPos(S32 cursorPos) const;
+
+ bool hasSelection() const { return (mSelectionStart != mSelectionEnd); }
+ void startSelection();
+ void endSelection();
+ void extendSelection(S32 new_cursor_pos);
+ void deleteSelection();
+
+ void setSelectAllonFocusReceived(bool b);
+ void setSelectAllonCommit(bool b) { mSelectAllonCommit = b; }
+
+ void onKeystroke();
+ typedef boost::function<void (LLLineEditor* caller, void* user_data)> callback_t;
+ void setKeystrokeCallback(callback_t callback, void* user_data);
+
+ void setMaxTextLength(S32 max_text_length);
+ void setMaxTextChars(S32 max_text_chars);
+ // Manipulate left and right padding for text
+ void getTextPadding(S32 *left, S32 *right);
+ void setTextPadding(S32 left, S32 right);
+
+ // Prevalidation controls which keystrokes can affect the editor
+ void setPrevalidate(LLTextValidate::Validator validator);
+ // This method sets callback that prevents from:
+ // - deleting, selecting, typing, cutting, pasting characters that are not valid.
+ // Also callback that this method sets differs from setPrevalidate in a way that it validates just inputed
+ // symbols, before existing text is modified, but setPrevalidate validates line after it was modified.
+ void setPrevalidateInput(LLTextValidate::Validator validator);
+ static bool postvalidateFloat(const std::string &str);
+
+ bool prevalidateInput(const LLWString& wstr);
+ bool evaluateFloat();
+
+ // line history support:
+ void setEnableLineHistory( bool enabled ) { mHaveHistory = enabled; } // switches line history on or off
+ void updateHistory(); // stores current line in history
+
+ void setReplaceNewlinesWithSpaces(bool replace);
+
+ void resetContextMenu() { setContextMenu(NULL); };
+
+ void setBgImage(LLPointer<LLUIImage> image) { mBgImage = image; }
+ void setBgImageFocused(LLPointer<LLUIImage> image) { mBgImageFocused = image; }
+
+ void setShowContextMenu(bool show) { mShowContextMenu = show; }
+ bool getShowContextMenu() const { return mShowContextMenu; }
+
+ private:
+ // private helper methods
+
+ void pasteHelper(bool is_primary);
+
+ void removeChar();
+ void addChar(const llwchar c);
+ void setCursorAtLocalPos(S32 local_mouse_x);
+ S32 findPixelNearestPos(S32 cursor_offset = 0) const;
+ S32 calcCursorPos(S32 mouse_x);
+ bool handleSpecialKey(KEY key, MASK mask);
+ bool handleSelectionKey(KEY key, MASK mask);
+ bool handleControlKey(KEY key, MASK mask);
+ S32 handleCommitKey(KEY key, MASK mask);
+ void updateTextPadding();
+
+ // Draw the background image depending on enabled/focused state.
+ void drawBackground();
+
+ //
+ // private data members
+ //
+ void updateAllowingLanguageInput();
+ bool hasPreeditString() const;
+ // Implementation (overrides) of LLPreeditor
+ /*virtual*/ void resetPreedit() override;
+ /*virtual*/ void updatePreedit(const LLWString &preedit_string,
+ const segment_lengths_t &preedit_segment_lengths, const standouts_t &preedit_standouts, S32 caret_position) override;
+ /*virtual*/ void markAsPreedit(S32 position, S32 length) override;
+ /*virtual*/ void getPreeditRange(S32 *position, S32 *length) const override;
+ /*virtual*/ bool getPreeditLocation(S32 query_position, LLCoordGL *coord, LLRect *bounds, LLRect *control) const override;
+ /*virtual*/ S32 getPreeditFontSize() const override;
+ /*virtual*/ LLWString getPreeditString() const override { return getWText(); }
+
+ void setText(const LLStringExplicit &new_text, bool use_size_limit);
+
+ void setContextMenu(LLContextMenu* new_context_menu);
+
+protected:
+ LLUIString mText; // The string being edited.
+ std::string mPrevText; // Saved string for 'ESC' revert
+ LLUIString mLabel; // text label that is visible when no user text provided
+
+ // line history support:
+ bool mHaveHistory; // flag for enabled line history
+ typedef std::vector<std::string> line_history_t;
+ line_history_t mLineHistory; // line history storage
+ line_history_t::iterator mCurrentHistoryLine; // currently browsed history line
+
+ LLViewBorder* mBorder;
+ const LLFontGL* mGLFont;
+ S32 mMaxLengthBytes; // Max length of the UTF8 string in bytes
+ S32 mMaxLengthChars; // Maximum number of characters in the string
+ S32 mCursorPos; // I-beam is just after the mCursorPos-th character.
+ S32 mScrollHPos; // Horizontal offset from the start of mText. Used for scrolling.
+ LLFrameTimer mScrollTimer;
+ S32 mTextPadLeft; // Used to reserve space before the beginning of the text for children.
+ S32 mTextPadRight; // Used to reserve space after the end of the text for children.
+ S32 mTextLeftEdge; // Pixels, cached left edge of text based on left padding and width
+ S32 mTextRightEdge; // Pixels, cached right edge of text based on right padding and width
+
+ bool mCommitOnFocusLost;
+ bool mRevertOnEsc;
+ bool mKeystrokeOnEsc;
+
+ keystroke_callback_t mKeystrokeCallback;
+
+ bool mIsSelecting; // Selection for clipboard operations
+ S32 mSelectionStart;
+ S32 mSelectionEnd;
+ S32 mLastSelectionX;
+ S32 mLastSelectionY;
+ S32 mLastSelectionStart;
+ S32 mLastSelectionEnd;
+
+ bool mSpellCheck;
+ S32 mSpellCheckStart;
+ S32 mSpellCheckEnd;
+ LLTimer mSpellCheckTimer;
+ std::list<std::pair<U32, U32> > mMisspellRanges;
+ std::vector<std::string> mSuggestionList;
+
+ LLTextValidate::Validator mPrevalidator;
+ LLTextValidate::Validator mInputPrevalidator;
+
+ LLFrameTimer mKeystrokeTimer;
+ LLTimer mTripleClickTimer;
+
+ LLUIColor mCursorColor;
+ LLUIColor mBgColor;
+ LLUIColor mFgColor;
+ LLUIColor mReadOnlyFgColor;
+ LLUIColor mTentativeFgColor;
+ LLUIColor mHighlightColor; // background for selected text
+ LLUIColor mPreeditBgColor; // preedit marker background color
+
+ S32 mBorderThickness;
+
+ bool mIgnoreArrowKeys;
+ bool mIgnoreTab;
+ bool mDrawAsterixes;
+
+ bool mSelectAllonFocusReceived;
+ bool mSelectAllonCommit;
+ bool mPassDelete;
+
+ bool mReadOnly;
+
+ bool mShowImageFocused;
+ bool mShowLabelFocused;
+
+ bool mAllowEmoji;
+ bool mUseBgColor;
+
+ LLWString mPreeditWString;
+ LLWString mPreeditOverwrittenWString;
+ std::vector<S32> mPreeditPositions;
+ LLPreeditor::standouts_t mPreeditStandouts;
+
+ LLHandle<LLContextMenu> mContextMenuHandle;
+
+ bool mShowContextMenu;
+
+private:
+ // Instances that by default point to the statics but can be overidden in XML.
+ LLPointer<LLUIImage> mBgImage;
+ LLPointer<LLUIImage> mBgImageDisabled;
+ LLPointer<LLUIImage> mBgImageFocused;
+
+ bool mReplaceNewlinesWithSpaces; // if false, will replace pasted newlines with paragraph symbol.
+
+ // private helper class
+ class LLLineEditorRollback
+ {
+ public:
+ LLLineEditorRollback( LLLineEditor* ed )
+ :
+ mCursorPos( ed->mCursorPos ),
+ mScrollHPos( ed->mScrollHPos ),
+ mIsSelecting( ed->mIsSelecting ),
+ mSelectionStart( ed->mSelectionStart ),
+ mSelectionEnd( ed->mSelectionEnd )
+ {
+ mText = ed->getText();
+ }
+
+ void doRollback( LLLineEditor* ed )
+ {
+ ed->mCursorPos = mCursorPos;
+ ed->mScrollHPos = mScrollHPos;
+ ed->mIsSelecting = mIsSelecting;
+ ed->mSelectionStart = mSelectionStart;
+ ed->mSelectionEnd = mSelectionEnd;
+ ed->mText = mText;
+ ed->mPrevText = mText;
+ }
+
+ std::string getText() { return mText; }
+
+ private:
+ std::string mText;
+ S32 mCursorPos;
+ S32 mScrollHPos;
+ bool mIsSelecting;
+ S32 mSelectionStart;
+ S32 mSelectionEnd;
+ }; // end class LLLineEditorRollback
+
+}; // end class LLLineEditor
+
+// Build time optimization, generate once in .cpp file
+#ifndef LLLINEEDITOR_CPP
+extern template class LLLineEditor* LLView::getChild<class LLLineEditor>(
+ const std::string& name, bool recurse) const;
+#endif
+
+#endif // LL_LINEEDITOR_
|