tge/engine/gui/controls/guiMLTextCtrl.h
2017-04-17 06:17:10 -06:00

276 lines
6.8 KiB
C++
Executable File

//-----------------------------------------------------------------------------
// Torque Game Engine
// Copyright (C) GarageGames.com, Inc.
//-----------------------------------------------------------------------------
#ifndef _GUIMLTEXTCTRL_H_
#define _GUIMLTEXTCTRL_H_
#ifndef _GUICONTROL_H_
#include "gui/core/guiControl.h"
#endif
#ifndef _STRINGBUFFER_H_
#include "core/stringBuffer.h"
#endif
class GFont;
class GuiMLTextCtrl : public GuiControl
{
typedef GuiControl Parent;
//-------------------------------------- Public interfaces...
public:
enum Justification
{
LeftJustify,
RightJustify,
CenterJustify,
};
struct Font {
char *faceName;
U32 faceNameLen;
U32 size;
Resource<GFont> fontRes;
Font *next;
};
struct Bitmap {
const char *bitmapName;
U32 bitmapNameLen;
TextureHandle bitmapHandle;
Bitmap *next;
};
struct URL
{
bool mouseDown;
U32 textStart;
U32 len;
bool noUnderline;
};
struct Style
{
ColorI color;
ColorI shadowColor;
ColorI linkColor;
ColorI linkColorHL;
Point2I shadowOffset;
Font *font;
bool used;
Style *next;
};
struct Atom
{
U32 textStart;
U32 len;
U32 xStart;
U32 yStart;
U32 width;
U32 baseLine;
U32 descent;
Style *style;
bool isClipped;
URL *url;
Atom *next;
};
struct Line {
U32 y;
U32 height;
U32 divStyle;
U32 textStart;
U32 len;
Atom *atomList;
Line *next;
};
struct BitmapRef : public RectI
{
BitmapRef *nextBlocker;
U32 textStart;
U32 len;
Bitmap *bitmap;
BitmapRef *next;
};
struct LineTag {
U32 id;
S32 y;
LineTag *next;
};
GuiMLTextCtrl();
~GuiMLTextCtrl();
// Text retrieval functions
U32 getNumChars() const;
U32 getText(char* pBuffer, const U32 bufferSize) const;
U32 getWrappedText(char* pBuffer, const U32 bufferSize) const;
const char* getTextContent();
void insertChars(const char* inputChars,
const U32 numInputChars,
const U32 position);
// Text substitution functions
void setText(const char* textBuffer, const U32 numChars);
void addText(const char* textBuffer, const U32 numChars, bool reformat);
void setAlpha(F32 alpha) { mAlpha = alpha;}
bool setCursorPosition(const S32);
void ensureCursorOnScreen();
// Scroll functions
void scrollToTag( U32 id );
void scrollToTop();
void scrollToBottom();
virtual void reflow();
DECLARE_CONOBJECT(GuiMLTextCtrl);
static void initPersistFields();
void setScriptValue(const char *value);
const char *getScriptValue();
static char *stripControlChars(const char *inString);
//-------------------------------------- Protected Structures and constants
protected:
bool mIsEditCtrl;
U32 *mTabStops;
U32 mTabStopCount;
U32 mCurTabStop;
F32 mAlpha;
DataChunker mViewChunker;
DataChunker mResourceChunker;
Line *mLineList;
Bitmap *mBitmapList;
BitmapRef *mBitmapRefList;
Font *mFontList;
LineTag *mTagList;
bool mDirty;
Style *mCurStyle;
U32 mCurLMargin;
U32 mCurRMargin;
U32 mCurJustify;
U32 mCurDiv;
U32 mCurY;
U32 mCurClipX;
Atom *mLineAtoms;
Atom **mLineAtomPtr;
Atom *mEmitAtoms;
Atom **mEmitAtomPtr;
BitmapRef mSentinel;
Line **mLineInsert;
BitmapRef *mBlockList;
U32 mScanPos;
U32 mCurX;
U32 mMaxY;
URL *mCurURL;
URL *mHitURL;
void freeLineBuffers();
void freeResources();
Bitmap *allocBitmap(const char *bitmapName, U32 bitmapNameLen);
Font *allocFont(const char *faceName, U32 faceNameLen, U32 size);
LineTag *allocLineTag(U32 id);
void emitNewLine(U32 textStart);
Atom *buildTextAtom(U32 start, U32 len, U32 left, U32 right, URL *url);
void emitTextToken(U32 textStart, U32 len);
void emitBitmapToken(Bitmap *bmp, U32 textStart, bool bitmapBreak);
void processEmitAtoms();
Atom *splitAtomListEmit(Atom *list, U32 width);
void drawAtomText(bool sel, U32 start, U32 end, Atom *atom, Line *line, Point2I offset);
Atom *findHitAtom(const Point2I localCoords);
Style *allocStyle(Style *style);
static const U32 csmTextBufferGrowthSize;
//-------------------------------------- Data...
protected:
// Cursor position should always be <= mCurrTextSize
U32 mCursorPosition;
// Actual text data. The line buffer is rebuilt from the linear text
// given a specific width. TextBuffer is /not/ \0 terminated
StringBuffer mTextBuffer;
U32 mLineStart;
S32 mMaxBufferSize;
StringTableEntry mInitialText;
// Selection information
bool mSelectionActive;
U32 mSelectionStart;
U32 mSelectionEnd;
U32 mVertMoveAnchor;
bool mVertMoveAnchorValid;
S32 mSelectionAnchor;
Point2I mSelectionAnchorDropped;
// Font resource
Resource<GFont> mFont;
U32 mMinSensibleWidth;
// Console settable parameters
U32 mLineSpacingPixels;
bool mAllowColorChars;
// Too many chars sound:
AudioProfile* mDeniedSound;
//-------------------------------------- Protected interface
protected:
// Inserting and deleting character blocks...
void deleteChars(const U32 rangeStart,
const U32 rangeEnd);
void copyToClipboard(const U32 rangeStart,
const U32 rangeEnd);
// Selection maintainance
bool isSelectionActive() const;
void clearSelection();
// Pixel -> textposition mappings
S32 getTextPosition(const Point2I& localPosition);
// Gui control overrides
bool onAdd();
bool onWake();
void onSleep();
void onPreRender();
void onRender(Point2I offset, const RectI &updateRect);
void getCursorPositionAndColor(Point2I &cursorTop, Point2I &cursorBottom, ColorI &color);
void inspectPostApply();
void resize(const Point2I &newPosition, const Point2I &newExtent);
void parentResized(const Point2I &oldParentExtent, const Point2I &newParentExtent);
bool onKeyDown(const GuiEvent& event);
void onMouseDown(const GuiEvent&);
void onMouseDragged(const GuiEvent&);
void onMouseUp(const GuiEvent&);
public:
void setSelectionStart( U32 start ) { clearSelection(); mSelectionStart = start; };
void setSelectionEnd( U32 end ) { mSelectionEnd = end;};
void setSelectionActive(bool active) { mSelectionActive = active; };
S32 getCursorPosition() { return( mCursorPosition ); }
};
#endif // _H_GUIMLTEXTCTRL_