00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef SECTIONLAYOUT_H
00022 #define SECTIONLAYOUT_H
00023
00024 #ifdef FMT_TEST
00025 #include <stdio.h>
00026 #endif
00027
00028 #include <string>
00029
00030 typedef enum _SectionType
00031 {
00032 FL_SECTION_DOC,
00033 FL_SECTION_HDRFTR,
00034 FL_SECTION_SHADOW,
00035 FL_SECTION_ENDNOTE,
00036 FL_SECTION_TABLE,
00037 FL_SECTION_CELL,
00038 FL_SECTION_FOOTNOTE,
00039 FL_SECTION_MARGINNOTE,
00040 FL_SECTION_FRAME,
00041 FL_SECTION_TOC,
00042 FL_SECTION_ANNOTATION
00043 } SectionType;
00044
00045
00046 typedef enum _HdrFtrType
00047 {
00048 FL_HDRFTR_HEADER,
00049 FL_HDRFTR_HEADER_EVEN,
00050 FL_HDRFTR_HEADER_FIRST,
00051 FL_HDRFTR_HEADER_LAST,
00052 FL_HDRFTR_FOOTER,
00053 FL_HDRFTR_FOOTER_EVEN,
00054 FL_HDRFTR_FOOTER_FIRST,
00055 FL_HDRFTR_FOOTER_LAST,
00056 FL_HDRFTR_NONE
00057 } HdrFtrType;
00058
00059
00060 #include "ut_types.h"
00061 #include "ut_vector.h"
00062 #include "pt_Types.h"
00063 #include "fl_Layout.h"
00064 #include "fl_ContainerLayout.h"
00065 #include "pl_Listener.h"
00066 #include "ut_debugmsg.h"
00067 #include "ut_misc.h"
00068 #include "fg_Graphic.h"
00069 #include "fb_ColumnBreaker.h"
00070
00071 class fp_Page;
00072 class FL_DocLayout;
00073 class fl_Layout;
00074 class fl_ContainerLayout;
00075 class fl_BlockLayout;
00076 class fl_HdrFtrSectionLayout;
00077 class fl_HdrFtrShadow;
00078 class fl_FootnoteLayout;
00079 class fl_AnnotationLayout;
00080 class fb_LineBreaker;
00081 class fp_ShadowContainer;
00082 class fp_Column;
00083 class fp_Run;
00084 class fp_Line;
00085 class fp_Container;
00086 class fp_HdrFtrContainer;
00087 class PD_Document;
00088 class PP_AttrProp;
00089 class pf_Frag_Strux;
00090 class PX_ChangeRecord_FmtMark;
00091 class PX_ChangeRecord_FmtMarkChange;
00092 class PX_ChangeRecord_Object;
00093 class PX_ChangeRecord_ObjectChange;
00094 class PX_ChangeRecord_Span;
00095 class PX_ChangeRecord_SpanChange;
00096 class PX_ChangeRecord_Strux;
00097 class PX_ChangeRecord_StruxChange;
00098 class fb_ColumnBreaker;
00099 class fp_EndnoteContainer;
00100 class fl_TableLayout;
00101 class fl_CellLayout;
00102 class UT_Worker;
00103 class ABI_EXPORT fl_SectionLayout : public fl_ContainerLayout
00104 {
00105 friend class fl_DocListener;
00106
00107 public:
00108 fl_SectionLayout(FL_DocLayout* pLayout, pf_Frag_Strux* sdh, PT_AttrPropIndex ap, SectionType iType, fl_ContainerType iCType, PTStruxType ptType, fl_ContainerLayout * pMyContainerLayout);
00109 virtual ~fl_SectionLayout();
00110
00111 SectionType getType(void) const { return m_iType; }
00112
00113 virtual bool recalculateFields(UT_uint32 iUpdateCount);
00114 fl_BlockLayout * getFirstBlock(void) const;
00115 virtual fp_Container* getNewContainer(fp_Container * pFirstContainer = NULL) = 0;
00116 virtual FL_DocLayout* getDocLayout(void) const;
00117 virtual void markAllRunsDirty(void) =0;
00118 virtual bool isCollapsed(void) const
00119 {return m_bIsCollapsed;}
00120 virtual void setNeedsReformat(fl_ContainerLayout * pCL, UT_uint32 offset = 0);
00121 void clearNeedsReformat(fl_ContainerLayout * pCL);
00122 virtual void setNeedsRedraw(void);
00123 virtual void removeFromUpdate(fl_ContainerLayout * pL);
00124 virtual bool needsReformat(void) const
00125 {return m_bNeedsReformat;}
00126 virtual bool needsRedraw(void) const
00127 {return m_bNeedsRedraw;}
00128 virtual void clearNeedsRedraw(void)
00129 {m_bNeedsRedraw = false;}
00130
00131 virtual bool doclistener_changeStrux(const PX_ChangeRecord_StruxChange * pcrxc) = 0;
00132 void checkAndAdjustCellSize(void);
00133 virtual bool bl_doclistener_populateSpan(fl_ContainerLayout*, const PX_ChangeRecord_Span * pcrs, PT_BlockOffset blockOffset, UT_uint32 len);
00134 virtual bool bl_doclistener_populateObject(fl_ContainerLayout*, PT_BlockOffset blockOffset, const PX_ChangeRecord_Object * pcro);
00135 virtual bool bl_doclistener_insertSpan(fl_ContainerLayout*, const PX_ChangeRecord_Span * pcrs);
00136 virtual bool bl_doclistener_deleteSpan(fl_ContainerLayout*, const PX_ChangeRecord_Span * pcrs);
00137 virtual bool bl_doclistener_changeSpan(fl_ContainerLayout*, const PX_ChangeRecord_SpanChange * pcrsc);
00138 virtual bool bl_doclistener_deleteStrux(fl_ContainerLayout*, const PX_ChangeRecord_Strux * pcrx);
00139 virtual bool bl_doclistener_changeStrux(fl_ContainerLayout*, const PX_ChangeRecord_StruxChange * pcrxc);
00140 virtual bool bl_doclistener_insertBlock(fl_ContainerLayout*, const PX_ChangeRecord_Strux * pcrx,
00141 pf_Frag_Strux* sdh,
00142 PL_ListenerId lid,
00143 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
00144 PL_ListenerId lid,
00145 fl_ContainerLayout* sfhNew));
00146 virtual bool bl_doclistener_insertSection(fl_ContainerLayout*,
00147 SectionType iType,
00148 const PX_ChangeRecord_Strux * pcrx,
00149 pf_Frag_Strux* sdh,
00150 PL_ListenerId lid,
00151 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
00152 PL_ListenerId lid,
00153 fl_ContainerLayout* sfhNew));
00154 virtual fl_SectionLayout * bl_doclistener_insertTable(fl_ContainerLayout*,
00155 SectionType iType,
00156 const PX_ChangeRecord_Strux * pcrx,
00157 pf_Frag_Strux* sdh,
00158 PL_ListenerId lid,
00159 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
00160 PL_ListenerId lid,
00161 fl_ContainerLayout* sfhNew));
00162 virtual fl_SectionLayout * bl_doclistener_insertTable(SectionType iType,
00163 const PX_ChangeRecord_Strux * pcrx,
00164 pf_Frag_Strux* sdh,
00165 PL_ListenerId lid,
00166 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
00167 PL_ListenerId lid,
00168 fl_ContainerLayout* sfhNew));
00169 virtual fl_SectionLayout * bl_doclistener_insertFrame(fl_ContainerLayout*,
00170 SectionType iType,
00171 const PX_ChangeRecord_Strux * pcrx,
00172 pf_Frag_Strux* sdh,
00173 PL_ListenerId lid,
00174 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
00175 PL_ListenerId lid,
00176 fl_ContainerLayout* sfhNew));
00177
00178 virtual bool bl_doclistener_insertObject(fl_ContainerLayout*, const PX_ChangeRecord_Object * pcro);
00179 virtual bool bl_doclistener_deleteObject(fl_ContainerLayout*, const PX_ChangeRecord_Object * pcro);
00180 virtual bool bl_doclistener_changeObject(fl_ContainerLayout*, const PX_ChangeRecord_ObjectChange * pcroc);
00181
00182 virtual bool bl_doclistener_insertFmtMark(fl_ContainerLayout*, const PX_ChangeRecord_FmtMark * pcrfm);
00183 virtual bool bl_doclistener_deleteFmtMark(fl_ContainerLayout*, const PX_ChangeRecord_FmtMark * pcrfm);
00184 virtual bool bl_doclistener_changeFmtMark(fl_ContainerLayout*, const PX_ChangeRecord_FmtMarkChange * pcrfmc);
00185
00186 virtual void checkGraphicTick(GR_Graphics * pG);
00187 virtual void setImageWidth(UT_sint32 iWidth);
00188 virtual void setImageHeight(UT_sint32 iHeight);
00189 GR_Image * getBackgroundImage(void)
00190 { return m_pImageImage;}
00191
00192 #ifdef FMT_TEST
00193 virtual void __dump(FILE * fp) const;
00194 #endif
00195
00196 protected:
00197
00198 void _purgeLayout();
00199
00200 SectionType m_iType;
00201
00202 FL_DocLayout* m_pLayout;
00203 bool m_bIsCollapsed;
00204 bool m_bNeedsReformat;
00205 bool m_bNeedsRedraw;
00206 FG_SharedGraphicPtr m_pGraphicImage;
00207 GR_Image * m_pImageImage;
00208 UT_uint32 m_iGraphicTick;
00209 UT_sint32 m_iDocImageWidth;
00210 UT_sint32 m_iDocImageHeight;
00211 UT_GenericVector<fl_ContainerLayout *> m_vecFormatLayout;
00212 };
00213
00214 class ABI_EXPORT fl_DocSectionLayout : public fl_SectionLayout
00215 {
00216 friend class fl_DocListener;
00217
00218 public:
00219 fl_DocSectionLayout(FL_DocLayout* pLayout, pf_Frag_Strux* sdh, PT_AttrPropIndex ap, SectionType iType);
00220 virtual ~fl_DocSectionLayout();
00221
00222 fl_DocSectionLayout* getNextDocSection(void) const;
00223 fl_DocSectionLayout* getPrevDocSection(void) const;
00224
00225 virtual void format(void);
00226 virtual void updateLayout(bool bDoFull);
00227 void updateDocSection(void);
00228 virtual void collapse(void);
00229 virtual fp_Container * getFirstContainer(void) const;
00230 virtual fp_Container * getLastContainer(void) const;
00231 virtual void setFirstContainer(fp_Container * pCon);
00232 virtual void setLastContainer(fp_Container * pCon);
00233
00234 fl_FootnoteLayout * getFootnoteLayout(UT_uint32 footnotePID);
00235 fl_AnnotationLayout * getAnnotationLayout(UT_uint32 footnotePID);
00236
00237
00238 virtual void markAllRunsDirty(void);
00239 virtual fl_SectionLayout * getSectionLayout(void) const
00240 { return NULL; }
00241
00242 virtual void redrawUpdate(void);
00243 virtual fp_Container* getNewContainer(fp_Container * pFirstContainer = NULL);
00244
00245 inline UT_sint32 getLeftMargin(void) const { return m_iLeftMargin; }
00246 inline UT_sint32 getRightMargin(void) const { return m_iRightMargin; }
00247 UT_sint32 getTopMargin(void) const;
00248 UT_sint32 getBottomMargin(void) const;
00249 inline UT_sint32 getFooterMargin(void) const { return m_iFooterMargin; }
00250 inline UT_sint32 getHeaderMargin(void) const { return m_iHeaderMargin; }
00251 inline UT_sint32 getSpaceAfter(void) const { return m_iSpaceAfter; }
00252 inline UT_sint32 getMaxSectionColumnHeight(void) const { return m_iMaxSectionColumnHeight;}
00253 UT_sint32 getColumnGap(void) const;
00254 UT_uint32 getFootnoteLineThickness(void) const
00255 { return m_iFootnoteLineThickness;}
00256 UT_uint32 getFootnoteYoff(void) const
00257 { return m_iFootnoteYoff;}
00258
00259 void completeBreakSection(void);
00260 bool arePageNumbersRestarted (void) const { return m_bRestart;}
00261 UT_sint32 getRestartedPageNumber(void) const { return m_iRestartValue;}
00262 UT_uint32 getNumColumns(void) const;
00263 bool getColumnLineBetween(void) const {return m_bColumnLineBetween;}
00264 UT_uint32 getColumnOrder(void) const;
00265 void setPaperColor();
00266 void deleteEmptyColumns(void);
00267 virtual bool doclistener_changeStrux(const PX_ChangeRecord_StruxChange * pcrxc);
00268 bool doclistener_deleteStrux(const PX_ChangeRecord_Strux * pcrx);
00269
00270 virtual bool bl_doclistener_insertFootnote(fl_ContainerLayout*, const PX_ChangeRecord_Strux * pcrx,
00271 pf_Frag_Strux* sdh,
00272 PL_ListenerId lid,
00273 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
00274 PL_ListenerId lid,
00275 fl_ContainerLayout* sfhNew));
00276
00277
00278 virtual bool bl_doclistener_insertAnnotation(fl_ContainerLayout*, const PX_ChangeRecord_Strux * pcrx,
00279 pf_Frag_Strux* sdh,
00280 PL_ListenerId lid,
00281 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
00282 PL_ListenerId lid,
00283 fl_ContainerLayout* sfhNew));
00284
00285 void setHdrFtr(HdrFtrType iType, fl_HdrFtrSectionLayout* pHFSL);
00286
00287 fl_HdrFtrSectionLayout* getHeader(void) const;
00288 fl_HdrFtrSectionLayout* getFooter(void) const;
00289 fl_HdrFtrSectionLayout* getHeaderEven(void) const;
00290 fl_HdrFtrSectionLayout* getFooterEven(void) const;
00291 fl_HdrFtrSectionLayout* getHeaderFirst(void) const;
00292 fl_HdrFtrSectionLayout* getFooterFirst(void) const;
00293 fl_HdrFtrSectionLayout* getHeaderLast(void) const;
00294 fl_HdrFtrSectionLayout* getFooterLast(void) const;
00295
00296 bool setHdrFtrHeightChange(bool bDoHdr, UT_sint32 newHeight);
00297 static void _HdrFtrChangeCallback(UT_Worker * pWorker);
00298
00299 void addOwnedPage(fp_Page*);
00300 void prependOwnedHeaderPage(fp_Page * p_Page);
00301 void prependOwnedFooterPage(fp_Page * p_Page);
00302 void deleteOwnedPage(fp_Page*, bool bReallyDeleteIT=true);
00303 fp_Page * getFirstOwnedPage(void) const {return m_pFirstOwnedPage;}
00304 void markForRebuild(void) { m_bNeedsRebuild = true;}
00305 void clearRebuild(void) { m_bNeedsRebuild = false;}
00306 bool needsRebuild(void) const { return m_bNeedsRebuild;}
00307 void checkAndAdjustColumnGap(UT_sint32 iLayoutWidth);
00308 void markForReformat(void) { m_bNeedsFormat = true;}
00309 bool needsReFormat(void) const { return m_bNeedsFormat;}
00310 bool isThisPageValid(HdrFtrType hfType, fp_Page * pThisPage) const;
00311 bool isFirstPageValid(void) const;
00312 void getVecOfHdrFtrs(UT_GenericVector<fl_HdrFtrSectionLayout *> * vecHdrFtr) const;
00313 void formatAllHdrFtr(void);
00314 void doMarginChangeOnly(void);
00315 void checkAndRemovePages(void);
00316 void addValidPages(void);
00317 UT_sint32 getPageCount(void) const {return m_iPageCount;}
00318 void setNeedsSectionBreak(bool bSet, fp_Page * pPage );
00319 bool needsSectionBreak(void) const { return m_bNeedsSectionBreak;}
00320 void setFirstEndnoteContainer(fp_EndnoteContainer * pECon);
00321 void setLastEndnoteContainer(fp_EndnoteContainer * pECon);
00322 fp_Container * getFirstEndnoteContainer(void) const;
00323 fp_Container * getLastEndnoteContainer(void) const;
00324 void deleteBrokenTablesFromHere(fl_ContainerLayout * pTL);
00325 UT_sint32 getWidth(void) const;
00326 UT_sint32 getActualColumnHeight(void) const;
00327 UT_sint32 getActualColumnWidth(void) const;
00328 bool isCollapsing(void) const
00329 { return m_bDoingCollapse;}
00330 private:
00331 virtual void _lookupProperties(const PP_AttrProp* pAP);
00332 virtual void _lookupMarginProperties(const PP_AttrProp* pAP);
00333 fb_ColumnBreaker m_ColumnBreaker;
00334
00335
00336
00337 fl_HdrFtrSectionLayout* m_pHeaderSL;
00338 fl_HdrFtrSectionLayout* m_pFooterSL;
00339 fl_HdrFtrSectionLayout* m_pHeaderEvenSL;
00340 fl_HdrFtrSectionLayout* m_pFooterEvenSL;
00341 fl_HdrFtrSectionLayout* m_pHeaderFirstSL;
00342 fl_HdrFtrSectionLayout* m_pFooterFirstSL;
00343 fl_HdrFtrSectionLayout* m_pHeaderLastSL;
00344 fl_HdrFtrSectionLayout* m_pFooterLastSL;
00345
00346 UT_uint32 m_iNumColumns;
00347 UT_sint32 m_iColumnGap;
00348 bool m_bColumnLineBetween;
00349 UT_uint32 m_iColumnOrder;
00350
00351 UT_sint32 m_iSpaceAfter;
00352 bool m_bRestart;
00353 UT_sint32 m_iRestartValue;
00354 UT_sint32 m_iLeftMargin;
00355 double m_dLeftMarginUserUnits;
00356 UT_sint32 m_iRightMargin;
00357 double m_dRightMarginUserUnits;
00358 UT_sint32 m_iTopMargin;
00359 double m_dTopMarginUserUnits;
00360 UT_sint32 m_iBottomMargin;
00361 double m_dBottomMarginUserUnits;
00362 UT_sint32 m_iFooterMargin;
00363 double m_dFooterMarginUserUnits;
00364 UT_sint32 m_iHeaderMargin;
00365 double m_dHeaderMarginUserUnits;
00366 UT_sint32 m_iMaxSectionColumnHeight;
00367 double m_dMaxSectionColumnHeight;
00368 UT_sint32 m_iFootnoteLineThickness;
00369 UT_sint32 m_iFootnoteYoff;
00370
00372 fp_Column* m_pFirstColumn;
00374 fp_Column* m_pLastColumn;
00375 fp_Page * m_pFirstOwnedPage;
00376 UT_sint32 m_iPageCount;
00377 bool m_bNeedsFormat;
00378 bool m_bNeedsRebuild;
00379 bool m_bNeedsSectionBreak;
00380 fp_EndnoteContainer * m_pFirstEndnoteContainer;
00381 fp_EndnoteContainer * m_pLastEndnoteContainer;
00382 bool m_bDeleteingBrokenContainers;
00383 std::string m_sPaperColor;
00384 std::string m_sScreenColor;
00385 UT_sint32 m_iNewHdrHeight;
00386 UT_sint32 m_iNewFtrHeight;
00387 UT_Worker * m_pHdrFtrChangeTimer;
00388 std::string m_sHdrFtrChangeProps;
00389 bool m_bDoingCollapse;
00390 };
00391
00392 class _PageHdrFtrShadowPair;
00393
00394
00395 class ABI_EXPORT fl_HdrFtrSectionLayout : public fl_SectionLayout
00396 {
00397 friend class fl_DocListener;
00398
00399 public:
00400 fl_HdrFtrSectionLayout(HdrFtrType iHFType, FL_DocLayout* pLayout, fl_DocSectionLayout* pDocSL, pf_Frag_Strux* sdh, PT_AttrPropIndex ap);
00401 virtual ~fl_HdrFtrSectionLayout();
00402
00403 inline fl_DocSectionLayout* getDocSectionLayout(void) const { return m_pDocSL; }
00404 HdrFtrType getHFType(void) const { return m_iHFType; }
00405 void setDocSectionLayout(fl_DocSectionLayout * pDSL) { m_pDocSL = pDSL;}
00406 void setHdrFtr(HdrFtrType iHFType) { m_iHFType = iHFType;}
00407 virtual bool recalculateFields(UT_uint32 iUpdateCount);
00408 bool doclistener_deleteStrux(const PX_ChangeRecord * pcr);
00409 void checkAndAdjustCellSize(fl_ContainerLayout * pCL);
00410 void localFormat(void);
00411 virtual void markAllRunsDirty(void);
00412 void checkAndRemovePages(void);
00413 void addValidPages(void);
00414 bool isPageHere( fp_Page *pPage);
00415 bool isPointInHere(PT_DocPosition pos);
00416 void collapseBlock(fl_ContainerLayout * pBlock);
00417 virtual void format(void);
00418 virtual fl_SectionLayout * getSectionLayout(void) const
00419 { return static_cast<fl_SectionLayout *>(m_pDocSL);}
00420 virtual void updateLayout(bool bDoFull);
00421 void layout(void);
00422 fl_ContainerLayout * findMatchingContainer( fl_ContainerLayout * pBL);
00423 virtual void redrawUpdate(void);
00424 virtual fp_Container* getNewContainer(fp_Container * pFirstContainer = NULL);
00425 virtual fp_Container* getFirstContainer() const;
00426 virtual fp_Container* getLastContainer() const;
00427 fl_HdrFtrShadow * getFirstShadow(void);
00428 fl_HdrFtrShadow * findShadow( fp_Page * pPage);
00429 virtual bool doclistener_changeStrux(const PX_ChangeRecord_StruxChange * pcrxc);
00430 void changeIntoHdrFtrSection( fl_DocSectionLayout * pSL);
00431 void addPage(fp_Page*);
00432 void deletePage(fp_Page*);
00433 void clearScreen(void);
00434 virtual void collapse(void);
00435 bool bl_doclistener_insertCell(fl_ContainerLayout* pCell,
00436 const PX_ChangeRecord_Strux * pcrx,
00437 pf_Frag_Strux* sdh,
00438 PL_ListenerId lid,
00439 fl_TableLayout * pTL);
00440 bool bl_doclistener_insertEndTable(fl_ContainerLayout* pTab,
00441 const PX_ChangeRecord_Strux * pcrx,
00442 pf_Frag_Strux* sdh,
00443 PL_ListenerId lid);
00444 virtual bool bl_doclistener_populateSpan(fl_ContainerLayout*, const PX_ChangeRecord_Span * pcrs, PT_BlockOffset blockOffset, UT_uint32 len);
00445 virtual bool bl_doclistener_populateObject(fl_ContainerLayout*, PT_BlockOffset blockOffset, const PX_ChangeRecord_Object * pcro);
00446 virtual bool bl_doclistener_insertSpan(fl_ContainerLayout*, const PX_ChangeRecord_Span * pcrs);
00447 virtual bool bl_doclistener_deleteSpan(fl_ContainerLayout*, const PX_ChangeRecord_Span * pcrs);
00448 virtual bool bl_doclistener_changeSpan(fl_ContainerLayout*, const PX_ChangeRecord_SpanChange * pcrsc);
00449 virtual bool bl_doclistener_deleteStrux(fl_ContainerLayout*, const PX_ChangeRecord_Strux * pcrx);
00450 bool bl_doclistener_deleteCellStrux(fl_ContainerLayout*, const PX_ChangeRecord_Strux * pcrx);
00451 bool bl_doclistener_deleteTableStrux(fl_ContainerLayout*, const PX_ChangeRecord_Strux * pcrx);
00452 virtual bool bl_doclistener_changeStrux(fl_ContainerLayout*, const PX_ChangeRecord_StruxChange * pcrxc);
00453 virtual fl_SectionLayout * bl_doclistener_insertTable(fl_ContainerLayout*,
00454 SectionType iType,
00455 const PX_ChangeRecord_Strux * pcrx,
00456 pf_Frag_Strux* sdh,
00457 PL_ListenerId lid,
00458 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
00459 PL_ListenerId lid,
00460 fl_ContainerLayout* sfhNew));
00461 virtual fl_SectionLayout * bl_doclistener_insertTable(SectionType iType,
00462 const PX_ChangeRecord_Strux * pcrx,
00463 pf_Frag_Strux* sdh,
00464 PL_ListenerId lid,
00465 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
00466 PL_ListenerId lid,
00467 fl_ContainerLayout* sfhNew));
00468 bool bl_doclistener_insertFirstBlock(fl_ContainerLayout* pCL, const PX_ChangeRecord_Strux * pcrx,pf_Frag_Strux* sdh,PL_ListenerId lid);
00469 virtual bool bl_doclistener_insertBlock(fl_ContainerLayout*, const PX_ChangeRecord_Strux * pcrx,
00470 pf_Frag_Strux* sdh,
00471 PL_ListenerId lid,
00472 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
00473 PL_ListenerId lid,
00474 fl_ContainerLayout* sfhNew));
00475 virtual bool bl_doclistener_insertSection(fl_ContainerLayout*, const PX_ChangeRecord_Strux * pcrx,
00476 pf_Frag_Strux* sdh,
00477 PL_ListenerId lid,
00478 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
00479 PL_ListenerId lid,
00480 fl_ContainerLayout* sfhNew));
00481 virtual bool bl_doclistener_insertObject(fl_ContainerLayout*, const PX_ChangeRecord_Object * pcro);
00482 virtual bool bl_doclistener_deleteObject(fl_ContainerLayout*, const PX_ChangeRecord_Object * pcro);
00483 virtual bool bl_doclistener_changeObject(fl_ContainerLayout*, const PX_ChangeRecord_ObjectChange * pcroc);
00484
00485 virtual bool bl_doclistener_insertFmtMark(fl_ContainerLayout*, const PX_ChangeRecord_FmtMark * pcrfm);
00486 virtual bool bl_doclistener_deleteFmtMark(fl_ContainerLayout*, const PX_ChangeRecord_FmtMark * pcrfm);
00487 virtual bool bl_doclistener_changeFmtMark(fl_ContainerLayout*, const PX_ChangeRecord_FmtMarkChange * pcrfmc);
00488
00489 private:
00490 UT_sint32 _findShadow(fp_Page * pPage);
00491 virtual void _lookupProperties(const PP_AttrProp* pAP);
00492 virtual void _lookupMarginProperties(const PP_AttrProp* pAP);
00493 void _localCollapse(void);
00494
00495 fl_DocSectionLayout* m_pDocSL;
00496 HdrFtrType m_iHFType;
00497 UT_GenericVector<_PageHdrFtrShadowPair*> m_vecPages;
00498 fp_Container * m_pHdrFtrContainer;
00499 };
00500
00501
00502 class ABI_EXPORT fl_HdrFtrShadow : public fl_SectionLayout
00503 {
00504 friend class fl_DocListener;
00505
00506 public:
00507 fl_HdrFtrShadow(FL_DocLayout* pLayout, fp_Page* pPage, fl_HdrFtrSectionLayout* pDocSL, pf_Frag_Strux* sdh, PT_AttrPropIndex ap);
00508 virtual ~fl_HdrFtrShadow();
00509
00510 virtual fl_HdrFtrSectionLayout* getHdrFtrSectionLayout(void) const { return m_pHdrFtrSL; }
00511 fl_ContainerLayout * findMatchingContainer(fl_ContainerLayout * pBL);
00512 fl_ContainerLayout * findBlockAtPosition(PT_DocPosition pos);
00513 virtual void format(void);
00514 virtual void updateLayout(bool bDoFull);
00515 virtual void redrawUpdate(void);
00516 fp_Page * getPage(void) const { return m_pPage;}
00517 virtual fp_Container* getNewContainer(fp_Container *pFirstContainer = NULL);
00518 virtual fp_Container* getFirstContainer() const;
00519 virtual fp_Container* getLastContainer() const;
00520 void layout(void);
00521 void clearScreen(void);
00522 virtual bool doclistener_changeStrux(const PX_ChangeRecord_StruxChange * pcrxc);
00523 virtual void collapse(void) {}
00524 virtual void markAllRunsDirty(void) {}
00525 virtual fl_SectionLayout * getSectionLayout(void) const
00526 { return getHdrFtrSectionLayout()->getSectionLayout(); }
00527
00528
00529 private:
00530 virtual void _lookupProperties(const PP_AttrProp* pAP);
00531 virtual void _lookupMarginProperties(const PP_AttrProp* pAP);
00532 void _createContainer(void);
00533
00534 fp_ShadowContainer* m_pContainer;
00535 fp_Page* m_pPage;
00536 fl_HdrFtrSectionLayout * m_pHdrFtrSL;
00537 };
00538
00539 class ABI_EXPORT fl_ShadowListener : public PL_Listener
00540 {
00541 public:
00542 fl_ShadowListener(fl_HdrFtrSectionLayout* pHFSL, fl_HdrFtrShadow* pShadow);
00543 virtual ~fl_ShadowListener();
00544
00545 virtual bool populate(fl_ContainerLayout* sfh,
00546 const PX_ChangeRecord * pcr);
00547
00548 virtual bool populateStrux(pf_Frag_Strux* sdh,
00549 const PX_ChangeRecord * pcr,
00550 fl_ContainerLayout* * psfh);
00551
00552 virtual bool change(fl_ContainerLayout* sfh,
00553 const PX_ChangeRecord * pcr);
00554
00555 virtual bool insertStrux(fl_ContainerLayout* sfh,
00556 const PX_ChangeRecord * pcr,
00557 pf_Frag_Strux* sdh,
00558 PL_ListenerId lid,
00559 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
00560 PL_ListenerId lid,
00561 fl_ContainerLayout* sfhNew));
00562
00563 virtual bool signal(UT_uint32 iSignal);
00564
00565 private:
00566 PD_Document* m_pDoc;
00567 fl_HdrFtrShadow* m_pShadow;
00568 bool m_bListening;
00569 fl_ContainerLayout* m_pCurrentBL;
00570 fl_HdrFtrSectionLayout * m_pHFSL;
00571 fl_TableLayout * m_pCurrentTL;
00572 fl_CellLayout * m_pCurrentCell;
00573 };
00574
00575 #endif