1 /* AbiWord
2  * Copyright (C) 1998 AbiSource, Inc.
3  * Copyright (C) 2002 Martin Sevior
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18  * 02110-1301 USA.
19  */
20 
21 #ifndef CONTAINERLAYOUT_H
22 #define CONTAINERLAYOUT_H
23 
24 #ifdef FMT_TEST
25 #include <stdio.h>
26 #endif
27 
28 typedef enum _fl_ContainerType
29 {
30     FL_CONTAINER_BLOCK,
31     FL_CONTAINER_DOCSECTION,
32 	FL_CONTAINER_HDRFTR,
33 	FL_CONTAINER_SHADOW,
34 	FL_CONTAINER_FOOTNOTE,
35 	FL_CONTAINER_ENDNOTE,
36 	FL_CONTAINER_MARGINNOTE,
37 	FL_CONTAINER_TABLE,
38 	FL_CONTAINER_CELL,
39 	FL_CONTAINER_FRAME,
40         FL_CONTAINER_TOC,
41 	FL_CONTAINER_ANNOTATION,
42 	FL_CONTAINER_RDFANCHOR
43 } fl_ContainerType;
44 
45 // this enum is used here and by the run classes
46 // I had to move it here from fp_Run to avoid circular dependency
47 typedef enum {FP_VISIBLE = 0,
48 			  FP_HIDDEN_TEXT,
49 			  FP_HIDDEN_REVISION,
50 			  FP_HIDDEN_REVISION_AND_TEXT,
51 			  FP_HIDDEN_FOLDED
52 } FPVisibility;
53 
54 
55 #include "ut_types.h"
56 #include "ut_vector.h"
57 #include "pt_Types.h"
58 #include "fl_Layout.h"
59 #include "ut_debugmsg.h"
60 #include "ut_misc.h" // for UT_RGBColor
61 #include "gr_Image.h"
62 #include "gr_Graphics.h"
63 
64 class FL_DocLayout;
65 class PD_Document;
66 class PP_AttrProp;
67 class fl_Layout;
68 class fl_HdrFtrSectionLayout;
69 class fl_SectionLayout;
70 class fp_ContainerObject;
71 class fp_Container;
72 class fp_Run;
73 class fl_DocSectionLayout;
74 class UT_GrowBuf;
75 class fl_FrameLayout;
76 class fp_FrameContainer;
77 class fl_BlockLayout;
78 class pf_Frag_Strux;
79 
80 class ABI_EXPORT fl_ContainerLayout : public fl_Layout
81 {
82 	friend class fl_BlockLayout;
83 public:
84 	fl_ContainerLayout(fl_ContainerLayout* pLayout, pf_Frag_Strux* sdh, PT_AttrPropIndex ap, PTStruxType iStrux,fl_ContainerType iType);
85 	virtual ~fl_ContainerLayout();
86 
getContainerType(void)87 	fl_ContainerType    getContainerType(void) const { return m_iConType; }
88 	const char *        getContainerString(void);
89 	const char *                getAttribute(const char * pKey) const;
90 	virtual fp_Container*		getFirstContainer() const;
91 	virtual fp_Container*		getLastContainer() const;
92 	virtual void                setFirstContainer(fp_Container * pCon);
93 	virtual void                setLastContainer(fp_Container * pCon);
94 
95 	virtual bool		recalculateFields(UT_uint32 iUpdateCount) =0;
96 
97 	virtual fp_Container*		getNewContainer(fp_Container * pFirstContainer = NULL) = 0;
98 	virtual FL_DocLayout *      getDocLayout(void) const;
99 	UT_sint32           getLevelInList(void);
100 	virtual void		format(void) = 0;
101 	virtual void        appendTextToBuf(UT_GrowBuf & buf) const;
102 	virtual void		updateLayout(bool bDoAll) = 0;
103 	virtual void        markAllRunsDirty(void) =0;
104 	virtual void        collapse(void) = 0;
105 	virtual void		redrawUpdate(void) = 0;
106 	virtual void        setNeedsReformat(fl_ContainerLayout * pCL, UT_uint32 offset = 0) = 0;
107 	virtual void        setNeedsRedraw(void) = 0;
108 	virtual bool        isCollapsed(void) const = 0;
109 	virtual bool        needsReformat(void) const = 0;
110 	virtual bool        needsRedraw(void) const = 0;
111 	virtual fl_DocSectionLayout * getDocSectionLayout(void) const;
112 	virtual fl_SectionLayout * getSectionLayout() const = 0;
113 	virtual fl_HdrFtrSectionLayout * getHdrFtrSectionLayout(void) const;
114 	void				setContainingLayout(fl_ContainerLayout*);
115 	fl_ContainerLayout * myContainingLayout(void) const;
116 	fl_HdrFtrSectionLayout *   getHdrFtrLayout(void);
117 	void				setPrev(fl_ContainerLayout*);
118 	void				setNext(fl_ContainerLayout*);
119 	fl_ContainerLayout * getPrev(void) const;
120 	fl_ContainerLayout * getNext(void) const;
121 	fl_ContainerLayout * getFirstLayout(void) const;
122 	fl_ContainerLayout * getLastLayout(void) const;
123 	void                 setLastLayout(fl_ContainerLayout *pL);
124 	void                 setFirstLayout(fl_ContainerLayout *pL);
125 	fl_ContainerLayout * append(pf_Frag_Strux* sdh, PT_AttrPropIndex indexAP,fl_ContainerType iType);
126     void                 add(fl_ContainerLayout* pL);
127 	fl_ContainerLayout * insert(pf_Frag_Strux* sdh, fl_ContainerLayout * pPrev, PT_AttrPropIndex indexAP,fl_ContainerType iType);
128 	void                 remove(fl_ContainerLayout * pL);
129 	virtual fp_Run *        getFirstRun(void) const;
130 	virtual PT_DocPosition  getPosition(bool bActualBlockPosition = false) const;
131 	bool                    canContainPoint() const;
isHidden()132 	FPVisibility            isHidden() const {return m_eHidden;}
setVisibility(FPVisibility eVis)133 	void                    setVisibility(FPVisibility eVis) {m_eHidden = eVis;}
134 	bool                    isOnScreen() const;
135 
136 // Frames stuff
137 	UT_sint32               getNumFrames(void) const;
138 	fl_FrameLayout *        getNthFrameLayout(UT_sint32 i) const;
139 	fp_FrameContainer *     getNthFrameContainer(UT_sint32 i) const;
140 	void                    addFrame(fl_FrameLayout * pFrame);
141 	bool                    removeFrame(fl_FrameLayout * pFrame);
142 
143 // For Folded Text
144 
145 	UT_sint32               getFoldedLevel(void);
146 	UT_uint32               getFoldedID(void);
147     void                    lookupFoldedLevel(void);
148 
149 	void                    lookupProperties(void);
150 	void                    lookupMarginProperties(void);
151 
152 	fl_BlockLayout*         getNextBlockInDocument(void) const;
153 	fl_BlockLayout*         getPrevBlockInDocument(void) const;
154 
155 	FPVisibility            getAP(const PP_AttrProp *& pAP)const;
156 	void                    getSpanAP(UT_uint32 blockPos, bool bLeft, const PP_AttrProp * &pSpanAP) const;
157 
158  // Embedded structures
159 	bool                    containsFootnoteLayouts(void) const;
160 	bool                    containsAnnotationLayouts(void) const;
161 
162 #ifdef FMT_TEST
163 	virtual void		__dump(FILE * fp) const;
164 #endif
165 protected:
166 	// need this to be protected, so fl_BlockLayout can call it
167 	void	                _insertIntoList(fl_ContainerLayout * pL);
168 
169 private:
170 	bool                    _getPropertiesAP(const PP_AttrProp *& pAP);
171 	virtual void            _lookupProperties(const PP_AttrProp* pAP) = 0;
172 
173 	// This function must be overriden by any derrived class that can endup positioned
174 	// outside of the normal printable area on page
_lookupMarginProperties(const PP_AttrProp *)175 	virtual void            _lookupMarginProperties(const PP_AttrProp* /*pAP*/){}
176 
_canContainPoint()177 	virtual bool            _canContainPoint() const {return true;}
178 	void	                _insertFirst(fl_ContainerLayout * pL);
179 
180 	fl_ContainerType	        m_iConType;
181 	fl_ContainerLayout*		    m_pMyLayout;
182 
183 	fl_ContainerLayout*	        m_pPrev;
184 	fl_ContainerLayout*	        m_pNext;
185 
186 	fl_ContainerLayout*	        m_pFirstL;
187 	fl_ContainerLayout*	        m_pLastL;
188 	fp_Container *              m_pFirstContainer;
189 	fp_Container *              m_pLastContainer;
190 	FPVisibility                m_eHidden;
191 	UT_GenericVector<fl_FrameLayout *> m_vecFrames;
192     UT_sint32                   m_iFoldedLevel;
193     UT_uint32                   m_iFoldedID;
194 };
195 
196 #endif /* CONTAINERLAYOUT_H */
197 
198 
199 
200 
201