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