1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_sc.hxx" 30 31 32 33 //---------------------------------------------------------------------------- 34 35 #include "scitems.hxx" 36 #include <sfx2/dispatch.hxx> 37 #include <sfx2/docfile.hxx> 38 #include <sfx2/objsh.hxx> 39 #include <svl/zforlist.hxx> 40 #include <svl/stritem.hxx> 41 #include <svtools/svtreebx.hxx> 42 #include <sfx2/viewfrm.hxx> 43 #include <vcl/svapp.hxx> 44 #include <vcl/mnemonic.hxx> 45 #include <unotools/charclass.hxx> 46 #include <tools/urlobj.hxx> 47 #include <formula/formulahelper.hxx> 48 #include <formula/IFunctionDescription.hxx> 49 50 #include "tokenuno.hxx" 51 #include "formula.hxx" 52 #include "formdata.hxx" 53 #include "globstr.hrc" 54 #include "scresid.hxx" 55 #include "reffact.hxx" 56 #include "document.hxx" 57 #include "cell.hxx" 58 #include "scmod.hxx" 59 #include "inputhdl.hxx" 60 #include "tabvwsh.hxx" 61 #include "appoptio.hxx" 62 #include "docsh.hxx" 63 #include "funcdesc.hxx" 64 #include "formula/token.hxx" 65 #include "tokenarray.hxx" 66 #include "sc.hrc" 67 #include "servuno.hxx" 68 #include "unonames.hxx" 69 #include "externalrefmgr.hxx" 70 71 #include <com/sun/star/table/CellAddress.hpp> 72 73 //============================================================================ 74 using namespace formula; 75 using namespace com::sun::star; 76 77 ScDocument* ScFormulaDlg::pDoc = NULL; 78 ScAddress ScFormulaDlg::aCursorPos; 79 80 81 82 // -------------------------------------------------------------------------- 83 // Initialisierung / gemeinsame Funktionen fuer Dialog 84 // -------------------------------------------------------------------------- 85 86 ScFormulaDlg::ScFormulaDlg( SfxBindings* pB, SfxChildWindow* pCW, 87 Window* pParent, ScViewData* pViewData,formula::IFunctionManager* _pFunctionMgr ) 88 : formula::FormulaDlg( pB, pCW, pParent, true,true,true,this, _pFunctionMgr,this) 89 , m_aHelper(this,pB) 90 { 91 m_aHelper.SetWindow(this); 92 ScModule* pScMod = SC_MOD(); 93 pScMod->InputEnterHandler(); 94 ScTabViewShell* pScViewShell = NULL; 95 96 // title has to be from the view that opened the dialog, 97 // even if it's not the current view 98 99 SfxObjectShell* pParentDoc = NULL; 100 if ( pB ) 101 { 102 SfxDispatcher* pMyDisp = pB->GetDispatcher(); 103 if (pMyDisp) 104 { 105 SfxViewFrame* pMyViewFrm = pMyDisp->GetFrame(); 106 if (pMyViewFrm) 107 { 108 pScViewShell = PTR_CAST( ScTabViewShell, pMyViewFrm->GetViewShell() ); 109 if( pScViewShell ) 110 pScViewShell->UpdateInputHandler(sal_True); 111 pParentDoc = pMyViewFrm->GetObjectShell(); 112 } 113 } 114 } 115 //if ( !pParentDoc && pScViewShell ) // use current only if above fails 116 // pParentDoc = pScViewShell->GetObjectShell(); 117 //if ( pParentDoc ) 118 // aDocName = pParentDoc->GetTitle(); 119 120 if ( pDoc == NULL ) 121 pDoc = pViewData->GetDocument(); 122 m_xParser.set(ScServiceProvider::MakeInstance(SC_SERVICE_FORMULAPARS,(ScDocShell*)pDoc->GetDocumentShell()),uno::UNO_QUERY); 123 uno::Reference< beans::XPropertySet> xSet(m_xParser,uno::UNO_QUERY); 124 xSet->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_COMPILEFAP)),uno::makeAny(sal_True)); 125 126 m_xOpCodeMapper.set(ScServiceProvider::MakeInstance(SC_SERVICE_OPCODEMAPPER,(ScDocShell*)pDoc->GetDocumentShell()),uno::UNO_QUERY); 127 128 ScInputHandler* pInputHdl = SC_MOD()->GetInputHdl(pScViewShell); 129 130 DBG_ASSERT( pInputHdl, "Missing input handler :-/" ); 131 132 if ( pInputHdl ) 133 pInputHdl->NotifyChange( NULL ); 134 135 m_aHelper.enableInput( sal_False ); 136 m_aHelper.EnableSpreadsheets(); 137 m_aHelper.Init(); 138 m_aHelper.SetDispatcherLock( sal_True ); 139 140 notifyChange(); 141 fill(); 142 143 ScFormEditData* pData = pScMod->GetFormEditData(); 144 if (!pData) 145 { 146 //Nun wird es Zeit den Inputhandler festzulegen 147 pScMod->SetRefInputHdl(pScMod->GetInputHdl()); 148 149 pDoc = pViewData->GetDocument(); 150 SCCOL nCol = pViewData->GetCurX(); 151 SCROW nRow = pViewData->GetCurY(); 152 SCTAB nTab = pViewData->GetTabNo(); 153 aCursorPos = ScAddress( nCol, nRow, nTab ); 154 155 pScMod->InitFormEditData(); // neu anlegen 156 pData = pScMod->GetFormEditData(); 157 pData->SetInputHandler(pScMod->GetInputHdl()); 158 pData->SetDocShell(pViewData->GetDocShell()); 159 160 DBG_ASSERT(pData,"FormEditData ist nicht da"); 161 162 formula::FormulaDlgMode eMode = FORMULA_FORMDLG_FORMULA; // Default... 163 164 // Formel vorhanden? Dann editieren 165 166 String aFormula; 167 pDoc->GetFormula( nCol, nRow, nTab, aFormula ); 168 sal_Bool bEdit = ( aFormula.Len() > 1 ); 169 sal_Bool bMatrix = sal_False; 170 if ( bEdit ) 171 { 172 bMatrix = CheckMatrix(aFormula); 173 174 xub_StrLen nFStart = 0; 175 xub_StrLen nFEnd = 0; 176 if ( GetFormulaHelper().GetNextFunc( aFormula, sal_False, nFStart, &nFEnd) ) 177 { 178 pScMod->InputReplaceSelection( aFormula ); 179 pScMod->InputSetSelection( nFStart, nFEnd ); 180 xub_StrLen PrivStart, PrivEnd; 181 pScMod->InputGetSelection( PrivStart, PrivEnd); 182 183 eMode = SetMeText(pScMod->InputGetFormulaStr(),PrivStart, PrivEnd,bMatrix,sal_True,sal_True); 184 pData->SetFStart( nFStart ); 185 } 186 else 187 bEdit = sal_False; 188 } 189 190 if ( !bEdit ) 191 { 192 String aNewFormula = '='; 193 if ( aFormula.Len() > 0 && aFormula.GetChar(0) == '=' ) 194 aNewFormula=aFormula; 195 196 pScMod->InputReplaceSelection( aNewFormula ); 197 pScMod->InputSetSelection( 1, aNewFormula.Len()+1 ); 198 xub_StrLen PrivStart, PrivEnd; 199 pScMod->InputGetSelection( PrivStart, PrivEnd); 200 SetMeText(pScMod->InputGetFormulaStr(),PrivStart, PrivEnd,bMatrix,sal_False,sal_False); 201 202 pData->SetFStart( 1 ); // hinter dem "=" 203 } 204 205 pData->SetMode( (sal_uInt16) eMode ); 206 String rStrExp = GetMeText(); 207 208 pCell = new ScFormulaCell( pDoc, aCursorPos, rStrExp ); 209 210 Update(rStrExp); 211 } // if (!pData) 212 213 } 214 215 void ScFormulaDlg::notifyChange() 216 { 217 ScModule* pScMod = SC_MOD(); 218 219 ScInputHandler* pInputHdl = pScMod->GetInputHdl(); 220 if ( pInputHdl ) 221 pInputHdl->NotifyChange( NULL ); 222 } 223 // ----------------------------------------------------------------------------- 224 void ScFormulaDlg::fill() 225 { 226 ScModule* pScMod = SC_MOD(); 227 ScFormEditData* pData = pScMod->GetFormEditData(); 228 notifyChange(); 229 String rStrExp; 230 if (pData) 231 { 232 // Daten schon vorhanden -> Zustand wiederherstellen (nach Umschalten) 233 // pDoc und aCursorPos nicht neu initialisieren 234 //pDoc = pViewData->GetDocument(); 235 if(IsInputHdl(pData->GetInputHandler())) 236 { 237 pScMod->SetRefInputHdl(pData->GetInputHandler()); 238 } 239 else 240 { 241 PtrTabViewShell pTabViewShell; 242 ScInputHandler* pInputHdl = GetNextInputHandler(pData->GetDocShell(),&pTabViewShell); 243 244 if ( pInputHdl == NULL ) //DocShell hat keinen InputHandler mehr, 245 { //hat der Anwender halt Pech gehabt. 246 disableOk(); 247 pInputHdl = pScMod->GetInputHdl(); 248 } 249 else 250 { 251 pInputHdl->SetRefViewShell(pTabViewShell); 252 } 253 pScMod->SetRefInputHdl(pInputHdl); 254 pData->SetInputHandler(pInputHdl); 255 } 256 257 String aOldFormulaTmp(pScMod->InputGetFormulaStr()); 258 pScMod->InputSetSelection( 0, aOldFormulaTmp.Len()); 259 260 rStrExp=pData->GetUndoStr(); 261 pScMod->InputReplaceSelection(rStrExp); 262 263 SetMeText(rStrExp); 264 265 pCell = new ScFormulaCell( pDoc, aCursorPos, rStrExp ); 266 267 Update(); 268 // Jetzt nochmals zurueckschalten, da evtl. neues Doc geoeffnet wurde! 269 pScMod->SetRefInputHdl(NULL); 270 } 271 } 272 273 __EXPORT ScFormulaDlg::~ScFormulaDlg() 274 { 275 ScModule* pScMod = SC_MOD(); 276 ScFormEditData* pData = pScMod->GetFormEditData(); 277 278 if (pData) // wird nicht ueber Close zerstoert; 279 { 280 //Referenz Inputhandler zuruecksetzen 281 pScMod->SetRefInputHdl(NULL); 282 } // if (pData) // wird nicht ueber Close zerstoert; 283 284 delete pCell; 285 } 286 287 sal_Bool ScFormulaDlg::IsInputHdl(ScInputHandler* pHdl) 288 { 289 sal_Bool bAlive = sal_False; 290 291 // gehoert der InputHandler zu irgendeiner ViewShell ? 292 293 TypeId aScType = TYPE(ScTabViewShell); 294 SfxViewShell* pSh = SfxViewShell::GetFirst( &aScType ); 295 while ( pSh && !bAlive ) 296 { 297 if (((ScTabViewShell*)pSh)->GetInputHandler() == pHdl) 298 bAlive = sal_True; 299 pSh = SfxViewShell::GetNext( *pSh, &aScType ); 300 } 301 302 return bAlive; 303 304 } 305 306 ScInputHandler* ScFormulaDlg::GetNextInputHandler(ScDocShell* pDocShell,PtrTabViewShell* ppViewSh) 307 { 308 ScInputHandler* pHdl=NULL; 309 310 SfxViewFrame* pFrame = SfxViewFrame::GetFirst( pDocShell ); 311 while( pFrame && pHdl==NULL) 312 { 313 SfxViewShell* p = pFrame->GetViewShell(); 314 ScTabViewShell* pViewSh = PTR_CAST(ScTabViewShell,p); 315 if(pViewSh!=NULL) 316 { 317 pHdl=pViewSh->GetInputHandler(); 318 if(ppViewSh!=NULL) *ppViewSh=pViewSh; 319 } 320 pFrame = SfxViewFrame::GetNext( *pFrame, pDocShell ); 321 } 322 323 324 return pHdl; 325 } 326 327 328 sal_Bool __EXPORT ScFormulaDlg::Close() 329 { 330 DoEnter(sal_False); 331 return sal_True; 332 } 333 334 // -------------------------------------------------------------------------- 335 // Funktionen fuer rechte Seite 336 // -------------------------------------------------------------------------- 337 bool ScFormulaDlg::calculateValue( const String& rStrExp, String& rStrResult ) 338 { 339 sal_Bool bResult = sal_True; 340 341 ::std::auto_ptr<ScFormulaCell> pFCell( new ScFormulaCell( pDoc, aCursorPos, rStrExp ) ); 342 343 // #35521# HACK! um bei ColRowNames kein #REF! zu bekommen, 344 // wenn ein Name eigentlich als Bereich in die Gesamt-Formel 345 // eingefuegt wird, bei der Einzeldarstellung aber als 346 // single-Zellbezug interpretiert wird 347 sal_Bool bColRowName = pCell->HasColRowName(); 348 if ( bColRowName ) 349 { 350 // ColRowName im RPN-Code? 351 if ( pCell->GetCode()->GetCodeLen() <= 1 ) 352 { // ==1: einzelner ist als Parameter immer Bereich 353 // ==0: es waere vielleicht einer, wenn.. 354 String aBraced( '(' ); 355 aBraced += rStrExp; 356 aBraced += ')'; 357 pFCell.reset( new ScFormulaCell( pDoc, aCursorPos, aBraced ) ); 358 } 359 else 360 bColRowName = sal_False; 361 } 362 363 sal_uInt16 nErrCode = pFCell->GetErrCode(); 364 if ( nErrCode == 0 ) 365 { 366 SvNumberFormatter& aFormatter = *(pDoc->GetFormatTable()); 367 Color* pColor; 368 if ( pFCell->IsValue() ) 369 { 370 double n = pFCell->GetValue(); 371 sal_uLong nFormat = aFormatter.GetStandardFormat( n, 0, 372 pFCell->GetFormatType(), ScGlobal::eLnge ); 373 aFormatter.GetOutputString( n, nFormat, 374 rStrResult, &pColor ); 375 } 376 else 377 { 378 String aStr; 379 380 pFCell->GetString( aStr ); 381 sal_uLong nFormat = aFormatter.GetStandardFormat( 382 pFCell->GetFormatType(), ScGlobal::eLnge); 383 aFormatter.GetOutputString( aStr, nFormat, 384 rStrResult, &pColor ); 385 } 386 387 ScRange aTestRange; 388 if ( bColRowName || (aTestRange.Parse(rStrExp) & SCA_VALID) ) 389 rStrResult.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " ..." )); 390 // Bereich 391 } 392 else 393 rStrResult += ScGlobal::GetErrorString(nErrCode); 394 395 if(!isUserMatrix() && pFCell->GetMatrixFlag()) 396 { 397 CheckMatrix(); 398 } 399 400 return bResult; 401 } 402 403 404 405 // virtuelle Methoden von ScAnyRefDlg: 406 void ScFormulaDlg::RefInputStart( formula::RefEdit* pEdit, formula::RefButton* pButton ) 407 { 408 ::std::pair<formula::RefButton*,formula::RefEdit*> aPair = RefInputStartBefore( pEdit, pButton ); 409 m_aHelper.RefInputStart( aPair.second, aPair.first); 410 RefInputStartAfter( aPair.second, aPair.first ); 411 } 412 void ScFormulaDlg::RefInputDone( sal_Bool bForced ) 413 { 414 m_aHelper.RefInputDone( bForced ); 415 RefInputDoneAfter( bForced ); 416 } 417 418 void ScFormulaDlg::SetReference( const ScRange& rRef, ScDocument* pRefDoc ) 419 { 420 const IFunctionDescription* pFunc = getCurrentFunctionDescription(); 421 if ( pFunc && pFunc->getSuppressedArgumentCount() > 0 ) 422 { 423 Selection theSel; 424 sal_Bool bRefNull = UpdateParaWin(theSel); 425 426 if ( rRef.aStart != rRef.aEnd && bRefNull ) 427 { 428 RefInputStart(GetActiveEdit()); 429 } 430 431 String aRefStr; 432 sal_Bool bOtherDoc = ( pRefDoc != pDoc && pRefDoc->GetDocumentShell()->HasName() ); 433 if ( bOtherDoc ) 434 { 435 // Referenz auf anderes Dokument - wie inputhdl.cxx 436 437 DBG_ASSERT(rRef.aStart.Tab()==rRef.aEnd.Tab(), "nStartTab!=nEndTab"); 438 439 String aTmp; 440 rRef.Format( aTmp, SCA_VALID|SCA_TAB_3D, pRefDoc ); // immer 3d 441 442 SfxObjectShell* pObjSh = pRefDoc->GetDocumentShell(); 443 444 // #i75893# convert escaped URL of the document to something user friendly 445 // String aFileName = pObjSh->GetMedium()->GetName(); 446 String aFileName = pObjSh->GetMedium()->GetURLObject().GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ); 447 448 aRefStr = '\''; 449 aRefStr += aFileName; 450 aRefStr.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "'#" )); 451 aRefStr += aTmp; 452 } 453 else 454 { 455 sal_uInt16 nFmt = ( rRef.aStart.Tab() == aCursorPos.Tab() ) 456 ? SCA_VALID 457 : SCA_VALID | SCA_TAB_3D; 458 rRef.Format( aRefStr, nFmt, pRefDoc, pRefDoc->GetAddressConvention() ); 459 } 460 461 UpdateParaWin(theSel,aRefStr); 462 } 463 } 464 465 sal_Bool ScFormulaDlg::IsRefInputMode() const 466 { 467 const IFunctionDescription* pDesc = getCurrentFunctionDescription(); 468 sal_Bool bRef = (pDesc && (pDesc->getSuppressedArgumentCount() > 0)) && (pDoc!=NULL); 469 return bRef; 470 } 471 472 sal_Bool ScFormulaDlg::IsDocAllowed(SfxObjectShell* pDocSh) const 473 { 474 // not allowed: different from this doc, and no name 475 // pDocSh is always a ScDocShell 476 if ( pDocSh && ((ScDocShell*)pDocSh)->GetDocument() != pDoc && !pDocSh->HasName() ) 477 return sal_False; 478 479 return sal_True; // everything else is allowed 480 } 481 482 void ScFormulaDlg::SetActive() 483 { 484 const IFunctionDescription* pFunc = getCurrentFunctionDescription(); 485 if ( pFunc && pFunc->getSuppressedArgumentCount() > 0 ) 486 { 487 RefInputDone(); 488 SetEdSelection(); 489 } 490 } 491 492 void ScFormulaDlg::SaveLRUEntry(const ScFuncDesc* pFuncDescP) 493 { 494 if (pFuncDescP && pFuncDescP->nFIndex!=0) 495 { 496 ScModule* pScMod = SC_MOD(); 497 pScMod->InsertEntryToLRUList(pFuncDescP->nFIndex); 498 } 499 } 500 501 void ScFormulaDlg::doClose(sal_Bool /*_bOk*/) 502 { 503 m_aHelper.DoClose( ScFormulaDlgWrapper::GetChildWindowId() ); 504 } 505 void ScFormulaDlg::insertEntryToLRUList(const formula::IFunctionDescription* _pDesc) 506 { 507 const ScFuncDesc* pDesc = dynamic_cast<const ScFuncDesc*>(_pDesc); 508 SaveLRUEntry(pDesc); 509 } 510 void ScFormulaDlg::showReference(const String& _sFormula) 511 { 512 ShowReference(_sFormula); 513 } 514 void ScFormulaDlg::ShowReference(const String& _sFormula) 515 { 516 m_aHelper.ShowReference(_sFormula); 517 } 518 void ScFormulaDlg::HideReference( sal_Bool bDoneRefMode ) 519 { 520 m_aHelper.HideReference(bDoneRefMode); 521 } 522 void ScFormulaDlg::ViewShellChanged( ScTabViewShell* pScViewShell ) 523 { 524 m_aHelper.ViewShellChanged( pScViewShell ); 525 } 526 void ScFormulaDlg::AddRefEntry( ) 527 { 528 529 } 530 sal_Bool ScFormulaDlg::IsTableLocked( ) const 531 { 532 // per Default kann bei Referenzeingabe auch die Tabelle umgeschaltet werden 533 return sal_False; 534 } 535 void ScFormulaDlg::ToggleCollapsed( formula::RefEdit* pEdit, formula::RefButton* pButton) 536 { 537 m_aHelper.ToggleCollapsed(pEdit,pButton); 538 } 539 void ScFormulaDlg::ReleaseFocus( formula::RefEdit* pEdit, formula::RefButton* pButton) 540 { 541 m_aHelper.ReleaseFocus(pEdit,pButton); 542 } 543 void ScFormulaDlg::dispatch(sal_Bool _bOK,sal_Bool _bMartixChecked) 544 { 545 SfxBoolItem aRetItem( SID_DLG_RETOK, _bOK ); 546 SfxBoolItem aMatItem( SID_DLG_MATRIX, _bMartixChecked ); 547 SfxStringItem aStrItem( SCITEM_STRING, getCurrentFormula() ); 548 549 // Wenn durch Dokument-Umschalterei die Eingabezeile weg war/ist, 550 // ist der String leer. Dann nicht die alte Formel loeschen. 551 if ( !aStrItem.GetValue().Len() ) 552 aRetItem.SetValue( sal_False ); // sal_False = Cancel 553 554 m_aHelper.SetDispatcherLock( sal_False ); // Modal-Modus ausschalten 555 556 clear(); 557 558 GetBindings().GetDispatcher()->Execute( SID_INS_FUNCTION, 559 SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, 560 &aRetItem, &aStrItem, &aMatItem, 0L ); 561 } 562 void ScFormulaDlg::setDispatcherLock( sal_Bool bLock ) 563 { 564 m_aHelper.SetDispatcherLock( bLock ); 565 } 566 void ScFormulaDlg::setReferenceInput(const formula::FormEditData* _pData) 567 { 568 ScModule* pScMod = SC_MOD(); 569 ScFormEditData* pData = const_cast<ScFormEditData*>(dynamic_cast<const ScFormEditData*>(_pData)); 570 pScMod->SetRefInputHdl(pData->GetInputHandler()); 571 } 572 void ScFormulaDlg::deleteFormData() 573 { 574 ScModule* pScMod = SC_MOD(); 575 pScMod->ClearFormEditData(); // pData wird ungueltig! 576 } 577 void ScFormulaDlg::clear() 578 { 579 pDoc = NULL; 580 581 //Referenz Inputhandler zuruecksetzen 582 ScModule* pScMod = SC_MOD(); 583 pScMod->SetRefInputHdl(NULL); 584 585 // Enable() der Eingabezeile erzwingen: 586 ScTabViewShell* pScViewShell = PTR_CAST(ScTabViewShell, SfxViewShell::Current()); 587 if ( pScViewShell ) 588 pScViewShell->UpdateInputHandler(); 589 } 590 void ScFormulaDlg::switchBack() 591 { 592 ScModule* pScMod = SC_MOD(); 593 // auf das Dokument zurueckschalten 594 // (noetig, weil ein fremdes oben sein kann - #34222#) 595 ScInputHandler* pHdl = pScMod->GetInputHdl(); 596 if ( pHdl ) 597 { 598 pHdl->ViewShellGone(NULL); // -> aktive View neu holen 599 pHdl->ShowRefFrame(); 600 } 601 602 // aktuelle Tabelle ggF. restaurieren (wg. Maus-RefInput) 603 ScTabViewShell* pScViewShell = PTR_CAST(ScTabViewShell, SfxViewShell::Current()); 604 if ( pScViewShell ) 605 { 606 ScViewData* pVD=pScViewShell->GetViewData(); 607 SCTAB nExecTab = aCursorPos.Tab(); 608 if ( nExecTab != pVD->GetTabNo() ) 609 pScViewShell->SetTabNo( nExecTab ); 610 611 SCROW nRow=aCursorPos.Row(); 612 SCCOL nCol=aCursorPos.Col(); 613 614 if(pVD->GetCurX()!=nCol || pVD->GetCurY()!=nRow) 615 pScViewShell->SetCursor(nCol,nRow); 616 } 617 } 618 formula::FormEditData* ScFormulaDlg::getFormEditData() const 619 { 620 ScModule* pScMod = SC_MOD(); 621 return pScMod->GetFormEditData(); 622 } 623 void ScFormulaDlg::setCurrentFormula(const String& _sReplacement) 624 { 625 ScModule* pScMod = SC_MOD(); 626 pScMod->InputReplaceSelection(_sReplacement); 627 } 628 void ScFormulaDlg::setSelection(xub_StrLen _nStart,xub_StrLen _nEnd) 629 { 630 ScModule* pScMod = SC_MOD(); 631 pScMod->InputSetSelection( _nStart, _nEnd ); 632 } 633 void ScFormulaDlg::getSelection(xub_StrLen& _nStart,xub_StrLen& _nEnd) const 634 { 635 ScModule* pScMod = SC_MOD(); 636 pScMod->InputGetSelection( _nStart, _nEnd ); 637 } 638 String ScFormulaDlg::getCurrentFormula() const 639 { 640 ScModule* pScMod = SC_MOD(); 641 return pScMod->InputGetFormulaStr(); 642 } 643 formula::IFunctionManager* ScFormulaDlg::getFunctionManager() 644 { 645 return ScGlobal::GetStarCalcFunctionMgr(); 646 } 647 uno::Reference< sheet::XFormulaParser> ScFormulaDlg::getFormulaParser() const 648 { 649 return m_xParser; 650 } 651 uno::Reference< sheet::XFormulaOpCodeMapper> ScFormulaDlg::getFormulaOpCodeMapper() const 652 { 653 return m_xOpCodeMapper; 654 } 655 656 table::CellAddress ScFormulaDlg::getReferencePosition() const 657 { 658 return table::CellAddress(aCursorPos.Tab(),aCursorPos.Col(),aCursorPos.Row()); 659 } 660 661 ::std::auto_ptr<formula::FormulaTokenArray> ScFormulaDlg::convertToTokenArray(const uno::Sequence< sheet::FormulaToken >& _aTokenList) 662 { 663 ::std::auto_ptr<formula::FormulaTokenArray> pArray(new ScTokenArray()); 664 pArray->Fill( _aTokenList, pDoc->GetExternalRefManager()); 665 return pArray; 666 } 667 668