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