X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7547d64ec0fce0faac0488765316f235b4b760a5..4a027aea7d4313680d94b253c9f5b72c88db5449:/samples/richedit/wxllist.h diff --git a/samples/richedit/wxllist.h b/samples/richedit/wxllist.h index bf784d0db5..d62a236737 100644 --- a/samples/richedit/wxllist.h +++ b/samples/richedit/wxllist.h @@ -1,7 +1,7 @@ /*-*- c++ -*-******************************************************** - * wxLayoutList.h - a formatted text rendering engine for wxWindows * + * wxLayoutList.h - a formatted text rendering engine for wxWidgets * * * - * (C) 1999 by Karsten Ballüder (Ballueder@usa.net) * + * (C) 1999-2000 by Karsten Ballüder (ballueder@gmx.net) * * * * $Id$ *******************************************************************/ @@ -28,25 +28,48 @@ # define WXMENU_LAYOUT_LCLICK 1111 # define WXMENU_LAYOUT_RCLICK 1112 # define WXMENU_LAYOUT_DBLCLICK 1113 +#else // for Mahogany only +# include "MObject.h" #endif -// use the wxWindows caret class instead of home grown cursor whenever possible +// use the wxWidgets caret class instead of home grown cursor whenever possible #ifdef __WXMSW__ - #undef WXLAYOUT_USE_CARET - #define WXLAYOUT_USE_CARET 1 +# undef WXLAYOUT_USE_CARET +# define WXLAYOUT_USE_CARET 1 #endif // __WXMSW__ -// do not enable debug mode within Mahogany -#if defined(__WXDEBUG__) && ! defined(M_BASEDIR) +// do not enable debug mode within Mahogany unless in debug mode +#if defined(__WXDEBUG__) && (( ! defined(M_BASEDIR) )|| defined(DEBUG)) # define WXLAYOUT_DEBUG #endif #ifdef WXLAYOUT_DEBUG # define WXLO_TRACE(x) wxLogDebug(x) +// activate profiling: # define WXLO_PROFILE #else # define WXLO_TRACE(x) #endif +/* Some profiling code: */ +#if defined (WXLO_PROFILE) +#include +#include + +# define WXLO_TIMER_DEFINE(x) static struct timeval x +# define WXLO_TIMER_START(x) gettimeofday(&x,NULL) +# define WXLO_TIMER_STOP(x) { struct timeval y; \ + gettimeofday(&y,NULL); \ + x.tv_sec -= y.tv_sec; x.tv_usec -= y.tv_usec; } +# define WXLO_TIMER_PRINT(x) wxLogDebug("Timer " #x " elapsed: %ld", \ + (long)(x.tv_sec * -1000 - x.tv_usec)); +#else +# define WXLO_TIMER_DEFINE(x) +# define WXLO_TIMER_START(x) +# define WXLO_TIMER_STOP(x) +# define WXLO_TIMER_PRINT(x) +#endif + + #define WXLO_DEBUG_URECT 0 #ifndef WXLO_DEFAULTFONTSIZE @@ -62,14 +85,20 @@ /// Types of currently supported layout objects. enum wxLayoutObjectType { - /// illegal object type, should never appear - WXLO_TYPE_INVALID = 0, - /// text object, containing normal text - WXLO_TYPE_TEXT, - /// command object, containing font or colour changes - WXLO_TYPE_CMD, - /// icon object, any kind of image - WXLO_TYPE_ICON + /// illegal object type, should never appear + WXLO_TYPE_INVALID = 0, + + /// text object, containing normal text + WXLO_TYPE_TEXT, + + /// command object, containing font or colour changes + WXLO_TYPE_CMD, + + /// icon object, any kind of image + WXLO_TYPE_ICON, + + /// a linebreak, does not exist as an object + WXLO_TYPE_LINEBREAK }; /// Type used for coordinates in drawing. Must be signed. @@ -96,120 +125,136 @@ class WXDLLEXPORT wxFont; its size. */ class wxLayoutObject +#ifdef M_BASEDIR + : public MObject +#endif { public: - /** This structure can be used to contain data associated with the - object. - It is refcounted, so the caller has to do a DecRef() on it - instead of a delete. - */ - struct UserData - { - UserData() { m_refcount = 1; } - inline void IncRef(void) { m_refcount++; } - inline void DecRef(void) { m_refcount--; if(m_refcount == 0) delete this;} - inline void SetLabel(const wxString &l) { m_label = l; } - inline const wxString & GetLabel(void) const { return m_label; } - private: - int m_refcount; - wxString m_label; - protected: - virtual ~UserData() { wxASSERT(m_refcount == 0); } - /// prevents gcc from generating stupid warnings - friend class dummy_UserData; - }; - - /// return the type of this object - virtual wxLayoutObjectType GetType(void) const { return WXLO_TYPE_INVALID; } - /** Calculates the size of an object. - @param dc the wxDC to draw on - @param llist the wxLayoutList - */ - virtual void Layout(wxDC &dc, wxLayoutList *llist) = 0; - - /** Draws an object. - @param dc the wxDC to draw on - @param coords where to draw the baseline of the object. - @param wxllist pointer to wxLayoutList - @param begin if !=-1, from which position on to highlight it - @param end if begin !=-1, how many positions to highlight it - */ - virtual void Draw(wxDC & /* dc */, - wxPoint const & /* coords */, - wxLayoutList *wxllist, - CoordType begin = -1, - CoordType end = -1) { } - - /** Calculates and returns the size of the object. - @param top where to store height above baseline - @param bottom where to store height below baseline - @return the size of the object's box in pixels - */ - virtual wxPoint GetSize(CoordType * top, CoordType *bottom) const - { *top = 0; *bottom = 0; return wxPoint(0,0); } - - /// Return just the width of the object on the screen. - virtual CoordType GetWidth(void) const { return 0; } - /// returns the number of cursor positions occupied by this object - virtual CoordType GetLength(void) const { return 1; } - /** Returns the cursor offset relating to the screen x position - relative to begin of object. - @param dc the wxDC to use for calculations - @param xpos relative x position from head of object - @return cursor coordinate offset - */ - virtual CoordType GetOffsetScreen(wxDC &dc, CoordType xpos) const { return 0; } - - /// constructor - wxLayoutObject() { m_UserData = NULL; } - /// delete the user data - virtual ~wxLayoutObject() { if(m_UserData) m_UserData->DecRef(); } + /** This structure can be used to contain data associated with the + object. + It is refcounted, so the caller has to do a DecRef() on it + instead of a delete. + */ + struct UserData + { + UserData() { m_refcount = 1; } + inline void IncRef() { m_refcount++; } + inline void DecRef() { m_refcount--; if(m_refcount == 0) delete this;} + inline void SetLabel(const wxString &l) { m_label = l; } + inline const wxString & GetLabel() const { return m_label; } + private: + int m_refcount; + wxString m_label; + protected: + virtual ~UserData() { wxASSERT(m_refcount == 0); } + /// prevents gcc from generating stupid warnings + friend class dummy_UserData; + }; + + /// return the type of this object + virtual wxLayoutObjectType GetType() const { return WXLO_TYPE_INVALID; } + /** Calculates the size of an object. + @param dc the wxDC to draw on + @param llist the wxLayoutList + */ + virtual void Layout(wxDC &dc, wxLayoutList *llist) = 0; + + /** Draws an object. + @param dc the wxDC to draw on + @param coords where to draw the baseline of the object. + @param wxllist pointer to wxLayoutList + @param begin if !=-1, from which position on to highlight it + @param end if begin !=-1, how many positions to highlight it + */ + virtual void Draw(wxDC & /* dc */, + wxPoint const & /* coords */, + wxLayoutList *WXUNUSED(wxllist), + CoordType WXUNUSED(begin) = -1, + CoordType WXUNUSED(end) = -1) { } + + /** Calculates and returns the size of the object. + @param top where to store height above baseline + @param bottom where to store height below baseline + @return the size of the object's box in pixels + */ + virtual wxPoint GetSize(CoordType * top, CoordType *bottom) const + { *top = 0; *bottom = 0; return wxPoint(0,0); } + + /// Return just the width of the object on the screen. + virtual CoordType GetWidth() const { return 0; } + + /// returns the number of cursor positions occupied by this object + virtual CoordType GetLength() const { return 1; } + + /** Returns the cursor offset relating to the screen x position + relative to begin of object. + @param dc the wxDC to use for calculations + @param xpos relative x position from head of object + @return cursor coordinate offset + */ + virtual CoordType GetOffsetScreen( wxDC & WXUNUSED(dc), + CoordType WXUNUSED(xpos) ) const + { + return 0; + } + + /// constructor + wxLayoutObject() { m_UserData = NULL; } + + /// delete the user data + virtual ~wxLayoutObject() { if(m_UserData) m_UserData->DecRef(); } #ifdef WXLAYOUT_DEBUG - virtual void Debug(void); + virtual wxString DebugDump() const; #endif - /** Tells the object about some user data. This data is associated - with the object and will be deleted at destruction time. - It is reference counted. - */ - void SetUserData(UserData *data) - { - if(m_UserData) + /** Tells the object about some user data. This data is associated + with the object and will be deleted at destruction time. + It is reference counted. + */ + void SetUserData(UserData *data) + { + if(m_UserData) m_UserData->DecRef(); - m_UserData = data; - if(m_UserData) + + m_UserData = data; + + if(m_UserData) m_UserData->IncRef(); - } + } - /** Return the user data. - Increments the object's reference count. When no longer needed, - caller must call DecRef() on the pointer returned. - */ - UserData * GetUserData(void) const { if(m_UserData) m_UserData->IncRef(); return m_UserData; } + /** Return the user data. + Increments the object's reference count. When no longer needed, + caller must call DecRef() on the pointer returned. + */ + UserData * GetUserData() const { if(m_UserData) m_UserData->IncRef(); return m_UserData; } - /** Makes a copy of this object. + /** Makes a copy of this object. */ - virtual wxLayoutObject *Copy(void) = 0; + virtual wxLayoutObject *Copy() = 0; + + /** Clipboard support function. Read and write objects to + strings. */ + //@{ + /// Writes the object to the string. + virtual void Write(wxString &ostr) = 0; - /** Clipboard support function. Read and write objects to - strings. */ - //@{ - /// Writes the object to the string. - virtual void Write(wxString &ostr) = 0; - /** Reads an object. - @param str stream to read from, will bee changed - @return true on success - */ - static wxLayoutObject *Read(wxString &istr); - //@} + /** Reads an object. + @param str stream to read from, will bee changed + @return true on success + */ + static wxLayoutObject *Read(wxString &istr); + //@} - /// returns TRUE if the object is shown on the screen (i.e. not cmd object) - bool IsVisibleObject() const { return GetType() != WXLO_TYPE_CMD; } + /// returns true if the object is shown on the screen (i.e. not cmd object) + bool IsVisibleObject() const { return GetType() != WXLO_TYPE_CMD; } protected: - /// optional data for application's use - UserData *m_UserData; + /// optional data for application's use + UserData *m_UserData; +#if defined (M_BASEDIR) && defined (DEBUG) + MOBJECT_NAME(wxLayoutObject) +#endif }; /// Define a list type of wxLayoutObject pointers. @@ -217,6 +262,7 @@ KBLIST_DEFINE(wxLayoutObjectList, wxLayoutObject); /// An illegal iterator to save typing. #define NULLIT (wxLayoutObjectList::iterator(NULL)) + /// The iterator type. typedef wxLayoutObjectList::iterator wxLOiterator; @@ -230,53 +276,61 @@ typedef wxLayoutObjectList::iterator wxLOiterator; class wxLayoutObjectText : public wxLayoutObject { public: - wxLayoutObjectText(const wxString &txt = ""); - - virtual wxLayoutObjectType GetType(void) const { return WXLO_TYPE_TEXT; } - virtual void Layout(wxDC &dc, wxLayoutList *llist); - virtual void Draw(wxDC &dc, wxPoint const &coords, - wxLayoutList *wxllist, - CoordType begin = -1, - CoordType end = -1); - /** Calculates and returns the size of the object. - @param top where to store height above baseline - @param bottom where to store height below baseline - @return the size of the object's box in pixels - */ - virtual wxPoint GetSize(CoordType * top, CoordType *bottom) const; - /// Return just the width of the object on the screen. - virtual CoordType GetWidth(void) const { return m_Width; } - /** Returns the cursor offset relating to the screen x position - relative to begin of object. - @param dc the wxDC to use for calculations - @param xpos relative x position from head of object - @return cursor coordinate offset - */ - virtual CoordType GetOffsetScreen(wxDC &dc, CoordType xpos) const; - - virtual void Write(wxString &ostr); - static wxLayoutObjectText *Read(wxString &istr); + wxLayoutObjectText(const wxString &txt = wxEmptyString); + + virtual wxLayoutObjectType GetType() const { return WXLO_TYPE_TEXT; } + virtual void Layout(wxDC &dc, wxLayoutList *llist); + virtual void Draw(wxDC &dc, wxPoint const &coords, + wxLayoutList *wxllist, + CoordType begin = -1, + CoordType end = -1); + + /** Calculates and returns the size of the object. + @param top where to store height above baseline + @param bottom where to store height below baseline + @return the size of the object's box in pixels + */ + virtual wxPoint GetSize(CoordType * top, CoordType *bottom) const; + + /// Return just the width of the object on the screen. + virtual CoordType GetWidth() const { return m_Width; } + + /** Returns the cursor offset relating to the screen x position + relative to begin of object. + @param dc the wxDC to use for calculations + @param xpos relative x position from head of object + @return cursor coordinate offset + */ + virtual CoordType GetOffsetScreen(wxDC &dc, CoordType xpos) const; + + virtual void Write(wxString &ostr); + static wxLayoutObjectText *Read(wxString &istr); #ifdef WXLAYOUT_DEBUG - virtual void Debug(void); + virtual wxString DebugDump() const; #endif - virtual CoordType GetLength(void) const { return strlen(m_Text.c_str()); } + virtual CoordType GetLength() const { return wxStrlen(m_Text.c_str()); } + + // for editing: + wxString & GetText() { return m_Text; } - // for editing: - wxString & GetText(void) { return m_Text; } - void SetText(wxString const &text) { m_Text = text; } - /** Makes a copy of this object. + void SetText(wxString const &text) { m_Text = text; } + /** Makes a copy of this object. */ - virtual wxLayoutObject *Copy(void); + virtual wxLayoutObject *Copy(); + private: - wxString m_Text; - /// size of the box containing text - long m_Width, m_Height; - /// Height above baseline. - long m_Top; - /// Height below baseline. - long m_Bottom; + wxString m_Text; + + /// size of the box containing text + long m_Width, m_Height; + + /// Height above baseline. + long m_Top; + + /// Height below baseline. + long m_Bottom; }; /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * @@ -289,89 +343,98 @@ private: class wxLayoutObjectIcon : public wxLayoutObject { public: - wxLayoutObjectIcon(wxBitmap *icon = NULL); - wxLayoutObjectIcon(wxBitmap const &icon); - - ~wxLayoutObjectIcon() { if(m_Icon) delete m_Icon; } - - virtual wxLayoutObjectType GetType(void) const { return WXLO_TYPE_ICON; } - virtual void Layout(wxDC &dc, wxLayoutList *llist); - virtual void Draw(wxDC &dc, wxPoint const &coords, - wxLayoutList *wxllist, - CoordType begin = -1, - CoordType end = -1); - - /** Calculates and returns the size of the object. - @param top where to store height above baseline - @param bottom where to store height below baseline - @return the size of the object's box in pixels - */ - virtual wxPoint GetSize(CoordType * top, CoordType *bottom) const; - /// Return just the width of the object on the screen. - virtual CoordType GetWidth(void) const { return m_Icon->GetWidth(); } - // return a pointer to the icon - wxBitmap *GetIcon(void) const { return m_Icon; } - /** Makes a copy of this object. - */ - virtual wxLayoutObject *Copy(void); - virtual void Write(wxString &ostr); - static wxLayoutObjectIcon *Read(wxString &istr); + wxLayoutObjectIcon(wxBitmap *icon = NULL); + wxLayoutObjectIcon(wxBitmap const &icon); + + ~wxLayoutObjectIcon() { if(m_Icon) delete m_Icon; } + + virtual wxLayoutObjectType GetType() const { return WXLO_TYPE_ICON; } + virtual void Layout(wxDC &dc, wxLayoutList *llist); + virtual void Draw(wxDC &dc, wxPoint const &coords, + wxLayoutList *wxllist, + CoordType begin = -1, + CoordType end = -1); + + /** Calculates and returns the size of the object. + @param top where to store height above baseline + @param bottom where to store height below baseline + @return the size of the object's box in pixels + */ + virtual wxPoint GetSize(CoordType * top, CoordType *bottom) const; + + /// Return just the width of the object on the screen. + virtual CoordType GetWidth() const { return m_Icon->GetWidth(); } + + // return a pointer to the icon + wxBitmap *GetIcon() const { return m_Icon; } + + /** Makes a copy of this object. + */ + virtual wxLayoutObject *Copy(); + virtual void Write(wxString &ostr); + static wxLayoutObjectIcon *Read(wxString &istr); + private: - wxBitmap *m_Icon; + wxBitmap *m_Icon; }; /** This structure holds all formatting information. */ struct wxLayoutStyleInfo { - wxLayoutStyleInfo(int ifamily = wxDEFAULT, - int isize = WXLO_DEFAULTFONTSIZE, - int istyle = wxNORMAL, - int iweight = wxNORMAL, - int iul = FALSE, - wxColour *fg = NULL, - wxColour *bg = NULL); - wxLayoutStyleInfo & operator=(const wxLayoutStyleInfo &right); - - wxColour & GetBGColour() { return m_bg; } - - /// Font change parameters. - int size, family, style, weight, underline; - /// Colours - wxColour m_bg, m_fg; - int m_fg_valid, m_bg_valid; // bool, but must be int! + wxLayoutStyleInfo(int ifamily = -1, + int isize = -1, + int istyle = -1, + int iweight = -1, + int iul = -1, + wxColour *fg = NULL, + wxColour *bg = NULL); + + wxLayoutStyleInfo & operator=(const wxLayoutStyleInfo &right); + + wxColour & GetBGColour() { return m_bg; } + + /// Font change parameters. + int size, family, style, weight, underline; + + /// Colours + wxColour m_bg, m_fg; + int m_fg_valid, m_bg_valid; // bool, but must be int! }; /// a cached font class wxFontCacheEntry { public: - wxFontCacheEntry(int family, int size, int style, int weight, - bool underline) - { - m_Family = family; m_Size = size; m_Style = style; - m_Weight = weight; m_Underline = underline; - m_Font = new wxFont(m_Size, m_Family, - m_Style, m_Weight, m_Underline); - } - bool Matches(int family, int size, int style, int weight, - bool underline) const - { - return size == m_Size && family == m_Family + wxFontCacheEntry(int family, int size, int style, int weight, + bool underline) + { + m_Family = family; m_Size = size; m_Style = style; + m_Weight = weight; m_Underline = underline; + m_Font = new wxFont(m_Size, m_Family, + m_Style, m_Weight, m_Underline); + } + + bool Matches(int family, int size, int style, int weight, + bool underline) const + { + return size == m_Size && family == m_Family && style == m_Style && weight == m_Weight && underline == m_Underline; - } - wxFont & GetFont(void) { return *m_Font; } - ~wxFontCacheEntry() - { - delete m_Font; - } + } + + wxFont & GetFont() { return *m_Font; } + ~wxFontCacheEntry() + { + delete m_Font; + } + private: - wxFont *m_Font; + wxFont *m_Font; - // VZ: I wonder why it doesn't use wxLayoutStyleInfo instead of those? - int m_Family, m_Size, m_Style, m_Weight; - bool m_Underline; + // VZ: I wonder why it doesn't use wxLayoutStyleInfo instead of those? + int m_Family, m_Size, m_Style, m_Weight; + bool m_Underline; }; KBLIST_DEFINE(wxFCEList, wxFontCacheEntry); @@ -379,15 +442,17 @@ KBLIST_DEFINE(wxFCEList, wxFontCacheEntry); class wxFontCache { public: - wxFont & GetFont(int family, int size, int style, int weight, - bool underline); - wxFont & GetFont(wxLayoutStyleInfo const &si) - { - return GetFont(si.family, si.size, si.style, si.weight, - si.underline != 0); - } + wxFont & GetFont(int family, int size, int style, int weight, + bool underline); + + wxFont & GetFont(wxLayoutStyleInfo const &si) + { + return GetFont(si.family, si.size, si.style, si.weight, + si.underline != 0); + } + private: - wxFCEList m_FontList; + wxFCEList m_FontList; }; /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * @@ -400,29 +465,33 @@ private: class wxLayoutObjectCmd : public wxLayoutObject { public: - virtual wxLayoutObjectType GetType(void) const { return WXLO_TYPE_CMD; } - virtual void Layout(wxDC &dc, wxLayoutList *llist); - virtual void Draw(wxDC &dc, wxPoint const &coords, - wxLayoutList *wxllist, - CoordType begin = -1, - CoordType end = -1); - wxLayoutObjectCmd(int family = -1, - int size = -1, - int style = -1, - int weight = -1, - int underline = -1, - wxColour *fg = NULL, - wxColour *bg = NULL); - ~wxLayoutObjectCmd(); - /** Stores the current style in the styleinfo structure */ - wxLayoutStyleInfo * GetStyle(void) const; - /** Makes a copy of this object. - */ - virtual wxLayoutObject *Copy(void); - virtual void Write(wxString &ostr); - static wxLayoutObjectCmd *Read(wxString &istr); + virtual wxLayoutObjectType GetType() const { return WXLO_TYPE_CMD; } + virtual void Layout(wxDC &dc, wxLayoutList *llist); + virtual void Draw(wxDC &dc, wxPoint const &coords, + wxLayoutList *wxllist, + CoordType begin = -1, + CoordType end = -1); + + wxLayoutObjectCmd(int family = -1, + int size = -1, + int style = -1, + int weight = -1, + int underline = -1, + wxColour *fg = NULL, + wxColour *bg = NULL); + + wxLayoutObjectCmd(const wxLayoutStyleInfo &si); + ~wxLayoutObjectCmd(); + /** Stores the current style in the styleinfo structure */ + wxLayoutStyleInfo * GetStyle() const; + /** Makes a copy of this object. + */ + virtual wxLayoutObject *Copy(); + virtual void Write(wxString &ostr); + static wxLayoutObjectCmd *Read(wxString &istr); + private: - wxLayoutStyleInfo *m_StyleInfo; + wxLayoutStyleInfo *m_StyleInfo; }; /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * @@ -440,294 +509,327 @@ private: class wxLayoutLine { public: - /** Constructor. - @param prev pointer to previous line or NULL - @param next pointer to following line or NULL - @param llist pointer to layout list - */ - wxLayoutLine(wxLayoutLine *prev, wxLayoutList *llist); - /** This function inserts a new object at cursor position xpos. - @param xpos where to insert new object - @param obj the object to insert - @return true if that xpos existed and the object was inserted - */ - bool Insert(CoordType xpos, wxLayoutObject *obj); - - /** This function inserts text at cursor position xpos. - @param xpos where to insert - @param text the text to insert - @return true if that xpos existed and the object was inserted - */ - bool Insert(CoordType xpos, const wxString& text); - - /** This function appends an object to the line. - @param obj the object to insert - */ - void Append(wxLayoutObject * obj) - { - wxASSERT(obj); - - m_ObjectList.push_back(obj); - m_Length += obj->GetLength(); - } - - /** This function appens the next line to this, i.e. joins the two - lines into one. - */ - void MergeNextLine(wxLayoutList *llist); - - /** This function deletes npos cursor positions from position xpos. - @param xpos where to delete - @param npos how many positions - @return number of positions still to be deleted - */ - CoordType Delete(CoordType xpos, CoordType npos); - - /** This function breaks the line at a given cursor position. - @param xpos where to break it - @return pointer to the new line object replacing the old one - */ - wxLayoutLine *Break(CoordType xpos, wxLayoutList *llist); - - /** Deletes the next word from this position, including leading - whitespace. - This function does not delete over font changes, i.e. a word - with formatting instructions in the middle of it is treated as - two (three actually!) words. In fact, if the cursor is on a non-text object, that - one is treated as a word. - @param xpos from where to delete - @return true if a word was deleted - */ - bool DeleteWord(CoordType npos); - - /** Finds a suitable position left to the given column to break the - line. - @param column we want to break the line to the left of this - @return column for breaking line or -1 if no suitable location found - */ - CoordType GetWrapPosition(CoordType column); - - /** Finds the object which covers the cursor position xpos in this - line. - @param xpos the column number - @param offset where to store the difference between xpos and - the object's head - @return iterator to the object or NULLIT - */ - wxLayoutObjectList::iterator FindObject(CoordType xpos, CoordType - *offset) const ; - - /** Finds the object which covers the screen position xpos in this - line. - @param dc the wxDC to use for calculations - @param xpos the screen x coordinate - @param offset where to store the difference between xpos and - the object's head - @return iterator to the object or NULLIT - */ - wxLayoutObjectList::iterator FindObjectScreen(wxDC &dc, - CoordType xpos, - CoordType *offset, - bool *found = NULL) const ; - - /** Finds text in this line. - @param needle the text to find - @param xpos the position where to start the search - @return the cursoor coord where it was found or -1 - */ - CoordType FindText(const wxString &needle, CoordType xpos = 0) const; - - /** Get the first object in the list. This is used by the wxlparser - functions to export the list. - @return iterator to the first object - */ - wxLayoutObjectList::iterator GetFirstObject(void) - { - return m_ObjectList.begin(); - } - - /** Deletes this line, returns pointer to next line. - @param update If true, update all following lines. - */ - wxLayoutLine *DeleteLine(bool update, wxLayoutList *llist); - - /**@name Cursor Management */ - //@{ - /** Return the line number of this line. - @return the line number - */ - inline CoordType GetLineNumber(void) const { return m_LineNumber; } - /** Return the length of the line. - @return line lenght in cursor positions - */ - inline CoordType GetLength(void) const { return m_Length; } - //@} - - /**@name Drawing and Layout */ - //@{ - /** Draws the line on a wxDC. - @param dc the wxDC to draw on - @param llist the wxLayoutList - @param offset an optional offset to shift printout - */ - void Draw(wxDC &dc, - wxLayoutList *llist, - const wxPoint &offset = wxPoint(0,0)) const; - - /** Recalculates the positions of objects and the height of the - line. - @param dc the wxDC to draw on - @param llist th e wxLayoutList - @param cursorPos if not NULL, set cursor screen position in there - @param cursorSize if not cursorPos != NULL, set cursor size in there - @param cx if cursorPos != NULL, the cursor x position - @param suppressStyleUpdate FALSe normally, only to suppress updating of m_StyleInfo - */ - void Layout(wxDC &dc, - wxLayoutList *llist, - wxPoint *cursorPos = NULL, - wxPoint *cursorSize = NULL, - int cx = 0, - bool suppressStyleUpdate = FALSE); - /** This function finds an object belonging to a given cursor - position. It assumes that Layout() has been called before. - @param dc the wxDC to use for calculations - @param xpos screen x position - @param found if non-NULL set to false if we return the last - object before the cursor, to true if we really have an object - for that position - @return pointer to the object - */ - wxLayoutObject * FindObjectScreen(wxDC &dc, CoordType xpos, bool - *found = NULL); - /** This sets the style info for the beginning of this line. - @param si styleinfo structure - */ - void ApplyStyle(const wxLayoutStyleInfo &si) - { m_StyleInfo = si; } - - //@} - - /**@name List traversal */ - //@{ - /// Returns pointer to next line. - wxLayoutLine *GetNextLine(void) const { return m_Next; } - /// Returns pointer to previous line. - wxLayoutLine *GetPreviousLine(void) const { return m_Previous; } - /// Sets the link to the next line. - void SetNext(wxLayoutLine *next) - { m_Next = next; if(next) next->m_Previous = this; } - /// Sets the link to the previous line. - void SetPrevious(wxLayoutLine *previous) - { m_Previous = previous; if(previous) previous->m_Next = this; } - //@} - - /// Returns the position of this line on the canvas. - wxPoint GetPosition(void) const { return m_Position; } - /// Returns the height of this line. - CoordType GetHeight(void) const { return m_Height; } - /// Returns the width of this line. - CoordType GetWidth(void) const { return m_Width; } - /** This will recalculate the position and size of this line. - If called recursively it will abort if the position of an - object is unchanged, assuming that none of the following - objects need to move. - @param recurse if greater 0 then it will be used as the - minimum(!) recursion level, continue with all lines till the end of - the list or until the coordinates no longer changed. - */ - void RecalculatePositions(int recurse, wxLayoutList *llist); - /// Recalculates the position of this line on the canvas. - wxPoint RecalculatePosition(wxLayoutList *llist); - - /** Copies the contents of this line to another wxLayoutList - @param llist the wxLayoutList destination - @param from x cursor coordinate where to start - @param to x cursor coordinate where to stop, -1 for end of line - */ - void Copy(wxLayoutList *llist, - CoordType from = 0, - CoordType to = -1); + /** Constructor. + @param prev pointer to previous line or NULL + @param next pointer to following line or NULL + @param llist pointer to layout list + */ + wxLayoutLine(wxLayoutLine *prev, wxLayoutList *llist); + /** This function inserts a new object at cursor position xpos. + @param xpos where to insert new object + @param obj the object to insert + @return true if that xpos existed and the object was inserted + */ + bool Insert(CoordType xpos, wxLayoutObject *obj); + + /** This function inserts text at cursor position xpos. + @param xpos where to insert + @param text the text to insert + @return true if that xpos existed and the object was inserted + */ + bool Insert(CoordType xpos, const wxString& text); + + /** This function appends an object to the line. + @param obj the object to insert + */ + void Append(wxLayoutObject * obj) + { + wxASSERT(obj); + m_ObjectList.push_back(obj); + m_Length += obj->GetLength(); + } + + /** This function prepends an object to the line. */ + void Prepend(wxLayoutObject * obj) + { + wxASSERT(obj); + m_ObjectList.push_front(obj); + m_Length += obj->GetLength(); + } + + /** This function appens the next line to this, i.e. joins the two + lines into one. + */ + void MergeNextLine(wxLayoutList *llist); + + /** This function deletes npos cursor positions from position xpos. + @param xpos where to delete + @param npos how many positions + @return number of positions still to be deleted + */ + CoordType Delete(CoordType xpos, CoordType npos); + + /** This function breaks the line at a given cursor position. + @param xpos where to break it + @return pointer to the new line object replacing the old one + */ + wxLayoutLine *Break(CoordType xpos, wxLayoutList *llist); + + /** This function wraps the line: breaks it at a suitable point + and merges it with the next. + @param wrapmargin + @return true if broken + */ + bool Wrap(CoordType wrapmargin, wxLayoutList *llist); + + /** Deletes the next word from this position, including leading + whitespace. + This function does not delete over font changes, i.e. a word + with formatting instructions in the middle of it is treated as + two (three actually!) words. In fact, if the cursor is on a non-text object, that + one is treated as a word. + @param xpos from where to delete + @return true if a word was deleted + */ + bool DeleteWord(CoordType npos); + + /** Finds a suitable position left to the given column to break the + line. + @param column we want to break the line to the left of this + @return column for breaking line or -1 if no suitable location found + */ + CoordType GetWrapPosition(CoordType column); + + /** Finds the object which covers the cursor position xpos in this + line. + @param xpos the column number + @param offset where to store the difference between xpos and + the object's head + @return iterator to the object or NULLIT + */ + wxLayoutObjectList::iterator FindObject(CoordType xpos, CoordType + *offset) const ; + + /** Finds the object which covers the screen position xpos in this + line. + @param dc the wxDC to use for calculations + @param llist the layout list to which this line belongs + @param xpos the screen x coordinate + @param offset where to store the difference between xpos and + the object's head + @return iterator to the object or NULLIT + */ + wxLayoutObjectList::iterator FindObjectScreen(wxDC &dc, + wxLayoutList *llist, + CoordType xpos, + CoordType *offset, + bool *found = NULL) const ; + + /** Finds text in this line. + @param needle the text to find + @param xpos the position where to start the search + @return the cursoor coord where it was found or -1 + */ + CoordType FindText(const wxString &needle, CoordType xpos = 0) const; + + /** Get the first object in the list. This is used by the wxlparser + functions to export the list. + @return iterator to the first object + */ + wxLayoutObjectList::iterator GetFirstObject() const + { + return m_ObjectList.begin(); + } + + /// Get the last object in the list. + wxLayoutObjectList::iterator GetLastObject() const + { + return m_ObjectList.tail(); + } + + /** Deletes this line, returns pointer to next line. + @param update If true, update all following lines. + */ + wxLayoutLine *DeleteLine(bool update, wxLayoutList *llist); + + /**@name Cursor Management */ + //@{ + /** Return the line number of this line. + @return the line number + */ + inline CoordType GetLineNumber() const { return m_LineNumber; } + + /** Return the length of the line. + @return line length in cursor positions + */ + inline CoordType GetLength() const { return m_Length; } + //@} + + /**@name Drawing and Layout */ + //@{ + /** Draws the line on a wxDC. + @param dc the wxDC to draw on + @param llist the wxLayoutList + @param offset an optional offset to shift printout + */ + void Draw(wxDC &dc, + wxLayoutList *llist, + const wxPoint &offset = wxPoint(0,0)) const; + + /** Recalculates the positions of objects and the height of the + line. + @param dc the wxDC to draw on + @param llist th e wxLayoutList + @param cursorPos if not NULL, set cursor screen position in there + @param cursorSize if not cursorPos != NULL, set cursor size in there + @param cursorStyle if non NULL where to store styleinfo for cursor pos + @param cx if cursorPos != NULL, the cursor x position + @param suppressStyleUpdate FALSe normally, only to suppress updating of m_StyleInfo + */ + void Layout(wxDC &dc, + wxLayoutList *llist, + wxPoint *cursorPos = NULL, + wxPoint *cursorSize = NULL, + wxLayoutStyleInfo *cursorStyle = NULL, + int cx = 0, + bool suppressStyleUpdate = false); + + /** This function finds an object belonging to a given cursor + position. It assumes that Layout() has been called before. + @param dc the wxDC to use for calculations + @param xpos screen x position + @param found if non-NULL set to false if we return the last + object before the cursor, to true if we really have an object + for that position + @return pointer to the object + */ + wxLayoutObject * FindObjectScreen(wxDC &dc, + CoordType xpos, + bool *found = NULL); + + /** This sets the style info for the beginning of this line. + @param si styleinfo structure + */ + void ApplyStyle(const wxLayoutStyleInfo &si) + { m_StyleInfo = si; } + + //@} + + /**@name List traversal */ + //@{ + /// Returns pointer to next line. + wxLayoutLine *GetNextLine() const { return m_Next; } + + /// Returns pointer to previous line. + wxLayoutLine *GetPreviousLine() const { return m_Previous; } + + /// Sets the link to the next line. + void SetNext(wxLayoutLine *next) + { m_Next = next; if(next) next->m_Previous = this; } + + /// Sets the link to the previous line. + void SetPrevious(wxLayoutLine *previous) + { m_Previous = previous; if(previous) previous->m_Next = this; } + //@} + + /// Returns the position of this line on the canvas. + wxPoint GetPosition() const { return m_Position; } + + /// Returns the height of this line. + CoordType GetHeight() const { return m_Height; } + + /// Returns the width of this line. + CoordType GetWidth() const { return m_Width; } + + /// Recalculates the position of this line on the canvas. + wxPoint RecalculatePosition(wxLayoutList *llist); + + /** Copies the contents of this line to another wxLayoutList + @param llist the wxLayoutList destination + @param from x cursor coordinate where to start + @param to x cursor coordinate where to stop, -1 for end of line + */ + void Copy(wxLayoutList *llist, + CoordType from = 0, + CoordType to = -1); #ifdef WXLAYOUT_DEBUG - void Debug(void); + void Debug() const; #endif - wxLayoutStyleInfo const & GetStyleInfo() const { return m_StyleInfo; } - - /// Returns dirty state - bool IsDirty(void) const { return m_Dirty; } - /** Marks this line as diry. - @param left xpos from where it is dirty or -1 for all - */ - void MarkDirty(CoordType left = -1) - { - if ( left != -1 ) - { - if ( m_updateLeft == -1 || left < m_updateLeft ) - m_updateLeft = left; - } - - m_Dirty = true; - } - /** Marks the following lines as dirty. - @param recurse if -1 recurse to end of list, otherwise depth of recursion. - */ - void MarkNextDirty(int recurse = 0); - /// Reset the dirty flag - void MarkClean() { m_Dirty = false; m_updateLeft = -1; } + wxLayoutStyleInfo const & GetStyleInfo() const { return m_StyleInfo; } + + /// Returns dirty state + bool IsDirty() const { return m_Dirty; } + + /** Marks this line as diry. + @param left xpos from where it is dirty or -1 for all + */ + void MarkDirty(CoordType left = -1) + { + if ( left != -1 ) + { + if ( m_updateLeft == -1 || left < m_updateLeft ) + m_updateLeft = left; + } + + m_Dirty = true; + if(m_Next) m_Next->MarkDirty(); + } + + /// Reset the dirty flag + void MarkClean() { m_Dirty = false; m_updateLeft = -1; } private: - /// Destructor is private. Use DeleteLine() to remove it. - ~wxLayoutLine(); - - /**@name Functions to let the lines synchronise with each other. */ - //@{ - /** Sets the height of this line. Will mark following lines as - dirty. - @param height new height - */ - void SetHeight(CoordType height, wxLayoutList *llist) - { m_Height = height; RecalculatePositions(true, llist); } - - /** Moves the linenumbers one on, because a line has been inserted - or deleted. - @param delta either +1 or -1 - */ - void MoveLines(int delta) - { - m_LineNumber += delta; - if(m_Next) m_Next->MoveLines(delta); - } - //@} + /// Destructor is private. Use DeleteLine() to remove it. + ~wxLayoutLine(); + + /**@name Functions to let the lines synchronise with each other. */ + //@{ + /** Sets the height of this line. Will mark following lines as + dirty. + @param height new height + */ + void SetHeight( CoordType height, wxLayoutList * WXUNUSED(llist) ) + { + m_Height = height; MarkDirty(); + } + + /** Updates the line numbers. */ + void ReNumber(); + //@} + private: - /// The line number. - CoordType m_LineNumber; - /// The line length in cursor positions. - CoordType m_Length; - /// The total height of the line. - CoordType m_Height; - /// The total width of the line on screen. - CoordType m_Width; - /// The baseline for drawing objects - CoordType m_BaseLine; - /// The position on the canvas. - wxPoint m_Position; - /// The list of objects - wxLayoutObjectList m_ObjectList; - /// Have we been changed since the last layout? - bool m_Dirty; - /// The coordinate of the left boundary of the update rectangle (if m_Dirty) - CoordType m_updateLeft; - /// Pointer to previous line if it exists. - wxLayoutLine *m_Previous; - /// Pointer to next line if it exists. - wxLayoutLine *m_Next; - /// A StyleInfo structure, holding the current settings. - wxLayoutStyleInfo m_StyleInfo; - /// Just to suppress gcc compiler warnings. - friend class dummy; + /// The line number. + CoordType m_LineNumber; + + /// The line length in cursor positions. + CoordType m_Length; + + /// The total height of the line. + CoordType m_Height; + + /// The total width of the line on screen. + CoordType m_Width; + + /// The baseline for drawing objects + CoordType m_BaseLine; + + /// The position on the canvas. + wxPoint m_Position; + + /// The list of objects + wxLayoutObjectList m_ObjectList; + + /// Have we been changed since the last layout? + bool m_Dirty; + + /// The coordinate of the left boundary of the update rectangle (if m_Dirty) + CoordType m_updateLeft; + + /// Pointer to previous line if it exists. + wxLayoutLine *m_Previous; + + /// Pointer to next line if it exists. + wxLayoutLine *m_Next; + + /// A StyleInfo structure, holding the current settings. + wxLayoutStyleInfo m_StyleInfo; + + /// Just to suppress gcc compiler warnings. + friend class dummy; + private: - wxLayoutLine(const wxLayoutLine &); + wxLayoutLine(const wxLayoutLine &); }; @@ -743,427 +845,529 @@ private: class wxLayoutList { public: - /// Constructor. - wxLayoutList(); - /// Destructor. - ~wxLayoutList(); + /// Constructor. + wxLayoutList(); + + /// Destructor. + ~wxLayoutList(); #ifdef WXLAYOUT_USE_CARET - /// give us the pointer to the caret to use - void SetCaret(wxCaret *caret) { m_caret = caret; } + /// give us the pointer to the caret to use + void SetCaret(wxCaret *caret) { m_caret = caret; } #endif // WXLAYOUT_USE_CARET - /// Clear the list. - void Clear(int family = wxROMAN, - int size=WXLO_DEFAULTFONTSIZE, - int style=wxNORMAL, - int weight=wxNORMAL, - int underline=0, - wxColour *fg=NULL, - wxColour *bg=NULL); - /// Empty: clear the list but leave font settings. - void Empty(void); - - /**@name Cursor Management */ - //@{ - /** Set new cursor position. - @param p new position - @return bool if it could be set - */ - bool MoveCursorTo(wxPoint const &p); - /** Move cursor up or down. - @param n - @return bool if it could be moved - */ - bool MoveCursorVertically(int n); - /** Move cursor left or right. - @param n = number of positions to move - @return bool if it could be moved - */ - bool MoveCursorHorizontally(int n); - /** Move cursor to the left or right counting in words - @param n = number of positions in words - @return bool if it could be moved - */ - bool MoveCursorWord(int n); - - /// Move cursor to end of line. - void MoveCursorToEndOfLine(void) - { - wxASSERT(m_CursorLine); - MoveCursorHorizontally(m_CursorLine->GetLength()-m_CursorPos.x); - } - - /// Move cursor to begin of line. - void MoveCursorToBeginOfLine(void) - { MoveCursorHorizontally(-m_CursorPos.x); } - - /// Returns current cursor position. - const wxPoint &GetCursorPos(wxDC &dc) const { return m_CursorPos; } - const wxPoint &GetCursorPos() const { return m_CursorPos; } - - //@} - - /**@name Editing functions. - All of these functions return true on success and false on - failure. */ - //@{ - /// Insert text at current cursor position. - bool Insert(wxString const &text); - /// Insert some other object at current cursor position. - bool Insert(wxLayoutObject *obj); - /// Inserts objects at current cursor positions - bool Insert(wxLayoutList *llist); - - /// Inserts a linebreak at current cursor position. - bool LineBreak(void); - /** Wraps the current line. Searches to the left of the cursor to - break the line. Does nothing if the cursor position is before - the break position parameter. - @param column the break position for the line, maximum length - @return true if line got broken - */ - bool WrapLine(CoordType column); - /** This function deletes npos cursor positions. - @param npos how many positions - @return true if everything got deleted - */ - bool Delete(CoordType npos); - - /** Delete the next n lines. - @param n how many lines to delete - @return how many it could not delete - */ - int DeleteLines(int n); - - /// Delete to end of line. - void DeleteToEndOfLine(void) - { - wxASSERT(m_CursorLine); - Delete(m_CursorLine->GetLength()-m_CursorPos.x); - } - /// Delete to begin of line. - void DeleteToBeginOfLine(void) - { - wxASSERT(m_CursorLine); - CoordType n = m_CursorPos.x; + /// Clear the list. + void Clear(int family = wxROMAN, + int size=WXLO_DEFAULTFONTSIZE, + int style=wxNORMAL, + int weight=wxNORMAL, + int underline=0, + wxColour *fg=NULL, + wxColour *bg=NULL); + + /// Empty: clear the list but leave font settings. + void Empty(); + + /** Enable or disable auto-formatting. Normally, while editing this + should be enabled which is the default. While + inserting/deleting lots of text, it makes sense to temporarily + disable this. + @param enable true to enable, false to disable + */ + + void SetAutoFormatting(bool enable = true) + { m_AutoFormat = enable; } + + /**@name Cursor Management */ + //@{ + /** Set new cursor position. + @param p new position + @return bool if it could be set + */ + bool MoveCursorTo(wxPoint const &p); + + /** Move cursor up or down. + @param n + @return bool if it could be moved + */ + bool MoveCursorVertically(int n); + + /** Move cursor left or right. + @param n = number of positions to move + @return bool if it could be moved + */ + bool MoveCursorHorizontally(int n); + + /** Move cursor to the left or right counting in words + @param n = number of positions in words + @param untilNext: puts the cursor at the start of the next word if true, + leaves it at the end of the current one otherwise + @return bool if it could be moved + */ + bool MoveCursorWord(int n, bool untilNext = true); + + /// Move cursor to end of line. + void MoveCursorToEndOfLine() + { + wxASSERT(m_CursorLine); + MoveCursorHorizontally(m_CursorLine->GetLength()-m_CursorPos.x); + } + + /// Move cursor to the start of line. + void MoveCursorToBeginOfLine() + { MoveCursorHorizontally(-m_CursorPos.x); } + + /// get the number of lines in the list + size_t GetNumLines() const { return m_numLines; } + + /// Returns current cursor position. + const wxPoint &GetCursorPos(wxDC & WXUNUSED(dc) ) const + { return m_CursorPos; } + const wxPoint &GetCursorPos() const { return m_CursorPos; } + wxLayoutLine * GetCursorLine() { return m_CursorLine; } + + /// move cursor to the end of text + void MoveCursorToEnd() + { + MoveCursorTo(wxPoint(0, GetNumLines() - 1)); + MoveCursorToEndOfLine(); + } + + //@} + + /**@name Editing functions. + All of these functions return true on success and false on + failure. */ + //@{ + /// Insert text at current cursor position. + bool Insert(wxString const &text); + + /// Insert some other object at current cursor position. + bool Insert(wxLayoutObject *obj); + + /// Inserts objects at current cursor positions + bool Insert(wxLayoutList *llist); + + /// Inserts a linebreak at current cursor position. + bool LineBreak(); + /** Wraps the current line. Searches to the left of the cursor to + break the line. Does nothing if the cursor position is before + the break position parameter. + @param column the break position for the line, maximum length + @return true if line got broken + */ + bool WrapLine(CoordType column); + + /** Wraps the complete buffer. + @param column the break position for the line, maximum length + @return true if line got broken + */ + bool WrapAll(CoordType column); + /** This function deletes npos cursor positions. + @param npos how many positions + @return true if everything got deleted + */ + bool Delete(CoordType npos); + + /** Delete the next n lines. + @param n how many lines to delete + @return how many it could not delete + */ + int DeleteLines(int n); + + /// Delete to end of line. + void DeleteToEndOfLine() + { + wxASSERT(m_CursorLine); + Delete(m_CursorLine->GetLength()-m_CursorPos.x); + } + + /// Delete to begin of line. + void DeleteToBeginOfLine() + { + wxASSERT(m_CursorLine); + CoordType n = m_CursorPos.x; #ifdef WXLAYOUT_DEBUG - wxASSERT(MoveCursorHorizontally(-n)); + wxASSERT(MoveCursorHorizontally(-n)); #else - MoveCursorHorizontally(-n); + MoveCursorHorizontally(-n); #endif - Delete(n); - } - - /** Delete the next word. - */ - void DeleteWord(void) - { - wxASSERT(m_CursorLine); - m_CursorLine->DeleteWord(m_CursorPos.x); - } - - //@} - - /** Finds text in this list. - @param needle the text to find - @param cpos the position where to start the search - @return the cursor coord where it was found or (-1,-1) - */ - wxPoint FindText(const wxString &needle, const wxPoint &cpos = wxPoint(0,0)) const; - - /**@name Formatting options */ - //@{ - /// sets font parameters - void SetFont(int family, int size, int style, - int weight, int underline, - wxColour *fg, - wxColour *bg); - /// sets font parameters, colours by name - void SetFont(int family=-1, int size = -1, int style=-1, - int weight=-1, int underline = -1, - char const *fg = NULL, - char const *bg = NULL); - /// changes to the next larger font size - inline void SetFontLarger(void) - { SetFont(-1,(12*m_CurrentStyleInfo.size)/10); } - /// changes to the next smaller font size - inline void SetFontSmaller(void) - { SetFont(-1,(10*m_CurrentStyleInfo.size)/12); } - - /// set font family - inline void SetFontFamily(int family) { SetFont(family); } - /// set font size - inline void SetFontSize(int size) { SetFont(-1,size); } - /// set font style - inline void SetFontStyle(int style) { SetFont(-1,-1,style); } - /// set font weight - inline void SetFontWeight(int weight) { SetFont(-1,-1,-1,weight); } - /// toggle underline flag - inline void SetFontUnderline(bool ul) { SetFont(-1,-1,-1,-1,(int)ul); } - /// set font colours by name - inline void SetFontColour(char const *fg, char const *bg = NULL) - { SetFont(-1,-1,-1,-1,-1,fg,bg); } - /// set font colours by colour - inline void SetFontColour(wxColour *fg, wxColour *bg = NULL) - { SetFont(-1,-1,-1,-1,-1,fg,bg); } - - /** - Returns a pointer to the default settings. - This is only valid temporarily and should not be stored - anywhere. - @return the default settings of the list - */ - wxLayoutStyleInfo &GetDefaultStyleInfo(void) { return m_DefaultStyleInfo ; } - wxLayoutStyleInfo &GetStyleInfo(void) { return m_CurrentStyleInfo ; } - const wxLayoutStyleInfo &GetStyleInfo(void) const { return m_CurrentStyleInfo ; } - - /// is the current font underlined? - bool IsFontUnderlined() const { return GetStyleInfo().underline != 0; } - /// is the current font bold? - bool IsFontBold() const { return GetStyleInfo().weight == wxBOLD; } - /// is the current font italic? - bool IsFontItalic() const { return GetStyleInfo().style == wxITALIC; } - - /// set underline if it was off, turn it off if it was on - void ToggleFontUnderline() - { SetFontUnderline(!IsFontUnderlined()); } - - /// make font bold if it was normal or make it normal if it was bold - void ToggleFontWeight() - { SetFontWeight(IsFontBold() ? wxNORMAL : wxBOLD); } - - /// make font italic if it was normal or make it normal if it was italic - void ToggleFontItalics() - { SetFontStyle(IsFontItalic() ? wxNORMAL : wxITALIC); } - - //@} - - /**@name Drawing */ - //@{ - /** Draws the complete list on a wxDC. - @param dc the wxDC to draw on - @param offset an optional offset to shift printout - @param top optional y coordinate where to start drawing - @param bottom optional y coordinate where to stop drawing - */ - void Draw(wxDC &dc, - const wxPoint &offset = wxPoint(0,0), - CoordType top = -1, CoordType bottom = -1); - - /** Calculates new layout for the list, like Draw() but does not - actually draw it. - @param dc the wxDC to draw on - @param bottom optional y coordinate where to stop calculating - @param forceAll force re-layout of all lines - @param cpos Can hold a cursorposition, and will be overwritten - with the corresponding DC position. - @param csize Will hold the cursor size relating to cpos. - */ - void Layout(wxDC &dc, CoordType bottom = -1, bool forceAll = false, - wxPoint *cpos = NULL, - wxPoint *csize = NULL); - - /** Returns the screen coordinates relating to a given cursor - position and the size of the cursor at that position. - @param dc for which to calculate it - @param cpos Cursor position to look for. - @param csize If non-NULL, will be set to the cursor size. - @return The cursor position on the DC. - */ - wxPoint GetScreenPos(wxDC &dc, const wxPoint &cpos, wxPoint *csize = NULL); - - /** Calculates new sizes for everything in the list, like Layout() - but this is needed after the list got changed. - @param dc the wxDC to draw on - @param bottom optional y coordinate where to stop calculating - */ - void Recalculate(wxDC &dc, CoordType bottom = -1); - - /** Returns the size of the list in screen coordinates. - The return value only makes sense after the list has been - drawn. - @return a wxPoint holding the maximal x/y coordinates used for - drawing - */ - wxPoint GetSize(void) const; - - /** Returns the cursor position on the screen. - @return cursor position in pixels - */ - wxPoint GetCursorScreenPos(wxDC &dc); - - /** Calculates the cursor position on the screen. - @param dc the dc to use for cursor position calculations - */ - void UpdateCursorScreenPos(wxDC &dc); - - /** Draws the cursor. - @param active If true, draw a bold cursor to mark window as - active. - @param translate optional translation of cursor coords on screen - */ - void DrawCursor(wxDC &dc, - bool active = true, - const wxPoint & translate = wxPoint(0,0)); - - /** This function finds an object belonging to a given screen - position. It assumes that Layout() has been called before. - @param pos screen position - @param cursorPos if non NULL, store cursor position in there - @param found if used, set this to true if we really found an - object, to false if we had to take the object near to it - @return pointer to the object - */ - wxLayoutObject * FindObjectScreen(wxDC &dc, - wxPoint const pos, - wxPoint *cursorPos = NULL, - bool *found = NULL); - - /** Called by the objects to update the update rectangle. - @param x horizontal coordinate to include in rectangle - @param y vertical coordinate to include in rectangle - */ - void SetUpdateRect(CoordType x, CoordType y); - /** Called by the objects to update the update rectangle. - @param p a point to include in it - */ - void SetUpdateRect(const wxPoint &p) - { SetUpdateRect(p.x,p.y); } - /// adds the cursor position to the update rectangle - void AddCursorPosToUpdateRect() - { - #ifndef WXLAYOUT_USE_CARET - SetUpdateRect(m_CursorScreenPos); - SetUpdateRect(m_CursorScreenPos+m_CursorSize); - //#else - the caret will take care of refreshing itself - #endif // !WXLAYOUT_USE_CARET - } - /// Invalidates the update rectangle. - void InvalidateUpdateRect(void) { m_UpdateRectValid = false; } - /// Returns the update rectangle. - const wxRect *GetUpdateRect(void) const { return &m_UpdateRect; } - //@} - - /// get the current cursor size - const wxPoint& GetCursorSize() const { return m_CursorSize; } - - /**@name For exporting one object after another. */ - //@{ - /** Returns a pointer to the first line in the list. */ - wxLayoutLine *GetFirstLine(void) - { - wxASSERT(m_FirstLine); - return m_FirstLine; - } - //@} - - /// Begin selecting text - void StartSelection(const wxPoint& cpos = wxPoint(-1,-1), - const wxPoint& spos = wxPoint(-1,-1)); - // Continue selecting text - void ContinueSelection(const wxPoint& cpos = wxPoint(-1,-1), - const wxPoint& spos = wxPoint(-1,-1)); - /// End selecting text. - void EndSelection(const wxPoint& cpos = wxPoint(-1,-1), - const wxPoint& spos = wxPoint(-1,-1)); - /// Discard the current selection - void DiscardSelection(); - /// Are we still selecting text? - bool IsSelecting(void); - /// Is the given point (text coords) selected? - bool IsSelected(const wxPoint &cursor); - /// Do we have a non null selection? - bool HasSelection() const - { return m_Selection.m_valid || m_Selection.m_selecting; } - - /** Return the selection as a wxLayoutList. - @param invalidate if true, the selection will be invalidated after this and can no longer be used. - @return Another layout list object holding the selection, must be freed by caller - */ - wxLayoutList *GetSelection(class wxLayoutDataObject *wxldo = NULL, bool invalidate = TRUE); - /// Delete selected bit - void DeleteSelection(void); - - wxLayoutList *Copy(const wxPoint &from = wxPoint(0,0), - const wxPoint &to = wxPoint(-1,-1)); - - /// starts highlighting of text for selections - void StartHighlighting(wxDC &dc); - /// ends highlighting of text for selections - void EndHighlighting(wxDC &dc); + Delete(n); + } - /** Tests whether this layout line is selected and needs - highlighting. - @param line to test for - @param from set to first cursorpos to be highlighted (for returncode == -1) - @param to set to last cursorpos to be highlighted (for returncode == -1) - @return 0 = not selected, 1 = fully selected, -1 = partially - selected + /** Delete the next word. + */ + void DeleteWord() + { + wxASSERT(m_CursorLine); + m_CursorLine->DeleteWord(m_CursorPos.x); + } + + //@} + + /** Finds text in this list. + @param needle the text to find + @param cpos the position where to start the search + @return the cursor coord where it was found or (-1,-1) + */ + wxPoint FindText(const wxString &needle, const wxPoint &cpos = wxPoint(0,0)) const; + + /**@name Formatting options */ + //@{ + /// sets font parameters + void SetFont(int family, int size, int style, + int weight, int underline, + wxColour *fg, + wxColour *bg); + + /// sets font parameters, colours by name + void SetFont(int family=-1, int size = -1, int style=-1, + int weight=-1, int underline = -1, + wxChar const *fg = NULL, + wxChar const *bg = NULL); + + /// changes to the next larger font size + inline void SetFontLarger() + { SetFont(-1,(12*m_CurrentStyleInfo.size)/10); } + + /// changes to the next smaller font size + inline void SetFontSmaller() + { SetFont(-1,(10*m_CurrentStyleInfo.size)/12); } + + /// set font family + inline void SetFontFamily(int family) { SetFont(family); } + + /// set font size + inline void SetFontSize(int size) { SetFont(-1,size); } + + /// set font style + inline void SetFontStyle(int style) { SetFont(-1,-1,style); } + + /// set font weight + inline void SetFontWeight(int weight) { SetFont(-1,-1,-1,weight); } + + /// toggle underline flag + inline void SetFontUnderline(bool ul) { SetFont(-1,-1,-1,-1,(int)ul); } + + /// set font colours by name + inline void SetFontColour(wxChar const *fg, wxChar const *bg = NULL) + { SetFont(-1,-1,-1,-1,-1,fg,bg); } + + /// set font colours by colour + inline void SetFontColour(wxColour *fg, wxColour *bg = NULL) + { SetFont(-1,-1,-1,-1,-1,fg,bg); } + + /** + Returns a pointer to the default settings. + This is only valid temporarily and should not be stored + anywhere. + @return the default settings of the list + */ + wxLayoutStyleInfo &GetDefaultStyleInfo() { return m_DefaultStyleInfo ; } + wxLayoutStyleInfo &GetStyleInfo() { return m_CurrentStyleInfo ; } + const wxLayoutStyleInfo &GetStyleInfo() const { return m_CurrentStyleInfo ; } + const wxLayoutStyleInfo &GetCursorStyleInfo() const { return m_CursorStyleInfo ; } + + /// is the current font underlined? + bool IsFontUnderlined() const { return GetCursorStyleInfo().underline != 0; } + + /// is the current font bold? + bool IsFontBold() const { return GetCursorStyleInfo().weight == wxBOLD; } + + /// is the current font italic? + bool IsFontItalic() const { return GetCursorStyleInfo().style == wxITALIC; } + + /// set underline if it was off, turn it off if it was on + void ToggleFontUnderline() + { SetFontUnderline(!IsFontUnderlined()); } + + /// make font bold if it was normal or make it normal if it was bold + void ToggleFontWeight() + { SetFontWeight(IsFontBold() ? wxNORMAL : wxBOLD); } + + /// make font italic if it was normal or make it normal if it was italic + void ToggleFontItalics() + { SetFontStyle(IsFontItalic() ? wxNORMAL : wxITALIC); } + + //@} + + /**@name Drawing */ + //@{ + /** Draws the complete list on a wxDC. + @param dc the wxDC to draw on + @param offset an optional offset to shift printout + @param top optional y coordinate where to start drawing + @param bottom optional y coordinate where to stop drawing + @param clipStrictly if set, do not draw objects which reach + beyond "bottom". Set this when printing. + */ + void Draw(wxDC &dc, + const wxPoint &offset = wxPoint(0,0), + CoordType top = -1, CoordType bottom = -1, + bool clipStrictly = false); + + /** Calculates new layout for the list, like Draw() but does not + actually draw it. + @param dc the wxDC to draw on + @param bottom optional y coordinate where to stop calculating + @param forceAll force re-layout of all lines + @param cpos Can hold a cursorposition, and will be overwritten + with the corresponding DC position. + @param csize Will hold the cursor size relating to cpos. + */ + void Layout(wxDC &dc, CoordType bottom = -1, bool forceAll = false, + wxPoint *cpos = NULL, + wxPoint *csize = NULL); + + /** Ensure that the whole list will be recalculate on the next call + to Layout() or Draw(). + @param redrawAll true or false to reset it + */ + void ForceTotalLayout(bool redrawAll = true) + { m_ReLayoutAll = redrawAll; } + + /** Returns the screen coordinates relating to a given cursor + position and the size of the cursor at that position. + @param dc for which to calculate it + @param cpos Cursor position to look for. + @param csize If non-NULL, will be set to the cursor size. + @return The cursor position on the DC. + */ + wxPoint GetScreenPos(wxDC &dc, const wxPoint &cpos, wxPoint *csize = NULL); + + /** Calculates new sizes for everything in the list, like Layout() + but this is needed after the list got changed. + @param dc the wxDC to draw on + @param bottom optional y coordinate where to stop calculating + */ + void Recalculate(wxDC &dc, CoordType bottom = -1); - */ - int IsSelected(const wxLayoutLine *line, CoordType *from, CoordType *to); + /** Returns the size of the list in screen coordinates. + The return value only makes sense after the list has been + drawn. + @return a wxPoint holding the maximal x/y coordinates used for + drawing + */ + wxPoint GetSize() const; - void ApplyStyle(wxLayoutStyleInfo const &si, wxDC &dc); + /** Returns the cursor position on the screen. + */ + wxPoint GetCursorScreenPos() const; + + /** Draws the cursor. + @param active If true, draw a bold cursor to mark window as + active. + @param translate optional translation of cursor coords on screen + */ + void DrawCursor(wxDC &dc, + bool active = true, + const wxPoint & translate = wxPoint(0,0)); + + /** This function finds an object belonging to a given screen + position. It assumes that Layout() has been called before. + @param pos screen position + @param cursorPos if non NULL, store cursor position in there + @param found if used, set this to true if we really found an + object, to false if we had to take the object near to it + @return pointer to the object + */ + wxLayoutObject * FindObjectScreen(wxDC &dc, + wxPoint const pos, + wxPoint *cursorPos = NULL, + bool *found = NULL); + + /** Called by the objects to update the update rectangle. + @param x horizontal coordinate to include in rectangle + @param y vertical coordinate to include in rectangle + */ + void SetUpdateRect(CoordType x, CoordType y); + + /** Called by the objects to update the update rectangle. + @param p a point to include in it + */ + void SetUpdateRect(const wxPoint &p) + { SetUpdateRect(p.x,p.y); } + + /// adds the cursor position to the update rectangle + void AddCursorPosToUpdateRect() + { +#ifndef WXLAYOUT_USE_CARET + SetUpdateRect(m_CursorScreenPos); + SetUpdateRect(m_CursorScreenPos+m_CursorSize); +//#else - the caret will take care of refreshing itself +#endif // !WXLAYOUT_USE_CARET + } + + /// Invalidates the update rectangle. + void InvalidateUpdateRect() { m_UpdateRectValid = false; } + + /// Returns the update rectangle. + const wxRect *GetUpdateRect() const { return &m_UpdateRect; } + //@} + + /// get the current cursor size + const wxPoint& GetCursorSize() const { return m_CursorSize; } + + /**@name For exporting one object after another. */ + //@{ + /** Returns a pointer to the first line in the list. */ + wxLayoutLine *GetFirstLine() + { + wxASSERT(m_FirstLine); + return m_FirstLine; + } + //@} + + /// Begin selecting text + void StartSelection(const wxPoint& cpos = wxPoint(-1,-1), + const wxPoint& spos = wxPoint(-1,-1)); + + // Continue selecting text + void ContinueSelection(const wxPoint& cpos = wxPoint(-1,-1), + const wxPoint& spos = wxPoint(-1,-1)); + + /// End selecting text. + void EndSelection(const wxPoint& cpos = wxPoint(-1,-1), + const wxPoint& spos = wxPoint(-1,-1)); + + /// Discard the current selection + void DiscardSelection(); + + /// Are we still selecting text? + bool IsSelecting() const; + + /// Is the given point (text coords) selected? + bool IsSelected(const wxPoint &cursor) const; + + /// Do we have a non null selection? + bool HasSelection() const + { return m_Selection.m_valid || m_Selection.m_selecting; } + + /** Return the selection as a wxLayoutList. + @param invalidate if true, the selection will be invalidated after this and can no longer be used. + @return Another layout list object holding the selection, must be freed by caller + */ + wxLayoutList *GetSelection(class wxLayoutDataObject *wxldo = NULL, bool invalidate = true); + + /// Delete selected bit + void DeleteSelection(); + + wxLayoutList *Copy(const wxPoint &from = wxPoint(0,0), + const wxPoint &to = wxPoint(-1,-1)); + + /// starts highlighting of text for selections + void StartHighlighting(wxDC &dc); + + /// ends highlighting of text for selections + void EndHighlighting(wxDC &dc); + + /** Tests whether this layout line is selected and needs + highlighting. + @param line to test for + @param from set to first cursorpos to be highlighted (for returncode == -1) + @param to set to last cursorpos to be highlighted (for returncode == -1) + @return 0 = not selected, 1 = fully selected, -1 = partially + selected + */ + int IsSelected(const wxLayoutLine *line, CoordType *from, CoordType *to); + + void ApplyStyle(wxLayoutStyleInfo const &si, wxDC &dc); #ifdef WXLAYOUT_DEBUG - void Debug(void); + void Debug(); #endif + // for wxLayoutLine usage only + void IncNumLines() { m_numLines++; } + void DecNumLines() { m_numLines--; } + + /// get the line by number + wxLayoutLine *GetLine(CoordType index) const; + + /** Reads objects from a string and inserts them. Returns NULL if + string is empty or a linebreak was found. + @param istr stream to read from, will bee changed + */ + void Read(wxString &istr); + private: - /// Clear the list. - void InternalClear(void); - - /// The list of lines. - wxLayoutLine *m_FirstLine; - /// The update rectangle which needs to be refreshed: - wxRect m_UpdateRect; - /// Is the update rectangle valid? - bool m_UpdateRectValid; - /**@name Cursor Management */ - //@{ - /// Where the text cursor (column,line) is. - wxPoint m_CursorPos; - /// Where the cursor should be drawn. - wxPoint m_CursorScreenPos; - /// The line where the cursor is. - wxLayoutLine *m_CursorLine; - /// The size of the cursor. - wxPoint m_CursorSize; - /// Has the cursor moved (is m_CursorScreenPos up to date)? - bool m_movedCursor; + /// Clear the list. + void InternalClear(); + + /// The list of lines. + wxLayoutLine *m_FirstLine; + + /// The number of lines in the list (store instead recalculating for speed) + size_t m_numLines; + + /// The update rectangle which needs to be refreshed: + wxRect m_UpdateRect; + + /// Is the update rectangle valid? + bool m_UpdateRectValid; + + /// Shall we auto-format? + bool m_AutoFormat; + + /// Shall we re-layout everything? + bool m_ReLayoutAll; + + /**@name Cursor Management */ + //@{ + /// Where the text cursor (column,line) is. + wxPoint m_CursorPos; + + /// Where the cursor should be drawn. + wxPoint m_CursorScreenPos; + + /// The line where the cursor is. + wxLayoutLine *m_CursorLine; + + /// The size of the cursor. + wxPoint m_CursorSize; + + /// Has the cursor moved (is m_CursorScreenPos up to date)? + bool m_movedCursor; + #ifdef WXLAYOUT_USE_CARET - /// the caret - wxCaret *m_caret; + /// the caret + wxCaret *m_caret; #endif // WXLAYOUT_USE_CARET - //@} - - /// selection.state and begin/end coordinates - struct Selection - { - Selection() { m_valid = false; m_selecting = false; } - bool m_valid; - bool m_selecting; - - // returns true if we already have the screen coordinates of the - // selection start and end - bool HasValidScreenCoords() const - { return m_ScreenA.x != -1 && m_ScreenB.x != -1; } - - // the start and end of the selection coordinates in pixels - wxPoint m_ScreenA, m_ScreenB; - - // these coordinates are in text positions, not in pixels - wxPoint m_CursorA, m_CursorB; - } m_Selection; - /** @name Font parameters. */ - //@{ - /// this object manages the fonts for us - wxFontCache m_FontCache; - /// the default setting: - wxLayoutStyleInfo m_DefaultStyleInfo; - /// the current setting: - wxLayoutStyleInfo m_CurrentStyleInfo; - //@} + //@} + + /// selection.state and begin/end coordinates + struct Selection + { + Selection() { m_valid = m_selecting = m_discarded = false; } + + bool m_valid; + bool m_selecting; + bool m_discarded; // may be true only until the next redraw + + // returns true if we already have the screen coordinates of the + // selection start and end + bool HasValidScreenCoords() const + { return m_ScreenA.x != -1 && m_ScreenB.x != -1; } + + // the start and end of the selection coordinates in pixels + wxPoint m_ScreenA, m_ScreenB; + + // these coordinates are in text positions, not in pixels + wxPoint m_CursorA, m_CursorB; + } m_Selection; + /** @name Font parameters. */ + //@{ + /// this object manages the fonts for us + wxFontCache m_FontCache; + + /// the default setting: + wxLayoutStyleInfo m_DefaultStyleInfo; + + /// the current setting: + wxLayoutStyleInfo m_CurrentStyleInfo; + + /// the current setting: + wxLayoutStyleInfo m_CursorStyleInfo; + //@} }; /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * @@ -1172,82 +1376,94 @@ private: own format. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -class wxLayoutDataObject : public wxPrivateDataObject +class wxLayoutDataObject : public wxCustomDataObject { public: - wxLayoutDataObject(void) - { - SetId("application/wxlayoutlist"); - //m_format.SetAtom((GdkAtom) 222222); - } + wxLayoutDataObject() + { + SetFormat(wxT("application/wxlayoutlist")); + } + + // type safe wrappers + void SetLayoutData(const wxString& text) + { SetData(text.length() + 1, text.c_str()); } + + const wxChar *GetLayoutData() const { return (const wxChar *)GetData(); } }; /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - The wxLayoutPrintout object for printing within the wxWindows print + The wxLayoutPrintout object for printing within the wxWidgets print framework. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** This class implements a wxPrintout for printing a wxLayoutList within - the wxWindows printing framework. + the wxWidgets printing framework. */ class wxLayoutPrintout: public wxPrintout { public: - /** Constructor. - @param llist pointer to the wxLayoutList to be printed - @param title title for PS file or windows - */ - wxLayoutPrintout(wxLayoutList *llist, - wxString const & title = - "wxLayout Printout"); - /// Destructor. - ~wxLayoutPrintout(); - - /** Function which prints the n-th page. - @param page the page number to print - @return bool true if we are not at end of document yet - */ - bool OnPrintPage(int page); - /** Checks whether page exists in document. - @param page number of page - @return true if page exists - */ - bool HasPage(int page); - - /** Gets called from wxWindows to find out which pages are existing. - I'm not totally sure about the parameters though. - @param minPage the first page in the document - @param maxPage the last page in the document - @param selPageFrom the first page to be printed - @param selPageTo the last page to be printed - */ - void GetPageInfo(int *minPage, int *maxPage, - int *selPageFrom, int *selPageTo); + /** Constructor. + @param llist pointer to the wxLayoutList to be printed + @param title title for PS file or windows + */ + wxLayoutPrintout(wxLayoutList *llist, + wxString const & title = + _T("wxLayout Printout")); + + /// Destructor. + ~wxLayoutPrintout(); + + /** Function which prints the n-th page. + @param page the page number to print + @return bool true if we are not at end of document yet + */ + bool OnPrintPage(int page); + /** Checks whether page exists in document. + @param page number of page + @return true if page exists + */ + bool HasPage(int page); + + /** Gets called from wxWidgets to find out which pages are existing. + I'm not totally sure about the parameters though. + @param minPage the first page in the document + @param maxPage the last page in the document + @param selPageFrom the first page to be printed + @param selPageTo the last page to be printed + */ + void GetPageInfo(int *minPage, int *maxPage, + int *selPageFrom, int *selPageTo); protected: - /** This little function scales the DC so that the printout has - roughly the same size as the output on screen. - @param dc the wxDC to scale - @return the scale that was applied - */ - float ScaleDC(wxDC *dc); - - /* no longer used - virtual void DrawHeader(wxDC &dc, wxPoint topleft, wxPoint bottomright, int pageno); - */ + /** This little function scales the DC so that the printout has + roughly the same size as the output on screen. + @param dc the wxDC to scale + @return the scale that was applied + */ + float ScaleDC(wxDC *dc); + + /* no longer used + virtual void DrawHeader(wxDC &dc, wxPoint topleft, wxPoint bottomright, int pageno); + */ + private: - /// The list to print. - wxLayoutList *m_llist; - /// Title for PS file or window. - wxString m_title; - /// The real paper size. - int m_PageHeight, m_PageWidth; - /// How much we actually print per page. - int m_PrintoutHeight; - /// How many pages we need to print. - int m_NumOfPages; - /// Top left corner where we start printing. - wxPoint m_Offset; + /// The list to print. + wxLayoutList *m_llist; + + /// Title for PS file or window. + wxString m_title; + + /// The real paper size. + int m_PageHeight, m_PageWidth; + + /// How much we actually print per page. + int m_PrintoutHeight; + + /// How many pages we need to print. + int m_NumOfPages; + + /// Top left corner where we start printing. + wxPoint m_Offset; };