LCOV - code coverage report
Current view: top level - sc/source/ui/formdlg - formula.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 2 327 0.6 %
Date: 2014-11-03 Functions: 2 44 4.5 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10