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_formula.hxx" 26 27 28 29 //---------------------------------------------------------------------------- 30 31 #include <svl/zforlist.hxx> 32 #include <svl/stritem.hxx> 33 34 #include "parawin.hxx" 35 #include "parawin.hrc" 36 #include "helpids.hrc" 37 #include "formula/formdata.hxx" 38 #include "formula/IFunctionDescription.hxx" 39 #include "ModuleHelper.hxx" 40 #include "ForResId.hrc" 41 42 #define VAR_ARGS 30 43 #define PAIRED_VAR_ARGS (VAR_ARGS + VAR_ARGS) 44 namespace formula 45 { 46 //============================================================================ 47 48 ParaWin::ParaWin(Window* pParent,IControlReferenceHandler* _pDlg,Point aPos): 49 TabPage (pParent,ModuleRes(RID_FORMULATAB_PARAMETER)), 50 pFuncDesc ( NULL ), 51 pMyParent (_pDlg), 52 aFtEditDesc ( this, ModuleRes( FT_EDITDESC ) ), 53 aFtArgName ( this, ModuleRes( FT_PARNAME ) ), 54 aFtArgDesc ( this, ModuleRes( FT_PARDESC ) ), 55 56 aBtnFx1 ( this, ModuleRes( BTN_FX1 ) ), 57 aFtArg1 ( this, ModuleRes( FT_ARG1 ) ), 58 aEdArg1 ( this, ModuleRes( ED_ARG1 ) ), 59 aRefBtn1 ( this, ModuleRes( RB_ARG1 ) ), 60 61 aBtnFx2 ( this, ModuleRes( BTN_FX2 ) ), 62 aFtArg2 ( this, ModuleRes( FT_ARG2 ) ), 63 aEdArg2 ( this, ModuleRes( ED_ARG2 ) ), 64 aRefBtn2 ( this, ModuleRes( RB_ARG2 ) ), 65 66 aBtnFx3 ( this, ModuleRes( BTN_FX3 ) ), 67 aFtArg3 ( this, ModuleRes( FT_ARG3 ) ), 68 aEdArg3 ( this, ModuleRes( ED_ARG3 ) ), 69 aRefBtn3 ( this, ModuleRes( RB_ARG3 ) ), 70 71 aBtnFx4 ( this, ModuleRes( BTN_FX4 ) ), 72 aFtArg4 ( this, ModuleRes( FT_ARG4 ) ), 73 aEdArg4 ( this, ModuleRes( ED_ARG4 ) ), 74 aRefBtn4 ( this, ModuleRes( RB_ARG4 ) ), 75 76 aSlider ( this, ModuleRes( WND_SLIDER ) ), 77 m_sOptional ( ModuleRes( STR_OPTIONAL ) ), 78 m_sRequired ( ModuleRes( STR_REQUIRED ) ), 79 bRefMode (sal_False) 80 { 81 Image aFxHC( ModuleRes( IMG_FX_H ) ); 82 FreeResource(); 83 aDefaultString=aFtEditDesc.GetText(); 84 85 SetPosPixel(aPos); 86 nEdFocus=NOT_FOUND; 87 nActiveLine=0; 88 Size aSize = aSlider.GetSizePixel(); 89 aSize.Width() = GetSettings().GetStyleSettings().GetScrollBarSize(); 90 aSlider.SetSizePixel( aSize ); 91 aSlider.SetEndScrollHdl( LINK( this, ParaWin, ScrollHdl ) ); 92 aSlider.SetScrollHdl( LINK( this, ParaWin, ScrollHdl ) ); 93 94 aBtnFx1.SetModeImage( aFxHC, BMP_COLOR_HIGHCONTRAST ); 95 aBtnFx2.SetModeImage( aFxHC, BMP_COLOR_HIGHCONTRAST ); 96 aBtnFx3.SetModeImage( aFxHC, BMP_COLOR_HIGHCONTRAST ); 97 aBtnFx4.SetModeImage( aFxHC, BMP_COLOR_HIGHCONTRAST ); 98 99 InitArgInput( 0, aFtArg1, aBtnFx1, aEdArg1, aRefBtn1); 100 InitArgInput( 1, aFtArg2, aBtnFx2, aEdArg2, aRefBtn2); 101 InitArgInput( 2, aFtArg3, aBtnFx3, aEdArg3, aRefBtn3); 102 InitArgInput( 3, aFtArg4, aBtnFx4, aEdArg4, aRefBtn4); 103 ClearAll(); 104 } 105 106 void ParaWin::UpdateArgDesc( sal_uInt16 nArg ) 107 { 108 if (nArg==NOT_FOUND) return; 109 110 if ( nArgs > 4 ) 111 nArg = sal::static_int_cast<sal_uInt16>( nArg + GetSliderPos() ); 112 //@ nArg += (sal_uInt16)aSlider.GetThumbPos(); 113 114 if ( (nArgs > 0) && (nArg<nArgs) ) 115 { 116 String aArgDesc; 117 String aArgName; 118 119 SetArgumentDesc( String() ); 120 SetArgumentText( String() ); 121 122 if ( nArgs < VAR_ARGS ) 123 { 124 sal_uInt16 nRealArg = (aVisibleArgMapping.size() < nArg) ? aVisibleArgMapping[nArg] : nArg; 125 aArgDesc = pFuncDesc->getParameterDescription(nRealArg); 126 aArgName = pFuncDesc->getParameterName(nRealArg); 127 aArgName += ' '; 128 aArgName += (pFuncDesc->isParameterOptional(nRealArg)) ? m_sOptional : m_sRequired ; 129 } 130 else if ( nArgs < PAIRED_VAR_ARGS ) 131 { 132 sal_uInt16 nFix = nArgs - VAR_ARGS; 133 sal_uInt16 nPos = ( nArg < nFix ? nArg : nFix ); 134 sal_uInt16 nRealArg = (nPos < aVisibleArgMapping.size() ? 135 aVisibleArgMapping[nPos] : aVisibleArgMapping.back()); 136 aArgDesc = pFuncDesc->getParameterDescription(nRealArg); 137 aArgName = pFuncDesc->getParameterName(nRealArg); 138 if ( nArg >= nFix ) 139 aArgName += String::CreateFromInt32(nArg-nFix+1); 140 aArgName += ' '; 141 142 aArgName += (nArg > nFix || pFuncDesc->isParameterOptional(nRealArg)) ? m_sOptional : m_sRequired ; 143 } 144 else 145 { 146 sal_uInt16 nFix = nArgs - PAIRED_VAR_ARGS; 147 sal_uInt16 nPos; 148 if ( nArg < nFix ) 149 nPos = nArg; 150 else 151 nPos = nFix + ( (nArg-nFix) % 2); 152 sal_uInt16 nRealArg = (nPos < aVisibleArgMapping.size() ? 153 aVisibleArgMapping[nPos] : aVisibleArgMapping.back()); 154 aArgDesc = pFuncDesc->getParameterDescription(nRealArg); 155 aArgName = pFuncDesc->getParameterName(nRealArg); 156 if ( nArg >= nFix ) 157 aArgName += String::CreateFromInt32((nArg-nFix)/2 + 1); 158 aArgName += ' '; 159 160 aArgName += (nArg > (nFix+1) || pFuncDesc->isParameterOptional(nRealArg)) ? m_sOptional : m_sRequired ; 161 } 162 163 SetArgumentDesc(aArgDesc); 164 SetArgumentText(aArgName); 165 } 166 } 167 168 void ParaWin::UpdateArgInput( sal_uInt16 nOffset, sal_uInt16 i ) 169 { 170 sal_uInt16 nArg = nOffset + i; 171 if ( nArgs < VAR_ARGS) 172 { 173 if(nArg<nArgs) 174 { 175 sal_uInt16 nRealArg = aVisibleArgMapping[nArg]; 176 SetArgNameFont (i,(pFuncDesc->isParameterOptional(nRealArg)) 177 ? aFntLight : aFntBold ); 178 SetArgName (i,pFuncDesc->getParameterName(nRealArg)); 179 } 180 } 181 else if ( nArgs < PAIRED_VAR_ARGS) 182 { 183 sal_uInt16 nFix = nArgs - VAR_ARGS; 184 sal_uInt16 nPos = ( nArg < nFix ? nArg : nFix ); 185 sal_uInt16 nRealArg = (nPos < aVisibleArgMapping.size() ? 186 aVisibleArgMapping[nPos] : aVisibleArgMapping.back()); 187 SetArgNameFont( i, 188 (nArg > nFix || pFuncDesc->isParameterOptional(nRealArg)) ? 189 aFntLight : aFntBold ); 190 if ( nArg >= nFix ) 191 { 192 String aArgName( pFuncDesc->getParameterName(nRealArg) ); 193 aArgName += String::CreateFromInt32(nArg-nFix+1); 194 SetArgName( i, aArgName ); 195 } 196 else 197 SetArgName( i, pFuncDesc->getParameterName(nRealArg) ); 198 } 199 else 200 { 201 sal_uInt16 nFix = nArgs - PAIRED_VAR_ARGS; 202 sal_uInt16 nPos; 203 if ( nArg < nFix ) 204 nPos = nArg; 205 else 206 nPos = nFix + ( (nArg-nFix) % 2); 207 sal_uInt16 nRealArg = (nPos < aVisibleArgMapping.size() ? 208 aVisibleArgMapping[nPos] : aVisibleArgMapping.back()); 209 SetArgNameFont( i, 210 (nArg > (nFix+1) || pFuncDesc->isParameterOptional(nRealArg)) ? 211 aFntLight : aFntBold ); 212 if ( nArg >= nFix ) 213 { 214 String aArgName( pFuncDesc->getParameterName(nRealArg) ); 215 aArgName += String::CreateFromInt32((nArg-nFix)/2 + 1); 216 SetArgName( i, aArgName ); 217 } 218 else 219 SetArgName( i, pFuncDesc->getParameterName(nRealArg) ); 220 } 221 if(nArg<nArgs) SetArgVal(i,aParaArray[nArg]); 222 //@ aArgInput[i].SetArgVal( *(pArgArr[nOffset+i]) ); 223 224 } 225 226 ParaWin::~ParaWin() 227 { 228 // #i66422# if the focus changes during destruction of the controls, 229 // don't call the focus handlers 230 Link aEmptyLink; 231 aBtnFx1.SetGetFocusHdl( aEmptyLink ); 232 aBtnFx2.SetGetFocusHdl( aEmptyLink ); 233 aBtnFx3.SetGetFocusHdl( aEmptyLink ); 234 aBtnFx4.SetGetFocusHdl( aEmptyLink ); 235 } 236 237 sal_uInt16 ParaWin::GetActiveLine() 238 { 239 return nActiveLine; 240 } 241 242 void ParaWin::SetActiveLine(sal_uInt16 no) 243 { 244 if(no<nArgs) 245 { 246 long nOffset = GetSliderPos(); 247 nActiveLine=no; 248 long nNewEdPos=(long)nActiveLine-nOffset; 249 if(nNewEdPos<0 || nNewEdPos>3) 250 { 251 nOffset+=nNewEdPos; 252 SetSliderPos((sal_uInt16) nOffset); 253 nOffset=GetSliderPos(); 254 } 255 nEdFocus=no-(sal_uInt16)nOffset; 256 UpdateArgDesc( nEdFocus ); 257 } 258 } 259 260 RefEdit* ParaWin::GetActiveEdit() 261 { 262 if(nArgs>0 && nEdFocus!=NOT_FOUND) 263 { 264 return aArgInput[nEdFocus].GetArgEdPtr(); 265 } 266 else 267 { 268 return NULL; 269 } 270 } 271 272 273 String ParaWin::GetArgument(sal_uInt16 no) 274 { 275 String aStr; 276 if(no<aParaArray.size()) 277 { 278 aStr=aParaArray[no]; 279 if(no==nActiveLine && aStr.Len()==0) 280 aStr+=' '; 281 } 282 return aStr; 283 } 284 285 String ParaWin::GetActiveArgName() 286 { 287 String aStr; 288 if(nArgs>0 && nEdFocus!=NOT_FOUND) 289 { 290 aStr=aArgInput[nEdFocus].GetArgName(); 291 } 292 return aStr; 293 } 294 295 296 void ParaWin::SetArgument(sal_uInt16 no, const String& aString) 297 { 298 if(no<aParaArray.size()) 299 { 300 aParaArray[no] = aString; 301 aParaArray[no].EraseLeadingChars(); 302 } 303 } 304 305 void ParaWin::DelParaArray() 306 { 307 ::std::vector<String>().swap(aParaArray); 308 } 309 310 void ParaWin::SetArgumentFonts(const Font&aBoldFont,const Font&aLightFont) 311 { 312 aFntBold=aBoldFont; 313 aFntLight=aLightFont; 314 } 315 316 void ParaWin::SetFunctionDesc(const IFunctionDescription* pFDesc) 317 { 318 pFuncDesc=pFDesc; 319 320 SetArgumentDesc( String() ); 321 SetArgumentText( String() ); 322 SetEditDesc( String() ); 323 nArgs = 0; 324 if ( pFuncDesc!=NULL) 325 { 326 if ( pFuncDesc->getDescription().getLength() ) 327 { 328 SetEditDesc(pFuncDesc->getDescription()); 329 } 330 else 331 { 332 SetEditDesc(aDefaultString); 333 } 334 nArgs = pFuncDesc->getSuppressedArgumentCount(); 335 pFuncDesc->fillVisibleArgumentMapping(aVisibleArgMapping); 336 aSlider.Hide(); 337 rtl::OString sHelpId = pFuncDesc->getHelpId(); 338 SetHelpId( sHelpId ); 339 aEdArg1.SetHelpId( sHelpId ); 340 aEdArg2.SetHelpId( sHelpId ); 341 aEdArg3.SetHelpId( sHelpId ); 342 aEdArg4.SetHelpId( sHelpId ); 343 344 // Unique-IDs muessen gleich bleiben fuer Automatisierung 345 SetUniqueId( HID_FORMULA_FAP_PAGE ); 346 aEdArg1.SetUniqueId( HID_FORMULA_FAP_EDIT1 ); 347 aEdArg2.SetUniqueId( HID_FORMULA_FAP_EDIT2 ); 348 aEdArg3.SetUniqueId( HID_FORMULA_FAP_EDIT3 ); 349 aEdArg4.SetUniqueId( HID_FORMULA_FAP_EDIT4 ); 350 SetActiveLine(0); 351 } 352 else 353 { 354 nActiveLine=0; 355 } 356 357 } 358 359 void ParaWin::SetArgumentText(const String& aText) 360 { 361 aFtArgName.SetText(aText); 362 } 363 364 void ParaWin::SetArgumentDesc(const String& aText) 365 { 366 aFtArgDesc.SetText(aText); 367 } 368 369 void ParaWin::SetEditDesc(const String& aText) 370 { 371 aFtEditDesc.SetText(aText); 372 } 373 374 void ParaWin::SetArgName(sal_uInt16 no,const String& aText) 375 { 376 aArgInput[no].SetArgName(aText); 377 aArgInput[no].UpdateAccessibleNames(); 378 } 379 380 void ParaWin::SetArgNameFont(sal_uInt16 no,const Font& aFont) 381 { 382 aArgInput[no].SetArgNameFont(aFont); 383 } 384 385 void ParaWin::SetArgVal(sal_uInt16 no,const String& aText) 386 { 387 aArgInput[no].SetArgVal(aText); 388 } 389 390 void ParaWin::HideParaLine(sal_uInt16 no) 391 { 392 aArgInput[no].Hide(); 393 } 394 395 void ParaWin::ShowParaLine(sal_uInt16 no) 396 { 397 aArgInput[no].Show(); 398 } 399 400 void ParaWin::SetEdFocus(sal_uInt16 no) 401 { 402 UpdateArgDesc(no); 403 if(no<4 && no<aParaArray.size()) 404 aArgInput[no].GetArgEdPtr()->GrabFocus(); 405 } 406 407 408 void ParaWin::InitArgInput( sal_uInt16 nPos, FixedText& rFtArg, ImageButton& rBtnFx, 409 ArgEdit& rEdArg, RefButton& rRefBtn) 410 { 411 412 rRefBtn.SetReferences(pMyParent,&rEdArg); 413 rEdArg.SetRefDialog(pMyParent); 414 415 aArgInput[nPos].InitArgInput (&rFtArg,&rBtnFx,&rEdArg,&rRefBtn); 416 417 aArgInput[nPos].Hide(); 418 419 aArgInput[nPos].SetFxClickHdl ( LINK( this, ParaWin, GetFxHdl ) ); 420 aArgInput[nPos].SetFxFocusHdl ( LINK( this, ParaWin, GetFxFocusHdl ) ); 421 aArgInput[nPos].SetEdFocusHdl ( LINK( this, ParaWin, GetEdFocusHdl ) ); 422 aArgInput[nPos].SetEdModifyHdl ( LINK( this, ParaWin, ModifyHdl ) ); 423 aArgInput[nPos].UpdateAccessibleNames(); 424 } 425 426 void ParaWin::ClearAll() 427 { 428 SetFunctionDesc(NULL); 429 SetArgumentOffset(0); 430 } 431 432 void ParaWin::SetArgumentOffset(sal_uInt16 nOffset) 433 { 434 DelParaArray(); 435 aSlider.SetThumbPos(0); 436 437 aParaArray.resize(nArgs); 438 439 if ( nArgs > 0 ) 440 { 441 for ( int i=0; i<4 && i<nArgs; i++ ) 442 { 443 String aString; 444 aArgInput[i].SetArgVal(aString); 445 aArgInput[i].GetArgEdPtr()->Init( 446 (i==0) ? (ArgEdit *)NULL : aArgInput[i-1].GetArgEdPtr(), 447 (i==3 || i==nArgs-1) ? (ArgEdit *)NULL : aArgInput[i+1].GetArgEdPtr(), 448 aSlider, nArgs ); 449 } 450 } 451 452 if ( nArgs < 5 ) 453 { 454 aSlider.Hide(); 455 } 456 else 457 { 458 //aSlider.SetEndScrollHdl( LINK( this, ScFormulaDlg, ScrollHdl ) ); 459 aSlider.SetPageSize( 4 ); 460 aSlider.SetVisibleSize( 4 ); 461 aSlider.SetLineSize( 1 ); 462 aSlider.SetRange( Range( 0, nArgs ) ); 463 aSlider.SetThumbPos( nOffset ); 464 aSlider.Show(); 465 } 466 467 UpdateParas(); 468 } 469 470 void ParaWin::UpdateParas() 471 { 472 sal_uInt16 i; 473 sal_uInt16 nOffset = GetSliderPos(); 474 475 if ( nArgs > 0 ) 476 { 477 for ( i=0; (i<nArgs) && (i<4); i++ ) 478 { 479 UpdateArgInput( nOffset, i ); 480 ShowParaLine(i); 481 } 482 } 483 484 for ( i=nArgs; i<4; i++ ) HideParaLine(i); 485 } 486 487 488 sal_uInt16 ParaWin::GetSliderPos() 489 { 490 return (sal_uInt16) aSlider.GetThumbPos(); 491 } 492 493 void ParaWin::SetSliderPos(sal_uInt16 nSliderPos) 494 { 495 sal_uInt16 nOffset = GetSliderPos(); 496 497 if(aSlider.IsVisible() && nOffset!=nSliderPos) 498 { 499 aSlider.SetThumbPos(nSliderPos); 500 for ( sal_uInt16 i=0; i<4; i++ ) 501 { 502 UpdateArgInput( nSliderPos, i ); 503 } 504 } 505 } 506 507 void ParaWin::SliderMoved() 508 { 509 sal_uInt16 nOffset = GetSliderPos(); 510 511 for ( sal_uInt16 i=0; i<4; i++ ) 512 { 513 UpdateArgInput( nOffset, i ); 514 } 515 if(nEdFocus!=NOT_FOUND) 516 { 517 UpdateArgDesc( nEdFocus ); 518 aArgInput[nEdFocus].SetArgSelection(Selection(0,SELECTION_MAX )); 519 nActiveLine=nEdFocus+nOffset; 520 ArgumentModified(); 521 aArgInput[nEdFocus].UpdateAccessibleNames(); 522 } 523 aScrollLink.Call(this); 524 } 525 526 void ParaWin::ArgumentModified() 527 { 528 aArgModifiedLink.Call(this); 529 } 530 531 void ParaWin::FxClick() 532 { 533 aFxLink.Call(this); 534 } 535 536 537 IMPL_LINK( ParaWin, GetFxHdl, ArgInput*, pPtr ) 538 { 539 sal_uInt16 nOffset = GetSliderPos(); 540 nEdFocus=NOT_FOUND; 541 for ( sal_uInt16 nPos=0; nPos<5;nPos++) 542 { 543 if(pPtr == &aArgInput[nPos]) 544 { 545 nEdFocus=nPos; 546 break; 547 } 548 } 549 550 if(nEdFocus!=NOT_FOUND) 551 { 552 aArgInput[nEdFocus].SetArgSelection(Selection(0,SELECTION_MAX )); 553 nActiveLine=nEdFocus+nOffset; 554 FxClick(); 555 } 556 return 0; 557 } 558 559 IMPL_LINK( ParaWin, GetFxFocusHdl, ArgInput*, pPtr ) 560 { 561 sal_uInt16 nOffset = GetSliderPos(); 562 nEdFocus=NOT_FOUND; 563 for ( sal_uInt16 nPos=0; nPos<5;nPos++) 564 { 565 if(pPtr == &aArgInput[nPos]) 566 { 567 nEdFocus=nPos; 568 break; 569 } 570 } 571 572 if(nEdFocus!=NOT_FOUND) 573 { 574 aArgInput[nEdFocus].SetArgSelection(Selection(0,SELECTION_MAX )); 575 UpdateArgDesc( nEdFocus ); 576 nActiveLine=nEdFocus+nOffset; 577 } 578 return 0; 579 } 580 581 582 583 IMPL_LINK( ParaWin, GetEdFocusHdl, ArgInput*, pPtr ) 584 { 585 sal_uInt16 nOffset = GetSliderPos(); 586 nEdFocus=NOT_FOUND; 587 for ( sal_uInt16 nPos=0; nPos<5;nPos++) 588 { 589 if(pPtr == &aArgInput[nPos]) 590 { 591 nEdFocus=nPos; 592 break; 593 } 594 } 595 596 if(nEdFocus!=NOT_FOUND) 597 { 598 aArgInput[nEdFocus].SetArgSelection(Selection(0,SELECTION_MAX )); 599 UpdateArgDesc( nEdFocus ); 600 nActiveLine=nEdFocus+nOffset; 601 ArgumentModified(); 602 aArgInput[nEdFocus].UpdateAccessibleNames(); 603 } 604 605 return 0; 606 } 607 608 609 IMPL_LINK( ParaWin, ScrollHdl, ScrollBar*, EMPTYARG ) 610 { 611 SliderMoved(); 612 613 return 0; 614 } 615 616 IMPL_LINK( ParaWin, ModifyHdl, ArgInput*, pPtr ) 617 { 618 sal_uInt16 nOffset = GetSliderPos(); 619 nEdFocus=NOT_FOUND; 620 for ( sal_uInt16 nPos=0; nPos<5;nPos++) 621 { 622 if(pPtr == &aArgInput[nPos]) 623 { 624 nEdFocus=nPos; 625 break; 626 } 627 } 628 if(nEdFocus!=NOT_FOUND) 629 { 630 aParaArray[nEdFocus+nOffset] = aArgInput[nEdFocus].GetArgVal(); 631 UpdateArgDesc( nEdFocus); 632 nActiveLine=nEdFocus+nOffset; 633 } 634 635 ArgumentModified(); 636 return 0; 637 } 638 639 640 641 } // formula 642