merge the formfield patch from ooo-build
[ooovba.git] / sw / source / core / attr / cellatr.cxx
blob9f548bfae74eb3742f94da4e9e338be1fad5ddfa
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: cellatr.cxx,v $
10 * $Revision: 1.7 $
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"
36 #include <float.h>
37 #include <hintids.hxx> // fuer RES_..
38 #include <cellatr.hxx>
39 #include <calc.hxx>
40 #include <format.hxx>
41 #include <doc.hxx>
42 #include <swtable.hxx>
43 #include <node.hxx>
44 #include <hints.hxx>
45 #include <rolbck.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 ),
85 pDefinedIn( 0 )
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 );
103 return pNew;
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;
115 if( pDefinedIn )
117 SwClient* pBox = SwClientIter( *pDefinedIn ).First( TYPE( SwTableBox ));
118 if( pBox )
119 pRet = ((SwTableBox*)pBox)->GetSttNd();
121 return pRet;
125 SwTableBox* SwTblBoxFormula::GetTableBox()
127 SwTableBox* pBox = 0;
128 if( pDefinedIn )
129 pBox = (SwTableBox*)SwClientIter( *pDefinedIn ).
130 First( TYPE( SwTableBox ));
131 return pBox;
135 void SwTblBoxFormula::ChangeState( const SfxPoolItem* pItem )
137 if( !pDefinedIn )
138 return ;
140 SwTableFmlUpdate* pUpdtFld;
141 if( !pItem || RES_TABLEFML_UPDATE != pItem->Which() )
143 // setze bei allen das Value-Flag zurueck
144 ChgValid( FALSE );
145 return ;
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 )
158 case TBL_CALC:
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 );
164 // else
165 ChgValid( FALSE );
166 break;
167 case TBL_BOXNAME:
168 // ist es die gesuchte Tabelle ??
169 if( &pTblNd->GetTable() == pUpdtFld->pTbl )
170 // zur externen Darstellung
171 PtrToBoxNm( pUpdtFld->pTbl );
172 break;
173 case TBL_BOXPTR:
174 // zur internen Darstellung
175 // JP 17.06.96: interne Darstellung auf alle Formeln
176 // (Referenzen auf andere Tabellen!!!)
177 BoxNmToPtr( &pTblNd->GetTable() );
178 break;
179 case TBL_RELBOXNAME:
180 // ist es die gesuchte Tabelle ??
181 if( &pTblNd->GetTable() == pUpdtFld->pTbl )
182 // zur relativen Darstellung
183 ToRelBoxNm( pUpdtFld->pTbl );
184 break;
186 case TBL_SPLITTBL:
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;
194 else
195 pUpdtFld->bBehindSplitLine = FALSE;
196 // kein break
197 case TBL_MERGETBL:
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() );
213 else
214 ToSplitMergeBoxNm( *pUpdtFld );
215 break;
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();
230 else
231 rValue = DBL_MAX;
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 );