Crazy Eddie's GUI System  0.8.7
widgets/MultiLineEditbox.h
1 /***********************************************************************
2  created: 30/6/2004
3  author: Paul D Turner
4 
5  purpose: Interface to the Multi-lien edit box base class.
6 *************************************************************************/
7 /***************************************************************************
8  * Copyright (C) 2004 - 2006 Paul D Turner & The CEGUI Development Team
9  *
10  * Permission is hereby granted, free of charge, to any person obtaining
11  * a copy of this software and associated documentation files (the
12  * "Software"), to deal in the Software without restriction, including
13  * without limitation the rights to use, copy, modify, merge, publish,
14  * distribute, sublicense, and/or sell copies of the Software, and to
15  * permit persons to whom the Software is furnished to do so, subject to
16  * the following conditions:
17  *
18  * The above copyright notice and this permission notice shall be
19  * included in all copies or substantial portions of the Software.
20  *
21  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
24  * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
25  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
26  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
27  * OTHER DEALINGS IN THE SOFTWARE.
28  ***************************************************************************/
29 #ifndef _CEGUIMultiLineEditbox_h_
30 #define _CEGUIMultiLineEditbox_h_
31 
32 #include "../Base.h"
33 #include "../Window.h"
34 #include "../Font.h"
35 
36 #include <vector>
37 
38 #if defined(_MSC_VER)
39 # pragma warning(push)
40 # pragma warning(disable : 4251)
41 #endif
42 
43 
44 // Start of CEGUI namespace section
45 namespace CEGUI
46 {
52 {
53 public:
59 
68  virtual Rectf getTextRenderArea(void) const = 0;
69 
70 protected:
71  // base class overrides
73 };
74 
79 class CEGUIEXPORT MultiLineEditbox : public Window
80 {
81 public:
82  static const String EventNamespace;
83  static const String WidgetTypeName;
84 
85  /*************************************************************************
86  Constants
87  *************************************************************************/
88  // event names
113  static const String EventCaretMoved;
126  static const String EventEditboxFull;
141 
142  /*************************************************************************
143  Child Widget name constants
144  *************************************************************************/
145  static const String VertScrollbarName;
146  static const String HorzScrollbarName;
147 
148  /*************************************************************************
149  Implementation struct
150  *************************************************************************/
156  struct LineInfo
157  {
158  size_t d_startIdx;
159  size_t d_length;
160  float d_extent;
161  };
162  typedef std::vector<LineInfo
163  CEGUI_VECTOR_ALLOC(LineInfo)> LineList;
164 
165  /*************************************************************************
166  Accessor Functions
167  *************************************************************************/
176  bool hasInputFocus(void) const;
177 
178 
187  bool isReadOnly(void) const {return d_readOnly;}
188 
189 
197  size_t getCaretIndex(void) const {return d_caretPos;}
198 
199 
208  size_t getSelectionStartIndex(void) const;
209 
210 
219  size_t getSelectionEndIndex(void) const;
220 
221 
229  size_t getSelectionLength(void) const;
230 
231 
239  size_t getMaxTextLength(void) const {return d_maxTextLen;}
240 
241 
250  bool isWordWrapped(void) const;
251 
252 
265 
274  bool isVertScrollbarAlwaysShown(void) const;
275 
288 
289 
299 
300  // get d_lines
301  const LineList& getFormattedLines(void) const {return d_lines;}
302 
308  size_t getLineNumberFromIndex(size_t index) const;
309 
310  /*************************************************************************
311  Manipulators
312  *************************************************************************/
323  virtual void initialiseComponents(void);
324 
325 
337  void setReadOnly(bool setting);
338 
339 
351  void setCaretIndex(size_t caret_pos);
352 
353 
369  void setSelection(size_t start_pos, size_t end_pos);
370 
371 
383  void setSelectionStart(size_t start_pos);
384 
395  void setSelectionLength(size_t length);
396 
407  void setMaxTextLength(size_t max_len);
408 
409 
415 
416 
428  void setWordWrapping(bool setting);
429 
441  void setShowVertScrollbar(bool setting);
442 
443  // selection brush image property support
444  void setSelectionBrushImage(const Image* image);
445  const Image* getSelectionBrushImage() const;
446 
448  virtual bool performCopy(Clipboard& clipboard);
449 
451  virtual bool performCut(Clipboard& clipboard);
452 
454  virtual bool performPaste(Clipboard& clipboard);
455 
464  void formatText(const bool update_scrollbars);
465 
466  /*************************************************************************
467  Construction and Destruction
468  *************************************************************************/
473  MultiLineEditbox(const String& type, const String& name);
474 
475 
480  virtual ~MultiLineEditbox(void);
481 
482 
483 protected:
484  /*************************************************************************
485  Implementation Methods (abstract)
486  *************************************************************************/
495  //virtual Rect getTextRenderArea_impl(void) const = 0;
496 
497 
498  /*************************************************************************
499  Implementation Methods
500  *************************************************************************/
507  void formatText(void);
508 
519  size_t getNextTokenLength(const String& text, size_t start_idx) const;
520 
521 
527 
528 
539  size_t getTextIndexFromPosition(const Vector2f& pt) const;
540 
541 
546  void clearSelection(void);
547 
548 
556  void eraseSelectedText(bool modify_text = true);
557 
558 
563  void handleBackspace(void);
564 
565 
570  void handleDelete(void);
571 
572 
577  void handleCharLeft(uint sysKeys);
578 
579 
584  void handleWordLeft(uint sysKeys);
585 
586 
591  void handleCharRight(uint sysKeys);
592 
593 
598  void handleWordRight(uint sysKeys);
599 
600 
605  void handleDocHome(uint sysKeys);
606 
607 
612  void handleDocEnd(uint sysKeys);
613 
614 
619  void handleLineHome(uint sysKeys);
620 
621 
626  void handleLineEnd(uint sysKeys);
627 
628 
633  void handleLineUp(uint sysKeys);
634 
635 
640  void handleLineDown(uint sysKeys);
641 
642 
647  void handleNewLine(uint sysKeys);
648 
649 
654  void handlePageUp(uint sysKeys);
655 
656 
661  void handlePageDown(uint sysKeys);
662 
667  bool handle_scrollChange(const EventArgs& args);
668 
669  // handler triggered when vertical scrollbar is shown or hidden
670  bool handle_vertScrollbarVisibilityChanged(const EventArgs&);
671 
672  // validate window renderer
673  virtual bool validateWindowRenderer(const WindowRenderer* renderer) const;
674 
675  /*************************************************************************
676  New event handlers
677  *************************************************************************/
683 
684 
690 
691 
697 
698 
704 
705 
711 
712 
718 
719 
725 
726 
732 
733 
734  /*************************************************************************
735  Overridden event handlers
736  *************************************************************************/
738  virtual void onMouseButtonUp(MouseEventArgs& e);
741  virtual void onMouseMove(MouseEventArgs& e);
742  virtual void onCaptureLost(WindowEventArgs& e);
743  virtual void onCharacter(KeyEventArgs& e);
744  virtual void onKeyDown(KeyEventArgs& e);
745  virtual void onTextChanged(WindowEventArgs& e);
746  virtual void onSized(ElementEventArgs& e);
747  virtual void onMouseWheel(MouseEventArgs& e);
748  virtual void onFontChanged(WindowEventArgs& e);
749 
750 
751  /*************************************************************************
752  Implementation data
753  *************************************************************************/
754  bool d_readOnly;
755  size_t d_maxTextLen;
756  size_t d_caretPos;
758  size_t d_selectionEnd;
759  bool d_dragging;
761 
763  bool d_wordWrap;
766 
767  // component widget settings
770 
771  // images
773 
774 
775 private:
776  /*************************************************************************
777  Private methods
778  *************************************************************************/
779  void addMultiLineEditboxProperties(void);
780 };
781 
782 } // End of CEGUI namespace section
783 
784 #if defined(_MSC_VER)
785 # pragma warning(pop)
786 #endif
787 
788 #endif // end of guard _CEGUIMultiLineEditbox_h_
Defines a clipboard handling class.
Definition: Clipboard.h:84
EventArgs based class that is used for objects passed to handlers triggered for events concerning som...
Definition: Element.h:211
Base class used as the argument to all subscribers Event object.
Definition: EventArgs.h:51
Interface for Image.
Definition: Image.h:161
EventArgs based class that is used for objects passed to input event handlers concerning keyboard inp...
Definition: InputEvent.h:315
EventArgs based class that is used for objects passed to input event handlers concerning mouse input.
Definition: InputEvent.h:281
Base class for multi-line edit box window renderer objects.
Definition: widgets/MultiLineEditbox.h:52
MultiLineEditboxWindowRenderer(const String &name)
Constructor.
virtual Rectf getTextRenderArea(void) const =0
Return a Rect object describing, in un-clipped pixels, the window relative area that the text should ...
void onLookNFeelAssigned()
Handler called when a Look'N'Feel is assigned to our window.
Base class for the multi-line edit box widget.
Definition: widgets/MultiLineEditbox.h:80
size_t getSelectionEndIndex(void) const
return the current selection end point.
void handlePageUp(uint sysKeys)
Processing to move caret one page up.
virtual void initialiseComponents(void)
Initialise the Window based object ready for use.
void handleCharRight(uint sysKeys)
Processing to move caret one character right.
static const String EventNamespace
Namespace for global events.
Definition: widgets/MultiLineEditbox.h:82
void setCaretIndex(size_t caret_pos)
Set the current position of the caret.
virtual void onSized(ElementEventArgs &e)
Handler called when the window's size changes.
bool isWordWrapped(void) const
Return whether the text in the edit box will be word-wrapped.
size_t d_dragAnchorIdx
Selection index for drag selection anchor point.
Definition: widgets/MultiLineEditbox.h:760
void handleWordRight(uint sysKeys)
Processing to move caret one word right.
void setReadOnly(bool setting)
Specify whether the edit box is read-only.
size_t d_caretPos
Position of the caret / insert-point.
Definition: widgets/MultiLineEditbox.h:756
bool d_forceHorzScroll
true if horizontal scrollbar should always be displayed
Definition: widgets/MultiLineEditbox.h:769
void handleLineDown(uint sysKeys)
Processing to move caret down a line.
void handleWordLeft(uint sysKeys)
Processing to move caret one word left.
static const String EventEditboxFull
Definition: widgets/MultiLineEditbox.h:126
void setSelection(size_t start_pos, size_t end_pos)
Define the current selection for the edit box.
void handleDocHome(uint sysKeys)
Processing to move caret to the start of the text.
static const String HorzScrollbarName
Widget name for the horizontal scrollbar component.
Definition: widgets/MultiLineEditbox.h:146
size_t getNextTokenLength(const String &text, size_t start_idx) const
Return the length of the next token in String text starting at index start_idx.
Rectf getTextRenderArea(void) const
Return a Rect object describing, in un-clipped pixels, the window relative area that the text should ...
size_t getCaretIndex(void) const
return the current position of the caret.
Definition: widgets/MultiLineEditbox.h:197
void formatText(void)
Return a Rect object describing, in un-clipped pixels, the window relative area that the text should ...
virtual bool performPaste(Clipboard &clipboard)
Asks the widget to perform a clipboard paste from the provided clipboard.
static String d_lineBreakChars
Holds what we consider to be line break characters.
Definition: widgets/MultiLineEditbox.h:762
void eraseSelectedText(bool modify_text=true)
Erase the currently selected text.
size_t getMaxTextLength(void) const
return the maximum text length set for this edit box.
Definition: widgets/MultiLineEditbox.h:239
bool d_dragging
true when a selection is being dragged.
Definition: widgets/MultiLineEditbox.h:759
void setSelectionLength(size_t length)
Define the current selection for the Editbox.
virtual bool performCopy(Clipboard &clipboard)
Asks the widget to perform a clipboard copy to the provided clipboard.
virtual void onMouseButtonDown(MouseEventArgs &e)
Handler called when a mouse button has been depressed within this window's area.
const Image * d_selectionBrush
Image to use as the selection brush (should be set by derived class).
Definition: widgets/MultiLineEditbox.h:772
void handleLineUp(uint sysKeys)
Processing to move caret up a line.
void handleBackspace(void)
Processing for backspace key.
void setShowVertScrollbar(bool setting)
Set whether the vertical scroll bar should always be shown.
static const String EventMaximumTextLengthChanged
Definition: widgets/MultiLineEditbox.h:107
std::vector< LineInfo CEGUI_VECTOR_ALLOC(LineInfo)> LineList
Type for collection of LineInfos.
Definition: widgets/MultiLineEditbox.h:163
static const String EventCaretMoved
Definition: widgets/MultiLineEditbox.h:113
void onVertScrollbarModeChanged(WindowEventArgs &e)
Handler called when the 'always show' setting for the vertical scroll bar changes.
bool isVertScrollbarAlwaysShown(void) const
Return whether the vertical scroll bar is always shown.
size_t getTextIndexFromPosition(const Vector2f &pt) const
Return the text code point index that is rendered closest to screen position pt.
bool d_wordWrap
true when formatting uses word-wrapping.
Definition: widgets/MultiLineEditbox.h:763
virtual void onMouseButtonUp(MouseEventArgs &e)
Handler called when a mouse button has been released within this window's area.
void onTextSelectionChanged(WindowEventArgs &e)
Handler called when the text selection changes.
void handlePageDown(uint sysKeys)
Processing to move caret one page down.
size_t getSelectionStartIndex(void) const
return the current selection start point.
size_t d_selectionEnd
End of selection area.
Definition: widgets/MultiLineEditbox.h:758
static const String EventWordWrapModeChanged
Definition: widgets/MultiLineEditbox.h:100
virtual void onMouseTripleClicked(MouseEventArgs &e)
Handler called when a mouse button has been triple-clicked within this window's area.
virtual void onMouseMove(MouseEventArgs &e)
Handler called when the mouse cursor has been moved within this window's area.
void handleCharLeft(uint sysKeys)
Processing to move caret one character left.
void onEditboxFullEvent(WindowEventArgs &e)
Handler called when the edit box is full.
size_t d_maxTextLen
Maximum number of characters for this Editbox.
Definition: widgets/MultiLineEditbox.h:755
void onMaximumTextLengthChanged(WindowEventArgs &e)
Handler called when the maximum text length for the edit box changes.
void setWordWrapping(bool setting)
Set whether the text will be word wrapped or not.
void configureScrollbars(void)
display required integrated scroll bars according to current state of the edit box and update their v...
void handleDocEnd(uint sysKeys)
Processing to move caret to the end of the text.
virtual bool performCut(Clipboard &clipboard)
Asks the widget to perform a clipboard cut to the provided clipboard.
bool d_readOnly
true if the edit box is in read-only mode
Definition: widgets/MultiLineEditbox.h:754
Scrollbar * getHorzScrollbar() const
Return a pointer to the horizontal scrollbar component widget for this MultiLineEditbox.
size_t d_selectionStart
Start of selection area.
Definition: widgets/MultiLineEditbox.h:757
void setMaxTextLength(size_t max_len)
set the maximum text length for this edit box.
virtual bool validateWindowRenderer(const WindowRenderer *renderer) const
Function used in checking if a WindowRenderer is valid for this window.
static const String EventVertScrollbarModeChanged
Definition: widgets/MultiLineEditbox.h:133
virtual void onMouseWheel(MouseEventArgs &e)
Handler called when the mouse wheel (z-axis) position changes within this window's area.
virtual void onCaptureLost(WindowEventArgs &e)
Handler called when this window loses capture of mouse inputs.
static const String EventReadOnlyModeChanged
Definition: widgets/MultiLineEditbox.h:94
void handleLineEnd(uint sysKeys)
Processing to move caret to the end of the current line.
void onReadOnlyChanged(WindowEventArgs &e)
Handler called when the read-only state of the edit box changes.
void onHorzScrollbarModeChanged(WindowEventArgs &e)
Handler called when 'always show' setting for the horizontal scroll bar changes.
virtual void onKeyDown(KeyEventArgs &e)
Handler called when a key as been depressed while this window has input focus.
LineList d_lines
Holds the lines for the current formatting.
Definition: widgets/MultiLineEditbox.h:764
void onWordWrapModeChanged(WindowEventArgs &e)
Handler called when the word wrap mode for the the edit box changes.
bool handle_scrollChange(const EventArgs &args)
Internal handler that is triggered when the user interacts with the scrollbars.
size_t getSelectionLength(void) const
return the length of the current selection (in code points / characters).
static const String EventHorzScrollbarModeChanged
Definition: widgets/MultiLineEditbox.h:140
void ensureCaretIsVisible(void)
Scroll the view so that the current caret position is visible.
Scrollbar * getVertScrollbar() const
Return a pointer to the vertical scrollbar component widget for this MultiLineEditbox.
void handleNewLine(uint sysKeys)
Processing to insert a new line / paragraph.
static const String VertScrollbarName
Widget name for the vertical scrollbar component.
Definition: widgets/MultiLineEditbox.h:145
void onCaretMoved(WindowEventArgs &e)
Handler called when the caret moves.
void formatText(const bool update_scrollbars)
Format the text into lines as dictated by the formatting options.
virtual ~MultiLineEditbox(void)
Destructor for the MultiLineEditbox base class.
void handleDelete(void)
Processing for Delete key.
static const String EventTextSelectionChanged
Definition: widgets/MultiLineEditbox.h:119
float d_widestExtent
Holds the extent of the widest line as calculated in the last formatting pass.
Definition: widgets/MultiLineEditbox.h:765
virtual void onMouseDoubleClicked(MouseEventArgs &e)
Handler called when a mouse button has been double-clicked within this window's area.
void clearSelection(void)
Clear the current selection setting.
void setSelectionStart(size_t start_pos)
Define the current selection start for the Editbox.
virtual void onCharacter(KeyEventArgs &e)
Handler called when a character-key has been pressed while this window has input focus.
bool isReadOnly(void) const
return true if the edit box is read-only.
Definition: widgets/MultiLineEditbox.h:187
bool d_forceVertScroll
true if vertical scrollbar should always be displayed
Definition: widgets/MultiLineEditbox.h:768
virtual void onFontChanged(WindowEventArgs &e)
Handler called when the window's font is changed.
void handleLineHome(uint sysKeys)
Processing to move caret to the start of the current line.
MultiLineEditbox(const String &type, const String &name)
Constructor for the MultiLineEditbox base class.
static const String WidgetTypeName
Window factory name.
Definition: widgets/MultiLineEditbox.h:83
size_t getLineNumberFromIndex(size_t index) const
Return the line number a given index falls on with the current formatting. Will return last line if i...
virtual void onTextChanged(WindowEventArgs &e)
Handler called when the window's text is changed.
bool hasInputFocus(void) const
return true if the edit box has input focus.
Base scroll bar class.
Definition: widgets/Scrollbar.h:90
String class used within the GUI system.
Definition: String.h:64
EventArgs based class that is used for objects passed to handlers triggered for events concerning som...
Definition: InputEvent.h:252
Base-class for the assignable WindowRenderer object.
Definition: WindowRenderer.h:52
An abstract base class providing common functionality and specifying the required interface for deriv...
Definition: Window.h:151
Main namespace for Crazy Eddie's GUI Library.
Definition: arch_overview.dox:1
struct used to store information about a formatted line within the paragraph.
Definition: widgets/MultiLineEditbox.h:157
float d_extent
Rendered extent of this line.
Definition: widgets/MultiLineEditbox.h:160
size_t d_length
Code point length of this line.
Definition: widgets/MultiLineEditbox.h:159
size_t d_startIdx
Starting index for this line.
Definition: widgets/MultiLineEditbox.h:158