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