00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef _CEGUIMultiLineEditbox_h_
00031 #define _CEGUIMultiLineEditbox_h_
00032
00033 #include "../CEGUIBase.h"
00034 #include "../CEGUIWindow.h"
00035 #include "../CEGUIFont.h"
00036 #include "CEGUIMultiLineEditboxProperties.h"
00037
00038 #include <vector>
00039
00040
00041 #if defined(_MSC_VER)
00042 # pragma warning(push)
00043 # pragma warning(disable : 4251)
00044 #endif
00045
00046
00047
00048 namespace CEGUI
00049 {
00054 class CEGUIEXPORT MultiLineEditboxWindowRenderer : public WindowRenderer
00055 {
00056 public:
00061 MultiLineEditboxWindowRenderer(const String& name);
00062
00071 virtual Rect getTextRenderArea(void) const = 0;
00072
00073 protected:
00074
00075 void onLookNFeelAssigned();
00076 };
00077
00082 class CEGUIEXPORT MultiLineEditbox : public Window
00083 {
00084 public:
00085 static const String EventNamespace;
00086 static const String WidgetTypeName;
00087
00088
00089
00090
00091
00097 static const String EventReadOnlyModeChanged;
00103 static const String EventWordWrapModeChanged;
00110 static const String EventMaximumTextLengthChanged;
00116 static const String EventCaratMoved;
00122 static const String EventTextSelectionChanged;
00129 static const String EventEditboxFull;
00136 static const String EventVertScrollbarModeChanged;
00143 static const String EventHorzScrollbarModeChanged;
00144
00145
00146
00147
00148 static const String VertScrollbarNameSuffix;
00149 static const String HorzScrollbarNameSuffix;
00150
00151
00152
00153
00159 struct LineInfo
00160 {
00161 size_t d_startIdx;
00162 size_t d_length;
00163 float d_extent;
00164 };
00165 typedef std::vector<LineInfo> LineList;
00166
00167
00168
00169
00178 bool hasInputFocus(void) const;
00179
00180
00189 bool isReadOnly(void) const {return d_readOnly;}
00190
00191
00199 size_t getCaratIndex(void) const {return d_caratPos;}
00200
00201
00210 size_t getSelectionStartIndex(void) const;
00211
00212
00221 size_t getSelectionEndIndex(void) const;
00222
00223
00231 size_t getSelectionLength(void) const;
00232
00233
00241 size_t getMaxTextLength(void) const {return d_maxTextLen;}
00242
00243
00252 bool isWordWrapped(void) const;
00253
00254
00266 Scrollbar* getVertScrollbar() const;
00267
00276 bool isVertScrollbarAlwaysShown(void) const;
00277
00289 Scrollbar* getHorzScrollbar() const;
00290
00291
00300 Rect getTextRenderArea(void) const;
00301
00302
00303 const LineList& getFormattedLines(void) const {return d_lines;}
00304
00310 size_t getLineNumberFromIndex(size_t index) const;
00311
00312
00313
00314
00325 virtual void initialiseComponents(void);
00326
00327
00339 void setReadOnly(bool setting);
00340
00341
00353 void setCaratIndex(size_t carat_pos);
00354
00355
00371 void setSelection(size_t start_pos, size_t end_pos);
00372
00373
00384 void setMaxTextLength(size_t max_len);
00385
00386
00391 void ensureCaratIsVisible(void);
00392
00393
00405 void setWordWrapping(bool setting);
00406
00418 void setShowVertScrollbar(bool setting);
00419
00420
00421 void setSelectionBrushImage(const Image* image);
00422 const Image* getSelectionBrushImage() const;
00423
00424
00425
00426
00431 MultiLineEditbox(const String& type, const String& name);
00432
00433
00438 virtual ~MultiLineEditbox(void);
00439
00440
00441 protected:
00442
00443
00444
00453
00454
00455
00456
00457
00458
00465 void formatText(void);
00466
00475 void formatText(const bool update_scrollbars);
00476
00487 size_t getNextTokenLength(const String& text, size_t start_idx) const;
00488
00489
00494 void configureScrollbars(void);
00495
00496
00507 size_t getTextIndexFromPosition(const Point& pt) const;
00508
00509
00514 void clearSelection(void);
00515
00516
00524 void eraseSelectedText(bool modify_text = true);
00525
00526
00531 void handleBackspace(void);
00532
00533
00538 void handleDelete(void);
00539
00540
00545 void handleCharLeft(uint sysKeys);
00546
00547
00552 void handleWordLeft(uint sysKeys);
00553
00554
00559 void handleCharRight(uint sysKeys);
00560
00561
00566 void handleWordRight(uint sysKeys);
00567
00568
00573 void handleDocHome(uint sysKeys);
00574
00575
00580 void handleDocEnd(uint sysKeys);
00581
00582
00587 void handleLineHome(uint sysKeys);
00588
00589
00594 void handleLineEnd(uint sysKeys);
00595
00596
00601 void handleLineUp(uint sysKeys);
00602
00603
00608 void handleLineDown(uint sysKeys);
00609
00610
00615 void handleNewLine(uint sysKeys);
00616
00617
00622 void handlePageUp(uint sysKeys);
00623
00624
00629 void handlePageDown(uint sysKeys);
00630
00631
00642 virtual bool testClassName_impl(const String& class_name) const
00643 {
00644 if ((class_name=="MultiLineEditBox") ||
00645 (class_name=="MultiLineEditbox"))
00646 {
00647 return true;
00648 }
00649
00650 return Window::testClassName_impl(class_name);
00651 }
00652
00657 bool handle_scrollChange(const EventArgs& args);
00658
00659
00660 bool handle_vertScrollbarVisibilityChanged(const EventArgs&);
00661
00662
00663 virtual bool validateWindowRenderer(const String& name) const
00664 {
00665 return (name == EventNamespace);
00666 }
00667
00668
00669
00670
00675 void onReadOnlyChanged(WindowEventArgs& e);
00676
00677
00682 void onWordWrapModeChanged(WindowEventArgs& e);
00683
00684
00689 void onMaximumTextLengthChanged(WindowEventArgs& e);
00690
00691
00696 void onCaratMoved(WindowEventArgs& e);
00697
00698
00703 void onTextSelectionChanged(WindowEventArgs& e);
00704
00705
00710 void onEditboxFullEvent(WindowEventArgs& e);
00711
00712
00717 void onVertScrollbarModeChanged(WindowEventArgs& e);
00718
00719
00724 void onHorzScrollbarModeChanged(WindowEventArgs& e);
00725
00726
00727
00728
00729
00730 virtual void onMouseButtonDown(MouseEventArgs& e);
00731 virtual void onMouseButtonUp(MouseEventArgs& e);
00732 virtual void onMouseDoubleClicked(MouseEventArgs& e);
00733 virtual void onMouseTripleClicked(MouseEventArgs& e);
00734 virtual void onMouseMove(MouseEventArgs& e);
00735 virtual void onCaptureLost(WindowEventArgs& e);
00736 virtual void onCharacter(KeyEventArgs& e);
00737 virtual void onKeyDown(KeyEventArgs& e);
00738 virtual void onTextChanged(WindowEventArgs& e);
00739 virtual void onSized(WindowEventArgs& e);
00740 virtual void onMouseWheel(MouseEventArgs& e);
00741
00742
00743
00744
00745
00746 bool d_readOnly;
00747 size_t d_maxTextLen;
00748 size_t d_caratPos;
00749 size_t d_selectionStart;
00750 size_t d_selectionEnd;
00751 bool d_dragging;
00752 size_t d_dragAnchorIdx;
00753
00754 static String d_lineBreakChars;
00755 bool d_wordWrap;
00756 LineList d_lines;
00757 float d_widestExtent;
00758
00759
00760 bool d_forceVertScroll;
00761 bool d_forceHorzScroll;
00762
00763
00764 const Image* d_selectionBrush;
00765
00766
00767 private:
00768
00769
00770
00771 static MultiLineEditboxProperties::ReadOnly d_readOnlyProperty;
00772 static MultiLineEditboxProperties::WordWrap d_wordWrapProperty;
00773 static MultiLineEditboxProperties::CaratIndex d_caratIndexProperty;
00774 static MultiLineEditboxProperties::SelectionStart d_selectionStartProperty;
00775 static MultiLineEditboxProperties::SelectionLength d_selectionLengthProperty;
00776 static MultiLineEditboxProperties::MaxTextLength d_maxTextLengthProperty;
00777 static MultiLineEditboxProperties::SelectionBrushImage d_selectionBrushProperty;
00778 static MultiLineEditboxProperties::ForceVertScrollbar d_forceVertProperty;
00779
00780
00781
00782
00783
00784 void addMultiLineEditboxProperties(void);
00785 };
00786
00787 }
00788
00789 #if defined(_MSC_VER)
00790 # pragma warning(pop)
00791 #endif
00792
00793 #endif // end of guard _CEGUIMultiLineEditbox_h_