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
00069 typedef struct _fp_Requisition fp_Requisition;
00070 typedef struct _fp_Allocation fp_Allocation;
00071
00076 struct _fp_Requisition
00077 {
00078 UT_sint32 width;
00079 UT_sint32 height;
00080 };
00081
00087 struct _fp_Allocation
00088 {
00089 UT_sint32 x;
00090 UT_sint32 y;
00091 UT_sint32 width;
00092 UT_sint32 height;
00093 };
00094
00095 class GR_Graphics;
00096 class FG_Graphic;
00097 class fl_SectionLayout;
00098 class FL_DocLayout;
00099 class fp_Page;
00100 class fp_Container;
00101 struct dg_DrawArgs;
00102 struct fp_Sliver;
00103 struct dg_DrawArgs;
00104
00105 typedef enum {
00106 FP_CONTAINER_RUN,
00107 FP_CONTAINER_LINE,
00108 FP_CONTAINER_VERTICAL,
00109 FP_CONTAINER_ROW,
00110 FP_CONTAINER_TABLE,
00111 FP_CONTAINER_CELL,
00112 FP_CONTAINER_COLUMN,
00113 FP_CONTAINER_HDRFTR,
00114 FP_CONTAINER_ENDNOTE,
00115 FP_CONTAINER_FOOTNOTE,
00116 FP_CONTAINER_COLUMN_POSITIONED,
00117 FP_CONTAINER_COLUMN_SHADOW,
00118 FP_CONTAINER_FRAME,
00119 FP_CONTAINER_TOC,
00120 FP_CONTAINER_ANNOTATION
00121
00122 } FP_ContainerType;
00123
00124 class ABI_EXPORT fg_FillType
00125 {
00126 friend class fp_Run;
00127 public:
00128 fg_FillType(fg_FillType *pParent, fp_ContainerObject * pContainer, FG_Fill_Type iType);
00129 virtual ~ fg_FillType(void);
00130 void setParent(fg_FillType * pParent);
00131 void setColor(UT_RGBColor & color);
00132 void setColor(const char * pszColor);
00133 void setTransColor(UT_RGBColor & color);
00134 void setTransColor(const char * pszColor);
00135 void setImage(FG_Graphic * pGraphic, GR_Image * pImage,GR_Graphics * pG, UT_sint32 width, UT_sint32 height);
00136 void setTransparent(void);
00137 void setWidthHeight(GR_Graphics * pG, UT_sint32 width, UT_sint32 height, bool doImage = false);
00138 void setWidth(GR_Graphics * pG, UT_sint32 width);
00139 void setHeight(GR_Graphics * pG, UT_sint32 height);
00140 void setDocLayout(FL_DocLayout * pDocLayout);
00141 void markTransparentForPrint(void);
00142 void Fill(GR_Graphics * pG, UT_sint32 & srcX, UT_sint32 & srcY, UT_sint32 x, UT_sint32 y, UT_sint32 width, UT_sint32 height);
00143 fg_FillType * getParent(void) const;
00144 FG_Fill_Type getFillType(void) const;
00145 FL_DocLayout * getDocLayout(void);
00146 UT_RGBColor * getColor(void);
00147 void setImagePointer(FG_Graphic ** pDocGraphic, GR_Image ** pDocImage);
00148
00149 private:
00150 void _regenerateImage(GR_Graphics * pG);
00151 fg_FillType * m_pParent;
00152 fp_ContainerObject * m_pContainer;
00153 FL_DocLayout * m_pDocLayout;
00154 FG_Fill_Type m_FillType;
00155 GR_Image * m_pImage;
00156 FG_Graphic * m_pGraphic;
00157 UT_uint32 m_iGraphicTick;
00158 bool m_bTransparentForPrint;
00159 UT_RGBColor m_color;
00160 UT_RGBColor m_TransColor;
00161 bool m_bTransColorSet;
00162 bool m_bColorSet;
00163 UT_sint32 m_iWidth;
00164 UT_sint32 m_iHeight;
00165 GR_Image ** m_pDocImage;
00166 FG_Graphic ** m_pDocGraphic;
00167 };
00168
00169
00170 class ABI_EXPORT fp_ContainerObject
00171 {
00172 public:
00173 fp_ContainerObject(FP_ContainerType iType, fl_SectionLayout* pSectionLayout);
00174 virtual ~fp_ContainerObject();
00179 FP_ContainerType getContainerType(void) const { return m_iConType; }
00180 bool isColumnType(void) const;
00181 virtual void setWidth(UT_sint32) = 0;
00182 virtual void setHeight(UT_sint32) = 0 ;
00183 virtual void setX(UT_sint32, bool bDontClearIfNeeded = false) = 0;
00184 virtual void setY(UT_sint32) = 0;
00185 virtual UT_sint32 getWidth(void) const = 0;
00186
00187
00188
00189 virtual UT_sint32 getDrawingWidth(void) const {return getWidth();}
00190
00191 virtual UT_sint32 getX(void) const = 0;
00192 virtual UT_sint32 getY(void) const = 0;
00193 fl_SectionLayout* getSectionLayout(void) const
00194 { return m_pSectionLayout; }
00195 void setSectionLayout(fl_SectionLayout * pSL)
00196 { m_pSectionLayout = pSL; }
00197 virtual inline UT_BidiCharType getDirection(void) const
00198 { return m_iDirection;}
00199 virtual inline void setDirection(UT_BidiCharType c) {m_iDirection = c;}
00200 virtual UT_sint32 getHeight(void) const = 0;
00201
00202
00203 virtual void draw(dg_DrawArgs*) = 0;
00204 virtual void draw(GR_Graphics*) = 0;
00205 virtual void clearScreen(void) = 0;
00206 GR_Graphics* getGraphics(void) const;
00207 virtual fp_ContainerObject * getNext(void) const = 0;
00208 virtual fp_ContainerObject * getPrev(void) const = 0;
00209 virtual void setNext(fp_ContainerObject * pNext) = 0;
00210 virtual void setPrev(fp_ContainerObject * pNext) = 0;
00211 virtual bool isVBreakable(void) = 0;
00212 virtual bool isHBreakable(void) = 0;
00213 virtual UT_sint32 wantVBreakAt(UT_sint32) = 0;
00214 virtual UT_sint32 wantHBreakAt(UT_sint32) = 0;
00215 virtual fp_ContainerObject * VBreakAt(UT_sint32) =0;
00216 virtual fp_ContainerObject * HBreakAt(UT_sint32) = 0;
00217 virtual void mapXYToPosition(UT_sint32 xPos, UT_sint32 yPos, PT_DocPosition& pos, bool& bBOL, bool& bEOL, bool& isTOC) = 0;
00218 virtual fp_Container * getNextContainerInSection(void) const = 0;
00219 virtual fp_Container * getPrevContainerInSection(void) const = 0;
00220 virtual UT_Rect * getScreenRect() = 0;
00221 virtual void markDirtyOverlappingRuns(UT_Rect & recScreen) = 0;
00222 const char * getContainerString(void);
00223 UT_sint32 getBreakTick(void) const
00224 { return m_iBreakTick;}
00225 void setBreakTick(UT_sint32 iTick)
00226 { m_iBreakTick = iTick;}
00227 void ref(void)
00228 { m_iRef++;}
00229 void unref(void)
00230 { m_iRef--;}
00231 UT_sint32 getRefCount(void)
00232 { return m_iRef;}
00233 private:
00237 FP_ContainerType m_iConType;
00241 fl_SectionLayout* m_pSectionLayout;
00242 UT_BidiCharType m_iDirection;
00243 UT_sint32 m_iBreakTick;
00244 UT_sint32 m_iRef;
00245 };
00246
00247
00248 class ABI_EXPORT fp_Container : public fp_ContainerObject
00249 {
00250 public:
00251 fp_Container(FP_ContainerType iType, fl_SectionLayout* pSectionLayout);
00252 virtual ~fp_Container();
00253
00254 virtual void setContainer(fp_Container * pContainer);
00255 fp_Container * getContainer(void) const;
00256 fp_Container * getColumn(void) const;
00257 fp_Page * getPage(void) const;
00258 virtual UT_sint32 getMarginBefore(void) const =0;
00259 virtual UT_sint32 getMarginAfter(void) const =0;
00260 virtual fp_ContainerObject * getNext(void) const {return m_pNext;}
00261 virtual fp_ContainerObject * getPrev(void) const {return m_pPrev;}
00262 virtual void setNext(fp_ContainerObject * pNext);
00263 virtual void setPrev(fp_ContainerObject * pPrev);
00264 void clearCons(void)
00265 { m_vecContainers.clear();}
00266 fp_ContainerObject * getNthCon(UT_uint32 i) const;
00267 void addCon(fp_ContainerObject * pCon);
00268 UT_uint32 countCons(void) const;
00269 UT_sint32 findCon(fp_ContainerObject * pCon) const;
00270 void justRemoveNthCon(UT_sint32 i);
00271 void deleteNthCon(UT_sint32 i);
00272 void insertConAt(fp_ContainerObject * pCon, UT_sint32 i);
00273 bool isEmpty(void) const;
00274 virtual UT_uint32 distanceFromPoint(UT_sint32 x, UT_sint32 y) =0;
00275 virtual void recalcMaxWidth(bool bDontClearIfNeeded = false) = 0;
00276 virtual void setAssignedScreenHeight(UT_sint32 iY) =0;
00277 bool getPageRelativeOffsets(UT_Rect &r) const;
00278 bool isOnScreen() const;
00279 fp_Container * getMyBrokenContainer(void) const;
00280 void setMyBrokenContainer(fp_Container * pMyBroken);
00281 void clearBrokenContainers(void);
00282 UT_uint32 binarysearchCons(const void* key,int (*compar)(const void *,
00283 const void *));
00284 UT_uint32 getBrokenCount(void) { return m_cBrokenContainers; }
00285 void incBrokenCount(void) { m_cBrokenContainers += 1; }
00286 void decBrokenCount(void) { if (m_cBrokenContainers > 0) {
00287 m_cBrokenContainers -= 1; }}
00288
00289 fg_FillType * getFillType(void);
00290 private:
00291 fp_Container* m_pContainer;
00292 fp_ContainerObject * m_pNext;
00293 fp_ContainerObject * m_pPrev;
00294 UT_GenericVector<fp_ContainerObject *> m_vecContainers;
00295 fp_Container * m_pMyBrokenContainer;
00296 UT_uint32 m_cBrokenContainers;
00297 fg_FillType m_FillType;
00298 };
00299
00300
00301 #endif
00302
00303
00304
00305
00306
00307