xref: /trunk/main/sc/source/ui/optdlg/tpcalc.cxx (revision a479921a)
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_scui.hxx"
26 
27 
28 
29 
30 //------------------------------------------------------------------
31 
32 #include "scitems.hxx"
33 #include <vcl/msgbox.hxx>
34 
35 #include "global.hxx"
36 #include "globstr.hrc"
37 #include "uiitems.hxx"
38 #include "docsh.hxx"
39 #include "document.hxx"
40 #include "docoptio.hxx"
41 #include "scresid.hxx"
42 #include "sc.hrc"       // -> Slot-IDs
43 #include "optdlg.hrc"
44 
45 #define _TPCALC_CXX
46 #include "tpcalc.hxx"
47 #undef _TPCALC_CXX
48 
49 #include <math.h>
50 
51 // STATIC DATA -----------------------------------------------------------
52 
53 static sal_uInt16 pCalcOptRanges[] =
54 {
55 	SID_SCDOCOPTIONS,
56 	SID_SCDOCOPTIONS,
57 	0
58 };
59 
60 //========================================================================
61 
ScTpCalcOptions(Window * pParent,const SfxItemSet & rCoreAttrs)62 ScTpCalcOptions::ScTpCalcOptions( Window*			pParent,
63 								  const SfxItemSet& rCoreAttrs )
64 
65 	:	SfxTabPage		( pParent,
66 						  ScResId( RID_SCPAGE_CALC ),
67 						  rCoreAttrs ),
68 
69 		aGbZRefs		( this, ScResId( GB_ZREFS ) ),
70 		aBtnIterate 	( this, ScResId( BTN_ITERATE ) ),
71 		aFtSteps		( this, ScResId( FT_STEPS ) ),
72 		aEdSteps		( this, ScResId( ED_STEPS ) ),
73 		aFtEps			( this, ScResId( FT_EPS ) ),
74 		aEdEps			( this, ScResId( ED_EPS ) ),
75         aSeparatorFL    ( this, ScResId( FL_SEPARATOR ) ),
76 		aGbDate 		( this, ScResId( GB_DATE ) ),
77 		aBtnDateStd 	( this, ScResId( BTN_DATESTD ) ),
78 		aBtnDateSc10	( this, ScResId( BTN_DATESC10 ) ),
79 		aBtnDate1904	( this, ScResId( BTN_DATE1904 ) ),
80         aHSeparatorFL   ( this, ScResId( FL_H_SEPARATOR ) ),
81 		aBtnCase	 	( this, ScResId( BTN_CASE ) ),
82 		aBtnCalc	 	( this, ScResId( BTN_CALC ) ),
83 		aBtnMatch	 	( this, ScResId( BTN_MATCH ) ),
84         aBtnRegex       ( this, ScResId( BTN_REGEX ) ),
85 		aBtnLookUp   	( this, ScResId( BTN_LOOKUP ) ),
86         aBtnGeneralPrec ( this, ScResId( BTN_GENERAL_PREC ) ),
87 		aFtPrec 		( this, ScResId( FT_PREC ) ),
88 		aEdPrec 		( this, ScResId( ED_PREC ) ),
89 		pOldOptions 	( new ScDocOptions(
90 							((const ScTpCalcItem&)rCoreAttrs.Get(
91 								GetWhich( SID_SCDOCOPTIONS ))).
92 									GetDocOptions() ) ),
93 		pLocalOptions	( new ScDocOptions ),
94 		nWhichCalc		( GetWhich( SID_SCDOCOPTIONS ) )
95 {
96     aSeparatorFL.SetStyle( aSeparatorFL.GetStyle() | WB_VERT );
97     Init();
98 	FreeResource();
99 	SetExchangeSupport();
100 }
101 
102 //-----------------------------------------------------------------------
103 
~ScTpCalcOptions()104 __EXPORT ScTpCalcOptions::~ScTpCalcOptions()
105 {
106 	delete pOldOptions;
107 	delete pLocalOptions;
108 }
109 
110 //-----------------------------------------------------------------------
111 
Init()112 void ScTpCalcOptions::Init()
113 {
114     const Size a6Size = aFtPrec.LogicToPixel( Size( 6, 6 ), MAP_APPFONT );
115     const Size aMin = aFtPrec.CalcMinimumSize();
116     const Point aPos = aFtPrec.GetPosPixel();
117     const long nNewX = aPos.X() + aFtPrec.GetSizePixel().Width() - aMin.Width();
118 
119     aFtPrec.SetPosPixel( Point( nNewX, aPos.Y() ) );
120     aFtPrec.SetSizePixel( aMin );
121     aBtnGeneralPrec.SetSizePixel( Size(
122         nNewX - a6Size.Width() - aBtnGeneralPrec.GetPosPixel().X(),
123         aBtnGeneralPrec.GetSizePixel().Height() ) );
124 
125 	aBtnIterate .SetClickHdl( LINK( this, ScTpCalcOptions, CheckClickHdl ) );
126     aBtnGeneralPrec.SetClickHdl( LINK(this, ScTpCalcOptions, CheckClickHdl) );
127 	aBtnDateStd .SetClickHdl( LINK( this, ScTpCalcOptions, RadioClickHdl ) );
128 	aBtnDateSc10.SetClickHdl( LINK( this, ScTpCalcOptions, RadioClickHdl ) );
129 	aBtnDate1904.SetClickHdl( LINK( this, ScTpCalcOptions, RadioClickHdl ) );
130 }
131 
132 //-----------------------------------------------------------------------
133 
GetRanges()134 sal_uInt16* __EXPORT ScTpCalcOptions::GetRanges()
135 {
136 	return pCalcOptRanges;
137 }
138 
139 //-----------------------------------------------------------------------
140 
Create(Window * pParent,const SfxItemSet & rAttrSet)141 SfxTabPage* __EXPORT ScTpCalcOptions::Create( Window* pParent, const SfxItemSet& rAttrSet )
142 {
143 	return ( new ScTpCalcOptions( pParent, rAttrSet ) );
144 }
145 
146 //-----------------------------------------------------------------------
147 
Reset(const SfxItemSet &)148 void __EXPORT ScTpCalcOptions::Reset( const SfxItemSet& /* rCoreAttrs */ )
149 {
150 	sal_uInt16	d,m,y;
151 
152 	*pLocalOptions	= *pOldOptions;
153 
154 	aBtnCase   .Check( !pLocalOptions->IsIgnoreCase() );
155 	aBtnCalc   .Check( pLocalOptions->IsCalcAsShown() );
156 	aBtnMatch  .Check( pLocalOptions->IsMatchWholeCell() );
157     aBtnRegex  .Check( pLocalOptions->IsFormulaRegexEnabled() );
158 	aBtnLookUp .Check( pLocalOptions->IsLookUpColRowNames() );
159 	aBtnIterate.Check( pLocalOptions->IsIter() );
160 	aEdSteps   .SetValue( pLocalOptions->GetIterCount() );
161     aEdEps     .SetValue( pLocalOptions->GetIterEps(), 6 );
162 
163 	pLocalOptions->GetDate( d, m, y );
164 
165 	switch ( y )
166 	{
167 		case 1899:
168 			aBtnDateStd.Check();
169 			break;
170 		case 1900:
171 			aBtnDateSc10.Check();
172 			break;
173 		case 1904:
174 			aBtnDate1904.Check();
175 			break;
176 	}
177 
178     sal_uInt16 nPrec = pLocalOptions->GetStdPrecision();
179     if (nPrec == SvNumberFormatter::UNLIMITED_PRECISION)
180     {
181         aFtPrec.Disable();
182         aEdPrec.Disable();
183         aBtnGeneralPrec.Check(false);
184     }
185     else
186     {
187         aBtnGeneralPrec.Check();
188         aFtPrec.Enable();
189         aEdPrec.Enable();
190         aEdPrec.SetValue(nPrec);
191     }
192 
193 	CheckClickHdl( &aBtnIterate );
194 }
195 
196 
197 //-----------------------------------------------------------------------
198 
FillItemSet(SfxItemSet & rCoreAttrs)199 sal_Bool __EXPORT ScTpCalcOptions::FillItemSet( SfxItemSet& rCoreAttrs )
200 {
201 	// alle weiteren Optionen werden in den Handlern aktualisiert
202 	pLocalOptions->SetIterCount( (sal_uInt16)aEdSteps.GetValue() );
203 	pLocalOptions->SetIgnoreCase( !aBtnCase.IsChecked() );
204 	pLocalOptions->SetCalcAsShown( aBtnCalc.IsChecked() );
205 	pLocalOptions->SetMatchWholeCell( aBtnMatch.IsChecked() );
206     pLocalOptions->SetFormulaRegexEnabled( aBtnRegex.IsChecked() );
207 	pLocalOptions->SetLookUpColRowNames( aBtnLookUp.IsChecked() );
208 
209     if (aBtnGeneralPrec.IsChecked())
210         pLocalOptions->SetStdPrecision(
211             static_cast<sal_uInt16>(aEdPrec.GetValue()) );
212     else
213         pLocalOptions->SetStdPrecision( SvNumberFormatter::UNLIMITED_PRECISION );
214 
215 	if ( *pLocalOptions != *pOldOptions )
216 	{
217 		rCoreAttrs.Put( ScTpCalcItem( nWhichCalc, *pLocalOptions ) );
218 		return sal_True;
219 	}
220 	else
221 		return sal_False;
222 }
223 
224 //------------------------------------------------------------------------
225 
DeactivatePage(SfxItemSet * pSetP)226 int __EXPORT ScTpCalcOptions::DeactivatePage( SfxItemSet* pSetP )
227 {
228     int nReturn = KEEP_PAGE;
229 
230     double fEps;
231     if( aEdEps.GetValue( fEps ) && (fEps > 0.0) )
232     {
233         pLocalOptions->SetIterEps( fEps );
234         nReturn = LEAVE_PAGE;
235     }
236 
237 	if ( nReturn == KEEP_PAGE )
238 	{
239 		ErrorBox( this,
240 				  WinBits( WB_OK | WB_DEF_OK ),
241 				  ScGlobal::GetRscString( STR_INVALID_EPS )
242 				).Execute();
243 
244 		aEdEps.GrabFocus();
245 	}
246     else if ( pSetP )
247         FillItemSet( *pSetP );
248 
249 	return nReturn;
250 }
251 
252 //-----------------------------------------------------------------------
253 // Handler:
254 
IMPL_LINK(ScTpCalcOptions,RadioClickHdl,RadioButton *,pBtn)255 IMPL_LINK( ScTpCalcOptions, RadioClickHdl, RadioButton*, pBtn )
256 {
257 	if ( pBtn == &aBtnDateStd )
258 	{
259 		pLocalOptions->SetDate( 30, 12, 1899 );
260 	}
261 	else if ( pBtn == &aBtnDateSc10 )
262 	{
263 		pLocalOptions->SetDate( 1, 1, 1900 );
264 	}
265 	else if ( pBtn == &aBtnDate1904 )
266 	{
267 		pLocalOptions->SetDate( 1, 1, 1904 );
268 	}
269 
270 	return 0;
271 }
272 
273 //-----------------------------------------------------------------------
274 
IMPL_LINK(ScTpCalcOptions,CheckClickHdl,CheckBox *,pBtn)275 IMPL_LINK( ScTpCalcOptions, CheckClickHdl, CheckBox*, pBtn )
276 {
277     if (pBtn == &aBtnGeneralPrec)
278 	{
279         if (pBtn->IsChecked())
280         {
281             aEdPrec.Enable();
282             aFtPrec.Enable();
283         }
284         else
285         {
286             aEdPrec.Disable();
287             aFtPrec.Disable();
288         }
289 	}
290     else if (pBtn == &aBtnIterate)
291 	{
292         if ( pBtn->IsChecked() )
293         {
294             pLocalOptions->SetIter( sal_True );
295             aFtSteps.Enable();	aEdSteps.Enable();
296             aFtEps	.Enable();	aEdEps	.Enable();
297         }
298         else
299         {
300             pLocalOptions->SetIter( sal_False );
301             aFtSteps.Disable(); aEdSteps.Disable();
302             aFtEps	.Disable(); aEdEps	.Disable();
303         }
304 	}
305 
306 	return 0;
307 }
308 
309 
310 
311 
312