00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #ifndef CONTAINEROBJECT_H
00047 #define CONTAINEROBJECT_H
00048
00049 #ifdef FMT_TEST
00050 #include <stdio.h>
00051 #endif
00052
00053 #include "ut_misc.h"
00054 #include "ut_types.h"
00055 #include "gr_Graphics.h"
00056 #include "ut_vector.h"
00057 #include "pt_Types.h"
00058 #include "gr_Image.h"
00059
00060 class fp_ContainerObject;
00061
00062 typedef enum {
00063 FG_FILL_TRANSPARENT,
00064 FG_FILL_COLOR,
00065 FG_FILL_IMAGE
00066 } FG_Fill_Type;
00067
00068 #define INITIAL_OFFSET -99999999
00069
00070 typedef struct _fp_Requisition fp_Requisition;
00071 typedef struct _fp_Allocation fp_Allocation;
00072
00077 struct _fp_Requisition
00078 {
00079 UT_sint32 width;
00080 UT_sint32 height;
00081 };
00082
00088 struct _fp_Allocation
00089 {
00090 UT_sint32 x;
00091 UT_sint32 y;
00092 UT_sint32 width;
00093 UT_sint32 height;
00094 };
00095
00096 class GR_Graphics;
00097 class FG_Graphic;
00098 class fl_SectionLayout;
00099 class fl_DocSectionLayout;
00100 class FL_DocLayout;
00101 class fp_Page;
00102 class fp_Container;
00103 struct dg_DrawArgs;
00104 struct fp_Sliver;
00105 struct dg_DrawArgs;
00106
00107 typedef enum {
00108 FP_CONTAINER_RUN,
00109 FP_CONTAINER_LINE,
00110 FP_CONTAINER_VERTICAL,
00111 FP_CONTAINER_ROW,
00112 FP_CONTAINER_TABLE,
00113 FP_CONTAINER_CELL,
00114 FP_CONTAINER_COLUMN,
00115 FP_CONTAINER_HDRFTR,
00116 FP_CONTAINER_ENDNOTE,
00117 FP_CONTAINER_FOOTNOTE,
00118 FP_CONTAINER_COLUMN_POSITIONED,
00119 FP_CONTAINER_COLUMN_SHADOW,
00120 FP_CONTAINER_FRAME,
00121 FP_CONTAINER_TOC,
00122 FP_CONTAINER_ANNOTATION
00123
00124 } FP_ContainerType;
00125
00126 class ABI_EXPORT fg_FillType
00127 {
00128 friend class fp_Run;
00129 public:
00130 fg_FillType(fg_FillType *pParent, fp_ContainerObject * pContainer, FG_Fill_Type iType);
00131 virtual ~ fg_FillType(void);
00132 void setParent(fg_FillType * pParent);
00133 void setColor(UT_RGBColor & color);
00134 void setColor(const char * pszColor);
00135 void setTransColor(UT_RGBColor & color);
00136 void setTransColor(const char * pszColor);
00137 void setImage(FG_Graphic * pGraphic, GR_Image * pImage,GR_Graphics * pG, UT_sint32 width, UT_sint32 height);
00138 void setTransparent(void);
00139 void setWidthHeight(GR_Graphics * pG, UT_sint32 width, UT_sint32 height, bool doImage = false);
00140 void setWidth(GR_Graphics * pG, UT_sint32 width);
00141 void setHeight(GR_Graphics * pG, UT_sint32 height);
00142 void setDocLayout(FL_DocLayout * pDocLayout);
00143 void markTransparentForPrint(void);
00144 void Fill(GR_Graphics * pG, UT_sint32 & srcX, UT_sint32 & srcY, UT_sint32 x, UT_sint32 y, UT_sint32 width, UT_sint32 height);
00145 fg_FillType * getParent(void) const;
00146 FG_Fill_Type getFillType(void) const;
00147 const FL_DocLayout * getDocLayout(void) const;
00148 const UT_RGBColor * getColor(void) const;
00149 void setImagePointer(FG_Graphic ** pDocGraphic, GR_Image ** pDocImage);
00150
00151 private:
00152 void _regenerateImage(GR_Graphics * pG);
00153 fg_FillType * m_pParent;
00154 fp_ContainerObject * m_pContainer;
00155 FL_DocLayout * m_pDocLayout;
00156 FG_Fill_Type m_FillType;
00157 GR_Image * m_pImage;
00158 FG_Graphic * m_pGraphic;
00159 UT_uint32 m_iGraphicTick;
00160 bool m_bTransparentForPrint;
00161 UT_RGBColor m_color;
00162 UT_RGBColor m_TransColor;
00163 bool m_bTransColorSet;
00164 bool m_bColorSet;
00165 UT_sint32 m_iWidth;
00166 UT_sint32 m_iHeight;
00167 GR_Image ** m_pDocImage;
00168 FG_Graphic ** m_pDocGraphic;
00169 };
00170
00171
00172 class ABI_EXPORT fp_ContainerObject
00173 {
00174 public:
00175 fp_ContainerObject(FP_ContainerType iType, fl_SectionLayout* pSectionLayout);
00176 virtual ~fp_ContainerObject();
00181 FP_ContainerType getContainerType(void) const { return m_iConType; }
00182 bool isColumnType(void) const;
00183 virtual void setWidth(UT_sint32) = 0;
00184 virtual void setHeight(UT_sint32) = 0 ;
00185 virtual void setX(UT_sint32, bool bDontClearIfNeeded = false) = 0;
00186 virtual void setY(UT_sint32) = 0;
00187 virtual UT_sint32 getWidth(void) const = 0;
00188
00189
00190
00191 virtual UT_sint32 getDrawingWidth(void) const {return getWidth();}
00192
00193 virtual UT_sint32 getX(void) const = 0;
00194 virtual UT_sint32 getY(void) const = 0;
00195 fl_SectionLayout* getSectionLayout(void) const
00196 { return m_pSectionLayout; }
00197 fl_DocSectionLayout * getDocSectionLayout(void);
00198 void setSectionLayout(fl_SectionLayout * pSL)
00199 { m_pSectionLayout = pSL; }
00200 virtual inline UT_BidiCharType getDirection(void) const
00201 { return m_iDirection;}
00202 virtual inline void setDirection(UT_BidiCharType c) {m_iDirection = c;}
00203 virtual UT_sint32 getHeight(void) const = 0;
00204
00205
00206 virtual void draw(dg_DrawArgs*) = 0;
00207 virtual void draw(GR_Graphics*) = 0;
00208 virtual void clearScreen(void) = 0;
00209 GR_Graphics* getGraphics(void) const;
00210 virtual fp_ContainerObject * getNext(void) const = 0;
00211 virtual fp_ContainerObject * getPrev(void) const = 0;
00212 virtual void setNext(fp_ContainerObject * pNext) = 0;
00213 virtual void setPrev(fp_ContainerObject * pNext) = 0;
00214 virtual bool isVBreakable(void) = 0;
00215 virtual bool isHBreakable(void) = 0;
00216 virtual UT_sint32 wantVBreakAt(UT_sint32) = 0;
00217 virtual UT_sint32 wantHBreakAt(UT_sint32) = 0;
00218 virtual fp_ContainerObject * VBreakAt(UT_sint32) =0;
00219 virtual fp_ContainerObject * HBreakAt(UT_sint32) = 0;
00220 virtual void mapXYToPosition(UT_sint32 xPos, UT_sint32 yPos, PT_DocPosition& pos, bool& bBOL, bool& bEOL, bool& isTOC) = 0;
00221 virtual fp_Container * getNextContainerInSection(void) const = 0;
00222 virtual fp_Container * getPrevContainerInSection(void) const = 0;
00223 virtual UT_Rect * getScreenRect() = 0;
00224 virtual void markDirtyOverlappingRuns(UT_Rect & recScreen) = 0;
00225 const char * getContainerString(void);
00226 void setAllowDelete(bool bDelete)
00227 { m_bCanDelete = bDelete;}
00228 bool canDelete(void)
00229 { return m_bCanDelete;}
00230 UT_sint32 getBreakTick(void) const
00231 { return m_iBreakTick;}
00232 void setBreakTick(UT_sint32 iTick)
00233 { m_iBreakTick = iTick;}
00234 void ref(void)
00235 { m_iRef++;}
00236 void unref(void)
00237 { m_iRef--;}
00238 UT_sint32 getRefCount(void)
00239 { return m_iRef;}
00240 private:
00244 FP_ContainerType m_iConType;
00248 fl_SectionLayout* m_pSectionLayout;
00249 UT_BidiCharType m_iDirection;
00250 UT_sint32 m_iBreakTick;
00251 UT_sint32 m_iRef;
00252 bool m_bCanDelete;
00253 };
00254
00255
00256 class ABI_EXPORT fp_Container : public fp_ContainerObject
00257 {
00258 public:
00259 fp_Container(FP_ContainerType iType, fl_SectionLayout* pSectionLayout);
00260 virtual ~fp_Container();
00261
00262 virtual void setContainer(fp_Container * pContainer);
00263 fp_Container * getContainer(void) const;
00264 fp_Container * getColumn(void) const;
00265 fp_Page * getPage(void) const;
00266 virtual UT_sint32 getMarginBefore(void) const =0;
00267 virtual UT_sint32 getMarginAfter(void) const =0;
00268 virtual fp_ContainerObject * getNext(void) const {return m_pNext;}
00269 virtual fp_ContainerObject * getPrev(void) const {return m_pPrev;}
00270 virtual void setNext(fp_ContainerObject * pNext);
00271 virtual void setPrev(fp_ContainerObject * pPrev);
00272 void clearCons(void)
00273 { m_vecContainers.clear();}
00274 fp_ContainerObject * getNthCon(UT_sint32 i) const;
00275 void addCon(fp_ContainerObject * pCon);
00276 UT_sint32 countCons(void) const;
00277 UT_sint32 findCon(fp_ContainerObject * pCon) const;
00278 void justRemoveNthCon(UT_sint32 i);
00279 void deleteNthCon(UT_sint32 i);
00280 void insertConAt(fp_ContainerObject * pCon, UT_sint32 i);
00281 bool isEmpty(void) const;
00282 virtual UT_uint32 distanceFromPoint(UT_sint32 x, UT_sint32 y) =0;
00283 virtual void recalcMaxWidth(bool bDontClearIfNeeded = false) = 0;
00284 virtual void setAssignedScreenHeight(UT_sint32 iY) =0;
00285 bool getPageRelativeOffsets(UT_Rect &r) const;
00286 bool isOnScreen() const;
00287 fp_Container * getMyBrokenContainer(void) const;
00288 void setMyBrokenContainer(fp_Container * pMyBroken);
00289 void clearBrokenContainers(void);
00290 UT_uint32 binarysearchCons(const void* key,int (*compar)(const void *,
00291 const void *));
00292 UT_uint32 getBrokenCount(void) { return m_cBrokenContainers; }
00293 void incBrokenCount(void) { m_cBrokenContainers += 1; }
00294 void decBrokenCount(void) { if (m_cBrokenContainers > 0) {
00295 m_cBrokenContainers -= 1; }}
00296
00297 fg_FillType * getFillType(void);
00298 private:
00299 fp_Container* m_pContainer;
00300 fp_ContainerObject * m_pNext;
00301 fp_ContainerObject * m_pPrev;
00302 UT_GenericVector<fp_ContainerObject *> m_vecContainers;
00303 fp_Container * m_pMyBrokenContainer;
00304 UT_uint32 m_cBrokenContainers;
00305 fg_FillType m_FillType;
00306 };
00307
00308
00309 #endif
00310
00311
00312
00313
00314
00315