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