00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef DOCLAYOUT_H
00021 #define DOCLAYOUT_H
00022
00023 #ifdef HAVE_CONFIG_H
00024 #include "config.h"
00025 #endif
00026
00027 #include <stdio.h>
00028 #include "ut_types.h"
00029 #include "ut_vector.h"
00030 #include "ut_hash.h"
00031 #include "pt_Types.h"
00032 #include "fp_PageSize.h"
00033 #include "fl_Layout.h"
00034 #include "ut_units.h"
00035 #include "xav_Listener.h"
00036
00037
00038 typedef enum _FootnoteType
00039 {
00040 FOOTNOTE_TYPE_NUMERIC = 0,
00041 FOOTNOTE_TYPE_NUMERIC_SQUARE_BRACKETS,
00042 FOOTNOTE_TYPE_NUMERIC_PAREN,
00043 FOOTNOTE_TYPE_NUMERIC_OPEN_PAREN,
00044 FOOTNOTE_TYPE_LOWER,
00045 FOOTNOTE_TYPE_LOWER_PAREN,
00046 FOOTNOTE_TYPE_LOWER_OPEN_PAREN,
00047 FOOTNOTE_TYPE_UPPER,
00048 FOOTNOTE_TYPE_UPPER_PAREN,
00049 FOOTNOTE_TYPE_UPPER_OPEN_PAREN,
00050 FOOTNOTE_TYPE_LOWER_ROMAN,
00051 FOOTNOTE_TYPE_LOWER_ROMAN_PAREN,
00052 FOOTNOTE_TYPE_UPPER_ROMAN,
00053 FOOTNOTE_TYPE_UPPER_ROMAN_PAREN,
00054 _FOOTNOTE_TYPE_INVALID = 10000
00055 } FootnoteType;
00056
00058 typedef struct {
00059 FootnoteType n;
00060 const char * label;
00061 const char * prop;
00062 } FootnoteTypeDesc;
00063
00064 extern const FootnoteTypeDesc s_FootnoteTypeDesc[];
00065
00066 class FV_View;
00067 class fl_DocListener;
00068 class fl_SectionLayout;
00069 class fl_DocSectionLayout;
00070 class fl_BlockLayout;
00071 class fl_TOCLayout;
00072 class fp_Page;
00073 class PD_Document;
00074 class PP_AttrProp;
00075 class GR_Graphics;
00076 class GR_Font;
00077 class UT_Timer;
00078 class UT_Worker;
00079 class fl_PartOfBlock;
00080 class fl_AutoNum;
00081 class PX_ChangeRecord_StruxChange;
00082 class fl_FootnoteLayout;
00083 class fl_AnnotationLayout;
00084 class fl_EndnoteLayout;
00085 class fp_EndnoteContainer;
00086 class GR_EmbedManager;
00087 class fl_FrameLayout;
00088 class fp_FrameContainer;
00089 class fp_Container;
00090
00091
00092
00093 #define fl_PAGEVIEW_PAGE_SEP m_pG->tlu(20) // must be <= MARGIN_Y
00094 #define fl_PAGEVIEW_MARGIN_X m_pG->tlu(25)
00095 #define fl_PAGEVIEW_MARGIN_Y m_pG->tlu(25)
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105 class ABI_EXPORT FL_DocLayout
00106 {
00107 friend class fl_DocListener;
00108 friend class fl_BlockLayout;
00109 public:
00110 FL_DocLayout(PD_Document* doc, GR_Graphics* pG);
00111 ~FL_DocLayout();
00112
00113 void fillLayouts(void);
00114 bool loadPendingObjects(void);
00115 bool AnchoredObjectHelper(double x, double y, UT_sint32 iPage, UT_UTF8String & allProps, PT_DocPosition & pos, fp_Page *& pPage);
00116 void setView(FV_View*);
00117
00118 inline FV_View * getView(void) const { return m_pView; }
00119 inline GR_Graphics* getGraphics(void) const { return m_pG; }
00120 void setGraphics(GR_Graphics * pG);
00121 UT_uint32 getGraphicTick(void) const { return m_iGraphicTick;}
00122 void incrementGraphicTick(void) { m_iGraphicTick++;}
00123 inline PD_Document* getDocument(void) const { return m_pDoc; }
00124 #ifdef ENABLE_SPELL
00125 inline const fl_BlockLayout* getPendingBlockForSpell(void) const { return m_pPendingBlockForSpell; };
00126 inline fl_PartOfBlock* getPendingWordForSpell(void) const { return m_pPendingWordForSpell; };
00127 #endif
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138 inline fl_BlockLayout* getPendingBlockForSmartQuote(void) const { return m_pPendingBlockForSmartQuote; };
00139 inline UT_uint32 getOffsetForSmartQuote(void) const { return m_uOffsetForSmartQuote; };
00140 void setPendingSmartQuote(fl_BlockLayout *block, UT_uint32 offset);
00141 void considerSmartQuoteCandidateAt(fl_BlockLayout *block, UT_uint32 offset);
00142 inline void considerPendingSmartQuoteCandidate() {considerSmartQuoteCandidateAt(m_pPendingBlockForSmartQuote, m_uOffsetForSmartQuote); }
00143
00144 void notifyBlockIsBeingDeleted(fl_BlockLayout *pBlock);
00145 void setSkipUpdates(UT_uint32 numSkips) {m_iSkipUpdates = numSkips;}
00146 UT_uint32 getSkipUpdates(void) { return m_iSkipUpdates;}
00147 void setNeedsRedraw(void);
00148 UT_sint32 getHeight() const;
00149 UT_sint32 getWidth() const;
00150 void refreshRunProperties(void);
00151 const GR_Font* findFont(const PP_AttrProp * pSpanAP,
00152 const PP_AttrProp * pBlockAP,
00153 const PP_AttrProp * pSectionAP,
00154 bool isField = false
00155 ) const;
00156
00157 const GR_Font* findFont(const PP_AttrProp * pSpanAP,
00158 const PP_AttrProp * pBlockAP,
00159 const PP_AttrProp * pSectionAP,
00160 GR_Graphics * pG,
00161 bool isField = false
00162 ) const;
00163
00164 void changeDocSections(const PX_ChangeRecord_StruxChange * pcrx, fl_DocSectionLayout * pDSL);
00165 fp_Page* addNewPage(fl_DocSectionLayout* pOwner, bool bNoUpdate=false);
00166 fp_Page* getFirstPage() const;
00167 fp_Page* getLastPage() const;
00168 fp_Page* getNthPage(int n) const;
00169 UT_sint32 countPages() const;
00170 UT_sint32 findPage(fp_Page * pPage) const;
00171 void setFramePageNumbers(UT_sint32 iStartPage);
00172 fl_FrameLayout* relocateFrame(fl_FrameLayout * pFL, fl_BlockLayout * newBlock,
00173 const gchar** attributes = NULL, const gchar **properties = NULL);
00174 void clearAllCountWraps(void);
00175 bool addFramesToBeInserted(fp_FrameContainer * pFrame);
00176 bool removeFramesToBeInserted(fp_FrameContainer * pFrame);
00177 fp_FrameContainer * findFramesToBeInserted(fp_Page * pPage);
00178
00179 UT_sint32 getPercentFilled(void) const
00180 { return m_iFilled;}
00181 void setPercentFilled(UT_sint32 iFill)
00182 { m_iFilled = iFill;}
00183 void setLayoutIsFilling(bool bisFill) { m_bisLayoutFilling = bisFill;}
00184 bool isLayoutFilling(void) const { return m_bisLayoutFilling;}
00185 fl_BlockLayout* findBlockAtPosition(PT_DocPosition pos, bool bLookOnlyBefore = false) const;
00186 fl_BlockLayout* findBlockAtPositionReverse(PT_DocPosition pos) const;
00187 void deletePage(fp_Page* pPage, bool bDontNotify);
00188
00189 void formatAll();
00190 void updateLayout();
00191 void updateOnViewModeChange();
00192 void rebuildFromHere(fl_DocSectionLayout * pDSL);
00193 void updateColor();
00194
00195 #ifdef ENABLE_SPELL
00196 bool isPendingWordForSpell(void) const;
00197 bool touchesPendingWordForSpell(fl_BlockLayout *pBlock,
00198 UT_sint32 iOffset,
00199 UT_sint32 chg) const;
00200 void setPendingWordForSpell(const fl_BlockLayout *pBlock, fl_PartOfBlock* pWord);
00201 bool checkPendingWordForSpell(void);
00202 void dequeueAll(void);
00203 void queueAll(UT_uint32 iReason);
00204 void queueBlockForBackgroundCheck(UT_uint32 reason, fl_BlockLayout *pBlock, bool bHead=false);
00205 bool dequeueBlockForBackgroundCheck(fl_BlockLayout *pBlock);
00206
00207 fl_BlockLayout *spellQueueHead(void) const
00208 {
00209 return m_toSpellCheckHead;
00210 }
00211 void setSpellQueueHead(fl_BlockLayout *h)
00212 {
00213 m_toSpellCheckHead = h;
00214 }
00215 fl_BlockLayout *spellQueueTail(void) const
00216 {
00217 return m_toSpellCheckTail;
00218 }
00219 void setSpellQueueTail(fl_BlockLayout *t)
00220 {
00221 m_toSpellCheckTail = t;
00222 }
00223 #endif
00224 void addSection(fl_DocSectionLayout*);
00225 void removeSection(fl_DocSectionLayout*);
00226 void insertSectionAfter(fl_DocSectionLayout* pAfter, fl_DocSectionLayout* pNewSL);
00227 void addHdrFtrSection(fl_SectionLayout* pHdrFtrSL);
00228 void removeHdrFtrSection(fl_SectionLayout* pHdrFtrSL);
00229
00230 inline fl_DocSectionLayout* getFirstSection(void) const { return m_pFirstSection; }
00231 inline fl_DocSectionLayout* getLastSection(void) const { return m_pLastSection; }
00232
00233 fl_DocSectionLayout* findSectionForHdrFtr(const char* pszHdrFtrID) const;
00234 void deleteEmptyColumnsAndPages(void);
00235 void deleteEmptyPages( bool bDontNotify = false);
00236 GR_EmbedManager * getEmbedManager(const char * szEmbedType);
00237
00238
00239
00240
00241
00242 UT_uint32 countFootnotes(void) const;
00243 void addFootnote(fl_FootnoteLayout *);
00244 void removeFootnote(fl_FootnoteLayout *);
00245 fl_FootnoteLayout * getNthFootnote(UT_sint32 i) const;
00246 UT_sint32 getFootnoteVal(UT_uint32 footpid) const;
00247 fl_FootnoteLayout * findFootnoteLayout(UT_uint32 footpid) const;
00248 FootnoteType getFootnoteType(void) const;
00249 void getStringFromFootnoteVal(UT_String & sVal, UT_sint32 iVal, FootnoteType iFootType) const;
00250
00251 UT_sint32 getInitialFootVal(void) const
00252 { return m_iFootnoteVal;}
00253 bool getRestartFootOnSection(void) const
00254 { return m_bRestartFootSection;}
00255 bool getRestartFootOnPage(void) const
00256 { return m_bRestartFootPage;}
00257 FootnoteType FootnoteTypeFromString( const gchar * pszStr);
00258
00259 void insertEndnoteContainer(fp_EndnoteContainer * pECon);
00260 void removeEndnoteContainer(fp_EndnoteContainer * pECon);
00261 fl_DocSectionLayout * getDocSecForEndnote(fp_EndnoteContainer * pECon ) const;
00262 UT_uint32 countEndnotes(void) const;
00263 void addEndnote(fl_EndnoteLayout *);
00264 void removeEndnote(fl_EndnoteLayout *);
00265 fl_EndnoteLayout * getNthEndnote(UT_sint32 i) const;
00266 UT_sint32 getEndnoteVal(UT_uint32 endpid) const;
00267 fl_EndnoteLayout * findEndnoteLayout(UT_uint32 endpid) const;
00268
00269 FootnoteType getEndnoteType(void) const
00270 { return m_EndnoteType; }
00271 UT_sint32 getInitialEndVal(void) const
00272 { return m_iEndnoteVal;}
00273 bool getRestartEndOnSection(void) const
00274 { return m_bRestartEndSection;}
00275 bool getPlaceEndAtDocEnd(void) const
00276 { return m_bPlaceAtDocEnd;}
00277 bool getPlaceEndAtSecEnd(void) const
00278 { return m_bPlaceAtSecEnd;}
00279
00280
00281
00282
00283
00284 UT_uint32 countAnnotations(void) const;
00285 void addAnnotation(fl_AnnotationLayout * pAL);
00286 void removeAnnotation(fl_AnnotationLayout * pAL);
00287 fl_AnnotationLayout * getNthAnnotation(UT_sint32 i) const;
00288 UT_sint32 getAnnotationVal(UT_uint32 footpid) const;
00289 fl_AnnotationLayout * findAnnotationLayout(UT_uint32 footpid) const;
00290 bool displayAnnotations(void) const;
00291 void setDisplayAnnotations(bool bDisplayAnnotations);
00292 bool collapseAnnotations(void);
00293
00294
00295
00296 bool displayRDFAnchors(void) const;
00297 void setDisplayRDFAnchors(bool v);
00298
00299
00300
00301
00302 UT_sint32 getNumTOCs(void) const;
00303 fl_TOCLayout * getNthTOC(UT_sint32 i) const;
00304 bool addOrRemoveBlockFromTOC(fl_BlockLayout * pBlock);
00305 bool removeBlockFromTOC(fl_BlockLayout * pBlock);
00306 bool isBlockInTOC(fl_BlockLayout * pBlock) const;
00307 bool getMatchingBlocksFromTOCs(fl_BlockLayout * pBlock, UT_GenericVector<fl_BlockLayout*>* pVecBlock) const;
00308 bool addTOC(fl_TOCLayout * pTOC);
00309 bool removeTOC(fl_TOCLayout * pTOC);
00310 void recalculateTOCFields(void);
00311 bool updateTOCsOnBookmarkChange(const gchar * pBookmark);
00312
00313 #ifdef ENABLE_SPELL
00314 bool getAutoSpellCheck(void) const { return (hasBackgroundCheckReason(bgcrSpelling)); }
00315 bool getAutoGrammarCheck(void) const { return (hasBackgroundCheckReason(bgcrGrammar)); }
00316 bool getSpellCheckCaps(void) const { return m_bSpellCheckCaps; }
00317 bool getSpellCheckNumbers(void) const { return m_bSpellCheckNumbers; }
00318 bool getSpellCheckInternet(void) const { return m_bSpellCheckInternet; }
00319 void recheckIgnoredWords();
00320 #endif
00321
00322 bool getSmartQuotes(void) const { return (hasBackgroundCheckReason(bgcrSmartQuotes)); }
00323
00324
00325 inline void addBackgroundCheckReason(UT_uint32 reason) {m_uDocBackgroundCheckReasons |= reason;}
00326 inline void removeBackgroundCheckReason(UT_uint32 reason) {m_uDocBackgroundCheckReasons &= ~reason;}
00327 inline bool hasBackgroundCheckReason(UT_uint32 reason) const {return ((m_uDocBackgroundCheckReasons & reason) ? true : false);}
00328 inline UT_uint32 getBackgroundCheckReasons() const {return (m_uDocBackgroundCheckReasons);}
00329
00330 #ifdef ENABLE_SPELL
00331 fl_BlockLayout * getPendingBlockForGrammar(void) const
00332 {
00333 return m_PendingBlockForGrammar;
00334 }
00335 void setPendingBlockForGrammar(fl_BlockLayout * pBL);
00336 #endif
00337 void triggerPendingBlock(fl_BlockLayout * pBL);
00338
00339
00340
00341 enum backgroundCheckReason
00342 {
00343 bgcrNone = 0,
00344 bgcrDebugFlash = (1 << 0),
00345 bgcrSpelling = (1 << 1),
00346 bgcrSmartQuotes = (1 << 2),
00347 bgcrGrammar = (1 << 3)
00348 };
00349
00350
00351 inline fl_AutoNum * getListByID(UT_uint32 id) const;
00352 inline fl_AutoNum * getNthList(UT_uint32 i) const;
00353 inline UT_uint32 getListsCount(void) const;
00354 inline void addList(fl_AutoNum * pAutoNum);
00355 bool isLayoutDeleting(void) const {return m_bDeletingLayout;}
00356 UT_uint32 getRedrawCount() const {return m_iRedrawCount;}
00357
00358
00359 void updatePropsNoRebuild(void);
00360 void updatePropsRebuild(void);
00361 PT_DocPosition getDocSize(void) const
00362 { return m_iDocSize;}
00363 UT_uint32 getLID(void) const
00364 { return m_lid;}
00365 void notifyListeners(AV_ChangeMask mask);
00366 void setQuickPrint(GR_Graphics * pGraphics);
00367 GR_Graphics * getQuickPrintGraphics(void) const;
00368 bool isQuickPrint(void) const
00369 { return m_bIsQuickPrint;}
00370 GR_EmbedManager * getQuickPrintEmbedManager(const char * szEmbedType);
00371 fp_PageSize m_docViewPageSize;
00372 bool setDocViewPageSize(const PP_AttrProp * pAP);
00373 void setSaveContainerPointer( fp_Container * pContainer);
00374 void setRebuiltBlock(fl_BlockLayout *pBlock);
00375 fl_BlockLayout* getRebuiltBlock(void) const;
00376 fp_Container * getSavedContainerPointer(void) const;
00377
00378 #ifdef FMT_TEST
00379
00380 static FL_DocLayout* m_pDocLayout;
00381
00382 void __dump(FILE * fp) const;
00383 #endif
00384
00385 protected:
00386 static void _backgroundCheck(UT_Worker * pTimer);
00387 #ifdef ENABLE_SPELL
00388 void _toggleAutoSpell(bool bSpell);
00389 void _toggleAutoGrammar(bool bGrammar);
00390 #endif
00391 void _toggleAutoSmartQuotes(bool bSQ);
00392
00393 static void _prefsListener(class XAP_Prefs *,
00394 UT_StringPtrMap *, void *);
00395
00396
00397 static void _redrawUpdate(UT_Worker * pTimer);
00398
00399 private:
00400 void _lookupProperties(void);
00401 GR_Graphics* m_pG;
00402 PD_Document* m_pDoc;
00403 FV_View* m_pView;
00404 fl_DocListener* m_pDocListener;
00405 PL_ListenerId m_lid;
00406
00407 UT_GenericVector<fp_Page *> m_vecPages;
00408 fl_DocSectionLayout*m_pFirstSection;
00409 fl_DocSectionLayout*m_pLastSection;
00410
00411
00412
00413 fl_BlockLayout *m_toSpellCheckHead;
00414 fl_BlockLayout *m_toSpellCheckTail;
00415 const fl_BlockLayout* m_pPendingBlockForSpell;
00416 fl_PartOfBlock* m_pPendingWordForSpell;
00417 bool m_bSpellCheckCaps;
00418 bool m_bSpellCheckNumbers;
00419 bool m_bSpellCheckInternet;
00420 bool m_bAutoSpellCheck;
00421 UT_uint32 m_uDocBackgroundCheckReasons;
00422 bool m_bStopSpellChecking;
00423 bool m_bImSpellCheckingNow;
00424
00425 fl_BlockLayout* m_pPendingBlockForSmartQuote;
00426 UT_uint32 m_uOffsetForSmartQuote;
00427 char m_szCurrentTransparentColor[10];
00428 UT_Worker* m_pBackgroundCheckTimer;
00429
00430 XAP_Prefs * m_pPrefs;
00431
00432 UT_Timer* m_pRedrawUpdateTimer;
00433 UT_uint32 m_iSkipUpdates;
00434 bool m_bDeletingLayout;
00435 bool m_bisLayoutFilling;
00436 UT_uint32 m_iRedrawCount;
00437 UT_GenericVector<fl_FootnoteLayout *> m_vecFootnotes;
00438 UT_GenericVector<fl_AnnotationLayout *> m_vecAnnotations;
00439 UT_GenericVector<fl_EndnoteLayout *> m_vecEndnotes;
00440 FootnoteType m_FootnoteType;
00441 UT_sint32 m_iFootnoteVal;
00442 bool m_bRestartFootSection;
00443 bool m_bRestartFootPage;
00444 UT_sint32 m_iEndnoteVal;
00445 FootnoteType m_EndnoteType;
00446 bool m_bRestartEndSection;
00447 bool m_bPlaceAtDocEnd;
00448 bool m_bPlaceAtSecEnd;
00449 UT_uint32 m_iGraphicTick;
00450 UT_GenericVector<fl_TOCLayout *> m_vecTOC;
00451 PT_DocPosition m_iDocSize;
00452 UT_sint32 m_iFilled;
00453 bool m_bSpellCheckInProgress;
00454 std::map<std::string, GR_EmbedManager *> m_mapEmbedManager;
00455 bool m_bAutoGrammarCheck;
00456 fl_BlockLayout * m_PendingBlockForGrammar;
00457 UT_sint32 m_iGrammarCount;
00458 bool m_bFinishedInitialCheck;
00459 PT_DocPosition m_iPrevPos;
00460 std::map<std::string, GR_EmbedManager *> m_mapQuickPrintEmbedManager;
00461 GR_Graphics * m_pQuickPrintGraphics;
00462 bool m_bIsQuickPrint;
00463 bool m_bDisplayAnnotations;
00464 bool m_bDisplayRDFAnchors;
00465 fp_Container * m_pSavedContainer;
00466 fl_BlockLayout * m_pRebuiltBlockLayout;
00467 UT_GenericVector<fp_FrameContainer *> m_vecFramesToBeInserted;
00468 };
00469
00470 #endif
00471
00472