1 /* AbiWord
2 * Copyright (C) 1998 AbiSource, Inc.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17 * 02110-1301 USA.
18 */
19
20 #ifndef SECTIONLAYOUT_H
21 #define SECTIONLAYOUT_H
22
23 #ifdef FMT_TEST
24 #include <stdio.h>
25 #endif
26
27 typedef enum _SectionType
28 {
29 FL_SECTION_DOC,
30 FL_SECTION_HDRFTR,
31 FL_SECTION_SHADOW,
32 FL_SECTION_ENDNOTE,
33 FL_SECTION_TABLE,
34 FL_SECTION_CELL,
35 FL_SECTION_FOOTNOTE,
36 FL_SECTION_MARGINNOTE,
37 FL_SECTION_FRAME,
38 FL_SECTION_TOC,
39 FL_SECTION_ANNOTATION
40 } SectionType;
41
42
43 typedef enum _HdrFtrType
44 {
45 FL_HDRFTR_HEADER,
46 FL_HDRFTR_HEADER_EVEN,
47 FL_HDRFTR_HEADER_FIRST,
48 FL_HDRFTR_HEADER_LAST,
49 FL_HDRFTR_FOOTER,
50 FL_HDRFTR_FOOTER_EVEN,
51 FL_HDRFTR_FOOTER_FIRST,
52 FL_HDRFTR_FOOTER_LAST,
53 FL_HDRFTR_NONE
54 } HdrFtrType;
55
56
57 #include "ut_types.h"
58 #include "ut_vector.h"
59 #include "pt_Types.h"
60 #include "fl_Layout.h"
61 #include "fl_ContainerLayout.h"
62 #include "pl_Listener.h"
63 #include "ut_debugmsg.h"
64 #include "ut_misc.h" // for UT_RGBColor
65 #include "fb_ColumnBreaker.h"
66
67 class fp_Page;
68 class FL_DocLayout;
69 class fl_Layout;
70 class fl_ContainerLayout;
71 class fl_BlockLayout;
72 class fl_HdrFtrSectionLayout;
73 class fl_HdrFtrShadow;
74 class fl_FootnoteLayout;
75 class fl_AnnotationLayout;
76 class fb_LineBreaker;
77 class fp_ShadowContainer;
78 class fp_Column;
79 class fp_Run;
80 class fp_Line;
81 class fp_Container;
82 class fp_HdrFtrContainer;
83 class FG_Graphic;
84 class PD_Document;
85 class PP_AttrProp;
86 class pf_Frag_Strux;
87 class PX_ChangeRecord_FmtMark;
88 class PX_ChangeRecord_FmtMarkChange;
89 class PX_ChangeRecord_Object;
90 class PX_ChangeRecord_ObjectChange;
91 class PX_ChangeRecord_Span;
92 class PX_ChangeRecord_SpanChange;
93 class PX_ChangeRecord_Strux;
94 class PX_ChangeRecord_StruxChange;
95 class fb_ColumnBreaker;
96 class fp_EndnoteContainer;
97 class fl_TableLayout;
98 class fl_CellLayout;
99 class UT_Worker;
100 class ABI_EXPORT fl_SectionLayout : public fl_ContainerLayout
101 {
102 friend class fl_DocListener;
103
104 public:
105 fl_SectionLayout(FL_DocLayout* pLayout, pf_Frag_Strux* sdh, PT_AttrPropIndex ap, SectionType iType, fl_ContainerType iCType, PTStruxType ptType, fl_ContainerLayout * pMyContainerLayout);
106 virtual ~fl_SectionLayout();
107
getType(void)108 SectionType getType(void) const { return m_iType; }
109
110 virtual bool recalculateFields(UT_uint32 iUpdateCount);
111 fl_BlockLayout * getFirstBlock(void) const;
112 virtual fp_Container* getNewContainer(fp_Container * pFirstContainer = NULL) = 0;
113 virtual FL_DocLayout* getDocLayout(void) const;
114 virtual void markAllRunsDirty(void) =0;
isCollapsed(void)115 virtual bool isCollapsed(void) const
116 {return m_bIsCollapsed;}
117 virtual void setNeedsReformat(fl_ContainerLayout * pCL, UT_uint32 offset = 0);
118 void clearNeedsReformat(fl_ContainerLayout * pCL);
119 virtual void setNeedsRedraw(void);
120 virtual void removeFromUpdate(fl_ContainerLayout * pL);
needsReformat(void)121 virtual bool needsReformat(void) const
122 {return m_bNeedsReformat;}
needsRedraw(void)123 virtual bool needsRedraw(void) const
124 {return m_bNeedsRedraw;}
clearNeedsRedraw(void)125 virtual void clearNeedsRedraw(void)
126 {m_bNeedsRedraw = false;}
127
128 virtual bool doclistener_changeStrux(const PX_ChangeRecord_StruxChange * pcrxc) = 0;
129 void checkAndAdjustCellSize(void);
130 virtual bool bl_doclistener_populateSpan(fl_ContainerLayout*, const PX_ChangeRecord_Span * pcrs, PT_BlockOffset blockOffset, UT_uint32 len);
131 virtual bool bl_doclistener_populateObject(fl_ContainerLayout*, PT_BlockOffset blockOffset, const PX_ChangeRecord_Object * pcro);
132 virtual bool bl_doclistener_insertSpan(fl_ContainerLayout*, const PX_ChangeRecord_Span * pcrs);
133 virtual bool bl_doclistener_deleteSpan(fl_ContainerLayout*, const PX_ChangeRecord_Span * pcrs);
134 virtual bool bl_doclistener_changeSpan(fl_ContainerLayout*, const PX_ChangeRecord_SpanChange * pcrsc);
135 virtual bool bl_doclistener_deleteStrux(fl_ContainerLayout*, const PX_ChangeRecord_Strux * pcrx);
136 virtual bool bl_doclistener_changeStrux(fl_ContainerLayout*, const PX_ChangeRecord_StruxChange * pcrxc);
137 virtual bool bl_doclistener_insertBlock(fl_ContainerLayout*, const PX_ChangeRecord_Strux * pcrx,
138 pf_Frag_Strux* sdh,
139 PL_ListenerId lid,
140 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
141 PL_ListenerId lid,
142 fl_ContainerLayout* sfhNew));
143 virtual bool bl_doclistener_insertSection(fl_ContainerLayout*,
144 SectionType iType,
145 const PX_ChangeRecord_Strux * pcrx,
146 pf_Frag_Strux* sdh,
147 PL_ListenerId lid,
148 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
149 PL_ListenerId lid,
150 fl_ContainerLayout* sfhNew));
151 virtual fl_SectionLayout * bl_doclistener_insertTable(fl_ContainerLayout*,
152 SectionType iType,
153 const PX_ChangeRecord_Strux * pcrx,
154 pf_Frag_Strux* sdh,
155 PL_ListenerId lid,
156 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
157 PL_ListenerId lid,
158 fl_ContainerLayout* sfhNew));
159 virtual fl_SectionLayout * bl_doclistener_insertTable(SectionType iType,
160 const PX_ChangeRecord_Strux * pcrx,
161 pf_Frag_Strux* sdh,
162 PL_ListenerId lid,
163 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
164 PL_ListenerId lid,
165 fl_ContainerLayout* sfhNew));
166 virtual fl_SectionLayout * bl_doclistener_insertFrame(fl_ContainerLayout*,
167 SectionType iType,
168 const PX_ChangeRecord_Strux * pcrx,
169 pf_Frag_Strux* sdh,
170 PL_ListenerId lid,
171 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
172 PL_ListenerId lid,
173 fl_ContainerLayout* sfhNew));
174
175 virtual bool bl_doclistener_insertObject(fl_ContainerLayout*, const PX_ChangeRecord_Object * pcro);
176 virtual bool bl_doclistener_deleteObject(fl_ContainerLayout*, const PX_ChangeRecord_Object * pcro);
177 virtual bool bl_doclistener_changeObject(fl_ContainerLayout*, const PX_ChangeRecord_ObjectChange * pcroc);
178
179 virtual bool bl_doclistener_insertFmtMark(fl_ContainerLayout*, const PX_ChangeRecord_FmtMark * pcrfm);
180 virtual bool bl_doclistener_deleteFmtMark(fl_ContainerLayout*, const PX_ChangeRecord_FmtMark * pcrfm);
181 virtual bool bl_doclistener_changeFmtMark(fl_ContainerLayout*, const PX_ChangeRecord_FmtMarkChange * pcrfmc);
182
183 virtual void checkGraphicTick(GR_Graphics * pG);
184 virtual void setImageWidth(UT_sint32 iWidth);
185 virtual void setImageHeight(UT_sint32 iHeight);
getBackgroundImage(void)186 GR_Image * getBackgroundImage(void)
187 { return m_pImageImage;}
188
189 #ifdef FMT_TEST
190 virtual void __dump(FILE * fp) const;
191 #endif
192
193 protected:
194
195 void _purgeLayout();
196
197 SectionType m_iType;
198
199 FL_DocLayout* m_pLayout;
200 bool m_bIsCollapsed;
201 bool m_bNeedsReformat;
202 bool m_bNeedsRedraw;
203 FG_Graphic * m_pGraphicImage;
204 GR_Image * m_pImageImage;
205 UT_uint32 m_iGraphicTick;
206 UT_sint32 m_iDocImageWidth;
207 UT_sint32 m_iDocImageHeight;
208 UT_GenericVector<fl_ContainerLayout *> m_vecFormatLayout;
209 };
210
211 class ABI_EXPORT fl_DocSectionLayout : public fl_SectionLayout
212 {
213 friend class fl_DocListener;
214
215 public:
216 fl_DocSectionLayout(FL_DocLayout* pLayout, pf_Frag_Strux* sdh, PT_AttrPropIndex ap, SectionType iType);
217 virtual ~fl_DocSectionLayout();
218
219 fl_DocSectionLayout* getNextDocSection(void) const;
220 fl_DocSectionLayout* getPrevDocSection(void) const;
221
222 virtual void format(void);
223 virtual void updateLayout(bool bDoFull);
224 void updateDocSection(void);
225 virtual void collapse(void);
226 virtual fp_Container * getFirstContainer(void) const;
227 virtual fp_Container * getLastContainer(void) const;
228 virtual void setFirstContainer(fp_Container * pCon);
229 virtual void setLastContainer(fp_Container * pCon);
230
231 fl_FootnoteLayout * getFootnoteLayout(UT_uint32 footnotePID);
232 fl_AnnotationLayout * getAnnotationLayout(UT_uint32 footnotePID);
233
234
235 virtual void markAllRunsDirty(void);
getSectionLayout(void)236 virtual fl_SectionLayout * getSectionLayout(void) const
237 { return NULL; }
238
239 virtual void redrawUpdate(void);
240 virtual fp_Container* getNewContainer(fp_Container * pFirstContainer = NULL);
241
getLeftMargin(void)242 inline UT_sint32 getLeftMargin(void) const { return m_iLeftMargin; }
getRightMargin(void)243 inline UT_sint32 getRightMargin(void) const { return m_iRightMargin; }
244 UT_sint32 getTopMargin(void) const;
245 UT_sint32 getBottomMargin(void) const;
getFooterMargin(void)246 inline UT_sint32 getFooterMargin(void) const { return m_iFooterMargin; }
getHeaderMargin(void)247 inline UT_sint32 getHeaderMargin(void) const { return m_iHeaderMargin; }
getSpaceAfter(void)248 inline UT_sint32 getSpaceAfter(void) const { return m_iSpaceAfter; }
getMaxSectionColumnHeight(void)249 inline UT_sint32 getMaxSectionColumnHeight(void) const { return m_iMaxSectionColumnHeight;}
250 UT_sint32 getColumnGap(void) const;
getFootnoteLineThickness(void)251 UT_uint32 getFootnoteLineThickness(void) const
252 { return m_iFootnoteLineThickness;}
getFootnoteYoff(void)253 UT_uint32 getFootnoteYoff(void) const
254 { return m_iFootnoteYoff;}
255
256 void completeBreakSection(void);
arePageNumbersRestarted(void)257 bool arePageNumbersRestarted (void) const { return m_bRestart;}
getRestartedPageNumber(void)258 UT_sint32 getRestartedPageNumber(void) const { return m_iRestartValue;}
259 UT_uint32 getNumColumns(void) const;
getColumnLineBetween(void)260 bool getColumnLineBetween(void) const {return m_bColumnLineBetween;}
261 UT_uint32 getColumnOrder(void) const;
262 void setPaperColor();
263 void deleteEmptyColumns(void);
264 virtual bool doclistener_changeStrux(const PX_ChangeRecord_StruxChange * pcrxc);
265 bool doclistener_deleteStrux(const PX_ChangeRecord_Strux * pcrx);
266
267 virtual bool bl_doclistener_insertFootnote(fl_ContainerLayout*, const PX_ChangeRecord_Strux * pcrx,
268 pf_Frag_Strux* sdh,
269 PL_ListenerId lid,
270 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
271 PL_ListenerId lid,
272 fl_ContainerLayout* sfhNew));
273
274
275 virtual bool bl_doclistener_insertAnnotation(fl_ContainerLayout*, const PX_ChangeRecord_Strux * pcrx,
276 pf_Frag_Strux* sdh,
277 PL_ListenerId lid,
278 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
279 PL_ListenerId lid,
280 fl_ContainerLayout* sfhNew));
281
282 void setHdrFtr(HdrFtrType iType, fl_HdrFtrSectionLayout* pHFSL);
283
284 fl_HdrFtrSectionLayout* getHeader(void) const;
285 fl_HdrFtrSectionLayout* getFooter(void) const;
286 fl_HdrFtrSectionLayout* getHeaderEven(void) const;
287 fl_HdrFtrSectionLayout* getFooterEven(void) const;
288 fl_HdrFtrSectionLayout* getHeaderFirst(void) const;
289 fl_HdrFtrSectionLayout* getFooterFirst(void) const;
290 fl_HdrFtrSectionLayout* getHeaderLast(void) const;
291 fl_HdrFtrSectionLayout* getFooterLast(void) const;
292
293 bool setHdrFtrHeightChange(bool bDoHdr, UT_sint32 newHeight);
294 static void _HdrFtrChangeCallback(UT_Worker * pWorker);
295
296 void addOwnedPage(fp_Page*);
297 void prependOwnedHeaderPage(fp_Page * p_Page);
298 void prependOwnedFooterPage(fp_Page * p_Page);
299 void deleteOwnedPage(fp_Page*, bool bReallyDeleteIT=true);
getFirstOwnedPage(void)300 fp_Page * getFirstOwnedPage(void) const {return m_pFirstOwnedPage;}
markForRebuild(void)301 void markForRebuild(void) { m_bNeedsRebuild = true;}
clearRebuild(void)302 void clearRebuild(void) { m_bNeedsRebuild = false;}
needsRebuild(void)303 bool needsRebuild(void) const { return m_bNeedsRebuild;}
304 void checkAndAdjustColumnGap(UT_sint32 iLayoutWidth);
markForReformat(void)305 void markForReformat(void) { m_bNeedsFormat = true;}
needsReFormat(void)306 bool needsReFormat(void) const { return m_bNeedsFormat;}
307 bool isThisPageValid(HdrFtrType hfType, fp_Page * pThisPage);
308 bool isFirstPageValid(void) const;
309 void getVecOfHdrFtrs(UT_GenericVector<fl_HdrFtrSectionLayout *> * vecHdrFtr);
310 void formatAllHdrFtr(void);
311 void doMarginChangeOnly(void);
312 void checkAndRemovePages(void);
313 void addValidPages(void);
314 void setNeedsSectionBreak(bool bSet, fp_Page * pPage );
needsSectionBreak(void)315 bool needsSectionBreak(void) const { return m_bNeedsSectionBreak;}
316 void setFirstEndnoteContainer(fp_EndnoteContainer * pECon);
317 void setLastEndnoteContainer(fp_EndnoteContainer * pECon);
318 fp_Container * getFirstEndnoteContainer(void);
319 fp_Container * getLastEndnoteContainer(void);
320 void deleteBrokenTablesFromHere(fl_ContainerLayout * pTL);
321 UT_sint32 getWidth(void);
322 UT_sint32 getActualColumnHeight(void);
323 UT_sint32 getActualColumnWidth(void);
isCollapsing(void)324 bool isCollapsing(void) const
325 { return m_bDoingCollapse;}
326 private:
327 virtual void _lookupProperties(const PP_AttrProp* pAP);
328 virtual void _lookupMarginProperties(const PP_AttrProp* pAP);
329 fb_ColumnBreaker m_ColumnBreaker;
330 /*
331 TODO support special case header/footer for first page of section
332 */
333 fl_HdrFtrSectionLayout* m_pHeaderSL;
334 fl_HdrFtrSectionLayout* m_pFooterSL;
335 fl_HdrFtrSectionLayout* m_pHeaderEvenSL;
336 fl_HdrFtrSectionLayout* m_pFooterEvenSL;
337 fl_HdrFtrSectionLayout* m_pHeaderFirstSL;
338 fl_HdrFtrSectionLayout* m_pFooterFirstSL;
339 fl_HdrFtrSectionLayout* m_pHeaderLastSL;
340 fl_HdrFtrSectionLayout* m_pFooterLastSL;
341
342 UT_uint32 m_iNumColumns;
343 UT_sint32 m_iColumnGap;
344 bool m_bColumnLineBetween;
345 UT_uint32 m_iColumnOrder;
346
347 UT_sint32 m_iSpaceAfter;
348 bool m_bRestart;
349 UT_sint32 m_iRestartValue;
350 UT_sint32 m_iLeftMargin;
351 double m_dLeftMarginUserUnits;
352 UT_sint32 m_iRightMargin;
353 double m_dRightMarginUserUnits;
354 UT_sint32 m_iTopMargin;
355 double m_dTopMarginUserUnits;
356 UT_sint32 m_iBottomMargin;
357 double m_dBottomMarginUserUnits;
358 UT_sint32 m_iFooterMargin;
359 double m_dFooterMarginUserUnits;
360 UT_sint32 m_iHeaderMargin;
361 double m_dHeaderMarginUserUnits;
362 UT_sint32 m_iMaxSectionColumnHeight;
363 double m_dMaxSectionColumnHeight;
364 UT_sint32 m_iFootnoteLineThickness;
365 UT_sint32 m_iFootnoteYoff;
366
367 //! First column in the section
368 fp_Column* m_pFirstColumn;
369 //! Last column in the section
370 fp_Column* m_pLastColumn;
371 fp_Page * m_pFirstOwnedPage;
372
373 bool m_bNeedsFormat;
374 bool m_bNeedsRebuild;
375 bool m_bNeedsSectionBreak;
376 fp_EndnoteContainer * m_pFirstEndnoteContainer;
377 fp_EndnoteContainer * m_pLastEndnoteContainer;
378 bool m_bDeleteingBrokenContainers;
379 UT_String m_sPaperColor;
380 UT_String m_sScreenColor;
381 UT_sint32 m_iNewHdrHeight;
382 UT_sint32 m_iNewFtrHeight;
383 UT_Worker * m_pHdrFtrChangeTimer;
384 UT_String m_sHdrFtrChangeProps;
385 bool m_bDoingCollapse;
386 };
387
388 class _PageHdrFtrShadowPair;
389
390
391 class ABI_EXPORT fl_HdrFtrSectionLayout : public fl_SectionLayout
392 {
393 friend class fl_DocListener;
394
395 public:
396 fl_HdrFtrSectionLayout(HdrFtrType iHFType, FL_DocLayout* pLayout, fl_DocSectionLayout* pDocSL, pf_Frag_Strux* sdh, PT_AttrPropIndex ap);
397 virtual ~fl_HdrFtrSectionLayout();
398
getDocSectionLayout(void)399 inline fl_DocSectionLayout* getDocSectionLayout(void) const { return m_pDocSL; }
getHFType(void)400 HdrFtrType getHFType(void) const { return m_iHFType; }
setDocSectionLayout(fl_DocSectionLayout * pDSL)401 void setDocSectionLayout(fl_DocSectionLayout * pDSL) { m_pDocSL = pDSL;}
setHdrFtr(HdrFtrType iHFType)402 void setHdrFtr(HdrFtrType iHFType) { m_iHFType = iHFType;}
403 virtual bool recalculateFields(UT_uint32 iUpdateCount);
404 bool doclistener_deleteStrux(const PX_ChangeRecord * pcr);
405 void checkAndAdjustCellSize(fl_ContainerLayout * pCL);
406 void localFormat(void);
407 virtual void markAllRunsDirty(void);
408 void checkAndRemovePages(void);
409 void addValidPages(void);
410 bool isPageHere( fp_Page *pPage);
411 bool isPointInHere(PT_DocPosition pos);
412 void collapseBlock(fl_ContainerLayout * pBlock);
413 virtual void format(void);
getSectionLayout(void)414 virtual fl_SectionLayout * getSectionLayout(void) const
415 { return static_cast<fl_SectionLayout *>(m_pDocSL);}
416 virtual void updateLayout(bool bDoFull);
417 void layout(void);
418 fl_ContainerLayout * findMatchingContainer( fl_ContainerLayout * pBL);
419 virtual void redrawUpdate(void);
420 virtual fp_Container* getNewContainer(fp_Container * pFirstContainer = NULL);
421 virtual fp_Container* getFirstContainer() const;
422 virtual fp_Container* getLastContainer() const;
423 fl_HdrFtrShadow * getFirstShadow(void);
424 fl_HdrFtrShadow * findShadow( fp_Page * pPage);
425 virtual bool doclistener_changeStrux(const PX_ChangeRecord_StruxChange * pcrxc);
426 void changeIntoHdrFtrSection( fl_DocSectionLayout * pSL);
427 void addPage(fp_Page*);
428 void deletePage(fp_Page*);
429 void clearScreen(void);
430 virtual void collapse(void);
431 bool bl_doclistener_insertCell(fl_ContainerLayout* pCell,
432 const PX_ChangeRecord_Strux * pcrx,
433 pf_Frag_Strux* sdh,
434 PL_ListenerId lid,
435 fl_TableLayout * pTL);
436 bool bl_doclistener_insertEndTable(fl_ContainerLayout* pTab,
437 const PX_ChangeRecord_Strux * pcrx,
438 pf_Frag_Strux* sdh,
439 PL_ListenerId lid);
440 virtual bool bl_doclistener_populateSpan(fl_ContainerLayout*, const PX_ChangeRecord_Span * pcrs, PT_BlockOffset blockOffset, UT_uint32 len);
441 virtual bool bl_doclistener_populateObject(fl_ContainerLayout*, PT_BlockOffset blockOffset, const PX_ChangeRecord_Object * pcro);
442 virtual bool bl_doclistener_insertSpan(fl_ContainerLayout*, const PX_ChangeRecord_Span * pcrs);
443 virtual bool bl_doclistener_deleteSpan(fl_ContainerLayout*, const PX_ChangeRecord_Span * pcrs);
444 virtual bool bl_doclistener_changeSpan(fl_ContainerLayout*, const PX_ChangeRecord_SpanChange * pcrsc);
445 virtual bool bl_doclistener_deleteStrux(fl_ContainerLayout*, const PX_ChangeRecord_Strux * pcrx);
446 bool bl_doclistener_deleteCellStrux(fl_ContainerLayout*, const PX_ChangeRecord_Strux * pcrx);
447 bool bl_doclistener_deleteTableStrux(fl_ContainerLayout*, const PX_ChangeRecord_Strux * pcrx);
448 virtual bool bl_doclistener_changeStrux(fl_ContainerLayout*, const PX_ChangeRecord_StruxChange * pcrxc);
449 virtual fl_SectionLayout * bl_doclistener_insertTable(fl_ContainerLayout*,
450 SectionType iType,
451 const PX_ChangeRecord_Strux * pcrx,
452 pf_Frag_Strux* sdh,
453 PL_ListenerId lid,
454 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
455 PL_ListenerId lid,
456 fl_ContainerLayout* sfhNew));
457 virtual fl_SectionLayout * bl_doclistener_insertTable(SectionType iType,
458 const PX_ChangeRecord_Strux * pcrx,
459 pf_Frag_Strux* sdh,
460 PL_ListenerId lid,
461 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
462 PL_ListenerId lid,
463 fl_ContainerLayout* sfhNew));
464 bool bl_doclistener_insertFirstBlock(fl_ContainerLayout* pCL, const PX_ChangeRecord_Strux * pcrx,pf_Frag_Strux* sdh,PL_ListenerId lid);
465 virtual bool bl_doclistener_insertBlock(fl_ContainerLayout*, const PX_ChangeRecord_Strux * pcrx,
466 pf_Frag_Strux* sdh,
467 PL_ListenerId lid,
468 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
469 PL_ListenerId lid,
470 fl_ContainerLayout* sfhNew));
471 virtual bool bl_doclistener_insertSection(fl_ContainerLayout*, const PX_ChangeRecord_Strux * pcrx,
472 pf_Frag_Strux* sdh,
473 PL_ListenerId lid,
474 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
475 PL_ListenerId lid,
476 fl_ContainerLayout* sfhNew));
477 virtual bool bl_doclistener_insertObject(fl_ContainerLayout*, const PX_ChangeRecord_Object * pcro);
478 virtual bool bl_doclistener_deleteObject(fl_ContainerLayout*, const PX_ChangeRecord_Object * pcro);
479 virtual bool bl_doclistener_changeObject(fl_ContainerLayout*, const PX_ChangeRecord_ObjectChange * pcroc);
480
481 virtual bool bl_doclistener_insertFmtMark(fl_ContainerLayout*, const PX_ChangeRecord_FmtMark * pcrfm);
482 virtual bool bl_doclistener_deleteFmtMark(fl_ContainerLayout*, const PX_ChangeRecord_FmtMark * pcrfm);
483 virtual bool bl_doclistener_changeFmtMark(fl_ContainerLayout*, const PX_ChangeRecord_FmtMarkChange * pcrfmc);
484
485 private:
486 UT_sint32 _findShadow(fp_Page * pPage);
487 virtual void _lookupProperties(const PP_AttrProp* pAP);
488 virtual void _lookupMarginProperties(const PP_AttrProp* pAP);
489 void _localCollapse(void);
490
491 fl_DocSectionLayout* m_pDocSL;
492 HdrFtrType m_iHFType;
493 UT_GenericVector<_PageHdrFtrShadowPair*> m_vecPages;
494 fp_Container * m_pHdrFtrContainer;
495 };
496
497
498 class ABI_EXPORT fl_HdrFtrShadow : public fl_SectionLayout
499 {
500 friend class fl_DocListener;
501
502 public:
503 fl_HdrFtrShadow(FL_DocLayout* pLayout, fp_Page* pPage, fl_HdrFtrSectionLayout* pDocSL, pf_Frag_Strux* sdh, PT_AttrPropIndex ap);
504 virtual ~fl_HdrFtrShadow();
505
getHdrFtrSectionLayout(void)506 virtual fl_HdrFtrSectionLayout* getHdrFtrSectionLayout(void) const { return m_pHdrFtrSL; }
507 fl_ContainerLayout * findMatchingContainer(fl_ContainerLayout * pBL);
508 fl_ContainerLayout * findBlockAtPosition(PT_DocPosition pos);
509 virtual void format(void);
510 virtual void updateLayout(bool bDoFull);
511 virtual void redrawUpdate(void);
getPage(void)512 fp_Page * getPage(void) const { return m_pPage;}
513 virtual fp_Container* getNewContainer(fp_Container *pFirstContainer = NULL);
514 virtual fp_Container* getFirstContainer() const;
515 virtual fp_Container* getLastContainer() const;
516 void layout(void);
517 void clearScreen(void);
518 virtual bool doclistener_changeStrux(const PX_ChangeRecord_StruxChange * pcrxc);
collapse(void)519 virtual void collapse(void) {}
markAllRunsDirty(void)520 virtual void markAllRunsDirty(void) {}
getSectionLayout(void)521 virtual fl_SectionLayout * getSectionLayout(void) const
522 { return getHdrFtrSectionLayout()->getSectionLayout(); }
523
524
525 private:
526 virtual void _lookupProperties(const PP_AttrProp* pAP);
527 virtual void _lookupMarginProperties(const PP_AttrProp* pAP);
528 void _createContainer(void);
529
530 fp_ShadowContainer* m_pContainer;
531 fp_Page* m_pPage;
532 fl_HdrFtrSectionLayout * m_pHdrFtrSL;
533 };
534
535 class ABI_EXPORT fl_ShadowListener : public PL_Listener
536 {
537 public:
538 fl_ShadowListener(fl_HdrFtrSectionLayout* pHFSL, fl_HdrFtrShadow* pShadow);
539 virtual ~fl_ShadowListener();
540
541 virtual bool populate(fl_ContainerLayout* sfh,
542 const PX_ChangeRecord * pcr);
543
544 virtual bool populateStrux(pf_Frag_Strux* sdh,
545 const PX_ChangeRecord * pcr,
546 fl_ContainerLayout* * psfh);
547
548 virtual bool change(fl_ContainerLayout* sfh,
549 const PX_ChangeRecord * pcr);
550
551 virtual bool insertStrux(fl_ContainerLayout* sfh,
552 const PX_ChangeRecord * pcr,
553 pf_Frag_Strux* sdh,
554 PL_ListenerId lid,
555 void (* pfnBindHandles)(pf_Frag_Strux* sdhNew,
556 PL_ListenerId lid,
557 fl_ContainerLayout* sfhNew));
558
559 virtual bool signal(UT_uint32 iSignal);
560
561 private:
562 PD_Document* m_pDoc;
563 fl_HdrFtrShadow* m_pShadow;
564 bool m_bListening;
565 fl_ContainerLayout* m_pCurrentBL;
566 fl_HdrFtrSectionLayout * m_pHFSL;
567 fl_TableLayout * m_pCurrentTL;
568 fl_CellLayout * m_pCurrentCell;
569 };
570
571 #endif /* SECTIONLAYOUT_H */
572