compilers (tested on Irix 6.5 with -mips3 -n32). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@623 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			339 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			339 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*-*- c++ -*-********************************************************
 | 
						|
 * wxLayoutList.h - a formatted text rendering engine for wxWindows *
 | 
						|
 *                                                                  *
 | 
						|
 * (C) 1998 by Karsten Ballüder (Ballueder@usa.net)                 *
 | 
						|
 *                                                                  *
 | 
						|
 * $Id$
 | 
						|
 *******************************************************************/
 | 
						|
#ifndef WXLLIST_H
 | 
						|
#define WXLLIST_H
 | 
						|
 | 
						|
#ifdef __GNUG__
 | 
						|
#   pragma interface "wxllist.h"
 | 
						|
#endif
 | 
						|
 | 
						|
#include   "kbList.h"
 | 
						|
 | 
						|
#include   "wx/wx.h"
 | 
						|
#include "wx/print.h"
 | 
						|
#include "wx/printdlg.h"
 | 
						|
#include "wx/generic/printps.h"
 | 
						|
#include "wx/generic/prntdlgg.h"
 | 
						|
 | 
						|
// skip the following defines if embedded in M application
 | 
						|
#ifdef   M_BASEDIR
 | 
						|
#   ifdef   DEBUG
 | 
						|
//#      define   WXLAYOUT_DEBUG
 | 
						|
#   endif
 | 
						|
#else
 | 
						|
    // for testing only:
 | 
						|
#   define WXLAYOUT_DEBUG
 | 
						|
    // The wxLayout classes can be compiled with std::string instead of wxString
 | 
						|
    //#   define USE_STD_STRING
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef USE_STD_STRING
 | 
						|
#   include   <string>
 | 
						|
    typedef   std::string String;
 | 
						|
#   define    Str(str)(str.c_str())
 | 
						|
#else
 | 
						|
    typedef   wxString String;
 | 
						|
#   define    Str(str) str
 | 
						|
#endif
 | 
						|
 | 
						|
/// Types of currently supported layout objects.
 | 
						|
enum wxLayoutObjectType
 | 
						|
{ WXLO_TYPE_INVALID = 0, WXLO_TYPE_TEXT, WXLO_TYPE_CMD, WXLO_TYPE_ICON, WXLO_TYPE_LINEBREAK };
 | 
						|
 | 
						|
/// Type used for coordinates in drawing.
 | 
						|
typedef long CoordType;
 | 
						|
 | 
						|
class wxLayoutList;
 | 
						|
class wxLayoutObjectBase;
 | 
						|
 | 
						|
class wxDC;
 | 
						|
class wxColour;
 | 
						|
class wxFont;
 | 
						|
 | 
						|
/** The base class defining the interface to each object which can be
 | 
						|
    part of the layout. Each object needs to draw itself and calculate 
 | 
						|
    its size.
 | 
						|
*/
 | 
						|
class wxLayoutObjectBase
 | 
						|
{
 | 
						|
public:
 | 
						|
   /// return the type of this object
 | 
						|
   virtual wxLayoutObjectType GetType(void) const { return WXLO_TYPE_INVALID; } ;
 | 
						|
   /** Draws an object.
 | 
						|
       @param dc the wxDC to draw on
 | 
						|
       @param position where to draw the top left corner
 | 
						|
       @param baseLine the baseline for alignment, from top of box
 | 
						|
       @draw if set to false, do not draw but just calculate sizes
 | 
						|
   */
 | 
						|
   virtual void Draw(wxDC &dc, wxPoint position, CoordType baseLine,
 | 
						|
                     bool draw = true) {};
 | 
						|
 | 
						|
   /** Calculates and returns the size of the object. May need to be
 | 
						|
       called twice to work.
 | 
						|
       @param baseLine pointer where to store the baseline position of 
 | 
						|
       this object (i.e. the height from the top of the box to the
 | 
						|
       baseline)
 | 
						|
       @return the size of the object's box in pixels
 | 
						|
   */
 | 
						|
   virtual wxPoint GetSize(CoordType *baseLine) const { return
 | 
						|
                                                           wxPoint(0,0); };
 | 
						|
   /// returns the number of cursor positions occupied by this object
 | 
						|
   virtual CoordType CountPositions(void) const { return 1; }
 | 
						|
 | 
						|
   /// constructor
 | 
						|
   wxLayoutObjectBase() { m_UserData = NULL; }
 | 
						|
   /// note: any user data will be freed at the time the object is deleted
 | 
						|
   virtual ~wxLayoutObjectBase() { if(m_UserData) delete m_UserData; }
 | 
						|
#ifdef WXLAYOUT_DEBUG
 | 
						|
   virtual void Debug(void);
 | 
						|
#endif
 | 
						|
 | 
						|
   /** Tells the object about some user data. This data is associated
 | 
						|
       with the object and will be deleted at destruction time.
 | 
						|
   */
 | 
						|
   void   SetUserData(void *data) { m_UserData = data; }
 | 
						|
   /** Return the user data. */
 | 
						|
   void * GetUserData(void) const { return m_UserData; }
 | 
						|
private:
 | 
						|
   /// optional data for application's use
 | 
						|
   void * m_UserData;
 | 
						|
};
 | 
						|
 | 
						|
/// Define a list type of wxLayoutObjectBase pointers.
 | 
						|
KBLIST_DEFINE(wxLayoutObjectList, wxLayoutObjectBase);
 | 
						|
 | 
						|
 | 
						|
/// object for text block
 | 
						|
class wxLayoutObjectText : public wxLayoutObjectBase
 | 
						|
{
 | 
						|
public:
 | 
						|
   virtual wxLayoutObjectType GetType(void) const { return WXLO_TYPE_TEXT; }
 | 
						|
   virtual void Draw(wxDC &dc, wxPoint position, CoordType baseLine,
 | 
						|
                     bool draw = true);
 | 
						|
   /** This returns the height and in baseLine the position of the
 | 
						|
       text's baseline within it's box. This is needed to properly
 | 
						|
       align text objects.
 | 
						|
   */
 | 
						|
   virtual wxPoint GetSize(CoordType *baseLine) const;
 | 
						|
#ifdef WXLAYOUT_DEBUG
 | 
						|
   virtual void Debug(void);
 | 
						|
#endif
 | 
						|
 | 
						|
   wxLayoutObjectText(const String &txt);
 | 
						|
   virtual CoordType CountPositions(void) const { return strlen(m_Text.c_str()); }
 | 
						|
 | 
						|
   // for editing:
 | 
						|
   String & GetText(void) { return m_Text; }
 | 
						|
   void SetText(String const &text) { m_Text = text; }
 | 
						|
private:
 | 
						|
   String m_Text;
 | 
						|
   /// size of the box containing text
 | 
						|
   long   m_Width, m_Height;
 | 
						|
   /// the position of the baseline counted from the top of the box
 | 
						|
   long   m_BaseLine;
 | 
						|
};
 | 
						|
 | 
						|
/// icon/pictures:
 | 
						|
class wxLayoutObjectIcon : public wxLayoutObjectBase
 | 
						|
{
 | 
						|
public:
 | 
						|
   virtual wxLayoutObjectType GetType(void) const { return WXLO_TYPE_ICON; }
 | 
						|
   virtual void Draw(wxDC &dc, wxPoint position, CoordType baseLine,
 | 
						|
                     bool draw = true);
 | 
						|
   virtual wxPoint GetSize(CoordType *baseLine) const;
 | 
						|
   wxLayoutObjectIcon(wxIcon *icon);
 | 
						|
 | 
						|
private:
 | 
						|
   wxIcon *m_Icon;
 | 
						|
};
 | 
						|
 | 
						|
/// for export to html:
 | 
						|
struct wxLayoutStyleInfo
 | 
						|
{
 | 
						|
   int  size, family, style, weight;
 | 
						|
   bool underline;
 | 
						|
   unsigned fg_red, fg_green, fg_blue;
 | 
						|
   unsigned bg_red, bg_green, bg_blue;
 | 
						|
};
 | 
						|
 | 
						|
/// pseudo-object executing a formatting command in Draw()
 | 
						|
class wxLayoutObjectCmd : public wxLayoutObjectBase
 | 
						|
{
 | 
						|
public:
 | 
						|
   virtual wxLayoutObjectType GetType(void) const { return WXLO_TYPE_CMD; }
 | 
						|
   virtual void Draw(wxDC &dc, wxPoint position, CoordType baseLine,
 | 
						|
                     bool draw = true);
 | 
						|
   wxLayoutObjectCmd(int size, int family, int style, int weight,
 | 
						|
                bool underline,
 | 
						|
                wxColour const *fg, wxColour const *bg);
 | 
						|
   ~wxLayoutObjectCmd();
 | 
						|
   /// caller must free pointer:
 | 
						|
   wxLayoutStyleInfo *GetStyle(void) const ;
 | 
						|
   /// return the background colour for setting colour of window
 | 
						|
   wxColour const *GetBGColour(void) const { return m_ColourBG; }
 | 
						|
private:
 | 
						|
   /// the font to use
 | 
						|
   wxFont *m_font;
 | 
						|
   /// foreground colour
 | 
						|
   wxColour const *m_ColourFG;
 | 
						|
   /// background colour
 | 
						|
   wxColour const *m_ColourBG;
 | 
						|
};
 | 
						|
 | 
						|
/// this object doesn't do anything at all
 | 
						|
class wxLayoutObjectLineBreak : public wxLayoutObjectBase
 | 
						|
{
 | 
						|
public:
 | 
						|
   virtual wxLayoutObjectType GetType(void) const { return WXLO_TYPE_LINEBREAK; }
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
class wxLayoutPrintout;
 | 
						|
 | 
						|
/**
 | 
						|
   This class provides a high level abstraction to the wxFText
 | 
						|
   classes.
 | 
						|
   It handles most of the character events with its own callback
 | 
						|
   functions, providing an editing ability. All events which cannot be
 | 
						|
   handled get passed to the parent window's handlers.
 | 
						|
*/
 | 
						|
class wxLayoutList : public wxLayoutObjectList
 | 
						|
{
 | 
						|
public:
 | 
						|
   wxLayoutList();
 | 
						|
   
 | 
						|
   /// Destructor.
 | 
						|
   ~wxLayoutList();
 | 
						|
 | 
						|
   /// adds an object:
 | 
						|
   void AddObject(wxLayoutObjectBase *obj);
 | 
						|
   void AddText(String const &txt);
 | 
						|
 | 
						|
   void LineBreak(void);
 | 
						|
   void SetFont(int family, int size, int style,
 | 
						|
                int weight, int underline,
 | 
						|
                wxColour const *fg,
 | 
						|
                wxColour const *bg);
 | 
						|
   void SetFont(int family=-1, int size = -1, int style=-1,
 | 
						|
                int weight=-1, int underline = -1,
 | 
						|
                char const *fg = (const char *) NULL,
 | 
						|
                char const *bg = (const char *) NULL);
 | 
						|
   inline void SetFontFamily(int family) { SetFont(family); }
 | 
						|
   inline void SetFontSize(int size) { SetFont(-1,size); }
 | 
						|
   inline void SetFontStyle(int style) { SetFont(-1,-1,style); }
 | 
						|
   inline void SetFontWeight(int weight) { SetFont(-1,-1,-1,weight); }
 | 
						|
   inline void SetFontUnderline(bool ul) { SetFont(-1,-1,-1,-1,(int)ul); }
 | 
						|
   inline void SetFontColour(char const *fg, char const *bg = (const char *) NULL) { SetFont(-1,-1,-1,-1,-1,fg,bg); }
 | 
						|
      
 | 
						|
   
 | 
						|
   /** Draw the list on a given DC.
 | 
						|
       @param findObject if true, return the object occupying the
 | 
						|
       position specified by coords
 | 
						|
       @param coords position where to find the object
 | 
						|
       @pageNo if > 0, print only that page of a document (for
 | 
						|
       printing)
 | 
						|
       @reallyDraw set this to false if you don't want to draw but just calculate the coordinates
 | 
						|
       @return if findObject == true, the object or NULL
 | 
						|
   */
 | 
						|
   wxLayoutObjectBase *Draw(wxDC &dc, bool findObject = false,
 | 
						|
                            wxPoint const &coords = wxPoint(0,0),
 | 
						|
                            int pageNo = -1, bool reallyDraw = true);
 | 
						|
 | 
						|
#ifdef WXLAYOUT_DEBUG
 | 
						|
   void Debug(void);
 | 
						|
   void ShowCurrentObject();
 | 
						|
#endif
 | 
						|
 | 
						|
   
 | 
						|
   /// for access by wxLayoutWindow:
 | 
						|
   void GetSize(CoordType *max_x, CoordType *max_y,
 | 
						|
                CoordType *lineHeight);
 | 
						|
 | 
						|
   
 | 
						|
   /**@name Functionality for editing */
 | 
						|
   //@{
 | 
						|
   /// set list editable or read only
 | 
						|
   void SetEditable(bool editable = true) { m_Editable = editable; }
 | 
						|
   /// return true if list is editable
 | 
						|
   bool IsEditable(void) const { return m_Editable; }
 | 
						|
   /// move cursor, returns true if it could move to the desired position
 | 
						|
   bool MoveCursor(int dx = 0, int dy = 0);
 | 
						|
   void SetCursor(wxPoint const &p) { m_CursorPosition = p; }
 | 
						|
   wxPoint GetCursor(void) const { return m_CursorPosition; }
 | 
						|
   /// delete one or more cursor positions
 | 
						|
   void Delete(CoordType count = 1);
 | 
						|
   void Insert(String const &text);
 | 
						|
   void Insert(wxLayoutObjectBase *obj);
 | 
						|
   void Clear(int family = wxROMAN, int size=12, int style=wxNORMAL, int weight=wxNORMAL,
 | 
						|
                    int underline=0, char const *fg="black", char const *bg="white");
 | 
						|
 | 
						|
   /// return a pointer to the default settings:
 | 
						|
   wxLayoutObjectCmd const *GetDefaults(void) const { return m_DefaultSetting ; }
 | 
						|
 | 
						|
   wxLayoutObjectList::iterator FindCurrentObject(CoordType *offset = (CoordType *) NULL);
 | 
						|
   // get the length of the line with the object pointed to by i, offs 
 | 
						|
   // only used to decide whether we are before or after linebreak
 | 
						|
   CoordType GetLineLength(wxLayoutObjectList::iterator i,
 | 
						|
                           CoordType offs = 0);
 | 
						|
   wxLayoutPrintout *MakePrintout(wxString const &name);
 | 
						|
 | 
						|
//@}
 | 
						|
protected:
 | 
						|
   /// font parameters:
 | 
						|
   int m_FontFamily, m_FontStyle, m_FontWeight;
 | 
						|
   int m_FontPtSize;
 | 
						|
   bool m_FontUnderline;
 | 
						|
   /// colours:
 | 
						|
   wxColour const * m_ColourFG;
 | 
						|
   wxColour const * m_ColourBG;
 | 
						|
   /// the default setting:
 | 
						|
   wxLayoutObjectCmd *m_DefaultSetting;
 | 
						|
   
 | 
						|
   /// needs recalculation?
 | 
						|
   bool m_dirty;
 | 
						|
 | 
						|
   // the currently updated line:
 | 
						|
   /// where do we draw next:
 | 
						|
   wxPoint   m_Position;
 | 
						|
   /// the height of the current line:
 | 
						|
   CoordType m_LineHeight;
 | 
						|
   /// maximum drawn x position so far
 | 
						|
   CoordType m_MaxX;
 | 
						|
   /// maximum drawn y position:
 | 
						|
   CoordType m_MaxY;
 | 
						|
 | 
						|
   //---- this is needed for editing:
 | 
						|
   /// where is the text cursor:
 | 
						|
   wxPoint   m_CursorPosition;
 | 
						|
   /// which is the last line
 | 
						|
   CoordType m_MaxLine;
 | 
						|
   /// can we edit it?
 | 
						|
   bool      m_Editable;
 | 
						|
   /// find the object to the cursor position and returns the offset
 | 
						|
   /// in there
 | 
						|
   wxLayoutObjectList::iterator FindObjectCursor(wxPoint *cpos, CoordType *offset = (CoordType *) NULL);
 | 
						|
   
 | 
						|
};
 | 
						|
 | 
						|
class wxLayoutPrintout: public wxPrintout
 | 
						|
{
 | 
						|
 public:
 | 
						|
   wxLayoutPrintout(wxLayoutList &llist, wxString const & title = "My printout"):wxPrintout(title)
 | 
						|
      { m_llist = &llist; m_maxPage = 0; }
 | 
						|
  bool OnPrintPage(int page);
 | 
						|
  bool HasPage(int page);
 | 
						|
  bool OnBeginDocument(int startPage, int endPage);
 | 
						|
   void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int
 | 
						|
                    *selPageTo);
 | 
						|
private:
 | 
						|
   wxLayoutList *m_llist;
 | 
						|
   int           m_maxPage;
 | 
						|
};
 | 
						|
 | 
						|
#endif // WXLLIST_H
 |