summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorAndreas Martens <ama@openoffice.org>2001-03-02 10:36:09 +0000
committerAndreas Martens <ama@openoffice.org>2001-03-02 10:36:09 +0000
commit8ecc08db55e6a5f099de847a21d4e68e02abc692 (patch)
treebc56b9563a90958ff2643d1a12e45b203a931a73 /sw
parent1aa8a3739a75427434074212745d7ffedf56b5a9 (diff)
Fix #65244#: Right and left pages, virtual page numbering
Diffstat (limited to 'sw')
-rw-r--r--sw/source/core/layout/pagechg.cxx103
1 files changed, 36 insertions, 67 deletions
diff --git a/sw/source/core/layout/pagechg.cxx b/sw/source/core/layout/pagechg.cxx
index 0ea9be9e89fd..c59b81687969 100644
--- a/sw/source/core/layout/pagechg.cxx
+++ b/sw/source/core/layout/pagechg.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: pagechg.cxx,v $
*
- * $Revision: 1.1.1.1 $
+ * $Revision: 1.2 $
*
- * last change: $Author: hr $ $Date: 2000-09-19 00:08:22 $
+ * last change: $Author: ama $ $Date: 2001-03-02 11:36:09 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -1072,18 +1072,21 @@ void SwFrm::CheckPageDescs( SwPageFrm *pStart, BOOL bNotifyFields )
SwDoc* pDoc = pStart->GetFmt()->GetDoc();
const BOOL bFtns = 0 != pDoc->GetFtnIdxs().Count();
- if ( pStart->GetPrev() && ((SwPageFrm*)pStart->GetPrev())->IsEmptyPage() )
- pStart = (SwPageFrm*)pStart->GetPrev();
SwPageFrm *pPage = pStart;
+ if( pPage->GetPrev() && ((SwPageFrm*)pPage->GetPrev())->IsEmptyPage() )
+ pPage = (SwPageFrm*)pPage->GetPrev();
while ( pPage )
{
//gewuenschten PageDesc und FrmFmt festellen.
SwPageDesc *pDesc = pPage->FindPageDesc();
- const USHORT nPgNum = pPage->GetVirtPageNum();
- BOOL bOdd = nPgNum % 2 ? TRUE : FALSE;
- SwFrmFmt *pFmtWish = bOdd ? pDesc->GetRightFmt() : pDesc->GetLeftFmt();
-
- if ( pDesc != pPage->GetPageDesc() || //falscher Desc
+ BOOL bCheckEmpty = pPage->IsEmptyPage();
+ BOOL bActOdd = pPage->OnRightPage();
+ BOOL bOdd = pPage->WannaRightPage();
+ SwFrmFmt *pFmtWish = bOdd ? pDesc->GetRightFmt()
+ : pDesc->GetLeftFmt();
+
+ if ( bActOdd != bOdd ||
+ pDesc != pPage->GetPageDesc() || //falscher Desc
(pFmtWish != pPage->GetFmt() && //falsches Format und
(!pPage->IsEmptyPage() || pFmtWish))) //nicht Leerseite
{
@@ -1115,7 +1118,8 @@ void SwFrm::CheckPageDescs( SwPageFrm *pStart, BOOL bNotifyFields )
//6. Wir haben kein Wunschformat erhalten, also nehmen wir das
// 'andere' Format (rechts/links) des PageDesc.
- if ( pPage->IsEmptyPage() && pFmtWish ) //1.
+ if ( pPage->IsEmptyPage() && ( pFmtWish || //1.
+ ( !bOdd && !pPage->GetPrev() ) ) )
{
SwPageFrm *pTmp = (SwPageFrm*)pPage->GetNext();
pPage->Cut();
@@ -1130,10 +1134,10 @@ void SwFrm::CheckPageDescs( SwPageFrm *pStart, BOOL bNotifyFields )
{
pPage->SetPageDesc( pDesc, 0 );
}
- else if ( !pPage->IsEmptyPage() && !pFmtWish && //3
- (!pPage->GetPrev() || //nicht wenn Vorseite
- (pPage->GetPrev() && //EmptyPage
- !((SwPageFrm*)pPage->GetPrev())->IsEmptyPage())))
+ else if ( !pPage->IsEmptyPage() && bActOdd != bOdd && //3
+ ( ( !pPage->GetPrev() && !bOdd ) ||
+ ( pPage->GetPrev() &&
+ !((SwPageFrm*)pPage->GetPrev())->IsEmptyPage() ) ) )
{
if ( pPage->GetPrev() )
pDesc = ((SwPageFrm*)pPage->GetPrev())->GetPageDesc();
@@ -1178,7 +1182,7 @@ void SwFrm::CheckPageDescs( SwPageFrm *pStart, BOOL bNotifyFields )
}
#endif
}
- else if ( pPage->IsEmptyPage() )
+ if ( bCheckEmpty )
{
//Es kann noch sein, dass die Leerseite schlicht ueberflussig ist.
//Obiger Algorithmus kann dies leider nicht feststellen.
@@ -1189,38 +1193,7 @@ void SwFrm::CheckPageDescs( SwPageFrm *pStart, BOOL bNotifyFields )
//genauer ansehen. Wir bestimmen den PageDesc und die virtuelle
//Seitennummer manuell.
SwPageFrm *pPg = (SwPageFrm*)pPage->GetNext();
- BOOL bDel = FALSE;
- if ( pPg )
- {
- SwFrm *pFlow = pPg->FindFirstBodyCntnt();
- SwPageDesc *pDesc = 0;
- USHORT nPgNum = 0;
- if ( pFlow )
- {
- if ( pFlow->IsInTab() )
- pFlow = pFlow->FindTabFrm();
- const SwFmtPageDesc& rPgDesc = pFlow->GetAttrSet()->GetPageDesc();
- pDesc = (SwPageDesc*)rPgDesc.GetPageDesc();
- nPgNum = rPgDesc.GetNumOffset();
- }
- if ( !pDesc )
- {
- if ( pPage->GetPrev() )
- pDesc = ((SwPageFrm*)pPage->GetPrev())->GetPageDesc()->
- GetFollow();
- else
- pDesc = (SwPageDesc*)&pDoc->GetPageDesc( 0 );
- }
- if ( !nPgNum )
- nPgNum = pPage->GetVirtPageNum();
- BOOL bOdd = nPgNum % 2 ? TRUE : FALSE;
- SwFrmFmt *pFmt = bOdd ? pDesc->GetRightFmt() : pDesc->GetLeftFmt();
- bDel = pFmt ? TRUE : FALSE;
- }
- else
- bDel = TRUE;
-
- if ( bDel )
+ if( !pPg || pPage->OnRightPage() == pPg->WannaRightPage() )
{
//Die Folgeseite hat kein Problem ein FrmFmt zu finden oder keinen
//Nachfolger, also ist die Leerseite ueberfluessig.
@@ -1289,45 +1262,42 @@ void SwFrm::CheckPageDescs( SwPageFrm *pStart, BOOL bNotifyFields )
|*************************************************************************/
SwPageFrm *SwFrm::InsertPage( SwPageFrm *pPrevPage, BOOL bFtn )
{
- SwPageFrm *pSibling = (SwPageFrm*)pPrevPage->GetNext();
SwRootFrm *pRoot = (SwRootFrm*)pPrevPage->GetUpper();
+ SwPageFrm *pSibling = (SwPageFrm*)pRoot->GetLower();
+ SwPageDesc *pDesc = pSibling->GetPageDesc();
+ pSibling = (SwPageFrm*)pPrevPage->GetNext();
//Rechte (ungerade) oder linke (gerade) Seite einfuegen?
- BOOL bNumOfst = FALSE;
- BOOL bOdd;
+ BOOL bNextOdd = !pPrevPage->OnRightPage();
+ BOOL bWishedOdd = bNextOdd;
//Welcher PageDesc gilt?
//Bei CntntFrm der aus dem Format wenn einer angegeben ist,
//der Follow vom bereits in der PrevPage gueltigen sonst.
- SwPageDesc *pDesc = 0;
+ pDesc = 0;
if ( IsFlowFrm() && !SwFlowFrm::CastFlowFrm( this )->IsFollow() )
{ SwFmtPageDesc &rDesc = (SwFmtPageDesc&)GetAttrSet()->GetPageDesc();
pDesc = rDesc.GetPageDesc();
if ( rDesc.GetNumOffset() )
- { //Wenn sich PageDesc und NumOfset wiedersprechen kann nur
- //der PageDesc 'rechter haben'
- bOdd = rDesc.GetNumOffset() % 2 ? TRUE : FALSE;
- if ( !(bOdd ? pDesc->GetRightFmt() : pDesc->GetLeftFmt()) )
- bOdd = !bOdd;
- bNumOfst = TRUE;
+ {
+ bWishedOdd = rDesc.GetNumOffset() % 2 ? TRUE : FALSE;
//Die Gelegenheit nutzen wir um das Flag an der Root zu pflegen.
pRoot->SetVirtPageNum( TRUE );
}
}
- if ( !bNumOfst )
- bOdd = pPrevPage->GetVirtPageNum() % 2 ? FALSE : TRUE;
-
if ( !pDesc )
pDesc = pPrevPage->GetPageDesc()->GetFollow();
- ASSERT( pDesc, "Kein PageDesc gefunden." );
+ ASSERT( pDesc, "Missing PageDesc" );
+ if( !(bWishedOdd ? pDesc->GetRightFmt() : pDesc->GetLeftFmt()) )
+ bWishedOdd = !bWishedOdd;
SwDoc *pDoc = pPrevPage->GetFmt()->GetDoc();
- SwFrmFmt *pFmt = bOdd ? pDesc->GetRightFmt() : pDesc->GetLeftFmt();
+ SwFrmFmt *pFmt;
BOOL bCheckPages = FALSE;
//Wenn ich kein FrmFmt fuer die Seite gefunden habe, muss ich eben eine
//Leerseite einfuegen.
- if ( !pFmt )
+ if( bWishedOdd != bNextOdd )
{ pFmt = pDoc->GetEmptyPageFmt();
SwPageDesc *pTmpDesc = pPrevPage->GetPageDesc();
SwPageFrm *pPage = new SwPageFrm( pFmt, pTmpDesc );
@@ -1347,10 +1317,9 @@ SwPageFrm *SwFrm::InsertPage( SwPageFrm *pPrevPage, BOOL bFtn )
}
else
bCheckPages = TRUE;
- //Jetzt muss ich ein Format fuer die entsprechende Seite bekommen.
- pFmt = bOdd ? pDesc->GetLeftFmt() : pDesc->GetRightFmt();
- ASSERT( pFmt, "Descriptor gibt kein Format her." );
}
+ pFmt = bWishedOdd ? pDesc->GetRightFmt() : pDesc->GetLeftFmt();
+ ASSERT( pFmt, "Descriptor without format." );
SwPageFrm *pPage = new SwPageFrm( pFmt, pDesc );
pPage->Paste( pRoot, pSibling );
pPage->PreparePage( bFtn );
@@ -1608,7 +1577,7 @@ void SwRootFrm::AssertFlyPages()
if ( pPage )
{
SwPageDesc *pDesc = pPage->FindPageDesc();
- bOdd = pPage->GetVirtPageNum() % 2 ? TRUE : FALSE;
+ bOdd = pPage->OnRightPage();
if ( pPage->GetFmt() !=
(bOdd ? pDesc->GetRightFmt() : pDesc->GetLeftFmt()) )
RemoveFtns( pPage, FALSE, TRUE );