/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "viewimp.hxx" #include "IDocumentTimerAccess.hxx" #include "IDocumentLayoutAccess.hxx" #include "IDocumentFieldsAccess.hxx" #include "IDocumentSettingAccess.hxx" #include "IDocumentDrawModelAccess.hxx" #include #include SwLayVout *SwRootFrm::pVout = 0; sal_Bool SwRootFrm::bInPaint = sal_False; sal_Bool SwRootFrm::bNoVirDev = sal_False; SwCache *SwFrm::pCache = 0; long FirstMinusSecond( long nFirst, long nSecond ) { return nFirst - nSecond; } long SecondMinusFirst( long nFirst, long nSecond ) { return nSecond - nFirst; } long SwIncrement( long nA, long nAdd ) { return nA + nAdd; } long SwDecrement( long nA, long nSub ) { return nA - nSub; } static SwRectFnCollection aHorizontal = { /* fnRectGet */ &SwRect::_Top, &SwRect::_Bottom, &SwRect::_Left, &SwRect::_Right, &SwRect::_Width, &SwRect::_Height, &SwRect::TopLeft, &SwRect::_Size, /* fnRectSet */ &SwRect::_Top, &SwRect::_Bottom, &SwRect::_Left, &SwRect::_Right, &SwRect::_Width, &SwRect::_Height, &SwRect::SubTop, &SwRect::AddBottom, &SwRect::SubLeft, &SwRect::AddRight, &SwRect::AddWidth, &SwRect::AddHeight, &SwRect::SetPosX, &SwRect::SetPosY, &SwFrm::GetTopMargin, &SwFrm::GetBottomMargin, &SwFrm::GetLeftMargin, &SwFrm::GetRightMargin, &SwFrm::SetLeftRightMargins, &SwFrm::SetTopBottomMargins, &SwFrm::GetPrtTop, &SwFrm::GetPrtBottom, &SwFrm::GetPrtLeft, &SwFrm::GetPrtRight, &SwRect::GetTopDistance, &SwRect::GetBottomDistance, &SwRect::GetLeftDistance, &SwRect::GetRightDistance, &SwFrm::SetMaxBottom, &SwRect::OverStepBottom, &SwRect::SetUpperLeftCorner, &SwFrm::MakeBelowPos, &FirstMinusSecond, &FirstMinusSecond, &SwIncrement, &SwIncrement, &SwRect::SetLeftAndWidth, &SwRect::SetTopAndHeight }; static SwRectFnCollection aVertical = { /* fnRectGet */ &SwRect::_Right, &SwRect::_Left, &SwRect::_Top, &SwRect::_Bottom, &SwRect::_Height, &SwRect::_Width, &SwRect::TopRight, &SwRect::SwappedSize, /* fnRectSet */ &SwRect::_Right, &SwRect::_Left, &SwRect::_Top, &SwRect::_Bottom, &SwRect::_Height, &SwRect::_Width, &SwRect::AddRight, &SwRect::SubLeft, &SwRect::SubTop, &SwRect::AddBottom, &SwRect::AddHeight, &SwRect::AddWidth, &SwRect::SetPosY, &SwRect::SetPosX, &SwFrm::GetRightMargin, &SwFrm::GetLeftMargin, &SwFrm::GetTopMargin, &SwFrm::GetBottomMargin, &SwFrm::SetTopBottomMargins, &SwFrm::SetRightLeftMargins, &SwFrm::GetPrtRight, &SwFrm::GetPrtLeft, &SwFrm::GetPrtTop, &SwFrm::GetPrtBottom, &SwRect::GetRightDistance, &SwRect::GetLeftDistance, &SwRect::GetTopDistance, &SwRect::GetBottomDistance, &SwFrm::SetMinLeft, &SwRect::OverStepLeft, &SwRect::SetUpperRightCorner, &SwFrm::MakeLeftPos, &FirstMinusSecond, &SecondMinusFirst, &SwIncrement, &SwDecrement, &SwRect::SetTopAndHeight, &SwRect::SetRightAndWidth }; static SwRectFnCollection aBottomToTop = { /* fnRectGet */ &SwRect::_Bottom, &SwRect::_Top, &SwRect::_Left, &SwRect::_Right, &SwRect::_Width, &SwRect::_Height, &SwRect::BottomLeft, &SwRect::_Size, /* fnRectSet */ &SwRect::_Bottom, &SwRect::_Top, &SwRect::_Left, &SwRect::_Right, &SwRect::_Width, &SwRect::_Height, &SwRect::AddBottom, &SwRect::SubTop, &SwRect::SubLeft, &SwRect::AddRight, &SwRect::AddWidth, &SwRect::AddHeight, &SwRect::SetPosX, &SwRect::SetPosY, &SwFrm::GetBottomMargin, &SwFrm::GetTopMargin, &SwFrm::GetLeftMargin, &SwFrm::GetRightMargin, &SwFrm::SetLeftRightMargins, &SwFrm::SetBottomTopMargins, &SwFrm::GetPrtBottom, &SwFrm::GetPrtTop, &SwFrm::GetPrtLeft, &SwFrm::GetPrtRight, &SwRect::GetBottomDistance, &SwRect::GetTopDistance, &SwRect::GetLeftDistance, &SwRect::GetRightDistance, &SwFrm::SetMinTop, &SwRect::OverStepTop, &SwRect::SetLowerLeftCorner, &SwFrm::MakeUpperPos, &FirstMinusSecond, &SecondMinusFirst, &SwIncrement, &SwDecrement, &SwRect::SetLeftAndWidth, &SwRect::SetBottomAndHeight }; static SwRectFnCollection aVerticalRightToLeft = { /* fnRectGet */ &SwRect::_Left, &SwRect::_Right, &SwRect::_Top, &SwRect::_Bottom, &SwRect::_Height, &SwRect::_Width, &SwRect::BottomRight, &SwRect::SwappedSize, /* fnRectSet */ &SwRect::_Left, &SwRect::_Right, &SwRect::_Top, &SwRect::_Bottom, &SwRect::_Height, &SwRect::_Width, &SwRect::SubLeft, &SwRect::AddRight, &SwRect::SubTop, &SwRect::AddBottom, &SwRect::AddHeight, &SwRect::AddWidth, &SwRect::SetPosY, &SwRect::SetPosX, &SwFrm::GetLeftMargin, &SwFrm::GetRightMargin, &SwFrm::GetTopMargin, &SwFrm::GetBottomMargin, &SwFrm::SetTopBottomMargins, &SwFrm::SetLeftRightMargins, &SwFrm::GetPrtLeft, &SwFrm::GetPrtRight, &SwFrm::GetPrtBottom, &SwFrm::GetPrtTop, &SwRect::GetLeftDistance, &SwRect::GetRightDistance, &SwRect::GetBottomDistance, &SwRect::GetTopDistance, &SwFrm::SetMaxRight, &SwRect::OverStepRight, &SwRect::SetLowerLeftCorner, &SwFrm::MakeRightPos, &FirstMinusSecond, &FirstMinusSecond, &SwDecrement, &SwIncrement, &SwRect::SetBottomAndHeight, &SwRect::SetLeftAndWidth }; //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin static SwRectFnCollection aVerticalLeftToRight = { /* fnRectGet */ &SwRect::_Left, &SwRect::_Right, &SwRect::_Top, &SwRect::_Bottom, &SwRect::_Height, &SwRect::_Width, &SwRect::TopLeft, &SwRect::SwappedSize, /* fnRectSet */ &SwRect::_Left, &SwRect::_Right, &SwRect::_Top, &SwRect::_Bottom, &SwRect::_Height, &SwRect::_Width, &SwRect::SubLeft, &SwRect::AddRight, &SwRect::SubTop, &SwRect::AddBottom, &SwRect::AddHeight, &SwRect::AddWidth, &SwRect::SetPosY, &SwRect::SetPosX, &SwFrm::GetLeftMargin, &SwFrm::GetRightMargin, &SwFrm::GetTopMargin, &SwFrm::GetBottomMargin, &SwFrm::SetTopBottomMargins, &SwFrm::SetLeftRightMargins, &SwFrm::GetPrtLeft, &SwFrm::GetPrtRight, &SwFrm::GetPrtTop, &SwFrm::GetPrtBottom, &SwRect::GetLeftDistance, &SwRect::GetRightDistance, &SwRect::GetTopDistance, &SwRect::GetBottomDistance, &SwFrm::SetMaxRight, &SwRect::OverStepRight, &SwRect::SetUpperLeftCorner, &SwFrm::MakeRightPos, &FirstMinusSecond, &FirstMinusSecond, &SwIncrement, &SwIncrement, &SwRect::SetTopAndHeight, &SwRect::SetLeftAndWidth }; //End of SCMS SwRectFn fnRectHori = &aHorizontal; SwRectFn fnRectVert = &aVertical; //Badaa: 2008-04-18 * Support for Classical Mongolian Script (SCMS) joint with Jiayanmin SwRectFn fnRectVertL2R = &aVerticalLeftToRight; //End of SCMS SwRectFn fnRectB2T = &aBottomToTop; SwRectFn fnRectVL2R = &aVerticalRightToLeft; // --> OD 2006-05-10 #i65250# sal_uInt32 SwFrm::mnLastFrmId=0; // <-- TYPEINIT1(SwFrm,SwClient); //rtti fuer SwFrm TYPEINIT1(SwCntntFrm,SwFrm); //rtti fuer SwCntntFrm void _FrmInit() { SwRootFrm::pVout = new SwLayVout(); SwCache *pNew = new SwCache( 100, 100 #ifdef DBG_UTIL , "static SwBorderAttrs::pCache" #endif ); SwFrm::SetCache( pNew ); } void _FrmFinit() { #ifdef DBG_UTIL // im Chache duerfen nur noch 0-Pointer stehen for( sal_uInt16 n = SwFrm::GetCachePtr()->Count(); n; ) if( (*SwFrm::GetCachePtr())[ --n ] ) { SwCacheObj* pObj = (*SwFrm::GetCachePtr())[ n ]; ASSERT( !pObj, "Wer hat sich nicht ausgetragen?") } #endif delete SwRootFrm::pVout; delete SwFrm::GetCachePtr(); } /************************************************************************* |* |* RootFrm::Alles was so zur CurrShell gehoert |* |* Ersterstellung MA 09. Sep. 98 |* Letzte Aenderung MA 18. Feb. 99 |* |*************************************************************************/ typedef CurrShell* CurrShellPtr; SV_DECL_PTRARR_SORT(SwCurrShells,CurrShellPtr,4,4) SV_IMPL_PTRARR_SORT(SwCurrShells,CurrShellPtr) CurrShell::CurrShell( ViewShell *pNew ) { ASSERT( pNew, "0-Shell einsetzen?" ); pRoot = pNew->GetLayout(); if ( pRoot ) { pPrev = pRoot->pCurrShell; pRoot->pCurrShell = pNew; pRoot->pCurrShells->Insert( this ); } else pPrev = 0; } CurrShell::~CurrShell() { if ( pRoot ) { pRoot->pCurrShells->Remove( this ); if ( pPrev ) pRoot->pCurrShell = pPrev; if ( !pRoot->pCurrShells->Count() && pRoot->pWaitingCurrShell ) { pRoot->pCurrShell = pRoot->pWaitingCurrShell; pRoot->pWaitingCurrShell = 0; } } } void SetShell( ViewShell *pSh ) { SwRootFrm *pRoot = pSh->GetLayout(); if ( !pRoot->pCurrShells->Count() ) pRoot->pCurrShell = pSh; else pRoot->pWaitingCurrShell = pSh; } void SwRootFrm::DeRegisterShell( ViewShell *pSh ) { //Wenn moeglich irgendeine Shell aktivieren if ( pCurrShell == pSh ) pCurrShell = pSh->GetNext() != pSh ? (ViewShell*)pSh->GetNext() : 0; //Das hat sich eruebrigt if ( pWaitingCurrShell == pSh ) pWaitingCurrShell = 0; //Referenzen entfernen. for ( sal_uInt16 i = 0; i < pCurrShells->Count(); ++i ) { CurrShell *pC = (*pCurrShells)[i]; if (pC->pPrev == pSh) pC->pPrev = 0; } } void InitCurrShells( SwRootFrm *pRoot ) { pRoot->pCurrShells = new SwCurrShells; } /************************************************************************* |* |* SwRootFrm::SwRootFrm() |* |* Beschreibung: |* Der RootFrm laesst sich grundsaetzlich vom Dokument ein eigenes |* FrmFmt geben. Dieses loescht er dann selbst im DTor. |* Das eigene FrmFmt wird vom uebergebenen Format abgeleitet. |* Ersterstellung SS 05-Apr-1991 |* Letzte Aenderung MA 12. Dec. 94 |* |*************************************************************************/ SwRootFrm::SwRootFrm( SwFrmFmt *pFmt, ViewShell * pSh ) : SwLayoutFrm( pFmt->GetDoc()->MakeFrmFmt( XubString( "Root", RTL_TEXTENCODING_MS_1252 ), pFmt ), 0 ), // --> PAGES01 maPagesArea(), mnViewWidth( -1 ), mnColumns( 0 ), mbBookMode( false ), mbSidebarChanged( false ), mbNeedGrammarCheck( false ), // <-- nBrowseWidth( MM50*4 ), //2cm Minimum pTurbo( 0 ), pLastPage( 0 ), pCurrShell( pSh ), pWaitingCurrShell( 0 ), pDrawPage( 0 ), pDestroy( 0 ), nPhyPageNums( 0 ), nAccessibleShells( 0 ) { nType = FRMC_ROOT; bIdleFormat = bTurboAllowed = bAssertFlyPages = bIsNewLayout = sal_True; bCheckSuperfluous = bBrowseWidthValid = sal_False; setRootFrm( this ); } void SwRootFrm::Init( SwFrmFmt* pFmt ) { InitCurrShells( this ); IDocumentTimerAccess *pTimerAccess = pFmt->getIDocumentTimerAccess(); IDocumentLayoutAccess *pLayoutAccess = pFmt->getIDocumentLayoutAccess(); IDocumentFieldsAccess *pFieldsAccess = pFmt->getIDocumentFieldsAccess(); const IDocumentSettingAccess *pSettingAccess = pFmt->getIDocumentSettingAccess(); pTimerAccess->StopIdling(); pLayoutAccess->SetCurrentViewShell( this->GetCurrShell() ); //Fuer das Erzeugen der Flys durch MakeFrms() //swmod 071108//swmod 071225 bCallbackActionEnabled = sal_False; //vor Verlassen auf sal_True setzen! SdrModel *pMd = pFmt->getIDocumentDrawModelAccess()->GetDrawModel(); if ( pMd ) { // Disable "multiple layout" pDrawPage = pMd->GetPage(0); //pMd->AllocPage( FALSE ); //pMd->InsertPage( pDrawPage ); // end of disabling pDrawPage->SetSize( Frm().SSize() ); } //Initialisierung des Layouts: Seiten erzeugen. Inhalt mit cntnt verbinden //usw. //Zuerst einiges initialiseren und den ersten Node besorgen (der wird //fuer den PageDesc benoetigt). SwDoc* pDoc = pFmt->GetDoc(); SwNodeIndex aIndex( *pDoc->GetNodes().GetEndOfContent().StartOfSectionNode() ); SwCntntNode *pNode = pDoc->GetNodes().GoNextSection( &aIndex, sal_True, sal_False ); // --> FME 2005-05-25 #123067# pNode = 0 can really happen: SwTableNode *pTblNd= pNode ? pNode->FindTableNode() : 0; // <-- //PageDesc besorgen (entweder vom FrmFmt des ersten Node oder den //initialen.) SwPageDesc *pDesc = 0; sal_uInt16 nPgNum = 1; if ( pTblNd ) { const SwFmtPageDesc &rDesc = pTblNd->GetTable().GetFrmFmt()->GetPageDesc(); pDesc = (SwPageDesc*)rDesc.GetPageDesc(); //#19104# Seitennummeroffset beruecksictigen!! bIsVirtPageNum = 0 != ( nPgNum = rDesc.GetNumOffset() ); } else if ( pNode ) { const SwFmtPageDesc &rDesc = pNode->GetSwAttrSet().GetPageDesc(); pDesc = (SwPageDesc*)rDesc.GetPageDesc(); //#19104# Seitennummeroffset beruecksictigen!! bIsVirtPageNum = 0 != ( nPgNum = rDesc.GetNumOffset() ); } else bIsVirtPageNum = sal_False; if ( !pDesc ) pDesc = (SwPageDesc*) &const_cast(pDoc)->GetPageDesc( 0 ); const sal_Bool bOdd = !nPgNum || 0 != ( nPgNum % 2 ); //Eine Seite erzeugen und in das Layout stellen SwPageFrm *pPage = ::InsertNewPage( *pDesc, this, bOdd, sal_False, sal_False, 0 ); //Erstes Blatt im Bodytext-Bereich suchen. SwLayoutFrm *pLay = pPage->FindBodyCont(); while( pLay->Lower() ) pLay = (SwLayoutFrm*)pLay->Lower(); SwNodeIndex aTmp( *pDoc->GetNodes().GetEndOfContent().StartOfSectionNode(), 1 ); ::_InsertCnt( pLay, pDoc, aTmp.GetIndex(), sal_True ); //Noch nicht ersetzte Master aus der Liste entfernen. RemoveMasterObjs( pDrawPage ); if( pSettingAccess->get(IDocumentSettingAccess::GLOBAL_DOCUMENT) ) pFieldsAccess->UpdateRefFlds( NULL ); //b6433357: Update page fields after loading // ---> if ( !pCurrShell || !pCurrShell->Imp()->IsUpdateExpFlds() ) { SwDocPosUpdate aMsgHnt( pPage->Frm().Top() ); pFieldsAccess->UpdatePageFlds( &aMsgHnt ); } // <--- pTimerAccess->StartIdling(); bCallbackActionEnabled = sal_True; ViewShell *pViewSh = GetCurrShell(); if (pViewSh) mbNeedGrammarCheck = pViewSh->GetViewOptions()->IsOnlineSpell(); } /************************************************************************* |* |* SwRootFrm::~SwRootFrm() |* |* Ersterstellung SS 05-Apr-1991 |* Letzte Aenderung MA 12. Dec. 94 |* |*************************************************************************/ SwRootFrm::~SwRootFrm() { bTurboAllowed = sal_False; pTurbo = 0; if(pBlink) pBlink->FrmDelete( this ); static_cast(GetRegisteredInNonConst())->GetDoc()->DelFrmFmt( static_cast(GetRegisteredInNonConst()) ); delete pDestroy; pDestroy = 0; //Referenzen entfernen. for ( sal_uInt16 i = 0; i < pCurrShells->Count(); ++i ) (*pCurrShells)[i]->pRoot = 0; delete pCurrShells; ASSERT( 0==nAccessibleShells, "Some accessible shells are left" ); } /************************************************************************* |* |* SwRootFrm::RemoveMasterObjs() |* |* Ersterstellung MA 19.10.95 |* Letzte Aenderung MA 19.10.95 |* |*************************************************************************/ void SwRootFrm::RemoveMasterObjs( SdrPage *pPg ) { //Alle Masterobjekte aus der Page entfernen. Nicht loeschen!! for( sal_uLong i = pPg ? pPg->GetObjCount() : 0; i; ) { SdrObject* pObj = pPg->GetObj( --i ); if( pObj->ISA(SwFlyDrawObj ) ) pPg->RemoveObject( i ); } } void SwRootFrm::AllCheckPageDescs() const { CheckPageDescs( (SwPageFrm*)this->Lower() ); } //swmod 080226 void SwRootFrm::AllInvalidateAutoCompleteWords() const { SwPageFrm *pPage = (SwPageFrm*)this->Lower(); while ( pPage ) { pPage->InvalidateAutoCompleteWords(); pPage = (SwPageFrm*)pPage->GetNext(); } }//swmod 080305 void SwRootFrm::AllAddPaintRect() const { GetCurrShell()->AddPaintRect( this->Frm() ); }//swmod 080305 void SwRootFrm::AllRemoveFtns() { RemoveFtns(); } void SwRootFrm::AllInvalidateSmartTagsOrSpelling(sal_Bool bSmartTags) const { SwPageFrm *pPage = (SwPageFrm*)this->Lower(); while ( pPage ) { if ( bSmartTags ) pPage->InvalidateSmartTags(); pPage->InvalidateSpelling(); pPage = (SwPageFrm*)pPage->GetNext(); } //swmod 080218 }