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
00092 static const String EventReadOnlyModeChanged;
00093 static const String EventWordWrapModeChanged;
00094 static const String EventMaximumTextLengthChanged;
00095 static const String EventCaratMoved;
00096 static const String EventTextSelectionChanged;
00097 static const String EventEditboxFull;
00098 static const String EventVertScrollbarModeChanged;
00099 static const String EventHorzScrollbarModeChanged;
00100
00101
00102
00103
00104 static const String VertScrollbarNameSuffix;
00105 static const String HorzScrollbarNameSuffix;
00106
00107
00108
00109
00115 struct LineInfo
00116 {
00117 size_t d_startIdx;
00118 size_t d_length;
00119 float d_extent;
00120 };
00121 typedef std::vector<LineInfo> LineList;
00122
00123
00124
00125
00134 bool hasInputFocus(void) const;
00135
00136
00145 bool isReadOnly(void) const {return d_readOnly;}
00146
00147
00155 size_t getCaratIndex(void) const {return d_caratPos;}
00156
00157
00166 size_t getSelectionStartIndex(void) const;
00167
00168
00177 size_t getSelectionEndIndex(void) const;
00178
00179
00187 size_t getSelectionLength(void) const;
00188
00189
00197 size_t getMaxTextLength(void) const {return d_maxTextLen;}
00198
00199
00208 bool isWordWrapped(void) const;
00209
00210
00222 Scrollbar* getVertScrollbar() const;
00223
00232 bool isVertScrollbarAlwaysShown(void) const;
00233
00245 Scrollbar* getHorzScrollbar() const;
00246
00247
00256 Rect getTextRenderArea(void) const;
00257
00258
00259 const LineList& getFormattedLines(void) const {return d_lines;}
00260
00266 size_t getLineNumberFromIndex(size_t index) const;
00267
00268
00269
00270
00281 virtual void initialiseComponents(void);
00282
00283
00295 void setReadOnly(bool setting);
00296
00297
00309 void setCaratIndex(size_t carat_pos);
00310
00311
00327 void setSelection(size_t start_pos, size_t end_pos);
00328
00329
00340 void setMaxTextLength(size_t max_len);
00341
00342
00347 void ensureCaratIsVisible(void);
00348
00349
00361 void setWordWrapping(bool setting);
00362
00374 void setShowVertScrollbar(bool setting);
00375
00376
00377 void setSelectionBrushImage(const Image* image);
00378 const Image* getSelectionBrushImage() const;
00379
00380
00381
00382
00387 MultiLineEditbox(const String& type, const String& name);
00388
00389
00394 virtual ~MultiLineEditbox(void);
00395
00396
00397 protected:
00398
00399
00400
00409
00410
00411
00412
00413
00414
00419 void formatText(void);
00420
00421
00432 size_t getNextTokenLength(const String& text, size_t start_idx) const;
00433
00434
00439 void configureScrollbars(void);
00440
00441
00452 size_t getTextIndexFromPosition(const Point& pt) const;
00453
00454
00459 void clearSelection(void);
00460
00461
00469 void eraseSelectedText(bool modify_text = true);
00470
00471
00476 void handleBackspace(void);
00477
00478
00483 void handleDelete(void);
00484
00485
00490 void handleCharLeft(uint sysKeys);
00491
00492
00497 void handleWordLeft(uint sysKeys);
00498
00499
00504 void handleCharRight(uint sysKeys);
00505
00506
00511 void handleWordRight(uint sysKeys);
00512
00513
00518 void handleDocHome(uint sysKeys);
00519
00520
00525 void handleDocEnd(uint sysKeys);
00526
00527
00532 void handleLineHome(uint sysKeys);
00533
00534
00539 void handleLineEnd(uint sysKeys);
00540
00541
00546 void handleLineUp(uint sysKeys);
00547
00548
00553 void handleLineDown(uint sysKeys);
00554
00555
00560 void handleNewLine(uint sysKeys);
00561
00562
00567 void handlePageUp(uint sysKeys);
00568
00569
00574 void handlePageDown(uint sysKeys);
00575
00576
00587 virtual bool testClassName_impl(const String& class_name) const
00588 {
00589 if ((class_name=="MultiLineEditBox") ||
00590 (class_name=="MultiLineEditbox"))
00591 {
00592 return true;
00593 }
00594
00595 return Window::testClassName_impl(class_name);
00596 }
00597
00602 bool handle_scrollChange(const EventArgs& args);
00603
00604
00605 virtual bool validateWindowRenderer(const String& name) const
00606 {
00607 return (name == EventNamespace);
00608 }
00609
00610
00611
00612
00617 void onReadOnlyChanged(WindowEventArgs& e);
00618
00619
00624 void onWordWrapModeChanged(WindowEventArgs& e);
00625
00626
00631 void onMaximumTextLengthChanged(WindowEventArgs& e);
00632
00633
00638 void onCaratMoved(WindowEventArgs& e);
00639
00640
00645 void onTextSelectionChanged(WindowEventArgs& e);
00646
00647
00652 void onEditboxFullEvent(WindowEventArgs& e);
00653
00654
00659 void onVertScrollbarModeChanged(WindowEventArgs& e);
00660
00661
00666 void onHorzScrollbarModeChanged(WindowEventArgs& e);
00667
00668
00669
00670
00671
00672 virtual void onMouseButtonDown(MouseEventArgs& e);
00673 virtual void onMouseButtonUp(MouseEventArgs& e);
00674 virtual void onMouseDoubleClicked(MouseEventArgs& e);
00675 virtual void onMouseTripleClicked(MouseEventArgs& e);
00676 virtual void onMouseMove(MouseEventArgs& e);
00677 virtual void onCaptureLost(WindowEventArgs& e);
00678 virtual void onCharacter(KeyEventArgs& e);
00679 virtual void onKeyDown(KeyEventArgs& e);
00680 virtual void onTextChanged(WindowEventArgs& e);
00681 virtual void onSized(WindowEventArgs& e);
00682 virtual void onMouseWheel(MouseEventArgs& e);
00683
00684
00685
00686
00687
00688 bool d_readOnly;
00689 size_t d_maxTextLen;
00690 size_t d_caratPos;
00691 size_t d_selectionStart;
00692 size_t d_selectionEnd;
00693 bool d_dragging;
00694 size_t d_dragAnchorIdx;
00695
00696 static String d_lineBreakChars;
00697 bool d_wordWrap;
00698 LineList d_lines;
00699 float d_widestExtent;
00700
00701
00702 bool d_forceVertScroll;
00703 bool d_forceHorzScroll;
00704
00705
00706 const Image* d_selectionBrush;
00707
00708
00709 private:
00710
00711
00712
00713 static MultiLineEditboxProperties::ReadOnly d_readOnlyProperty;
00714 static MultiLineEditboxProperties::WordWrap d_wordWrapProperty;
00715 static MultiLineEditboxProperties::CaratIndex d_caratIndexProperty;
00716 static MultiLineEditboxProperties::SelectionStart d_selectionStartProperty;
00717 static MultiLineEditboxProperties::SelectionLength d_selectionLengthProperty;
00718 static MultiLineEditboxProperties::MaxTextLength d_maxTextLengthProperty;
00719 static MultiLineEditboxProperties::SelectionBrushImage d_selectionBrushProperty;
00720 static MultiLineEditboxProperties::ForceVertScrollbar d_forceVertProperty;
00721
00722
00723
00724
00725
00726 void addMultiLineEditboxProperties(void);
00727 };
00728
00729 }
00730
00731 #if defined(_MSC_VER)
00732 # pragma warning(pop)
00733 #endif
00734
00735 #endif // end of guard _CEGUIMultiLineEditbox_h_