Woopsi 1.0
GUI Framework for Nintendo DS Homebrew

multilinetextbox.h

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 "document.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 
00064                 MultiLineTextBox(s16 x, s16 y, u16 width, u16 height, const WoopsiString& text, u32 flags, s16 maxRows = 0, GadgetStyle* style = NULL);
00065 
00070                 virtual void setTextAlignmentHoriz(TextAlignmentHoriz alignment);
00071 
00076                 virtual void setTextAlignmentVert(TextAlignmentVert alignment);
00077 
00084                 virtual const u16 getPageCount() const;
00085 
00091                 virtual const u16 getCurrentPage() const;
00092 
00100                 virtual inline const Document* getDocument() const { return _document; };
00101 
00106                 virtual void setText(const WoopsiString& text);
00107 
00113                 virtual void appendText(const WoopsiString& text);
00114 
00119                 virtual void removeText(const u32 startIndex);
00120 
00127                 virtual void removeText(const u32 startIndex, const u32 count);
00128 
00133                 virtual void setFont(FontBase* font);
00134 
00139                 virtual const u32 getTextLength() const;
00140 
00144                 virtual void showCursor();
00145 
00149                 virtual void hideCursor();
00150 
00157                 virtual void moveCursorToPosition(const s32 position);
00158 
00164                 virtual inline const s32 getCursorPosition() const { return _cursorPos; };
00165 
00171                 virtual void insertText(const WoopsiString& text, const u32 index);
00172 
00177                 virtual void insertTextAtCursor(const WoopsiString& text);
00178 
00183                 virtual void handleKeyboardPressEvent(const KeyboardEventArgs& e);
00184 
00189                 virtual void handleKeyboardRepeatEvent(const KeyboardEventArgs& e);
00190 
00195                 inline bool opensKeyboard() const { return _opensKeyboard; };
00196 
00200                 inline void disableKeyboardPopup() { _opensKeyboard = false; };
00201 
00205                 inline void enableKeyboardPopup() { _opensKeyboard = true; };
00206 
00207         protected:
00208                 Document* _document;                    
00209                 u8 _visibleRows;                                
00210                 s16 _maxRows;                                   
00211                 u32 _topRow;                                    
00212                 TextAlignmentHoriz _hAlignment; 
00213                 TextAlignmentVert _vAlignment;  
00214                 s32 _cursorPos;                                 
00215                 bool _showCursor;                               
00216                 bool _opensKeyboard;                    
00223                 virtual void getCursorCoordinates(s16& x, s16& y) const;
00224 
00232                 virtual u32 getCharIndexAtCoordinate(s16 x, s32 rowIndex) const;
00233 
00240                 virtual u32 getCharIndexAtCoordinates(s16 x, s16 y) const;
00241 
00247                 s32 getRowContainingCoordinate(s16 y) const;
00248 
00255                 virtual void drawContents(GraphicsPort* port);
00256 
00263                 virtual void drawBorder(GraphicsPort* port);
00264 
00268                 virtual void moveCursorLeft();
00269 
00273                 virtual void moveCursorRight();
00274 
00278                 virtual void moveCursorUp();
00279 
00283                 virtual void moveCursorDown();
00284 
00291                 virtual bool cullTopLines();
00292 
00298                 virtual void limitCanvasHeight();
00299 
00303                 virtual void limitCanvasY();
00304 
00308                 void jumpToCursor();
00309 
00313                 void jumpToTextBottom();
00314 
00320                 virtual void onResize(u16 width, u16 height);
00321                 
00327                 virtual void onClick(s16 x, s16 y);
00328 
00334                 virtual void onDoubleClick(s16 x, s16 y);
00335                 
00340                 virtual void onKeyPress(KeyCode keyCode);
00341                 
00346                 virtual void onKeyRepeat(KeyCode keyCode);
00347 
00353                 void processPhysicalKey(KeyCode keyCode);
00354 
00359                 virtual void processKey(const WoopsiKey* key);
00360 
00367                 u8 getRowX(s32 row) const;
00368 
00375                 s16 getRowY(s32 row) const;
00376 
00381                 u32 getCursorCodePoint() const;
00382 
00386                 void calculateVisibleRows();
00387 
00392                 void drawText(GraphicsPort* port);
00393 
00398                 void drawCursor(GraphicsPort* port);
00399 
00405                 void drawRow(GraphicsPort* port, s32 row);
00406 
00410                 inline virtual ~MultiLineTextBox() {
00411                         delete _document;
00412                         _document = NULL;
00413                 }
00414 
00418                 inline MultiLineTextBox(const MultiLineTextBox& multiLineTextBox) : ScrollingPanel(multiLineTextBox) { };
00419         };
00420 }
00421 
00422 #endif