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