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