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_chart2.hxx" 26 #include "tp_Scale.hxx" 27 #include "tp_Scale.hrc" 28 29 #include "ResId.hxx" 30 #include "Strings.hrc" 31 #include "chartview/ChartSfxItemIds.hxx" 32 #include "NoWarningThisInCTOR.hxx" 33 #include "AxisHelper.hxx" 34 35 #ifndef _SVX_SVXIDS_HRC 36 #include <svx/svxids.hrc> 37 #endif 38 #include <rtl/math.hxx> 39 // header for class SvxDoubleItem 40 #include <svx/chrtitem.hxx> 41 // header for class SfxBoolItem 42 #include <svl/eitem.hxx> 43 // header for SfxInt32Item 44 #include <svl/intitem.hxx> 45 46 // header for class WarningBox 47 #include <vcl/msgbox.hxx> 48 49 // header for class SvNumberformat 50 #ifndef _ZFORMAT_HXX 51 #ifndef _ZFORLIST_DECLARE_TABLE 52 #define _ZFORLIST_DECLARE_TABLE 53 #endif 54 #include <svl/zformat.hxx> 55 #endif 56 57 #include <svtools/controldims.hrc> 58 59 #include <com/sun/star/chart2/AxisType.hpp> 60 61 using namespace ::com::sun::star; 62 63 //............................................................................. 64 namespace chart 65 { 66 //............................................................................. 67 68 namespace 69 { 70 71 void lcl_placeControlAtX( Control& rControl, long nNewXPos ) 72 { 73 Point aPos( rControl.GetPosPixel() ); 74 aPos.X() = nNewXPos; 75 rControl.SetPosPixel(aPos); 76 } 77 78 void lcl_placeControlAtY( Control& rControl, long nNewYPos ) 79 { 80 Point aPos( rControl.GetPosPixel() ); 81 aPos.Y() = nNewYPos; 82 rControl.SetPosPixel(aPos); 83 } 84 85 void lcl_shiftControls( Control& rEdit, Control& rAuto, long nNewXPos ) 86 { 87 Point aPos( rEdit.GetPosPixel() ); 88 long nShift = nNewXPos - aPos.X(); 89 aPos.X() = nNewXPos; 90 rEdit.SetPosPixel(aPos); 91 92 aPos = rAuto.GetPosPixel(); 93 aPos.X() += nShift; 94 rAuto.SetPosPixel(aPos); 95 } 96 97 long lcl_getLabelDistance( Control& rControl ) 98 { 99 return rControl.LogicToPixel( Size(RSC_SP_CTRL_DESC_X, 0), MapMode(MAP_APPFONT) ).Width(); 100 } 101 102 void lcl_setValue( FormattedField& rFmtField, double fValue ) 103 { 104 rFmtField.SetValue( fValue ); 105 rFmtField.SetDefaultValue( fValue ); 106 } 107 108 } 109 110 ScaleTabPage::ScaleTabPage(Window* pWindow,const SfxItemSet& rInAttrs) : 111 SfxTabPage(pWindow, SchResId(TP_SCALE), rInAttrs), 112 113 aFlScale(this, SchResId(FL_SCALE)), 114 115 aCbxReverse(this, SchResId(CBX_REVERSE)), 116 aCbxLogarithm(this, SchResId(CBX_LOGARITHM)), 117 118 m_aTxt_AxisType(this, SchResId (TXT_AXIS_TYPE)), 119 m_aLB_AxisType(this, SchResId(LB_AXIS_TYPE)), 120 121 aTxtMin (this, SchResId (TXT_MIN)), 122 aFmtFldMin(this, SchResId(EDT_MIN)), 123 aCbxAutoMin(this, SchResId(CBX_AUTO_MIN)), 124 125 aTxtMax(this, SchResId (TXT_MAX)), 126 aFmtFldMax(this, SchResId(EDT_MAX)), 127 aCbxAutoMax(this, SchResId(CBX_AUTO_MAX)), 128 129 m_aTxt_TimeResolution(this, SchResId (TXT_TIME_RESOLUTION)), 130 m_aLB_TimeResolution(this, SchResId(LB_TIME_RESOLUTION)), 131 m_aCbx_AutoTimeResolution(this, SchResId(CBX_AUTO_TIME_RESOLUTION)), 132 133 aTxtMain (this, SchResId (TXT_STEP_MAIN)), 134 aFmtFldStepMain(this, SchResId(EDT_STEP_MAIN)), 135 m_aMt_MainDateStep(this, SchResId(MT_MAIN_DATE_STEP)), 136 m_aLB_MainTimeUnit(this, SchResId(LB_MAIN_TIME_UNIT)), 137 aCbxAutoStepMain(this, SchResId(CBX_AUTO_STEP_MAIN)), 138 139 aTxtHelpCount (this, SchResId (TXT_STEP_HELP_COUNT)), 140 aTxtHelp (this, SchResId (TXT_STEP_HELP)), 141 aMtStepHelp (this, SchResId (MT_STEPHELP)), 142 m_aLB_HelpTimeUnit(this, SchResId(LB_HELP_TIME_UNIT)), 143 aCbxAutoStepHelp(this, SchResId(CBX_AUTO_STEP_HELP)), 144 145 aTxtOrigin (this, SchResId (TXT_ORIGIN)), 146 aFmtFldOrigin(this, SchResId(EDT_ORIGIN)), 147 aCbxAutoOrigin(this, SchResId(CBX_AUTO_ORIGIN)), 148 149 fMin(0.0), 150 fMax(0.0), 151 fStepMain(0.0), 152 nStepHelp(0), 153 fOrigin(0.0), 154 m_nTimeResolution(1), 155 m_nMainTimeUnit(1), 156 m_nHelpTimeUnit(1), 157 m_nAxisType(chart2::AxisType::REALNUMBER), 158 m_bAllowDateAxis(false), 159 pNumFormatter(NULL), 160 m_bShowAxisOrigin(false) 161 { 162 FreeResource(); 163 SetExchangeSupport(); 164 165 aCbxAutoMin.SetClickHdl(LINK(this, ScaleTabPage, EnableValueHdl)); 166 aCbxAutoMax.SetClickHdl(LINK(this, ScaleTabPage, EnableValueHdl)); 167 aCbxAutoStepMain.SetClickHdl(LINK(this, ScaleTabPage, EnableValueHdl)); 168 aCbxAutoStepHelp.SetClickHdl(LINK(this, ScaleTabPage, EnableValueHdl)); 169 aCbxAutoOrigin.SetClickHdl(LINK(this, ScaleTabPage, EnableValueHdl)); 170 m_aCbx_AutoTimeResolution.SetClickHdl(LINK(this, ScaleTabPage, EnableValueHdl)); 171 172 m_aLB_AxisType.SetDropDownLineCount(3); 173 m_aLB_AxisType.SetSelectHdl(LINK(this, ScaleTabPage, SelectAxisTypeHdl)); 174 175 m_aLB_TimeResolution.SetDropDownLineCount(3); 176 m_aLB_MainTimeUnit.SetDropDownLineCount(3); 177 m_aLB_HelpTimeUnit.SetDropDownLineCount(3); 178 179 aFmtFldMin.SetModifyHdl(LINK(this, ScaleTabPage, FmtFieldModifiedHdl)); 180 aFmtFldMax.SetModifyHdl(LINK(this, ScaleTabPage, FmtFieldModifiedHdl)); 181 aFmtFldStepMain.SetModifyHdl(LINK(this, ScaleTabPage, FmtFieldModifiedHdl)); 182 aFmtFldOrigin.SetModifyHdl(LINK(this, ScaleTabPage, FmtFieldModifiedHdl)); 183 } 184 185 IMPL_LINK( ScaleTabPage, FmtFieldModifiedHdl, FormattedField*, pFmtFied ) 186 { 187 if( pFmtFied ) 188 pFmtFied->SetDefaultValue( pFmtFied->GetValue() ); 189 return 0; 190 } 191 192 void ScaleTabPage::StateChanged( StateChangedType nType ) 193 { 194 TabPage::StateChanged( nType ); 195 196 if( nType == STATE_CHANGE_INITSHOW ) 197 AdjustControlPositions(); 198 } 199 200 void ScaleTabPage::AdjustControlPositions() 201 { 202 //optimize position of the controls 203 long nLabelWidth = ::std::max( aTxtMin.CalcMinimumSize().Width(), aTxtMax.CalcMinimumSize().Width() ); 204 nLabelWidth = ::std::max( aTxtMain.CalcMinimumSize().Width(), nLabelWidth ); 205 nLabelWidth = ::std::max( aTxtHelp.CalcMinimumSize().Width(), nLabelWidth ); 206 nLabelWidth = ::std::max( aTxtHelpCount.CalcMinimumSize().Width(), nLabelWidth ); 207 nLabelWidth = ::std::max( aTxtOrigin.CalcMinimumSize().Width(), nLabelWidth ); 208 nLabelWidth = ::std::max( m_aTxt_TimeResolution.CalcMinimumSize().Width(), nLabelWidth ); 209 nLabelWidth = ::std::max( m_aTxt_AxisType.CalcMinimumSize().Width(), nLabelWidth ); 210 nLabelWidth+=1; 211 212 long nLabelDistance = lcl_getLabelDistance(aTxtMin); 213 long nNewXPos = aTxtMin.GetPosPixel().X() + nLabelWidth + nLabelDistance; 214 215 //ensure that the auto checkboxes are wide enough and have correct size for calculation 216 aCbxAutoMin.SetSizePixel( aCbxAutoMin.CalcMinimumSize() ); 217 aCbxAutoMax.SetSizePixel( aCbxAutoMax.CalcMinimumSize() ); 218 aCbxAutoStepMain.SetSizePixel( aCbxAutoStepMain.CalcMinimumSize() ); 219 aCbxAutoStepHelp.SetSizePixel( aCbxAutoStepHelp.CalcMinimumSize() ); 220 aCbxAutoOrigin.SetSizePixel( aCbxAutoOrigin.CalcMinimumSize() ); 221 m_aCbx_AutoTimeResolution.SetSizePixel( m_aCbx_AutoTimeResolution.CalcMinimumSize() ); 222 223 //ensure new pos is ok 224 long nWidthOfOtherControls = m_aLB_MainTimeUnit.GetPosPixel().X() + m_aLB_MainTimeUnit.GetSizePixel().Width() - aFmtFldMin.GetPosPixel().X(); 225 long nDialogWidth = GetSizePixel().Width(); 226 227 long nLeftSpace = nDialogWidth - nNewXPos - nWidthOfOtherControls; 228 if(nLeftSpace>=0) 229 { 230 Size aSize( aTxtMin.GetSizePixel() ); 231 aSize.Width() = nLabelWidth; 232 aTxtMin.SetSizePixel(aSize); 233 aTxtMax.SetSizePixel(aSize); 234 aTxtMain.SetSizePixel(aSize); 235 aTxtHelp.SetSizePixel(aSize); 236 aTxtHelpCount.SetSizePixel(aSize); 237 aTxtOrigin.SetSizePixel(aSize); 238 m_aTxt_TimeResolution.SetSizePixel(aSize); 239 m_aTxt_AxisType.SetSizePixel(aSize); 240 241 long nOrgAutoCheckX = aCbxAutoMin.GetPosPixel().X(); 242 lcl_placeControlAtX( aCbxAutoStepMain, nOrgAutoCheckX ); 243 lcl_placeControlAtX( aCbxAutoStepHelp, nOrgAutoCheckX ); 244 245 lcl_shiftControls( aFmtFldMin, aCbxAutoMin, nNewXPos ); 246 lcl_shiftControls( aFmtFldMax, aCbxAutoMax, nNewXPos ); 247 lcl_shiftControls( aFmtFldStepMain, aCbxAutoStepMain, nNewXPos ); 248 lcl_placeControlAtX( m_aMt_MainDateStep, aFmtFldStepMain.GetPosPixel().X() ); 249 lcl_shiftControls( aMtStepHelp, aCbxAutoStepHelp, nNewXPos ); 250 lcl_shiftControls( aFmtFldOrigin, aCbxAutoOrigin, nNewXPos ); 251 lcl_shiftControls( m_aLB_TimeResolution, m_aCbx_AutoTimeResolution, nNewXPos ); 252 lcl_placeControlAtX( m_aLB_AxisType, nNewXPos ); 253 254 nNewXPos = aCbxAutoStepMain.GetPosPixel().X() + aCbxAutoStepMain.GetSizePixel().Width() + nLabelDistance; 255 lcl_placeControlAtX( m_aLB_MainTimeUnit, nNewXPos ); 256 lcl_placeControlAtX( m_aLB_HelpTimeUnit, nNewXPos ); 257 } 258 PlaceIntervalControlsAccordingToAxisType(); 259 } 260 261 void ScaleTabPage::PlaceIntervalControlsAccordingToAxisType() 262 { 263 long nMinX = std::min( aCbxAutoStepMain.GetPosPixel().X(), m_aLB_MainTimeUnit.GetPosPixel().X() ); 264 long nLabelDistance = lcl_getLabelDistance(aTxtMin); 265 long nListWidth = m_aLB_MainTimeUnit.GetSizePixel().Width(); 266 267 if( chart2::AxisType::DATE == m_nAxisType ) 268 { 269 lcl_placeControlAtX( m_aLB_MainTimeUnit, nMinX ); 270 lcl_placeControlAtX( m_aLB_HelpTimeUnit, nMinX ); 271 long nSecondX = nMinX + nListWidth + nLabelDistance; 272 lcl_placeControlAtX( aCbxAutoStepMain, nSecondX ); 273 lcl_placeControlAtX( aCbxAutoStepHelp, nSecondX ); 274 275 long nOne = m_aMt_MainDateStep.LogicToPixel( Size(0, 1), MapMode(MAP_APPFONT) ).Height(); 276 277 long nYMajor = m_aMt_MainDateStep.GetPosPixel().Y(); 278 lcl_placeControlAtY( aCbxAutoStepMain , nYMajor+(3*nOne)); 279 lcl_placeControlAtY( aTxtMain , nYMajor+nOne+nOne); 280 281 long nYMinor = m_aLB_HelpTimeUnit.GetPosPixel().Y(); 282 lcl_placeControlAtY( aMtStepHelp , nYMinor ); 283 lcl_placeControlAtY( aCbxAutoStepHelp , nYMinor+(3*nOne)); 284 } 285 else 286 { 287 lcl_placeControlAtX( aCbxAutoStepMain, nMinX ); 288 lcl_placeControlAtX( aCbxAutoStepHelp, nMinX ); 289 long nSecondX = nMinX + aCbxAutoStepMain.GetSizePixel().Width() + nLabelDistance; 290 long nSecondXMax = GetSizePixel().Width() - nListWidth; 291 if( nSecondX > nSecondXMax ) 292 nSecondX = nSecondXMax; 293 lcl_placeControlAtX( m_aLB_MainTimeUnit, nSecondX ); 294 lcl_placeControlAtX( m_aLB_HelpTimeUnit, nSecondX ); 295 } 296 } 297 298 void ScaleTabPage::EnableControls() 299 { 300 bool bValueAxis = chart2::AxisType::REALNUMBER == m_nAxisType || chart2::AxisType::PERCENT == m_nAxisType || chart2::AxisType::DATE == m_nAxisType; 301 bool bDateAxis = chart2::AxisType::DATE == m_nAxisType; 302 303 m_aTxt_AxisType.Show(m_bAllowDateAxis); 304 m_aLB_AxisType.Show(m_bAllowDateAxis); 305 306 aCbxLogarithm.Show( bValueAxis && !bDateAxis ); 307 aTxtMin.Show( bValueAxis ); 308 aFmtFldMin.Show( bValueAxis ); 309 aCbxAutoMin.Show( bValueAxis ); 310 aTxtMax.Show( bValueAxis ); 311 aFmtFldMax.Show( bValueAxis ); 312 aCbxAutoMax.Show( bValueAxis ); 313 aTxtMain.Show( bValueAxis ); 314 aFmtFldStepMain.Show( bValueAxis ); 315 aCbxAutoStepMain.Show( bValueAxis ); 316 aTxtHelp.Show( bValueAxis ); 317 aTxtHelpCount.Show( bValueAxis ); 318 aMtStepHelp.Show( bValueAxis ); 319 aCbxAutoStepHelp.Show( bValueAxis ); 320 321 aTxtOrigin.Show( m_bShowAxisOrigin && bValueAxis ); 322 aFmtFldOrigin.Show( m_bShowAxisOrigin && bValueAxis ); 323 aCbxAutoOrigin.Show( m_bShowAxisOrigin && bValueAxis ); 324 325 aTxtHelpCount.Show( bValueAxis && !bDateAxis ); 326 aTxtHelp.Show( bDateAxis ); 327 328 m_aTxt_TimeResolution.Show( bDateAxis ); 329 m_aLB_TimeResolution.Show( bDateAxis ); 330 m_aCbx_AutoTimeResolution.Show( bDateAxis ); 331 332 bool bWasDateAxis = m_aMt_MainDateStep.IsVisible(); 333 if( bWasDateAxis != bDateAxis ) 334 { 335 //transport value from one to other control 336 if( bWasDateAxis ) 337 lcl_setValue( aFmtFldStepMain, m_aMt_MainDateStep.GetValue() ); 338 else 339 m_aMt_MainDateStep.SetValue( static_cast<sal_Int32>(aFmtFldStepMain.GetValue()) ); 340 } 341 aFmtFldStepMain.Show( bValueAxis && !bDateAxis ); 342 m_aMt_MainDateStep.Show( bDateAxis ); 343 344 m_aLB_MainTimeUnit.Show( bDateAxis ); 345 m_aLB_HelpTimeUnit.Show( bDateAxis ); 346 347 EnableValueHdl(&aCbxAutoMin); 348 EnableValueHdl(&aCbxAutoMax); 349 EnableValueHdl(&aCbxAutoStepMain); 350 EnableValueHdl(&aCbxAutoStepHelp); 351 EnableValueHdl(&aCbxAutoOrigin); 352 EnableValueHdl(&m_aCbx_AutoTimeResolution); 353 } 354 355 IMPL_LINK( ScaleTabPage, EnableValueHdl, CheckBox *, pCbx ) 356 { 357 bool bEnable = pCbx && !pCbx->IsChecked() && pCbx->IsEnabled(); 358 if (pCbx == &aCbxAutoMin) 359 { 360 aFmtFldMin.Enable( bEnable ); 361 } 362 else if (pCbx == &aCbxAutoMax) 363 { 364 aFmtFldMax.Enable( bEnable ); 365 } 366 else if (pCbx == &aCbxAutoStepMain) 367 { 368 aFmtFldStepMain.Enable( bEnable ); 369 m_aMt_MainDateStep.Enable( bEnable ); 370 m_aLB_MainTimeUnit.Enable( bEnable ); 371 } 372 else if (pCbx == &aCbxAutoStepHelp) 373 { 374 aMtStepHelp.Enable( bEnable ); 375 m_aLB_HelpTimeUnit.Enable( bEnable ); 376 } 377 else if (pCbx == &m_aCbx_AutoTimeResolution) 378 { 379 m_aLB_TimeResolution.Enable( bEnable ); 380 } 381 else if (pCbx == &aCbxAutoOrigin) 382 { 383 aFmtFldOrigin.Enable( bEnable ); 384 } 385 return 0; 386 } 387 388 enum AxisTypeListBoxEntry 389 { 390 TYPE_AUTO=0, 391 TYPE_TEXT=1, 392 TYPE_DATE=2 393 }; 394 395 IMPL_LINK( ScaleTabPage, SelectAxisTypeHdl, void *, EMPTYARG ) 396 { 397 sal_uInt16 nPos = m_aLB_AxisType.GetSelectEntryPos(); 398 if( nPos==TYPE_DATE ) 399 m_nAxisType = chart2::AxisType::DATE; 400 else 401 m_nAxisType = chart2::AxisType::CATEGORY; 402 if( chart2::AxisType::DATE == m_nAxisType ) 403 aCbxLogarithm.Check(false); 404 EnableControls(); 405 PlaceIntervalControlsAccordingToAxisType(); 406 SetNumFormat(); 407 return 0; 408 } 409 410 SfxTabPage* ScaleTabPage::Create(Window* pWindow,const SfxItemSet& rOutAttrs) 411 { 412 return new ScaleTabPage(pWindow, rOutAttrs); 413 } 414 415 sal_Bool ScaleTabPage::FillItemSet(SfxItemSet& rOutAttrs) 416 { 417 DBG_ASSERT( pNumFormatter, "No NumberFormatter available" ); 418 419 rOutAttrs.Put(SfxInt32Item(SCHATTR_AXISTYPE, m_nAxisType)); 420 if(m_bAllowDateAxis) 421 rOutAttrs.Put(SfxBoolItem(SCHATTR_AXIS_AUTO_DATEAXIS, TYPE_AUTO==m_aLB_AxisType.GetSelectEntryPos())); 422 423 bool bAutoScale = false; 424 if( m_nAxisType==chart2::AxisType::CATEGORY ) 425 bAutoScale = true;//reset scaling for category charts 426 427 rOutAttrs.Put(SfxBoolItem(SCHATTR_AXIS_AUTO_MIN ,bAutoScale || aCbxAutoMin.IsChecked())); 428 rOutAttrs.Put(SfxBoolItem(SCHATTR_AXIS_AUTO_MAX ,bAutoScale || aCbxAutoMax.IsChecked())); 429 rOutAttrs.Put(SfxBoolItem(SCHATTR_AXIS_AUTO_STEP_HELP,bAutoScale || aCbxAutoStepHelp.IsChecked())); 430 rOutAttrs.Put(SfxBoolItem(SCHATTR_AXIS_AUTO_ORIGIN ,bAutoScale || aCbxAutoOrigin.IsChecked())); 431 rOutAttrs.Put(SfxBoolItem(SCHATTR_AXIS_LOGARITHM ,aCbxLogarithm.IsChecked())); 432 rOutAttrs.Put(SfxBoolItem(SCHATTR_AXIS_REVERSE ,aCbxReverse.IsChecked())); 433 rOutAttrs.Put(SvxDoubleItem(fMax , SCHATTR_AXIS_MAX)); 434 rOutAttrs.Put(SvxDoubleItem(fMin , SCHATTR_AXIS_MIN)); 435 rOutAttrs.Put(SfxInt32Item(SCHATTR_AXIS_STEP_HELP, nStepHelp)); 436 rOutAttrs.Put(SvxDoubleItem(fOrigin , SCHATTR_AXIS_ORIGIN)); 437 438 rOutAttrs.Put(SfxBoolItem(SCHATTR_AXIS_AUTO_STEP_MAIN,bAutoScale || aCbxAutoStepMain.IsChecked())); 439 rOutAttrs.Put(SvxDoubleItem(fStepMain,SCHATTR_AXIS_STEP_MAIN)); 440 441 rOutAttrs.Put(SfxBoolItem(SCHATTR_AXIS_AUTO_TIME_RESOLUTION,bAutoScale || m_aCbx_AutoTimeResolution.IsChecked())); 442 rOutAttrs.Put(SfxInt32Item(SCHATTR_AXIS_TIME_RESOLUTION,m_nTimeResolution)); 443 444 rOutAttrs.Put(SfxInt32Item(SCHATTR_AXIS_MAIN_TIME_UNIT,m_nMainTimeUnit)); 445 rOutAttrs.Put(SfxInt32Item(SCHATTR_AXIS_HELP_TIME_UNIT,m_nHelpTimeUnit)); 446 447 return sal_True; 448 } 449 450 void ScaleTabPage::Reset(const SfxItemSet& rInAttrs) 451 { 452 DBG_ASSERT( pNumFormatter, "No NumberFormatter available" ); 453 if(!pNumFormatter) 454 return; 455 456 const SfxPoolItem *pPoolItem = NULL; 457 if (rInAttrs.GetItemState(SCHATTR_AXIS_ALLOW_DATEAXIS, sal_True, &pPoolItem) == SFX_ITEM_SET) 458 m_bAllowDateAxis = (bool) ((const SfxBoolItem*)pPoolItem)->GetValue(); 459 m_nAxisType=chart2::AxisType::REALNUMBER; 460 if (rInAttrs.GetItemState(SCHATTR_AXISTYPE, sal_True, &pPoolItem) == SFX_ITEM_SET) 461 m_nAxisType = (int) ((const SfxInt32Item*)pPoolItem)->GetValue(); 462 if( m_nAxisType==chart2::AxisType::DATE && !m_bAllowDateAxis ) 463 m_nAxisType=chart2::AxisType::CATEGORY; 464 if( m_bAllowDateAxis ) 465 { 466 bool bAutoDateAxis = false; 467 if (rInAttrs.GetItemState(SCHATTR_AXIS_AUTO_DATEAXIS, sal_True, &pPoolItem) == SFX_ITEM_SET) 468 bAutoDateAxis = (bool) ((const SfxBoolItem*)pPoolItem)->GetValue(); 469 470 sal_uInt16 nPos = 0; 471 if( m_nAxisType==chart2::AxisType::DATE ) 472 nPos=TYPE_DATE; 473 else if( bAutoDateAxis ) 474 nPos=TYPE_AUTO; 475 else 476 nPos=TYPE_TEXT; 477 m_aLB_AxisType.SelectEntryPos( nPos ); 478 } 479 480 if( m_bAllowDateAxis ) 481 aCbxReverse.SetHelpId("chart2:CheckBox:TP_SCALE:CBX_REVERSE:MayBeDateAxis"); 482 else if( m_nAxisType==chart2::AxisType::CATEGORY || m_nAxisType==chart2::AxisType::SERIES ) 483 aCbxReverse.SetHelpId("chart2:CheckBox:TP_SCALE:CBX_REVERSE:Category"); 484 485 PlaceIntervalControlsAccordingToAxisType(); 486 487 aCbxAutoMin.Check( true ); 488 aCbxAutoMax.Check( true ); 489 aCbxAutoStepMain.Check( true ); 490 aCbxAutoStepHelp.Check( true ); 491 aCbxAutoOrigin.Check( true ); 492 m_aCbx_AutoTimeResolution.Check( true ); 493 494 if (rInAttrs.GetItemState(SCHATTR_AXIS_AUTO_MIN,sal_True,&pPoolItem) == SFX_ITEM_SET) 495 aCbxAutoMin.Check(((const SfxBoolItem*)pPoolItem)->GetValue()); 496 497 if (rInAttrs.GetItemState(SCHATTR_AXIS_MIN,sal_True, &pPoolItem) == SFX_ITEM_SET) 498 { 499 fMin = ((const SvxDoubleItem*)pPoolItem)->GetValue(); 500 lcl_setValue( aFmtFldMin, fMin ); 501 } 502 503 if (rInAttrs.GetItemState(SCHATTR_AXIS_AUTO_MAX,sal_True, &pPoolItem) == SFX_ITEM_SET) 504 aCbxAutoMax.Check(((const SfxBoolItem*)pPoolItem)->GetValue()); 505 506 if (rInAttrs.GetItemState(SCHATTR_AXIS_MAX,sal_True, &pPoolItem) == SFX_ITEM_SET) 507 { 508 fMax = ((const SvxDoubleItem*)pPoolItem)->GetValue(); 509 lcl_setValue( aFmtFldMax, fMax ); 510 } 511 512 if (rInAttrs.GetItemState(SCHATTR_AXIS_AUTO_STEP_MAIN,sal_True, &pPoolItem) == SFX_ITEM_SET) 513 aCbxAutoStepMain.Check(((const SfxBoolItem*)pPoolItem)->GetValue()); 514 515 if (rInAttrs.GetItemState(SCHATTR_AXIS_STEP_MAIN,sal_True, &pPoolItem) == SFX_ITEM_SET) 516 { 517 fStepMain = ((const SvxDoubleItem*)pPoolItem)->GetValue(); 518 lcl_setValue( aFmtFldStepMain, fStepMain ); 519 m_aMt_MainDateStep.SetValue( static_cast<sal_Int32>(fStepMain) ); 520 } 521 if (rInAttrs.GetItemState(SCHATTR_AXIS_AUTO_STEP_HELP,sal_True, &pPoolItem) == SFX_ITEM_SET) 522 aCbxAutoStepHelp.Check(((const SfxBoolItem*)pPoolItem)->GetValue()); 523 if (rInAttrs.GetItemState(SCHATTR_AXIS_LOGARITHM,sal_True, &pPoolItem) == SFX_ITEM_SET) 524 aCbxLogarithm.Check(((const SfxBoolItem*)pPoolItem)->GetValue()); 525 if (rInAttrs.GetItemState(SCHATTR_AXIS_REVERSE,sal_True, &pPoolItem) == SFX_ITEM_SET) 526 aCbxReverse.Check(((const SfxBoolItem*)pPoolItem)->GetValue()); 527 if (rInAttrs.GetItemState(SCHATTR_AXIS_STEP_HELP,sal_True, &pPoolItem) == SFX_ITEM_SET) 528 { 529 nStepHelp = ((const SfxInt32Item*)pPoolItem)->GetValue(); 530 aMtStepHelp.SetValue( nStepHelp ); 531 } 532 if (rInAttrs.GetItemState(SCHATTR_AXIS_AUTO_ORIGIN,sal_True, &pPoolItem) == SFX_ITEM_SET) 533 aCbxAutoOrigin.Check(((const SfxBoolItem*)pPoolItem)->GetValue()); 534 if (rInAttrs.GetItemState(SCHATTR_AXIS_ORIGIN,sal_True, &pPoolItem) == SFX_ITEM_SET) 535 { 536 fOrigin = ((const SvxDoubleItem*)pPoolItem)->GetValue(); 537 lcl_setValue( aFmtFldOrigin, fOrigin ); 538 } 539 540 if (rInAttrs.GetItemState(SCHATTR_AXIS_AUTO_TIME_RESOLUTION,sal_True, &pPoolItem) == SFX_ITEM_SET) 541 m_aCbx_AutoTimeResolution.Check(((const SfxBoolItem*)pPoolItem)->GetValue()); 542 if (rInAttrs.GetItemState(SCHATTR_AXIS_TIME_RESOLUTION,sal_True, &pPoolItem) == SFX_ITEM_SET) 543 { 544 m_nTimeResolution = ((const SfxInt32Item*)pPoolItem)->GetValue(); 545 m_aLB_TimeResolution.SelectEntryPos( m_nTimeResolution ); 546 } 547 548 if (rInAttrs.GetItemState(SCHATTR_AXIS_MAIN_TIME_UNIT,sal_True, &pPoolItem) == SFX_ITEM_SET) 549 { 550 m_nMainTimeUnit = ((const SfxInt32Item*)pPoolItem)->GetValue(); 551 m_aLB_MainTimeUnit.SelectEntryPos( m_nMainTimeUnit ); 552 } 553 if (rInAttrs.GetItemState(SCHATTR_AXIS_HELP_TIME_UNIT,sal_True, &pPoolItem) == SFX_ITEM_SET) 554 { 555 m_nHelpTimeUnit = ((const SfxInt32Item*)pPoolItem)->GetValue(); 556 m_aLB_HelpTimeUnit.SelectEntryPos( m_nHelpTimeUnit ); 557 } 558 559 EnableControls(); 560 SetNumFormat(); 561 } 562 563 int ScaleTabPage::DeactivatePage(SfxItemSet* pItemSet) 564 { 565 if( !pNumFormatter ) 566 { 567 DBG_ERROR( "No NumberFormatter available" ); 568 return LEAVE_PAGE; 569 } 570 571 bool bDateAxis = chart2::AxisType::DATE == m_nAxisType; 572 573 sal_uInt32 nIndex = pNumFormatter->GetStandardIndex(LANGUAGE_SYSTEM); 574 const SfxPoolItem *pPoolItem = NULL; 575 if( GetItemSet().GetItemState( SID_ATTR_NUMBERFORMAT_VALUE, sal_True, &pPoolItem ) == SFX_ITEM_SET ) 576 nIndex = static_cast< sal_uInt32 >( static_cast< const SfxInt32Item* >(pPoolItem)->GetValue()); 577 else 578 { 579 OSL_ENSURE( false, "Using Standard Language" ); 580 } 581 582 Control* pControl = NULL; 583 sal_uInt16 nErrStrId = 0; 584 double fDummy; 585 586 fMax = aFmtFldMax.GetValue(); 587 fMin = aFmtFldMin.GetValue(); 588 fOrigin = aFmtFldOrigin.GetValue(); 589 fStepMain = bDateAxis ? m_aMt_MainDateStep.GetValue() : aFmtFldStepMain.GetValue(); 590 nStepHelp = static_cast< sal_Int32 >( aMtStepHelp.GetValue()); 591 m_nTimeResolution = m_aLB_TimeResolution.GetSelectEntryPos(); 592 m_nMainTimeUnit = m_aLB_MainTimeUnit.GetSelectEntryPos(); 593 m_nHelpTimeUnit = m_aLB_HelpTimeUnit.GetSelectEntryPos(); 594 595 if( chart2::AxisType::REALNUMBER != m_nAxisType ) 596 aCbxLogarithm.Show( false ); 597 598 //check wich entries need user action 599 600 if ( aCbxLogarithm.IsChecked() && 601 ( ( !aCbxAutoMin.IsChecked() && fMin <= 0.0 ) 602 || ( !aCbxAutoMax.IsChecked() && fMax <= 0.0 ) ) ) 603 { 604 pControl = &aFmtFldMin; 605 nErrStrId = STR_BAD_LOGARITHM; 606 } 607 else if (!aCbxAutoMax.IsChecked() && !aCbxAutoMin.IsChecked() && 608 fMin >= fMax) 609 { 610 pControl = &aFmtFldMin; 611 nErrStrId = STR_MIN_GREATER_MAX; 612 } 613 else if (!aCbxAutoStepMain.IsChecked() && fStepMain <= 0) 614 { 615 pControl = &aFmtFldStepMain; 616 nErrStrId = STR_STEP_GT_ZERO; 617 } 618 // check for entries that cannot be parsed for the current number format 619 else if ( aFmtFldMin.IsModified() 620 && !aCbxAutoMin.IsChecked() 621 && !pNumFormatter->IsNumberFormat(aFmtFldMin.GetText(), nIndex, fDummy)) 622 { 623 pControl = &aFmtFldMin; 624 nErrStrId = STR_INVALID_NUMBER; 625 } 626 else if (aFmtFldMax.IsModified() && !aCbxAutoMax.IsChecked() && 627 !pNumFormatter->IsNumberFormat(aFmtFldMax.GetText(), 628 nIndex, fDummy)) 629 { 630 pControl = &aFmtFldMax; 631 nErrStrId = STR_INVALID_NUMBER; 632 } 633 else if ( !bDateAxis && aFmtFldStepMain.IsModified() && !aCbxAutoStepMain.IsChecked() && 634 !pNumFormatter->IsNumberFormat(aFmtFldStepMain.GetText(), 635 nIndex, fDummy)) 636 { 637 pControl = &aFmtFldStepMain; 638 nErrStrId = STR_STEP_GT_ZERO; 639 } 640 else if (aFmtFldOrigin.IsModified() && !aCbxAutoOrigin.IsChecked() && 641 !pNumFormatter->IsNumberFormat(aFmtFldOrigin.GetText(), 642 nIndex, fDummy)) 643 { 644 pControl = &aFmtFldOrigin; 645 nErrStrId = STR_INVALID_NUMBER; 646 } 647 else if (!aCbxAutoStepMain.IsChecked() && fStepMain <= 0.0) 648 { 649 pControl = &aFmtFldStepMain; 650 nErrStrId = STR_STEP_GT_ZERO; 651 } 652 else if( bDateAxis ) 653 { 654 if( !aCbxAutoStepMain.IsChecked() && !aCbxAutoStepHelp.IsChecked() ) 655 { 656 if( m_nHelpTimeUnit > m_nMainTimeUnit ) 657 { 658 pControl = &m_aLB_MainTimeUnit; 659 nErrStrId = STR_INVALID_INTERVALS; 660 } 661 else if( m_nHelpTimeUnit == m_nMainTimeUnit && nStepHelp > fStepMain ) 662 { 663 pControl = &m_aLB_MainTimeUnit; 664 nErrStrId = STR_INVALID_INTERVALS; 665 } 666 } 667 if( !nErrStrId && !m_aCbx_AutoTimeResolution.IsChecked() ) 668 { 669 if( (!aCbxAutoStepMain.IsChecked() && m_nTimeResolution > m_nMainTimeUnit ) 670 || 671 (!aCbxAutoStepHelp.IsChecked() && m_nTimeResolution > m_nHelpTimeUnit ) 672 ) 673 { 674 pControl = &m_aLB_TimeResolution; 675 nErrStrId = STR_INVALID_TIME_UNIT; 676 } 677 } 678 } 679 680 if( ShowWarning( nErrStrId, pControl ) ) 681 return KEEP_PAGE; 682 683 if( pItemSet ) 684 FillItemSet( *pItemSet ); 685 686 return LEAVE_PAGE; 687 } 688 689 void ScaleTabPage::SetNumFormatter( SvNumberFormatter* pFormatter ) 690 { 691 pNumFormatter = pFormatter; 692 aFmtFldMax.SetFormatter( pNumFormatter ); 693 aFmtFldMin.SetFormatter( pNumFormatter ); 694 aFmtFldStepMain.SetFormatter( pNumFormatter ); 695 aFmtFldOrigin.SetFormatter( pNumFormatter ); 696 697 // #101318#, #i6278# allow more decimal places than the output format. As 698 // the numbers shown in the edit fields are used for input, it makes more 699 // sense to display the values in the input format rather than the output 700 // format. 701 aFmtFldMax.UseInputStringForFormatting(); 702 aFmtFldMin.UseInputStringForFormatting(); 703 aFmtFldStepMain.UseInputStringForFormatting(); 704 aFmtFldOrigin.UseInputStringForFormatting(); 705 706 SetNumFormat(); 707 } 708 709 void ScaleTabPage::SetNumFormat() 710 { 711 const SfxPoolItem *pPoolItem = NULL; 712 713 if( GetItemSet().GetItemState( SID_ATTR_NUMBERFORMAT_VALUE, sal_True, &pPoolItem ) == SFX_ITEM_SET ) 714 { 715 sal_uLong nFmt = (sal_uLong)((const SfxInt32Item*)pPoolItem)->GetValue(); 716 717 aFmtFldMax.SetFormatKey( nFmt ); 718 aFmtFldMin.SetFormatKey( nFmt ); 719 aFmtFldOrigin.SetFormatKey( nFmt ); 720 721 if( pNumFormatter ) 722 { 723 short eType = pNumFormatter->GetType( nFmt ); 724 if( eType == NUMBERFORMAT_DATE ) 725 { 726 // for intervals use standard format for dates (so you can enter a number of days) 727 const SvNumberformat* pFormat = pNumFormatter->GetEntry( nFmt ); 728 if( pFormat ) 729 nFmt = pNumFormatter->GetStandardIndex( pFormat->GetLanguage()); 730 else 731 nFmt = pNumFormatter->GetStandardIndex(); 732 } 733 else if( eType == NUMBERFORMAT_DATETIME ) 734 { 735 // for intervals use time format for date times 736 const SvNumberformat* pFormat = pNumFormatter->GetEntry( nFmt ); 737 if( pFormat ) 738 nFmt = pNumFormatter->GetStandardFormat( NUMBERFORMAT_TIME, pFormat->GetLanguage() ); 739 else 740 nFmt = pNumFormatter->GetStandardFormat( NUMBERFORMAT_TIME ); 741 } 742 743 if( chart2::AxisType::DATE == m_nAxisType && ( eType != NUMBERFORMAT_DATE && eType != NUMBERFORMAT_DATETIME) ) 744 { 745 const SvNumberformat* pFormat = pNumFormatter->GetEntry( nFmt ); 746 if( pFormat ) 747 nFmt = pNumFormatter->GetStandardFormat( NUMBERFORMAT_DATE, pFormat->GetLanguage() ); 748 else 749 nFmt = pNumFormatter->GetStandardFormat( NUMBERFORMAT_DATE ); 750 751 aFmtFldMax.SetFormatKey( nFmt ); 752 aFmtFldMin.SetFormatKey( nFmt ); 753 aFmtFldOrigin.SetFormatKey( nFmt ); 754 } 755 } 756 757 aFmtFldStepMain.SetFormatKey( nFmt ); 758 } 759 } 760 761 void ScaleTabPage::ShowAxisOrigin( bool bShowOrigin ) 762 { 763 m_bShowAxisOrigin = bShowOrigin; 764 if( !AxisHelper::isAxisPositioningEnabled() ) 765 m_bShowAxisOrigin = true; 766 } 767 768 bool ScaleTabPage::ShowWarning( sal_uInt16 nResIdMessage, Control* pControl /* = NULL */ ) 769 { 770 if( nResIdMessage == 0 ) 771 return false; 772 773 WarningBox( this, WinBits( WB_OK ), String( SchResId( nResIdMessage ))).Execute(); 774 if( pControl ) 775 { 776 pControl->GrabFocus(); 777 Edit* pEdit = dynamic_cast<Edit*>(pControl); 778 if(pEdit) 779 pEdit->SetSelection( Selection( 0, SELECTION_MAX )); 780 } 781 return true; 782 } 783 784 //............................................................................. 785 } //namespace chart 786 //............................................................................. 787