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