lllineeditor.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:13k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lllineeditor.h
  3.  * @brief Text editor widget to let users enter/edit a single line.
  4.  *
  5.  * Features: 
  6.  * Text entry of a single line (text, delete, left and right arrow, insert, return).
  7.  * Callbacks either on every keystroke or just on the return key.
  8.  * Focus (allow multiple text entry widgets)
  9.  * Clipboard (cut, copy, and paste)
  10.  * Horizontal scrolling to allow strings longer than widget size allows 
  11.  * Pre-validation (limit which keys can be used)
  12.  * Optional line history so previous entries can be recalled by CTRL UP/DOWN
  13.  *
  14.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  15.  * 
  16.  * Copyright (c) 2001-2010, Linden Research, Inc.
  17.  * 
  18.  * Second Life Viewer Source Code
  19.  * The source code in this file ("Source Code") is provided by Linden Lab
  20.  * to you under the terms of the GNU General Public License, version 2.0
  21.  * ("GPL"), unless you have obtained a separate licensing agreement
  22.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  23.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  24.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  25.  * 
  26.  * There are special exceptions to the terms and conditions of the GPL as
  27.  * it is applied to this Source Code. View the full text of the exception
  28.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  29.  * online at
  30.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  31.  * 
  32.  * By copying, modifying or distributing this software, you acknowledge
  33.  * that you have read and understood your obligations described above,
  34.  * and agree to abide by those obligations.
  35.  * 
  36.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  37.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  38.  * COMPLETENESS OR PERFORMANCE.
  39.  * $/LicenseInfo$
  40.  */
  41. #ifndef LL_LLLINEEDITOR_H
  42. #define LL_LLLINEEDITOR_H
  43. #include "v4color.h"
  44. #include "llframetimer.h"
  45. #include "lleditmenuhandler.h"
  46. #include "lluictrl.h"
  47. #include "lluistring.h"
  48. #include "llviewborder.h"
  49. #include "llpreeditor.h"
  50. #include "lltextvalidate.h"
  51. class LLFontGL;
  52. class LLLineEditorRollback;
  53. class LLButton;
  54. class LLContextMenu;
  55. class LLLineEditor
  56. : public LLUICtrl, public LLEditMenuHandler, protected LLPreeditor
  57. {
  58. public:
  59. typedef boost::function<void (LLLineEditor* caller)> keystroke_callback_t;
  60. struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
  61. {
  62. Optional<std::string> default_text;
  63. Optional<S32> max_length_bytes;
  64. Optional<keystroke_callback_t> keystroke_callback;
  65. Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs> prevalidate_callback;
  66. Optional<LLViewBorder::Params> border;
  67. Optional<LLUIImage*> background_image,
  68. background_image_disabled,
  69. background_image_focused;
  70. Optional<bool> select_on_focus,
  71. handle_edit_keys_directly,
  72. revert_on_esc,
  73. commit_on_focus_lost,
  74. ignore_tab;
  75. // colors
  76. Optional<LLUIColor> cursor_color,
  77. text_color,
  78. text_readonly_color,
  79. text_tentative_color,
  80. highlight_color,
  81. preedit_bg_color;
  82. Optional<S32> text_pad_left,
  83. text_pad_right;
  84. Ignored bg_visible;
  85. Params();
  86. };
  87. protected:
  88. LLLineEditor(const Params&);
  89. friend class LLUICtrlFactory;
  90. friend class LLFloaterEditUI;
  91. void showContextMenu(S32 x, S32 y);
  92. public:
  93. virtual ~LLLineEditor();
  94. // mousehandler overrides
  95. /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
  96. /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
  97. /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
  98. /*virtual*/ BOOL handleDoubleClick(S32 x,S32 y,MASK mask);
  99. /*virtual*/ BOOL handleMiddleMouseDown(S32 x,S32 y,MASK mask);
  100. /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
  101. /*virtual*/ BOOL handleKeyHere(KEY key, MASK mask );
  102. /*virtual*/ BOOL handleUnicodeCharHere(llwchar uni_char);
  103. /*virtual*/ void onMouseCaptureLost();
  104. // LLEditMenuHandler overrides
  105. virtual void cut();
  106. virtual BOOL canCut() const;
  107. virtual void copy();
  108. virtual BOOL canCopy() const;
  109. virtual void paste();
  110. virtual BOOL canPaste() const;
  111. virtual void updatePrimary();
  112. virtual void copyPrimary();
  113.   virtual void pastePrimary();
  114. virtual BOOL canPastePrimary() const;
  115. virtual void doDelete();
  116. virtual BOOL canDoDelete() const;
  117. virtual void selectAll();
  118. virtual BOOL canSelectAll() const;
  119. virtual void deselect();
  120. virtual BOOL canDeselect() const;
  121. // view overrides
  122. virtual void draw();
  123. virtual void reshape(S32 width,S32 height,BOOL called_from_parent=TRUE);
  124. virtual void onFocusReceived();
  125. virtual void onFocusLost();
  126. virtual void setEnabled(BOOL enabled);
  127. // UI control overrides
  128. virtual void clear();
  129. virtual void onTabInto();
  130. virtual void setFocus( BOOL b );
  131. virtual void  setRect(const LLRect& rect);
  132. virtual BOOL acceptsTextInput() const;
  133. virtual void onCommit();
  134. virtual BOOL isDirty() const; // Returns TRUE if user changed value at all
  135. virtual void resetDirty(); // Clear dirty state
  136. // assumes UTF8 text
  137. virtual void setValue(const LLSD& value );
  138. virtual LLSD getValue() const;
  139. virtual BOOL setTextArg( const std::string& key, const LLStringExplicit& text );
  140. virtual BOOL setLabelArg( const std::string& key, const LLStringExplicit& text );
  141. void setLabel(const LLStringExplicit &new_label) { mLabel = new_label; }
  142. const std::string&  getLabel() { return mLabel.getString(); }
  143. void setText(const LLStringExplicit &new_text);
  144. const std::string& getText() const { return mText.getString(); }
  145. LLWString       getWText() const { return mText.getWString(); }
  146. LLWString getConvertedText() const; // trimmed text with paragraphs converted to newlines
  147. S32 getLength() const { return mText.length(); }
  148. S32 getCursor() const { return mCursorPos; }
  149. void setCursor( S32 pos );
  150. void setCursorToEnd();
  151. // Selects characters 'start' to 'end'.
  152. void setSelection(S32 start, S32 end);
  153. virtual void getSelectionRange(S32 *position, S32 *length) const;
  154. void setCommitOnFocusLost( BOOL b ) { mCommitOnFocusLost = b; }
  155. void setRevertOnEsc( BOOL b ) { mRevertOnEsc = b; }
  156. void setCursorColor(const LLColor4& c) { mCursorColor = c; }
  157. const LLColor4& getCursorColor() const { return mCursorColor.get(); }
  158. void setFgColor( const LLColor4& c ) { mFgColor = c; }
  159. void setReadOnlyFgColor( const LLColor4& c ) { mReadOnlyFgColor = c; }
  160. void setTentativeFgColor(const LLColor4& c) { mTentativeFgColor = c; }
  161. const LLColor4& getFgColor() const { return mFgColor.get(); }
  162. const LLColor4& getReadOnlyFgColor() const { return mReadOnlyFgColor.get(); }
  163. const LLColor4& getTentativeFgColor() const { return mTentativeFgColor.get(); }
  164. const LLFontGL* getFont() const { return mGLFont; }
  165. void setIgnoreArrowKeys(BOOL b) { mIgnoreArrowKeys = b; }
  166. void setIgnoreTab(BOOL b) { mIgnoreTab = b; }
  167. void setPassDelete(BOOL b) { mPassDelete = b; }
  168. void setDrawAsterixes(BOOL b);
  169. // get the cursor position of the beginning/end of the prev/next word in the text
  170. S32 prevWordPos(S32 cursorPos) const;
  171. S32 nextWordPos(S32 cursorPos) const;
  172. BOOL hasSelection() const { return (mSelectionStart != mSelectionEnd); }
  173. void startSelection();
  174. void endSelection();
  175. void extendSelection(S32 new_cursor_pos);
  176. void deleteSelection();
  177. void setHandleEditKeysDirectly( BOOL b ) { mHandleEditKeysDirectly = b; }
  178. void setSelectAllonFocusReceived(BOOL b);
  179. typedef boost::function<void (LLLineEditor* caller, void* user_data)> callback_t;
  180. void setKeystrokeCallback(callback_t callback, void* user_data);
  181. void setMaxTextLength(S32 max_text_length);
  182. // Manipulate left and right padding for text
  183. void getTextPadding(S32 *left, S32 *right);
  184. void setTextPadding(S32 left, S32 right);
  185. // Prevalidation controls which keystrokes can affect the editor
  186. void setPrevalidate( LLTextValidate::validate_func_t func );
  187. static BOOL postvalidateFloat(const std::string &str);
  188. // line history support:
  189. void setEnableLineHistory( BOOL enabled ) { mHaveHistory = enabled; } // switches line history on or off 
  190. void updateHistory(); // stores current line in history
  191. void setReplaceNewlinesWithSpaces(BOOL replace);
  192. void setContextMenu(LLContextMenu* new_context_menu);
  193. private:
  194. // private helper methods
  195. void                    pasteHelper(bool is_primary);
  196. void removeChar();
  197. void addChar(const llwchar c);
  198. void setCursorAtLocalPos(S32 local_mouse_x);
  199. S32 findPixelNearestPos(S32 cursor_offset = 0) const;
  200. void reportBadKeystroke();
  201. BOOL handleSpecialKey(KEY key, MASK mask);
  202. BOOL handleSelectionKey(KEY key, MASK mask);
  203. BOOL handleControlKey(KEY key, MASK mask);
  204. S32 handleCommitKey(KEY key, MASK mask);
  205. void updateTextPadding();
  206. // Draw the background image depending on enabled/focused state.
  207. void drawBackground();
  208. //
  209. // private data members
  210. //
  211. void updateAllowingLanguageInput();
  212. BOOL hasPreeditString() const;
  213. // Implementation (overrides) of LLPreeditor
  214. virtual void resetPreedit();
  215. virtual void updatePreedit(const LLWString &preedit_string,
  216. const segment_lengths_t &preedit_segment_lengths, const standouts_t &preedit_standouts, S32 caret_position);
  217. virtual void markAsPreedit(S32 position, S32 length);
  218. virtual void getPreeditRange(S32 *position, S32 *length) const;
  219. virtual BOOL getPreeditLocation(S32 query_position, LLCoordGL *coord, LLRect *bounds, LLRect *control) const;
  220. virtual S32 getPreeditFontSize() const;
  221. virtual LLWString getPreeditString() const { return getWText(); }
  222. protected:
  223. LLUIString mText; // The string being edited.
  224. std::string mPrevText; // Saved string for 'ESC' revert
  225. LLUIString mLabel; // text label that is visible when no user text provided
  226. // line history support:
  227. BOOL mHaveHistory; // flag for enabled line history
  228. typedef std::vector<std::string> line_history_t;
  229. line_history_t mLineHistory; // line history storage
  230. line_history_t::iterator mCurrentHistoryLine; // currently browsed history line
  231. LLViewBorder* mBorder;
  232. const LLFontGL* mGLFont;
  233. S32 mMaxLengthBytes; // Max length of the UTF8 string in bytes
  234. S32 mCursorPos; // I-beam is just after the mCursorPos-th character.
  235. S32 mScrollHPos; // Horizontal offset from the start of mText.  Used for scrolling.
  236. LLFrameTimer mScrollTimer;
  237. S32 mTextPadLeft; // Used to reserve space before the beginning of the text for children.
  238. S32 mTextPadRight; // Used to reserve space after the end of the text for children.
  239. S32 mTextLeftEdge; // Pixels, cached left edge of text based on left padding and width
  240. S32 mTextRightEdge; // Pixels, cached right edge of text based on right padding and width
  241. BOOL mCommitOnFocusLost;
  242. BOOL mRevertOnEsc;
  243. keystroke_callback_t mKeystrokeCallback;
  244. BOOL mIsSelecting; // Selection for clipboard operations
  245. S32 mSelectionStart;
  246. S32 mSelectionEnd;
  247. S32 mLastSelectionX;
  248. S32 mLastSelectionY;
  249. S32 mLastSelectionStart;
  250. S32 mLastSelectionEnd;
  251. LLTextValidate::validate_func_t mPrevalidateFunc;
  252. LLFrameTimer mKeystrokeTimer;
  253. LLTimer mTripleClickTimer;
  254. LLUIColor mCursorColor;
  255. LLUIColor mFgColor;
  256. LLUIColor mReadOnlyFgColor;
  257. LLUIColor mTentativeFgColor;
  258. LLUIColor mHighlightColor; // background for selected text
  259. LLUIColor mPreeditBgColor; // preedit marker background color
  260. S32 mBorderThickness;
  261. BOOL mIgnoreArrowKeys;
  262. BOOL mIgnoreTab;
  263. BOOL mDrawAsterixes;
  264. BOOL mHandleEditKeysDirectly;  // If true, the standard edit keys (Ctrl-X, Delete, etc,) are handled here instead of routed by the menu system
  265. BOOL mSelectAllonFocusReceived;
  266. BOOL mPassDelete;
  267. BOOL mReadOnly;
  268. LLWString mPreeditWString;
  269. LLWString mPreeditOverwrittenWString;
  270. std::vector<S32> mPreeditPositions;
  271. LLPreeditor::standouts_t mPreeditStandouts;
  272. LLHandle<LLView> mContextMenuHandle;
  273. private:
  274. // Instances that by default point to the statics but can be overidden in XML.
  275. LLPointer<LLUIImage> mBgImage;
  276. LLPointer<LLUIImage> mBgImageDisabled;
  277. LLPointer<LLUIImage> mBgImageFocused;
  278. BOOL        mReplaceNewlinesWithSpaces; // if false, will replace pasted newlines with paragraph symbol.
  279. // private helper class
  280. class LLLineEditorRollback
  281. {
  282. public:
  283. LLLineEditorRollback( LLLineEditor* ed )
  284. :
  285. mCursorPos( ed->mCursorPos ),
  286. mScrollHPos( ed->mScrollHPos ),
  287. mIsSelecting( ed->mIsSelecting ),
  288. mSelectionStart( ed->mSelectionStart ),
  289. mSelectionEnd( ed->mSelectionEnd )
  290. {
  291. mText = ed->getText();
  292. }
  293. void doRollback( LLLineEditor* ed )
  294. {
  295. ed->mCursorPos = mCursorPos;
  296. ed->mScrollHPos = mScrollHPos;
  297. ed->mIsSelecting = mIsSelecting;
  298. ed->mSelectionStart = mSelectionStart;
  299. ed->mSelectionEnd = mSelectionEnd;
  300. ed->mText = mText;
  301. ed->mPrevText = mText;
  302. }
  303. std::string getText()   { return mText; }
  304. private:
  305. std::string mText;
  306. S32 mCursorPos;
  307. S32 mScrollHPos;
  308. BOOL mIsSelecting;
  309. S32 mSelectionStart;
  310. S32 mSelectionEnd;
  311. }; // end class LLLineEditorRollback
  312. }; // end class LLLineEditor
  313. // Build time optimization, generate once in .cpp file
  314. #ifndef LLLINEEDITOR_CPP
  315. extern template class LLLineEditor* LLView::getChild<class LLLineEditor>(
  316. const std::string& name, BOOL recurse) const;
  317. #endif
  318. #endif  // LL_LINEEDITOR_