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

Generated by: LCOV version 1.10