00001 #ifndef _MULTILINE_TEXTBOX_H_
00002 #define _MULTILINE_TEXTBOX_H_
00003
00004 #include <nds.h>
00005 #include "scrollingpanel.h"
00006 #include "gadgetstyle.h"
00007 #include "woopsistring.h"
00008 #include "text.h"
00009 #include "keyboardeventhandler.h"
00010 #include "textboxbase.h"
00011
00012 namespace WoopsiUI {
00013
00014 class WoopsiTimer;
00015 class WoopsiKey;
00016
00024 class MultiLineTextBox : public TextBoxBase, public ScrollingPanel, public KeyboardEventHandler {
00025 public:
00026
00030 enum TextAlignmentHoriz {
00031 TEXT_ALIGNMENT_HORIZ_CENTRE = 0,
00032 TEXT_ALIGNMENT_HORIZ_LEFT = 1,
00033 TEXT_ALIGNMENT_HORIZ_RIGHT = 2
00034 };
00035
00039 enum TextAlignmentVert {
00040 TEXT_ALIGNMENT_VERT_CENTRE = 0,
00041 TEXT_ALIGNMENT_VERT_TOP = 1,
00042 TEXT_ALIGNMENT_VERT_BOTTOM = 2
00043 };
00044
00063 MultiLineTextBox(s16 x, s16 y, u16 width, u16 height, const WoopsiString& text, u32 flags, s16 maxRows = 0, GadgetStyle* style = NULL);
00064
00069 virtual void setTextAlignmentHoriz(TextAlignmentHoriz alignment);
00070
00075 virtual void setTextAlignmentVert(TextAlignmentVert alignment);
00076
00083 virtual const u16 getPageCount() const;
00084
00090 virtual const u16 getCurrentPage() const;
00091
00099 virtual inline const Text* getText() const { return _text; };
00100
00105 virtual void setText(const WoopsiString& text);
00106
00112 virtual void appendText(const WoopsiString& text);
00113
00118 virtual void removeText(const u32 startIndex);
00119
00126 virtual void removeText(const u32 startIndex, const u32 count);
00127
00132 virtual void setFont(FontBase* font);
00133
00138 virtual const u32 getTextLength() const;
00139
00143 virtual void showCursor();
00144
00148 virtual void hideCursor();
00149
00156 virtual void moveCursorToPosition(const s32 position);
00157
00163 virtual inline const s32 getCursorPosition() const { return _cursorPos; };
00164
00170 virtual void insertText(const WoopsiString& text, const u32 index);
00171
00176 virtual void insertTextAtCursor(const WoopsiString& text);
00177
00182 virtual void handleKeyboardPressEvent(const KeyboardEventArgs& e);
00183
00188 virtual void handleKeyboardRepeatEvent(const KeyboardEventArgs& e);
00189
00194 inline bool opensKeyboard() const { return _opensKeyboard; };
00195
00199 inline void disableKeyboardPopup() { _opensKeyboard = false; };
00200
00204 inline void enableKeyboardPopup() { _opensKeyboard = true; };
00205
00206 protected:
00207 Text* _text;
00208 u8 _visibleRows;
00209 s16 _maxRows;
00210 u32 _topRow;
00211 TextAlignmentHoriz _hAlignment;
00212 TextAlignmentVert _vAlignment;
00213 s32 _cursorPos;
00214 bool _showCursor;
00215 bool _opensKeyboard;
00222 virtual void getCursorCoordinates(s16& x, s16& y) const;
00223
00231 virtual u32 getCharIndexAtCoordinate(s16 x, s32 rowIndex) const;
00232
00239 virtual u32 getCharIndexAtCoordinates(s16 x, s16 y) const;
00240
00246 s32 getRowContainingCoordinate(s16 y) const;
00247
00254 virtual void drawContents(GraphicsPort* port);
00255
00262 virtual void drawBorder(GraphicsPort* port);
00263
00267 virtual void moveCursorLeft();
00268
00272 virtual void moveCursorRight();
00273
00277 virtual void moveCursorUp();
00278
00282 virtual void moveCursorDown();
00283
00290 virtual bool cullTopLines();
00291
00297 virtual void limitCanvasHeight();
00298
00302 virtual void limitCanvasY();
00303
00307 void jumpToCursor();
00308
00312 void jumpToTextBottom();
00313
00319 virtual void onResize(u16 width, u16 height);
00320
00326 virtual void onClick(s16 x, s16 y);
00327
00333 virtual void onDoubleClick(s16 x, s16 y);
00334
00339 virtual void onKeyPress(KeyCode keyCode);
00340
00345 virtual void onKeyRepeat(KeyCode keyCode);
00346
00352 void processPhysicalKey(KeyCode keyCode);
00353
00358 virtual void processKey(const WoopsiKey* key);
00359
00366 u8 getRowX(s32 row) const;
00367
00374 s16 getRowY(s32 row) const;
00375
00380 u32 getCursorCodePoint() const;
00381
00385 void calculateVisibleRows();
00386
00391 void drawText(GraphicsPort* port);
00392
00397 void drawCursor(GraphicsPort* port);
00398
00404 void drawRow(GraphicsPort* port, s32 row);
00405
00409 inline virtual ~MultiLineTextBox() {
00410 delete _text;
00411 _text = NULL;
00412 }
00413
00417 inline MultiLineTextBox(const MultiLineTextBox& multiLineTextBox) : ScrollingPanel(multiLineTextBox) { };
00418 };
00419 }
00420
00421 #endif