diff options
author | Jens-Heiner Rechtien <hr@openoffice.org> | 2000-09-18 23:08:29 +0000 |
---|---|---|
committer | Jens-Heiner Rechtien <hr@openoffice.org> | 2000-09-18 23:08:29 +0000 |
commit | 84a3db80b4fd66c6854b3135b5f69b61fd828e62 (patch) | |
tree | 4475006ca87946e71c44668b20330b2d2729f638 /sw/source/core/attr/calbck.cxx | |
parent | 7b0b5cdfeed656b279bc32cd929630d5fc25878b (diff) |
initial import
Diffstat (limited to 'sw/source/core/attr/calbck.cxx')
-rw-r--r-- | sw/source/core/attr/calbck.cxx | 642 |
1 files changed, 642 insertions, 0 deletions
diff --git a/sw/source/core/attr/calbck.cxx b/sw/source/core/attr/calbck.cxx new file mode 100644 index 000000000000..e8caa63045d5 --- /dev/null +++ b/sw/source/core/attr/calbck.cxx @@ -0,0 +1,642 @@ +/************************************************************************* + * + * $RCSfile: calbck.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-19 00:08:15 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifdef PRECOMPILED +#include "core_pch.hxx" +#endif + +#pragma hdrstop + +#include "hintids.hxx" // fuer RES_.. +#include "frame.hxx" +#include "errhdl.hxx" +#include "hints.hxx" + +#define ITERATION // iterative SwModify::_Insert-Methode +#include "calbck.hxx" +#include "swcache.hxx" +#include "swfntcch.hxx" + +static SwClientIter* pClientIters = 0; + + +TYPEINIT0(SwClient); //rtti + +/************************************************************************* +|* SwClient::SwClient(SwModify *) +|* +|* Beschreibung callback.doc V1.14 +|* Ersterstellung VB 20.03.91 +|* Letzte Aenderung MA 20. Mar. 95 +*************************************************************************/ + + +SwClient::SwClient(SwModify *pToRegisterIn) + : pLeft( 0 ), pRight( 0 ), pRegisteredIn( 0 ) +{ + bModifyLocked = + bInModify = + bInDocDTOR = + bInCache = FALSE; + bInSwFntCache = FALSE; + + if(pToRegisterIn) + pToRegisterIn->Add(this); +} + +/************************************************************************* +|* SwClient::Modify() +|* +|* Beschreibung callback.doc V1.14 +|* Ersterstellung VB 20.03.91 +|* Letzte Aenderung VB 20.03.91 +*************************************************************************/ + + +void SwClient::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew ) +{ + if( (!pOld || pOld->Which() != RES_OBJECTDYING) ) + return; + + SwPtrMsgPoolItem *pDead = (SwPtrMsgPoolItem *)pOld; + if(pDead->pObject == pRegisteredIn) + { + SwModify *pAbove = (SwModify*)pRegisteredIn->GetRegisteredIn(); + if(pAbove) + { + pAbove->Add(this); + return; + } + pRegisteredIn->Remove(this); + } +} + +/************************************************************************* +|* SwClient::~SwClient() +|* +|* Beschreibung callback.doc V1.14 +|* Ersterstellung VB 20.03.91 +|* Letzte Aenderung MA 25. Jan. 94 +*************************************************************************/ + + +SwClient::~SwClient() +{ + if( pRegisteredIn && pRegisteredIn->GetDepends() ) + pRegisteredIn->Remove( this ); + + ASSERT( !IsModifyLocked(), "Modify destroyed but locked." ); +} + + + // erfrage vom Client Informationen +BOOL SwClient::GetInfo( SfxPoolItem& ) const +{ + return TRUE; // und weiter +} + +/************************************************************************* +|* SwModify::SwModify( SwModify * ) +|* +|* Beschreibung Dokument 1.7 +|* Ersterstellung JP 20.11.90 +|* Letzte Aenderung VB 20.03.91 +*************************************************************************/ + + +SwModify::SwModify( SwModify *pToRegisterIn ) + : SwClient(pToRegisterIn), pRoot( 0 ) +{ +} + +/************************************************************************* +|* SwModify::~SwModify() +|* +|* Beschreibung Dokument 1.7 +|* Ersterstellung JP 20.11.90 +|* Letzte Aenderung JP 15.04.94 +*************************************************************************/ + + + +SwModify::~SwModify() +{ + if ( IsInCache() ) + SwFrm::GetCache().Delete( this ); + + if ( IsInSwFntCache() ) + pSwFontCache->Delete( this ); + + if( pRoot ) + { + if( IsInDocDTOR() ) + { + // alle Clients "logisch" austragen + SwClientIter aIter( *this ); + SwClient* p; + while( 0 != ( p = aIter++ ) ) + p->pRegisteredIn = 0; + + p = aIter.GoRoot(); // wieder ab Root (==Start) anfangen + do { + p->pRegisteredIn = 0; + } while( 0 != ( p = aIter-- ) ); + } + else + { + // verschicke die Nachricht an die abgeleiteten Objekte. + SwPtrMsgPoolItem aDyObject( RES_OBJECTDYING, this ); + Modify( &aDyObject, &aDyObject ); + + // Zwangsummeldung aller derjenigen, die sich nicht ausgetragen + // haben, durch Aufruf von SwClient::Modify() + while( pRoot ) + pRoot->SwClient::Modify(&aDyObject, &aDyObject); + } + } +} + +/************************************************************************* +|* SwModify::Modify( SwHint * pOldValue, SwHint * pNewValue ) +|* +|* Beschreibung Dokument 1.7 +|* Ersterstellung JP 20.11.90 +|* Letzte Aenderung MA 20. Mar. 95 +*************************************************************************/ + + + +void SwModify::Modify( SfxPoolItem* pOldValue, SfxPoolItem* pNewValue ) +{ + + if( !pRoot || IsModifyLocked() ) + return; + + + if ( IsInCache() || IsInSwFntCache() ) + { + const USHORT nWhich = pOldValue ? pOldValue->Which() : + pNewValue ? pNewValue->Which() : 0; + CheckCaching( nWhich ); + } + + LockModify(); + + bInModify = +#ifdef PRODUCT + TRUE +#else + // Modifies von RES_OBJECTDYING sollte kein ASSRT ausloesen + !pOldValue || + (RES_OBJECTDYING != pOldValue->Which() && + RES_REMOVE_UNO_OBJECT != pOldValue->Which()) || + ((SwPtrMsgPoolItem *)pOldValue)->pObject != this +#endif + ; + + SwClientIter aIter( *this ); + SwClient * pLast = aIter.GoStart(); + if( pLast ) // konnte zum Anfang gesprungen werden ?? + do { + pLast->Modify( pOldValue, pNewValue ); + if( !pRoot ) // Baum schon Weg ?? + break; + } while( 0 != ( pLast = aIter++ )); + + bInModify = FALSE; + UnlockModify(); +} + +// erfrage vom Modify Informationen + +BOOL SwModify::GetInfo( SfxPoolItem& rInfo ) const +{ + BOOL bRet = TRUE; // bedeutet weiter zum naechsten + + if( pRoot ) + { + SwClientIter aIter( *(SwModify*)this ); + + SwClient* pLast = aIter.GoStart(); + if( pLast ) + while( 0 != ( bRet = pLast->GetInfo( rInfo )) && + 0 != ( pLast = aIter++ ) ) + ; + } + + return bRet; // und weiter +} + +/************************************************************************* +|* SwModify::Add( SwClient *pDepend ) +|* +|* Beschreibung Dokument 1.7 +|* Ersterstellung JP 20.11.90 +|* Letzte Aenderung JP 14.09.94 +*************************************************************************/ + + + +void SwModify::Add(SwClient *pDepend) +{ + ASSERT( !bInModify, "Client innerhalb des eigenen Modifies einfuegen?" ); + + // nur wenn das hier noch nicht eingetragen ist einfuegen + if(pDepend->pRegisteredIn != this ) + { +#ifndef PRODUCT + SwClientIter* pTmp = pClientIters; + while( pTmp ) + { + ASSERT( &pTmp->rRoot != pRoot, + "Client beim angemeldeten ClientIter einfuegen?" ); + pTmp = pTmp->pNxtIter; + } +#endif + // wenn schon wanders angemeldet, dann dort abmelden + if( pDepend->pRegisteredIn != 0 ) + pDepend->pRegisteredIn->Remove( pDepend ); + + if( !pRoot ) + { + pRoot = pDepend; + pRoot->pLeft = 0; + pRoot->pRight = 0; + } + else + { + // immer hinter die Root haengen + pDepend->pRight = pRoot->pRight; + pRoot->pRight = pDepend; + pDepend->pLeft = pRoot; + if( pDepend->pRight ) + pDepend->pRight->pLeft = pDepend; + } + + pDepend->pRegisteredIn = this; + } + +} + +/************************************************************************* +|* SwModify::_Remove( SwClient *pDepend ) +|* +|* Beschreibung Dokument 1.7 +|* Ersterstellung JP 20.11.90 +|* Letzte Aenderung JP 14.09.94 +*************************************************************************/ + + + +SwClient *SwModify::_Remove(SwClient * pDepend) +{ + ASSERT( !bInModify, "Client innerhalb des eigenen Modifies loeschen?" ); + + // loesche das Object aus der Liste und setze den + // Registrierungs-Pointer zurueck + if( pDepend->pRegisteredIn == this ) + { + register SwClient* pR = pDepend->pRight; + register SwClient* pL = pDepend->pLeft; + if( pRoot == pDepend ) + pRoot = pL ? pL : pR; + + if( pL ) + pL->pRight = pR; + if( pR ) + pR->pLeft = pL; + + // alle Client-Iters updaten + SwClientIter* pTmp = pClientIters; + while( pTmp ) + { + if( pTmp->pAkt == pDepend || pTmp->pDelNext == pDepend ) + pTmp->pDelNext = pR; + pTmp = pTmp->pNxtIter; + } + + pDepend->pLeft = 0; + pDepend->pRight = 0; + } + else + ASSERT( FALSE, "SwModify::Remove(): pDepend nicht gefunden"); + pDepend->pRegisteredIn = 0; + return pDepend; +} + + +/************************************************************************* +|* SwModify::CheckCaching( const USHORT nWhich ) +|* +|* Ersterstellung JP 25.06.95 +|* Letzte Aenderung JP 25.06.95 +*************************************************************************/ + + + +void SwModify::CheckCaching( const USHORT nWhich ) +{ + if( RES_CHRATR_BEGIN <= nWhich && RES_CHRATR_END > nWhich ) + SetInSwFntCache( FALSE ); + else + switch ( nWhich ) + { + case RES_OBJECTDYING: + case RES_FMT_CHG: + case RES_ATTRSET_CHG: + SetInSwFntCache( FALSE ); + + case RES_UL_SPACE: + case RES_LR_SPACE: + case RES_BOX: + case RES_SHADOW: + case RES_FRM_SIZE: + case RES_KEEP: + case RES_BREAK: + if ( IsInCache() ) + { + SwFrm::GetCache().Delete( this ); + SetInCache( FALSE ); + } + break; + } +} + + +// ---------- +// SwDepend +// ---------- + +/************************************************************************* +|* SwDepend::SwDepend(SwClient *pTellHim,SwModify *pDepend) +|* +|* Beschreibung callback.doc V1.14 +|* Ersterstellung VB 20.03.91 +|* Letzte Aenderung VB 20.03.91 +*************************************************************************/ + + +SwDepend::SwDepend(SwClient *pTellHim, SwModify *pDepend) + : SwClient(pDepend) +{ + pToTell = pTellHim; +} + +/************************************************************************* +|* +|* SwDepend::Modify(SwHint *, SwHint *) +|* +|* Beschreibung callback.doc V1.14 +|* Ersterstellung VB 20.03.91 +|* Letzte Aenderung VB 20.03.91 +|* +*************************************************************************/ + + +void SwDepend::Modify( SfxPoolItem *pOldValue, SfxPoolItem *pNewValue ) +{ + if(pNewValue && pNewValue->Which() == RES_OBJECTDYING) + SwClient::Modify(pOldValue,pNewValue); + else if(pToTell) + pToTell->Modify(pOldValue, pNewValue); +} + + + // erfrage vom Modify Informationen +BOOL SwDepend::GetInfo( SfxPoolItem& rInfo ) const +{ + return pToTell ? pToTell->GetInfo( rInfo ) : TRUE; +} + +/********************************************************************/ + + +SwClientIter::SwClientIter( SwModify& rModify ) + : rRoot( rModify ) +{ + // hinten einketten! + pNxtIter = 0; + if( pClientIters ) + { + SwClientIter* pTmp = pClientIters; + while( pTmp->pNxtIter ) + pTmp = pTmp->pNxtIter; + pTmp->pNxtIter = this; + } + else + pClientIters = this; + + pAkt = rRoot.pRoot; + pDelNext = pAkt; +} + + + +SwClientIter::~SwClientIter() +{ + if( pClientIters ) + { + if( pClientIters == this ) + pClientIters = pNxtIter; + else + { + SwClientIter* pTmp = pClientIters; + while( pTmp->pNxtIter != this ) + if( 0 == ( pTmp = pTmp->pNxtIter ) ) + { + ASSERT( this, "wo ist mein Pointer" ); + return ; + } + pTmp->pNxtIter = pNxtIter; + } + } +} + + +#ifndef CFRONT + // Postfix Operator +SwClient* SwClientIter::operator++(int) +{ +// solange der CFRONT Prefix und PostFix nicht unterscheiden kann, immer +// als Prefix-Operator arbeiten. Wenn der CFRONT es kann, muss auch der +// Code entsprechen umgestellt werden !!! + if( pDelNext == pAkt ) + { + pAkt = pAkt->pRight; + pDelNext = pAkt; + } + else + pAkt = pDelNext; + return pAkt; +} +#endif + + + // Prefix Operator +SwClient* SwClientIter::operator++() +{ + if( pDelNext == pAkt ) + { + pAkt = pAkt->pRight; + pDelNext = pAkt; + } + else + pAkt = pDelNext; + return pAkt; +} + + +#ifndef CFRONT + // Postfix Operator +SwClient* SwClientIter::operator--(int) +{ +// solange der CFRONT Prefix und PostFix nicht unterscheiden kann, immer +// als Prefix-Operator arbeiten. Wenn der CFRONT es kann, muss auch der +// Code entsprechen umgestellt werden !!! + if( pDelNext == pAkt ) + pAkt = pAkt->pLeft; + else + pAkt = pDelNext->pLeft; + pDelNext = pAkt; + return pAkt; +} +#endif + + + // Prefix Operator +SwClient* SwClientIter::operator--() +{ + if( pDelNext == pAkt ) + pAkt = pAkt->pLeft; + else + pAkt = pDelNext->pLeft; + pDelNext = pAkt; + return pAkt; +} + + +SwClient* SwClientIter::GoStart() // zum Anfang des Baums +{ + pAkt = rRoot.pRoot; + if( pAkt ) + while( pAkt->pLeft ) + pAkt = pAkt->pLeft; + pDelNext = pAkt; + return pAkt; +} + + +SwClient* SwClientIter::GoEnd() // zum End des Baums +{ + pAkt = pDelNext; + if( !pAkt ) + pAkt = rRoot.pRoot; + if( pAkt ) + while( pAkt->pRight ) + pAkt = pAkt->pRight; + pDelNext = pAkt; + return pAkt; +} + + + +SwClient* SwClientIter::First( TypeId nType ) +{ + aSrchId = nType; + GoStart(); + if( pAkt ) + do { + if( pAkt->IsA( aSrchId ) ) + break; + + if( pDelNext == pAkt ) + { + pAkt = pAkt->pRight; + pDelNext = pAkt; + } + else + pAkt = pDelNext; + + } while( pAkt ); + return pAkt; +} + + +SwClient* SwClientIter::Next() +{ + do { + // erstmal zum naechsten + if( pDelNext == pAkt ) + { + pAkt = pAkt->pRight; + pDelNext = pAkt; + } + else + pAkt = pDelNext; + + if( pAkt && pAkt->IsA( aSrchId ) ) + break; + } while( pAkt ); + return pAkt; +} + + + |