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 27 28 29 // INCLUDE --------------------------------------------------------------- 30 31 #include <editeng/editview.hxx> 32 #include <sfx2/bindings.hxx> 33 #include <sfx2/dispatch.hxx> 34 #include <sfx2/objsh.hxx> 35 #include <sfx2/viewsh.hxx> 36 37 #include "sc.hrc" 38 #include "global.hxx" // ScAddress 39 #include "scresid.hxx" 40 #include "reffact.hxx" 41 #include "document.hxx" 42 #include "cell.hxx" 43 #include "scmod.hxx" 44 #include "inputhdl.hxx" 45 #include "tabvwsh.hxx" 46 #include "appoptio.hxx" 47 #include "compiler.hxx" 48 49 #include "dwfunctr.hrc" 50 #include "dwfunctr.hxx" 51 52 // ----------------------------------------------------------------------- 53 54 #define ARG_SEPERATOR String("; ") 55 SFX_IMPL_DOCKINGWINDOW( ScFunctionChildWindow, FID_FUNCTION_BOX ) 56 57 /************************************************************************* 58 #* Member: ScFunctionChildWindow Datum:06.10.97 59 #*------------------------------------------------------------------------ 60 #* 61 #* Klasse: ScFunctionChildWindow 62 #* 63 #* Funktion: Konstruktor der Klasse ScFunctionChildWindow 64 #* Ableitung vom SfxChildWindow als "Behaelter" fuer 65 #* Funktions- Fenster in Clac 66 #* 67 #* Input: --- 68 #* 69 #* Output: --- 70 #* 71 #************************************************************************/ 72 73 __EXPORT ScFunctionChildWindow::ScFunctionChildWindow( Window* pParentP, 74 sal_uInt16 nId, 75 SfxBindings* pBindings, 76 SfxChildWinInfo* pInfo ) : 77 SfxChildWindow( pParentP, nId ) 78 { 79 ScFunctionDockWin* pWin = new ScFunctionDockWin( pBindings, this, 80 pParentP, ScResId( FID_FUNCTION_BOX ) ); 81 pWindow = pWin; 82 83 eChildAlignment = SFX_ALIGN_RIGHT; 84 85 pWin->Initialize( pInfo ); 86 } 87 88 /************************************************************************* 89 #* Member: ScFunctionDockWin Datum:06.10.97 90 #*------------------------------------------------------------------------ 91 #* 92 #* Klasse: ScFunctionDockWin 93 #* 94 #* Funktion: Konstruktor der Klasse ScFunctionDockWin 95 #* 96 #* Input: Sfx- Verknuepfungen, Fenster, Resource 97 #* 98 #* Output: --- 99 #* 100 #************************************************************************/ 101 102 ScFunctionDockWin::ScFunctionDockWin( SfxBindings* pBindingsP, 103 SfxChildWindow *pCW, Window* pParent, const ResId& rResId ) : 104 105 SfxDockingWindow( pBindingsP, pCW, pParent, rResId ), 106 aPrivatSplit ( this, ResId( FT_SPLIT, *rResId.GetResMgr() ),SC_SPLIT_VERT), 107 aCatBox ( this, ResId( CB_CAT, *rResId.GetResMgr() ) ), 108 aFuncList ( this, ResId( LB_FUNC, *rResId.GetResMgr() ) ), 109 aDDFuncList ( this, ResId( DDLB_FUNC, *rResId.GetResMgr() ) ), 110 aInsertButton ( this, ResId( IMB_INSERT, *rResId.GetResMgr() ) ), 111 aFiFuncDesc ( this, ResId( FI_FUNCDESC, *rResId.GetResMgr() ) ), 112 aOldSize (0,0) 113 { 114 FreeResource(); 115 InitLRUList(); 116 SetStyle(GetStyle()|WB_CLIPCHILDREN); 117 118 aTimer.SetTimeout(200); 119 aTimer.SetTimeoutHdl(LINK( this, ScFunctionDockWin, TimerHdl)); 120 121 if (pCW != NULL) 122 eSfxNewAlignment=GetAlignment(); 123 else 124 eSfxNewAlignment=SFX_ALIGN_RIGHT; 125 eSfxOldAlignment=eSfxNewAlignment; 126 aFiFuncDesc.SetUpdateMode(sal_True); 127 pAllFuncList=&aFuncList; 128 aDDFuncList.Disable(); 129 aDDFuncList.Hide(); 130 nArgs=0; 131 nDockMode=0; 132 bSizeFlag=sal_False; 133 aCatBox.SetDropDownLineCount(9); 134 Font aFont=aFiFuncDesc.GetFont(); 135 aFont.SetColor(Color(COL_BLACK)); 136 aFiFuncDesc.SetFont(aFont); 137 aFiFuncDesc.SetBackground( GetBackground() ); //! never transparent? 138 //? SetBackground(); 139 140 Link aLink=LINK( this, ScFunctionDockWin, SelHdl); 141 aCatBox.SetSelectHdl(aLink); 142 aFuncList.SetSelectHdl(aLink); 143 aDDFuncList.SetSelectHdl(aLink); 144 145 Link a2Link=LINK( this, ScFunctionDockWin, SetSelectionHdl); 146 aFuncList.SetDoubleClickHdl(a2Link); 147 aDDFuncList.SetSelectHdl(aLink); 148 aInsertButton.SetClickHdl(a2Link); 149 150 Link a3Link=LINK( this, ScFunctionDockWin, SetSplitHdl); 151 aPrivatSplit.SetCtrModifiedHdl(a3Link); 152 StartListening( *pBindingsP, sal_True ); 153 154 Point aTopLeft=aCatBox.GetPosPixel(); 155 //String aString=aCatBox.GetEntry( 0)+String("www"); 156 String aString=String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("ww")); 157 Size aTxtSize( aFiFuncDesc.GetTextWidth(aString), aFiFuncDesc.GetTextHeight() ); 158 nMinWidth=aTxtSize.Width()+aTopLeft.X() 159 +2*aFuncList.GetPosPixel().X(); 160 nMinHeight=19*aTxtSize.Height(); 161 aCatBox.SelectEntryPos(0); 162 163 Range aYRange(3*aTxtSize.Height()+aFuncList.GetPosPixel().Y(), 164 GetOutputSizePixel().Height()-2*aTxtSize.Height()); 165 aPrivatSplit.SetYRange(aYRange); 166 SelHdl(&aCatBox); 167 bInit=sal_True; 168 } 169 170 /************************************************************************* 171 #* Member: ScFunctionDockWin Datum:06.10.97 172 #*------------------------------------------------------------------------ 173 #* 174 #* Klasse: ScFunctionDockWin 175 #* 176 #* Funktion: Destruktor der Klasse ScFunctionDockWin 177 #* 178 #* Input: --- 179 #* 180 #* Output: --- 181 #* 182 #************************************************************************/ 183 184 __EXPORT ScFunctionDockWin::~ScFunctionDockWin() 185 { 186 EndListening( GetBindings() ); 187 } 188 189 /************************************************************************* 190 #* Member: UpdateFunctionList Datum:06.10.97 191 #*------------------------------------------------------------------------ 192 #* 193 #* Klasse: ScFunctionDockWin 194 #* 195 #* Funktion: Aktualisiert die Liste der Funktionen ab- 196 #* haengig von der eingestellten Kategorie. 197 #* 198 #* Input: --- 199 #* 200 #* Output: --- 201 #* 202 #************************************************************************/ 203 204 void ScFunctionDockWin::InitLRUList() 205 { 206 const ScAppOptions& rAppOpt = SC_MOD()->GetAppOptions(); 207 sal_uInt16 nLRUFuncCount = Min( rAppOpt.GetLRUFuncListCount(), (sal_uInt16)LRU_MAX ); 208 sal_uInt16* pLRUListIds = rAppOpt.GetLRUFuncList(); 209 210 sal_uInt16 i; 211 for ( i=0; i<LRU_MAX; i++ ) 212 aLRUList[i] = NULL; 213 214 if ( pLRUListIds ) 215 { 216 ScFunctionMgr* pFuncMgr = ScGlobal::GetStarCalcFunctionMgr(); 217 for ( i=0; i<nLRUFuncCount; i++ ) 218 aLRUList[i] = pFuncMgr->Get( pLRUListIds[i] ); 219 } 220 221 sal_uInt16 nSelPos = aCatBox.GetSelectEntryPos(); 222 223 if(nSelPos == 0) 224 UpdateFunctionList(); 225 } 226 227 /************************************************************************* 228 #* Member: UpdateFunctionList Datum:10.12.99 229 #*------------------------------------------------------------------------ 230 #* 231 #* Klasse: ScFunctionDockWin 232 #* 233 #* Funktion: Aktualisiert die Liste der zuletzt verwendeten Funktionen. 234 #* 235 #* Input: --- 236 #* 237 #* Output: --- 238 #* 239 #************************************************************************/ 240 241 void ScFunctionDockWin::UpdateLRUList() 242 { 243 if (pFuncDesc && pFuncDesc->nFIndex!=0) 244 { 245 ScModule* pScMod = SC_MOD(); 246 pScMod->InsertEntryToLRUList(pFuncDesc->nFIndex); 247 } 248 } 249 250 251 /************************************************************************* 252 #* Member: SetSize Datum:06.10.97 253 #*------------------------------------------------------------------------ 254 #* 255 #* Klasse: ScFunctionDockWin 256 #* 257 #* Funktion: Groesse fuer die einzelnen Controls einzustellen. 258 #* 259 #* Input: --- 260 #* 261 #* Output: --- 262 #* 263 #************************************************************************/ 264 265 void ScFunctionDockWin::SetSize() 266 { 267 sal_uInt16 nSelEntry=0; 268 SfxChildAlignment aChildAlign=eSfxOldAlignment;//GetAlignment(); 269 short nNewDockMode; 270 switch(aChildAlign) 271 { 272 case SFX_ALIGN_HIGHESTTOP: 273 case SFX_ALIGN_TOP: 274 case SFX_ALIGN_LOWESTTOP: 275 case SFX_ALIGN_LOWESTBOTTOM: 276 case SFX_ALIGN_BOTTOM: 277 case SFX_ALIGN_TOOLBOXTOP: 278 case SFX_ALIGN_TOOLBOXBOTTOM: 279 280 281 nNewDockMode=1; 282 if(nDockMode!=nNewDockMode) 283 { 284 nDockMode=nNewDockMode; 285 nSelEntry=aFuncList.GetSelectEntryPos(); 286 aFuncList.Clear(); 287 aFiFuncDesc.SetPosPixel(aFuncList.GetPosPixel()); 288 aDDFuncList.Enable(); 289 aDDFuncList.Show(); 290 aPrivatSplit.Disable(); 291 aPrivatSplit.Hide(); 292 aFuncList.Disable(); 293 aFuncList.Hide(); 294 pAllFuncList=&aDDFuncList; 295 SelHdl(&aCatBox); 296 aDDFuncList.SelectEntryPos(nSelEntry); 297 } 298 break; 299 300 default: nNewDockMode=0; 301 if(nDockMode!=nNewDockMode) 302 { 303 nDockMode=nNewDockMode; 304 nSelEntry=aDDFuncList.GetSelectEntryPos(); 305 aDDFuncList.Clear(); 306 aDDFuncList.Disable(); 307 aDDFuncList.Hide(); 308 aPrivatSplit.Enable(); 309 aPrivatSplit.Show(); 310 aFuncList.Enable(); 311 aFuncList.Show(); 312 pAllFuncList=&aFuncList; 313 SelHdl(&aCatBox); 314 aFuncList.SelectEntryPos(nSelEntry); 315 } 316 break; 317 } 318 319 if(nDockMode==0) 320 { 321 SetLeftRightSize(); 322 } 323 else 324 { 325 SetTopBottonSize(); 326 } 327 } 328 /************************************************************************* 329 #* Member: SetLeftRightSize Datum:15.10.97 330 #*------------------------------------------------------------------------ 331 #* 332 #* Klasse: ScFunctionDockWin 333 #* 334 #* Funktion: Groesse fuer die einzelnen Controls einstellen, 335 #* wenn Links oder Rechts angedockt wird. 336 #* 337 #* Input: --- 338 #* 339 #* Output: --- 340 #* 341 #************************************************************************/ 342 343 void ScFunctionDockWin::SetLeftRightSize() 344 { 345 if(bSizeFlag==sal_False) 346 { 347 bSizeFlag=sal_True; 348 349 Size aDiffSize=GetSizePixel(); 350 Size aNewSize=GetOutputSizePixel(); 351 aDiffSize.Width()-=aNewSize.Width(); 352 aDiffSize.Height()-=aNewSize.Height(); 353 354 //@ SetUpdateMode( sal_False); 355 356 String aString = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("ww")); 357 358 Size aTxtSize( aFuncList.GetTextWidth(aString), aFuncList.GetTextHeight() ); 359 360 Range aYRange(3*aTxtSize.Height()+aFuncList.GetPosPixel().Y(), 361 GetOutputSizePixel().Height()-2*aTxtSize.Height()); 362 aPrivatSplit.SetYRange(aYRange); 363 364 365 if(aOldSize.Width()!=aNewSize.Width()) 366 SetMyWidthLeRi(aNewSize); 367 368 if(aOldSize.Height()!=aNewSize.Height()) 369 SetMyHeightLeRi(aNewSize); 370 371 aOldSize=aNewSize; 372 aNewSize.Width()+=aDiffSize.Width(); 373 aNewSize.Height()+=aDiffSize.Height(); 374 //SetSizePixel(aNewSize); 375 //@ SetUpdateMode( sal_True); 376 bSizeFlag=sal_False; 377 } 378 379 } 380 /************************************************************************* 381 #* Member: SetTopBottonSize Datum:15.10.97 382 #*------------------------------------------------------------------------ 383 #* 384 #* Klasse: ScFunctionDockWin 385 #* 386 #* Funktion: Groesse fuer die einzelnen Controls einzustellen. 387 #* wenn oben oder unten angedockt wird. 388 #* 389 #* Input: --- 390 #* 391 #* Output: --- 392 #* 393 #************************************************************************/ 394 395 void ScFunctionDockWin::SetTopBottonSize() 396 { 397 if(bSizeFlag==sal_False) 398 { 399 bSizeFlag=sal_True; 400 Size aDiffSize=GetSizePixel(); 401 Size aNewSize=GetOutputSizePixel(); 402 aDiffSize.Width()-=aNewSize.Width(); 403 aDiffSize.Height()-=aNewSize.Height(); 404 405 SetMyWidthToBo(aNewSize); 406 SetMyHeightToBo(aNewSize); 407 408 aNewSize.Width()+=aDiffSize.Width(); 409 aNewSize.Height()+=aDiffSize.Height(); 410 //SetSizePixel(aNewSize); 411 //@ SetUpdateMode( sal_True); 412 bSizeFlag=sal_False; 413 } 414 } 415 416 /************************************************************************* 417 #* Member: SetMyWidthLeRi Datum:15.10.97 418 #*------------------------------------------------------------------------ 419 #* 420 #* Klasse: ScFunctionDockWin 421 #* 422 #* Funktion: Breite fuer die einzelnen Controls und 423 #* das Fenster einstellen,wenn Li oder Re 424 #* 425 #* Input: neue Fenstergroesse 426 #* 427 #* Output: --- 428 #* 429 #************************************************************************/ 430 431 void ScFunctionDockWin::SetMyWidthLeRi(Size &aNewSize) 432 { 433 if((sal_uLong)aNewSize.Width()<nMinWidth) aNewSize.Width()=nMinWidth; 434 435 Size aCDSize=aCatBox.GetSizePixel(); 436 Size aFLSize=aFuncList.GetSizePixel(); 437 Size aSplitterSize=aPrivatSplit.GetSizePixel(); 438 Size aFDSize=aFiFuncDesc.GetSizePixel(); 439 440 Point aCDTopLeft=aCatBox.GetPosPixel(); 441 Point aFLTopLeft=aFuncList.GetPosPixel(); 442 Point aSplitterTopLeft=aPrivatSplit.GetPosPixel(); 443 Point aFDTopLeft=aFiFuncDesc.GetPosPixel(); 444 445 aCDSize.Width()=aNewSize.Width()-aCDTopLeft.X()-aFLTopLeft.X(); 446 aFLSize.Width()=aNewSize.Width()-2*aFLTopLeft.X(); 447 aFDSize.Width()=aFLSize.Width(); 448 aSplitterSize.Width()=aFLSize.Width(); 449 450 aCatBox.SetSizePixel(aCDSize); 451 aFuncList.SetSizePixel(aFLSize); 452 aPrivatSplit.SetSizePixel(aSplitterSize); 453 aFiFuncDesc.SetSizePixel(aFDSize); 454 } 455 456 /************************************************************************* 457 #* Member: SetHeight Datum:06.10.97 458 #*------------------------------------------------------------------------ 459 #* 460 #* Klasse: ScFunctionDockWin 461 #* 462 #* Funktion: Hoehe fuer die einzelnen Controls und 463 #* das Fenster einstellen bei Li oder Re 464 #* 465 #* Input: neue Fenstergroesse 466 #* 467 #* Output: --- 468 #* 469 #************************************************************************/ 470 471 void ScFunctionDockWin::SetMyHeightLeRi(Size &aNewSize) 472 { 473 if((sal_uLong)aNewSize.Height()<nMinHeight) aNewSize.Height()=nMinHeight; 474 475 Size aFLSize=aFuncList.GetSizePixel(); 476 Size aSplitterSize=aPrivatSplit.GetSizePixel(); 477 Size aFDSize=aFiFuncDesc.GetSizePixel(); 478 479 Point aFLTopLeft=aFuncList.GetPosPixel(); 480 Point aSplitterTopLeft=aPrivatSplit.GetPosPixel(); 481 Point aFDTopLeft=aFiFuncDesc.GetPosPixel(); 482 483 long nTxtHeight = aFuncList.GetTextHeight(); 484 485 short nY=(short)(3*nTxtHeight+ 486 aFuncList.GetPosPixel().Y()+aSplitterSize.Height()); 487 488 aFDTopLeft.Y()=aNewSize.Height()-aFDSize.Height()-4; 489 if(nY>aFDTopLeft.Y()) 490 { 491 aFDSize.Height()-=nY-aFDTopLeft.Y(); 492 aFDTopLeft.Y()=nY; 493 } 494 aSplitterTopLeft.Y()=aFDTopLeft.Y()-aSplitterSize.Height()-1; 495 aFLSize.Height()=aSplitterTopLeft.Y()-aFLTopLeft.Y()-1; 496 497 aFuncList.SetSizePixel(aFLSize); 498 aPrivatSplit.SetPosPixel(aSplitterTopLeft); 499 aFiFuncDesc.SetPosPixel(aFDTopLeft); 500 aFiFuncDesc.SetSizePixel(aFDSize); 501 502 } 503 504 /************************************************************************* 505 #* Member: SetMyWidthToBo Datum:16.10.97 506 #*------------------------------------------------------------------------ 507 #* 508 #* Klasse: ScFunctionDockWin 509 #* 510 #* Funktion: Breite fuer die einzelnen Controls und 511 #* das Fenster einstellen, wenn oben oder 512 #* unten angedockt werden soll. 513 #* 514 #* Input: neue Fenstergroesse 515 #* 516 #* Output: --- 517 #* 518 #************************************************************************/ 519 520 void ScFunctionDockWin::SetMyWidthToBo(Size &aNewSize) 521 { 522 if((sal_uLong)aNewSize.Width()<nMinWidth) aNewSize.Width()=nMinWidth; 523 524 Size aCDSize=aCatBox.GetSizePixel(); 525 Size aDdFLSize=aDDFuncList.GetSizePixel(); 526 Size aFDSize=aFiFuncDesc.GetSizePixel(); 527 528 Point aCDTopLeft=aCatBox.GetPosPixel(); 529 Point aDdFLTopLeft=aDDFuncList.GetPosPixel(); 530 Point aFDTopLeft=aFiFuncDesc.GetPosPixel(); 531 532 aCDSize.Width()=aDdFLTopLeft.X()-aFDTopLeft.X()-aCDTopLeft.X(); 533 aDdFLTopLeft.X()=aCDSize.Width()+aCDTopLeft.X()+aFDTopLeft.X(); 534 535 aDdFLSize.Width()=aNewSize.Width()-aDdFLTopLeft.X()-aFDTopLeft.X(); 536 537 aFDSize.Width()=aNewSize.Width()-2*aFDTopLeft.X(); 538 539 aDDFuncList.SetPosPixel(aDdFLTopLeft); 540 aDDFuncList.SetSizePixel(aDdFLSize); 541 aCatBox.SetSizePixel(aCDSize); 542 aFiFuncDesc.SetSizePixel(aFDSize); 543 } 544 545 /************************************************************************* 546 #* Member: SetHeight Datum:16.10.97 547 #*------------------------------------------------------------------------ 548 #* 549 #* Klasse: ScFunctionDockWin 550 #* 551 #* Funktion: Hoehe fuer die einzelnen Controls und 552 #* das Fenster einstellen, wenn oben oder 553 #* unten angedockt werden soll. 554 #* 555 #* Input: neue Fenstergroesse 556 #* 557 #* Output: --- 558 #* 559 #************************************************************************/ 560 561 void ScFunctionDockWin::SetMyHeightToBo(Size &aNewSize) 562 { 563 if((sal_uLong)aNewSize.Height()<nMinHeight) aNewSize.Height()=nMinHeight; 564 565 Size aFDSize=aFiFuncDesc.GetSizePixel(); 566 567 Point aFDTopLeft=aFiFuncDesc.GetPosPixel(); 568 Point aCBTopLeft=aCatBox.GetPosPixel(); 569 aFDSize.Height()=aNewSize.Height()-aFDTopLeft.Y()-aCBTopLeft.Y(); 570 aFiFuncDesc.SetSizePixel(aFDSize); 571 572 } 573 574 /************************************************************************* 575 #* Member: SetDescription Datum:13.10.97 576 #*------------------------------------------------------------------------ 577 #* 578 #* Klasse: ScFunctionDockWin 579 #* 580 #* Funktion: Erklaerungstext fuer die Funktion einstellen. 581 #* 582 #* Input: --- 583 #* 584 #* Output: --- 585 #* 586 #************************************************************************/ 587 588 void ScFunctionDockWin::SetDescription() 589 { 590 aFiFuncDesc.SetText( EMPTY_STRING ); 591 const ScFuncDesc* pDesc = 592 (const ScFuncDesc*)pAllFuncList->GetEntryData( 593 pAllFuncList->GetSelectEntryPos() ); 594 if (pDesc) 595 { 596 pDesc->initArgumentInfo(); // full argument info is needed 597 598 String aString=pAllFuncList->GetSelectEntry(); 599 if(nDockMode==0) 600 { 601 aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( ":\n\n" )); 602 } 603 else 604 { 605 aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( ": " )); 606 } 607 608 aString+=pDesc->GetParamList(); 609 610 if(nDockMode==0) 611 { 612 aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "\n\n" )); 613 } 614 else 615 { 616 aString += '\n'; 617 } 618 619 aString+=*(pDesc->pFuncDesc); 620 621 aFiFuncDesc.SetText(aString); 622 aFiFuncDesc.StateChanged(STATE_CHANGE_TEXT); 623 aFiFuncDesc.Invalidate(); 624 aFiFuncDesc.Update(); 625 626 } 627 } 628 629 /************************************************************************* 630 #* Member: Resizing Datum:06.10.97 631 #*------------------------------------------------------------------------ 632 #* 633 #* Klasse: ScFunctionDockWin 634 #* 635 #* Funktion: Ueberladene Funktion um die Groesse der 636 #* einzelnen Controls einzustellen. 637 #* 638 #* Input: neue Groesse 639 #* 640 #* Output: --- 641 #* 642 #************************************************************************/ 643 644 void __EXPORT ScFunctionDockWin::Resizing( Size& rNewSize ) 645 { 646 if((sal_uLong)rNewSize.Width()<nMinWidth) rNewSize.Width()=nMinWidth; 647 if((sal_uLong)rNewSize.Height()<nMinHeight) rNewSize.Height()=nMinHeight; 648 649 } 650 651 /************************************************************************* 652 #* Member: Close Datum:07.10.97 653 #*------------------------------------------------------------------------ 654 #* 655 #* Klasse: ScFunctionDockWin 656 #* 657 #* Funktion: Schliessen des Fensters 658 #* 659 #* Input: --- 660 #* 661 #* Output: TRUE 662 #* 663 #************************************************************************/ 664 665 sal_Bool __EXPORT ScFunctionDockWin::Close() 666 { 667 SfxBoolItem aItem( FID_FUNCTION_BOX, sal_False ); 668 669 GetBindings().GetDispatcher()->Execute( FID_FUNCTION_BOX, 670 SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, 671 &aItem, 0L ); 672 673 SfxDockingWindow::Close(); 674 675 return( sal_True ); 676 } 677 678 679 /************************************************************************* 680 #* Member: CheckAlignment Datum:16.10.97 681 #*------------------------------------------------------------------------ 682 #* 683 #* Klasse: ScFunctionDockWin 684 #* 685 #* Funktion: Ueberprueft den Andockmodus und stellt die 686 #* Groessen dementsprechend ein. 687 #* 688 #* Input: Das neue Alignment 689 #* 690 #* Output: Das uebergebene Alignment 691 #* 692 #************************************************************************/ 693 SfxChildAlignment __EXPORT ScFunctionDockWin::CheckAlignment(SfxChildAlignment /* abla */, 694 SfxChildAlignment aChildAlign) 695 { 696 String aString = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("ww")); 697 Size aTxtSize( aFiFuncDesc.GetTextWidth(aString), aFiFuncDesc.GetTextHeight() ); 698 if(!bInit) 699 { 700 eSfxOldAlignment=eSfxNewAlignment; 701 eSfxNewAlignment=aChildAlign; 702 } 703 else 704 { 705 bInit=sal_False; 706 eSfxOldAlignment=aChildAlign; 707 eSfxNewAlignment=aChildAlign; 708 } 709 710 switch(eSfxOldAlignment) 711 { 712 case SFX_ALIGN_HIGHESTTOP: 713 case SFX_ALIGN_TOP: 714 case SFX_ALIGN_LOWESTTOP: 715 case SFX_ALIGN_LOWESTBOTTOM: 716 case SFX_ALIGN_BOTTOM: 717 case SFX_ALIGN_TOOLBOXTOP: 718 case SFX_ALIGN_TOOLBOXBOTTOM: 719 720 nMinWidth= 0;/*aDDFuncList.GetPosPixel().X()+ 721 10*aTxtSize.Width()+ 722 aFuncList.GetPosPixel().X();*/ 723 nMinHeight=0; 724 725 break; 726 727 case SFX_ALIGN_NOALIGNMENT: 728 729 aString = aCatBox.GetEntry(0); 730 aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM("www")); 731 aTxtSize = Size( aFiFuncDesc.GetTextWidth(aString), 732 aFiFuncDesc.GetTextHeight() ); 733 734 default: Point aTopLeft=aCatBox.GetPosPixel(); 735 nMinWidth=aTxtSize.Width()+aTopLeft.X() 736 +2*aFuncList.GetPosPixel().X(); 737 nMinHeight=19*aTxtSize.Height(); 738 //aCatBox.SelectEntryPos(0); 739 740 break; 741 } 742 743 return aChildAlign; 744 } 745 /************************************************************************* 746 #* Member: Close Datum:07.10.97 747 #*------------------------------------------------------------------------ 748 #* 749 #* Klasse: ScFunctionDockWin 750 #* 751 #* Funktion: Aenderungen erkennen 752 #* 753 #* Input: --- 754 #* 755 #* Output: TRUE 756 #* 757 #************************************************************************/ 758 void ScFunctionDockWin::Notify( SfxBroadcaster&, const SfxHint& /* rHint */ ) 759 { 760 // const SfxPoolItemHint *pPoolItemHint = PTR_CAST(SfxPoolItemHint, &rHint); 761 /* 762 if ( pPoolItemHint 763 && ( pPoolItemHint->GetObject()->ISA( SvxColorTableItem ) ) ) 764 { 765 // Die Liste der Farben hat sich geaendert 766 pColorTable = ( (SvxColorTableItem*) pPoolItemHint->GetObject() )->GetColorTable(); 767 FillValueSet(); 768 } 769 */ 770 } 771 772 773 /************************************************************************* 774 #* Member: Resize Datum:06.10.97 775 #*------------------------------------------------------------------------ 776 #* 777 #* Klasse: ScFunctionDockWin 778 #* 779 #* Funktion: Ueberladene Funktion um die Groesse der 780 #* einzelnen Controls einzustellen. 781 #* 782 #* Input: neue Groesse 783 #* 784 #* Output: --- 785 #* 786 #************************************************************************/ 787 788 void __EXPORT ScFunctionDockWin::Resize() 789 { 790 if ( !IsFloatingMode() || 791 !GetFloatingWindow()->IsRollUp() ) 792 { 793 Size aQSize=GetOutputSizePixel(); 794 Resizing( aQSize); 795 SetSize(); 796 } 797 SfxDockingWindow::Resize(); 798 } 799 800 /************************************************************************* 801 #* Member: UpdateFunctionList Datum:06.10.97 802 #*------------------------------------------------------------------------ 803 #* 804 #* Klasse: ScFunctionDockWin 805 #* 806 #* Funktion: Aktualisiert die Liste der Funktionen ab- 807 #* haengig von der eingestellten Kategorie. 808 #* 809 #* Input: --- 810 #* 811 #* Output: --- 812 #* 813 #************************************************************************/ 814 815 void ScFunctionDockWin::UpdateFunctionList() 816 { 817 sal_uInt16 nSelPos = aCatBox.GetSelectEntryPos(); 818 sal_uInt16 nCategory = ( LISTBOX_ENTRY_NOTFOUND != nSelPos ) 819 ? (nSelPos-1) : 0; 820 821 pAllFuncList->Clear(); 822 pAllFuncList->SetUpdateMode( sal_False ); 823 824 if ( nSelPos > 0 ) 825 { 826 ScFunctionMgr* pFuncMgr = ScGlobal::GetStarCalcFunctionMgr(); 827 828 const ScFuncDesc* pDesc = pFuncMgr->First( nCategory ); 829 while ( pDesc ) 830 { 831 pAllFuncList->SetEntryData( 832 pAllFuncList->InsertEntry( *(pDesc->pFuncName) ), 833 (void*)pDesc ); 834 pDesc = pFuncMgr->Next(); 835 } 836 } 837 else // LRU-Liste 838 { 839 for ( sal_uInt16 i=0; i<LRU_MAX && aLRUList[i]; i++ ) 840 { 841 const ScFuncDesc* pDesc = aLRUList[i]; 842 pAllFuncList->SetEntryData( 843 pAllFuncList->InsertEntry( *(pDesc->pFuncName) ), 844 (void*)pDesc ); 845 } 846 } 847 848 849 //------------------------------------------------------ 850 pAllFuncList->SetUpdateMode( sal_True ); 851 852 if ( pAllFuncList->GetEntryCount() > 0 ) 853 { 854 pAllFuncList->Enable(); 855 pAllFuncList->SelectEntryPos( 0 ); 856 } 857 else 858 { 859 pAllFuncList->Disable(); 860 } 861 } 862 863 /************************************************************************* 864 #* Member: DoEnter Datum:06.10.97 865 #*------------------------------------------------------------------------ 866 #* 867 #* Klasse: ScFunctionDockWin 868 #* 869 #* Funktion: Eingabe ins Dokument uebernehmen. Wird aufgerufen 870 #* nach betaetigen der Uebernehmen- Schaltflaeche 871 #* oder einem Doppelklick in die Funktionsliste. 872 #* 873 #* Input: --- 874 #* 875 #* Output: --- 876 #* 877 #************************************************************************/ 878 879 void ScFunctionDockWin::DoEnter(sal_Bool /* bOk */) //@@ ??? 880 { 881 String aFirstArgStr; 882 String aParaStr; 883 String aArgStr; 884 String aString=pAllFuncList->GetSelectEntry(); 885 SfxViewShell* pCurSh = SfxViewShell::Current(); 886 nArgs=0; 887 888 if(aString.Len()>0) 889 { 890 891 ScModule* pScMod = SC_MOD(); 892 ScTabViewShell* pViewSh = PTR_CAST( ScTabViewShell, pCurSh); 893 ScInputHandler* pHdl = pScMod->GetInputHdl( pViewSh ); 894 if(!pScMod->IsEditMode()) 895 { 896 pScMod->SetInputMode(SC_INPUT_TABLE); 897 aString = '='; 898 aString += pAllFuncList->GetSelectEntry(); 899 if (pHdl) 900 pHdl->ClearText(); 901 } 902 const ScFuncDesc* pDesc = 903 (const ScFuncDesc*)pAllFuncList->GetEntryData( 904 pAllFuncList->GetSelectEntryPos() ); 905 if (pDesc) 906 { 907 pFuncDesc=pDesc; 908 UpdateLRUList(); 909 nArgs = pDesc->nArgCount; 910 if(nArgs>0) 911 { 912 // NOTE: Theoretically the first parameter could have the 913 // suppress flag as well, but practically it doesn't. 914 aFirstArgStr = *(pDesc->ppDefArgNames[0]); 915 aFirstArgStr.EraseLeadingAndTrailingChars(); 916 aFirstArgStr.SearchAndReplaceAll(' ', '_'); 917 aArgStr = aFirstArgStr; 918 if ( nArgs != VAR_ARGS && nArgs != PAIRED_VAR_ARGS ) 919 { // no VarArgs or Fix plus VarArgs, but not VarArgs only 920 String aArgSep = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM( "; " )); 921 sal_uInt16 nFix; 922 if (nArgs >= PAIRED_VAR_ARGS) 923 nFix = nArgs - PAIRED_VAR_ARGS + 2; 924 else if (nArgs >= VAR_ARGS) 925 nFix = nArgs - VAR_ARGS + 1; 926 else 927 nFix = nArgs; 928 for ( sal_uInt16 nArg = 1; 929 nArg < nFix && !pDesc->pDefArgFlags[nArg].bOptional; nArg++ ) 930 { 931 if (!pDesc->pDefArgFlags[nArg].bSuppress) 932 { 933 aArgStr += aArgSep; 934 String sTmp(*(pDesc->ppDefArgNames[nArg])); 935 sTmp.EraseLeadingAndTrailingChars(); 936 sTmp.SearchAndReplaceAll(' ', '_'); 937 aArgStr += sTmp; 938 } 939 } 940 } 941 } 942 } 943 if (pHdl) 944 { 945 if(pHdl->GetEditString().Len()==0) 946 { 947 aString = '='; 948 aString += pAllFuncList->GetSelectEntry(); 949 } 950 EditView *pEdView=pHdl->GetActiveView(); 951 if(pEdView!=NULL) // @ Wegen Absturz bei Namen festlegen 952 { 953 if(nArgs>0) 954 { 955 pHdl->InsertFunction(aString); 956 pEdView->InsertText(aArgStr,sal_True); 957 ESelection aESel=pEdView->GetSelection(); 958 aESel.nEndPos=aESel.nStartPos+aFirstArgStr.Len(); 959 pEdView->SetSelection(aESel); 960 pHdl->DataChanged(); 961 } 962 else 963 { 964 aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "()" )); 965 pEdView->InsertText(aString,sal_False); 966 pHdl->DataChanged(); 967 } 968 } 969 } 970 InitLRUList(); 971 } 972 if ( pCurSh ) 973 { 974 Window* pShellWnd = pCurSh->GetWindow(); 975 976 if ( pShellWnd ) 977 pShellWnd->GrabFocus(); 978 } 979 980 981 } 982 983 984 985 /************************************************************************* 986 #* Handle: SelHdl Datum:06.10.97 987 #*------------------------------------------------------------------------ 988 #* 989 #* Klasse: ScFunctionDockWin 990 #* 991 #* Funktion: Bei einer Aenderung der Kategorie wird die 992 #* die Liste der Funktionen aktualisiert. 993 #* 994 #* Input: --- 995 #* 996 #* Output: --- 997 #* 998 #************************************************************************/ 999 1000 IMPL_LINK( ScFunctionDockWin, SelHdl, ListBox*, pLb ) 1001 { 1002 if ( pLb == &aCatBox) 1003 { 1004 UpdateFunctionList(); 1005 SetDescription(); 1006 } 1007 1008 if ( pLb == &aFuncList||pLb == &aDDFuncList) 1009 { 1010 SetDescription(); 1011 } 1012 1013 1014 //SetSize(); 1015 return 0; 1016 } 1017 1018 /************************************************************************* 1019 #* Handle: SelHdl Datum:06.10.97 1020 #*------------------------------------------------------------------------ 1021 #* 1022 #* Klasse: ScFunctionDockWin 1023 #* 1024 #* Funktion: Bei einer Aenderung der Kategorie wird die 1025 #* die Liste der Funktionen aktualisiert. 1026 #* 1027 #* Input: --- 1028 #* 1029 #* Output: --- 1030 #* 1031 #************************************************************************/ 1032 1033 IMPL_LINK( ScFunctionDockWin, SetSelectionHdl, void*, pCtrl ) 1034 { 1035 if ((ImageButton *)pCtrl == &aInsertButton || 1036 (ListBox *)pCtrl == &aFuncList) 1037 { 1038 DoEnter(sal_True); // Uebernimmt die Eingabe 1039 } 1040 //... 1041 1042 return 0; 1043 } 1044 1045 /************************************************************************* 1046 #* Handle: SetSplitHdl Datum:13.10.97 1047 #*------------------------------------------------------------------------ 1048 #* 1049 #* Klasse: ScFunctionDockWin 1050 #* 1051 #* Funktion: Bei einer Aenderung des Split- Controls werden die 1052 #* einzelnen Controls an die neue Groesse angepasst. 1053 #* 1054 #* Input: Zeiger auf Control 1055 #* 1056 #* Output: --- 1057 #* 1058 #************************************************************************/ 1059 1060 IMPL_LINK( ScFunctionDockWin, SetSplitHdl, ScPrivatSplit*, pCtrl ) 1061 { 1062 if (pCtrl == &aPrivatSplit) 1063 { 1064 short nDeltaY=aPrivatSplit.GetDeltaY(); 1065 Size aFLSize=aFuncList.GetSizePixel(); 1066 Size aFDSize=aFiFuncDesc.GetSizePixel(); 1067 Point aFDTopLeft=aFiFuncDesc.GetPosPixel(); 1068 1069 aFLSize.Height()+=nDeltaY; 1070 aFDSize.Height()-=nDeltaY; 1071 aFDTopLeft.Y()+=nDeltaY; 1072 aFuncList.SetSizePixel(aFLSize); 1073 aFiFuncDesc.SetPosPixel(aFDTopLeft); 1074 aFiFuncDesc.SetSizePixel(aFDSize); 1075 /* 1076 aFuncList.Invalidate(); 1077 aFuncList.Update(); 1078 aFiFuncDesc.Invalidate(); 1079 aFiFuncDesc.Update(); 1080 */ 1081 } 1082 //... 1083 1084 return 0; 1085 } 1086 1087 void ScFunctionDockWin::ToggleFloatingMode() 1088 { 1089 aSplitterInitPos = Point(); 1090 SfxDockingWindow::ToggleFloatingMode(); 1091 1092 eSfxNewAlignment=GetAlignment(); 1093 eSfxOldAlignment=eSfxNewAlignment; 1094 1095 aOldSize.Height()=0; 1096 aOldSize.Width()=0; 1097 aTimer.Start(); 1098 } 1099 1100 IMPL_LINK( ScFunctionDockWin, TimerHdl, Timer*, EMPTYARG ) 1101 { 1102 CheckAlignment(eSfxOldAlignment,eSfxNewAlignment); 1103 SetSize(); 1104 return 0; 1105 } 1106 1107 void ScFunctionDockWin::Initialize(SfxChildWinInfo *pInfo) 1108 { 1109 String aStr; 1110 if(pInfo!=NULL) 1111 { 1112 if ( pInfo->aExtraString.Len() ) 1113 { 1114 xub_StrLen nPos = pInfo->aExtraString.Search( 1115 String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("ScFuncList:"))); 1116 1117 // Versuche, den Alignment-String "ALIGN:(...)" einzulesen; wenn 1118 // er nicht vorhanden ist, liegt eine "altere Version vor 1119 if ( nPos != STRING_NOTFOUND ) 1120 { 1121 xub_StrLen n1 = pInfo->aExtraString.Search('(', nPos); 1122 if ( n1 != STRING_NOTFOUND ) 1123 { 1124 xub_StrLen n2 = pInfo->aExtraString.Search(')', n1); 1125 if ( n2 != STRING_NOTFOUND ) 1126 { 1127 // Alignment-String herausschneiden 1128 aStr = pInfo->aExtraString.Copy(nPos, n2 - nPos + 1); 1129 pInfo->aExtraString.Erase(nPos, n2 - nPos + 1); 1130 aStr.Erase(0, n1-nPos+1); 1131 } 1132 } 1133 } 1134 } 1135 } 1136 SfxDockingWindow::Initialize(pInfo); 1137 1138 if ( aStr.Len()) 1139 { 1140 aSplitterInitPos=aPrivatSplit.GetPosPixel(); 1141 aSplitterInitPos.Y()=(sal_uInt16) aStr.ToInt32(); 1142 xub_StrLen n1 = aStr.Search(';'); 1143 aStr.Erase(0, n1+1); 1144 sal_uInt16 nSelPos=sal::static_int_cast<sal_uInt16>( aStr.ToInt32() ); 1145 aCatBox.SelectEntryPos(nSelPos); 1146 SelHdl(&aCatBox); 1147 1148 // if the window has already been shown (from SfxDockingWindow::Initialize if docked), 1149 // set the splitter position now, otherwise it is set in StateChanged with type INITSHOW 1150 1151 UseSplitterInitPos(); 1152 } 1153 } 1154 1155 //------------------------------------------------------------------------- 1156 1157 void ScFunctionDockWin::FillInfo(SfxChildWinInfo& rInfo) const 1158 { 1159 SfxDockingWindow::FillInfo(rInfo); 1160 Point aPoint=aPrivatSplit.GetPosPixel(); 1161 rInfo.aExtraString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "ScFuncList:(" )); 1162 rInfo.aExtraString += String::CreateFromInt32(aPoint.Y()); 1163 rInfo.aExtraString += ';'; 1164 rInfo.aExtraString += String::CreateFromInt32(aCatBox.GetSelectEntryPos()); 1165 rInfo.aExtraString += ')'; 1166 } 1167 1168 void ScFunctionDockWin::UseSplitterInitPos() 1169 { 1170 if ( IsVisible() && aPrivatSplit.IsEnabled() && aSplitterInitPos != Point() ) 1171 { 1172 aPrivatSplit.MoveSplitTo(aSplitterInitPos); 1173 aSplitterInitPos = Point(); // use only once 1174 } 1175 } 1176 1177 void ScFunctionDockWin::StateChanged( StateChangedType nStateChange ) 1178 { 1179 SfxDockingWindow::StateChanged( nStateChange ); 1180 1181 if (nStateChange == STATE_CHANGE_INITSHOW) 1182 { 1183 UseSplitterInitPos(); // set initial splitter position if necessary 1184 } 1185 } 1186 1187 1188