1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: cellatr.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sw.hxx"
37 #include <hintids.hxx> // fuer RES_..
38 #include <cellatr.hxx>
42 #include <swtable.hxx>
49 //TYPEINIT1( SwFmt, SwClient ); //rtti fuer SwFmt
51 /*************************************************************************
53 *************************************************************************/
56 SwTblBoxNumFormat::SwTblBoxNumFormat( UINT32 nFormat
, BOOL bFlag
)
57 : SfxUInt32Item( RES_BOXATR_FORMAT
, nFormat
), bAuto( bFlag
)
62 int SwTblBoxNumFormat::operator==( const SfxPoolItem
& rAttr
) const
64 ASSERT( SfxPoolItem::operator==( rAttr
), "keine gleichen Attribute" );
65 return GetValue() == ((SwTblBoxNumFormat
&)rAttr
).GetValue() &&
66 bAuto
== ((SwTblBoxNumFormat
&)rAttr
).bAuto
;
70 SfxPoolItem
* SwTblBoxNumFormat::Clone( SfxItemPool
* ) const
72 return new SwTblBoxNumFormat( GetValue(), bAuto
);
76 /*************************************************************************
78 *************************************************************************/
82 SwTblBoxFormula::SwTblBoxFormula( const String
& rFormula
)
83 : SfxPoolItem( RES_BOXATR_FORMULA
),
84 SwTableFormula( rFormula
),
90 int SwTblBoxFormula::operator==( const SfxPoolItem
& rAttr
) const
92 ASSERT( SfxPoolItem::operator==( rAttr
), "keine gleichen Attribute" );
93 return GetFormula() == ((SwTblBoxFormula
&)rAttr
).GetFormula() &&
94 pDefinedIn
== ((SwTblBoxFormula
&)rAttr
).pDefinedIn
;
98 SfxPoolItem
* SwTblBoxFormula::Clone( SfxItemPool
* ) const
100 // auf externe Darstellung umschalten!!
101 SwTblBoxFormula
* pNew
= new SwTblBoxFormula( GetFormula() );
102 pNew
->SwTableFormula::operator=( *this );
108 // suche den Node, in dem die Formel steht:
109 // TextFeld -> TextNode,
110 // BoxAttribut -> BoxStartNode
111 // !!! MUSS VON JEDER ABLEITUNG UEBERLADEN WERDEN !!!
112 const SwNode
* SwTblBoxFormula::GetNodeOfFormula() const
114 const SwNode
* pRet
= 0;
117 SwClient
* pBox
= SwClientIter( *pDefinedIn
).First( TYPE( SwTableBox
));
119 pRet
= ((SwTableBox
*)pBox
)->GetSttNd();
125 SwTableBox
* SwTblBoxFormula::GetTableBox()
127 SwTableBox
* pBox
= 0;
129 pBox
= (SwTableBox
*)SwClientIter( *pDefinedIn
).
130 First( TYPE( SwTableBox
));
135 void SwTblBoxFormula::ChangeState( const SfxPoolItem
* pItem
)
140 SwTableFmlUpdate
* pUpdtFld
;
141 if( !pItem
|| RES_TABLEFML_UPDATE
!= pItem
->Which() )
143 // setze bei allen das Value-Flag zurueck
148 pUpdtFld
= (SwTableFmlUpdate
*)pItem
;
150 // bestimme die Tabelle, in der das Attribut steht
151 const SwTableNode
* pTblNd
;
152 const SwNode
* pNd
= GetNodeOfFormula();
153 if( pNd
&& &pNd
->GetNodes() == &pNd
->GetDoc()->GetNodes() &&
154 0 != ( pTblNd
= pNd
->FindTableNode() ))
156 switch( pUpdtFld
->eFlags
)
159 // setze das Value-Flag zurueck
160 // JP 17.06.96: interne Darstellung auf alle Formeln
161 // (Referenzen auf andere Tabellen!!!)
162 // if( VF_CMD & pFld->GetFormat() )
163 // pFld->PtrToBoxNm( pUpdtFld->pTbl );
168 // ist es die gesuchte Tabelle ??
169 if( &pTblNd
->GetTable() == pUpdtFld
->pTbl
)
170 // zur externen Darstellung
171 PtrToBoxNm( pUpdtFld
->pTbl
);
174 // zur internen Darstellung
175 // JP 17.06.96: interne Darstellung auf alle Formeln
176 // (Referenzen auf andere Tabellen!!!)
177 BoxNmToPtr( &pTblNd
->GetTable() );
180 // ist es die gesuchte Tabelle ??
181 if( &pTblNd
->GetTable() == pUpdtFld
->pTbl
)
182 // zur relativen Darstellung
183 ToRelBoxNm( pUpdtFld
->pTbl
);
187 if( &pTblNd
->GetTable() == pUpdtFld
->pTbl
)
189 USHORT nLnPos
= SwTableFormula::GetLnPosInTbl(
190 pTblNd
->GetTable(), GetTableBox() );
191 pUpdtFld
->bBehindSplitLine
= USHRT_MAX
!= nLnPos
&&
192 pUpdtFld
->nSplitLine
<= nLnPos
;
195 pUpdtFld
->bBehindSplitLine
= FALSE
;
198 if( pUpdtFld
->pHistory
)
200 // fuer die History brauche ich aber die unveraenderte Formel
201 SwTblBoxFormula
aCopy( *this );
202 pUpdtFld
->bModified
= FALSE
;
203 ToSplitMergeBoxNm( *pUpdtFld
);
205 if( pUpdtFld
->bModified
)
207 // und dann in der externen Darstellung
208 aCopy
.PtrToBoxNm( &pTblNd
->GetTable() );
209 pUpdtFld
->pHistory
->Add( &aCopy
, &aCopy
,
210 pNd
->FindTableBoxStartNode()->GetIndex() );
214 ToSplitMergeBoxNm( *pUpdtFld
);
221 void SwTblBoxFormula::Calc( SwTblCalcPara
& rCalcPara
, double& rValue
)
223 if( !rCalcPara
.rCalc
.IsCalcError() ) // ist schon Fehler gesetzt ?
225 // erzeuge aus den BoxNamen die Pointer
226 BoxNmToPtr( rCalcPara
.pTbl
);
227 String
sFml( MakeFormel( rCalcPara
));
228 if( !rCalcPara
.rCalc
.IsCalcError() )
229 rValue
= rCalcPara
.rCalc
.Calculate( sFml
).GetDouble();
232 ChgValid( !rCalcPara
.IsStackOverFlow() ); // der Wert ist wieder gueltig
236 /*************************************************************************
238 *************************************************************************/
241 SwTblBoxValue::SwTblBoxValue()
242 : SfxPoolItem( RES_BOXATR_VALUE
), nValue( 0 )
247 SwTblBoxValue::SwTblBoxValue( const double nVal
)
248 : SfxPoolItem( RES_BOXATR_VALUE
), nValue( nVal
)
253 int SwTblBoxValue::operator==( const SfxPoolItem
& rAttr
) const
255 ASSERT( SfxPoolItem::operator==( rAttr
), "keine gleichen Attribute" );
256 return nValue
== ((SwTblBoxValue
&)rAttr
).nValue
;
260 SfxPoolItem
* SwTblBoxValue::Clone( SfxItemPool
* ) const
262 return new SwTblBoxValue( nValue
);