LCOV - code coverage report
Current view: top level - formula/source/ui/dlg - formula.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 932 0.0 %
Date: 2014-04-14 Functions: 0 101 0.0 %
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 <sfx2/dispatch.hxx>
      21             : #include <sfx2/docfile.hxx>
      22             : #include <sfx2/viewfrm.hxx>
      23             : #include <vcl/svapp.hxx>
      24             : #include <vcl/mnemonic.hxx>
      25             : #include <vcl/tabpage.hxx>
      26             : #include <vcl/tabctrl.hxx>
      27             : #include <vcl/lstbox.hxx>
      28             : #include <vcl/group.hxx>
      29             : #include <vcl/wall.hxx>
      30             : 
      31             : #include <svtools/stdctrl.hxx>
      32             : #include <svtools/svmedit.hxx>
      33             : #include <svtools/treelistbox.hxx>
      34             : #include <svl/stritem.hxx>
      35             : #include <svl/zforlist.hxx>
      36             : #include <svl/eitem.hxx>
      37             : 
      38             : #include <unotools/charclass.hxx>
      39             : #include <tools/diagnose_ex.h>
      40             : 
      41             : #include "formdlgs.hrc"
      42             : #include "funcpage.hxx"
      43             : #include "formula/formula.hxx"
      44             : #include "formula/IFunctionDescription.hxx"
      45             : #include "formula/FormulaCompiler.hxx"
      46             : #include "formula/token.hxx"
      47             : #include "formula/tokenarray.hxx"
      48             : #include "formula/formdata.hxx"
      49             : #include "formula/formulahelper.hxx"
      50             : #include "structpg.hxx"
      51             : #include "parawin.hxx"
      52             : #include "ModuleHelper.hxx"
      53             : #include "ForResId.hrc"
      54             : #include <com/sun/star/sheet/FormulaToken.hpp>
      55             : #include <com/sun/star/sheet/FormulaLanguage.hpp>
      56             : #include <com/sun/star/sheet/FormulaMapGroup.hpp>
      57             : #include <com/sun/star/sheet/FormulaMapGroupSpecialOffset.hpp>
      58             : #include <com/sun/star/beans/XPropertySet.hpp>
      59             : #include <boost/ref.hpp>
      60             : #include <boost/shared_ptr.hpp>
      61             : #include <comphelper/processfactory.hxx>
      62             : #include <comphelper/string.hxx>
      63             : #include <map>
      64             : 
      65             : #define TOKEN_OPEN  0
      66             : #define TOKEN_CLOSE 1
      67             : #define TOKEN_SEP   2
      68             : namespace formula
      69             : {
      70             :     using namespace ::com::sun::star;
      71             : 
      72             :     class OFormulaToken : public IFormulaToken
      73             :     {
      74             :         sal_Int32   m_nParaCount;
      75             :         bool        m_bIsFunction;
      76             : 
      77             :     public:
      78             :         OFormulaToken(bool _bFunction,sal_Int32 _nParaCount) : m_nParaCount(_nParaCount),m_bIsFunction(_bFunction){}
      79             : 
      80             :         virtual ~OFormulaToken() {}
      81             : 
      82             :         virtual bool isFunction() const SAL_OVERRIDE { return m_bIsFunction; }
      83             :         virtual sal_uInt32 getArgumentCount() const SAL_OVERRIDE { return m_nParaCount; }
      84             :     };
      85             : 
      86             : 
      87             :     class FormulaDlg_Impl
      88             :     {
      89             :     public:
      90             :         ::std::pair<RefButton*,RefEdit*>
      91             :                         RefInputStartBefore( RefEdit* pEdit, RefButton* pButton );
      92             :         void            RefInputStartAfter( RefEdit* pEdit, RefButton* pButton );
      93             :         void            RefInputDoneAfter( bool bForced );
      94             :         sal_Bool        CalcValue( const OUString& rStrExp, OUString& rStrResult );
      95             :         sal_Bool        CalcStruct( const OUString& rStrExp);
      96             :         void            UpdateValues();
      97             :         void            DeleteArgs();
      98             :         sal_Int32       GetFunctionPos(sal_Int32 nPos);
      99             :         void            ClearAllParas();
     100             : 
     101             :         void            MakeTree(IStructHelper* _pTree,SvTreeListEntry* pParent,FormulaToken* _pToken,long Count);
     102             :         void            fillTree(IStructHelper* _pTree);
     103             :         void            UpdateTokenArray( const OUString& rStrExp);
     104             :         OUString        RepairFormula(const OUString& aFormula);
     105             :         void            FillDialog(sal_Bool nFlag=sal_True);
     106             :         void            EditNextFunc( sal_Bool bForward, sal_Int32 nFStart=NOT_FOUND );
     107             :         void            EditThisFunc(sal_Int32 nFStart);
     108             : 
     109             :         void            StoreFormEditData(FormEditData* pEditData);
     110             : 
     111             :         void            UpdateArgInput( sal_uInt16 nOffset, sal_uInt16 nInput );
     112             :         void            Update();
     113             :         void            Update(const OUString& _sExp);
     114             : 
     115             :         void            SaveArg( sal_uInt16 nEd );
     116             :         void            UpdateSelection();
     117             :         void            DoEnter( bool bOk );
     118             :         void            FillListboxes();
     119             :         void            FillControls(sal_Bool &rbNext, sal_Bool &rbPrev);
     120             : 
     121             :         FormulaDlgMode  SetMeText(const OUString& _sText, sal_Int32 PrivStart, sal_Int32 PrivEnd, bool bMatrix, bool _bSelect, bool _bUpdate);
     122             :         void            SetMeText(const OUString& _sText);
     123             :         bool            CheckMatrix(OUString& aFormula /*IN/OUT*/);
     124             : 
     125             :         void            SetEdSelection();
     126             : 
     127             :         bool            UpdateParaWin(Selection& _rSelection);
     128             :         void            UpdateParaWin(const Selection& _rSelection,const OUString& _sRefStr);
     129             : 
     130             :         void            SetData(sal_Int32 nFStart, sal_Int32 nNextFStart, sal_Int32 nNextFEnd, sal_Int32& PrivStart, sal_Int32& PrivEnd);
     131             :         void            PreNotify( NotifyEvent& rNEvt );
     132             : 
     133             :         RefEdit*        GetCurrRefEdit();
     134             : 
     135             :         const FormulaHelper& GetFormulaHelper() const;
     136             :         uno::Reference< sheet::XFormulaOpCodeMapper > GetFormulaOpCodeMapper() const;
     137             : 
     138             :         DECL_LINK( ModifyHdl, ParaWin* );
     139             :         DECL_LINK( FxHdl, ParaWin* );
     140             : 
     141             :         DECL_LINK(MatrixHdl, void *);
     142             :         DECL_LINK(FormulaHdl, void *);
     143             :         DECL_LINK(FormulaCursorHdl, void *);
     144             :         DECL_LINK( BtnHdl, PushButton* );
     145             :         DECL_LINK( GetEdFocusHdl, ArgInput* );
     146             :         DECL_LINK( GetFxFocusHdl, ArgInput* );
     147             :         DECL_LINK(DblClkHdl, void *);
     148             :         DECL_LINK(FuncSelHdl, void *);
     149             :         DECL_LINK(StructSelHdl, void *);
     150             :     public:
     151             :         mutable uno::Reference< sheet::XFormulaOpCodeMapper>    m_xOpCodeMapper;
     152             :         uno::Sequence< sheet::FormulaToken >                    m_aTokenList;
     153             :         ::std::auto_ptr<FormulaTokenArray>                      m_pTokenArray;
     154             :         mutable uno::Sequence< sheet::FormulaOpCodeMapEntry >   m_aSpecialOpCodes;
     155             :         mutable const sheet::FormulaOpCodeMapEntry*             m_pSpecialOpCodesEnd;
     156             :         mutable uno::Sequence< sheet::FormulaToken >            m_aSeparatorsOpCodes;
     157             :         mutable uno::Sequence< sheet::FormulaOpCodeMapEntry >   m_aFunctionOpCodes;
     158             :         mutable const sheet::FormulaOpCodeMapEntry*             m_pFunctionOpCodesEnd;
     159             :         mutable uno::Sequence< sheet::FormulaOpCodeMapEntry >   m_aUnaryOpCodes;
     160             :         mutable const sheet::FormulaOpCodeMapEntry*             m_pUnaryOpCodesEnd;
     161             :         mutable uno::Sequence< sheet::FormulaOpCodeMapEntry >   m_aBinaryOpCodes;
     162             :         mutable const sheet::FormulaOpCodeMapEntry*             m_pBinaryOpCodesEnd;
     163             :         ::std::vector< ::boost::shared_ptr<OFormulaToken> >     m_aTokens;
     164             :         ::std::map<FormulaToken*,sheet::FormulaToken>           m_aTokenMap;
     165             :         IFormulaEditorHelper*                                   m_pHelper;
     166             :         Dialog*  m_pParent;
     167             :         IControlReferenceHandler*  m_pDlg;
     168             :         TabControl      aTabCtrl;
     169             :         GroupBox        aGEdit;     //! MUST be placed before pParaWin for initializing
     170             :         ParaWin*        pParaWin;
     171             :         FixedText       aFtHeadLine;
     172             :         FixedInfo       aFtFuncName;
     173             :         FixedInfo       aFtFuncDesc;
     174             : 
     175             :         FixedText       aFtEditName;
     176             : 
     177             :         FixedText       aFtResult;
     178             :         ValWnd          aWndResult;
     179             : 
     180             :         FixedText       aFtFormula;
     181             :         EditBox         aMEFormula;
     182             : 
     183             :         CheckBox        aBtnMatrix;
     184             :         HelpButton      aBtnHelp;
     185             :         CancelButton    aBtnCancel;
     186             : 
     187             :         PushButton      aBtnBackward;
     188             :         PushButton      aBtnForward;
     189             :         OKButton        aBtnEnd;
     190             : 
     191             :         RefEdit     aEdRef;
     192             :         RefButton   aRefBtn;
     193             : 
     194             :         FixedText       aFtFormResult;
     195             :         ValWnd          aWndFormResult;
     196             : 
     197             :         RefEdit*        pTheRefEdit;
     198             :         RefButton*      pTheRefButton;
     199             :         FuncPage*       pFuncPage;
     200             :         StructPage*     pStructPage;
     201             :         OUString        aOldFormula;
     202             :         sal_Bool        bStructUpdate;
     203             :         MultiLineEdit*  pMEdit;
     204             :         sal_Bool        bUserMatrixFlag;
     205             :         Timer           aTimer;
     206             : 
     207             :         const OUString  aTitle1;
     208             :         const OUString  aTitle2;
     209             :         const OUString  aTxtEnd;
     210             :         const OUString  aTxtOk;     // behind aBtnEnd
     211             :         FormulaHelper   m_aFormulaHelper;
     212             : 
     213             :         OString    m_aEditHelpId;
     214             : 
     215             :         OString    aOldHelp;
     216             :         OString    aOldUnique;
     217             :         OString    aActivWinId;
     218             :         sal_Bool            bIsShutDown;
     219             : 
     220             :         Font            aFntBold;
     221             :         Font            aFntLight;
     222             :         sal_uInt16          nEdFocus;
     223             :         sal_Bool            bEditFlag;
     224             :         const IFunctionDescription* pFuncDesc;
     225             :         sal_Int32      nArgs;
     226             :         ::std::vector< OUString > m_aArguments;
     227             :         Selection       aFuncSel;
     228             : 
     229             :         FormulaDlg_Impl(Dialog* pParent
     230             :                         , bool _bSupportFunctionResult
     231             :                         , bool _bSupportResult
     232             :                         , bool _bSupportMatrix
     233             :                         ,IFormulaEditorHelper* _pHelper
     234             :                         ,const IFunctionManager* _pFunctionMgr
     235             :                         ,IControlReferenceHandler* _pDlg);
     236             :         ~FormulaDlg_Impl();
     237             : 
     238             :     };
     239             : 
     240           0 : FormulaDlg_Impl::FormulaDlg_Impl(Dialog* pParent
     241             :                                         , bool _bSupportFunctionResult
     242             :                                         , bool _bSupportResult
     243             :                                         , bool _bSupportMatrix
     244             :                                         ,IFormulaEditorHelper* _pHelper
     245             :                                         ,const IFunctionManager* _pFunctionMgr
     246             :                                         ,IControlReferenceHandler* _pDlg)
     247             :     :
     248             :     m_pSpecialOpCodesEnd(NULL),
     249             :     m_pFunctionOpCodesEnd(NULL),
     250             :     m_pUnaryOpCodesEnd(NULL),
     251             :     m_pBinaryOpCodesEnd(NULL),
     252             :     m_pHelper       (_pHelper),
     253             :     m_pParent       (pParent),
     254             :     m_pDlg          (_pDlg),
     255             :     aTabCtrl        ( pParent, ModuleRes( TC_FUNCTION ) ),
     256             :     aGEdit          ( pParent, ModuleRes( GB_EDIT ) ),
     257             :     aFtHeadLine     ( pParent, ModuleRes( FT_HEADLINE ) ),
     258             :     aFtFuncName     ( pParent, ModuleRes( FT_FUNCNAME ) ),
     259             :     aFtFuncDesc     ( pParent, ModuleRes( FT_FUNCDESC ) ),
     260             :     aFtEditName     ( pParent, ModuleRes( FT_EDITNAME ) ),
     261             :     aFtResult       ( pParent, ModuleRes( FT_RESULT ) ),
     262             :     aWndResult      ( pParent, ModuleRes( WND_RESULT ) ),
     263             : 
     264             :     aFtFormula      ( pParent, ModuleRes( FT_FORMULA ) ),
     265             :     aMEFormula      ( pParent, ModuleRes( ED_FORMULA ) ),
     266             :     aBtnMatrix      ( pParent, ModuleRes( BTN_MATRIX ) ),
     267             :     aBtnHelp        ( pParent, ModuleRes( BTN_HELP ) ),
     268             :     aBtnCancel      ( pParent, ModuleRes( BTN_CANCEL ) ),
     269             :     aBtnBackward    ( pParent, ModuleRes( BTN_BACKWARD ) ),
     270             :     aBtnForward     ( pParent, ModuleRes( BTN_FORWARD ) ),
     271             :     aBtnEnd         ( pParent, ModuleRes( BTN_END ) ),
     272             :     aEdRef          ( pParent, _pDlg, &aFtEditName, ModuleRes( ED_REF) ),
     273             :     aRefBtn         ( pParent, ModuleRes( RB_REF), &aEdRef, _pDlg ),
     274             :     aFtFormResult   ( pParent, ModuleRes( FT_FORMULA_RESULT)),
     275             :     aWndFormResult  ( pParent, ModuleRes( WND_FORMULA_RESULT)),
     276             :     pTheRefEdit     (NULL),
     277             :     pTheRefButton   (NULL),
     278             :     pMEdit          (NULL),
     279             :     bUserMatrixFlag (sal_False),
     280             :     aTitle1         ( ModuleRes( STR_TITLE1 ) ),        // local resource
     281             :     aTitle2         ( ModuleRes( STR_TITLE2 ) ),        // local resource
     282             :     aTxtEnd         ( ModuleRes( STR_END ) ),           // local resource
     283             :     aTxtOk          ( aBtnEnd.GetText() ),
     284             :     m_aFormulaHelper(_pFunctionMgr),
     285             :     bIsShutDown     (sal_False),
     286             :     nEdFocus        (0),
     287             :     pFuncDesc       (NULL),
     288           0 :     nArgs           (0)
     289             : {
     290           0 :     pParaWin = new ParaWin( pParent,_pDlg, aGEdit.GetPosPixel());
     291           0 :     aGEdit.Hide();
     292           0 :     pParaWin->Hide();
     293           0 :     aFtEditName.Hide();
     294           0 :     aEdRef.Hide();
     295           0 :     aRefBtn.Hide();
     296             : 
     297           0 :     pMEdit = aMEFormula.GetEdit();
     298             : 
     299           0 :     aMEFormula.SetAccessibleName(aFtFormula.GetText());
     300           0 :     pMEdit->SetAccessibleName(aFtFormula.GetText());
     301             : 
     302           0 :     m_aEditHelpId = pMEdit->GetHelpId();
     303           0 :     pMEdit->SetUniqueId( m_aEditHelpId );
     304             : 
     305           0 :     bEditFlag=sal_False;
     306           0 :     bStructUpdate=sal_True;
     307           0 :     Point aPos=aGEdit.GetPosPixel();
     308           0 :     pParaWin->SetPosPixel(aPos);
     309           0 :     pParaWin->SetArgModifiedHdl(LINK( this, FormulaDlg_Impl, ModifyHdl ) );
     310           0 :     pParaWin->SetFxHdl(LINK( this, FormulaDlg_Impl, FxHdl ) );
     311             : 
     312           0 :     pFuncPage= new FuncPage( &aTabCtrl,_pFunctionMgr);
     313           0 :     pStructPage= new StructPage( &aTabCtrl);
     314           0 :     pFuncPage->Hide();
     315           0 :     pStructPage->Hide();
     316           0 :     aTabCtrl.SetTabPage( TP_FUNCTION, pFuncPage);
     317           0 :     aTabCtrl.SetTabPage( TP_STRUCT, pStructPage);
     318             : 
     319           0 :     aOldHelp = pParent->GetHelpId();                // HelpId from resource always for "Page 1"
     320           0 :     aOldUnique = pParent->GetUniqueId();
     321             : 
     322           0 :     aFtResult.Show( _bSupportResult );
     323           0 :     aWndResult.Show( _bSupportResult );
     324             : 
     325           0 :     aFtFormResult.Show( _bSupportFunctionResult );
     326           0 :     aWndFormResult.Show( _bSupportFunctionResult );
     327             : 
     328           0 :     if ( _bSupportMatrix )
     329           0 :         aBtnMatrix.SetClickHdl(LINK( this, FormulaDlg_Impl, MatrixHdl ) );
     330             :     else
     331           0 :         aBtnMatrix.Hide();
     332             : 
     333           0 :     aBtnCancel  .SetClickHdl( LINK( this, FormulaDlg_Impl, BtnHdl ) );
     334           0 :     aBtnEnd     .SetClickHdl( LINK( this, FormulaDlg_Impl, BtnHdl ) );
     335           0 :     aBtnForward .SetClickHdl( LINK( this, FormulaDlg_Impl, BtnHdl ) );
     336           0 :     aBtnBackward.SetClickHdl( LINK( this, FormulaDlg_Impl, BtnHdl ) );
     337             : 
     338           0 :     pFuncPage->SetDoubleClickHdl( LINK( this, FormulaDlg_Impl, DblClkHdl ) );
     339           0 :     pFuncPage->SetSelectHdl( LINK( this, FormulaDlg_Impl, FuncSelHdl) );
     340           0 :     pStructPage->SetSelectionHdl( LINK( this, FormulaDlg_Impl, StructSelHdl ) );
     341           0 :     pMEdit->SetModifyHdl( LINK( this, FormulaDlg_Impl, FormulaHdl ) );
     342           0 :     aMEFormula.SetSelChangedHdl( LINK( this, FormulaDlg_Impl, FormulaCursorHdl ) );
     343             : 
     344           0 :     aFntLight = aFtFormula.GetFont();
     345           0 :     aFntLight.SetTransparent( true );
     346           0 :     aFntBold = aFntLight;
     347           0 :     aFntBold.SetWeight( WEIGHT_BOLD );
     348             : 
     349           0 :     pParaWin->SetArgumentFonts(aFntBold,aFntLight);
     350             : 
     351             :     //  function description for choosing a function is no longer in a different color
     352             : 
     353           0 :     aFtHeadLine.SetFont(aFntBold);
     354           0 :     aFtFuncName.SetFont(aFntLight);
     355           0 :     aFtFuncDesc.SetFont(aFntLight);
     356           0 : }
     357             : 
     358           0 : FormulaDlg_Impl::~FormulaDlg_Impl()
     359             : {
     360           0 :     if(aTimer.IsActive())
     361             :     {
     362           0 :         aTimer.SetTimeoutHdl(Link());
     363           0 :         aTimer.Stop();
     364             :     }// if(aTimer.IsActive())
     365           0 :     bIsShutDown=sal_True;// Set it in order to PreNotify not to save GetFocus.
     366             : 
     367           0 :     aTabCtrl.RemovePage(TP_FUNCTION);
     368           0 :     aTabCtrl.RemovePage(TP_STRUCT);
     369             : 
     370           0 :     delete pStructPage;
     371           0 :     delete pFuncPage;
     372           0 :     delete pParaWin;
     373           0 :     DeleteArgs();
     374           0 : }
     375             : 
     376           0 : void FormulaDlg_Impl::StoreFormEditData(FormEditData* pData)
     377             : {
     378           0 :     if (pData) // it won't be destroyed via Close
     379             :     {
     380           0 :         pData->SetFStart(pMEdit->GetSelection().Min());
     381           0 :         pData->SetSelection(pMEdit->GetSelection());
     382             : 
     383           0 :         if(aTabCtrl.GetCurPageId()==TP_FUNCTION)
     384           0 :             pData->SetMode( (sal_uInt16) FORMULA_FORMDLG_FORMULA );
     385             :         else
     386           0 :             pData->SetMode( (sal_uInt16) FORMULA_FORMDLG_EDIT );
     387           0 :         pData->SetUndoStr(pMEdit->GetText());
     388           0 :         pData->SetMatrixFlag(aBtnMatrix.IsChecked());
     389             :     }
     390           0 : }
     391             : 
     392             : 
     393           0 : void FormulaDlg_Impl::PreNotify( NotifyEvent& rNEvt )
     394             : {
     395           0 :     sal_uInt16 nSwitch=rNEvt.GetType();
     396           0 :     if(nSwitch==EVENT_GETFOCUS && !bIsShutDown)
     397             :     {
     398           0 :         Window* pWin=rNEvt.GetWindow();
     399           0 :         if(pWin!=NULL)
     400             :         {
     401           0 :             aActivWinId = pWin->GetUniqueId();
     402           0 :             if(aActivWinId.isEmpty())
     403             :             {
     404           0 :                 Window* pParent=pWin->GetParent();
     405           0 :                 while(pParent!=NULL)
     406             :                 {
     407           0 :                     aActivWinId=pParent->GetUniqueId();
     408             : 
     409           0 :                     if(!aActivWinId.isEmpty()) break;
     410             : 
     411           0 :                     pParent=pParent->GetParent();
     412             :                 }
     413             :             }
     414           0 :             if(!aActivWinId.isEmpty())
     415             :             {
     416             : 
     417           0 :                 FormEditData* pData = m_pHelper->getFormEditData();
     418             : 
     419           0 :                 if (pData && !aTimer.IsActive()) // won't be destroyed via Close
     420             :                 {
     421           0 :                     pData->SetUniqueId(aActivWinId);
     422             :                 }
     423             :             }
     424             :         }
     425             :     }
     426           0 : }
     427           0 : uno::Reference< sheet::XFormulaOpCodeMapper > FormulaDlg_Impl::GetFormulaOpCodeMapper() const
     428             : {
     429           0 :     if ( !m_xOpCodeMapper.is() )
     430             :     {
     431           0 :         m_xOpCodeMapper = m_pHelper->getFormulaOpCodeMapper();
     432           0 :         m_aFunctionOpCodes = m_xOpCodeMapper->getAvailableMappings(sheet::FormulaLanguage::ODFF,sheet::FormulaMapGroup::FUNCTIONS);
     433           0 :         m_pFunctionOpCodesEnd = m_aFunctionOpCodes.getConstArray() + m_aFunctionOpCodes.getLength();
     434             : 
     435           0 :         m_aUnaryOpCodes = m_xOpCodeMapper->getAvailableMappings(sheet::FormulaLanguage::ODFF,sheet::FormulaMapGroup::UNARY_OPERATORS);
     436           0 :         m_pUnaryOpCodesEnd = m_aUnaryOpCodes.getConstArray() + m_aUnaryOpCodes.getLength();
     437             : 
     438           0 :         m_aBinaryOpCodes = m_xOpCodeMapper->getAvailableMappings(sheet::FormulaLanguage::ODFF,sheet::FormulaMapGroup::BINARY_OPERATORS);
     439           0 :         m_pBinaryOpCodesEnd = m_aBinaryOpCodes.getConstArray() + m_aBinaryOpCodes.getLength();
     440             : 
     441           0 :         uno::Sequence< OUString > aArgs(3);
     442           0 :         aArgs[TOKEN_OPEN]   = "(";
     443           0 :         aArgs[TOKEN_CLOSE]  = ")";
     444           0 :         aArgs[TOKEN_SEP]    = ";";
     445           0 :         m_aSeparatorsOpCodes = m_xOpCodeMapper->getMappings(aArgs,sheet::FormulaLanguage::ODFF);
     446             : 
     447           0 :         m_aSpecialOpCodes = m_xOpCodeMapper->getAvailableMappings(sheet::FormulaLanguage::ODFF,sheet::FormulaMapGroup::SPECIAL);
     448           0 :         m_pSpecialOpCodesEnd = m_aSpecialOpCodes.getConstArray() + m_aSpecialOpCodes.getLength();
     449             :     } // if ( !m_xOpCodeMapper.is() )
     450           0 :     return m_xOpCodeMapper;
     451             : }
     452             : 
     453           0 : void FormulaDlg_Impl::DeleteArgs()
     454             : {
     455           0 :     ::std::vector< OUString>().swap(m_aArguments);
     456           0 :     nArgs = 0;
     457           0 : }
     458             : namespace
     459             : {
     460             :     // comparing two property instances
     461             :     struct OpCodeCompare : public ::std::binary_function< sheet::FormulaOpCodeMapEntry, sal_Int32 , bool >
     462             :     {
     463           0 :         bool operator() (const sheet::FormulaOpCodeMapEntry& x, sal_Int32 y) const
     464             :         {
     465           0 :             return x.Token.OpCode == y;
     466             :         }
     467             :     };
     468             : }
     469             : 
     470           0 : sal_Int32 FormulaDlg_Impl::GetFunctionPos(sal_Int32 nPos)
     471             : {
     472           0 :     if ( !m_aTokenList.hasElements() )
     473           0 :         return SAL_MAX_INT32;
     474             : 
     475           0 :     const sal_Unicode sep = m_pHelper->getFunctionManager()->getSingleToken(IFunctionManager::eSep);
     476             : 
     477           0 :     sal_Int32 nFuncPos = SAL_MAX_INT32;
     478           0 :     sal_Bool  bFlag = sal_False;
     479           0 :     OUString  aFormString = m_aFormulaHelper.GetCharClass()->uppercase(pMEdit->GetText());
     480             : 
     481           0 :     const uno::Reference< sheet::XFormulaParser > xParser(m_pHelper->getFormulaParser());
     482           0 :     const table::CellAddress aRefPos(m_pHelper->getReferencePosition());
     483             : 
     484           0 :     const sheet::FormulaToken* pIter = m_aTokenList.getConstArray();
     485           0 :     const sheet::FormulaToken* pEnd = pIter + m_aTokenList.getLength();
     486             :     try
     487             :     {
     488           0 :         sal_Int32 nTokPos = 1;
     489           0 :         sal_Int32 nOldTokPos = 1;
     490           0 :         sal_Int32 nPrevFuncPos = 1;
     491           0 :         short nBracketCount = 0;
     492           0 :         while ( pIter != pEnd )
     493             :         {
     494           0 :             const sal_Int32 eOp = pIter->OpCode;
     495           0 :             uno::Sequence<sheet::FormulaToken> aArgs(1);
     496           0 :             aArgs[0] = *pIter;
     497           0 :             const OUString aString = xParser->printFormula(aArgs, aRefPos);
     498           0 :             const sheet::FormulaToken* pNextToken = pIter + 1;
     499             : 
     500           0 :             if( !bUserMatrixFlag && FormulaCompiler::IsMatrixFunction((OpCode)eOp) )
     501             :             {
     502           0 :                 aBtnMatrix.Check();
     503             :             }
     504             : 
     505           0 :             if( eOp == m_aSpecialOpCodes[sheet::FormulaMapGroupSpecialOffset::PUSH].Token.OpCode ||
     506           0 :                 eOp == m_aSpecialOpCodes[sheet::FormulaMapGroupSpecialOffset::SPACES].Token.OpCode )
     507             :             {
     508           0 :                 const sal_Int32 n1 = nTokPos < 0 ? -1 : aFormString.indexOf(sep, nTokPos);
     509           0 :                 const sal_Int32 n2 = nTokPos < 0 ? -1 : aFormString.indexOf(')',nTokPos);
     510           0 :                 sal_Int32 nXXX = nTokPos;
     511           0 :                 if( n1 < n2 )
     512             :                 {
     513           0 :                     nTokPos=n1;
     514             :                 }
     515             :                 else
     516             :                 {
     517           0 :                     nTokPos=n2;
     518             :                 }
     519           0 :                 if( pNextToken != pEnd )
     520             :                 {
     521           0 :                     aArgs[0] = *pNextToken;
     522           0 :                     const OUString a2String = xParser->printFormula(aArgs, aRefPos);
     523           0 :                     const sal_Int32 n3 = aFormString.indexOf(a2String,nXXX);
     524           0 :                     if ( n3 < nTokPos )
     525           0 :                         nTokPos = n3;
     526             :                 }
     527             :             }
     528             :             else
     529             :             {
     530           0 :                 nTokPos = nTokPos + aString.getLength();
     531             :             }
     532             : 
     533           0 :             if( eOp == m_aSeparatorsOpCodes[TOKEN_OPEN].OpCode )
     534             :             {
     535           0 :                 nBracketCount++;
     536           0 :                 bFlag = sal_True;
     537             :             }
     538           0 :             else if( eOp == m_aSeparatorsOpCodes[TOKEN_CLOSE].OpCode )
     539             :             {
     540           0 :                 nBracketCount--;
     541           0 :                 bFlag = sal_False;
     542           0 :                 nFuncPos = nPrevFuncPos;
     543             :             }
     544           0 :             bool bIsFunction = ::std::find_if(m_aFunctionOpCodes.getConstArray(),m_pFunctionOpCodesEnd,::std::bind2nd(OpCodeCompare(),boost::cref(eOp))) != m_pFunctionOpCodesEnd;
     545             : 
     546           0 :             if( bIsFunction && m_aSpecialOpCodes[sheet::FormulaMapGroupSpecialOffset::SPACES].Token.OpCode != eOp )
     547             :             {
     548           0 :                 nPrevFuncPos = nFuncPos;
     549           0 :                 nFuncPos = nOldTokPos;
     550             :             }
     551             : 
     552           0 :             if( nOldTokPos <= nPos && nPos < nTokPos )
     553             :             {
     554           0 :                 if( !bIsFunction )
     555             :                 {
     556           0 :                     if( nBracketCount < 1 )
     557             :                     {
     558           0 :                         nFuncPos = pMEdit->GetText().getLength();
     559             :                     }
     560           0 :                     else if( !bFlag )
     561             :                     {
     562           0 :                         nFuncPos = nPrevFuncPos;
     563             :                     }
     564             :                 }
     565           0 :                 break;
     566             :             }
     567             : 
     568           0 :             pIter = pNextToken;
     569           0 :             nOldTokPos = nTokPos;
     570           0 :         } // while ( pIter != pEnd )
     571             :     }
     572           0 :     catch( const uno::Exception& )
     573             :     {
     574             :         OSL_FAIL("Exception caught!");
     575             :     }
     576             : 
     577           0 :     return nFuncPos;
     578             : }
     579             : 
     580           0 : sal_Bool FormulaDlg_Impl::CalcValue( const OUString& rStrExp, OUString& rStrResult )
     581             : {
     582           0 :     sal_Bool bResult = sal_True;
     583             : 
     584           0 :     if ( !rStrExp.isEmpty() )
     585             :     {
     586             :         // Only calculate the value when there isn't any more keyboard input:
     587             : 
     588           0 :         if ( !Application::AnyInput( VCL_INPUT_KEYBOARD ) )
     589             :         {
     590           0 :             bResult = m_pHelper->calculateValue(rStrExp,rStrResult);
     591             :         }
     592             :         else
     593           0 :             bResult = sal_False;
     594             :     }
     595             : 
     596           0 :     return bResult;
     597             : }
     598             : 
     599           0 : void FormulaDlg_Impl::UpdateValues()
     600             : {
     601           0 :     OUString aStrResult;
     602             : 
     603           0 :     if ( CalcValue( pFuncDesc->getFormula( m_aArguments ), aStrResult ) )
     604           0 :         aWndResult.SetValue( aStrResult );
     605             : 
     606           0 :     aStrResult = "";
     607           0 :     if ( CalcValue(m_pHelper->getCurrentFormula(), aStrResult ) )
     608           0 :         aWndFormResult.SetValue( aStrResult );
     609             :     else
     610             :     {
     611           0 :         aStrResult = "";
     612           0 :         aWndFormResult.SetValue( aStrResult );
     613             :     }
     614           0 :     CalcStruct(pMEdit->GetText());
     615           0 : }
     616             : 
     617           0 : sal_Bool FormulaDlg_Impl::CalcStruct( const OUString& rStrExp)
     618             : {
     619           0 :     sal_Bool bResult = sal_True;
     620           0 :     sal_Int32 nLength = rStrExp.getLength();
     621             : 
     622           0 :     if ( !rStrExp.isEmpty() && aOldFormula!=rStrExp && bStructUpdate)
     623             :     {
     624             :         // Only calculate the value when there isn't any more keyboard input:
     625             : 
     626           0 :         if ( !Application::AnyInput( VCL_INPUT_KEYBOARD ) )
     627             :         {
     628           0 :             pStructPage->ClearStruct();
     629             : 
     630           0 :             OUString aString=rStrExp;
     631           0 :             if(rStrExp[nLength-1] == '(')
     632             :             {
     633           0 :                 aString = aString.copy(0, nLength-1);
     634             :             }
     635             : 
     636           0 :             aString = comphelper::string::remove(aString, '\n');
     637           0 :             OUString aStrResult;
     638             : 
     639           0 :             if ( CalcValue(aString, aStrResult ) )
     640           0 :                 aWndFormResult.SetValue( aStrResult );
     641             : 
     642           0 :             UpdateTokenArray(aString);
     643           0 :             fillTree(pStructPage);
     644             : 
     645           0 :             aOldFormula = rStrExp;
     646           0 :             if(rStrExp[nLength-1] == '(')
     647           0 :                 UpdateTokenArray(rStrExp);
     648             :         }
     649             :         else
     650           0 :             bResult = sal_False;
     651             :     }
     652           0 :     return bResult;
     653             : }
     654             : 
     655             : 
     656           0 : void FormulaDlg_Impl::MakeTree(IStructHelper* _pTree,SvTreeListEntry* pParent,FormulaToken* _pToken,long Count)
     657             : {
     658           0 :     if( _pToken != NULL && Count > 0 )
     659             :     {
     660           0 :         long nParas = _pToken->GetParamCount();
     661           0 :         OpCode eOp = _pToken->GetOpCode();
     662             : 
     663             :         // #i101512# for output, the original token is needed
     664           0 :         FormulaToken* pOrigToken = (_pToken->GetType() == svFAP) ? _pToken->GetFAPOrigToken() : _pToken;
     665           0 :         uno::Sequence<sheet::FormulaToken> aArgs(1);
     666           0 :         ::std::map<FormulaToken*,sheet::FormulaToken>::const_iterator itr = m_aTokenMap.find(pOrigToken);
     667           0 :         if (itr == m_aTokenMap.end())
     668           0 :             return;
     669             : 
     670           0 :         aArgs[0] = itr->second;
     671             :         try
     672             :         {
     673           0 :             const table::CellAddress aRefPos(m_pHelper->getReferencePosition());
     674           0 :             const OUString aResult = m_pHelper->getFormulaParser()->printFormula(aArgs, aRefPos);
     675             : 
     676           0 :             if ( nParas > 0 )
     677             :             {
     678             :                 SvTreeListEntry* pEntry;
     679             : 
     680           0 :                 OUString aTest=_pTree->GetEntryText(pParent);
     681             : 
     682           0 :                 if(aTest==aResult &&
     683           0 :                     (eOp==ocAdd || eOp==ocMul ||
     684             :                      eOp==ocAmpersand))
     685             :                 {
     686           0 :                     pEntry=pParent;
     687             :                 }
     688             :                 else
     689             :                 {
     690           0 :                     if(eOp==ocBad)
     691             :                     {
     692           0 :                         pEntry=_pTree->InsertEntry(aResult,pParent,STRUCT_ERROR,0,_pToken);
     693             :                     }
     694             :                     else
     695             :                     {
     696           0 :                         pEntry=_pTree->InsertEntry(aResult,pParent,STRUCT_FOLDER,0,_pToken);
     697             :                     }
     698             :                 }
     699             : 
     700           0 :                 MakeTree(_pTree,pEntry,m_pTokenArray->PrevRPN(),nParas);
     701           0 :                 --Count;
     702           0 :                 m_pTokenArray->NextRPN();
     703           0 :                 MakeTree(_pTree,pParent,m_pTokenArray->PrevRPN(),Count);
     704             :             }
     705             :             else
     706             :             {
     707           0 :                 if(eOp==ocBad)
     708             :                 {
     709           0 :                     _pTree->InsertEntry(aResult,pParent,STRUCT_ERROR,0,_pToken);
     710             :                 }
     711             :                 else
     712             :                 {
     713           0 :                     _pTree->InsertEntry(aResult,pParent,STRUCT_END,0,_pToken);
     714             :                 }
     715           0 :                 --Count;
     716           0 :                 MakeTree(_pTree,pParent,m_pTokenArray->PrevRPN(),Count);
     717           0 :             }
     718             :         }
     719           0 :         catch(const uno::Exception&)
     720             :         {
     721             :             DBG_UNHANDLED_EXCEPTION();
     722           0 :         }
     723             :     }
     724             : }
     725             : 
     726           0 : void FormulaDlg_Impl::fillTree(IStructHelper* _pTree)
     727             : {
     728           0 :     GetFormulaOpCodeMapper();
     729           0 :     FormulaToken* pToken = m_pTokenArray->LastRPN();
     730             : 
     731           0 :     if( pToken != NULL)
     732             :     {
     733           0 :         MakeTree(_pTree,NULL,pToken,1);
     734             :     }
     735           0 : }
     736           0 : void FormulaDlg_Impl::UpdateTokenArray( const OUString& rStrExp)
     737             : {
     738           0 :     m_aTokenMap.clear();
     739           0 :     m_aTokenList.realloc(0);
     740             :     try
     741             :     {
     742           0 :         const table::CellAddress aRefPos(m_pHelper->getReferencePosition());
     743           0 :         m_aTokenList = m_pHelper->getFormulaParser()->parseFormula(rStrExp, aRefPos);
     744             :     }
     745           0 :     catch(const uno::Exception&)
     746             :     {
     747             :         DBG_UNHANDLED_EXCEPTION();
     748             :     }
     749           0 :     GetFormulaOpCodeMapper(); // just to get it initialized
     750           0 :     m_pTokenArray = m_pHelper->convertToTokenArray(m_aTokenList);
     751           0 :     const sal_Int32 nLen = static_cast<sal_Int32>(m_pTokenArray->GetLen());
     752           0 :     FormulaToken** pTokens = m_pTokenArray->GetArray();
     753           0 :     if ( pTokens && nLen == m_aTokenList.getLength() )
     754             :     {
     755           0 :         for (sal_Int32 nPos=0; nPos<nLen; nPos++)
     756             :         {
     757           0 :             m_aTokenMap.insert(::std::map<FormulaToken*,sheet::FormulaToken>::value_type(pTokens[nPos],m_aTokenList[nPos]));
     758             :         }
     759             :     } // if ( pTokens && nLen == m_aTokenList.getLength() )
     760             : 
     761           0 :     FormulaCompiler aCompiler(*m_pTokenArray.get());
     762           0 :     aCompiler.SetCompileForFAP(true);   // #i101512# special handling is needed
     763           0 :     aCompiler.CompileTokenArray();
     764           0 : }
     765             : 
     766           0 : void FormulaDlg_Impl::FillDialog(sal_Bool nFlag)
     767             : {
     768           0 :     sal_Bool bNext=sal_True, bPrev=sal_True;
     769           0 :     if(nFlag)
     770           0 :         FillControls(bNext, bPrev);
     771           0 :     FillListboxes();
     772           0 :     if(nFlag)
     773             :     {
     774           0 :         aBtnBackward.Enable(bPrev);
     775           0 :         aBtnForward.Enable(bNext);
     776             :     }
     777             : 
     778           0 :     OUString aStrResult;
     779             : 
     780           0 :     if ( CalcValue(m_pHelper->getCurrentFormula(), aStrResult ) )
     781           0 :         aWndFormResult.SetValue( aStrResult );
     782             :     else
     783             :     {
     784           0 :         aStrResult = "";
     785           0 :         aWndFormResult.SetValue( aStrResult );
     786           0 :     }
     787           0 : }
     788             : 
     789             : 
     790           0 : void FormulaDlg_Impl::FillListboxes()
     791             : {
     792             :     //  Switch between the "Pages"
     793           0 :     FormEditData* pData = m_pHelper->getFormEditData();
     794           0 :     OUString aNewTitle;
     795             :     //  1. Page: select function
     796           0 :     if ( pFuncDesc && pFuncDesc->getCategory() )
     797             :     {
     798             :         // We'll never have more than int32 max categories so this is safe ...
     799           0 :         if( pFuncPage->GetCategory() != static_cast<sal_Int32>(pFuncDesc->getCategory()->getNumber() + 1) )
     800           0 :             pFuncPage->SetCategory(pFuncDesc->getCategory()->getNumber() + 1);
     801             : 
     802           0 :         sal_Int32 nPos=pFuncPage->GetFuncPos(pFuncDesc);
     803             : 
     804           0 :         pFuncPage->SetFunction(nPos);
     805             :     }
     806           0 :     else if ( pData )
     807             :     {
     808           0 :         pFuncPage->SetCategory( pData->GetCatSel() );
     809           0 :         pFuncPage->SetFunction( pData->GetFuncSel() );
     810             :     }
     811           0 :     FuncSelHdl(NULL);
     812             : 
     813           0 :     m_pHelper->setDispatcherLock( true );// Activate Modal-Mode
     814             : 
     815           0 :     aNewTitle = aTitle1;
     816             : 
     817             :     //  HelpId for 1. page is the one from the resource
     818           0 :     m_pParent->SetHelpId( aOldHelp );
     819           0 :     m_pParent->SetUniqueId( aOldUnique );
     820           0 : }
     821             : 
     822           0 : void FormulaDlg_Impl::FillControls(sal_Bool &rbNext, sal_Bool &rbPrev)
     823             : {
     824             :     //  Switch between the "Pages"
     825           0 :     FormEditData* pData = m_pHelper->getFormEditData();
     826           0 :     if (!pData )
     827           0 :         return;
     828             : 
     829             :     //  2. Page or Edit: show selected function
     830             : 
     831           0 :     sal_Int32  nFStart     = pData->GetFStart();
     832           0 :     OUString   aFormula    = m_pHelper->getCurrentFormula() + " )";
     833           0 :     sal_Int32  nNextFStart = nFStart;
     834           0 :     sal_Int32  nNextFEnd   = 0;
     835             : 
     836           0 :     DeleteArgs();
     837           0 :     const IFunctionDescription* pOldFuncDesc = pFuncDesc;
     838           0 :     sal_Bool bTestFlag = sal_False;
     839             : 
     840           0 :     if ( m_aFormulaHelper.GetNextFunc( aFormula, false,
     841           0 :                                      nNextFStart, &nNextFEnd, &pFuncDesc, &m_aArguments ) )
     842             :     {
     843           0 :         bTestFlag = (pOldFuncDesc != pFuncDesc);
     844           0 :         if(bTestFlag)
     845             :         {
     846           0 :             aFtHeadLine.Hide();
     847           0 :             aFtFuncName.Hide();
     848           0 :             aFtFuncDesc.Hide();
     849           0 :             pParaWin->SetFunctionDesc(pFuncDesc);
     850           0 :             aFtEditName.SetText( pFuncDesc->getFunctionName() );
     851           0 :             aFtEditName.Show();
     852           0 :             pParaWin->Show();
     853           0 :             const OString aHelpId = pFuncDesc->getHelpId();
     854           0 :             if ( !aHelpId.isEmpty() )
     855           0 :                 pMEdit->SetHelpId(aHelpId);
     856             :         }
     857             : 
     858             :         sal_Int32 nOldStart, nOldEnd;
     859           0 :         m_pHelper->getSelection( nOldStart, nOldEnd );
     860           0 :         if ( nOldStart != nNextFStart || nOldEnd != nNextFEnd )
     861             :         {
     862           0 :             m_pHelper->setSelection( nNextFStart, nNextFEnd );
     863             :         }
     864           0 :         aFuncSel.Min() = nNextFStart;
     865           0 :         aFuncSel.Max() = nNextFEnd;
     866             : 
     867           0 :         if(!bEditFlag)
     868           0 :             pMEdit->SetText(m_pHelper->getCurrentFormula());
     869             :         sal_Int32 PrivStart, PrivEnd;
     870           0 :         m_pHelper->getSelection( PrivStart, PrivEnd);
     871           0 :         if(!bEditFlag)
     872           0 :             pMEdit->SetSelection( Selection(PrivStart, PrivEnd));
     873             : 
     874           0 :         nArgs = pFuncDesc->getSuppressedArgumentCount();
     875           0 :         sal_uInt16 nOffset = pData->GetOffset();
     876           0 :         nEdFocus = pData->GetEdFocus();
     877             : 
     878             :         //  Concatenate the Edit's for Focus-Control
     879             : 
     880           0 :         if(bTestFlag)
     881           0 :             pParaWin->SetArgumentOffset(nOffset);
     882           0 :         sal_uInt16 nActiv=0;
     883           0 :         sal_Int32   nArgPos  = m_aFormulaHelper.GetArgStart( aFormula, nFStart, 0 );
     884           0 :         sal_Int32   nEditPos = pMEdit->GetSelection().Min();
     885           0 :         sal_Bool    bFlag    = sal_False;
     886             : 
     887           0 :         for(sal_uInt16 i=0;i<nArgs;i++)
     888             :         {
     889           0 :             sal_Int32 nLength = m_aArguments[i].getLength()+1;
     890           0 :             pParaWin->SetArgument(i,m_aArguments[i]);
     891           0 :             if(nArgPos<=nEditPos && nEditPos<nArgPos+nLength)
     892             :             {
     893           0 :                 nActiv=i;
     894           0 :                 bFlag=sal_True;
     895             :             }
     896           0 :             nArgPos = nArgPos + nLength;
     897             :         }
     898           0 :         pParaWin->UpdateParas();
     899             : 
     900           0 :         if(bFlag)
     901             :         {
     902           0 :             pParaWin->SetActiveLine(nActiv);
     903             :         }
     904             : 
     905           0 :         UpdateValues();
     906             :     }
     907             :     else
     908             :     {
     909           0 :         aFtEditName.SetText("");
     910           0 :         pMEdit->SetHelpId( m_aEditHelpId );
     911             :     }
     912             :         //  Test, ob vorne/hinten noch mehr Funktionen sind
     913             : 
     914           0 :     sal_Int32 nTempStart = m_aFormulaHelper.GetArgStart( aFormula, nFStart, 0 );
     915           0 :     rbNext = m_aFormulaHelper.GetNextFunc( aFormula, false, nTempStart );
     916           0 :     nTempStart = pMEdit->GetSelection().Min();
     917           0 :     pData->SetFStart(nTempStart);
     918           0 :     rbPrev = m_aFormulaHelper.GetNextFunc( aFormula, true, nTempStart );
     919             : }
     920             : 
     921             : 
     922           0 : void FormulaDlg_Impl::ClearAllParas()
     923             : {
     924           0 :     DeleteArgs();
     925           0 :     pFuncDesc = NULL;
     926           0 :     pParaWin->ClearAll();
     927           0 :     aWndResult.SetValue(OUString());
     928           0 :     aFtFuncName.SetText(OUString());
     929           0 :     FuncSelHdl(NULL);
     930             : 
     931           0 :     if(pFuncPage->IsVisible())
     932             :     {
     933           0 :         aFtEditName.Hide();
     934           0 :         pParaWin->Hide();
     935             : 
     936           0 :         aBtnForward.Enable(true); //@new
     937           0 :         aFtHeadLine.Show();
     938           0 :         aFtFuncName.Show();
     939           0 :         aFtFuncDesc.Show();
     940             :     }
     941           0 : }
     942           0 : OUString FormulaDlg_Impl::RepairFormula(const OUString& aFormula)
     943             : {
     944           0 :     OUString aResult('=');
     945             :     try
     946             :     {
     947           0 :         UpdateTokenArray(aFormula);
     948             : 
     949           0 :         if ( m_aTokenList.getLength() )
     950             :         {
     951           0 :             const table::CellAddress aRefPos(m_pHelper->getReferencePosition());
     952           0 :             const OUString sFormula(m_pHelper->getFormulaParser()->printFormula(m_aTokenList, aRefPos));
     953           0 :             if ( sFormula.isEmpty() || sFormula[0] != '=' )
     954           0 :                 aResult += sFormula;
     955             :             else
     956           0 :                 aResult = sFormula;
     957             : 
     958             :         }
     959             :     }
     960           0 :     catch(const uno::Exception& )
     961             :     {
     962             :         OSL_FAIL("Exception caught!");
     963             :     }
     964           0 :     return aResult;
     965             : }
     966             : 
     967           0 : void FormulaDlg_Impl::DoEnter(bool bOk)
     968             : {
     969             :     //  Accept input to the document or cancel
     970           0 :     if ( bOk)
     971             :     {
     972             :         //  remove dummy arguments
     973           0 :         OUString  aInputFormula = m_pHelper->getCurrentFormula();
     974           0 :         OUString  aString = RepairFormula(pMEdit->GetText());
     975           0 :         m_pHelper->setSelection(0, aInputFormula.getLength());
     976           0 :         m_pHelper->setCurrentFormula(aString);
     977             :     }
     978             : 
     979           0 :     m_pHelper->switchBack();
     980             : 
     981           0 :     m_pHelper->dispatch(bOk,aBtnMatrix.IsChecked());
     982             :     //  Clear data
     983           0 :     m_pHelper->deleteFormData();
     984             : 
     985             :     //  Close dialog
     986           0 :     m_pHelper->doClose(bOk);
     987           0 : }
     988             : 
     989             : 
     990           0 : IMPL_LINK( FormulaDlg_Impl, BtnHdl, PushButton*, pBtn )
     991             : {
     992           0 :     if ( pBtn == &aBtnCancel )
     993             :     {
     994           0 :         DoEnter(false);                 // closes the Dialog
     995             :     }
     996           0 :     else if ( pBtn == &aBtnEnd )
     997             :     {
     998           0 :         DoEnter(true);                  // closes the Dialog
     999             :     }
    1000           0 :     else if ( pBtn == &aBtnForward )
    1001             :     {
    1002           0 :         const IFunctionDescription* pDesc =pFuncPage->GetFuncDesc( pFuncPage->GetFunction() );
    1003             : 
    1004           0 :         if(pDesc==pFuncDesc || !pFuncPage->IsVisible())
    1005           0 :             EditNextFunc( sal_True );
    1006             :         else
    1007             :         {
    1008           0 :             DblClkHdl(pFuncPage);      //new
    1009           0 :             aBtnForward.Enable(false); //new
    1010             :         }
    1011             :     }
    1012           0 :     else if ( pBtn == &aBtnBackward )
    1013             :     {
    1014           0 :         bEditFlag=sal_False;
    1015           0 :         aBtnForward.Enable(true);
    1016           0 :         EditNextFunc( sal_False );
    1017           0 :         aMEFormula.Invalidate();
    1018           0 :         aMEFormula.Update();
    1019             :     }
    1020             : 
    1021             : 
    1022           0 :     return 0;
    1023             : }
    1024             : 
    1025             : 
    1026             : 
    1027             : 
    1028             : //                          Functions for 1. Page
    1029             : 
    1030             : 
    1031             : 
    1032             : 
    1033             : // Handler for Listboxes
    1034             : 
    1035           0 : IMPL_LINK_NOARG(FormulaDlg_Impl, DblClkHdl)
    1036             : {
    1037           0 :     sal_Int32 nFunc = pFuncPage->GetFunction();
    1038             : 
    1039             :     //  ex-UpdateLRUList
    1040           0 :     const IFunctionDescription* pDesc = pFuncPage->GetFuncDesc(nFunc);
    1041           0 :     m_pHelper->insertEntryToLRUList(pDesc);
    1042             : 
    1043           0 :     OUString aFuncName = pFuncPage->GetSelFunctionName() + "()";
    1044           0 :     m_pHelper->setCurrentFormula(aFuncName);
    1045           0 :     pMEdit->ReplaceSelected(aFuncName);
    1046             : 
    1047           0 :     Selection aSel=pMEdit->GetSelection();
    1048           0 :     aSel.Max()=aSel.Max()-1;
    1049           0 :     pMEdit->SetSelection(aSel);
    1050             : 
    1051           0 :     FormulaHdl(pMEdit);
    1052             : 
    1053           0 :     aSel.Min()=aSel.Max();
    1054           0 :     pMEdit->SetSelection(aSel);
    1055             : 
    1056           0 :     if(nArgs==0)
    1057             :     {
    1058           0 :         BtnHdl(&aBtnBackward);
    1059             :     }
    1060             : 
    1061           0 :     pParaWin->SetEdFocus(0);
    1062           0 :     aBtnForward.Enable(false); //@New
    1063             : 
    1064           0 :     return 0;
    1065             : }
    1066             : 
    1067             : 
    1068             : 
    1069             : //                          Functions for right Page
    1070             : 
    1071           0 : void FormulaDlg_Impl::SetData(sal_Int32 nFStart, sal_Int32 nNextFStart, sal_Int32 nNextFEnd, sal_Int32& PrivStart, sal_Int32& PrivEnd)
    1072             : {
    1073             :     sal_Int32 nFEnd;
    1074             : 
    1075             :     // Notice and set new selection
    1076           0 :     m_pHelper->getSelection( nFStart, nFEnd );
    1077           0 :     m_pHelper->setSelection( nNextFStart, nNextFEnd );
    1078           0 :     if(!bEditFlag)
    1079           0 :         pMEdit->SetText(m_pHelper->getCurrentFormula());
    1080             : 
    1081             : 
    1082           0 :     m_pHelper->getSelection( PrivStart, PrivEnd);
    1083           0 :     if(!bEditFlag)
    1084             :     {
    1085           0 :         pMEdit->SetSelection( Selection(PrivStart, PrivEnd));
    1086           0 :         aMEFormula.UpdateOldSel();
    1087             :     }
    1088             : 
    1089           0 :     FormEditData* pData = m_pHelper->getFormEditData();
    1090           0 :     pData->SetFStart( nNextFStart );
    1091           0 :     pData->SetOffset( 0 );
    1092           0 :     pData->SetEdFocus( 0 );
    1093             : 
    1094           0 :     FillDialog();
    1095           0 : }
    1096             : 
    1097           0 : void FormulaDlg_Impl::EditThisFunc(sal_Int32 nFStart)
    1098             : {
    1099           0 :     FormEditData* pData = m_pHelper->getFormEditData();
    1100           0 :     if (!pData) return;
    1101             : 
    1102           0 :     OUString aFormula = m_pHelper->getCurrentFormula();
    1103             : 
    1104           0 :     if(nFStart==NOT_FOUND)
    1105             :     {
    1106           0 :         nFStart = pData->GetFStart();
    1107             :     }
    1108             :     else
    1109             :     {
    1110           0 :         pData->SetFStart(nFStart);
    1111             :     }
    1112             : 
    1113           0 :     sal_Int32 nNextFStart  = nFStart;
    1114           0 :     sal_Int32 nNextFEnd    = 0;
    1115             : 
    1116             :     sal_Bool bFound;
    1117             : 
    1118           0 :     bFound = m_aFormulaHelper.GetNextFunc( aFormula, false, nNextFStart, &nNextFEnd);
    1119           0 :     if ( bFound )
    1120             :     {
    1121             :         sal_Int32 PrivStart, PrivEnd;
    1122           0 :         SetData(nFStart, nNextFStart, nNextFEnd, PrivStart, PrivEnd);
    1123           0 :         m_pHelper->showReference(aFormula.copy(PrivStart, PrivEnd-PrivStart));
    1124             :     }
    1125             :     else
    1126             :     {
    1127           0 :         ClearAllParas();
    1128           0 :     }
    1129             : }
    1130             : 
    1131           0 : void FormulaDlg_Impl::EditNextFunc( sal_Bool bForward, sal_Int32 nFStart )
    1132             : {
    1133           0 :     FormEditData* pData = m_pHelper->getFormEditData();
    1134           0 :     if (!pData)
    1135           0 :         return;
    1136             : 
    1137           0 :     OUString aFormula = m_pHelper->getCurrentFormula();
    1138             : 
    1139           0 :     if(nFStart==NOT_FOUND)
    1140             :     {
    1141           0 :         nFStart = pData->GetFStart();
    1142             :     }
    1143             :     else
    1144             :     {
    1145           0 :         pData->SetFStart(nFStart);
    1146             :     }
    1147             : 
    1148           0 :     sal_Int32 nNextFStart  = 0;
    1149           0 :     sal_Int32 nNextFEnd    = 0;
    1150             : 
    1151             :     sal_Bool bFound;
    1152           0 :     if ( bForward )
    1153             :     {
    1154           0 :         nNextFStart = m_aFormulaHelper.GetArgStart( aFormula, nFStart, 0 );
    1155           0 :         bFound = m_aFormulaHelper.GetNextFunc( aFormula, false, nNextFStart, &nNextFEnd);
    1156             :     }
    1157             :     else
    1158             :     {
    1159           0 :         nNextFStart = nFStart;
    1160           0 :         bFound = m_aFormulaHelper.GetNextFunc( aFormula, true, nNextFStart, &nNextFEnd);
    1161             :     }
    1162             : 
    1163           0 :     if ( bFound )
    1164             :     {
    1165             :         sal_Int32 PrivStart, PrivEnd;
    1166           0 :         SetData(nFStart, nNextFStart, nNextFEnd, PrivStart, PrivEnd);
    1167           0 :     }
    1168             : }
    1169             : 
    1170           0 : void FormulaDlg_Impl::SaveArg( sal_uInt16 nEd )
    1171             : {
    1172           0 :     if (nEd<nArgs)
    1173             :     {
    1174           0 :         for(sal_uInt16 i=0; i<=nEd; i++)
    1175             :         {
    1176           0 :             if ( m_aArguments[i].isEmpty() )
    1177           0 :                 m_aArguments[i] = " ";
    1178             :         }
    1179           0 :         if(!pParaWin->GetArgument(nEd).isEmpty())
    1180           0 :             m_aArguments[nEd] = pParaWin->GetArgument(nEd);
    1181             : 
    1182           0 :         sal_uInt16 nClearPos=nEd+1;
    1183           0 :         for(sal_uInt16 i=nEd+1; i<nArgs; i++)
    1184             :         {
    1185           0 :             if( !pParaWin->GetArgument(i).isEmpty() )
    1186             :             {
    1187           0 :                 nClearPos=i+1;
    1188             :             }
    1189             :         }
    1190             : 
    1191           0 :         for(sal_uInt16 i=nClearPos; i<nArgs; i++)
    1192             :         {
    1193           0 :             m_aArguments[i] = "";
    1194             :         }
    1195             :     }
    1196           0 : }
    1197             : 
    1198           0 : IMPL_LINK( FormulaDlg_Impl, FxHdl, ParaWin*, pPtr )
    1199             : {
    1200           0 :     if(pPtr==pParaWin)
    1201             :     {
    1202           0 :         aBtnForward.Enable(true); //@ In order to be able to input another function.
    1203           0 :         aTabCtrl.SetCurPageId(TP_FUNCTION);
    1204             : 
    1205           0 :         OUString aUndoStr = m_pHelper->getCurrentFormula();       // it will be added before a ";"
    1206           0 :         FormEditData* pData = m_pHelper->getFormEditData();
    1207           0 :         if (!pData) return 0;
    1208             : 
    1209           0 :         sal_uInt16 nArgNo = pParaWin->GetActiveLine();
    1210           0 :         nEdFocus=nArgNo;
    1211             : 
    1212           0 :         SaveArg(nArgNo);
    1213           0 :         UpdateSelection();
    1214             : 
    1215           0 :         sal_Int32 nFormulaStrPos = pData->GetFStart();
    1216             : 
    1217           0 :         OUString aFormula = m_pHelper->getCurrentFormula();
    1218           0 :         sal_Int32 n1 = m_aFormulaHelper.GetArgStart( aFormula, nFormulaStrPos, nEdFocus+pData->GetOffset() );
    1219             : 
    1220           0 :         pData->SetEdFocus( nEdFocus );
    1221           0 :         pData->SaveValues();
    1222           0 :         pData->SetMode( (sal_uInt16) FORMULA_FORMDLG_FORMULA );
    1223           0 :         pData->SetFStart( n1 );
    1224           0 :         pData->SetUndoStr( aUndoStr );
    1225           0 :         ClearAllParas();
    1226             : 
    1227           0 :         FillDialog(sal_False);
    1228           0 :         pFuncPage->SetFocus(); //There Parawin is not visible anymore
    1229             :     }
    1230           0 :     return 0;
    1231             : }
    1232             : 
    1233           0 : IMPL_LINK( FormulaDlg_Impl, ModifyHdl, ParaWin*, pPtr )
    1234             : {
    1235           0 :     if(pPtr==pParaWin)
    1236             :     {
    1237           0 :         SaveArg(pParaWin->GetActiveLine());
    1238           0 :         UpdateValues();
    1239             : 
    1240           0 :         UpdateSelection();
    1241           0 :         CalcStruct(pMEdit->GetText());
    1242             :     }
    1243           0 :     return 0;
    1244             : }
    1245             : 
    1246           0 : IMPL_LINK_NOARG(FormulaDlg_Impl, FormulaHdl)
    1247             : {
    1248             : 
    1249           0 :     FormEditData* pData = m_pHelper->getFormEditData();
    1250           0 :     if (!pData) return 0;
    1251             : 
    1252           0 :     bEditFlag=sal_True;
    1253           0 :     OUString    aInputFormula=m_pHelper->getCurrentFormula();
    1254           0 :     OUString    aString=pMEdit->GetText();
    1255             : 
    1256           0 :     Selection   aSel  = pMEdit->GetSelection();
    1257           0 :     sal_Int32   nTest = 0;
    1258             : 
    1259           0 :     if(aString.isEmpty()) //in case everything was cleared
    1260             :     {
    1261           0 :         aString += "=";
    1262           0 :         pMEdit->SetText(aString);
    1263           0 :         aSel .Min() = 1;
    1264           0 :         aSel .Max() = 1;
    1265           0 :         pMEdit->SetSelection(aSel);
    1266             :     }
    1267           0 :     else if(aString[nTest]!='=') //in case it's replaced;
    1268             :     {
    1269           0 :         aString = "=" + aString;
    1270           0 :         pMEdit->SetText(aString);
    1271           0 :         aSel .Min() += 1;
    1272           0 :         aSel .Max() += 1;
    1273           0 :         pMEdit->SetSelection(aSel);
    1274             :     }
    1275             : 
    1276             : 
    1277           0 :     m_pHelper->setSelection(0, aInputFormula.getLength());
    1278           0 :     m_pHelper->setCurrentFormula(aString);
    1279           0 :     m_pHelper->setSelection(aSel.Min(), aSel.Max());
    1280             : 
    1281           0 :     sal_Int32 nPos = aSel.Min()-1;
    1282             : 
    1283           0 :     OUString aStrResult;
    1284             : 
    1285           0 :     if ( CalcValue(m_pHelper->getCurrentFormula(), aStrResult ) )
    1286           0 :         aWndFormResult.SetValue( aStrResult );
    1287             :     else
    1288             :     {
    1289           0 :         aStrResult = "";
    1290           0 :         aWndFormResult.SetValue( aStrResult );
    1291             :     }
    1292           0 :     CalcStruct(aString);
    1293             : 
    1294           0 :     nPos=GetFunctionPos(nPos);
    1295             : 
    1296           0 :     if(nPos<aSel.Min()-1)
    1297             :     {
    1298           0 :         sal_Int32 nPos1 = aString.indexOf('(',nPos);
    1299           0 :         EditNextFunc( sal_False, nPos1);
    1300             :     }
    1301             :     else
    1302             :     {
    1303           0 :         ClearAllParas();
    1304             :     }
    1305             : 
    1306           0 :     m_pHelper->setSelection(aSel.Min(), aSel.Max());
    1307           0 :     bEditFlag=sal_False;
    1308           0 :     return 0;
    1309             : }
    1310             : 
    1311           0 : IMPL_LINK_NOARG(FormulaDlg_Impl, FormulaCursorHdl)
    1312             : {
    1313           0 :     FormEditData* pData = m_pHelper->getFormEditData();
    1314           0 :     if (!pData) return 0;
    1315           0 :     sal_Int32 nFStart = pData->GetFStart();
    1316             : 
    1317           0 :     bEditFlag=sal_True;
    1318             : 
    1319           0 :     OUString    aString=pMEdit->GetText();
    1320             : 
    1321           0 :     Selection   aSel =pMEdit->GetSelection();
    1322           0 :     m_pHelper->setSelection(aSel.Min(), aSel.Max());
    1323             : 
    1324           0 :     if(aSel.Min()==0)
    1325             :     {
    1326           0 :         aSel.Min()=1;
    1327           0 :         pMEdit->SetSelection(aSel);
    1328             :     }
    1329             : 
    1330           0 :     if(aSel.Min() != aString.getLength())
    1331             :     {
    1332           0 :         sal_Int32 nPos = aSel.Min();
    1333             : 
    1334           0 :         nFStart=GetFunctionPos(nPos - 1);
    1335             : 
    1336           0 :         if(nFStart<nPos)
    1337             :         {
    1338           0 :             sal_Int32 nPos1 = m_aFormulaHelper.GetFunctionEnd(aString,nFStart);
    1339             : 
    1340           0 :             if(nPos1>nPos)
    1341             :             {
    1342           0 :                 EditThisFunc(nFStart);
    1343             :             }
    1344             :             else
    1345             :             {
    1346           0 :                 sal_Int32 n = nPos;
    1347           0 :                 short nCount=1;
    1348           0 :                 while(n>0)
    1349             :                 {
    1350           0 :                    if(aString[n]==')')
    1351           0 :                        nCount++;
    1352           0 :                    else if(aString[n]=='(')
    1353           0 :                        nCount--;
    1354           0 :                    if(nCount==0) break;
    1355           0 :                    n--;
    1356             :                 }
    1357           0 :                 if(nCount==0)
    1358             :                 {
    1359           0 :                     nFStart=m_aFormulaHelper.GetFunctionStart(aString, n, true);
    1360           0 :                     EditThisFunc(nFStart);
    1361             :                 }
    1362             :                 else
    1363             :                 {
    1364           0 :                     ClearAllParas();
    1365             :                 }
    1366             :             }
    1367             :         }
    1368             :         else
    1369             :         {
    1370           0 :             ClearAllParas();
    1371             :         }
    1372             :     }
    1373           0 :     m_pHelper->setSelection(aSel.Min(), aSel.Max());
    1374             : 
    1375           0 :     bEditFlag=sal_False;
    1376           0 :     return 0;
    1377             : }
    1378             : 
    1379           0 : void FormulaDlg_Impl::UpdateSelection()
    1380             : {
    1381           0 :     m_pHelper->setSelection(aFuncSel.Min(), aFuncSel.Max());
    1382           0 :     m_pHelper->setCurrentFormula( pFuncDesc->getFormula( m_aArguments ) );
    1383           0 :     pMEdit->SetText(m_pHelper->getCurrentFormula());
    1384             :     sal_Int32 PrivStart, PrivEnd;
    1385           0 :     m_pHelper->getSelection( PrivStart, PrivEnd);
    1386           0 :     aFuncSel.Min() = PrivStart;
    1387           0 :     aFuncSel.Max() = PrivEnd;
    1388             : 
    1389           0 :     nArgs = pFuncDesc->getSuppressedArgumentCount();
    1390             : 
    1391           0 :     OUString aFormula=pMEdit->GetText();
    1392           0 :     sal_Int32 nArgPos=m_aFormulaHelper.GetArgStart( aFormula,PrivStart,0);
    1393             : 
    1394           0 :     sal_uInt16 nPos=pParaWin->GetActiveLine();
    1395             : 
    1396           0 :     for(sal_uInt16 i=0;i<nPos;i++)
    1397             :     {
    1398           0 :         nArgPos += (m_aArguments[i].getLength() + 1);
    1399             :     }
    1400           0 :     sal_Int32 nLength= m_aArguments[nPos].getLength();
    1401             : 
    1402           0 :     Selection aSel(nArgPos,nArgPos+nLength);
    1403           0 :     m_pHelper->setSelection((sal_uInt16)nArgPos,(sal_uInt16)(nArgPos+nLength));
    1404           0 :     pMEdit->SetSelection(aSel);
    1405           0 :     aMEFormula.UpdateOldSel();
    1406           0 : }
    1407           0 : ::std::pair<RefButton*,RefEdit*> FormulaDlg_Impl::RefInputStartBefore( RefEdit* pEdit, RefButton* pButton )
    1408             : {
    1409           0 :     aEdRef.Show();
    1410           0 :     pTheRefEdit = pEdit;
    1411           0 :     pTheRefButton = pButton;
    1412             : 
    1413           0 :     if( pTheRefEdit )
    1414             :     {
    1415           0 :         aEdRef.SetRefString( pTheRefEdit->GetText() );
    1416           0 :         aEdRef.SetSelection( pTheRefEdit->GetSelection() );
    1417           0 :         aEdRef.SetHelpId( pTheRefEdit->GetHelpId() );
    1418           0 :         aEdRef.SetUniqueId( pTheRefEdit->GetUniqueId() );
    1419             :     }
    1420             : 
    1421           0 :     aRefBtn.Show( pButton != NULL );
    1422             : 
    1423           0 :     ::std::pair<RefButton*,RefEdit*> aPair;
    1424           0 :     aPair.first = pButton ? &aRefBtn : NULL;
    1425           0 :     aPair.second = &aEdRef;
    1426           0 :     return aPair;
    1427             : }
    1428           0 : void FormulaDlg_Impl::RefInputStartAfter( RefEdit* /*pEdit*/, RefButton* /*pButton*/ )
    1429             : {
    1430           0 :     aRefBtn.SetEndImage();
    1431             : 
    1432           0 :     if( pTheRefEdit )
    1433             :     {
    1434           0 :         OUString aStr = aTitle2 + " " + aFtEditName.GetText() + "( ";
    1435             : 
    1436           0 :         if( pParaWin->GetActiveLine() > 0 )
    1437           0 :             aStr += "...; ";
    1438           0 :         aStr += pParaWin->GetActiveArgName();
    1439           0 :         if( pParaWin->GetActiveLine() + 1 < nArgs )
    1440           0 :             aStr += "; ...";
    1441           0 :         aStr += " )";
    1442             : 
    1443           0 :         m_pParent->SetText( MnemonicGenerator::EraseAllMnemonicChars( aStr ) );
    1444             :     }
    1445           0 : }
    1446           0 : void FormulaDlg_Impl::RefInputDoneAfter( bool bForced )
    1447             : {
    1448           0 :     aRefBtn.SetStartImage();
    1449           0 :     if( bForced || !aRefBtn.IsVisible() )
    1450             :     {
    1451           0 :         aEdRef.Hide();
    1452           0 :         aRefBtn.Hide();
    1453           0 :         if( pTheRefEdit )
    1454             :         {
    1455           0 :             pTheRefEdit->SetRefString( aEdRef.GetText() );
    1456           0 :             pTheRefEdit->GrabFocus();
    1457             : 
    1458           0 :             if( pTheRefButton )
    1459           0 :                 pTheRefButton->SetStartImage();
    1460             : 
    1461           0 :             sal_uInt16 nPrivActiv = pParaWin->GetActiveLine();
    1462           0 :             pParaWin->SetArgument( nPrivActiv, aEdRef.GetText() );
    1463           0 :             ModifyHdl( pParaWin );
    1464           0 :             pTheRefEdit = NULL;
    1465             :         }
    1466           0 :         m_pParent->SetText( aTitle1 );
    1467             :     }
    1468           0 : }
    1469           0 : RefEdit* FormulaDlg_Impl::GetCurrRefEdit()
    1470             : {
    1471           0 :     return aEdRef.IsVisible() ? &aEdRef : pParaWin->GetActiveEdit();
    1472             : }
    1473           0 : void FormulaDlg_Impl::Update()
    1474             : {
    1475           0 :     FormEditData* pData = m_pHelper->getFormEditData();
    1476           0 :     const OUString sExpression = pMEdit->GetText();
    1477           0 :     aOldFormula = "";
    1478           0 :     UpdateTokenArray(sExpression);
    1479           0 :     FormulaCursorHdl(&aMEFormula);
    1480           0 :     CalcStruct(sExpression);
    1481           0 :     if(pData->GetMode() == FORMULA_FORMDLG_FORMULA)
    1482           0 :         aTabCtrl.SetCurPageId(TP_FUNCTION);
    1483             :     else
    1484           0 :         aTabCtrl.SetCurPageId(TP_STRUCT);
    1485           0 :     aBtnMatrix.Check(pData->GetMatrixFlag());
    1486           0 : }
    1487           0 : void FormulaDlg_Impl::Update(const OUString& _sExp)
    1488             : {
    1489           0 :     CalcStruct(_sExp);
    1490           0 :     FillDialog();
    1491           0 :     FuncSelHdl(NULL);
    1492           0 : }
    1493           0 : void FormulaDlg_Impl::SetMeText(const OUString& _sText)
    1494             : {
    1495           0 :     FormEditData* pData = m_pHelper->getFormEditData();
    1496           0 :     pMEdit->SetText(_sText);
    1497           0 :     pMEdit->SetSelection( pData->GetSelection());
    1498           0 :     aMEFormula.UpdateOldSel();
    1499           0 : }
    1500           0 : FormulaDlgMode FormulaDlg_Impl::SetMeText(const OUString& _sText, sal_Int32 PrivStart, sal_Int32 PrivEnd, bool bMatrix, bool _bSelect, bool _bUpdate)
    1501             : {
    1502           0 :     FormulaDlgMode eMode = FORMULA_FORMDLG_FORMULA;
    1503           0 :     if(!bEditFlag)
    1504           0 :         pMEdit->SetText(_sText);
    1505             : 
    1506           0 :     if ( _bSelect || !bEditFlag )
    1507           0 :         pMEdit->SetSelection( Selection(PrivStart, PrivEnd));
    1508           0 :     if ( _bUpdate )
    1509             :     {
    1510           0 :         aMEFormula.UpdateOldSel();
    1511           0 :         pMEdit->Invalidate();
    1512           0 :         m_pHelper->showReference(pMEdit->GetSelected());
    1513           0 :         eMode = FORMULA_FORMDLG_EDIT;
    1514             : 
    1515           0 :         aBtnMatrix.Check( bMatrix );
    1516             :     } // if ( _bUpdate )
    1517           0 :     return eMode;
    1518             : }
    1519           0 : bool FormulaDlg_Impl::CheckMatrix(OUString& aFormula)
    1520             : {
    1521           0 :     pMEdit->GrabFocus();
    1522           0 :     sal_Int32 nLen = aFormula.getLength();
    1523             :     bool bMatrix =  nLen > 3                    // Matrix-Formula
    1524           0 :             && aFormula[0] == '{'
    1525           0 :             && aFormula[1] == '='
    1526           0 :             && aFormula[nLen-1] == '}';
    1527           0 :     if ( bMatrix )
    1528             :     {
    1529           0 :         aFormula = aFormula.copy( 1, aFormula.getLength()-2 );
    1530           0 :         aBtnMatrix.Check( bMatrix );
    1531           0 :         aBtnMatrix.Disable();
    1532             :     } // if ( bMatrix )
    1533             : 
    1534           0 :     aTabCtrl.SetCurPageId(TP_STRUCT);
    1535           0 :     return bMatrix;
    1536             : }
    1537           0 : IMPL_LINK_NOARG(FormulaDlg_Impl, StructSelHdl)
    1538             : {
    1539           0 :     bStructUpdate=sal_False;
    1540           0 :     if(pStructPage->IsVisible())    aBtnForward.Enable(false); //@New
    1541             : 
    1542           0 :     bStructUpdate=sal_True;
    1543           0 :     return 0;
    1544             : }
    1545           0 : IMPL_LINK_NOARG(FormulaDlg_Impl, MatrixHdl)
    1546             : {
    1547           0 :     bUserMatrixFlag=sal_True;
    1548           0 :     return 0;
    1549             : }
    1550             : 
    1551           0 : IMPL_LINK_NOARG(FormulaDlg_Impl, FuncSelHdl)
    1552             : {
    1553           0 :     sal_Int32 nCat = pFuncPage->GetCategory();
    1554           0 :     if ( nCat == LISTBOX_ENTRY_NOTFOUND ) nCat = 0;
    1555           0 :     sal_Int32 nFunc = pFuncPage->GetFunction();
    1556           0 :     if ( nFunc == LISTBOX_ENTRY_NOTFOUND ) nFunc = 0;
    1557             : 
    1558           0 :     if (   (pFuncPage->GetFunctionEntryCount() > 0)
    1559           0 :         && (pFuncPage->GetFunction() != LISTBOX_ENTRY_NOTFOUND) )
    1560             :     {
    1561           0 :         const IFunctionDescription* pDesc =pFuncPage->GetFuncDesc( pFuncPage->GetFunction() );
    1562             : 
    1563           0 :         if(pDesc!=pFuncDesc) aBtnForward.Enable(true); //new
    1564             : 
    1565           0 :         if (pDesc)
    1566             :         {
    1567           0 :             pDesc->initArgumentInfo();      // full argument info is needed
    1568             : 
    1569           0 :             OUString aSig = pDesc->getSignature();
    1570           0 :             aFtHeadLine.SetText( pDesc->getFunctionName() );
    1571           0 :             aFtFuncName.SetText( aSig );
    1572           0 :             aFtFuncDesc.SetText( pDesc->getDescription() );
    1573             :         }
    1574             :     }
    1575             :     else
    1576             :     {
    1577           0 :         aFtHeadLine.SetText( OUString() );
    1578           0 :         aFtFuncName.SetText( OUString() );
    1579           0 :         aFtFuncDesc.SetText( OUString() );
    1580             :     }
    1581           0 :     return 0;
    1582             : }
    1583             : 
    1584           0 : void FormulaDlg_Impl::UpdateParaWin(const Selection& _rSelection, const OUString& _sRefStr)
    1585             : {
    1586           0 :     Selection theSel = _rSelection;
    1587           0 :     aEdRef.ReplaceSelected( _sRefStr );
    1588           0 :     theSel.Max() = theSel.Min() + _sRefStr.getLength();
    1589           0 :     aEdRef.SetSelection( theSel );
    1590             : 
    1591             : 
    1592             :     // Manual Update of the results' fields:
    1593             : 
    1594           0 :     sal_uInt16 nPrivActiv = pParaWin->GetActiveLine();
    1595           0 :     pParaWin->SetArgument(nPrivActiv,aEdRef.GetText());
    1596           0 :     pParaWin->UpdateParas();
    1597             : 
    1598           0 :     Edit* pEd = GetCurrRefEdit();
    1599           0 :     if( pEd != NULL )
    1600           0 :         pEd->SetSelection( theSel );
    1601             : 
    1602           0 :     pParaWin->SetRefMode(sal_False);
    1603           0 : }
    1604           0 : bool FormulaDlg_Impl::UpdateParaWin(Selection& _rSelection)
    1605             : {
    1606           0 :     pParaWin->SetRefMode(sal_True);
    1607             : 
    1608           0 :     OUString      aStrEd;
    1609           0 :     Edit* pEd = GetCurrRefEdit();
    1610           0 :     if(pEd!=NULL && pTheRefEdit==NULL)
    1611             :     {
    1612           0 :         _rSelection=pEd->GetSelection();
    1613           0 :         _rSelection.Justify();
    1614           0 :         aStrEd=pEd->GetText();
    1615           0 :         aEdRef.SetRefString(aStrEd);
    1616           0 :         aEdRef.SetSelection( _rSelection );
    1617             :     }
    1618             :     else
    1619             :     {
    1620           0 :         _rSelection=aEdRef.GetSelection();
    1621           0 :         _rSelection.Justify();
    1622           0 :         aStrEd= aEdRef.GetText();
    1623             :     }
    1624           0 :     return pTheRefEdit == NULL;
    1625             : }
    1626             : 
    1627           0 : void FormulaDlg_Impl::SetEdSelection()
    1628             : {
    1629           0 :     Edit* pEd = GetCurrRefEdit()/*aScParaWin.GetActiveEdit()*/;
    1630           0 :     if( pEd )
    1631             :     {
    1632           0 :         Selection theSel = aEdRef.GetSelection();
    1633             :         //  Edit may have the focus -> call ModifyHdl in addition
    1634             :         //  to what's happening in GetFocus
    1635           0 :         pEd->GetModifyHdl().Call(pEd);
    1636           0 :         pEd->GrabFocus();
    1637           0 :         pEd->SetSelection(theSel);
    1638             :     } // if( pEd )
    1639           0 : }
    1640             : 
    1641           0 : const FormulaHelper& FormulaDlg_Impl::GetFormulaHelper()  const
    1642             : {
    1643           0 :     return m_aFormulaHelper;
    1644             : }
    1645             : 
    1646           0 : FormulaModalDialog::FormulaModalDialog( Window* pParent
    1647             :                                             , bool _bSupportFunctionResult
    1648             :                                             , bool _bSupportResult
    1649             :                                             , bool _bSupportMatrix
    1650             :                                             , IFunctionManager* _pFunctionMgr
    1651             :                                             , IControlReferenceHandler* _pDlg ) :
    1652             :         ModalDialog( pParent, ModuleRes(RID_FORMULADLG_FORMULA_MODAL) ),
    1653             :         m_pImpl( new FormulaDlg_Impl(this,_bSupportFunctionResult
    1654             :                                             , _bSupportResult
    1655             :                                             , _bSupportMatrix
    1656           0 :                                             ,this,_pFunctionMgr,_pDlg))
    1657             : {
    1658           0 :     FreeResource();
    1659           0 :     SetText(m_pImpl->aTitle1);
    1660           0 : }
    1661           0 : FormulaModalDialog::~FormulaModalDialog()
    1662             : {
    1663           0 : }
    1664             : 
    1665           0 : void FormulaModalDialog::Update(const OUString& _sExp)
    1666             : {
    1667           0 :     m_pImpl->Update(_sExp);
    1668           0 : }
    1669             : 
    1670             : 
    1671           0 : void FormulaModalDialog::SetMeText(const OUString& _sText)
    1672             : {
    1673           0 :     m_pImpl->SetMeText(_sText);
    1674           0 : }
    1675             : 
    1676             : 
    1677           0 : bool FormulaModalDialog::CheckMatrix(OUString& aFormula)
    1678             : {
    1679           0 :     return m_pImpl->CheckMatrix(aFormula);
    1680             : }
    1681             : 
    1682           0 : void FormulaModalDialog::Update()
    1683             : {
    1684           0 :     m_pImpl->Update();
    1685           0 : }
    1686           0 : ::std::pair<RefButton*,RefEdit*> FormulaModalDialog::RefInputStartBefore( RefEdit* pEdit, RefButton* pButton )
    1687             : {
    1688           0 :     return m_pImpl->RefInputStartBefore( pEdit, pButton );
    1689             : }
    1690           0 : void FormulaModalDialog::RefInputStartAfter( RefEdit* pEdit, RefButton* pButton )
    1691             : {
    1692           0 :     m_pImpl->RefInputStartAfter( pEdit, pButton );
    1693           0 : }
    1694           0 : void FormulaModalDialog::RefInputDoneAfter( bool bForced )
    1695             : {
    1696           0 :     m_pImpl->RefInputDoneAfter( bForced );
    1697           0 : }
    1698             : 
    1699           0 : void FormulaModalDialog::SetFocusWin(Window *pWin,const OString& nUniqueId)
    1700             : {
    1701           0 :     if(pWin->GetUniqueId()==nUniqueId)
    1702             :     {
    1703           0 :         pWin->GrabFocus();
    1704             :     }
    1705             :     else
    1706             :     {
    1707           0 :         sal_uInt16 nCount=pWin->GetChildCount();
    1708             : 
    1709           0 :         for(sal_uInt16 i=0;i<nCount;i++)
    1710             :         {
    1711           0 :             Window* pChild=pWin->GetChild(i);
    1712           0 :             SetFocusWin(pChild,nUniqueId);
    1713             :         }
    1714             :     }
    1715           0 : }
    1716             : 
    1717           0 : bool FormulaModalDialog::PreNotify( NotifyEvent& rNEvt )
    1718             : {
    1719           0 :     m_pImpl->PreNotify( rNEvt );
    1720             : 
    1721           0 :     return ModalDialog::PreNotify(rNEvt);
    1722             : }
    1723             : 
    1724           0 : void FormulaModalDialog::StoreFormEditData(FormEditData* pData)
    1725             : {
    1726           0 :     m_pImpl->StoreFormEditData(pData);
    1727           0 : }
    1728             : 
    1729             : 
    1730             : //      Initialisation / General functions  for Dialog
    1731             : 
    1732           0 : FormulaDlg::FormulaDlg( SfxBindings* pB, SfxChildWindow* pCW,
    1733             :                              Window* pParent
    1734             :                             , bool _bSupportFunctionResult
    1735             :                             , bool _bSupportResult
    1736             :                             , bool _bSupportMatrix
    1737             :                             , IFunctionManager* _pFunctionMgr, IControlReferenceHandler* _pDlg ) :
    1738             :         SfxModelessDialog( pB, pCW, pParent, ModuleRes(RID_FORMULADLG_FORMULA) ),
    1739             :         m_pImpl( new FormulaDlg_Impl(this, _bSupportFunctionResult
    1740             :                                             , _bSupportResult
    1741             :                                             , _bSupportMatrix
    1742           0 :                                             , this, _pFunctionMgr, _pDlg))
    1743             : {
    1744           0 :     FreeResource();
    1745             :     //undo SfxModelessDialog HelpId clear hack
    1746           0 :     reverseUniqueHelpIdHack(*this);
    1747           0 :     SetText(m_pImpl->aTitle1);
    1748           0 : }
    1749             : 
    1750           0 : FormulaDlg::~FormulaDlg()
    1751             : {
    1752           0 : }
    1753             : 
    1754           0 : void FormulaDlg::Update(const OUString& _sExp)
    1755             : {
    1756           0 :     m_pImpl->Update(_sExp);
    1757           0 : }
    1758             : 
    1759             : 
    1760           0 : void FormulaDlg::SetMeText(const OUString& _sText)
    1761             : {
    1762           0 :     m_pImpl->SetMeText(_sText);
    1763           0 : }
    1764             : 
    1765             : 
    1766           0 : FormulaDlgMode FormulaDlg::SetMeText(const OUString& _sText, sal_Int32 PrivStart, sal_Int32 PrivEnd, bool bMatrix, bool _bSelect, bool _bUpdate)
    1767             : {
    1768           0 :     return m_pImpl->SetMeText(_sText,PrivStart, PrivEnd,bMatrix,_bSelect,_bUpdate);
    1769             : }
    1770             : 
    1771           0 : bool FormulaDlg::CheckMatrix(OUString& aFormula)
    1772             : {
    1773           0 :     return m_pImpl->CheckMatrix(aFormula);
    1774             : }
    1775             : 
    1776           0 : OUString FormulaDlg::GetMeText() const
    1777             : {
    1778           0 :     return m_pImpl->pMEdit->GetText();
    1779             : }
    1780             : 
    1781           0 : void FormulaDlg::Update()
    1782             : {
    1783           0 :     m_pImpl->Update();
    1784           0 :     m_pImpl->aTimer.SetTimeout(200);
    1785           0 :     m_pImpl->aTimer.SetTimeoutHdl(LINK( this, FormulaDlg, UpdateFocusHdl));
    1786           0 :     m_pImpl->aTimer.Start();
    1787           0 : }
    1788             : 
    1789           0 : void FormulaDlg::DoEnter(bool _bOk)
    1790             : {
    1791           0 :     m_pImpl->DoEnter(_bOk);
    1792           0 : }
    1793           0 : ::std::pair<RefButton*,RefEdit*> FormulaDlg::RefInputStartBefore( RefEdit* pEdit, RefButton* pButton )
    1794             : {
    1795           0 :     return m_pImpl->RefInputStartBefore( pEdit, pButton );
    1796             : }
    1797           0 : void FormulaDlg::RefInputStartAfter( RefEdit* pEdit, RefButton* pButton )
    1798             : {
    1799           0 :     m_pImpl->RefInputStartAfter( pEdit, pButton );
    1800           0 : }
    1801           0 : void FormulaDlg::RefInputDoneAfter( bool bForced )
    1802             : {
    1803           0 :     m_pImpl->RefInputDoneAfter( bForced );
    1804           0 : }
    1805             : 
    1806           0 : void FormulaDlg::SetFocusWin(Window *pWin,const OString& nUniqueId)
    1807             : {
    1808           0 :     if(pWin->GetUniqueId()==nUniqueId)
    1809             :     {
    1810           0 :         pWin->GrabFocus();
    1811             :     }
    1812             :     else
    1813             :     {
    1814           0 :         sal_uInt16 nCount=pWin->GetChildCount();
    1815             : 
    1816           0 :         for(sal_uInt16 i=0;i<nCount;i++)
    1817             :         {
    1818           0 :             Window* pChild=pWin->GetChild(i);
    1819           0 :             SetFocusWin(pChild,nUniqueId);
    1820             :         }
    1821             :     }
    1822           0 : }
    1823             : 
    1824             : 
    1825           0 : bool FormulaDlg::PreNotify( NotifyEvent& rNEvt )
    1826             : {
    1827           0 :     m_pImpl->PreNotify( rNEvt );
    1828           0 :     return SfxModelessDialog::PreNotify(rNEvt);
    1829             : }
    1830             : 
    1831           0 : void FormulaDlg::disableOk()
    1832             : {
    1833           0 :     m_pImpl->aBtnEnd.Disable();
    1834           0 : }
    1835             : 
    1836           0 : void FormulaDlg::StoreFormEditData(FormEditData* pData)
    1837             : {
    1838           0 :     m_pImpl->StoreFormEditData(pData);
    1839           0 : }
    1840             : 
    1841             : 
    1842           0 : const IFunctionDescription* FormulaDlg::getCurrentFunctionDescription() const
    1843             : {
    1844           0 :     OSL_VERIFY(!m_pImpl->pFuncDesc || m_pImpl->pFuncDesc->getSuppressedArgumentCount() == m_pImpl->nArgs);
    1845           0 :     return m_pImpl->pFuncDesc;
    1846             : }
    1847             : 
    1848           0 : void FormulaDlg::UpdateParaWin(const Selection& _rSelection,const OUString& _sRefStr)
    1849             : {
    1850           0 :     m_pImpl->UpdateParaWin(_rSelection,_sRefStr);
    1851           0 : }
    1852           0 : bool FormulaDlg::UpdateParaWin(Selection& _rSelection)
    1853             : {
    1854           0 :     return m_pImpl->UpdateParaWin(_rSelection);
    1855             : }
    1856             : 
    1857           0 : RefEdit*    FormulaDlg::GetActiveEdit()
    1858             : {
    1859           0 :     return m_pImpl->pParaWin->GetActiveEdit();
    1860             : }
    1861             : 
    1862           0 : const FormulaHelper& FormulaDlg::GetFormulaHelper() const
    1863             : {
    1864           0 :     return m_pImpl->GetFormulaHelper();
    1865             : }
    1866             : 
    1867           0 : void FormulaDlg::SetEdSelection()
    1868             : {
    1869           0 :     m_pImpl->SetEdSelection();
    1870           0 : }
    1871           0 : IMPL_LINK_NOARG(FormulaDlg, UpdateFocusHdl)
    1872             : {
    1873           0 :     FormEditData* pData = m_pImpl->m_pHelper->getFormEditData();
    1874             : 
    1875           0 :     if (pData) // won't be destroyed via Close
    1876             :     {
    1877           0 :         m_pImpl->m_pHelper->setReferenceInput(pData);
    1878           0 :         OString nUniqueId(pData->GetUniqueId());
    1879           0 :         SetFocusWin(this,nUniqueId);
    1880             :     }
    1881           0 :     return 0;
    1882             : }
    1883             : 
    1884             : 
    1885           0 : void FormEditData::SaveValues()
    1886             : {
    1887           0 :     FormEditData* pTemp = new FormEditData(*this);
    1888             : 
    1889           0 :     Reset();
    1890           0 :     pParent = pTemp;
    1891           0 : }
    1892             : 
    1893           0 : void FormEditData::Reset()
    1894             : {
    1895           0 :     pParent = NULL;
    1896           0 :     nMode = 0;
    1897           0 :     nFStart = 0;
    1898           0 :     nCatSel = 1;        //! oder 0 (zuletzt benutzte)
    1899           0 :     nFuncSel = 0;
    1900           0 :     nOffset = 0;
    1901           0 :     nEdFocus = 0;
    1902           0 :     bMatrix = false;
    1903           0 :     aUniqueId=OString();
    1904           0 :     aSelection.Min()=0;
    1905           0 :     aSelection.Max()=0;
    1906           0 :     aUndoStr = "";
    1907           0 : }
    1908             : 
    1909           0 : const FormEditData& FormEditData::operator=( const FormEditData& r )
    1910             : {
    1911           0 :     pParent         = r.pParent;
    1912           0 :     nMode           = r.nMode;
    1913           0 :     nFStart         = r.nFStart;
    1914           0 :     nCatSel         = r.nCatSel;
    1915           0 :     nFuncSel        = r.nFuncSel;
    1916           0 :     nOffset         = r.nOffset;
    1917           0 :     nEdFocus        = r.nEdFocus;
    1918           0 :     aUndoStr        = r.aUndoStr;
    1919           0 :     bMatrix         = r.bMatrix ;
    1920           0 :     aUniqueId       = r.aUniqueId;
    1921           0 :     aSelection      = r.aSelection;
    1922           0 :     return *this;
    1923             : }
    1924             : 
    1925           0 : FormEditData::FormEditData()
    1926             : {
    1927           0 :     Reset();
    1928           0 : }
    1929             : 
    1930           0 : FormEditData::~FormEditData()
    1931             : {
    1932           0 :     delete pParent;
    1933           0 : }
    1934             : 
    1935           0 : FormEditData::FormEditData( const FormEditData& r )
    1936             : {
    1937           0 :     *this = r;
    1938           0 : }
    1939             : 
    1940             : 
    1941             : } // formula
    1942             : 
    1943             : 
    1944             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10