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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lltexteditor.h
  3.  * @brief LLTextEditor base class
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. // Text editor widget to let users enter a a multi-line ASCII document//
  33. #ifndef LL_LLTEXTEDITOR_H
  34. #define LL_LLTEXTEDITOR_H
  35. #include "llrect.h"
  36. #include "llkeywords.h"
  37. #include "llframetimer.h"
  38. #include "lldarray.h"
  39. #include "llstyle.h"
  40. #include "lleditmenuhandler.h"
  41. #include "lldarray.h"
  42. #include "llviewborder.h" // for params
  43. #include "lltextbase.h"
  44. #include "lltextvalidate.h"
  45. #include "llpreeditor.h"
  46. #include "llcontrol.h"
  47. class LLFontGL;
  48. class LLScrollbar;
  49. class LLKeywordToken;
  50. class TextCmd;
  51. class LLUICtrlFactory;
  52. class LLScrollContainer;
  53. class LLTextEditor :
  54. public LLTextBase,
  55. protected LLPreeditor
  56. {
  57. public:
  58. struct Params : public LLInitParam::Block<Params, LLTextBase::Params>
  59. {
  60. Optional<std::string> default_text;
  61. Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs> prevalidate_callback;
  62. Optional<bool> embedded_items,
  63. ignore_tab,
  64. handle_edit_keys_directly,
  65. show_line_numbers,
  66. commit_on_focus_lost,
  67. show_context_menu;
  68. //colors
  69. Optional<LLUIColor> default_color;
  70. Params();
  71. };
  72. void initFromParams(const Params&);
  73. protected:
  74. LLTextEditor(const Params&);
  75. friend class LLUICtrlFactory;
  76. public:
  77. //
  78. // Constants
  79. //
  80. static const llwchar FIRST_EMBEDDED_CHAR = 0x100000;
  81. static const llwchar LAST_EMBEDDED_CHAR =  0x10ffff;
  82. static const S32 MAX_EMBEDDED_ITEMS = LAST_EMBEDDED_CHAR - FIRST_EMBEDDED_CHAR + 1;
  83. virtual ~LLTextEditor();
  84. typedef boost::signals2::signal<void (LLTextEditor* caller)> keystroke_signal_t;
  85. void setKeystrokeCallback(const keystroke_signal_t::slot_type& callback);
  86. void setParseHighlights(BOOL parsing) {mParseHighlights=parsing;}
  87. // mousehandler overrides
  88. virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
  89. virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
  90. virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
  91. virtual BOOL handleHover(S32 x, S32 y, MASK mask);
  92. virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask );
  93. virtual BOOL handleMiddleMouseDown(S32 x,S32 y,MASK mask);
  94. virtual BOOL handleKeyHere(KEY key, MASK mask );
  95. virtual BOOL handleUnicodeCharHere(llwchar uni_char);
  96. virtual void onMouseCaptureLost();
  97. // view overrides
  98. virtual void draw();
  99. virtual void onFocusReceived();
  100. virtual void onFocusLost();
  101. virtual void onCommit();
  102. virtual void setEnabled(BOOL enabled);
  103. // uictrl overrides
  104. virtual void clear();
  105. virtual void setFocus( BOOL b );
  106. virtual BOOL isDirty() const;
  107. // LLEditMenuHandler interface
  108. virtual void undo();
  109. virtual BOOL canUndo() const;
  110. virtual void redo();
  111. virtual BOOL canRedo() const;
  112. virtual void cut();
  113. virtual BOOL canCut() const;
  114. virtual void copy();
  115. virtual BOOL canCopy() const;
  116. virtual void paste();
  117. virtual BOOL canPaste() const;
  118.  
  119. virtual void updatePrimary();
  120. virtual void copyPrimary();
  121. virtual void pastePrimary();
  122. virtual BOOL canPastePrimary() const;
  123. virtual void doDelete();
  124. virtual BOOL canDoDelete() const;
  125. virtual void selectAll();
  126. virtual BOOL canSelectAll() const;
  127. virtual void deselect();
  128. virtual BOOL canDeselect() const;
  129. void selectNext(const std::string& search_text_in, BOOL case_insensitive, BOOL wrap = TRUE);
  130. BOOL replaceText(const std::string& search_text, const std::string& replace_text, BOOL case_insensitive, BOOL wrap = TRUE);
  131. void replaceTextAll(const std::string& search_text, const std::string& replace_text, BOOL case_insensitive);
  132. // Undo/redo stack
  133. void blockUndo();
  134. // Text editing
  135. virtual void makePristine();
  136. BOOL isPristine() const;
  137. BOOL allowsEmbeddedItems() const { return mAllowEmbeddedItems; }
  138. //
  139. // Text manipulation
  140. //
  141. // inserts text at cursor
  142. void insertText(const std::string &text);
  143. void appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo);
  144. // Non-undoable
  145. void setText(const LLStringExplicit &utf8str, const LLStyle::Params& input_params = LLStyle::Params());
  146. // Removes text from the end of document
  147. // Does not change highlight or cursor position.
  148. void  removeTextFromEnd(S32 num_chars);
  149. BOOL tryToRevertToPristineState();
  150. void setCursorAndScrollToEnd();
  151. void getCurrentLineAndColumn( S32* line, S32* col, BOOL include_wordwrap );
  152. void loadKeywords(const std::string& filename,
  153.  const std::vector<std::string>& funcs,
  154.  const std::vector<std::string>& tooltips,
  155.  const LLColor3& func_color);
  156. LLKeywords::keyword_iterator_t keywordsBegin() { return mKeywords.begin(); }
  157. LLKeywords::keyword_iterator_t keywordsEnd() { return mKeywords.end(); }
  158. // Hacky methods to make it into a word-wrapping, potentially scrolling,
  159. // read-only text box.
  160. void setCommitOnFocusLost(BOOL b) { mCommitOnFocusLost = b; }
  161. // Hack to handle Notecards
  162. virtual BOOL importBuffer(const char* buffer, S32 length );
  163. virtual BOOL exportBuffer(std::string& buffer );
  164. const LLUUID& getSourceID() const { return mSourceID; }
  165. const LLTextSegmentPtr getPreviousSegment() const;
  166. void getSelectedSegments(segment_vec_t& segments) const;
  167. void setShowContextMenu(bool show) { mShowContextMenu = show; }
  168. bool getShowContextMenu() const { return mShowContextMenu; }
  169. protected:
  170. void showContextMenu(S32 x, S32 y);
  171. void drawPreeditMarker();
  172. void  assignEmbedded(const std::string &s);
  173. void removeCharOrTab();
  174. void indentSelectedLines( S32 spaces );
  175. S32 indentLine( S32 pos, S32 spaces );
  176. void unindentLineBeforeCloseBrace();
  177. void reportBadKeystroke() { make_ui_sound("UISndBadKeystroke"); }
  178. BOOL handleNavigationKey(const KEY key, const MASK mask);
  179. BOOL handleSpecialKey(const KEY key, const MASK mask, BOOL* return_key_hit);
  180. BOOL handleSelectionKey(const KEY key, const MASK mask);
  181. BOOL handleControlKey(const KEY key, const MASK mask);
  182. BOOL handleEditKey(const KEY key, const MASK mask);
  183. BOOL selectionContainsLineBreaks();
  184. void deleteSelection(BOOL transient_operation);
  185. S32 prevWordPos(S32 cursorPos) const;
  186. S32 nextWordPos(S32 cursorPos) const;
  187. void autoIndent();
  188. void findEmbeddedItemSegments(S32 start, S32 end);
  189. void getSegmentsInRange(segment_vec_t& segments, S32 start, S32 end, bool include_partial) const;
  190. virtual llwchar pasteEmbeddedItem(llwchar ext_char) { return ext_char; }
  191. // Here's the method that takes and applies text commands.
  192. S32  execute(TextCmd* cmd);
  193. // Undoable operations
  194. void addChar(llwchar c); // at mCursorPos
  195. S32 addChar(S32 pos, llwchar wc);
  196. S32 overwriteChar(S32 pos, llwchar wc);
  197. void removeChar();
  198. S32  removeChar(S32 pos);
  199. S32 insert(S32 pos, const LLWString &wstr, bool group_with_next_op, LLTextSegmentPtr segment);
  200. S32 remove(S32 pos, S32 length, bool group_with_next_op);
  201. void updateAllowingLanguageInput();
  202. BOOL hasPreeditString() const;
  203. // Overrides LLPreeditor
  204. virtual void resetPreedit();
  205. virtual void updatePreedit(const LLWString &preedit_string,
  206. const segment_lengths_t &preedit_segment_lengths, const standouts_t &preedit_standouts, S32 caret_position);
  207. virtual void markAsPreedit(S32 position, S32 length);
  208. virtual void getPreeditRange(S32 *position, S32 *length) const;
  209. virtual void getSelectionRange(S32 *position, S32 *length) const;
  210. virtual BOOL getPreeditLocation(S32 query_offset, LLCoordGL *coord, LLRect *bounds, LLRect *control) const;
  211. virtual S32 getPreeditFontSize() const;
  212. virtual LLWString getPreeditString() const { return getWText(); }
  213. //
  214. // Protected data
  215. //
  216. // Probably deserves serious thought to hiding as many of these 
  217. // as possible behind protected accessor methods.
  218. //
  219. // Use these to determine if a click on an embedded item is a drag or not.
  220. S32 mMouseDownX;
  221. S32 mMouseDownY;
  222. LLWString mPreeditWString;
  223. LLWString mPreeditOverwrittenWString;
  224. std::vector<S32>  mPreeditPositions;
  225. std::vector<BOOL>  mPreeditStandouts;
  226. protected:
  227. LLUIColor mDefaultColor;
  228. BOOL mShowLineNumbers;
  229. /*virtual*/ void updateSegments();
  230. void updateLinkSegments();
  231. private:
  232. //
  233. // Methods
  234. //
  235. void         pasteHelper(bool is_primary);
  236. void drawLineNumbers();
  237. void onKeyStroke();
  238. //
  239. // Data
  240. //
  241. LLKeywords mKeywords;
  242. // Concrete TextCmd sub-classes used by the LLTextEditor base class
  243. class TextCmdInsert;
  244. class TextCmdAddChar;
  245. class TextCmdOverwriteChar;
  246. class TextCmdRemove;
  247. class LLViewBorder* mBorder;
  248. BOOL mBaseDocIsPristine;
  249. TextCmd* mPristineCmd;
  250. TextCmd* mLastCmd;
  251. typedef std::deque<TextCmd*> undo_stack_t;
  252. undo_stack_t mUndoStack;
  253. BOOL mTabsToNextField; // if true, tab moves focus to next field, else inserts spaces
  254. BOOL mCommitOnFocusLost;
  255. BOOL mTakesFocus;
  256. BOOL mAllowEmbeddedItems;
  257. bool mShowContextMenu;
  258. LLUUID mSourceID;
  259. // If true, the standard edit keys (Ctrl-X, Delete, etc,) are handled here 
  260. //instead of routed by the menu system
  261. BOOL mHandleEditKeysDirectly;  
  262. LLCoordGL mLastIMEPosition; // Last position of the IME editor
  263. keystroke_signal_t mKeystrokeSignal;
  264. LLTextValidate::validate_func_t mPrevalidateFunc;
  265. LLContextMenu* mContextMenu;
  266. }; // end class LLTextEditor
  267. // Build time optimization, generate once in .cpp file
  268. #ifndef LLTEXTEDITOR_CPP
  269. extern template class LLTextEditor* LLView::getChild<class LLTextEditor>(
  270. const std::string& name, BOOL recurse) const;
  271. #endif
  272. #endif  // LL_TEXTEDITOR_