LCOV - code coverage report
Current view: top level - sc/source/ui/formdlg - formula.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 2 331 0.6 %
Date: 2015-06-13 12:38:46 Functions: 2 45 4.4 %
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          52 : ScAddress ScFormulaDlg::aCursorPos;
      63             : 
      64             : //      init/ shared functions for 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 :     ScFormulaReferenceHelper::EnableSpreadsheets();
     111           0 :     m_aHelper.Init();
     112           0 :     ScFormulaReferenceHelper::SetDispatcherLock( true );
     113             : 
     114           0 :     notifyChange();
     115           0 :     fill();
     116             : 
     117           0 :     ScFormEditData* pData = pScMod->GetFormEditData();
     118           0 :     if (!pData)
     119             :     {
     120           0 :         pScMod->SetRefInputHdl(pScMod->GetInputHdl());
     121             : 
     122           0 :         pDoc = pViewData->GetDocument();
     123           0 :         SCCOL nCol = pViewData->GetCurX();
     124           0 :         SCROW nRow = pViewData->GetCurY();
     125           0 :         SCTAB nTab = pViewData->GetTabNo();
     126           0 :         aCursorPos = ScAddress( nCol, nRow, nTab );
     127             : 
     128           0 :         pScMod->InitFormEditData();                             // create new
     129           0 :         pData = pScMod->GetFormEditData();
     130           0 :         pData->SetInputHandler(pScMod->GetInputHdl());
     131           0 :         pData->SetDocShell(pViewData->GetDocShell());
     132             : 
     133             :         OSL_ENSURE(pData,"FormEditData ist nicht da");
     134             : 
     135           0 :         formula::FormulaDlgMode eMode = FORMULA_FORMDLG_FORMULA;            // default...
     136             : 
     137             :         // edit if formula exists
     138             : 
     139           0 :         OUString aFormula;
     140           0 :         pDoc->GetFormula( nCol, nRow, nTab, aFormula );
     141           0 :         bool bEdit   = ( aFormula.getLength() > 1 );
     142           0 :         bool bMatrix = false;
     143           0 :         if ( bEdit )
     144             :         {
     145           0 :             bMatrix = CheckMatrix(aFormula);
     146             : 
     147           0 :             sal_Int32 nFStart = 0;
     148           0 :             sal_Int32 nFEnd   = 0;
     149           0 :             if ( GetFormulaHelper().GetNextFunc( aFormula, false, nFStart, &nFEnd) )
     150             :             {
     151           0 :                 pScMod->InputReplaceSelection( aFormula );
     152           0 :                 pScMod->InputSetSelection( nFStart, nFEnd );
     153             :                 sal_Int32 PrivStart, PrivEnd;
     154           0 :                 pScMod->InputGetSelection( PrivStart, PrivEnd);
     155             : 
     156           0 :                 eMode = SetMeText(pScMod->InputGetFormulaStr(),PrivStart, PrivEnd, bMatrix, true, true);
     157           0 :                 pData->SetFStart( nFStart );
     158             :             }
     159             :             else
     160           0 :                 bEdit = false;
     161             :         }
     162             : 
     163           0 :         if ( !bEdit )
     164             :         {
     165           0 :             OUString aNewFormula('=');
     166           0 :             if ( aFormula.startsWith("=") )
     167           0 :                 aNewFormula = aFormula;
     168             : 
     169           0 :             pScMod->InputReplaceSelection( aNewFormula );
     170           0 :             pScMod->InputSetSelection( 1, aNewFormula.getLength()+1 );
     171             :             sal_Int32 PrivStart, PrivEnd;
     172           0 :             pScMod->InputGetSelection( PrivStart, PrivEnd);
     173           0 :             SetMeText(pScMod->InputGetFormulaStr(),PrivStart, PrivEnd,bMatrix,false,false);
     174             : 
     175           0 :             pData->SetFStart( 1 );      // after "="
     176             :         }
     177             : 
     178           0 :         pData->SetMode( (sal_uInt16) eMode );
     179           0 :         OUString rStrExp = GetMeText();
     180             : 
     181           0 :         Update(rStrExp);
     182           0 :     }
     183             : 
     184           0 : }
     185             : 
     186           0 : void ScFormulaDlg::notifyChange()
     187             : {
     188           0 :     ScModule* pScMod = SC_MOD();
     189             : 
     190           0 :     ScInputHandler* pInputHdl = pScMod->GetInputHdl();
     191           0 :     if ( pInputHdl )
     192           0 :         pInputHdl->NotifyChange( NULL );
     193           0 : }
     194             : 
     195           0 : void ScFormulaDlg::fill()
     196             : {
     197           0 :     ScModule* pScMod = SC_MOD();
     198           0 :     ScFormEditData* pData = pScMod->GetFormEditData();
     199           0 :     notifyChange();
     200           0 :     OUString rStrExp;
     201           0 :     if (pData)
     202             :     {
     203             :         //  data exists -> restore state (after switch)
     204             :         //  don't reinitialise pDoc and aCursorPos
     205             :         //pDoc = pViewData->GetDocument();
     206           0 :         if(IsInputHdl(pData->GetInputHandler()))
     207             :         {
     208           0 :             pScMod->SetRefInputHdl(pData->GetInputHandler());
     209             :         }
     210             :         else
     211             :         {
     212             :             PtrTabViewShell pTabViewShell;
     213           0 :             ScInputHandler* pInputHdl = GetNextInputHandler(pData->GetDocShell(),&pTabViewShell);
     214             : 
     215           0 :             if ( pInputHdl == NULL ) //no more InputHandler for DocShell
     216             :             {
     217           0 :                 disableOk();
     218           0 :                 pInputHdl = pScMod->GetInputHdl();
     219             :             }
     220             :             else
     221             :             {
     222           0 :                 pInputHdl->SetRefViewShell(pTabViewShell);
     223             :             }
     224           0 :             pScMod->SetRefInputHdl(pInputHdl);
     225           0 :             pData->SetInputHandler(pInputHdl);
     226             :         }
     227             : 
     228           0 :         OUString aOldFormulaTmp(pScMod->InputGetFormulaStr());
     229           0 :         pScMod->InputSetSelection( 0, aOldFormulaTmp.getLength());
     230             : 
     231           0 :         rStrExp=pData->GetUndoStr();
     232           0 :         pScMod->InputReplaceSelection(rStrExp);
     233             : 
     234           0 :         SetMeText(rStrExp);
     235             : 
     236           0 :         Update();
     237             :         // switch back, maybe new Doc has been opened
     238           0 :         pScMod->SetRefInputHdl(NULL);
     239           0 :     }
     240           0 : }
     241             : 
     242           0 : ScFormulaDlg::~ScFormulaDlg()
     243             : {
     244           0 :     disposeOnce();
     245           0 : }
     246             : 
     247           0 : void ScFormulaDlg::dispose()
     248             : {
     249           0 :     ScModule* pScMod = SC_MOD();
     250           0 :     ScFormEditData* pData = pScMod->GetFormEditData();
     251             : 
     252           0 :     if (pData) // close dosen't destroy;
     253             :     {
     254             :         //set back reference input handler
     255           0 :         pScMod->SetRefInputHdl(NULL);
     256           0 :         StoreFormEditData(pData);
     257             :     }
     258           0 :     formula::FormulaDlg::dispose();
     259           0 : }
     260             : 
     261           0 : bool ScFormulaDlg::IsInputHdl(ScInputHandler* pHdl)
     262             : {
     263           0 :     bool bAlive = false;
     264             : 
     265             :     //  belongs InputHandler to a ViewShell?
     266             : 
     267           0 :     TypeId aScType = TYPE(ScTabViewShell);
     268           0 :     SfxViewShell* pSh = SfxViewShell::GetFirst( &aScType );
     269           0 :     while ( pSh && !bAlive )
     270             :     {
     271           0 :         if (static_cast<ScTabViewShell*>(pSh)->GetInputHandler() == pHdl)
     272           0 :             bAlive = true;
     273           0 :         pSh = SfxViewShell::GetNext( *pSh, &aScType );
     274             :     }
     275             : 
     276           0 :     return bAlive;
     277             : 
     278             : }
     279             : 
     280           0 : ScInputHandler* ScFormulaDlg::GetNextInputHandler(ScDocShell* pDocShell,PtrTabViewShell* ppViewSh)
     281             : {
     282           0 :     ScInputHandler* pHdl=NULL;
     283             : 
     284           0 :     SfxViewFrame* pFrame = SfxViewFrame::GetFirst( pDocShell );
     285           0 :     while( pFrame && pHdl==NULL)
     286             :     {
     287           0 :         SfxViewShell* p = pFrame->GetViewShell();
     288           0 :         ScTabViewShell* pViewSh = PTR_CAST(ScTabViewShell,p);
     289           0 :         if(pViewSh!=NULL)
     290             :         {
     291           0 :             pHdl=pViewSh->GetInputHandler();
     292           0 :             if(ppViewSh!=NULL) *ppViewSh=pViewSh;
     293             :         }
     294           0 :         pFrame = SfxViewFrame::GetNext( *pFrame, pDocShell );
     295             :     }
     296             : 
     297           0 :     return pHdl;
     298             : }
     299             : 
     300           0 : bool ScFormulaDlg::Close()
     301             : {
     302           0 :     DoEnter(false);
     303           0 :     return true;
     304             : }
     305             : 
     306             : //                          functions for right side
     307             : 
     308           0 : bool ScFormulaDlg::calculateValue( const OUString& rStrExp, OUString& rStrResult )
     309             : {
     310           0 :     boost::scoped_ptr<ScSimpleFormulaCalculator> pFCell( new ScSimpleFormulaCalculator( pDoc, aCursorPos, rStrExp ) );
     311             : 
     312             :     // HACK! to avoid neither #REF! from ColRowNames
     313             :     // if a name is added as actually range in the overall formula,
     314             :     // but is interpreted at the individual representation as single-cell reference
     315           0 :     bool bColRowName = pFCell->HasColRowName();
     316           0 :     if ( bColRowName )
     317             :     {
     318             :         // ColRowName from RPN-Code?
     319           0 :         if ( pFCell->GetCode()->GetCodeLen() <= 1 )
     320             :         {   // ==1: area
     321             :             // ==0: would be an area if...
     322           0 :             OUStringBuffer aBraced;
     323           0 :             aBraced.append('(');
     324           0 :             aBraced.append(rStrExp);
     325           0 :             aBraced.append(')');
     326           0 :             pFCell.reset( new ScSimpleFormulaCalculator( pDoc, aCursorPos, aBraced.makeStringAndClear() ) );
     327             :         }
     328             :         else
     329           0 :             bColRowName = false;
     330             :     }
     331             : 
     332           0 :     sal_uInt16 nErrCode = pFCell->GetErrCode();
     333           0 :     if ( nErrCode == 0 )
     334             :     {
     335           0 :         SvNumberFormatter& aFormatter = *(pDoc->GetFormatTable());
     336             :         Color* pColor;
     337           0 :         if ( pFCell->IsValue() )
     338             :         {
     339           0 :             double n = pFCell->GetValue();
     340             :             sal_uLong nFormat = aFormatter.GetStandardFormat( n, 0,
     341           0 :                             pFCell->GetFormatType(), ScGlobal::eLnge );
     342             :             aFormatter.GetOutputString( n, nFormat,
     343           0 :                                         rStrResult, &pColor );
     344             :         }
     345             :         else
     346             :         {
     347             :             sal_uLong nFormat = aFormatter.GetStandardFormat(
     348           0 :                             pFCell->GetFormatType(), ScGlobal::eLnge);
     349             :             aFormatter.GetOutputString( pFCell->GetString().getString(), nFormat,
     350           0 :                                         rStrResult, &pColor );
     351             :         }
     352             : 
     353           0 :         ScRange aTestRange;
     354           0 :         if ( bColRowName || (aTestRange.Parse(rStrExp) & SCA_VALID) )
     355           0 :             rStrResult += " ...";
     356             :             // area
     357             :     }
     358             :     else
     359           0 :         rStrResult += ScGlobal::GetErrorString(nErrCode);
     360             : 
     361           0 :     return true;
     362             : }
     363             : 
     364             : //  virtual methods of ScAnyRefDlg:
     365           0 : void ScFormulaDlg::RefInputStart( formula::RefEdit* pEdit, formula::RefButton* pButton )
     366             : {
     367           0 :     pEdit->SetSelection(Selection(0, SELECTION_MAX));
     368           0 :     ::std::pair<formula::RefButton*,formula::RefEdit*> aPair = RefInputStartBefore( pEdit, pButton );
     369           0 :     m_aHelper.RefInputStart( aPair.second, aPair.first);
     370           0 :     RefInputStartAfter( aPair.second, aPair.first );
     371           0 : }
     372             : 
     373           0 : void ScFormulaDlg::RefInputDone( bool bForced )
     374             : {
     375           0 :     m_aHelper.RefInputDone( bForced );
     376           0 :     RefInputDoneAfter( bForced );
     377           0 : }
     378             : 
     379           0 : void ScFormulaDlg::SetReference( const ScRange& rRef, ScDocument* pRefDoc )
     380             : {
     381           0 :     const IFunctionDescription* pFunc = getCurrentFunctionDescription();
     382           0 :     if ( pFunc && pFunc->getSuppressedArgumentCount() > 0 )
     383             :     {
     384           0 :         Selection theSel;
     385           0 :         bool bRefNull = UpdateParaWin(theSel);
     386             : 
     387           0 :         if ( rRef.aStart != rRef.aEnd && bRefNull )
     388             :         {
     389           0 :             RefInputStart(GetActiveEdit());
     390             :         }
     391             : 
     392           0 :         OUString      aRefStr;
     393           0 :         bool bOtherDoc = ( pRefDoc != pDoc && pRefDoc->GetDocumentShell()->HasName() );
     394           0 :         if ( bOtherDoc )
     395             :         {
     396             :             //  reference to other document - wie inputhdl.cxx
     397             : 
     398             :             OSL_ENSURE(rRef.aStart.Tab()==rRef.aEnd.Tab(), "nStartTab!=nEndTab");
     399             : 
     400           0 :             OUString aTmp(rRef.Format(SCA_VALID|SCA_TAB_3D, pRefDoc));     // immer 3d
     401             : 
     402           0 :             SfxObjectShell* pObjSh = pRefDoc->GetDocumentShell();
     403             : 
     404             :             // #i75893# convert escaped URL of the document to something user friendly
     405             : //           OUString aFileName = pObjSh->GetMedium()->GetName();
     406           0 :             OUString aFileName = pObjSh->GetMedium()->GetURLObject().GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS );
     407             : 
     408           0 :             aRefStr = "'";
     409           0 :             aRefStr += aFileName;
     410           0 :             aRefStr += "'#";
     411           0 :             aRefStr += aTmp;
     412             :         }
     413             :         else
     414             :         {
     415             :             // We can't use ScRange::Format here because in R1C1 mode we need
     416             :             // to display the reference position relative to the cursor
     417             :             // position.
     418           0 :             ScTokenArray aArray;
     419             :             ScComplexRefData aRefData;
     420           0 :             aRefData.InitRangeRel(rRef, aCursorPos);
     421           0 :             bool bSingle = aRefData.Ref1 == aRefData.Ref2;
     422           0 :             if (aCursorPos.Tab() != rRef.aStart.Tab())
     423           0 :                 aRefData.Ref1.SetFlag3D(true);
     424           0 :             if (bSingle)
     425           0 :                 aArray.AddSingleReference(aRefData.Ref1);
     426             :             else
     427           0 :                 aArray.AddDoubleReference(aRefData);
     428           0 :             ScCompiler aComp(pDoc, aCursorPos, aArray);
     429           0 :             aComp.SetGrammar(pDoc->GetGrammar());
     430           0 :             OUStringBuffer aBuf;
     431           0 :             aComp.CreateStringFromTokenArray(aBuf);
     432           0 :             aRefStr = aBuf.makeStringAndClear();
     433             :         }
     434             : 
     435           0 :         UpdateParaWin(theSel,aRefStr);
     436             :     }
     437           0 : }
     438             : 
     439           0 : bool ScFormulaDlg::IsRefInputMode() const
     440             : {
     441           0 :     const IFunctionDescription* pDesc = getCurrentFunctionDescription();
     442           0 :     bool bRef = (pDesc && (pDesc->getSuppressedArgumentCount() > 0)) && (pDoc!=NULL);
     443           0 :     return bRef;
     444             : }
     445             : 
     446           0 : bool ScFormulaDlg::IsDocAllowed(SfxObjectShell* pDocSh) const
     447             : {
     448             :     //  not allowed: different from this doc, and no name
     449             :     //  pDocSh is always a ScDocShell
     450           0 :     if ( pDocSh && &static_cast<ScDocShell*>(pDocSh)->GetDocument() != pDoc && !pDocSh->HasName() )
     451           0 :         return false;
     452             : 
     453           0 :     return true;        // everything else is allowed
     454             : }
     455             : 
     456           0 : void ScFormulaDlg::SetActive()
     457             : {
     458           0 :     const IFunctionDescription* pFunc = getCurrentFunctionDescription();
     459           0 :     if ( pFunc && pFunc->getSuppressedArgumentCount() > 0 )
     460             :     {
     461           0 :         RefInputDone();
     462           0 :         SetEdSelection();
     463             :     }
     464           0 : }
     465             : 
     466           0 : void ScFormulaDlg::SaveLRUEntry(const ScFuncDesc* pFuncDescP)
     467             : {
     468           0 :     if (pFuncDescP && pFuncDescP->nFIndex!=0)
     469             :     {
     470           0 :         ScModule* pScMod = SC_MOD();
     471           0 :         pScMod->InsertEntryToLRUList(pFuncDescP->nFIndex);
     472             :     }
     473           0 : }
     474             : 
     475           0 : void ScFormulaDlg::doClose(bool /*_bOk*/)
     476             : {
     477           0 :     m_aHelper.DoClose( ScFormulaDlgWrapper::GetChildWindowId() );
     478           0 : }
     479           0 : void ScFormulaDlg::insertEntryToLRUList(const formula::IFunctionDescription*    _pDesc)
     480             : {
     481           0 :     const ScFuncDesc* pDesc = dynamic_cast<const ScFuncDesc*>(_pDesc);
     482           0 :     SaveLRUEntry(pDesc);
     483           0 : }
     484           0 : void ScFormulaDlg::showReference(const OUString& _sFormula)
     485             : {
     486           0 :     ShowReference(_sFormula);
     487           0 : }
     488           0 : void ScFormulaDlg::ShowReference(const OUString& _sFormula)
     489             : {
     490           0 :     m_aHelper.ShowReference(_sFormula);
     491           0 : }
     492           0 : void ScFormulaDlg::HideReference( bool bDoneRefMode )
     493             : {
     494           0 :     m_aHelper.HideReference(bDoneRefMode);
     495           0 : }
     496           0 : void ScFormulaDlg::ViewShellChanged()
     497             : {
     498           0 :     ScFormulaReferenceHelper::ViewShellChanged();
     499           0 : }
     500           0 : void ScFormulaDlg::AddRefEntry( )
     501             : {
     502             : 
     503           0 : }
     504           0 : bool ScFormulaDlg::IsTableLocked( ) const
     505             : {
     506             :     // default: reference input can also be used to switch the table
     507           0 :     return false;
     508             : }
     509           0 : void ScFormulaDlg::ToggleCollapsed( formula::RefEdit* pEdit, formula::RefButton* pButton)
     510             : {
     511           0 :     m_aHelper.ToggleCollapsed(pEdit,pButton);
     512           0 : }
     513           0 : void ScFormulaDlg::ReleaseFocus( formula::RefEdit* pEdit, formula::RefButton* pButton)
     514             : {
     515           0 :     m_aHelper.ReleaseFocus(pEdit,pButton);
     516           0 : }
     517           0 : void ScFormulaDlg::dispatch(bool _bOK, bool _bMatrixChecked)
     518             : {
     519           0 :     SfxBoolItem   aRetItem( SID_DLG_RETOK, _bOK );
     520           0 :     SfxBoolItem   aMatItem( SID_DLG_MATRIX, _bMatrixChecked );
     521           0 :     SfxStringItem aStrItem( SCITEM_STRING, getCurrentFormula() );
     522             : 
     523             :     // if edit line is empty (caused by document switching) -> string is empty
     524             :     // -> don't delete old formula
     525           0 :     if ( aStrItem.GetValue().isEmpty() )
     526           0 :         aRetItem.SetValue( false );     // sal_False = Cancel
     527             : 
     528           0 :     ScFormulaReferenceHelper::SetDispatcherLock( false ); // turn off modal-mode
     529             : 
     530           0 :     clear();
     531             : 
     532           0 :     GetBindings().GetDispatcher()->Execute( SID_INS_FUNCTION,
     533             :                               SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
     534           0 :                               &aRetItem, &aStrItem, &aMatItem, 0L );
     535           0 : }
     536           0 : void ScFormulaDlg::setDispatcherLock( bool bLock )
     537             : {
     538           0 :     ScFormulaReferenceHelper::SetDispatcherLock( bLock );
     539           0 : }
     540           0 : void ScFormulaDlg::setReferenceInput(const formula::FormEditData* _pData)
     541             : {
     542           0 :     ScModule* pScMod = SC_MOD();
     543           0 :     ScFormEditData& rData = const_cast<ScFormEditData&>(dynamic_cast<const ScFormEditData&>(*_pData));
     544           0 :     pScMod->SetRefInputHdl(rData.GetInputHandler());
     545           0 : }
     546           0 : void ScFormulaDlg::deleteFormData()
     547             : {
     548           0 :     ScModule* pScMod = SC_MOD();
     549           0 :     pScMod->ClearFormEditData();        // pData is invalid!
     550           0 : }
     551           0 : void ScFormulaDlg::clear()
     552             : {
     553           0 :     pDoc = NULL;
     554             : 
     555             :     //restore reference inputhandler
     556           0 :     ScModule* pScMod = SC_MOD();
     557           0 :     pScMod->SetRefInputHdl(NULL);
     558             : 
     559             :     // force Enable() of edit line
     560           0 :     ScTabViewShell* pScViewShell = PTR_CAST(ScTabViewShell, SfxViewShell::Current());
     561           0 :     if ( pScViewShell )
     562           0 :         pScViewShell->UpdateInputHandler();
     563           0 : }
     564           0 : void ScFormulaDlg::switchBack()
     565             : {
     566           0 :     ScModule* pScMod = SC_MOD();
     567             :     // back to the document
     568             :     // (foreign doc could be above - #34222#)
     569           0 :     ScInputHandler* pHdl = pScMod->GetInputHdl();
     570           0 :     if ( pHdl )
     571             :     {
     572           0 :         pHdl->ViewShellGone(NULL);  // -> get active view
     573           0 :         pHdl->ShowRefFrame();
     574             :     }
     575             : 
     576             :     // restore current chart (cause mouse-RefInput)
     577           0 :     ScTabViewShell* pScViewShell = PTR_CAST(ScTabViewShell, SfxViewShell::Current());
     578           0 :     if ( pScViewShell )
     579             :     {
     580           0 :         ScViewData& rVD=pScViewShell->GetViewData();
     581           0 :         SCTAB nExecTab = aCursorPos.Tab();
     582           0 :         if ( nExecTab != rVD.GetTabNo() )
     583           0 :             pScViewShell->SetTabNo( nExecTab );
     584             : 
     585           0 :         SCROW nRow=aCursorPos.Row();
     586           0 :         SCCOL nCol=aCursorPos.Col();
     587             : 
     588           0 :         if(rVD.GetCurX()!=nCol || rVD.GetCurY()!=nRow)
     589           0 :             pScViewShell->SetCursor(nCol,nRow);
     590             :     }
     591           0 : }
     592           0 : formula::FormEditData* ScFormulaDlg::getFormEditData() const
     593             : {
     594           0 :     ScModule* pScMod = SC_MOD();
     595           0 :     return pScMod->GetFormEditData();
     596             : }
     597           0 : void ScFormulaDlg::setCurrentFormula(const OUString& _sReplacement)
     598             : {
     599           0 :     ScModule* pScMod = SC_MOD();
     600             :     {
     601             :         //fdo#69971 We need the EditEngine Modification handler of the inputbar that we
     602             :         //are feeding to be disabled while this dialog is open. Otherwise we end up in
     603             :         //a situation where...
     604             :         //a) this ScFormulaDlg changes the editengine
     605             :         //b) the modify callback gets called
     606             :         //c) which also modifies the editengine
     607             :         //d) on return from that modify handler the editengine attempts to use
     608             :         //   old node pointers which were replaced and removed by c
     609             :         //
     610             :         //We turn it off in the ctor and back on in the dtor, but if calc has
     611             :         //to repaint, e.g. when switching to another window and back, then in
     612             :         //ScMultiTextWnd::Paint a new editengine will have been created via
     613             :         //GetEditView with its default Modification handler enabled. So ensure
     614             :         //its off when we will access it via InputReplaceSelection
     615           0 :         pScMod->InputTurnOffWinEngine();
     616             :     }
     617           0 :     pScMod->InputReplaceSelection(_sReplacement);
     618           0 : }
     619           0 : void ScFormulaDlg::setSelection(sal_Int32 _nStart, sal_Int32 _nEnd)
     620             : {
     621           0 :     ScModule* pScMod = SC_MOD();
     622           0 :     pScMod->InputSetSelection( _nStart, _nEnd );
     623           0 : }
     624           0 : void ScFormulaDlg::getSelection(sal_Int32& _nStart, sal_Int32& _nEnd) const
     625             : {
     626           0 :     ScModule* pScMod = SC_MOD();
     627           0 :     pScMod->InputGetSelection( _nStart, _nEnd );
     628           0 : }
     629           0 : OUString ScFormulaDlg::getCurrentFormula() const
     630             : {
     631           0 :     ScModule* pScMod = SC_MOD();
     632           0 :     return pScMod->InputGetFormulaStr();
     633             : }
     634           0 : formula::IFunctionManager* ScFormulaDlg::getFunctionManager()
     635             : {
     636           0 :     return ScGlobal::GetStarCalcFunctionMgr();
     637             : }
     638           0 : uno::Reference< sheet::XFormulaParser> ScFormulaDlg::getFormulaParser() const
     639             : {
     640           0 :     return m_xParser;
     641             : }
     642           0 : uno::Reference< sheet::XFormulaOpCodeMapper> ScFormulaDlg::getFormulaOpCodeMapper() const
     643             : {
     644           0 :     return m_xOpCodeMapper;
     645             : }
     646             : 
     647           0 : table::CellAddress ScFormulaDlg::getReferencePosition() const
     648             : {
     649           0 :     return table::CellAddress(aCursorPos.Tab(),aCursorPos.Col(),aCursorPos.Row());
     650             : }
     651             : 
     652           0 : ::std::unique_ptr<formula::FormulaTokenArray> ScFormulaDlg::convertToTokenArray(const uno::Sequence< sheet::FormulaToken >& _aTokenList)
     653             : {
     654           0 :     ::std::unique_ptr<formula::FormulaTokenArray> pArray(new ScTokenArray());
     655           0 :     pArray->Fill(_aTokenList, pDoc->GetSharedStringPool(), pDoc->GetExternalRefManager());
     656           0 :     return pArray;
     657         156 : }
     658             : 
     659             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11