xref: /AOO41X/main/formula/source/ui/dlg/formula.cxx (revision 4d7c9de063a797b8b4f3d45e3561e82ad1f8ef1f)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_formula.hxx"
26 
27 //----------------------------------------------------------------------------
28 #include <sfx2/dispatch.hxx>
29 #include <sfx2/docfile.hxx>
30 #include <sfx2/viewfrm.hxx>
31 #include <vcl/svapp.hxx>
32 #include <vcl/mnemonic.hxx>
33 #include <vcl/tabpage.hxx>
34 #include <vcl/tabctrl.hxx>
35 #include <vcl/lstbox.hxx>
36 #include <vcl/group.hxx>
37 #include <vcl/wall.hxx>
38 
39 #include <svtools/stdctrl.hxx>
40 #include <svtools/svmedit.hxx>
41 #include <svtools/svtreebx.hxx>
42 #include <svl/stritem.hxx>
43 #include <svl/zforlist.hxx>
44 #include <svl/eitem.hxx>
45 
46 #include <unotools/charclass.hxx>
47 #include <tools/urlobj.hxx>
48 #include <tools/diagnose_ex.h>
49 
50 #include "formdlgs.hrc"
51 #include "funcpage.hxx"
52 #include "formula/formula.hxx"
53 #include "formula/IFunctionDescription.hxx"
54 #include "formula/FormulaCompiler.hxx"
55 #include "formula/token.hxx"
56 #include "formula/tokenarray.hxx"
57 #include "formula/formdata.hxx"
58 #include "formula/formulahelper.hxx"
59 #include "structpg.hxx"
60 #include "parawin.hxx"
61 #include "ModuleHelper.hxx"
62 #include "ForResId.hrc"
63 #include <com/sun/star/sheet/FormulaToken.hpp>
64 #include <com/sun/star/sheet/FormulaLanguage.hpp>
65 #include <com/sun/star/sheet/FormulaMapGroup.hpp>
66 #include <com/sun/star/sheet/FormulaMapGroupSpecialOffset.hpp>
67 #include <com/sun/star/beans/XPropertySet.hpp>
68 #include <boost/bind.hpp>
69 #include <comphelper/processfactory.hxx>
70 #include <map>
71 
72 #define TOKEN_OPEN  0
73 #define TOKEN_CLOSE 1
74 #define TOKEN_SEP   2
75 namespace formula
76 {
77     using namespace ::com::sun::star;
78 
79     class OFormulaToken : public IFormulaToken
80     {
81         sal_Int32   m_nParaCount;
82         bool        m_bIsFunction;
83 
84     public:
OFormulaToken(bool _bFunction,sal_Int32 _nParaCount)85         OFormulaToken(bool _bFunction,sal_Int32 _nParaCount) : m_nParaCount(_nParaCount),m_bIsFunction(_bFunction){}
86 
isFunction() const87         virtual bool isFunction() const { return m_bIsFunction; }
getArgumentCount() const88         virtual sal_uInt32 getArgumentCount() const { return m_nParaCount; }
89     };
90 
91 
92     class FormulaDlg_Impl
93     {
94     public:
95         ::std::pair<RefButton*,RefEdit*>
96                         RefInputStartBefore( RefEdit* pEdit, RefButton* pButton );
97         void            RefInputStartAfter( RefEdit* pEdit, RefButton* pButton );
98         void            RefInputDoneAfter( sal_Bool bForced );
99         sal_Bool            CalcValue( const String& rStrExp, String& rStrResult );
100         sal_Bool            CalcStruct( const String& rStrExp);
101         void            UpdateValues();
102         void            DeleteArgs();
103         xub_StrLen      GetFunctionPos(xub_StrLen nPos);
104         void            ClearAllParas();
105 
106         void            MakeTree(IStructHelper* _pTree,SvLBoxEntry* pParent,FormulaToken* _pToken,long Count);
107         void            fillTree(IStructHelper* _pTree);
108         void            UpdateTokenArray( const String& rStrExp);
109         String          RepairFormula(const String& aFormula);
110         void            FillDialog(sal_Bool nFlag=sal_True);
111         void            EditNextFunc( sal_Bool bForward, xub_StrLen nFStart=NOT_FOUND );
112         void            EditThisFunc(xub_StrLen nFStart);
113         void            EditFuncParas(xub_StrLen nEditPos);
114 
115 
116         void            UpdateArgInput( sal_uInt16 nOffset, sal_uInt16 nInput );
117         void            Update();
118         void            Update(const String& _sExp);
119 
120 
121         void            SaveArg( sal_uInt16 nEd );
122         void            UpdateSelection();
123         void            DoEnter( sal_Bool bOk );
124         void            UpdateFunctionDesc();
125         void            ResizeArgArr( const IFunctionDescription* pNewFunc );
126         void            FillListboxes();
127         void            FillControls(sal_Bool &rbNext, sal_Bool &rbPrev);
128 
129         FormulaDlgMode  SetMeText(const String& _sText,xub_StrLen PrivStart, xub_StrLen PrivEnd,sal_Bool bMatrix,sal_Bool _bSelect,sal_Bool _bUpdate);
130         void            SetMeText(const String& _sText);
131         sal_Bool            CheckMatrix(String& aFormula /*IN/OUT*/);
132 
133         void            SetEdSelection();
134 
135         sal_Bool            UpdateParaWin(Selection& _rSelection);
136         void            UpdateParaWin(const Selection& _rSelection,const String& _sRefStr);
137 
138         void            SetData(xub_StrLen nFStart,xub_StrLen nNextFStart,xub_StrLen nNextFEnd,xub_StrLen& PrivStart,xub_StrLen& PrivEnd);
139         void            PreNotify( NotifyEvent& rNEvt );
140 
141         RefEdit*        GetCurrRefEdit();
142         rtl::OString    FindFocusWin(Window *pWin);
143 
144         const FormulaHelper& GetFormulaHelper() const;
145         uno::Reference< sheet::XFormulaOpCodeMapper > GetFormulaOpCodeMapper() const;
146 
147         DECL_LINK( ModifyHdl, ParaWin* );
148         DECL_LINK( FxHdl, ParaWin* );
149 
150         DECL_LINK( MatrixHdl, CheckBox *);
151         DECL_LINK( FormulaHdl, MultiLineEdit* );
152         DECL_LINK( FormulaCursorHdl, EditBox*);
153         DECL_LINK( BtnHdl, PushButton* );
154         DECL_LINK( GetEdFocusHdl, ArgInput* );
155         DECL_LINK( GetFxFocusHdl, ArgInput* );
156         DECL_LINK( DblClkHdl, FuncPage* );
157         DECL_LINK( FuncSelHdl, FuncPage*);
158         DECL_LINK( StructSelHdl, StructPage * );
159     public:
160         OModuleClient                                           m_aModuleClient;
161         mutable uno::Reference< sheet::XFormulaOpCodeMapper>    m_xOpCodeMapper;
162         uno::Sequence< sheet::FormulaToken >                    m_aTokenList;
163         ::std::auto_ptr<FormulaTokenArray>                      m_pTokenArray;
164         mutable uno::Sequence< sheet::FormulaOpCodeMapEntry >   m_aSpecialOpCodes;
165         mutable const sheet::FormulaOpCodeMapEntry*             m_pSpecialOpCodesEnd;
166         mutable uno::Sequence< sheet::FormulaToken >            m_aSeparatorsOpCodes;
167         mutable uno::Sequence< sheet::FormulaOpCodeMapEntry >   m_aFunctionOpCodes;
168         mutable const sheet::FormulaOpCodeMapEntry*             m_pFunctionOpCodesEnd;
169         mutable uno::Sequence< sheet::FormulaOpCodeMapEntry >   m_aUnaryOpCodes;
170         mutable const sheet::FormulaOpCodeMapEntry*             m_pUnaryOpCodesEnd;
171         mutable uno::Sequence< sheet::FormulaOpCodeMapEntry >   m_aBinaryOpCodes;
172         mutable const sheet::FormulaOpCodeMapEntry*             m_pBinaryOpCodesEnd;
173         ::std::vector< ::boost::shared_ptr<OFormulaToken> >     m_aTokens;
174         ::std::map<FormulaToken*,sheet::FormulaToken>           m_aTokenMap;
175         IFormulaEditorHelper*                                   m_pHelper;
176         Dialog*  m_pParent;
177         IControlReferenceHandler*  m_pDlg;
178         TabControl      aTabCtrl;
179         GroupBox        aGEdit;     //! MUST be placed before pParaWin for initializing
180         ParaWin*        pParaWin;
181         FixedText       aFtHeadLine;
182         FixedInfo       aFtFuncName;
183         FixedInfo       aFtFuncDesc;
184 
185         FixedText       aFtEditName;
186         //FixedInfo     aFtEditDesc;
187 
188         FixedText       aFtResult;
189         ValWnd          aWndResult;
190 
191         FixedText       aFtFormula;
192         EditBox         aMEFormula;
193 
194         CheckBox        aBtnMatrix;
195         HelpButton      aBtnHelp;
196         CancelButton    aBtnCancel;
197 
198         PushButton      aBtnBackward;
199         PushButton      aBtnForward;
200         OKButton        aBtnEnd;
201 
202         RefEdit     aEdRef;
203         RefButton   aRefBtn;
204 
205         FixedText       aFtFormResult;
206         ValWnd          aWndFormResult;
207 
208         RefEdit*        pTheRefEdit;
209         RefButton*  pTheRefButton;
210         FuncPage*   pFuncPage;
211         StructPage* pStructPage;
212         String          aOldFormula;
213         sal_Bool            bStructUpdate;
214         MultiLineEdit*  pMEdit;
215         sal_Bool            bUserMatrixFlag;
216         Timer           aTimer;
217 
218         const String    aTitle1;
219         const String    aTitle2;
220         const String    aTxtEnd;
221         const String    aTxtOk;     // hinter aBtnEnd
222         FormulaHelper
223                         m_aFormulaHelper;
224 
225         rtl::OString    m_aEditHelpId;
226 
227         rtl::OString    aOldHelp;
228         rtl::OString    aOldUnique;
229         rtl::OString    aActivWinId;
230         sal_Bool            bIsShutDown;
231 
232 
233 
234         Font            aFntBold;
235         Font            aFntLight;
236         sal_uInt16          nEdFocus;
237     //    Selection       theCurSel;
238         sal_Bool            bEditFlag;
239         const IFunctionDescription* pFuncDesc;
240         xub_StrLen      nArgs;
241         ::std::vector< ::rtl::OUString > m_aArguments;
242         Selection       aFuncSel;
243 
244         FormulaDlg_Impl(Dialog* pParent
245                         , bool _bSupportFunctionResult
246                         , bool _bSupportResult
247                         , bool _bSupportMatrix
248                         ,IFormulaEditorHelper* _pHelper
249                         ,const IFunctionManager* _pFunctionMgr
250                         ,IControlReferenceHandler* _pDlg);
251         ~FormulaDlg_Impl();
252 
253     };
FormulaDlg_Impl(Dialog * pParent,bool _bSupportFunctionResult,bool _bSupportResult,bool _bSupportMatrix,IFormulaEditorHelper * _pHelper,const IFunctionManager * _pFunctionMgr,IControlReferenceHandler * _pDlg)254 FormulaDlg_Impl::FormulaDlg_Impl(Dialog* pParent
255                                         , bool _bSupportFunctionResult
256                                         , bool _bSupportResult
257                                         , bool _bSupportMatrix
258                                         ,IFormulaEditorHelper* _pHelper
259                                         ,const IFunctionManager* _pFunctionMgr
260                                         ,IControlReferenceHandler* _pDlg)
261     :
262     m_pHelper       (_pHelper),
263     m_pParent       (pParent),
264     m_pDlg          (_pDlg),
265     aTabCtrl        ( pParent, ModuleRes( TC_FUNCTION ) ),
266     aGEdit          ( pParent, ModuleRes( GB_EDIT ) ),
267     aFtHeadLine     ( pParent, ModuleRes( FT_HEADLINE ) ),
268     aFtFuncName     ( pParent, ModuleRes( FT_FUNCNAME ) ),
269     aFtFuncDesc     ( pParent, ModuleRes( FT_FUNCDESC ) ),
270     //
271     aFtEditName     ( pParent, ModuleRes( FT_EDITNAME ) ),
272     aFtResult       ( pParent, ModuleRes( FT_RESULT ) ),
273     aWndResult      ( pParent, ModuleRes( WND_RESULT ) ),
274 
275     aFtFormula      ( pParent, ModuleRes( FT_FORMULA ) ),
276     aMEFormula      ( pParent, ModuleRes( ED_FORMULA ) ),
277     //
278     aBtnMatrix      ( pParent, ModuleRes( BTN_MATRIX ) ),
279     aBtnHelp        ( pParent, ModuleRes( BTN_HELP ) ),
280     aBtnCancel      ( pParent, ModuleRes( BTN_CANCEL ) ),
281     aBtnBackward    ( pParent, ModuleRes( BTN_BACKWARD ) ),
282     aBtnForward     ( pParent, ModuleRes( BTN_FORWARD ) ),
283     aBtnEnd         ( pParent, ModuleRes( BTN_END ) ),
284     aEdRef          ( pParent, _pDlg, ModuleRes( ED_REF) ),
285     aRefBtn         ( pParent, ModuleRes( RB_REF),&aEdRef,_pDlg ),
286     aFtFormResult   ( pParent, ModuleRes( FT_FORMULA_RESULT)),
287     aWndFormResult  ( pParent, ModuleRes( WND_FORMULA_RESULT)),
288     //
289     pTheRefEdit     (NULL),
290     pMEdit          (NULL),
291     bUserMatrixFlag (sal_False),
292     //
293     aTitle1         ( ModuleRes( STR_TITLE1 ) ),        // lokale Resource
294     aTitle2         ( ModuleRes( STR_TITLE2 ) ),        // lokale Resource
295     aTxtEnd         ( ModuleRes( STR_END ) ),           // lokale Resource
296     aTxtOk          ( aBtnEnd.GetText() ),
297     m_aFormulaHelper(_pFunctionMgr),
298     //
299     bIsShutDown     (sal_False),
300     nEdFocus        (0),
301     pFuncDesc       (NULL),
302     nArgs           (0)
303 {
304     pParaWin = new ParaWin( pParent,_pDlg, aGEdit.GetPosPixel());
305     aGEdit.Hide();
306     pParaWin->Hide();
307     aFtEditName.Hide();
308     aEdRef.Hide();
309     aRefBtn.Hide();
310 
311     pMEdit = aMEFormula.GetEdit();
312     aMEFormula.SetAccessibleName(aFtFormula.GetText());
313     if (pMEdit)
314         pMEdit->SetAccessibleName(aFtFormula.GetText());
315     m_aEditHelpId = pMEdit->GetHelpId();
316     pMEdit->SetUniqueId( m_aEditHelpId );
317 
318     bEditFlag=sal_False;
319     bStructUpdate=sal_True;
320     Point aPos=aGEdit.GetPosPixel();
321     pParaWin->SetPosPixel(aPos);
322     pParaWin->SetArgModifiedHdl(LINK( this, FormulaDlg_Impl, ModifyHdl ) );
323     pParaWin->SetFxHdl(LINK( this, FormulaDlg_Impl, FxHdl ) );
324 
325     pFuncPage= new FuncPage( &aTabCtrl,_pFunctionMgr);
326     pStructPage= new StructPage( &aTabCtrl);
327     pFuncPage->Hide();
328     pStructPage->Hide();
329     aTabCtrl.SetTabPage( TP_FUNCTION, pFuncPage);
330     aTabCtrl.SetTabPage( TP_STRUCT, pStructPage);
331 
332     aOldHelp = pParent->GetHelpId();                // HelpId aus Resource immer fuer "Seite 1"
333     aOldUnique = pParent->GetUniqueId();
334 
335     aFtResult.Show( _bSupportResult );
336     aWndResult.Show( _bSupportResult );
337 
338     aFtFormResult.Show( _bSupportFunctionResult );
339     aWndFormResult.Show( _bSupportFunctionResult );
340 
341     if ( _bSupportMatrix )
342         aBtnMatrix.SetClickHdl(LINK( this, FormulaDlg_Impl, MatrixHdl ) );
343     else
344         aBtnMatrix.Hide();
345 
346     aBtnCancel  .SetClickHdl( LINK( this, FormulaDlg_Impl, BtnHdl ) );
347     aBtnEnd     .SetClickHdl( LINK( this, FormulaDlg_Impl, BtnHdl ) );
348     aBtnForward .SetClickHdl( LINK( this, FormulaDlg_Impl, BtnHdl ) );
349     aBtnBackward.SetClickHdl( LINK( this, FormulaDlg_Impl, BtnHdl ) );
350 
351     pFuncPage->SetDoubleClickHdl( LINK( this, FormulaDlg_Impl, DblClkHdl ) );
352     pFuncPage->SetSelectHdl( LINK( this, FormulaDlg_Impl, FuncSelHdl) );
353     pStructPage->SetSelectionHdl( LINK( this, FormulaDlg_Impl, StructSelHdl ) );
354     pMEdit->SetModifyHdl( LINK( this, FormulaDlg_Impl, FormulaHdl ) );
355     aMEFormula.SetSelChangedHdl( LINK( this, FormulaDlg_Impl, FormulaCursorHdl ) );
356 
357     aFntLight = aFtFormula.GetFont();
358     aFntLight.SetTransparent( sal_True );
359     aFntBold = aFntLight;
360     aFntBold.SetWeight( WEIGHT_BOLD );
361 
362     pParaWin->SetArgumentFonts(aFntBold,aFntLight);
363 
364     //  function description for choosing a function is no longer in a different color
365 
366     aFtHeadLine.SetFont(aFntBold);
367     aFtFuncName.SetFont(aFntLight);
368     aFtFuncDesc.SetFont(aFntLight);
369 }
~FormulaDlg_Impl()370 FormulaDlg_Impl::~FormulaDlg_Impl()
371 {
372     if(aTimer.IsActive())
373     {
374         aTimer.SetTimeoutHdl(Link());
375         aTimer.Stop();
376     } // if(aTimer.IsActive())
377     bIsShutDown=sal_True;// Setzen, damit PreNotify keinen GetFocus speichert.
378     FormEditData* pData = m_pHelper->getFormEditData();
379     if (pData) // wird nicht ueber Close zerstoert;
380     {
381         pData->SetFStart((xub_StrLen)pMEdit->GetSelection().Min());
382         pData->SetSelection(pMEdit->GetSelection());
383 
384         if(aTabCtrl.GetCurPageId()==TP_FUNCTION)
385             pData->SetMode( (sal_uInt16) FORMULA_FORMDLG_FORMULA );
386         else
387             pData->SetMode( (sal_uInt16) FORMULA_FORMDLG_EDIT );
388         pData->SetUndoStr(pMEdit->GetText());
389         pData->SetMatrixFlag(aBtnMatrix.IsChecked());
390     }
391 
392     aTabCtrl.RemovePage(TP_FUNCTION);
393     aTabCtrl.RemovePage(TP_STRUCT);
394 
395     delete pStructPage;
396     delete pFuncPage;
397     delete pParaWin;
398     DeleteArgs();
399 }
400 // -----------------------------------------------------------------------------
PreNotify(NotifyEvent & rNEvt)401 void FormulaDlg_Impl::PreNotify( NotifyEvent& rNEvt )
402 {
403     sal_uInt16 nSwitch=rNEvt.GetType();
404     if(nSwitch==EVENT_GETFOCUS && !bIsShutDown)
405     {
406         Window* pWin=rNEvt.GetWindow();
407         if(pWin!=NULL)
408         {
409             aActivWinId = pWin->GetUniqueId();
410             if(aActivWinId.getLength()==0)
411             {
412                 Window* pParent=pWin->GetParent();
413                 while(pParent!=NULL)
414                 {
415                     aActivWinId=pParent->GetUniqueId();
416 
417                     if(aActivWinId.getLength()!=0) break;
418 
419                     pParent=pParent->GetParent();
420                 }
421             }
422             if(aActivWinId.getLength())
423             {
424 
425                 FormEditData* pData = m_pHelper->getFormEditData();
426 
427                 if (pData && !aTimer.IsActive()) // wird nicht ueber Close zerstoert;
428                 {
429                     pData->SetUniqueId(aActivWinId);
430                 }
431             }
432         }
433     }
434 }
GetFormulaOpCodeMapper() const435 uno::Reference< sheet::XFormulaOpCodeMapper > FormulaDlg_Impl::GetFormulaOpCodeMapper() const
436 {
437     if ( !m_xOpCodeMapper.is() )
438     {
439         m_xOpCodeMapper = m_pHelper->getFormulaOpCodeMapper();
440         m_aFunctionOpCodes = m_xOpCodeMapper->getAvailableMappings(sheet::FormulaLanguage::ODFF,sheet::FormulaMapGroup::FUNCTIONS);
441         m_pFunctionOpCodesEnd = m_aFunctionOpCodes.getConstArray() + m_aFunctionOpCodes.getLength();
442 
443         m_aUnaryOpCodes = m_xOpCodeMapper->getAvailableMappings(sheet::FormulaLanguage::ODFF,sheet::FormulaMapGroup::UNARY_OPERATORS);
444         m_pUnaryOpCodesEnd = m_aUnaryOpCodes.getConstArray() + m_aUnaryOpCodes.getLength();
445 
446         m_aBinaryOpCodes = m_xOpCodeMapper->getAvailableMappings(sheet::FormulaLanguage::ODFF,sheet::FormulaMapGroup::BINARY_OPERATORS);
447         m_pBinaryOpCodesEnd = m_aBinaryOpCodes.getConstArray() + m_aBinaryOpCodes.getLength();
448 
449         uno::Sequence< ::rtl::OUString > aArgs(3);
450         aArgs[TOKEN_OPEN]   = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("("));
451         aArgs[TOKEN_CLOSE]  = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")"));
452         aArgs[TOKEN_SEP]    = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(";"));
453         m_aSeparatorsOpCodes = m_xOpCodeMapper->getMappings(aArgs,sheet::FormulaLanguage::ODFF);
454 
455         m_aSpecialOpCodes = m_xOpCodeMapper->getAvailableMappings(sheet::FormulaLanguage::ODFF,sheet::FormulaMapGroup::SPECIAL);
456         m_pSpecialOpCodesEnd = m_aSpecialOpCodes.getConstArray() + m_aSpecialOpCodes.getLength();
457     } // if ( !m_xOpCodeMapper.is() )
458     return m_xOpCodeMapper;
459 }
460 
DeleteArgs()461 void FormulaDlg_Impl::DeleteArgs()
462 {
463     ::std::vector< ::rtl::OUString>().swap(m_aArguments);
464     nArgs = 0;
465 }
466 namespace
467 {
468     // comparing two property instances
469     struct OpCodeCompare : public ::std::binary_function< sheet::FormulaOpCodeMapEntry, sal_Int32 , bool >
470     {
operator ()formula::__anon37c2110d0111::OpCodeCompare471         bool operator() (const sheet::FormulaOpCodeMapEntry& x, sal_Int32 y) const
472         {
473             return x.Token.OpCode == y;
474         }
475     };
476 }
477 // -----------------------------------------------------------------------------
GetFunctionPos(xub_StrLen nPos)478 xub_StrLen FormulaDlg_Impl::GetFunctionPos(xub_StrLen nPos)
479 {
480     const sal_Unicode sep = m_pHelper->getFunctionManager()->getSingleToken(IFunctionManager::eSep);
481 
482     xub_StrLen nTokPos=1;
483     xub_StrLen nOldTokPos=1;
484     xub_StrLen nFuncPos=STRING_NOTFOUND;    //@ Testweise
485     xub_StrLen nPrevFuncPos=1;
486     short  nBracketCount=0;
487     sal_Bool   bFlag=sal_False;
488     String aFormString = pMEdit->GetText();
489     m_aFormulaHelper.GetCharClass()->toUpper( aFormString );
490 
491     if ( m_aTokenList.getLength() )
492     {
493         const uno::Reference< sheet::XFormulaParser > xParser(m_pHelper->getFormulaParser());
494         const table::CellAddress aRefPos(m_pHelper->getReferencePosition());
495 
496         const sheet::FormulaToken* pIter = m_aTokenList.getConstArray();
497         const sheet::FormulaToken* pEnd = pIter + m_aTokenList.getLength();
498         //if ( pIter != pEnd && aFormString.GetChar(0) == '=' )
499         //    ++pIter;
500         try
501         {
502             while ( pIter != pEnd )
503             {
504                 const sal_Int32 eOp = pIter->OpCode;
505                 uno::Sequence<sheet::FormulaToken> aArgs(1);
506                 aArgs[0] = *pIter;
507                 const String aString = xParser->printFormula(aArgs, aRefPos);
508                 const sheet::FormulaToken* pNextToken = pIter + 1;
509 
510                 if(!bUserMatrixFlag && FormulaCompiler::IsMatrixFunction((OpCode)eOp) )
511                 {
512                     aBtnMatrix.Check();
513                 }
514 
515                 if ( eOp == m_aSpecialOpCodes[sheet::FormulaMapGroupSpecialOffset::PUSH].Token.OpCode || eOp == m_aSpecialOpCodes[sheet::FormulaMapGroupSpecialOffset::SPACES].Token.OpCode )
516                 {
517                     const xub_StrLen n1=aFormString.Search(sep, nTokPos);
518                     const xub_StrLen n2=aFormString.Search(')',nTokPos);
519                     xub_StrLen nXXX=nTokPos;
520                     if(n1<n2)
521                     {
522                         nTokPos=n1;
523                     }
524                     else
525                     {
526                         nTokPos=n2;
527                     }
528                     if ( pNextToken != pEnd )
529                     {
530                         aArgs[0] = *pNextToken;
531                         const String a2String = xParser->printFormula(aArgs, aRefPos);
532                         const xub_StrLen n3 = aFormString.Search(a2String,nXXX);
533                         if ( n3 < nTokPos )
534                             nTokPos = n3;
535                     }
536                 }
537                 else
538                 {
539                     nTokPos = sal::static_int_cast<xub_StrLen>( nTokPos + aString.Len() );
540                 }
541 
542                 if ( eOp == m_aSeparatorsOpCodes[TOKEN_OPEN].OpCode )
543                 {
544                     nBracketCount++;
545                     bFlag=sal_True;
546                 }
547                 else if ( eOp == m_aSeparatorsOpCodes[TOKEN_CLOSE].OpCode )
548                 {
549                     nBracketCount--;
550                     bFlag=sal_False;
551                     nFuncPos=nPrevFuncPos;
552                 }
553                 bool bIsFunction = ::std::find_if(m_aFunctionOpCodes.getConstArray(),m_pFunctionOpCodesEnd,::std::bind2nd(OpCodeCompare(),boost::cref(eOp))) != m_pFunctionOpCodesEnd;
554 
555                 if ( bIsFunction && m_aSpecialOpCodes[sheet::FormulaMapGroupSpecialOffset::SPACES].Token.OpCode != eOp )
556                 {
557                     nPrevFuncPos = nFuncPos;
558                     nFuncPos = nOldTokPos;
559                 }
560 
561                 if ( nOldTokPos <= nPos && nPos < nTokPos )
562                 {
563                     if ( !bIsFunction )
564                     {
565                         if ( nBracketCount < 1 )
566                         {
567                             nFuncPos= pMEdit->GetText().Len();
568                         }
569                         else if ( !bFlag )
570                         {
571                             nFuncPos=nPrevFuncPos;
572                         }
573                     }
574                     break;
575                 }
576 
577                 pIter = pNextToken;
578                 nOldTokPos = nTokPos;
579             } // while ( pIter != pEnd )
580         }
581         catch(const uno::Exception& )
582         {
583             DBG_ERROR("Exception caught!");
584         }
585     }
586 
587     return nFuncPos;
588 }
589 // -----------------------------------------------------------------------------
CalcValue(const String & rStrExp,String & rStrResult)590 sal_Bool FormulaDlg_Impl::CalcValue( const String& rStrExp, String& rStrResult )
591 {
592     sal_Bool bResult = sal_True;
593 
594     if ( rStrExp.Len() > 0 )
595     {
596         // nur, wenn keine Tastatureingabe mehr anliegt, den Wert berechnen:
597 
598         if ( !Application::AnyInput( INPUT_KEYBOARD ) )
599         {
600             bResult = m_pHelper->calculateValue(rStrExp,rStrResult);
601         }
602         else
603             bResult = sal_False;
604     }
605 
606     return bResult;
607 }
608 
UpdateValues()609 void FormulaDlg_Impl::UpdateValues()
610 {
611     String aStrResult;
612 
613     if ( CalcValue( pFuncDesc->getFormula( m_aArguments ), aStrResult ) )
614         aWndResult.SetValue( aStrResult );
615 
616     aStrResult.Erase();
617     if ( CalcValue(m_pHelper->getCurrentFormula(), aStrResult ) )
618         aWndFormResult.SetValue( aStrResult );
619     else
620     {
621         aStrResult.Erase();
622         aWndFormResult.SetValue( aStrResult );
623     }
624     CalcStruct(pMEdit->GetText());
625 }
626 
CalcStruct(const String & rStrExp)627 sal_Bool FormulaDlg_Impl::CalcStruct( const String& rStrExp)
628 {
629     sal_Bool bResult = sal_True;
630     xub_StrLen nLength=rStrExp.Len();
631 
632     if ( rStrExp.Len() > 0 && aOldFormula!=rStrExp && bStructUpdate)
633     {
634         // nur, wenn keine Tastatureingabe mehr anliegt, den Wert berechnen:
635 
636         if ( !Application::AnyInput( INPUT_KEYBOARD ) )
637         {
638             pStructPage->ClearStruct();
639 
640             String aString=rStrExp;
641             if(rStrExp.GetChar(nLength-1)=='(')
642             {
643                 aString.Erase((xub_StrLen)(nLength-1));
644             }
645 
646             aString.EraseAllChars('\n');
647             String aStrResult;
648 
649             if ( CalcValue(aString, aStrResult ) )
650                 aWndFormResult.SetValue( aStrResult );
651 
652             UpdateTokenArray(aString);
653             fillTree(pStructPage);
654 
655             aOldFormula=rStrExp;
656             if(rStrExp.GetChar(nLength-1)=='(')
657                 UpdateTokenArray(rStrExp);
658         }
659         else
660             bResult = sal_False;
661     }
662     return bResult;
663 }
664 
665 // -----------------------------------------------------------------------------
MakeTree(IStructHelper * _pTree,SvLBoxEntry * pParent,FormulaToken * _pToken,long Count)666 void FormulaDlg_Impl::MakeTree(IStructHelper* _pTree,SvLBoxEntry* pParent,FormulaToken* _pToken,long Count)
667 {
668     if( _pToken != NULL && Count > 0 )
669     {
670         long nParas = _pToken->GetParamCount();
671         OpCode eOp = _pToken->GetOpCode();
672 
673         // #i101512# for output, the original token is needed
674         FormulaToken* pOrigToken = (_pToken->GetType() == svFAP) ? _pToken->GetFAPOrigToken() : _pToken;
675         uno::Sequence<sheet::FormulaToken> aArgs(1);
676         aArgs[0] = m_aTokenMap.find(pOrigToken)->second;
677         try
678         {
679             const table::CellAddress aRefPos(m_pHelper->getReferencePosition());
680             const String aResult = m_pHelper->getFormulaParser()->printFormula(aArgs, aRefPos);
681 
682             if ( nParas > 0 )
683             {
684                 SvLBoxEntry* pEntry;
685 
686                 String aTest=_pTree->GetEntryText(pParent);
687 
688                 if(aTest==aResult &&
689                     (eOp==ocAdd || eOp==ocMul ||
690                      eOp==ocAmpersand))
691                 {
692                     pEntry=pParent;
693                 }
694                 else
695                 {
696                     if(eOp==ocBad)
697                     {
698                         pEntry=_pTree->InsertEntry(aResult,pParent,STRUCT_ERROR,0,_pToken);
699                     }
700                     else
701                     {
702                         pEntry=_pTree->InsertEntry(aResult,pParent,STRUCT_FOLDER,0,_pToken);
703                     }
704                 }
705 
706                 MakeTree(_pTree,pEntry,m_pTokenArray->PrevRPN(),nParas);
707                 --Count;
708                 m_pTokenArray->NextRPN();
709                 MakeTree(_pTree,pParent,m_pTokenArray->PrevRPN(),Count);
710             }
711             else
712             {
713                 if(eOp==ocBad)
714                 {
715                     _pTree->InsertEntry(aResult,pParent,STRUCT_ERROR,0,_pToken);
716                 }
717                 else
718                 {
719                     _pTree->InsertEntry(aResult,pParent,STRUCT_END,0,_pToken);
720                 }
721                 --Count;
722                 MakeTree(_pTree,pParent,m_pTokenArray->PrevRPN(),Count);
723             }
724         }
725         catch(uno::Exception&)
726         {
727             DBG_UNHANDLED_EXCEPTION();
728         }
729     }
730 }
731 
fillTree(IStructHelper * _pTree)732 void FormulaDlg_Impl::fillTree(IStructHelper* _pTree)
733 {
734     GetFormulaOpCodeMapper();
735     FormulaToken* pToken = m_pTokenArray->LastRPN();
736 
737     if( pToken != NULL)
738     {
739         MakeTree(_pTree,NULL,pToken,1);
740     }
741 }
UpdateTokenArray(const String & rStrExp)742 void FormulaDlg_Impl::UpdateTokenArray( const String& rStrExp)
743 {
744     m_aTokenMap.clear();
745     m_aTokenList.realloc(0);
746     try
747     {
748         const table::CellAddress aRefPos(m_pHelper->getReferencePosition());
749         m_aTokenList = m_pHelper->getFormulaParser()->parseFormula(rStrExp, aRefPos);
750     }
751     catch(const uno::Exception&)
752     {
753         DBG_UNHANDLED_EXCEPTION();
754     }
755     GetFormulaOpCodeMapper(); // just to get it initialized
756     m_pTokenArray = m_pHelper->convertToTokenArray(m_aTokenList);
757     const sal_Int32 nLen = static_cast<sal_Int32>(m_pTokenArray->GetLen());
758     FormulaToken** pTokens = m_pTokenArray->GetArray();
759     if ( pTokens && nLen == m_aTokenList.getLength() )
760     {
761         for (sal_Int32 nPos=0; nPos<nLen; nPos++)
762         {
763             m_aTokenMap.insert(::std::map<FormulaToken*,sheet::FormulaToken>::value_type(pTokens[nPos],m_aTokenList[nPos]));
764         }
765     } // if ( pTokens && nLen == m_aTokenList.getLength() )
766 
767     FormulaCompiler aCompiler(*m_pTokenArray.get());
768     aCompiler.SetCompileForFAP(sal_True);   // #i101512# special handling is needed
769     aCompiler.CompileTokenArray();
770 }
771 
FillDialog(sal_Bool nFlag)772 void FormulaDlg_Impl::FillDialog(sal_Bool nFlag)
773 {
774     sal_Bool bNext=sal_True, bPrev=sal_True;
775     if(nFlag)
776         FillControls(bNext, bPrev);
777     FillListboxes();
778     if(nFlag)
779     {
780         aBtnBackward.Enable(bPrev);
781         aBtnForward.Enable(bNext);
782     }
783 
784     String aStrResult;
785 
786     if ( CalcValue(m_pHelper->getCurrentFormula(), aStrResult ) )
787         aWndFormResult.SetValue( aStrResult );
788     else
789     {
790         aStrResult.Erase();
791         aWndFormResult.SetValue( aStrResult );
792     }
793 }
794 
795 // -----------------------------------------------------------------------------
FillListboxes()796 void FormulaDlg_Impl::FillListboxes()
797 {
798     //  Umschalten zwischen den "Seiten"
799     FormEditData* pData = m_pHelper->getFormEditData();
800     String aNewTitle;
801     //  1. Seite: Funktion auswaehlen
802     if ( pFuncDesc && pFuncDesc->getCategory() )
803     {
804         if( pFuncPage->GetCategory() != pFuncDesc->getCategory()->getNumber() + 1 )
805             pFuncPage->SetCategory(static_cast<sal_uInt16>(pFuncDesc->getCategory()->getNumber() + 1));
806 
807         sal_uInt16 nPos=pFuncPage->GetFuncPos(pFuncDesc);
808 
809         pFuncPage->SetFunction(nPos);
810     }
811     else if ( pData )
812     {
813         pFuncPage->SetCategory( pData->GetCatSel() );
814         pFuncPage->SetFunction( pData->GetFuncSel() );
815     }
816     FuncSelHdl(NULL);
817 
818     //  ResizeArgArr jetzt schon in UpdateFunctionDesc
819 
820 
821     m_pHelper->setDispatcherLock( sal_True);// Modal-Modus einschalten
822 
823     aNewTitle = aTitle1;
824 
825     //  HelpId fuer 1. Seite ist die aus der Resource
826     m_pParent->SetHelpId( aOldHelp );
827     m_pParent->SetUniqueId( aOldUnique );
828 }
829 // -----------------------------------------------------------------------------
FillControls(sal_Bool & rbNext,sal_Bool & rbPrev)830 void FormulaDlg_Impl::FillControls(sal_Bool &rbNext, sal_Bool &rbPrev)
831 {
832     //  Umschalten zwischen den "Seiten"
833     FormEditData* pData = m_pHelper->getFormEditData();
834     if (!pData )
835         return;
836 
837     String aNewTitle;
838     //  2. Seite oder Editieren: ausgewaehlte Funktion anzeigen
839 
840     xub_StrLen nFStart     = pData->GetFStart();
841     String aFormula        = m_pHelper->getCurrentFormula();
842     xub_StrLen nNextFStart = nFStart;
843     xub_StrLen nNextFEnd   = 0;
844 
845     aFormula.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " )" ));
846     DeleteArgs();
847     const IFunctionDescription* pOldFuncDesc = pFuncDesc;
848     sal_Bool bTestFlag = sal_False;
849 
850     if ( m_aFormulaHelper.GetNextFunc( aFormula, sal_False,
851                                      nNextFStart, &nNextFEnd, &pFuncDesc, &m_aArguments ) )
852     {
853         bTestFlag = (pOldFuncDesc != pFuncDesc);
854         if(bTestFlag)
855         {
856             aFtHeadLine.Hide();
857             aFtFuncName.Hide();
858             aFtFuncDesc.Hide();
859             pParaWin->SetFunctionDesc(pFuncDesc);
860             aFtEditName.SetText( pFuncDesc->getFunctionName() );
861             aFtEditName.Show();
862             pParaWin->Show();
863             const rtl::OString aHelpId = pFuncDesc->getHelpId();
864             if ( aHelpId.getLength() )
865                 pMEdit->SetHelpId(aHelpId);
866         }
867 
868         xub_StrLen nOldStart, nOldEnd;
869         m_pHelper->getSelection( nOldStart, nOldEnd );
870         if ( nOldStart != nNextFStart || nOldEnd != nNextFEnd )
871         {
872             m_pHelper->setSelection( nNextFStart, nNextFEnd );
873         }
874         aFuncSel.Min() = nNextFStart;
875         aFuncSel.Max() = nNextFEnd;
876 
877         if(!bEditFlag)
878             pMEdit->SetText(m_pHelper->getCurrentFormula());
879         xub_StrLen PrivStart, PrivEnd;
880         m_pHelper->getSelection( PrivStart, PrivEnd);
881         if(!bEditFlag)
882             pMEdit->SetSelection( Selection(PrivStart, PrivEnd));
883 
884         nArgs = pFuncDesc->getSuppressedArgumentCount();
885         sal_uInt16 nOffset = pData->GetOffset();
886         nEdFocus = pData->GetEdFocus();
887 
888         //  Verkettung der Edit's fuer Focus-Kontrolle
889 
890         if(bTestFlag)
891             pParaWin->SetArgumentOffset(nOffset);
892         sal_uInt16 nActiv=0;
893         xub_StrLen nArgPos= m_aFormulaHelper.GetArgStart( aFormula, nFStart, 0 );
894         xub_StrLen nEditPos=(xub_StrLen) pMEdit->GetSelection().Min();
895         sal_Bool    bFlag=sal_False;
896 
897         for(sal_uInt16 i=0;i<nArgs;i++)
898         {
899             sal_Int32 nLength = m_aArguments[i].getLength()+1;
900             pParaWin->SetArgument(i,m_aArguments[i]);
901             if(nArgPos<=nEditPos && nEditPos<nArgPos+nLength)
902             {
903                 nActiv=i;
904                 bFlag=sal_True;
905             }
906             nArgPos = sal::static_int_cast<xub_StrLen>( nArgPos + nLength );
907         }
908         pParaWin->UpdateParas();
909 
910         if(bFlag)
911         {
912             pParaWin->SetActiveLine(nActiv);
913         }
914 
915         //pParaWin->SetEdFocus( nEdFocus );
916         UpdateValues();
917     }
918     else
919     {
920         aFtEditName.SetText(String());
921         pMEdit->SetHelpId( m_aEditHelpId );
922     }
923         //  Test, ob vorne/hinten noch mehr Funktionen sind
924 
925     xub_StrLen nTempStart = m_aFormulaHelper.GetArgStart( aFormula, nFStart, 0 );
926     rbNext = m_aFormulaHelper.GetNextFunc( aFormula, sal_False, nTempStart );
927     nTempStart=(xub_StrLen)pMEdit->GetSelection().Min();
928     pData->SetFStart(nTempStart);
929     rbPrev = m_aFormulaHelper.GetNextFunc( aFormula, sal_True, nTempStart );
930 }
931 // -----------------------------------------------------------------------------
932 
ClearAllParas()933 void FormulaDlg_Impl::ClearAllParas()
934 {
935     DeleteArgs();
936     pFuncDesc = NULL;
937     pParaWin->ClearAll();
938     aWndResult.SetValue(String());
939     aFtFuncName.SetText(String());
940     FuncSelHdl(NULL);
941 
942     if(pFuncPage->IsVisible())
943     {
944         aFtEditName.Hide();
945         pParaWin->Hide();
946 
947         aBtnForward.Enable(sal_True); //@new
948         aFtHeadLine.Show();
949         aFtFuncName.Show();
950         aFtFuncDesc.Show();
951     }
952 }
RepairFormula(const String & aFormula)953 String FormulaDlg_Impl::RepairFormula(const String& aFormula)
954 {
955     String aResult('=');
956     try
957     {
958         UpdateTokenArray(aFormula);
959 
960         if ( m_aTokenList.getLength() )
961         {
962             const table::CellAddress aRefPos(m_pHelper->getReferencePosition());
963             const String sFormula(m_pHelper->getFormulaParser()->printFormula(m_aTokenList, aRefPos));
964             if ( !sFormula.Len() || sFormula.GetChar(0) != '=' )
965                 aResult += sFormula;
966             else
967                 aResult = sFormula;
968 
969         }
970     }
971     catch(const uno::Exception& )
972     {
973         DBG_ERROR("Exception caught!");
974     }
975     return aResult;
976 }
977 
DoEnter(sal_Bool bOk)978 void FormulaDlg_Impl::DoEnter(sal_Bool bOk)
979 {
980     //  Eingabe ins Dokument uebernehmen oder abbrechen
981     if ( bOk)
982     {
983         //  ggf. Dummy-Argumente entfernen
984         String  aInputFormula = m_pHelper->getCurrentFormula();
985         String  aString = RepairFormula(pMEdit->GetText());
986         m_pHelper->setSelection(0, aInputFormula.Len());
987         m_pHelper->setCurrentFormula(aString);
988     }
989 
990     m_pHelper->switchBack();
991 
992     m_pHelper->dispatch(bOk,aBtnMatrix.IsChecked());
993     //  Daten loeschen
994     m_pHelper->deleteFormData();
995 
996     //  Dialog schliessen
997     m_pHelper->doClose(bOk);
998 }
999 // -----------------------------------------------------------------------------
1000 
IMPL_LINK(FormulaDlg_Impl,BtnHdl,PushButton *,pBtn)1001 IMPL_LINK( FormulaDlg_Impl, BtnHdl, PushButton*, pBtn )
1002 {
1003     if ( pBtn == &aBtnCancel )
1004     {
1005         DoEnter(sal_False);                 // schliesst den Dialog
1006     }
1007     else if ( pBtn == &aBtnEnd )
1008     {
1009         DoEnter(sal_True);                  // schliesst den Dialog
1010     }
1011     else if ( pBtn == &aBtnForward )
1012     {
1013         //@pMEdit->GrabFocus();         // Damit die Selektion auch angezeigt wird.
1014         const IFunctionDescription* pDesc =pFuncPage->GetFuncDesc( pFuncPage->GetFunction() );
1015 
1016         if(pDesc==pFuncDesc || !pFuncPage->IsVisible())
1017             EditNextFunc( sal_True );
1018         else
1019         {
1020             DblClkHdl(pFuncPage);      //new
1021             aBtnForward.Enable(sal_False); //new
1022         }
1023         //@EditNextFunc( sal_True );
1024     }
1025     else if ( pBtn == &aBtnBackward )
1026     {
1027         bEditFlag=sal_False;
1028         aBtnForward.Enable(sal_True);
1029         EditNextFunc( sal_False );
1030         aMEFormula.Invalidate();
1031         aMEFormula.Update();
1032     }
1033     //...
1034 
1035     return 0;
1036 }
1037 // -----------------------------------------------------------------------------
1038 
1039 
1040 //  --------------------------------------------------------------------------
1041 //                          Funktionen fuer 1. Seite
1042 //  --------------------------------------------------------------------------
1043 
ResizeArgArr(const IFunctionDescription * pNewFunc)1044 void FormulaDlg_Impl::ResizeArgArr( const IFunctionDescription* pNewFunc )
1045 {
1046     if ( pFuncDesc != pNewFunc )
1047     {
1048         DeleteArgs();
1049 
1050         if ( pNewFunc )
1051             nArgs = pNewFunc->getSuppressedArgumentCount();
1052 
1053         pFuncDesc = pNewFunc;
1054     }
1055 }
1056 // -----------------------------------------------------------------------------
1057 
UpdateFunctionDesc()1058 void FormulaDlg_Impl::UpdateFunctionDesc()
1059 {
1060     FormEditData* pData = m_pHelper->getFormEditData();
1061     if (!pData)
1062         return;
1063     sal_uInt16 nCat = pFuncPage->GetCategory();
1064     if ( nCat == LISTBOX_ENTRY_NOTFOUND )
1065         nCat = 0;
1066     pData->SetCatSel( nCat );
1067     sal_uInt16 nFunc = pFuncPage->GetFunction();
1068     if ( nFunc == LISTBOX_ENTRY_NOTFOUND )
1069         nFunc = 0;
1070     pData->SetFuncSel( nFunc );
1071 
1072     if (   (pFuncPage->GetFunctionEntryCount() > 0)
1073         && (pFuncPage->GetFunction() != LISTBOX_ENTRY_NOTFOUND) )
1074     {
1075         const IFunctionDescription* pDesc = pFuncPage->GetFuncDesc(pFuncPage->GetFunction() );
1076         if (pDesc)
1077         {
1078             pDesc->initArgumentInfo();      // full argument info is needed
1079 
1080             String aSig = pDesc->getSignature();
1081 
1082             aFtFuncName.SetText( aSig );
1083             aFtFuncDesc.SetText( pDesc->getDescription() );
1084             ResizeArgArr( pDesc );
1085 
1086             if ( !m_aArguments.empty() )        // noch Argumente da?
1087                 aSig = pDesc->getFormula( m_aArguments );           // fuer Eingabezeile
1088             //@ m_pHelper->setCurrentFormula( aSig );
1089         }
1090     }
1091     else
1092     {
1093         aFtFuncName.SetText( String() );
1094         aFtFuncDesc.SetText( String() );
1095 
1096         //ResizeArgArr( NULL );
1097         m_pHelper->setCurrentFormula( String() );
1098     }
1099 }
1100 // -----------------------------------------------------------------------------
1101 
1102 // Handler fuer Listboxen
1103 
IMPL_LINK(FormulaDlg_Impl,DblClkHdl,FuncPage *,EMPTYARG)1104 IMPL_LINK( FormulaDlg_Impl, DblClkHdl, FuncPage*, EMPTYARG )
1105 {
1106     sal_uInt16 nFunc = pFuncPage->GetFunction();
1107 
1108     //  ex-UpdateLRUList
1109     const IFunctionDescription* pDesc = pFuncPage->GetFuncDesc(nFunc);
1110     m_pHelper->insertEntryToLRUList(pDesc);
1111 
1112     String aFuncName = pFuncPage->GetSelFunctionName();
1113     aFuncName.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "()" ));
1114     m_pHelper->setCurrentFormula(aFuncName);
1115     pMEdit->ReplaceSelected(aFuncName);
1116 
1117     Selection aSel=pMEdit->GetSelection();
1118     aSel.Max()=aSel.Max()-1;
1119     pMEdit->SetSelection(aSel);
1120 
1121     FormulaHdl(pMEdit);
1122 
1123     aSel.Min()=aSel.Max();
1124     pMEdit->SetSelection(aSel);
1125 
1126     if(nArgs==0)
1127     {
1128         BtnHdl(&aBtnBackward);
1129     }
1130 
1131     pParaWin->SetEdFocus(0);
1132     aBtnForward.Enable(sal_False); //@New
1133 
1134     return 0;
1135 }
1136 // -----------------------------------------------------------------------------
1137 
1138 //  --------------------------------------------------------------------------
1139 //                          Funktionen fuer rechte Seite
1140 //  --------------------------------------------------------------------------
SetData(xub_StrLen nFStart,xub_StrLen nNextFStart,xub_StrLen nNextFEnd,xub_StrLen & PrivStart,xub_StrLen & PrivEnd)1141 void FormulaDlg_Impl::SetData(xub_StrLen nFStart,xub_StrLen nNextFStart,xub_StrLen nNextFEnd,xub_StrLen& PrivStart,xub_StrLen& PrivEnd)
1142 {
1143     xub_StrLen nFEnd;
1144 
1145     // Selektion merken und neue setzen
1146     m_pHelper->getSelection( nFStart, nFEnd );
1147     m_pHelper->setSelection( nNextFStart, nNextFEnd );
1148     if(!bEditFlag)
1149         pMEdit->SetText(m_pHelper->getCurrentFormula());
1150 
1151 
1152     m_pHelper->getSelection( PrivStart, PrivEnd);
1153     if(!bEditFlag)
1154     {
1155         pMEdit->SetSelection( Selection(PrivStart, PrivEnd));
1156         aMEFormula.UpdateOldSel();
1157     }
1158 
1159     FormEditData* pData = m_pHelper->getFormEditData();
1160     pData->SetFStart( nNextFStart );
1161     pData->SetOffset( 0 );
1162     pData->SetEdFocus( 0 );
1163 
1164     FillDialog();
1165 }
1166 // -----------------------------------------------------------------------------
EditThisFunc(xub_StrLen nFStart)1167 void FormulaDlg_Impl::EditThisFunc(xub_StrLen nFStart)
1168 {
1169     FormEditData* pData = m_pHelper->getFormEditData();
1170     if (!pData) return;
1171 
1172     String aFormula = m_pHelper->getCurrentFormula();
1173 
1174     if(nFStart==NOT_FOUND)
1175     {
1176         nFStart = pData->GetFStart();
1177     }
1178     else
1179     {
1180         pData->SetFStart(nFStart);
1181     }
1182 
1183     xub_StrLen nNextFStart  = nFStart;
1184     xub_StrLen nNextFEnd    = 0;
1185 
1186     sal_Bool bFound;
1187 
1188     //@bFound = m_pHelper->getNextFunction( aFormula, sal_False, nNextFStart, &nNextFEnd, &pFuncDesc );
1189 
1190     bFound = m_aFormulaHelper.GetNextFunc( aFormula, sal_False, nNextFStart, &nNextFEnd);
1191     if ( bFound )
1192     {
1193         xub_StrLen PrivStart, PrivEnd;
1194         SetData(nFStart,nNextFStart,nNextFEnd,PrivStart, PrivEnd);
1195         m_pHelper->showReference(aFormula.Copy(PrivStart, PrivEnd-PrivStart));
1196     }
1197     else
1198     {
1199         ClearAllParas();
1200     }
1201 }
1202 
EditNextFunc(sal_Bool bForward,xub_StrLen nFStart)1203 void FormulaDlg_Impl::EditNextFunc( sal_Bool bForward, xub_StrLen nFStart )
1204 {
1205     FormEditData* pData = m_pHelper->getFormEditData();
1206     if (!pData)
1207         return;
1208 
1209     String aFormula = m_pHelper->getCurrentFormula();
1210 
1211     if(nFStart==NOT_FOUND)
1212     {
1213         nFStart = pData->GetFStart();
1214     }
1215     else
1216     {
1217         pData->SetFStart(nFStart);
1218     }
1219 
1220     xub_StrLen nNextFStart  = 0;
1221     xub_StrLen nNextFEnd    = 0;
1222 
1223     sal_Bool bFound;
1224     if ( bForward )
1225     {
1226         nNextFStart = m_aFormulaHelper.GetArgStart( aFormula, nFStart, 0 );
1227         //@bFound = m_pHelper->getNextFunction( aFormula, sal_False, nNextFStart, &nNextFEnd, &pFuncDesc );
1228         bFound = m_aFormulaHelper.GetNextFunc( aFormula, sal_False, nNextFStart, &nNextFEnd);
1229     }
1230     else
1231     {
1232         nNextFStart = nFStart;
1233         //@bFound = m_pHelper->getNextFunction( aFormula, sal_True, nNextFStart, &nNextFEnd, &pFuncDesc );
1234         bFound = m_aFormulaHelper.GetNextFunc( aFormula, sal_True, nNextFStart, &nNextFEnd);
1235     }
1236 
1237     if ( bFound )
1238     {
1239         xub_StrLen PrivStart, PrivEnd;
1240         SetData(nFStart,nNextFStart,nNextFEnd,PrivStart, PrivEnd);
1241     }
1242 }
1243 
EditFuncParas(xub_StrLen nEditPos)1244 void FormulaDlg_Impl::EditFuncParas(xub_StrLen nEditPos)
1245 {
1246     if(pFuncDesc!=NULL)
1247     {
1248         FormEditData* pData = m_pHelper->getFormEditData();
1249         if (!pData) return;
1250 
1251         String aFormula = m_pHelper->getCurrentFormula();
1252         aFormula +=')';
1253         xub_StrLen nFStart = pData->GetFStart();
1254 
1255         DeleteArgs();
1256 
1257         nArgs = pFuncDesc->getSuppressedArgumentCount();
1258 
1259         sal_Int32 nArgPos=m_aFormulaHelper.GetArgStart( aFormula, nFStart, 0 );
1260         m_aFormulaHelper.GetArgStrings(m_aArguments,aFormula, nFStart, nArgs );
1261 //      m_aArguments = ScFormulaUtil::GetArgStrings( aFormula, nFStart, nArgs );
1262 
1263         sal_uInt16 nActiv=pParaWin->GetSliderPos();
1264         sal_Bool    bFlag=sal_False;
1265         ::std::vector< ::rtl::OUString >::iterator aIter = m_aArguments.begin();
1266         ::std::vector< ::rtl::OUString >::iterator aEnd = m_aArguments.end();
1267         for(sal_uInt16 i=0;aIter != aEnd;i++,++aIter)
1268         {
1269             sal_Int32 nLength=(*aIter).getLength();
1270             pParaWin->SetArgument(i,(*aIter));
1271             if(nArgPos<=nEditPos && nEditPos<nArgPos+nLength)
1272             {
1273                 nActiv=i;
1274                 bFlag=sal_True;
1275             }
1276             nArgPos+=nLength+1;
1277         }
1278 
1279         if(bFlag)
1280         {
1281             pParaWin->SetSliderPos(nActiv);
1282         }
1283 
1284         pParaWin->UpdateParas();
1285         UpdateValues();
1286     }
1287 
1288 }
1289 
SaveArg(sal_uInt16 nEd)1290 void FormulaDlg_Impl::SaveArg( sal_uInt16 nEd )
1291 {
1292     if (nEd<nArgs)
1293     {
1294         sal_uInt16 i;
1295         for(i=0;i<=nEd;i++)
1296         {
1297             if ( m_aArguments[i].getLength() == 0 )
1298                 m_aArguments[i] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" "));
1299         }
1300         if(pParaWin->GetArgument(nEd).Len()!=0)
1301             m_aArguments[nEd] = pParaWin->GetArgument(nEd);
1302 
1303         sal_uInt16 nClearPos=nEd+1;
1304         for(i=nEd+1;i<nArgs;i++)
1305         {
1306             if(pParaWin->GetArgument(i).Len()!=0)
1307             {
1308                 nClearPos=i+1;
1309             }
1310         }
1311 
1312         for(i=nClearPos;i<nArgs;i++)
1313         {
1314             m_aArguments[i] = ::rtl::OUString();
1315         }
1316     }
1317 }
1318 
IMPL_LINK(FormulaDlg_Impl,FxHdl,ParaWin *,pPtr)1319 IMPL_LINK( FormulaDlg_Impl, FxHdl, ParaWin*, pPtr )
1320 {
1321     if(pPtr==pParaWin)
1322     {
1323         aBtnForward.Enable(sal_True); //@ Damit eine neue Fkt eingegeben werden kann.
1324         aTabCtrl.SetCurPageId(TP_FUNCTION);
1325 
1326         String aUndoStr = m_pHelper->getCurrentFormula();       // bevor unten ein ";" eingefuegt wird
1327         FormEditData* pData = m_pHelper->getFormEditData();
1328         if (!pData) return 0;
1329 
1330         sal_uInt16 nArgNo = pParaWin->GetActiveLine();
1331         nEdFocus=nArgNo;
1332 
1333         SaveArg(nArgNo);
1334         UpdateSelection();
1335 
1336         xub_StrLen nFormulaStrPos = pData->GetFStart();
1337 
1338         String aFormula = m_pHelper->getCurrentFormula();
1339         xub_StrLen n1 = m_aFormulaHelper.GetArgStart( aFormula, nFormulaStrPos, nEdFocus+pData->GetOffset() );
1340 
1341         pData->SetEdFocus( nEdFocus );
1342         pData->SaveValues();
1343         pData->SetMode( (sal_uInt16) FORMULA_FORMDLG_FORMULA );
1344         pData->SetFStart( n1 );
1345         pData->SetUndoStr( aUndoStr );
1346         ClearAllParas();
1347 
1348         FillDialog(sal_False);
1349         pFuncPage->SetFocus(); //Da Parawin nicht mehr sichtbar
1350     }
1351     return 0;
1352 }
1353 
IMPL_LINK(FormulaDlg_Impl,ModifyHdl,ParaWin *,pPtr)1354 IMPL_LINK( FormulaDlg_Impl, ModifyHdl, ParaWin*, pPtr )
1355 {
1356     if(pPtr==pParaWin)
1357     {
1358         SaveArg(pParaWin->GetActiveLine());
1359         UpdateValues();
1360 
1361         UpdateSelection();
1362         CalcStruct(pMEdit->GetText());
1363     }
1364     return 0;
1365 }
1366 
IMPL_LINK(FormulaDlg_Impl,FormulaHdl,MultiLineEdit *,EMPTYARG)1367 IMPL_LINK( FormulaDlg_Impl, FormulaHdl, MultiLineEdit*, EMPTYARG )
1368 {
1369 
1370     FormEditData* pData = m_pHelper->getFormEditData();
1371     if (!pData) return 0;
1372 
1373     bEditFlag=sal_True;
1374     String      aInputFormula=m_pHelper->getCurrentFormula();
1375     String      aString=pMEdit->GetText();
1376 
1377     Selection   aSel =pMEdit->GetSelection();
1378     xub_StrLen nTest=0;
1379 
1380     if(aString.Len()==0) //falls alles geloescht wurde
1381     {
1382         aString +='=';
1383         pMEdit->SetText(aString);
1384         aSel .Min()=1;
1385         aSel .Max()=1;
1386         pMEdit->SetSelection(aSel);
1387     }
1388     else if(aString.GetChar(nTest)!='=') //falls ersetzt wurde;
1389     {
1390         aString.Insert( (sal_Unicode)'=', 0 );
1391         pMEdit->SetText(aString);
1392         aSel .Min()+=1;
1393         aSel .Max()+=1;
1394         pMEdit->SetSelection(aSel);
1395     }
1396 
1397 
1398     m_pHelper->setSelection(0, aInputFormula.Len());
1399     m_pHelper->setCurrentFormula(aString);
1400     m_pHelper->setSelection((xub_StrLen)aSel.Min(),(xub_StrLen)aSel.Max());
1401 
1402     xub_StrLen nPos=(xub_StrLen)aSel.Min()-1;
1403 
1404     String aStrResult;
1405 
1406     if ( CalcValue(m_pHelper->getCurrentFormula(), aStrResult ) )
1407         aWndFormResult.SetValue( aStrResult );
1408     else
1409     {
1410         aStrResult.Erase();
1411         aWndFormResult.SetValue( aStrResult );
1412     }
1413     CalcStruct(aString);
1414 
1415     nPos=GetFunctionPos(nPos);
1416 
1417     if(nPos<aSel.Min()-1)
1418     {
1419         xub_StrLen nPos1=aString.Search('(',nPos);
1420         EditNextFunc( sal_False, nPos1);
1421     }
1422     else
1423     {
1424         ClearAllParas();
1425     }
1426 
1427     m_pHelper->setSelection((xub_StrLen)aSel.Min(),(xub_StrLen)aSel.Max());
1428     bEditFlag=sal_False;
1429     return 0;
1430 }
1431 
IMPL_LINK(FormulaDlg_Impl,FormulaCursorHdl,EditBox *,EMPTYARG)1432 IMPL_LINK( FormulaDlg_Impl, FormulaCursorHdl, EditBox*, EMPTYARG )
1433 {
1434     FormEditData* pData = m_pHelper->getFormEditData();
1435     if (!pData) return 0;
1436     xub_StrLen nFStart = pData->GetFStart();
1437 
1438     bEditFlag=sal_True;
1439 
1440     String      aInputFormula=m_pHelper->getCurrentFormula();
1441     String      aString=pMEdit->GetText();
1442 
1443     Selection   aSel =pMEdit->GetSelection();
1444     m_pHelper->setSelection((xub_StrLen)aSel.Min(),(xub_StrLen)aSel.Max());
1445 
1446     if(aSel.Min()==0)
1447     {
1448         aSel.Min()=1;
1449         pMEdit->SetSelection(aSel);
1450     }
1451 
1452     if(aSel.Min()!=aString.Len())
1453     {
1454         xub_StrLen nPos=(xub_StrLen)aSel.Min();
1455 
1456         nFStart=GetFunctionPos(nPos - 1);
1457 
1458         if(nFStart<nPos)
1459         {
1460             xub_StrLen nPos1=m_aFormulaHelper.GetFunctionEnd(aString,nFStart);
1461 
1462             if(nPos1>nPos || nPos1==STRING_NOTFOUND)
1463             {
1464                 EditThisFunc(nFStart);
1465             }
1466             else
1467             {
1468                 xub_StrLen n=nPos;
1469                 short nCount=1;
1470                 while(n>0)
1471                 {
1472                    if(aString.GetChar(n)==')')
1473                        nCount++;
1474                    else if(aString.GetChar(n)=='(')
1475                        nCount--;
1476                    if(nCount==0) break;
1477                    n--;
1478                 }
1479                 if(nCount==0)
1480                 {
1481                     nFStart=m_aFormulaHelper.GetFunctionStart(aString,n,sal_True);
1482                     EditThisFunc(nFStart);
1483                 }
1484                 else
1485                 {
1486                     ClearAllParas();
1487                 }
1488             }
1489         }
1490         else
1491         {
1492             ClearAllParas();
1493         }
1494     }
1495     m_pHelper->setSelection((xub_StrLen)aSel.Min(),(xub_StrLen)aSel.Max());
1496 
1497     bEditFlag=sal_False;
1498     return 0;
1499 }
1500 
UpdateSelection()1501 void FormulaDlg_Impl::UpdateSelection()
1502 {
1503     m_pHelper->setSelection((xub_StrLen)aFuncSel.Min(),(xub_StrLen)aFuncSel.Max());
1504     m_pHelper->setCurrentFormula( pFuncDesc->getFormula( m_aArguments ) );
1505     pMEdit->SetText(m_pHelper->getCurrentFormula());
1506     xub_StrLen PrivStart, PrivEnd;
1507     m_pHelper->getSelection( PrivStart, PrivEnd);
1508     aFuncSel.Min()=PrivStart;
1509     aFuncSel.Max()=PrivEnd;
1510 
1511     nArgs = pFuncDesc->getSuppressedArgumentCount();
1512 
1513     String aFormula=pMEdit->GetText();
1514     sal_Int32 nArgPos=m_aFormulaHelper.GetArgStart( aFormula,PrivStart,0);
1515 
1516     sal_uInt16 nPos=pParaWin->GetActiveLine();
1517 
1518     for(sal_uInt16 i=0;i<nPos;i++)
1519     {
1520         nArgPos += (m_aArguments[i].getLength() + 1);
1521     }
1522     sal_Int32 nLength= m_aArguments[nPos].getLength();
1523 
1524     Selection aSel(nArgPos,nArgPos+nLength);
1525     m_pHelper->setSelection((sal_uInt16)nArgPos,(sal_uInt16)(nArgPos+nLength));
1526     pMEdit->SetSelection(aSel);
1527     aMEFormula.UpdateOldSel();
1528 }
RefInputStartBefore(RefEdit * pEdit,RefButton * pButton)1529 ::std::pair<RefButton*,RefEdit*> FormulaDlg_Impl::RefInputStartBefore( RefEdit* pEdit, RefButton* pButton )
1530 {
1531     aEdRef.Show();
1532     pTheRefEdit = pEdit;
1533     pTheRefButton = pButton;
1534 
1535     if( pTheRefEdit )
1536     {
1537         aEdRef.SetRefString( pTheRefEdit->GetText() );
1538         aEdRef.SetSelection( pTheRefEdit->GetSelection() );
1539         aEdRef.SetHelpId( pTheRefEdit->GetHelpId() );
1540         aEdRef.SetUniqueId( pTheRefEdit->GetUniqueId() );
1541     }
1542 
1543     aRefBtn.Show( pButton != NULL );
1544 
1545     //m_pHelper->RefInputStart( &aEdRef, pButton ? &aRefBtn : NULL );
1546     ::std::pair<RefButton*,RefEdit*> aPair;
1547     aPair.first = pButton ? &aRefBtn : NULL;
1548     aPair.second = &aEdRef;
1549     return aPair;
1550 }
RefInputStartAfter(RefEdit *,RefButton *)1551 void FormulaDlg_Impl::RefInputStartAfter( RefEdit* /*pEdit*/, RefButton* /*pButton*/ )
1552 {
1553     aRefBtn.SetEndImage();
1554 
1555     if( pTheRefEdit )
1556     {
1557         String aStr = aTitle2;
1558         aStr += ' ';
1559         aStr += aFtEditName.GetText();
1560         aStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "( " ) );
1561         if( pParaWin->GetActiveLine() > 0 )
1562             aStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "...; " ) );
1563         aStr += pParaWin->GetActiveArgName();
1564         if( pParaWin->GetActiveLine() + 1 < nArgs )
1565             aStr.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "; ..." ));
1566         aStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " )" ) );
1567 
1568         m_pParent->SetText( MnemonicGenerator::EraseAllMnemonicChars( aStr ) );
1569     }
1570 }
RefInputDoneAfter(sal_Bool bForced)1571 void FormulaDlg_Impl::RefInputDoneAfter( sal_Bool bForced )
1572 {
1573     aRefBtn.SetStartImage();
1574     if( bForced || !aRefBtn.IsVisible() )
1575     {
1576         aEdRef.Hide();
1577         aRefBtn.Hide();
1578         if( pTheRefEdit )
1579         {
1580             pTheRefEdit->SetRefString( aEdRef.GetText() );
1581             pTheRefEdit->GrabFocus();
1582 
1583             if( pTheRefButton )
1584                 pTheRefButton->SetStartImage();
1585 
1586             sal_uInt16 nPrivActiv = pParaWin->GetActiveLine();
1587             pParaWin->SetArgument( nPrivActiv, aEdRef.GetText() );
1588             ModifyHdl( pParaWin );
1589             pTheRefEdit = NULL;
1590         }
1591         m_pParent->SetText( aTitle1 );
1592     }
1593 }
GetCurrRefEdit()1594 RefEdit* FormulaDlg_Impl::GetCurrRefEdit()
1595 {
1596     return aEdRef.IsVisible() ? &aEdRef : pParaWin->GetActiveEdit();
1597 }
Update()1598 void FormulaDlg_Impl::Update()
1599 {
1600     FormEditData* pData = m_pHelper->getFormEditData();
1601     const String sExpression = pMEdit->GetText();
1602     aOldFormula = String();
1603     UpdateTokenArray(sExpression);
1604     FormulaCursorHdl(&aMEFormula);
1605     CalcStruct(sExpression);
1606     if(pData->GetMode() == FORMULA_FORMDLG_FORMULA)
1607         aTabCtrl.SetCurPageId(TP_FUNCTION);
1608     else
1609         aTabCtrl.SetCurPageId(TP_STRUCT);
1610     aBtnMatrix.Check(pData->GetMatrixFlag());
1611     /*aTimer.SetTimeout(200);
1612     aTimer.SetTimeoutHdl(LINK( this, FormulaDlg_Impl, UpdateFocusHdl));
1613     aTimer.Start();*/
1614 }
Update(const String & _sExp)1615 void FormulaDlg_Impl::Update(const String& _sExp)
1616 {
1617     CalcStruct(_sExp);
1618     FillDialog();
1619     //aBtnForward.Enable(sal_True); //@New
1620     FuncSelHdl(NULL);
1621 }
SetMeText(const String & _sText)1622 void FormulaDlg_Impl::SetMeText(const String& _sText)
1623 {
1624     FormEditData* pData = m_pHelper->getFormEditData();
1625     pMEdit->SetText(_sText);
1626     pMEdit->SetSelection( pData->GetSelection());
1627     aMEFormula.UpdateOldSel();
1628 }
SetMeText(const String & _sText,xub_StrLen PrivStart,xub_StrLen PrivEnd,sal_Bool bMatrix,sal_Bool _bSelect,sal_Bool _bUpdate)1629 FormulaDlgMode FormulaDlg_Impl::SetMeText(const String& _sText,xub_StrLen PrivStart, xub_StrLen PrivEnd,sal_Bool bMatrix,sal_Bool _bSelect,sal_Bool _bUpdate)
1630 {
1631     FormulaDlgMode eMode = FORMULA_FORMDLG_FORMULA;
1632     if(!bEditFlag)
1633         pMEdit->SetText(_sText);
1634 
1635     if ( _bSelect || !bEditFlag )
1636         pMEdit->SetSelection( Selection(PrivStart, PrivEnd));
1637     if ( _bUpdate )
1638     {
1639         aMEFormula.UpdateOldSel();
1640         pMEdit->Invalidate();
1641         m_pHelper->showReference(pMEdit->GetSelected());
1642         eMode = FORMULA_FORMDLG_EDIT;
1643 
1644         aBtnMatrix.Check( bMatrix );
1645     } // if ( _bUpdate )
1646     return eMode;
1647 }
CheckMatrix(String & aFormula)1648 sal_Bool FormulaDlg_Impl::CheckMatrix(String& aFormula)
1649 {
1650     pMEdit->GrabFocus();
1651     xub_StrLen nLen = aFormula.Len();
1652     sal_Bool bMatrix =  nLen > 3                    // Matrix-Formel ?
1653             && aFormula.GetChar(0) == '{'
1654             && aFormula.GetChar(1) == '='
1655             && aFormula.GetChar(nLen-1) == '}';
1656     if ( bMatrix )
1657     {
1658         aFormula.Erase( 0, 1 );
1659         aFormula.Erase( aFormula.Len()-1, 1);
1660         aBtnMatrix.Check( bMatrix );
1661         aBtnMatrix.Disable();
1662     } // if ( bMatrix )
1663 
1664     aTabCtrl.SetCurPageId(TP_STRUCT);
1665     return bMatrix;
1666 }
IMPL_LINK(FormulaDlg_Impl,StructSelHdl,StructPage *,pStruP)1667 IMPL_LINK( FormulaDlg_Impl, StructSelHdl, StructPage*, pStruP )
1668 {
1669     bStructUpdate=sal_False;
1670     if(pStructPage->IsVisible())    aBtnForward.Enable(sal_False); //@New
1671 
1672     if(pStructPage==pStruP)
1673     {
1674         /// TODO
1675         //ScToken* pSelToken = pStructPage->GetSelectedToken();
1676   //      ScToken* pOrigToken = ((pSelToken && pSelToken->GetType() == svFAP) ?
1677   //              pSelToken->GetFAPOrigToken() : pSelToken);
1678         //xub_StrLen nTokPos=1;
1679 
1680         //if(pScTokA!=NULL)
1681         //{
1682         //  ScToken* pToken = pScTokA->First();
1683 
1684         //  while(pToken!=NULL)
1685         //  {
1686         //      String aString;
1687   //              if ( pToken == pOrigToken )
1688   //                  break;
1689         //      pComp->CreateStringFromToken( aString,pToken);
1690   //              nTokPos = sal::static_int_cast<xub_StrLen>( nTokPos + aString.Len() );
1691         //      pToken=pScTokA->Next();
1692         //  }
1693         //  EditThisFunc(nTokPos);
1694         //}
1695 
1696         //if( pOrigToken )
1697         //{
1698         //  String aStr;
1699         //  pComp->CreateStringFromToken( aStr, pOrigToken );
1700         //  String aEntryTxt=pStructPage->GetSelectedEntryText();
1701 
1702         //  if(aEntryTxt!=aStr)
1703         //      ShowReference(aEntryTxt);
1704         //}
1705 
1706     }
1707     bStructUpdate=sal_True;
1708     return 0;
1709 }
IMPL_LINK(FormulaDlg_Impl,MatrixHdl,CheckBox *,EMPTYARG)1710 IMPL_LINK( FormulaDlg_Impl, MatrixHdl, CheckBox *, EMPTYARG )
1711 {
1712     bUserMatrixFlag=sal_True;
1713     return 0;
1714 }
1715 
IMPL_LINK(FormulaDlg_Impl,FuncSelHdl,FuncPage *,EMPTYARG)1716 IMPL_LINK( FormulaDlg_Impl, FuncSelHdl, FuncPage*, EMPTYARG )
1717 {
1718     sal_uInt16 nCat = pFuncPage->GetCategory();
1719     if ( nCat == LISTBOX_ENTRY_NOTFOUND ) nCat = 0;
1720     sal_uInt16 nFunc = pFuncPage->GetFunction();
1721     if ( nFunc == LISTBOX_ENTRY_NOTFOUND ) nFunc = 0;
1722 
1723     if (   (pFuncPage->GetFunctionEntryCount() > 0)
1724         && (pFuncPage->GetFunction() != LISTBOX_ENTRY_NOTFOUND) )
1725     {
1726         const IFunctionDescription* pDesc =pFuncPage->GetFuncDesc( pFuncPage->GetFunction() );
1727 
1728         if(pDesc!=pFuncDesc) aBtnForward.Enable(sal_True); //new
1729 
1730         if (pDesc)
1731         {
1732             pDesc->initArgumentInfo();      // full argument info is needed
1733 
1734             String aSig = pDesc->getSignature();
1735             aFtHeadLine.SetText( pDesc->getFunctionName() );
1736             aFtFuncName.SetText( aSig );
1737             aFtFuncDesc.SetText( pDesc->getDescription() );
1738         }
1739     }
1740     else
1741     {
1742         aFtHeadLine.SetText( String() );
1743         aFtFuncName.SetText( String() );
1744         aFtFuncDesc.SetText( String() );
1745     }
1746     return 0;
1747 }
1748 
UpdateParaWin(const Selection & _rSelection,const String & _sRefStr)1749 void FormulaDlg_Impl::UpdateParaWin(const Selection& _rSelection,const String& _sRefStr)
1750 {
1751     Selection theSel = _rSelection;
1752     aEdRef.ReplaceSelected( _sRefStr );
1753     theSel.Max() = theSel.Min() + _sRefStr.Len();
1754     aEdRef.SetSelection( theSel );
1755 
1756     //-------------------------------------
1757     // Manuelles Update der Ergebnisfelder:
1758     //-------------------------------------
1759     sal_uInt16 nPrivActiv = pParaWin->GetActiveLine();
1760     pParaWin->SetArgument(nPrivActiv,aEdRef.GetText());
1761     pParaWin->UpdateParas();
1762 
1763     Edit* pEd = GetCurrRefEdit();
1764     if( pEd != NULL )
1765         pEd->SetSelection( theSel );
1766 
1767     pParaWin->SetRefMode(sal_False);
1768 }
UpdateParaWin(Selection & _rSelection)1769 sal_Bool FormulaDlg_Impl::UpdateParaWin(Selection& _rSelection)
1770 {
1771     pParaWin->SetRefMode(sal_True);
1772 
1773     String      aStrEd;
1774     Edit* pEd = GetCurrRefEdit();
1775     if(pEd!=NULL && pTheRefEdit==NULL)
1776     {
1777         _rSelection=pEd->GetSelection();
1778         _rSelection.Justify();
1779         aStrEd=pEd->GetText();
1780         aEdRef.SetRefString(aStrEd);
1781         aEdRef.SetSelection( _rSelection );
1782     }
1783     else
1784     {
1785         _rSelection=aEdRef.GetSelection();
1786         _rSelection.Justify();
1787         aStrEd= aEdRef.GetText();
1788     }
1789     return pTheRefEdit == NULL;
1790 }
FindFocusWin(Window * pWin)1791 rtl::OString FormulaDlg_Impl::FindFocusWin(Window *pWin)
1792 {
1793     rtl::OString aUniqueId;
1794     if(pWin->HasFocus())
1795     {
1796         aUniqueId=pWin->GetUniqueId();
1797         if(aUniqueId.getLength()==0)
1798         {
1799             Window* pParent=pWin->GetParent();
1800             while(pParent!=NULL)
1801             {
1802                 aUniqueId=pParent->GetUniqueId();
1803 
1804                 if(aUniqueId.getLength()!=0) break;
1805 
1806                 pParent=pParent->GetParent();
1807             }
1808         }
1809     }
1810     else
1811     {
1812         sal_uInt16 nCount=pWin->GetChildCount();
1813 
1814         for(sal_uInt16 i=0;i<nCount;i++)
1815         {
1816             Window* pChild=pWin->GetChild(i);
1817             aUniqueId=FindFocusWin(pChild);
1818             if(aUniqueId.getLength()>0) break;
1819         }
1820     }
1821     return aUniqueId;
1822 }
1823 
SetEdSelection()1824 void FormulaDlg_Impl::SetEdSelection()
1825 {
1826     Edit* pEd = GetCurrRefEdit()/*aScParaWin.GetActiveEdit()*/;
1827     if( pEd )
1828     {
1829         Selection theSel = aEdRef.GetSelection();
1830         //  Edit may have the focus -> call ModifyHdl in addition
1831         //  to what's happening in GetFocus
1832         pEd->GetModifyHdl().Call(pEd);
1833         pEd->GrabFocus();
1834         pEd->SetSelection(theSel);
1835     } // if( pEd )
1836 }
1837 // -----------------------------------------------------------------------------
GetFormulaHelper() const1838 const FormulaHelper& FormulaDlg_Impl::GetFormulaHelper()  const
1839 {
1840     return m_aFormulaHelper;
1841 }
1842 //============================================================================
FormulaModalDialog(Window * pParent,bool _bSupportFunctionResult,bool _bSupportResult,bool _bSupportMatrix,IFormulaEditorHelper * _pHelper,IFunctionManager * _pFunctionMgr,IControlReferenceHandler * _pDlg)1843 FormulaModalDialog::FormulaModalDialog( Window* pParent
1844                                             , bool _bSupportFunctionResult
1845                                             , bool _bSupportResult
1846                                             , bool _bSupportMatrix
1847                                             , IFormulaEditorHelper* _pHelper
1848                                             , IFunctionManager* _pFunctionMgr
1849                                             , IControlReferenceHandler* _pDlg ) :
1850         ModalDialog( pParent, ModuleRes(RID_FORMULADLG_FORMULA_MODAL) ),
1851         m_pImpl( new FormulaDlg_Impl(this,_bSupportFunctionResult
1852                                             , _bSupportResult
1853                                             , _bSupportMatrix
1854                                             ,_pHelper,_pFunctionMgr,_pDlg))
1855 {
1856     FreeResource();
1857     SetText(m_pImpl->aTitle1);
1858 }
~FormulaModalDialog()1859 FormulaModalDialog::~FormulaModalDialog()
1860 {
1861 }
1862 // -----------------------------------------------------------------------------
Update(const String & _sExp)1863 void FormulaModalDialog::Update(const String& _sExp)
1864 {
1865     m_pImpl->Update(_sExp);
1866 }
1867 
1868 // -----------------------------------------------------------------------------
SetMeText(const String & _sText)1869 void FormulaModalDialog::SetMeText(const String& _sText)
1870 {
1871     m_pImpl->SetMeText(_sText);
1872 }
1873 
1874 // -----------------------------------------------------------------------------
SetMeText(const String & _sText,xub_StrLen PrivStart,xub_StrLen PrivEnd,sal_Bool bMatrix,sal_Bool _bSelect,sal_Bool _bUpdate)1875 FormulaDlgMode FormulaModalDialog::SetMeText(const String& _sText,xub_StrLen PrivStart, xub_StrLen PrivEnd,sal_Bool bMatrix,sal_Bool _bSelect,sal_Bool _bUpdate)
1876 {
1877     return m_pImpl->SetMeText(_sText,PrivStart, PrivEnd,bMatrix,_bSelect,_bUpdate);
1878 }
1879 // -----------------------------------------------------------------------------
CheckMatrix()1880 void FormulaModalDialog::CheckMatrix()
1881 {
1882     m_pImpl->aBtnMatrix.Check();
1883 }
1884 // -----------------------------------------------------------------------------
CheckMatrix(String & aFormula)1885 sal_Bool FormulaModalDialog::CheckMatrix(String& aFormula)
1886 {
1887     return m_pImpl->CheckMatrix(aFormula);
1888 }
1889 // -----------------------------------------------------------------------------
GetMeText() const1890 String FormulaModalDialog::GetMeText() const
1891 {
1892     return m_pImpl->pMEdit->GetText();
1893 }
1894 // -----------------------------------------------------------------------------
Update()1895 void FormulaModalDialog::Update()
1896 {
1897     m_pImpl->Update();
1898 }
1899 // -----------------------------------------------------------------------------
GetFormulaHelper() const1900 const FormulaHelper& FormulaModalDialog::GetFormulaHelper() const
1901 {
1902     return m_pImpl->GetFormulaHelper();
1903 }
1904 // -----------------------------------------------------------------------------
isUserMatrix() const1905 sal_Bool FormulaModalDialog::isUserMatrix() const
1906 {
1907     return m_pImpl->bUserMatrixFlag;
1908 }
DoEnter(sal_Bool _bOk)1909 void FormulaModalDialog::DoEnter(sal_Bool _bOk)
1910 {
1911     m_pImpl->DoEnter(_bOk);
1912 }
RefInputStartBefore(RefEdit * pEdit,RefButton * pButton)1913 ::std::pair<RefButton*,RefEdit*> FormulaModalDialog::RefInputStartBefore( RefEdit* pEdit, RefButton* pButton )
1914 {
1915     return m_pImpl->RefInputStartBefore( pEdit, pButton );
1916 }
RefInputStartAfter(RefEdit * pEdit,RefButton * pButton)1917 void FormulaModalDialog::RefInputStartAfter( RefEdit* pEdit, RefButton* pButton )
1918 {
1919     m_pImpl->RefInputStartAfter( pEdit, pButton );
1920 }
RefInputDoneAfter(sal_Bool bForced)1921 void FormulaModalDialog::RefInputDoneAfter( sal_Bool bForced )
1922 {
1923     m_pImpl->RefInputDoneAfter( bForced );
1924 }
1925 
FindFocusWin(Window * pWin)1926 rtl::OString FormulaModalDialog::FindFocusWin(Window *pWin)
1927 {
1928     return m_pImpl->FindFocusWin( pWin );
1929 }
1930 
SetFocusWin(Window * pWin,const rtl::OString & nUniqueId)1931 void FormulaModalDialog::SetFocusWin(Window *pWin,const rtl::OString& nUniqueId)
1932 {
1933     if(pWin->GetUniqueId()==nUniqueId)
1934     {
1935         pWin->GrabFocus();
1936     }
1937     else
1938     {
1939         sal_uInt16 nCount=pWin->GetChildCount();
1940 
1941         for(sal_uInt16 i=0;i<nCount;i++)
1942         {
1943             Window* pChild=pWin->GetChild(i);
1944             SetFocusWin(pChild,nUniqueId);
1945         }
1946     }
1947 }
1948 
1949 
PreNotify(NotifyEvent & rNEvt)1950 long FormulaModalDialog::PreNotify( NotifyEvent& rNEvt )
1951 {
1952     m_pImpl->PreNotify( rNEvt );
1953 
1954     return ModalDialog::PreNotify(rNEvt);
1955 }
1956 
HighlightFunctionParas(const String & aFormula)1957 void FormulaModalDialog::HighlightFunctionParas(const String& aFormula)
1958 {
1959     m_pImpl->m_pHelper->showReference(aFormula);
1960 }
1961 
disableOk()1962 void FormulaModalDialog::disableOk()
1963 {
1964     m_pImpl->aBtnEnd.Disable();
1965 }
1966 // -----------------------------------------------------------------------------
getCurrentFunctionDescription() const1967 const IFunctionDescription* FormulaModalDialog::getCurrentFunctionDescription() const
1968 {
1969     OSL_VERIFY(!m_pImpl->pFuncDesc || m_pImpl->pFuncDesc->getSuppressedArgumentCount() == m_pImpl->nArgs);
1970     return m_pImpl->pFuncDesc;
1971 }
1972 // -----------------------------------------------------------------------------
UpdateParaWin(const Selection & _rSelection,const String & _sRefStr)1973 void FormulaModalDialog::UpdateParaWin(const Selection& _rSelection,const String& _sRefStr)
1974 {
1975     m_pImpl->UpdateParaWin(_rSelection,_sRefStr);
1976 }
UpdateParaWin(Selection & _rSelection)1977 sal_Bool FormulaModalDialog::UpdateParaWin(Selection& _rSelection)
1978 {
1979     return m_pImpl->UpdateParaWin(_rSelection);
1980 }
1981 // -----------------------------------------------------------------------------
GetActiveEdit()1982 RefEdit*    FormulaModalDialog::GetActiveEdit()
1983 {
1984     return m_pImpl->pParaWin->GetActiveEdit();
1985 }
1986 // -----------------------------------------------------------------------------
SetEdSelection()1987 void FormulaModalDialog::SetEdSelection()
1988 {
1989     m_pImpl->SetEdSelection();
1990 }
1991 
1992 //  --------------------------------------------------------------------------
1993 //      Initialisierung / gemeinsaME Funktionen  fuer Dialog
1994 //  --------------------------------------------------------------------------
FormulaDlg(SfxBindings * pB,SfxChildWindow * pCW,Window * pParent,bool _bSupportFunctionResult,bool _bSupportResult,bool _bSupportMatrix,IFormulaEditorHelper * _pHelper,IFunctionManager * _pFunctionMgr,IControlReferenceHandler * _pDlg)1995 FormulaDlg::FormulaDlg( SfxBindings* pB, SfxChildWindow* pCW,
1996                              Window* pParent
1997                             , bool _bSupportFunctionResult
1998                             , bool _bSupportResult
1999                             , bool _bSupportMatrix
2000                             , IFormulaEditorHelper* _pHelper,IFunctionManager* _pFunctionMgr,IControlReferenceHandler* _pDlg ) :
2001         SfxModelessDialog( pB, pCW, pParent, ModuleRes(RID_FORMULADLG_FORMULA) ),
2002         m_pImpl( new FormulaDlg_Impl(this, _bSupportFunctionResult
2003                                             , _bSupportResult
2004                                             , _bSupportMatrix
2005                                             ,_pHelper,_pFunctionMgr,_pDlg))
2006 {
2007     FreeResource();
2008     if(!GetHelpId().getLength())                //Hack, da im SfxModelessDialog die HelpId
2009         SetHelpId(GetUniqueId());   //fuer einen ModelessDialog entfernt und
2010                                     //in eine UniqueId gewandelt wird, machen
2011                                     //wir das an dieser Stelle rueckgaengig.
2012     SetText(m_pImpl->aTitle1);
2013 }
2014 
~FormulaDlg()2015 FormulaDlg::~FormulaDlg()
2016 {
2017 }
2018 // -----------------------------------------------------------------------------
Update(const String & _sExp)2019 void FormulaDlg::Update(const String& _sExp)
2020 {
2021     m_pImpl->Update(_sExp);
2022 }
2023 
2024 // -----------------------------------------------------------------------------
SetMeText(const String & _sText)2025 void FormulaDlg::SetMeText(const String& _sText)
2026 {
2027     m_pImpl->SetMeText(_sText);
2028 }
2029 
2030 // -----------------------------------------------------------------------------
SetMeText(const String & _sText,xub_StrLen PrivStart,xub_StrLen PrivEnd,sal_Bool bMatrix,sal_Bool _bSelect,sal_Bool _bUpdate)2031 FormulaDlgMode FormulaDlg::SetMeText(const String& _sText,xub_StrLen PrivStart, xub_StrLen PrivEnd,sal_Bool bMatrix,sal_Bool _bSelect,sal_Bool _bUpdate)
2032 {
2033     return m_pImpl->SetMeText(_sText,PrivStart, PrivEnd,bMatrix,_bSelect,_bUpdate);
2034 }
2035 // -----------------------------------------------------------------------------
CheckMatrix()2036 void FormulaDlg::CheckMatrix()
2037 {
2038     m_pImpl->aBtnMatrix.Check();
2039 }
2040 // -----------------------------------------------------------------------------
CheckMatrix(String & aFormula)2041 sal_Bool FormulaDlg::CheckMatrix(String& aFormula)
2042 {
2043     return m_pImpl->CheckMatrix(aFormula);
2044 }
2045 // -----------------------------------------------------------------------------
GetMeText() const2046 String FormulaDlg::GetMeText() const
2047 {
2048     return m_pImpl->pMEdit->GetText();
2049 }
2050 // -----------------------------------------------------------------------------
Update()2051 void FormulaDlg::Update()
2052 {
2053     m_pImpl->Update();
2054     m_pImpl->aTimer.SetTimeout(200);
2055     m_pImpl->aTimer.SetTimeoutHdl(LINK( this, FormulaDlg, UpdateFocusHdl));
2056     m_pImpl->aTimer.Start();
2057 }
2058 
2059 // -----------------------------------------------------------------------------
isUserMatrix() const2060 sal_Bool FormulaDlg::isUserMatrix() const
2061 {
2062     return m_pImpl->bUserMatrixFlag;
2063 }
DoEnter(sal_Bool _bOk)2064 void FormulaDlg::DoEnter(sal_Bool _bOk)
2065 {
2066     m_pImpl->DoEnter(_bOk);
2067 }
RefInputStartBefore(RefEdit * pEdit,RefButton * pButton)2068 ::std::pair<RefButton*,RefEdit*> FormulaDlg::RefInputStartBefore( RefEdit* pEdit, RefButton* pButton )
2069 {
2070     return m_pImpl->RefInputStartBefore( pEdit, pButton );
2071 }
RefInputStartAfter(RefEdit * pEdit,RefButton * pButton)2072 void FormulaDlg::RefInputStartAfter( RefEdit* pEdit, RefButton* pButton )
2073 {
2074     m_pImpl->RefInputStartAfter( pEdit, pButton );
2075 }
RefInputDoneAfter(sal_Bool bForced)2076 void FormulaDlg::RefInputDoneAfter( sal_Bool bForced )
2077 {
2078     m_pImpl->RefInputDoneAfter( bForced );
2079 }
2080 
FindFocusWin(Window * pWin)2081 rtl::OString FormulaDlg::FindFocusWin(Window *pWin)
2082 {
2083     return m_pImpl->FindFocusWin( pWin );
2084 }
2085 
SetFocusWin(Window * pWin,const rtl::OString & nUniqueId)2086 void FormulaDlg::SetFocusWin(Window *pWin,const rtl::OString& nUniqueId)
2087 {
2088     if(pWin->GetUniqueId()==nUniqueId)
2089     {
2090         pWin->GrabFocus();
2091     }
2092     else
2093     {
2094         sal_uInt16 nCount=pWin->GetChildCount();
2095 
2096         for(sal_uInt16 i=0;i<nCount;i++)
2097         {
2098             Window* pChild=pWin->GetChild(i);
2099             SetFocusWin(pChild,nUniqueId);
2100         }
2101     }
2102 }
2103 
2104 
PreNotify(NotifyEvent & rNEvt)2105 long FormulaDlg::PreNotify( NotifyEvent& rNEvt )
2106 {
2107     m_pImpl->PreNotify( rNEvt );
2108     return SfxModelessDialog::PreNotify(rNEvt);
2109 }
2110 
HighlightFunctionParas(const String & aFormula)2111 void FormulaDlg::HighlightFunctionParas(const String& aFormula)
2112 {
2113     m_pImpl->m_pHelper->showReference(aFormula);
2114 }
2115 
disableOk()2116 void FormulaDlg::disableOk()
2117 {
2118     m_pImpl->aBtnEnd.Disable();
2119 }
2120 // -----------------------------------------------------------------------------
getCurrentFunctionDescription() const2121 const IFunctionDescription* FormulaDlg::getCurrentFunctionDescription() const
2122 {
2123     OSL_VERIFY(!m_pImpl->pFuncDesc || m_pImpl->pFuncDesc->getSuppressedArgumentCount() == m_pImpl->nArgs);
2124     return m_pImpl->pFuncDesc;
2125 }
2126 // -----------------------------------------------------------------------------
UpdateParaWin(const Selection & _rSelection,const String & _sRefStr)2127 void FormulaDlg::UpdateParaWin(const Selection& _rSelection,const String& _sRefStr)
2128 {
2129     m_pImpl->UpdateParaWin(_rSelection,_sRefStr);
2130 }
UpdateParaWin(Selection & _rSelection)2131 sal_Bool FormulaDlg::UpdateParaWin(Selection& _rSelection)
2132 {
2133     return m_pImpl->UpdateParaWin(_rSelection);
2134 }
2135 // -----------------------------------------------------------------------------
GetActiveEdit()2136 RefEdit*    FormulaDlg::GetActiveEdit()
2137 {
2138     return m_pImpl->pParaWin->GetActiveEdit();
2139 }
2140 // -----------------------------------------------------------------------------
GetFormulaHelper() const2141 const FormulaHelper& FormulaDlg::GetFormulaHelper() const
2142 {
2143     return m_pImpl->GetFormulaHelper();
2144 }
2145 // -----------------------------------------------------------------------------
SetEdSelection()2146 void FormulaDlg::SetEdSelection()
2147 {
2148     m_pImpl->SetEdSelection();
2149 }
IMPL_LINK(FormulaDlg,UpdateFocusHdl,Timer *,EMPTYARG)2150 IMPL_LINK( FormulaDlg, UpdateFocusHdl, Timer*, EMPTYARG )
2151 {
2152     FormEditData* pData = m_pImpl->m_pHelper->getFormEditData();
2153 
2154     if (pData) // wird nicht ueber Close zerstoert;
2155     {
2156         m_pImpl->m_pHelper->setReferenceInput(pData);
2157         rtl::OString nUniqueId(pData->GetUniqueId());
2158         SetFocusWin(this,nUniqueId);
2159     }
2160     return 0;
2161 }
2162 
2163 // -----------------------------------------------------------------------------
2164 // -----------------------------------------------------------------------------
SaveValues()2165 void FormEditData::SaveValues()
2166 {
2167     FormEditData* pTemp = new FormEditData(*this);
2168 
2169     Reset();
2170     pParent = pTemp;
2171 }
2172 // -----------------------------------------------------------------------------
Reset()2173 void FormEditData::Reset()
2174 {
2175     pParent = NULL;
2176     nMode = 0;
2177     nFStart = 0;
2178     nCatSel = 1;        //! oder 0 (zuletzt benutzte)
2179     nFuncSel = 0;
2180     nOffset = 0;
2181     nEdFocus = 0;
2182     bMatrix =sal_False;
2183     aUniqueId=rtl::OString();
2184     aSelection.Min()=0;
2185     aSelection.Max()=0;
2186     aUndoStr.Erase();
2187 }
2188 // -----------------------------------------------------------------------------
RestoreValues()2189 void FormEditData::RestoreValues()
2190 {
2191     FormEditData* pTemp = pParent;
2192     DBG_ASSERT(pTemp,"RestoreValues ohne Parent");
2193     if (pTemp)
2194     {
2195         *this = *pTemp;
2196         pTemp->pParent = NULL;      // sonst wird der auch geloescht!
2197         delete pTemp;
2198     }
2199 }
2200 // -----------------------------------------------------------------------------
operator =(const FormEditData & r)2201 const FormEditData& FormEditData::operator=( const FormEditData& r )
2202 {
2203     pParent         = r.pParent;
2204     nMode           = r.nMode;
2205     nFStart         = r.nFStart;
2206     nCatSel         = r.nCatSel;
2207     nFuncSel        = r.nFuncSel;
2208     nOffset         = r.nOffset;
2209     nEdFocus        = r.nEdFocus;
2210     aUndoStr        = r.aUndoStr;
2211     bMatrix         = r.bMatrix ;
2212     aUniqueId       = r.aUniqueId;
2213     aSelection      = r.aSelection;
2214     return *this;
2215 }
2216 // -----------------------------------------------------------------------------
FormEditData()2217 FormEditData::FormEditData()
2218 {
2219     Reset();
2220 }
2221 
~FormEditData()2222 FormEditData::~FormEditData()
2223 {
2224     delete pParent;
2225 }
2226 
FormEditData(const FormEditData & r)2227 FormEditData::FormEditData( const FormEditData& r )
2228 {
2229     *this = r;
2230 }
2231 
2232 // -----------------------------------------------------------------------------
2233 } // formula
2234 // -----------------------------------------------------------------------------
2235