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 : #include <vcl/layout.hxx>
31 : #include <vcl/idle.hxx>
32 :
33 : #include <svtools/stdctrl.hxx>
34 : #include <svtools/svmedit.hxx>
35 : #include <svtools/treelistbox.hxx>
36 : #include <svl/stritem.hxx>
37 : #include <svl/zforlist.hxx>
38 : #include <svl/eitem.hxx>
39 :
40 : #include <unotools/charclass.hxx>
41 : #include <tools/diagnose_ex.h>
42 :
43 : #include "formdlgs.hrc"
44 : #include "funcpage.hxx"
45 : #include "formula/formula.hxx"
46 : #include "formula/IFunctionDescription.hxx"
47 : #include "formula/FormulaCompiler.hxx"
48 : #include "formula/token.hxx"
49 : #include "formula/tokenarray.hxx"
50 : #include "formula/formdata.hxx"
51 : #include "formula/formulahelper.hxx"
52 : #include "structpg.hxx"
53 : #include "parawin.hxx"
54 : #include "ModuleHelper.hxx"
55 : #include "ForResId.hrc"
56 : #include <com/sun/star/sheet/FormulaToken.hpp>
57 : #include <com/sun/star/sheet/FormulaLanguage.hpp>
58 : #include <com/sun/star/sheet/FormulaMapGroup.hpp>
59 : #include <com/sun/star/sheet/FormulaMapGroupSpecialOffset.hpp>
60 : #include <com/sun/star/beans/XPropertySet.hpp>
61 : #include <boost/ref.hpp>
62 : #include <boost/shared_ptr.hpp>
63 : #include <comphelper/processfactory.hxx>
64 : #include <comphelper/string.hxx>
65 : #include <map>
66 :
67 : #define TOKEN_OPEN 0
68 : #define TOKEN_CLOSE 1
69 : #define TOKEN_SEP 2
70 : namespace formula
71 : {
72 : using namespace ::com::sun::star;
73 :
74 : class FormulaDlg_Impl
75 : {
76 : public:
77 : ::std::pair<RefButton*,RefEdit*>
78 : RefInputStartBefore( RefEdit* pEdit, RefButton* pButton );
79 : void RefInputStartAfter( RefEdit* pEdit, RefButton* pButton );
80 : void RefInputDoneAfter( bool bForced );
81 : bool CalcValue( const OUString& rStrExp, OUString& rStrResult );
82 : bool CalcStruct( const OUString& rStrExp);
83 : void UpdateValues();
84 : void DeleteArgs();
85 : sal_Int32 GetFunctionPos(sal_Int32 nPos);
86 : void ClearAllParas();
87 :
88 : void MakeTree(IStructHelper* _pTree,SvTreeListEntry* pParent,FormulaToken* _pToken,long Count);
89 : void fillTree(IStructHelper* _pTree);
90 : void UpdateTokenArray( const OUString& rStrExp);
91 : OUString RepairFormula(const OUString& aFormula);
92 : void FillDialog(bool nFlag=true);
93 : void EditNextFunc( bool bForward, sal_Int32 nFStart=NOT_FOUND );
94 : void EditThisFunc(sal_Int32 nFStart);
95 :
96 : void StoreFormEditData(FormEditData* pEditData);
97 :
98 : void Update();
99 : void Update(const OUString& _sExp);
100 :
101 : void SaveArg( sal_uInt16 nEd );
102 : void UpdateSelection();
103 : void DoEnter( bool bOk );
104 : void FillListboxes();
105 : void FillControls(bool &rbNext, bool &rbPrev);
106 :
107 : FormulaDlgMode SetMeText(const OUString& _sText, sal_Int32 PrivStart, sal_Int32 PrivEnd, bool bMatrix, bool _bSelect, bool _bUpdate);
108 : void SetMeText(const OUString& _sText);
109 : bool CheckMatrix(OUString& aFormula /*IN/OUT*/);
110 :
111 : void SetEdSelection();
112 :
113 : bool UpdateParaWin(Selection& _rSelection);
114 : void UpdateParaWin(const Selection& _rSelection,const OUString& _sRefStr);
115 :
116 : void SetData(sal_Int32 nFStart, sal_Int32 nNextFStart, sal_Int32 nNextFEnd, sal_Int32& PrivStart, sal_Int32& PrivEnd);
117 : void PreNotify( NotifyEvent& rNEvt );
118 :
119 : RefEdit* GetCurrRefEdit();
120 :
121 0 : const FormulaHelper& GetFormulaHelper() const { return m_aFormulaHelper;}
122 : uno::Reference< sheet::XFormulaOpCodeMapper > GetFormulaOpCodeMapper() const;
123 :
124 : DECL_LINK( ModifyHdl, ParaWin* );
125 : DECL_LINK( FxHdl, ParaWin* );
126 :
127 : DECL_LINK(MatrixHdl, void *);
128 : DECL_LINK(FormulaHdl, void *);
129 : DECL_LINK(FormulaCursorHdl, void *);
130 : DECL_LINK( BtnHdl, PushButton* );
131 : DECL_LINK(DblClkHdl, void *);
132 : DECL_LINK(FuncSelHdl, void *);
133 : DECL_LINK(StructSelHdl, void *);
134 : public:
135 : mutable uno::Reference< sheet::XFormulaOpCodeMapper> m_xOpCodeMapper;
136 : uno::Sequence< sheet::FormulaToken > m_aTokenList;
137 : ::std::unique_ptr<FormulaTokenArray> m_pTokenArray;
138 : mutable uno::Sequence< sheet::FormulaOpCodeMapEntry > m_aSpecialOpCodes;
139 : mutable const sheet::FormulaOpCodeMapEntry* m_pSpecialOpCodesEnd;
140 : mutable uno::Sequence< sheet::FormulaToken > m_aSeparatorsOpCodes;
141 : mutable uno::Sequence< sheet::FormulaOpCodeMapEntry > m_aFunctionOpCodes;
142 : mutable const sheet::FormulaOpCodeMapEntry* m_pFunctionOpCodesEnd;
143 : mutable uno::Sequence< sheet::FormulaOpCodeMapEntry > m_aUnaryOpCodes;
144 : mutable const sheet::FormulaOpCodeMapEntry* m_pUnaryOpCodesEnd;
145 : mutable uno::Sequence< sheet::FormulaOpCodeMapEntry > m_aBinaryOpCodes;
146 : mutable const sheet::FormulaOpCodeMapEntry* m_pBinaryOpCodesEnd;
147 : ::std::map<FormulaToken*,sheet::FormulaToken> m_aTokenMap;
148 : IFormulaEditorHelper* m_pHelper;
149 : VclPtr<Dialog> m_pParent;
150 : IControlReferenceHandler* m_pDlg;
151 : VclPtr<TabControl> m_pTabCtrl;
152 : VclPtr<VclVBox> m_pParaWinBox;
153 : VclPtr<ParaWin> pParaWin;
154 : VclPtr<FixedText> m_pFtHeadLine;
155 : VclPtr<FixedText> m_pFtFuncName;
156 : VclPtr<FixedText> m_pFtFuncDesc;
157 :
158 : VclPtr<FixedText> m_pFtEditName;
159 :
160 : VclPtr<FixedText> m_pFtResult;
161 : VclPtr<Edit> m_pWndResult;
162 :
163 : VclPtr<FixedText> m_pFtFormula;
164 : VclPtr<EditBox> m_pMEFormula;
165 :
166 : VclPtr<CheckBox> m_pBtnMatrix;
167 : VclPtr<CancelButton> m_pBtnCancel;
168 :
169 : VclPtr<PushButton> m_pBtnBackward;
170 : VclPtr<PushButton> m_pBtnForward;
171 : VclPtr<OKButton> m_pBtnEnd;
172 :
173 : VclPtr<RefEdit> m_pEdRef;
174 : VclPtr<RefButton> m_pRefBtn;
175 :
176 : VclPtr<FixedText> m_pFtFormResult;
177 : VclPtr<Edit> m_pWndFormResult;
178 :
179 : VclPtr<RefEdit> pTheRefEdit;
180 : VclPtr<RefButton> pTheRefButton;
181 : VclPtr<FuncPage> pFuncPage;
182 : VclPtr<StructPage> pStructPage;
183 : OUString aOldFormula;
184 : bool bStructUpdate;
185 : VclPtr<MultiLineEdit> pMEdit;
186 : bool bUserMatrixFlag;
187 : Idle aIdle;
188 :
189 : const OUString aTitle1;
190 : const OUString aTitle2;
191 : const OUString aTxtEnd;
192 : OUString aTxtOk; // behind aBtnEnd
193 : FormulaHelper m_aFormulaHelper;
194 :
195 : OString m_aEditHelpId;
196 :
197 : OString aOldHelp;
198 : OString aOldUnique;
199 : OString aActivWinId;
200 : bool bIsShutDown;
201 :
202 : vcl::Font aFntBold;
203 : vcl::Font aFntLight;
204 : sal_uInt16 nEdFocus;
205 : bool bEditFlag;
206 : const IFunctionDescription* pFuncDesc;
207 : sal_Int32 nArgs;
208 : ::std::vector< OUString > m_aArguments;
209 : Selection aFuncSel;
210 :
211 : FormulaDlg_Impl(Dialog* pParent
212 : , bool _bSupportFunctionResult
213 : , bool _bSupportResult
214 : , bool _bSupportMatrix
215 : ,IFormulaEditorHelper* _pHelper
216 : ,const IFunctionManager* _pFunctionMgr
217 : ,IControlReferenceHandler* _pDlg);
218 : ~FormulaDlg_Impl();
219 :
220 : };
221 :
222 0 : FormulaDlg_Impl::FormulaDlg_Impl(Dialog* pParent
223 : , bool _bSupportFunctionResult
224 : , bool _bSupportResult
225 : , bool _bSupportMatrix
226 : ,IFormulaEditorHelper* _pHelper
227 : ,const IFunctionManager* _pFunctionMgr
228 : ,IControlReferenceHandler* _pDlg)
229 : :
230 : m_pSpecialOpCodesEnd(NULL),
231 : m_pFunctionOpCodesEnd(NULL),
232 : m_pUnaryOpCodesEnd(NULL),
233 : m_pBinaryOpCodesEnd(NULL),
234 : m_pHelper (_pHelper),
235 : m_pParent (pParent),
236 : m_pDlg (_pDlg),
237 : pTheRefEdit (NULL),
238 : pTheRefButton (NULL),
239 : pMEdit (NULL),
240 : bUserMatrixFlag (false),
241 : aTitle1 ( ModuleRes( STR_TITLE1 ) ),
242 : aTitle2 ( ModuleRes( STR_TITLE2 ) ),
243 : aTxtEnd ( ModuleRes( STR_END ) ),
244 : m_aFormulaHelper(_pFunctionMgr),
245 : bIsShutDown (false),
246 : nEdFocus (0),
247 : pFuncDesc (NULL),
248 0 : nArgs (0)
249 : {
250 0 : pParent->get(m_pParaWinBox, "BOX");
251 0 : pParent->get(m_pTabCtrl, "tabs");
252 0 : pParent->get(m_pFtHeadLine, "headline");
253 0 : pParent->get(m_pFtFuncName, "funcname");
254 0 : pParent->get(m_pFtFuncDesc, "funcdesc");
255 0 : pParent->get(m_pFtEditName, "editname");
256 0 : pParent->get(m_pFtResult, "label2");
257 0 : pParent->get(m_pWndResult, "result");
258 0 : pParent->get(m_pFtFormula, "formula");
259 :
260 : //Space for two lines of text
261 0 : m_pFtHeadLine->SetText("X\nX\n");
262 0 : long nHeight = m_pFtHeadLine->GetOptimalSize().Height();
263 0 : m_pFtHeadLine->set_height_request(nHeight);
264 0 : m_pFtHeadLine->SetText("");
265 :
266 0 : m_pFtFuncName->SetText("X\nX\n");
267 0 : nHeight = m_pFtFuncName->GetOptimalSize().Height();
268 0 : m_pFtFuncName->set_height_request(nHeight);
269 0 : m_pFtFuncDesc->set_height_request(nHeight);
270 0 : m_pFtFuncName->SetText("");
271 :
272 0 : pParent->get(m_pMEFormula, "ed_formula");
273 0 : Size aSize(pParent->LogicToPixel(Size(203, 43), MAP_APPFONT));
274 0 : m_pMEFormula->set_height_request(aSize.Height());
275 0 : m_pMEFormula->set_width_request(aSize.Width());
276 0 : pParent->get(m_pBtnMatrix, "array");
277 0 : pParent->get(m_pBtnCancel, "cancel");
278 0 : pParent->get(m_pBtnBackward, "back");
279 0 : pParent->get(m_pBtnForward, "next");
280 0 : pParent->get(m_pBtnEnd, "ok");
281 0 : aTxtOk = m_pBtnEnd->GetText();
282 0 : pParent->get(m_pFtFormResult, "label1");
283 0 : pParent->get(m_pWndFormResult, "formula_result");
284 0 : pParent->get(m_pEdRef, "ED_REF");
285 0 : m_pEdRef->SetReferences(_pDlg, m_pFtEditName);
286 0 : pParent->get(m_pRefBtn, "RB_REF");
287 0 : m_pRefBtn->SetReferences(_pDlg, m_pEdRef);
288 :
289 0 : pParaWin = VclPtr<ParaWin>::Create(m_pParaWinBox, _pDlg);
290 0 : pParaWin->Show();
291 0 : m_pParaWinBox->Hide();
292 0 : m_pFtEditName->Hide();
293 0 : m_pEdRef->Hide();
294 0 : m_pRefBtn->Hide();
295 :
296 0 : pMEdit = m_pMEFormula->GetEdit();
297 :
298 0 : m_pMEFormula->SetAccessibleName(m_pFtFormula->GetText());
299 0 : pMEdit->SetAccessibleName(m_pFtFormula->GetText());
300 :
301 0 : m_aEditHelpId = pMEdit->GetHelpId();
302 0 : pMEdit->SetUniqueId( m_aEditHelpId );
303 :
304 0 : bEditFlag=false;
305 0 : bStructUpdate=true;
306 0 : pParaWin->SetArgModifiedHdl(LINK( this, FormulaDlg_Impl, ModifyHdl ) );
307 0 : pParaWin->SetFxHdl(LINK( this, FormulaDlg_Impl, FxHdl ) );
308 :
309 0 : pFuncPage= VclPtr<FuncPage>::Create( m_pTabCtrl,_pFunctionMgr);
310 0 : pStructPage= VclPtr<StructPage>::Create( m_pTabCtrl);
311 0 : pFuncPage->Hide();
312 0 : pStructPage->Hide();
313 0 : m_pTabCtrl->SetTabPage( TP_FUNCTION, pFuncPage);
314 0 : m_pTabCtrl->SetTabPage( TP_STRUCT, pStructPage);
315 :
316 0 : aOldHelp = pParent->GetHelpId(); // HelpId from resource always for "Page 1"
317 0 : aOldUnique = pParent->GetUniqueId();
318 :
319 0 : m_pFtResult->Show( _bSupportResult );
320 0 : m_pWndResult->Show( _bSupportResult );
321 :
322 0 : m_pFtFormResult->Show( _bSupportFunctionResult );
323 0 : m_pWndFormResult->Show( _bSupportFunctionResult );
324 :
325 0 : if ( _bSupportMatrix )
326 0 : m_pBtnMatrix->SetClickHdl(LINK( this, FormulaDlg_Impl, MatrixHdl ) );
327 : else
328 0 : m_pBtnMatrix->Hide();
329 :
330 0 : m_pBtnCancel ->SetClickHdl( LINK( this, FormulaDlg_Impl, BtnHdl ) );
331 0 : m_pBtnEnd ->SetClickHdl( LINK( this, FormulaDlg_Impl, BtnHdl ) );
332 0 : m_pBtnForward ->SetClickHdl( LINK( this, FormulaDlg_Impl, BtnHdl ) );
333 0 : m_pBtnBackward->SetClickHdl( LINK( this, FormulaDlg_Impl, BtnHdl ) );
334 :
335 0 : pFuncPage->SetDoubleClickHdl( LINK( this, FormulaDlg_Impl, DblClkHdl ) );
336 0 : pFuncPage->SetSelectHdl( LINK( this, FormulaDlg_Impl, FuncSelHdl) );
337 0 : pStructPage->SetSelectionHdl( LINK( this, FormulaDlg_Impl, StructSelHdl ) );
338 0 : pMEdit->SetModifyHdl( LINK( this, FormulaDlg_Impl, FormulaHdl ) );
339 0 : m_pMEFormula->SetSelChangedHdl( LINK( this, FormulaDlg_Impl, FormulaCursorHdl ) );
340 :
341 0 : aFntLight = m_pFtFormula->GetFont();
342 0 : aFntLight.SetTransparent( true );
343 0 : aFntBold = aFntLight;
344 0 : aFntBold.SetWeight( WEIGHT_BOLD );
345 :
346 0 : pParaWin->SetArgumentFonts(aFntBold,aFntLight);
347 :
348 : // function description for choosing a function is no longer in a different color
349 :
350 0 : m_pFtHeadLine->SetFont(aFntBold);
351 0 : m_pFtFuncName->SetFont(aFntLight);
352 0 : m_pFtFuncDesc->SetFont(aFntLight);
353 0 : }
354 :
355 0 : FormulaDlg_Impl::~FormulaDlg_Impl()
356 : {
357 0 : if(aIdle.IsActive())
358 : {
359 0 : aIdle.SetIdleHdl(Link<Idle *, void>());
360 0 : aIdle.Stop();
361 : }// if(aIdle.IsActive())
362 0 : bIsShutDown=true;// Set it in order to PreNotify not to save GetFocus.
363 :
364 0 : m_pTabCtrl->RemovePage(TP_FUNCTION);
365 0 : m_pTabCtrl->RemovePage(TP_STRUCT);
366 :
367 0 : pStructPage.disposeAndClear();
368 0 : pFuncPage.disposeAndClear();
369 0 : pParaWin.disposeAndClear();
370 0 : DeleteArgs();
371 0 : }
372 :
373 0 : void FormulaDlg_Impl::StoreFormEditData(FormEditData* pData)
374 : {
375 0 : if (pData) // it won't be destroyed via Close
376 : {
377 0 : pData->SetFStart(pMEdit->GetSelection().Min());
378 0 : pData->SetSelection(pMEdit->GetSelection());
379 :
380 0 : if(m_pTabCtrl->GetCurPageId()==TP_FUNCTION)
381 0 : pData->SetMode( (sal_uInt16) FORMULA_FORMDLG_FORMULA );
382 : else
383 0 : pData->SetMode( (sal_uInt16) FORMULA_FORMDLG_EDIT );
384 0 : pData->SetUndoStr(pMEdit->GetText());
385 0 : pData->SetMatrixFlag(m_pBtnMatrix->IsChecked());
386 : }
387 0 : }
388 :
389 :
390 0 : void FormulaDlg_Impl::PreNotify( NotifyEvent& rNEvt )
391 : {
392 0 : MouseNotifyEvent nSwitch=rNEvt.GetType();
393 0 : if(nSwitch==MouseNotifyEvent::GETFOCUS && !bIsShutDown)
394 : {
395 0 : vcl::Window* pWin=rNEvt.GetWindow();
396 0 : if(pWin!=NULL)
397 : {
398 0 : aActivWinId = pWin->GetUniqueId();
399 0 : if(aActivWinId.isEmpty())
400 : {
401 0 : vcl::Window* pParent=pWin->GetParent();
402 0 : while(pParent!=NULL)
403 : {
404 0 : aActivWinId=pParent->GetUniqueId();
405 :
406 0 : if(!aActivWinId.isEmpty()) break;
407 :
408 0 : pParent=pParent->GetParent();
409 : }
410 : }
411 0 : if(!aActivWinId.isEmpty())
412 : {
413 :
414 0 : FormEditData* pData = m_pHelper->getFormEditData();
415 :
416 0 : if (pData && !aIdle.IsActive()) // won't be destroyed via Close
417 : {
418 0 : pData->SetUniqueId(aActivWinId);
419 : }
420 : }
421 : }
422 : }
423 0 : }
424 0 : uno::Reference< sheet::XFormulaOpCodeMapper > FormulaDlg_Impl::GetFormulaOpCodeMapper() const
425 : {
426 0 : if ( !m_xOpCodeMapper.is() )
427 : {
428 0 : m_xOpCodeMapper = m_pHelper->getFormulaOpCodeMapper();
429 0 : m_aFunctionOpCodes = m_xOpCodeMapper->getAvailableMappings(sheet::FormulaLanguage::ODFF,sheet::FormulaMapGroup::FUNCTIONS);
430 0 : m_pFunctionOpCodesEnd = m_aFunctionOpCodes.getConstArray() + m_aFunctionOpCodes.getLength();
431 :
432 0 : m_aUnaryOpCodes = m_xOpCodeMapper->getAvailableMappings(sheet::FormulaLanguage::ODFF,sheet::FormulaMapGroup::UNARY_OPERATORS);
433 0 : m_pUnaryOpCodesEnd = m_aUnaryOpCodes.getConstArray() + m_aUnaryOpCodes.getLength();
434 :
435 0 : m_aBinaryOpCodes = m_xOpCodeMapper->getAvailableMappings(sheet::FormulaLanguage::ODFF,sheet::FormulaMapGroup::BINARY_OPERATORS);
436 0 : m_pBinaryOpCodesEnd = m_aBinaryOpCodes.getConstArray() + m_aBinaryOpCodes.getLength();
437 :
438 0 : uno::Sequence< OUString > aArgs(3);
439 0 : aArgs[TOKEN_OPEN] = "(";
440 0 : aArgs[TOKEN_CLOSE] = ")";
441 0 : aArgs[TOKEN_SEP] = ";";
442 0 : m_aSeparatorsOpCodes = m_xOpCodeMapper->getMappings(aArgs,sheet::FormulaLanguage::ODFF);
443 :
444 0 : m_aSpecialOpCodes = m_xOpCodeMapper->getAvailableMappings(sheet::FormulaLanguage::ODFF,sheet::FormulaMapGroup::SPECIAL);
445 0 : m_pSpecialOpCodesEnd = m_aSpecialOpCodes.getConstArray() + m_aSpecialOpCodes.getLength();
446 : } // if ( !m_xOpCodeMapper.is() )
447 0 : return m_xOpCodeMapper;
448 : }
449 :
450 0 : void FormulaDlg_Impl::DeleteArgs()
451 : {
452 0 : ::std::vector< OUString>().swap(m_aArguments);
453 0 : nArgs = 0;
454 0 : }
455 : namespace
456 : {
457 : // comparing two property instances
458 : struct OpCodeCompare : public ::std::binary_function< sheet::FormulaOpCodeMapEntry, sal_Int32 , bool >
459 : {
460 0 : bool operator() (const sheet::FormulaOpCodeMapEntry& x, sal_Int32 y) const
461 : {
462 0 : return x.Token.OpCode == y;
463 : }
464 : };
465 : }
466 :
467 0 : sal_Int32 FormulaDlg_Impl::GetFunctionPos(sal_Int32 nPos)
468 : {
469 0 : if ( !m_aTokenList.hasElements() )
470 0 : return SAL_MAX_INT32;
471 :
472 0 : const sal_Unicode sep = m_pHelper->getFunctionManager()->getSingleToken(IFunctionManager::eSep);
473 :
474 0 : sal_Int32 nFuncPos = SAL_MAX_INT32;
475 0 : OUString aFormString = m_aFormulaHelper.GetCharClass()->uppercase(pMEdit->GetText());
476 :
477 0 : const uno::Reference< sheet::XFormulaParser > xParser(m_pHelper->getFormulaParser());
478 0 : const table::CellAddress aRefPos(m_pHelper->getReferencePosition());
479 :
480 0 : const sheet::FormulaToken* pIter = m_aTokenList.getConstArray();
481 0 : const sheet::FormulaToken* pEnd = pIter + m_aTokenList.getLength();
482 : try
483 : {
484 0 : bool bFlag = false;
485 0 : sal_Int32 nTokPos = 1;
486 0 : sal_Int32 nOldTokPos = 1;
487 0 : sal_Int32 nPrevFuncPos = 1;
488 0 : short nBracketCount = 0;
489 0 : while ( pIter != pEnd )
490 : {
491 0 : const sal_Int32 eOp = pIter->OpCode;
492 0 : uno::Sequence<sheet::FormulaToken> aArgs(1);
493 0 : aArgs[0] = *pIter;
494 0 : const OUString aString = xParser->printFormula(aArgs, aRefPos);
495 0 : const sheet::FormulaToken* pNextToken = pIter + 1;
496 :
497 0 : if( !bUserMatrixFlag && FormulaCompiler::IsMatrixFunction((OpCode)eOp) )
498 : {
499 0 : m_pBtnMatrix->Check();
500 : }
501 :
502 0 : if( eOp == m_aSpecialOpCodes[sheet::FormulaMapGroupSpecialOffset::PUSH].Token.OpCode ||
503 0 : eOp == m_aSpecialOpCodes[sheet::FormulaMapGroupSpecialOffset::SPACES].Token.OpCode )
504 : {
505 0 : const sal_Int32 n1 = nTokPos < 0 ? -1 : aFormString.indexOf(sep, nTokPos);
506 0 : const sal_Int32 n2 = nTokPos < 0 ? -1 : aFormString.indexOf(')',nTokPos);
507 0 : sal_Int32 nXXX = nTokPos;
508 0 : if( n1 < n2 && n1 != -1 )
509 : {
510 0 : nTokPos=n1;
511 : }
512 : else
513 : {
514 0 : nTokPos=n2;
515 : }
516 0 : if( pNextToken != pEnd )
517 : {
518 0 : aArgs[0] = *pNextToken;
519 0 : const OUString a2String = xParser->printFormula(aArgs, aRefPos);
520 0 : const sal_Int32 n3 = nXXX < 0 ? -1 : aFormString.indexOf(a2String, nXXX);
521 0 : if (n3 < nTokPos && n3 != -1)
522 0 : nTokPos = n3;
523 : }
524 : }
525 : else
526 : {
527 0 : nTokPos = nTokPos + aString.getLength();
528 : }
529 :
530 0 : if( eOp == m_aSeparatorsOpCodes[TOKEN_OPEN].OpCode )
531 : {
532 0 : nBracketCount++;
533 0 : bFlag = true;
534 : }
535 0 : else if( eOp == m_aSeparatorsOpCodes[TOKEN_CLOSE].OpCode )
536 : {
537 0 : nBracketCount--;
538 0 : bFlag = false;
539 0 : nFuncPos = nPrevFuncPos;
540 : }
541 0 : bool bIsFunction = ::std::find_if(m_aFunctionOpCodes.getConstArray(),m_pFunctionOpCodesEnd,::std::bind2nd(OpCodeCompare(),boost::cref(eOp))) != m_pFunctionOpCodesEnd;
542 :
543 0 : if( bIsFunction && m_aSpecialOpCodes[sheet::FormulaMapGroupSpecialOffset::SPACES].Token.OpCode != eOp )
544 : {
545 0 : nPrevFuncPos = nFuncPos;
546 0 : nFuncPos = nOldTokPos;
547 : }
548 :
549 0 : if( nOldTokPos <= nPos && nPos < nTokPos )
550 : {
551 0 : if( !bIsFunction )
552 : {
553 0 : if( nBracketCount < 1 )
554 : {
555 0 : nFuncPos = pMEdit->GetText().getLength();
556 : }
557 0 : else if( !bFlag )
558 : {
559 0 : nFuncPos = nPrevFuncPos;
560 : }
561 : }
562 0 : break;
563 : }
564 :
565 0 : pIter = pNextToken;
566 0 : nOldTokPos = nTokPos;
567 0 : } // while ( pIter != pEnd )
568 : }
569 0 : catch ( const uno::Exception& e )
570 : {
571 : (void)e;
572 : SAL_WARN("formula.ui", "FormulaDlg_Impl::GetFunctionPos exception! " << e.Message);
573 : }
574 :
575 0 : return nFuncPos;
576 : }
577 :
578 0 : bool FormulaDlg_Impl::CalcValue( const OUString& rStrExp, OUString& rStrResult )
579 : {
580 0 : bool bResult = true;
581 :
582 0 : if ( !rStrExp.isEmpty() )
583 : {
584 : // Only calculate the value when there isn't any more keyboard input:
585 :
586 0 : if ( !Application::AnyInput( VclInputFlags::KEYBOARD ) )
587 : {
588 0 : bResult = m_pHelper->calculateValue(rStrExp,rStrResult);
589 : }
590 : else
591 0 : bResult = false;
592 : }
593 :
594 0 : return bResult;
595 : }
596 :
597 0 : void FormulaDlg_Impl::UpdateValues()
598 : {
599 0 : OUString aStrResult;
600 :
601 0 : if ( CalcValue( pFuncDesc->getFormula( m_aArguments ), aStrResult ) )
602 0 : m_pWndResult->SetText( aStrResult );
603 :
604 0 : aStrResult.clear();
605 0 : if ( CalcValue(m_pHelper->getCurrentFormula(), aStrResult ) )
606 0 : m_pWndFormResult->SetText( aStrResult );
607 : else
608 : {
609 0 : aStrResult.clear();
610 0 : m_pWndFormResult->SetText( aStrResult );
611 : }
612 0 : CalcStruct(pMEdit->GetText());
613 0 : }
614 :
615 0 : bool FormulaDlg_Impl::CalcStruct( const OUString& rStrExp)
616 : {
617 0 : bool bResult = true;
618 0 : sal_Int32 nLength = rStrExp.getLength();
619 :
620 0 : if ( !rStrExp.isEmpty() && aOldFormula!=rStrExp && bStructUpdate)
621 : {
622 : // Only calculate the value when there isn't any more keyboard input:
623 :
624 0 : if ( !Application::AnyInput( VclInputFlags::KEYBOARD ) )
625 : {
626 0 : pStructPage->ClearStruct();
627 :
628 0 : OUString aString=rStrExp;
629 0 : if(rStrExp[nLength-1] == '(')
630 : {
631 0 : aString = aString.copy(0, nLength-1);
632 : }
633 :
634 0 : aString = comphelper::string::remove(aString, '\n');
635 0 : OUString aStrResult;
636 :
637 0 : if ( CalcValue(aString, aStrResult ) )
638 0 : m_pWndFormResult->SetText( aStrResult );
639 :
640 0 : UpdateTokenArray(aString);
641 0 : fillTree(pStructPage);
642 :
643 0 : aOldFormula = rStrExp;
644 0 : if(rStrExp[nLength-1] == '(')
645 0 : UpdateTokenArray(rStrExp);
646 : }
647 : else
648 0 : bResult = false;
649 : }
650 0 : return bResult;
651 : }
652 :
653 :
654 0 : void FormulaDlg_Impl::MakeTree(IStructHelper* _pTree,SvTreeListEntry* pParent,FormulaToken* _pToken,long Count)
655 : {
656 0 : if( _pToken != NULL && Count > 0 )
657 : {
658 0 : long nParas = _pToken->GetParamCount();
659 0 : OpCode eOp = _pToken->GetOpCode();
660 :
661 : // #i101512# for output, the original token is needed
662 0 : FormulaToken* pOrigToken = (_pToken->GetType() == svFAP) ? _pToken->GetFAPOrigToken() : _pToken;
663 0 : uno::Sequence<sheet::FormulaToken> aArgs(1);
664 0 : ::std::map<FormulaToken*,sheet::FormulaToken>::const_iterator itr = m_aTokenMap.find(pOrigToken);
665 0 : if (itr == m_aTokenMap.end())
666 0 : return;
667 :
668 0 : aArgs[0] = itr->second;
669 : try
670 : {
671 0 : const table::CellAddress aRefPos(m_pHelper->getReferencePosition());
672 0 : const OUString aResult = m_pHelper->getFormulaParser()->printFormula(aArgs, aRefPos);
673 :
674 0 : if ( nParas > 0 )
675 : {
676 : SvTreeListEntry* pEntry;
677 :
678 0 : OUString aTest=_pTree->GetEntryText(pParent);
679 :
680 0 : if(aTest==aResult &&
681 0 : (eOp==ocAdd || eOp==ocMul ||
682 : eOp==ocAmpersand))
683 : {
684 0 : pEntry=pParent;
685 : }
686 : else
687 : {
688 0 : if(eOp==ocBad)
689 : {
690 0 : pEntry=_pTree->InsertEntry(aResult,pParent,STRUCT_ERROR,0,_pToken);
691 : }
692 : else
693 : {
694 0 : pEntry=_pTree->InsertEntry(aResult,pParent,STRUCT_FOLDER,0,_pToken);
695 : }
696 : }
697 :
698 0 : MakeTree(_pTree,pEntry,m_pTokenArray->PrevRPN(),nParas);
699 0 : --Count;
700 0 : m_pTokenArray->NextRPN();
701 0 : MakeTree(_pTree,pParent,m_pTokenArray->PrevRPN(),Count);
702 : }
703 : else
704 : {
705 0 : if(eOp==ocBad)
706 : {
707 0 : _pTree->InsertEntry(aResult,pParent,STRUCT_ERROR,0,_pToken);
708 : }
709 : else
710 : {
711 0 : _pTree->InsertEntry(aResult,pParent,STRUCT_END,0,_pToken);
712 : }
713 0 : --Count;
714 0 : MakeTree(_pTree,pParent,m_pTokenArray->PrevRPN(),Count);
715 0 : }
716 : }
717 0 : catch(const uno::Exception&)
718 : {
719 : DBG_UNHANDLED_EXCEPTION();
720 0 : }
721 : }
722 : }
723 :
724 0 : void FormulaDlg_Impl::fillTree(IStructHelper* _pTree)
725 : {
726 0 : GetFormulaOpCodeMapper();
727 0 : FormulaToken* pToken = m_pTokenArray->LastRPN();
728 :
729 0 : if( pToken != NULL)
730 : {
731 0 : MakeTree(_pTree,NULL,pToken,1);
732 : }
733 0 : }
734 0 : void FormulaDlg_Impl::UpdateTokenArray( const OUString& rStrExp)
735 : {
736 0 : m_aTokenMap.clear();
737 0 : m_aTokenList.realloc(0);
738 : try
739 : {
740 0 : const table::CellAddress aRefPos(m_pHelper->getReferencePosition());
741 0 : m_aTokenList = m_pHelper->getFormulaParser()->parseFormula(rStrExp, aRefPos);
742 : }
743 0 : catch(const uno::Exception&)
744 : {
745 : DBG_UNHANDLED_EXCEPTION();
746 : }
747 0 : GetFormulaOpCodeMapper(); // just to get it initialized
748 0 : m_pTokenArray = m_pHelper->convertToTokenArray(m_aTokenList);
749 0 : const sal_Int32 nLen = static_cast<sal_Int32>(m_pTokenArray->GetLen());
750 0 : FormulaToken** pTokens = m_pTokenArray->GetArray();
751 0 : if ( pTokens && nLen == m_aTokenList.getLength() )
752 : {
753 0 : for (sal_Int32 nPos=0; nPos<nLen; nPos++)
754 : {
755 0 : m_aTokenMap.insert(::std::map<FormulaToken*,sheet::FormulaToken>::value_type(pTokens[nPos],m_aTokenList[nPos]));
756 : }
757 : } // if ( pTokens && nLen == m_aTokenList.getLength() )
758 :
759 0 : FormulaCompiler aCompiler(*m_pTokenArray.get());
760 : // #i101512# Disable special handling of jump commands.
761 0 : aCompiler.EnableJumpCommandReorder(false);
762 0 : aCompiler.EnableStopOnError(false);
763 0 : aCompiler.CompileTokenArray();
764 0 : }
765 :
766 0 : void FormulaDlg_Impl::FillDialog(bool nFlag)
767 : {
768 0 : bool bNext=true, bPrev=true;
769 0 : if(nFlag)
770 0 : FillControls(bNext, bPrev);
771 0 : FillListboxes();
772 0 : if(nFlag)
773 : {
774 0 : m_pBtnBackward->Enable(bPrev);
775 0 : m_pBtnForward->Enable(bNext);
776 : }
777 :
778 0 : OUString aStrResult;
779 :
780 0 : if ( CalcValue(m_pHelper->getCurrentFormula(), aStrResult ) )
781 0 : m_pWndFormResult->SetText( aStrResult );
782 : else
783 : {
784 0 : aStrResult.clear();
785 0 : m_pWndFormResult->SetText( 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(bool &rbNext, 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 :
839 0 : if ( m_aFormulaHelper.GetNextFunc( aFormula, false,
840 0 : nNextFStart, &nNextFEnd, &pFuncDesc, &m_aArguments ) )
841 : {
842 0 : const bool bTestFlag = (pOldFuncDesc != pFuncDesc);
843 0 : if(bTestFlag)
844 : {
845 0 : m_pFtHeadLine->Hide();
846 0 : m_pFtFuncName->Hide();
847 0 : m_pFtFuncDesc->Hide();
848 0 : pParaWin->SetFunctionDesc(pFuncDesc);
849 0 : m_pFtEditName->SetText( pFuncDesc->getFunctionName() );
850 0 : m_pFtEditName->Show();
851 0 : m_pParaWinBox->Show();
852 0 : const OString aHelpId = pFuncDesc->getHelpId();
853 0 : if ( !aHelpId.isEmpty() )
854 0 : pMEdit->SetHelpId(aHelpId);
855 : }
856 :
857 : sal_Int32 nOldStart, nOldEnd;
858 0 : m_pHelper->getSelection( nOldStart, nOldEnd );
859 0 : if ( nOldStart != nNextFStart || nOldEnd != nNextFEnd )
860 : {
861 0 : m_pHelper->setSelection( nNextFStart, nNextFEnd );
862 : }
863 0 : aFuncSel.Min() = nNextFStart;
864 0 : aFuncSel.Max() = nNextFEnd;
865 :
866 0 : if(!bEditFlag)
867 0 : pMEdit->SetText(m_pHelper->getCurrentFormula());
868 : sal_Int32 PrivStart, PrivEnd;
869 0 : m_pHelper->getSelection( PrivStart, PrivEnd);
870 0 : if(!bEditFlag)
871 0 : pMEdit->SetSelection( Selection(PrivStart, PrivEnd));
872 :
873 0 : nArgs = pFuncDesc->getSuppressedArgumentCount();
874 0 : sal_uInt16 nOffset = pData->GetOffset();
875 0 : nEdFocus = pData->GetEdFocus();
876 :
877 : // Concatenate the Edit's for Focus-Control
878 :
879 0 : if(bTestFlag)
880 0 : pParaWin->SetArgumentOffset(nOffset);
881 0 : sal_uInt16 nActiv=0;
882 0 : sal_Int32 nArgPos = m_aFormulaHelper.GetArgStart( aFormula, nFStart, 0 );
883 0 : sal_Int32 nEditPos = pMEdit->GetSelection().Min();
884 0 : bool bFlag = false;
885 :
886 0 : for(sal_Int32 i=0;i<nArgs;i++)
887 : {
888 0 : sal_Int32 nLength = m_aArguments[i].getLength()+1;
889 0 : pParaWin->SetArgument(i,m_aArguments[i]);
890 0 : if(nArgPos<=nEditPos && nEditPos<nArgPos+nLength)
891 : {
892 0 : nActiv=i;
893 0 : bFlag=true;
894 : }
895 0 : nArgPos = nArgPos + nLength;
896 : }
897 0 : pParaWin->UpdateParas();
898 :
899 0 : if(bFlag)
900 : {
901 0 : pParaWin->SetActiveLine(nActiv);
902 : }
903 :
904 0 : UpdateValues();
905 : }
906 : else
907 : {
908 0 : m_pFtEditName->SetText("");
909 0 : pMEdit->SetHelpId( m_aEditHelpId );
910 : }
911 : // Test, ob vorne/hinten noch mehr Funktionen sind
912 :
913 0 : sal_Int32 nTempStart = m_aFormulaHelper.GetArgStart( aFormula, nFStart, 0 );
914 0 : rbNext = m_aFormulaHelper.GetNextFunc( aFormula, false, nTempStart );
915 0 : nTempStart = pMEdit->GetSelection().Min();
916 0 : pData->SetFStart(nTempStart);
917 0 : rbPrev = m_aFormulaHelper.GetNextFunc( aFormula, true, nTempStart );
918 : }
919 :
920 :
921 0 : void FormulaDlg_Impl::ClearAllParas()
922 : {
923 0 : DeleteArgs();
924 0 : pFuncDesc = NULL;
925 0 : pParaWin->ClearAll();
926 0 : m_pWndResult->SetText(OUString());
927 0 : m_pFtFuncName->SetText(OUString());
928 0 : FuncSelHdl(NULL);
929 :
930 0 : if (pFuncPage->IsVisible())
931 : {
932 0 : m_pFtEditName->Hide();
933 0 : m_pParaWinBox->Hide();
934 :
935 0 : m_pBtnForward->Enable(true); //@new
936 0 : m_pFtHeadLine->Show();
937 0 : m_pFtFuncName->Show();
938 0 : m_pFtFuncDesc->Show();
939 : }
940 0 : }
941 0 : OUString FormulaDlg_Impl::RepairFormula(const OUString& aFormula)
942 : {
943 0 : OUString aResult('=');
944 : try
945 : {
946 0 : UpdateTokenArray(aFormula);
947 :
948 0 : if ( m_aTokenList.getLength() )
949 : {
950 0 : const table::CellAddress aRefPos(m_pHelper->getReferencePosition());
951 0 : const OUString sFormula(m_pHelper->getFormulaParser()->printFormula(m_aTokenList, aRefPos));
952 0 : if ( sFormula.isEmpty() || sFormula[0] != '=' )
953 0 : aResult += sFormula;
954 : else
955 0 : aResult = sFormula;
956 :
957 : }
958 : }
959 0 : catch ( const uno::Exception& e )
960 : {
961 : (void)e;
962 : SAL_WARN("formula.ui", "FormulaDlg_Impl::RepairFormula exception! " << e.Message);
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,m_pBtnMatrix->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 == m_pBtnCancel )
993 : {
994 0 : DoEnter(false); // closes the Dialog
995 : }
996 0 : else if ( pBtn == m_pBtnEnd )
997 : {
998 0 : DoEnter(true); // closes the Dialog
999 : }
1000 0 : else if ( pBtn == m_pBtnForward )
1001 : {
1002 0 : const IFunctionDescription* pDesc =pFuncPage->GetFuncDesc( pFuncPage->GetFunction() );
1003 :
1004 0 : if(pDesc==pFuncDesc || !pFuncPage->IsVisible())
1005 0 : EditNextFunc( true );
1006 : else
1007 : {
1008 0 : DblClkHdl(pFuncPage); //new
1009 0 : m_pBtnForward->Enable(false); //new
1010 : }
1011 : }
1012 0 : else if ( pBtn == m_pBtnBackward )
1013 : {
1014 0 : bEditFlag=false;
1015 0 : m_pBtnForward->Enable(true);
1016 0 : EditNextFunc( false );
1017 0 : m_pMEFormula->Invalidate();
1018 0 : m_pMEFormula->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(m_pBtnBackward);
1059 : }
1060 :
1061 0 : pParaWin->SetEdFocus(0);
1062 0 : m_pBtnForward->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 : m_pMEFormula->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 : 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( 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 : 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_Int32 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_Int32 i=nClearPos; i<nArgs; i++)
1192 : {
1193 0 : m_aArguments[i].clear();
1194 : }
1195 : }
1196 0 : }
1197 :
1198 0 : IMPL_LINK( FormulaDlg_Impl, FxHdl, ParaWin*, pPtr )
1199 : {
1200 0 : if(pPtr==pParaWin)
1201 : {
1202 0 : m_pBtnForward->Enable(true); //@ In order to be able to input another function.
1203 0 : m_pTabCtrl->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(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=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 : m_pWndFormResult->SetText( aStrResult );
1287 : else
1288 : {
1289 0 : aStrResult.clear();
1290 0 : m_pWndFormResult->SetText( 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( false, nPos1);
1300 : }
1301 : else
1302 : {
1303 0 : ClearAllParas();
1304 : }
1305 :
1306 0 : m_pHelper->setSelection(aSel.Min(), aSel.Max());
1307 0 : bEditFlag=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=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=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 : m_pMEFormula->UpdateOldSel();
1406 0 : }
1407 :
1408 0 : ::std::pair<RefButton*,RefEdit*> FormulaDlg_Impl::RefInputStartBefore( RefEdit* pEdit, RefButton* pButton )
1409 : {
1410 : //because its initially hidden, give it its optimal
1411 : //size so clicking the refbutton has an initial
1412 : //size to work work when retro-fitting this to .ui
1413 0 : m_pEdRef->SetSizePixel(m_pEdRef->GetOptimalSize());
1414 0 : m_pEdRef->Show();
1415 0 : pTheRefEdit = pEdit;
1416 0 : pTheRefButton = pButton;
1417 :
1418 0 : if( pTheRefEdit )
1419 : {
1420 0 : m_pEdRef->SetRefString( pTheRefEdit->GetText() );
1421 0 : m_pEdRef->SetSelection( pTheRefEdit->GetSelection() );
1422 0 : m_pEdRef->SetHelpId( pTheRefEdit->GetHelpId() );
1423 0 : m_pEdRef->SetUniqueId( pTheRefEdit->GetUniqueId() );
1424 : }
1425 :
1426 0 : m_pRefBtn->Show( pButton != NULL );
1427 :
1428 0 : ::std::pair<RefButton*,RefEdit*> aPair;
1429 0 : aPair.first = pButton ? m_pRefBtn.get() : NULL;
1430 0 : aPair.second = m_pEdRef;
1431 0 : return aPair;
1432 : }
1433 0 : void FormulaDlg_Impl::RefInputStartAfter( RefEdit* /*pEdit*/, RefButton* /*pButton*/ )
1434 : {
1435 0 : m_pRefBtn->SetEndImage();
1436 :
1437 0 : if( pTheRefEdit )
1438 : {
1439 0 : OUString aStr = aTitle2 + " " + m_pFtEditName->GetText() + "( ";
1440 :
1441 0 : if( pParaWin->GetActiveLine() > 0 )
1442 0 : aStr += "...; ";
1443 0 : aStr += pParaWin->GetActiveArgName();
1444 0 : if( pParaWin->GetActiveLine() + 1 < nArgs )
1445 0 : aStr += "; ...";
1446 0 : aStr += " )";
1447 :
1448 0 : m_pParent->SetText( MnemonicGenerator::EraseAllMnemonicChars( aStr ) );
1449 : }
1450 0 : }
1451 0 : void FormulaDlg_Impl::RefInputDoneAfter( bool bForced )
1452 : {
1453 0 : m_pRefBtn->SetStartImage();
1454 0 : if( bForced || !m_pRefBtn->IsVisible() )
1455 : {
1456 0 : m_pEdRef->Hide();
1457 0 : m_pRefBtn->Hide();
1458 0 : if( pTheRefEdit )
1459 : {
1460 0 : pTheRefEdit->SetRefString( m_pEdRef->GetText() );
1461 0 : pTheRefEdit->GrabFocus();
1462 :
1463 0 : if( pTheRefButton )
1464 0 : pTheRefButton->SetStartImage();
1465 :
1466 0 : sal_uInt16 nPrivActiv = pParaWin->GetActiveLine();
1467 0 : pParaWin->SetArgument( nPrivActiv, m_pEdRef->GetText() );
1468 0 : ModifyHdl( pParaWin );
1469 0 : pTheRefEdit = NULL;
1470 : }
1471 0 : m_pParent->SetText( aTitle1 );
1472 : }
1473 0 : }
1474 0 : RefEdit* FormulaDlg_Impl::GetCurrRefEdit()
1475 : {
1476 0 : return m_pEdRef->IsVisible() ? m_pEdRef.get() : pParaWin->GetActiveEdit();
1477 : }
1478 0 : void FormulaDlg_Impl::Update()
1479 : {
1480 0 : FormEditData* pData = m_pHelper->getFormEditData();
1481 0 : const OUString sExpression = pMEdit->GetText();
1482 0 : aOldFormula.clear();
1483 0 : UpdateTokenArray(sExpression);
1484 0 : FormulaCursorHdl(m_pMEFormula);
1485 0 : CalcStruct(sExpression);
1486 0 : if(pData->GetMode() == FORMULA_FORMDLG_FORMULA)
1487 0 : m_pTabCtrl->SetCurPageId(TP_FUNCTION);
1488 : else
1489 0 : m_pTabCtrl->SetCurPageId(TP_STRUCT);
1490 0 : m_pBtnMatrix->Check(pData->GetMatrixFlag());
1491 0 : }
1492 0 : void FormulaDlg_Impl::Update(const OUString& _sExp)
1493 : {
1494 0 : CalcStruct(_sExp);
1495 0 : FillDialog();
1496 0 : FuncSelHdl(NULL);
1497 0 : }
1498 0 : void FormulaDlg_Impl::SetMeText(const OUString& _sText)
1499 : {
1500 0 : FormEditData* pData = m_pHelper->getFormEditData();
1501 0 : pMEdit->SetText(_sText);
1502 0 : pMEdit->SetSelection( pData->GetSelection());
1503 0 : m_pMEFormula->UpdateOldSel();
1504 0 : }
1505 0 : FormulaDlgMode FormulaDlg_Impl::SetMeText(const OUString& _sText, sal_Int32 PrivStart, sal_Int32 PrivEnd, bool bMatrix, bool _bSelect, bool _bUpdate)
1506 : {
1507 0 : FormulaDlgMode eMode = FORMULA_FORMDLG_FORMULA;
1508 0 : if(!bEditFlag)
1509 0 : pMEdit->SetText(_sText);
1510 :
1511 0 : if ( _bSelect || !bEditFlag )
1512 0 : pMEdit->SetSelection( Selection(PrivStart, PrivEnd));
1513 0 : if ( _bUpdate )
1514 : {
1515 0 : m_pMEFormula->UpdateOldSel();
1516 0 : pMEdit->Invalidate();
1517 0 : m_pHelper->showReference(pMEdit->GetSelected());
1518 0 : eMode = FORMULA_FORMDLG_EDIT;
1519 :
1520 0 : m_pBtnMatrix->Check( bMatrix );
1521 : } // if ( _bUpdate )
1522 0 : return eMode;
1523 : }
1524 0 : bool FormulaDlg_Impl::CheckMatrix(OUString& aFormula)
1525 : {
1526 0 : pMEdit->GrabFocus();
1527 0 : sal_Int32 nLen = aFormula.getLength();
1528 : bool bMatrix = nLen > 3 // Matrix-Formula
1529 0 : && aFormula[0] == '{'
1530 0 : && aFormula[1] == '='
1531 0 : && aFormula[nLen-1] == '}';
1532 0 : if ( bMatrix )
1533 : {
1534 0 : aFormula = aFormula.copy( 1, aFormula.getLength()-2 );
1535 0 : m_pBtnMatrix->Check( bMatrix );
1536 0 : m_pBtnMatrix->Disable();
1537 : } // if ( bMatrix )
1538 :
1539 0 : m_pTabCtrl->SetCurPageId(TP_STRUCT);
1540 0 : return bMatrix;
1541 : }
1542 0 : IMPL_LINK_NOARG(FormulaDlg_Impl, StructSelHdl)
1543 : {
1544 0 : bStructUpdate=false;
1545 0 : if(pStructPage->IsVisible()) m_pBtnForward->Enable(false); //@New
1546 :
1547 0 : bStructUpdate=true;
1548 0 : return 0;
1549 : }
1550 0 : IMPL_LINK_NOARG(FormulaDlg_Impl, MatrixHdl)
1551 : {
1552 0 : bUserMatrixFlag=true;
1553 0 : return 0;
1554 : }
1555 :
1556 0 : IMPL_LINK_NOARG(FormulaDlg_Impl, FuncSelHdl)
1557 : {
1558 0 : sal_Int32 nCat = pFuncPage->GetCategory();
1559 0 : if ( nCat == LISTBOX_ENTRY_NOTFOUND ) nCat = 0;
1560 0 : sal_Int32 nFunc = pFuncPage->GetFunction();
1561 0 : if ( nFunc == LISTBOX_ENTRY_NOTFOUND ) nFunc = 0;
1562 :
1563 0 : if ( (pFuncPage->GetFunctionEntryCount() > 0)
1564 0 : && (pFuncPage->GetFunction() != LISTBOX_ENTRY_NOTFOUND) )
1565 : {
1566 0 : const IFunctionDescription* pDesc =pFuncPage->GetFuncDesc( pFuncPage->GetFunction() );
1567 :
1568 0 : if(pDesc!=pFuncDesc) m_pBtnForward->Enable(true); //new
1569 :
1570 0 : if (pDesc)
1571 : {
1572 0 : pDesc->initArgumentInfo(); // full argument info is needed
1573 :
1574 0 : OUString aSig = pDesc->getSignature();
1575 0 : m_pFtHeadLine->SetText( pDesc->getFunctionName() );
1576 0 : m_pFtFuncName->SetText( aSig );
1577 0 : m_pFtFuncDesc->SetText( pDesc->getDescription() );
1578 : }
1579 : }
1580 : else
1581 : {
1582 0 : m_pFtHeadLine->SetText( OUString() );
1583 0 : m_pFtFuncName->SetText( OUString() );
1584 0 : m_pFtFuncDesc->SetText( OUString() );
1585 : }
1586 0 : return 0;
1587 : }
1588 :
1589 0 : void FormulaDlg_Impl::UpdateParaWin(const Selection& _rSelection, const OUString& _sRefStr)
1590 : {
1591 0 : Selection theSel = _rSelection;
1592 0 : m_pEdRef->ReplaceSelected( _sRefStr );
1593 0 : theSel.Max() = theSel.Min() + _sRefStr.getLength();
1594 0 : m_pEdRef->SetSelection( theSel );
1595 :
1596 :
1597 : // Manual Update of the results' fields:
1598 :
1599 0 : sal_uInt16 nPrivActiv = pParaWin->GetActiveLine();
1600 0 : pParaWin->SetArgument(nPrivActiv,m_pEdRef->GetText());
1601 0 : pParaWin->UpdateParas();
1602 :
1603 0 : Edit* pEd = GetCurrRefEdit();
1604 0 : if( pEd != NULL )
1605 0 : pEd->SetSelection( theSel );
1606 :
1607 0 : pParaWin->SetRefMode(false);
1608 0 : }
1609 0 : bool FormulaDlg_Impl::UpdateParaWin(Selection& _rSelection)
1610 : {
1611 0 : pParaWin->SetRefMode(true);
1612 :
1613 0 : OUString aStrEd;
1614 0 : Edit* pEd = GetCurrRefEdit();
1615 0 : if(pEd!=NULL && pTheRefEdit==nullptr)
1616 : {
1617 0 : _rSelection=pEd->GetSelection();
1618 0 : _rSelection.Justify();
1619 0 : aStrEd=pEd->GetText();
1620 0 : m_pEdRef->SetRefString(aStrEd);
1621 0 : m_pEdRef->SetSelection( _rSelection );
1622 : }
1623 : else
1624 : {
1625 0 : _rSelection=m_pEdRef->GetSelection();
1626 0 : _rSelection.Justify();
1627 0 : aStrEd= m_pEdRef->GetText();
1628 : }
1629 0 : return pTheRefEdit == nullptr;
1630 : }
1631 :
1632 0 : void FormulaDlg_Impl::SetEdSelection()
1633 : {
1634 0 : Edit* pEd = GetCurrRefEdit()/*aScParaWin.GetActiveEdit()*/;
1635 0 : if( pEd )
1636 : {
1637 0 : Selection theSel = m_pEdRef->GetSelection();
1638 : // Edit may have the focus -> call ModifyHdl in addition
1639 : // to what's happening in GetFocus
1640 0 : pEd->GetModifyHdl().Call(pEd);
1641 0 : pEd->GrabFocus();
1642 0 : pEd->SetSelection(theSel);
1643 : } // if( pEd )
1644 0 : }
1645 :
1646 0 : FormulaModalDialog::FormulaModalDialog( vcl::Window* pParent
1647 : , bool _bSupportFunctionResult
1648 : , bool _bSupportResult
1649 : , bool _bSupportMatrix
1650 : , IFunctionManager* _pFunctionMgr
1651 : , IControlReferenceHandler* _pDlg )
1652 : : ModalDialog(pParent, "FormulaDialog", "formula/ui/formuladialog.ui")
1653 : , m_pImpl(new FormulaDlg_Impl(this,_bSupportFunctionResult,
1654 : _bSupportResult, _bSupportMatrix,
1655 0 : this, _pFunctionMgr, _pDlg))
1656 : {
1657 0 : SetText(m_pImpl->aTitle1);
1658 0 : }
1659 :
1660 0 : FormulaModalDialog::~FormulaModalDialog() { disposeOnce(); }
1661 :
1662 0 : void FormulaModalDialog::dispose()
1663 : {
1664 0 : m_pImpl.reset();
1665 0 : ModalDialog::dispose();
1666 0 : }
1667 :
1668 0 : void FormulaModalDialog::Update(const OUString& _sExp)
1669 : {
1670 0 : m_pImpl->Update(_sExp);
1671 0 : }
1672 :
1673 0 : void FormulaModalDialog::SetMeText(const OUString& _sText)
1674 : {
1675 0 : m_pImpl->SetMeText(_sText);
1676 0 : }
1677 :
1678 0 : bool FormulaModalDialog::CheckMatrix(OUString& aFormula)
1679 : {
1680 0 : return m_pImpl->CheckMatrix(aFormula);
1681 : }
1682 :
1683 0 : void FormulaModalDialog::Update()
1684 : {
1685 0 : m_pImpl->Update();
1686 0 : }
1687 :
1688 0 : ::std::pair<RefButton*,RefEdit*> FormulaModalDialog::RefInputStartBefore( RefEdit* pEdit, RefButton* pButton )
1689 : {
1690 0 : return m_pImpl->RefInputStartBefore( pEdit, pButton );
1691 : }
1692 :
1693 0 : void FormulaModalDialog::RefInputStartAfter( RefEdit* pEdit, RefButton* pButton )
1694 : {
1695 0 : m_pImpl->RefInputStartAfter( pEdit, pButton );
1696 0 : }
1697 0 : void FormulaModalDialog::RefInputDoneAfter( bool bForced )
1698 : {
1699 0 : m_pImpl->RefInputDoneAfter( bForced );
1700 0 : }
1701 :
1702 0 : void FormulaModalDialog::SetFocusWin(vcl::Window *pWin,const OString& nUniqueId)
1703 : {
1704 0 : if(pWin->GetUniqueId()==nUniqueId)
1705 : {
1706 0 : pWin->GrabFocus();
1707 : }
1708 : else
1709 : {
1710 0 : sal_uInt16 nCount=pWin->GetChildCount();
1711 :
1712 0 : for(sal_uInt16 i=0;i<nCount;i++)
1713 : {
1714 0 : vcl::Window* pChild=pWin->GetChild(i);
1715 0 : SetFocusWin(pChild,nUniqueId);
1716 : }
1717 : }
1718 0 : }
1719 :
1720 0 : bool FormulaModalDialog::PreNotify( NotifyEvent& rNEvt )
1721 : {
1722 0 : m_pImpl->PreNotify( rNEvt );
1723 :
1724 0 : return ModalDialog::PreNotify(rNEvt);
1725 : }
1726 :
1727 0 : void FormulaModalDialog::StoreFormEditData(FormEditData* pData)
1728 : {
1729 0 : m_pImpl->StoreFormEditData(pData);
1730 0 : }
1731 :
1732 :
1733 : // Initialisation / General functions for Dialog
1734 :
1735 0 : FormulaDlg::FormulaDlg( SfxBindings* pB, SfxChildWindow* pCW,
1736 : vcl::Window* pParent
1737 : , bool _bSupportFunctionResult
1738 : , bool _bSupportResult
1739 : , bool _bSupportMatrix
1740 : , IFunctionManager* _pFunctionMgr, IControlReferenceHandler* _pDlg ) :
1741 : SfxModelessDialog( pB, pCW, pParent, "FormulaDialog", "formula/ui/formuladialog.ui" ),
1742 : m_pImpl( new FormulaDlg_Impl(this, _bSupportFunctionResult
1743 : , _bSupportResult
1744 : , _bSupportMatrix
1745 0 : , this, _pFunctionMgr, _pDlg))
1746 : {
1747 : //undo SfxModelessDialog HelpId clear hack
1748 0 : reverseUniqueHelpIdHack(*this);
1749 0 : SetText(m_pImpl->aTitle1);
1750 0 : }
1751 :
1752 0 : FormulaDlg::~FormulaDlg() {disposeOnce();}
1753 :
1754 0 : void FormulaDlg::dispose()
1755 : {
1756 0 : m_pImpl.reset();
1757 0 : SfxModelessDialog::dispose();
1758 0 : }
1759 :
1760 0 : void FormulaDlg::Update(const OUString& _sExp)
1761 : {
1762 0 : m_pImpl->Update(_sExp);
1763 0 : }
1764 :
1765 :
1766 0 : void FormulaDlg::SetMeText(const OUString& _sText)
1767 : {
1768 0 : m_pImpl->SetMeText(_sText);
1769 0 : }
1770 :
1771 0 : FormulaDlgMode FormulaDlg::SetMeText(const OUString& _sText, sal_Int32 PrivStart, sal_Int32 PrivEnd, bool bMatrix, bool _bSelect, bool _bUpdate)
1772 : {
1773 0 : return m_pImpl->SetMeText(_sText,PrivStart, PrivEnd,bMatrix,_bSelect,_bUpdate);
1774 : }
1775 :
1776 0 : bool FormulaDlg::CheckMatrix(OUString& aFormula)
1777 : {
1778 0 : return m_pImpl->CheckMatrix(aFormula);
1779 : }
1780 :
1781 0 : OUString FormulaDlg::GetMeText() const
1782 : {
1783 0 : return m_pImpl->pMEdit->GetText();
1784 : }
1785 :
1786 0 : void FormulaDlg::Update()
1787 : {
1788 0 : m_pImpl->Update();
1789 0 : m_pImpl->aIdle.SetPriority(SchedulerPriority::LOWER);
1790 0 : m_pImpl->aIdle.SetIdleHdl(LINK( this, FormulaDlg, UpdateFocusHdl));
1791 0 : m_pImpl->aIdle.Start();
1792 0 : }
1793 :
1794 0 : void FormulaDlg::DoEnter(bool _bOk)
1795 : {
1796 0 : m_pImpl->DoEnter(_bOk);
1797 0 : }
1798 0 : ::std::pair<RefButton*,RefEdit*> FormulaDlg::RefInputStartBefore( RefEdit* pEdit, RefButton* pButton )
1799 : {
1800 0 : return m_pImpl->RefInputStartBefore( pEdit, pButton );
1801 : }
1802 0 : void FormulaDlg::RefInputStartAfter( RefEdit* pEdit, RefButton* pButton )
1803 : {
1804 0 : m_pImpl->RefInputStartAfter( pEdit, pButton );
1805 0 : }
1806 0 : void FormulaDlg::RefInputDoneAfter( bool bForced )
1807 : {
1808 0 : m_pImpl->RefInputDoneAfter( bForced );
1809 0 : }
1810 :
1811 0 : void FormulaDlg::SetFocusWin(vcl::Window *pWin,const OString& nUniqueId)
1812 : {
1813 0 : if(pWin->GetUniqueId()==nUniqueId)
1814 : {
1815 0 : pWin->GrabFocus();
1816 : }
1817 : else
1818 : {
1819 0 : sal_uInt16 nCount=pWin->GetChildCount();
1820 :
1821 0 : for(sal_uInt16 i=0;i<nCount;i++)
1822 : {
1823 0 : vcl::Window* pChild=pWin->GetChild(i);
1824 0 : SetFocusWin(pChild,nUniqueId);
1825 : }
1826 : }
1827 0 : }
1828 :
1829 :
1830 0 : bool FormulaDlg::PreNotify( NotifyEvent& rNEvt )
1831 : {
1832 0 : if (m_pImpl)
1833 0 : m_pImpl->PreNotify( rNEvt );
1834 0 : return SfxModelessDialog::PreNotify(rNEvt);
1835 : }
1836 :
1837 0 : void FormulaDlg::disableOk()
1838 : {
1839 0 : m_pImpl->m_pBtnEnd->Disable();
1840 0 : }
1841 :
1842 0 : void FormulaDlg::StoreFormEditData(FormEditData* pData)
1843 : {
1844 0 : m_pImpl->StoreFormEditData(pData);
1845 0 : }
1846 :
1847 :
1848 0 : const IFunctionDescription* FormulaDlg::getCurrentFunctionDescription() const
1849 : {
1850 : SAL_WARN_IF( (m_pImpl->pFuncDesc && m_pImpl->pFuncDesc->getSuppressedArgumentCount() != m_pImpl->nArgs),
1851 : "formula.ui", "FormulaDlg::getCurrentFunctionDescription: getSuppressedArgumentCount " <<
1852 : m_pImpl->pFuncDesc->getSuppressedArgumentCount() << " != nArgs " << m_pImpl->nArgs << " for " <<
1853 : m_pImpl->pFuncDesc->getFunctionName());
1854 0 : return m_pImpl->pFuncDesc;
1855 : }
1856 :
1857 0 : void FormulaDlg::UpdateParaWin(const Selection& _rSelection,const OUString& _sRefStr)
1858 : {
1859 0 : m_pImpl->UpdateParaWin(_rSelection,_sRefStr);
1860 0 : }
1861 0 : bool FormulaDlg::UpdateParaWin(Selection& _rSelection)
1862 : {
1863 0 : return m_pImpl->UpdateParaWin(_rSelection);
1864 : }
1865 :
1866 0 : RefEdit* FormulaDlg::GetActiveEdit()
1867 : {
1868 0 : return m_pImpl->pParaWin->GetActiveEdit();
1869 : }
1870 :
1871 0 : const FormulaHelper& FormulaDlg::GetFormulaHelper() const
1872 : {
1873 0 : return m_pImpl->GetFormulaHelper();
1874 : }
1875 :
1876 0 : void FormulaDlg::SetEdSelection()
1877 : {
1878 0 : m_pImpl->SetEdSelection();
1879 0 : }
1880 0 : IMPL_LINK_NOARG_TYPED(FormulaDlg, UpdateFocusHdl, Idle *, void)
1881 : {
1882 0 : FormEditData* pData = m_pImpl->m_pHelper->getFormEditData();
1883 :
1884 0 : if (pData) // won't be destroyed via Close
1885 : {
1886 0 : m_pImpl->m_pHelper->setReferenceInput(pData);
1887 0 : OString nUniqueId(pData->GetUniqueId());
1888 0 : SetFocusWin(this,nUniqueId);
1889 : }
1890 0 : }
1891 :
1892 :
1893 0 : void FormEditData::SaveValues()
1894 : {
1895 0 : FormEditData* pTemp = new FormEditData(*this);
1896 :
1897 0 : Reset();
1898 0 : pParent = pTemp;
1899 0 : }
1900 :
1901 0 : void FormEditData::Reset()
1902 : {
1903 0 : pParent = NULL;
1904 0 : nMode = 0;
1905 0 : nFStart = 0;
1906 0 : nCatSel = 1; //! oder 0 (zuletzt benutzte)
1907 0 : nFuncSel = 0;
1908 0 : nOffset = 0;
1909 0 : nEdFocus = 0;
1910 0 : bMatrix = false;
1911 0 : aUniqueId=OString();
1912 0 : aSelection.Min()=0;
1913 0 : aSelection.Max()=0;
1914 0 : aUndoStr.clear();
1915 0 : }
1916 :
1917 0 : const FormEditData& FormEditData::operator=( const FormEditData& r )
1918 : {
1919 0 : pParent = r.pParent;
1920 0 : nMode = r.nMode;
1921 0 : nFStart = r.nFStart;
1922 0 : nCatSel = r.nCatSel;
1923 0 : nFuncSel = r.nFuncSel;
1924 0 : nOffset = r.nOffset;
1925 0 : nEdFocus = r.nEdFocus;
1926 0 : aUndoStr = r.aUndoStr;
1927 0 : bMatrix = r.bMatrix ;
1928 0 : aUniqueId = r.aUniqueId;
1929 0 : aSelection = r.aSelection;
1930 0 : return *this;
1931 : }
1932 :
1933 0 : FormEditData::FormEditData()
1934 : {
1935 0 : Reset();
1936 0 : }
1937 :
1938 0 : FormEditData::~FormEditData()
1939 : {
1940 0 : delete pParent;
1941 0 : }
1942 :
1943 0 : FormEditData::FormEditData( const FormEditData& r )
1944 : {
1945 0 : *this = r;
1946 0 : }
1947 :
1948 :
1949 183 : } // formula
1950 :
1951 :
1952 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|