xref: /trunk/main/sc/source/core/tool/cellform.cxx (revision fe481f06)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26 // INCLUDE ---------------------------------------------------------------
27 
28 #include <sfx2/objsh.hxx>
29 #include <svl/smplhint.hxx>
30 #include <svl/zforlist.hxx>
31 #include <svl/zformat.hxx>
32 
33 #include "cellform.hxx"
34 #include "cell.hxx"
35 #include "document.hxx"
36 #include "formula/errorcodes.hxx"
37 #include "sc.hrc"
38 
39 // STATIC DATA -----------------------------------------------------------
40 
41 // Err527 Workaround
42 const ScFormulaCell* pLastFormulaTreeTop = 0;
43 
44 // -----------------------------------------------------------------------
45 
GetString(ScBaseCell * pCell,sal_uLong nFormat,String & rString,Color ** ppColor,SvNumberFormatter & rFormatter,sal_Bool bNullVals,sal_Bool bFormula,ScForceTextFmt eForceTextFmt)46 void ScCellFormat::GetString( ScBaseCell* pCell, sal_uLong nFormat, String& rString,
47 							  Color** ppColor, SvNumberFormatter& rFormatter,
48 							  sal_Bool bNullVals,
49 							  sal_Bool bFormula,
50 							  ScForceTextFmt eForceTextFmt )
51 {
52 	*ppColor = NULL;
53 	if (&rFormatter==NULL)
54 	{
55 		rString.Erase();
56 		return;
57 	}
58 
59 	CellType eType = pCell->GetCellType();
60 	switch(eType)
61 	{
62 		case CELLTYPE_STRING:
63 			{
64 				String aCellString;
65 				((ScStringCell*)pCell)->GetString( aCellString );
66 				rFormatter.GetOutputString( aCellString, nFormat, rString, ppColor );
67 			}
68 			break;
69 		case CELLTYPE_EDIT:
70 			{
71 				String aCellString;
72 				((ScEditCell*)pCell)->GetString( aCellString );
73 				rFormatter.GetOutputString( aCellString, nFormat, rString, ppColor );
74 			}
75 			break;
76 		case CELLTYPE_VALUE:
77 			{
78 				double nValue = ((ScValueCell*)pCell)->GetValue();
79 				if ( !bNullVals && nValue == 0.0 )
80 					rString.Erase();
81 				else
82 				{
83 					if( eForceTextFmt == ftCheck )
84 					{
85 						if( nFormat && rFormatter.IsTextFormat( nFormat ) )
86 							eForceTextFmt = ftForce;
87 					}
88 					if( eForceTextFmt == ftForce )
89 					{
90 						String aTemp;
91 						rFormatter.GetOutputString( nValue, 0, aTemp, ppColor );
92 						rFormatter.GetOutputString( aTemp, nFormat, rString, ppColor );
93 					}
94 					else
95 						rFormatter.GetOutputString( nValue, nFormat, rString, ppColor );
96 				}
97 			}
98 			break;
99 		case CELLTYPE_FORMULA:
100 			{
101 				ScFormulaCell*	pFCell = (ScFormulaCell*)pCell;
102 				if ( bFormula )
103 					pFCell->GetFormula( rString );
104 				else
105 				{
106 					// #62160# Ein via Interpreter gestartetes Makro, das hart
107 					// auf Formelzellen zugreift, bekommt einen CellText, auch
108 					// wenn dadurch ein weiterer Interpreter gestartet wird,
109 					// aber nicht wenn diese Zelle gerade interpretiert wird.
110 					// IdleCalc startet generell keine weiteren Interpreter,
111 					// um keine Err522 (zirkulaer) zu bekommen.
112 					if ( pFCell->GetDocument()->IsInInterpreter() &&
113 							(!pFCell->GetDocument()->GetMacroInterpretLevel()
114 							|| pFCell->IsRunning()) )
115 					{
116 						rString.AssignAscii( RTL_CONSTASCII_STRINGPARAM("...") );
117 					}
118 					else
119 					{
120 						sal_uInt16 nErrCode = pFCell->GetErrCode();
121 
122 						// erst nach dem Interpretieren (GetErrCode) das Zahlformat holen:
123 						if ( (nFormat % SV_COUNTRY_LANGUAGE_OFFSET) == 0 )
124 							nFormat = pFCell->GetStandardFormat( rFormatter,
125 								nFormat );
126 
127 						if (nErrCode != 0)
128 							rString = ScGlobal::GetErrorString(nErrCode);
129 						else if ( pFCell->IsEmptyDisplayedAsString() )
130                             rString.Erase();
131 						else if ( pFCell->IsValue() )
132 						{
133                             const SvNumberformat* pNumFmt = rFormatter.GetEntry( nFormat );
134                             const bool bHasTextFormatCode = pNumFmt != NULL && pNumFmt->HasTextFormatCode();
135                             if( pFCell->GetFormatType() == NUMBERFORMAT_LOGICAL && bHasTextFormatCode )
136 							{
137 								String aCellString;
138 								double fValue = pFCell->GetValue();
139 								if(fValue)
140 									aCellString = rFormatter.GetTrueString();
141 								else
142 									aCellString = rFormatter.GetFalseString();
143 								rFormatter.GetOutputString( aCellString, nFormat, rString, ppColor );
144 
145 							}
146 							else
147 							{
148 								double fValue = pFCell->GetValue();
149 								if ( !bNullVals && fValue == 0.0 )
150 									rString.Erase();
151 								else
152 									rFormatter.GetOutputString( fValue, nFormat, rString, ppColor );
153 							}
154 						}
155 						else
156 						{
157 							String aCellString;
158 							pFCell->GetString( aCellString );
159 							rFormatter.GetOutputString( aCellString, nFormat, rString, ppColor );
160 						}
161 					}
162 				}
163 			}
164 			break;
165 		default:
166 			rString.Erase();
167 			break;
168 	}
169 }
170 
GetInputString(ScBaseCell * pCell,sal_uLong nFormat,String & rString,SvNumberFormatter & rFormatter)171 void ScCellFormat::GetInputString( ScBaseCell* pCell, sal_uLong nFormat, String& rString,
172 									  SvNumberFormatter& rFormatter )
173 {
174 	if (&rFormatter==NULL)
175 	{
176 		rString.Erase();
177 		return;
178 	}
179 
180 	CellType eType = pCell->GetCellType();
181 	switch(eType)
182 	{
183 		case CELLTYPE_STRING:
184 			{
185 				((ScStringCell*)pCell)->GetString( rString );
186 			}
187 			break;
188 		case CELLTYPE_EDIT:
189 			{
190 				((ScEditCell*)pCell)->GetString( rString );
191 			}
192 			break;
193 		case CELLTYPE_VALUE:
194 			{
195 				double nValue = ((ScValueCell*)pCell)->GetValue();
196 				rFormatter.GetInputLineString( nValue, nFormat, rString );
197 			}
198 			break;
199 		case CELLTYPE_FORMULA:
200 			{
201 				if (((ScFormulaCell*)pCell)->IsEmptyDisplayedAsString())
202                 {
203                     rString.Erase();
204                 }
205                 else if (((ScFormulaCell*)pCell)->IsValue())
206 				{
207 					double nValue = ((ScFormulaCell*)pCell)->GetValue();
208 					rFormatter.GetInputLineString( nValue, nFormat, rString );
209 				}
210 				else
211 				{
212 					((ScFormulaCell*)pCell)->GetString( rString );
213 				}
214 
215 				sal_uInt16 nErrCode = ((ScFormulaCell*)pCell)->GetErrCode();
216 				if (nErrCode != 0)
217 				{
218 					rString.Erase();
219 				}
220 			}
221 			break;
222 		default:
223 			rString.Erase();
224 			break;
225 	}
226 }
227 
228 
229 
230