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 "scitems.hxx"
21 : #include <sfx2/dispatch.hxx>
22 : #include <sfx2/docfile.hxx>
23 : #include <sfx2/objsh.hxx>
24 : #include <svl/zforlist.hxx>
25 : #include <svl/stritem.hxx>
26 : #include <svtools/treelistbox.hxx>
27 : #include <sfx2/viewfrm.hxx>
28 : #include <vcl/svapp.hxx>
29 : #include <vcl/mnemonic.hxx>
30 : #include <unotools/charclass.hxx>
31 : #include <tools/urlobj.hxx>
32 : #include <formula/formulahelper.hxx>
33 : #include <formula/IFunctionDescription.hxx>
34 :
35 : #include "tokenuno.hxx"
36 : #include "formula.hxx"
37 : #include "formdata.hxx"
38 : #include "globstr.hrc"
39 : #include "scresid.hxx"
40 : #include "reffact.hxx"
41 : #include "document.hxx"
42 : #include "simpleformulacalc.hxx"
43 : #include "scmod.hxx"
44 : #include "inputhdl.hxx"
45 : #include "tabvwsh.hxx"
46 : #include "appoptio.hxx"
47 : #include "docsh.hxx"
48 : #include "funcdesc.hxx"
49 : #include <formula/token.hxx>
50 : #include "tokenarray.hxx"
51 : #include "sc.hrc"
52 : #include "servuno.hxx"
53 : #include "unonames.hxx"
54 : #include "externalrefmgr.hxx"
55 :
56 : #include <com/sun/star/table/CellAddress.hpp>
57 :
58 : using namespace formula;
59 : using namespace com::sun::star;
60 :
61 : ScDocument* ScFormulaDlg::pDoc = NULL;
62 52 : ScAddress ScFormulaDlg::aCursorPos;
63 :
64 : // init/ shared functions for dialog
65 :
66 0 : ScFormulaDlg::ScFormulaDlg( SfxBindings* pB, SfxChildWindow* pCW,
67 : vcl::Window* pParent, ScViewData* pViewData,formula::IFunctionManager* _pFunctionMgr )
68 : : formula::FormulaDlg( pB, pCW, pParent, true,true,true, _pFunctionMgr,this)
69 0 : , m_aHelper(this,pB)
70 : {
71 0 : m_aHelper.SetWindow(this);
72 0 : ScModule* pScMod = SC_MOD();
73 0 : pScMod->InputEnterHandler();
74 0 : ScTabViewShell* pScViewShell = NULL;
75 :
76 : // title has to be from the view that opened the dialog,
77 : // even if it's not the current view
78 :
79 0 : if ( pB )
80 : {
81 0 : SfxDispatcher* pMyDisp = pB->GetDispatcher();
82 0 : if (pMyDisp)
83 : {
84 0 : SfxViewFrame* pMyViewFrm = pMyDisp->GetFrame();
85 0 : if (pMyViewFrm)
86 : {
87 0 : pScViewShell = PTR_CAST( ScTabViewShell, pMyViewFrm->GetViewShell() );
88 0 : if( pScViewShell )
89 0 : pScViewShell->UpdateInputHandler(true);
90 : }
91 : }
92 : }
93 :
94 0 : if ( pDoc == NULL )
95 0 : pDoc = pViewData->GetDocument();
96 0 : m_xParser.set(ScServiceProvider::MakeInstance(SC_SERVICE_FORMULAPARS, static_cast<ScDocShell*>(pDoc->GetDocumentShell())),uno::UNO_QUERY);
97 0 : uno::Reference< beans::XPropertySet> xSet(m_xParser,uno::UNO_QUERY);
98 0 : xSet->setPropertyValue(OUString(SC_UNO_COMPILEFAP),uno::makeAny(sal_True));
99 :
100 0 : m_xOpCodeMapper.set(ScServiceProvider::MakeInstance(SC_SERVICE_OPCODEMAPPER, static_cast<ScDocShell*>(pDoc->GetDocumentShell())),uno::UNO_QUERY);
101 :
102 0 : ScInputHandler* pInputHdl = SC_MOD()->GetInputHdl(pScViewShell);
103 :
104 : OSL_ENSURE( pInputHdl, "Missing input handler :-/" );
105 :
106 0 : if ( pInputHdl )
107 0 : pInputHdl->NotifyChange( NULL );
108 :
109 0 : ScFormulaReferenceHelper::enableInput( false );
110 0 : ScFormulaReferenceHelper::EnableSpreadsheets();
111 0 : m_aHelper.Init();
112 0 : ScFormulaReferenceHelper::SetDispatcherLock( true );
113 :
114 0 : notifyChange();
115 0 : fill();
116 :
117 0 : ScFormEditData* pData = pScMod->GetFormEditData();
118 0 : if (!pData)
119 : {
120 0 : pScMod->SetRefInputHdl(pScMod->GetInputHdl());
121 :
122 0 : pDoc = pViewData->GetDocument();
123 0 : SCCOL nCol = pViewData->GetCurX();
124 0 : SCROW nRow = pViewData->GetCurY();
125 0 : SCTAB nTab = pViewData->GetTabNo();
126 0 : aCursorPos = ScAddress( nCol, nRow, nTab );
127 :
128 0 : pScMod->InitFormEditData(); // create new
129 0 : pData = pScMod->GetFormEditData();
130 0 : pData->SetInputHandler(pScMod->GetInputHdl());
131 0 : pData->SetDocShell(pViewData->GetDocShell());
132 :
133 : OSL_ENSURE(pData,"FormEditData ist nicht da");
134 :
135 0 : formula::FormulaDlgMode eMode = FORMULA_FORMDLG_FORMULA; // default...
136 :
137 : // edit if formula exists
138 :
139 0 : OUString aFormula;
140 0 : pDoc->GetFormula( nCol, nRow, nTab, aFormula );
141 0 : bool bEdit = ( aFormula.getLength() > 1 );
142 0 : bool bMatrix = false;
143 0 : if ( bEdit )
144 : {
145 0 : bMatrix = CheckMatrix(aFormula);
146 :
147 0 : sal_Int32 nFStart = 0;
148 0 : sal_Int32 nFEnd = 0;
149 0 : if ( GetFormulaHelper().GetNextFunc( aFormula, false, nFStart, &nFEnd) )
150 : {
151 0 : pScMod->InputReplaceSelection( aFormula );
152 0 : pScMod->InputSetSelection( nFStart, nFEnd );
153 : sal_Int32 PrivStart, PrivEnd;
154 0 : pScMod->InputGetSelection( PrivStart, PrivEnd);
155 :
156 0 : eMode = SetMeText(pScMod->InputGetFormulaStr(),PrivStart, PrivEnd, bMatrix, true, true);
157 0 : pData->SetFStart( nFStart );
158 : }
159 : else
160 0 : bEdit = false;
161 : }
162 :
163 0 : if ( !bEdit )
164 : {
165 0 : OUString aNewFormula('=');
166 0 : if ( aFormula.startsWith("=") )
167 0 : aNewFormula = aFormula;
168 :
169 0 : pScMod->InputReplaceSelection( aNewFormula );
170 0 : pScMod->InputSetSelection( 1, aNewFormula.getLength()+1 );
171 : sal_Int32 PrivStart, PrivEnd;
172 0 : pScMod->InputGetSelection( PrivStart, PrivEnd);
173 0 : SetMeText(pScMod->InputGetFormulaStr(),PrivStart, PrivEnd,bMatrix,false,false);
174 :
175 0 : pData->SetFStart( 1 ); // after "="
176 : }
177 :
178 0 : pData->SetMode( (sal_uInt16) eMode );
179 0 : OUString rStrExp = GetMeText();
180 :
181 0 : Update(rStrExp);
182 0 : }
183 :
184 0 : }
185 :
186 0 : void ScFormulaDlg::notifyChange()
187 : {
188 0 : ScModule* pScMod = SC_MOD();
189 :
190 0 : ScInputHandler* pInputHdl = pScMod->GetInputHdl();
191 0 : if ( pInputHdl )
192 0 : pInputHdl->NotifyChange( NULL );
193 0 : }
194 :
195 0 : void ScFormulaDlg::fill()
196 : {
197 0 : ScModule* pScMod = SC_MOD();
198 0 : ScFormEditData* pData = pScMod->GetFormEditData();
199 0 : notifyChange();
200 0 : OUString rStrExp;
201 0 : if (pData)
202 : {
203 : // data exists -> restore state (after switch)
204 : // don't reinitialise pDoc and aCursorPos
205 : //pDoc = pViewData->GetDocument();
206 0 : if(IsInputHdl(pData->GetInputHandler()))
207 : {
208 0 : pScMod->SetRefInputHdl(pData->GetInputHandler());
209 : }
210 : else
211 : {
212 : PtrTabViewShell pTabViewShell;
213 0 : ScInputHandler* pInputHdl = GetNextInputHandler(pData->GetDocShell(),&pTabViewShell);
214 :
215 0 : if ( pInputHdl == NULL ) //no more InputHandler for DocShell
216 : {
217 0 : disableOk();
218 0 : pInputHdl = pScMod->GetInputHdl();
219 : }
220 : else
221 : {
222 0 : pInputHdl->SetRefViewShell(pTabViewShell);
223 : }
224 0 : pScMod->SetRefInputHdl(pInputHdl);
225 0 : pData->SetInputHandler(pInputHdl);
226 : }
227 :
228 0 : OUString aOldFormulaTmp(pScMod->InputGetFormulaStr());
229 0 : pScMod->InputSetSelection( 0, aOldFormulaTmp.getLength());
230 :
231 0 : rStrExp=pData->GetUndoStr();
232 0 : pScMod->InputReplaceSelection(rStrExp);
233 :
234 0 : SetMeText(rStrExp);
235 :
236 0 : Update();
237 : // switch back, maybe new Doc has been opened
238 0 : pScMod->SetRefInputHdl(NULL);
239 0 : }
240 0 : }
241 :
242 0 : ScFormulaDlg::~ScFormulaDlg()
243 : {
244 0 : disposeOnce();
245 0 : }
246 :
247 0 : void ScFormulaDlg::dispose()
248 : {
249 0 : ScModule* pScMod = SC_MOD();
250 0 : ScFormEditData* pData = pScMod->GetFormEditData();
251 :
252 0 : if (pData) // close dosen't destroy;
253 : {
254 : //set back reference input handler
255 0 : pScMod->SetRefInputHdl(NULL);
256 0 : StoreFormEditData(pData);
257 : }
258 0 : formula::FormulaDlg::dispose();
259 0 : }
260 :
261 0 : bool ScFormulaDlg::IsInputHdl(ScInputHandler* pHdl)
262 : {
263 0 : bool bAlive = false;
264 :
265 : // belongs InputHandler to a ViewShell?
266 :
267 0 : TypeId aScType = TYPE(ScTabViewShell);
268 0 : SfxViewShell* pSh = SfxViewShell::GetFirst( &aScType );
269 0 : while ( pSh && !bAlive )
270 : {
271 0 : if (static_cast<ScTabViewShell*>(pSh)->GetInputHandler() == pHdl)
272 0 : bAlive = true;
273 0 : pSh = SfxViewShell::GetNext( *pSh, &aScType );
274 : }
275 :
276 0 : return bAlive;
277 :
278 : }
279 :
280 0 : ScInputHandler* ScFormulaDlg::GetNextInputHandler(ScDocShell* pDocShell,PtrTabViewShell* ppViewSh)
281 : {
282 0 : ScInputHandler* pHdl=NULL;
283 :
284 0 : SfxViewFrame* pFrame = SfxViewFrame::GetFirst( pDocShell );
285 0 : while( pFrame && pHdl==NULL)
286 : {
287 0 : SfxViewShell* p = pFrame->GetViewShell();
288 0 : ScTabViewShell* pViewSh = PTR_CAST(ScTabViewShell,p);
289 0 : if(pViewSh!=NULL)
290 : {
291 0 : pHdl=pViewSh->GetInputHandler();
292 0 : if(ppViewSh!=NULL) *ppViewSh=pViewSh;
293 : }
294 0 : pFrame = SfxViewFrame::GetNext( *pFrame, pDocShell );
295 : }
296 :
297 0 : return pHdl;
298 : }
299 :
300 0 : bool ScFormulaDlg::Close()
301 : {
302 0 : DoEnter(false);
303 0 : return true;
304 : }
305 :
306 : // functions for right side
307 :
308 0 : bool ScFormulaDlg::calculateValue( const OUString& rStrExp, OUString& rStrResult )
309 : {
310 0 : boost::scoped_ptr<ScSimpleFormulaCalculator> pFCell( new ScSimpleFormulaCalculator( pDoc, aCursorPos, rStrExp ) );
311 :
312 : // HACK! to avoid neither #REF! from ColRowNames
313 : // if a name is added as actually range in the overall formula,
314 : // but is interpreted at the individual representation as single-cell reference
315 0 : bool bColRowName = pFCell->HasColRowName();
316 0 : if ( bColRowName )
317 : {
318 : // ColRowName from RPN-Code?
319 0 : if ( pFCell->GetCode()->GetCodeLen() <= 1 )
320 : { // ==1: area
321 : // ==0: would be an area if...
322 0 : OUStringBuffer aBraced;
323 0 : aBraced.append('(');
324 0 : aBraced.append(rStrExp);
325 0 : aBraced.append(')');
326 0 : pFCell.reset( new ScSimpleFormulaCalculator( pDoc, aCursorPos, aBraced.makeStringAndClear() ) );
327 : }
328 : else
329 0 : bColRowName = false;
330 : }
331 :
332 0 : sal_uInt16 nErrCode = pFCell->GetErrCode();
333 0 : if ( nErrCode == 0 )
334 : {
335 0 : SvNumberFormatter& aFormatter = *(pDoc->GetFormatTable());
336 : Color* pColor;
337 0 : if ( pFCell->IsValue() )
338 : {
339 0 : double n = pFCell->GetValue();
340 : sal_uLong nFormat = aFormatter.GetStandardFormat( n, 0,
341 0 : pFCell->GetFormatType(), ScGlobal::eLnge );
342 : aFormatter.GetOutputString( n, nFormat,
343 0 : rStrResult, &pColor );
344 : }
345 : else
346 : {
347 : sal_uLong nFormat = aFormatter.GetStandardFormat(
348 0 : pFCell->GetFormatType(), ScGlobal::eLnge);
349 : aFormatter.GetOutputString( pFCell->GetString().getString(), nFormat,
350 0 : rStrResult, &pColor );
351 : }
352 :
353 0 : ScRange aTestRange;
354 0 : if ( bColRowName || (aTestRange.Parse(rStrExp) & SCA_VALID) )
355 0 : rStrResult += " ...";
356 : // area
357 : }
358 : else
359 0 : rStrResult += ScGlobal::GetErrorString(nErrCode);
360 :
361 0 : return true;
362 : }
363 :
364 : // virtual methods of ScAnyRefDlg:
365 0 : void ScFormulaDlg::RefInputStart( formula::RefEdit* pEdit, formula::RefButton* pButton )
366 : {
367 0 : pEdit->SetSelection(Selection(0, SELECTION_MAX));
368 0 : ::std::pair<formula::RefButton*,formula::RefEdit*> aPair = RefInputStartBefore( pEdit, pButton );
369 0 : m_aHelper.RefInputStart( aPair.second, aPair.first);
370 0 : RefInputStartAfter( aPair.second, aPair.first );
371 0 : }
372 :
373 0 : void ScFormulaDlg::RefInputDone( bool bForced )
374 : {
375 0 : m_aHelper.RefInputDone( bForced );
376 0 : RefInputDoneAfter( bForced );
377 0 : }
378 :
379 0 : void ScFormulaDlg::SetReference( const ScRange& rRef, ScDocument* pRefDoc )
380 : {
381 0 : const IFunctionDescription* pFunc = getCurrentFunctionDescription();
382 0 : if ( pFunc && pFunc->getSuppressedArgumentCount() > 0 )
383 : {
384 0 : Selection theSel;
385 0 : bool bRefNull = UpdateParaWin(theSel);
386 :
387 0 : if ( rRef.aStart != rRef.aEnd && bRefNull )
388 : {
389 0 : RefInputStart(GetActiveEdit());
390 : }
391 :
392 0 : OUString aRefStr;
393 0 : bool bOtherDoc = ( pRefDoc != pDoc && pRefDoc->GetDocumentShell()->HasName() );
394 0 : if ( bOtherDoc )
395 : {
396 : // reference to other document - wie inputhdl.cxx
397 :
398 : OSL_ENSURE(rRef.aStart.Tab()==rRef.aEnd.Tab(), "nStartTab!=nEndTab");
399 :
400 0 : OUString aTmp(rRef.Format(SCA_VALID|SCA_TAB_3D, pRefDoc)); // immer 3d
401 :
402 0 : SfxObjectShell* pObjSh = pRefDoc->GetDocumentShell();
403 :
404 : // #i75893# convert escaped URL of the document to something user friendly
405 : // OUString aFileName = pObjSh->GetMedium()->GetName();
406 0 : OUString aFileName = pObjSh->GetMedium()->GetURLObject().GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS );
407 :
408 0 : aRefStr = "'";
409 0 : aRefStr += aFileName;
410 0 : aRefStr += "'#";
411 0 : aRefStr += aTmp;
412 : }
413 : else
414 : {
415 : // We can't use ScRange::Format here because in R1C1 mode we need
416 : // to display the reference position relative to the cursor
417 : // position.
418 0 : ScTokenArray aArray;
419 : ScComplexRefData aRefData;
420 0 : aRefData.InitRangeRel(rRef, aCursorPos);
421 0 : bool bSingle = aRefData.Ref1 == aRefData.Ref2;
422 0 : if (aCursorPos.Tab() != rRef.aStart.Tab())
423 0 : aRefData.Ref1.SetFlag3D(true);
424 0 : if (bSingle)
425 0 : aArray.AddSingleReference(aRefData.Ref1);
426 : else
427 0 : aArray.AddDoubleReference(aRefData);
428 0 : ScCompiler aComp(pDoc, aCursorPos, aArray);
429 0 : aComp.SetGrammar(pDoc->GetGrammar());
430 0 : OUStringBuffer aBuf;
431 0 : aComp.CreateStringFromTokenArray(aBuf);
432 0 : aRefStr = aBuf.makeStringAndClear();
433 : }
434 :
435 0 : UpdateParaWin(theSel,aRefStr);
436 : }
437 0 : }
438 :
439 0 : bool ScFormulaDlg::IsRefInputMode() const
440 : {
441 0 : const IFunctionDescription* pDesc = getCurrentFunctionDescription();
442 0 : bool bRef = (pDesc && (pDesc->getSuppressedArgumentCount() > 0)) && (pDoc!=NULL);
443 0 : return bRef;
444 : }
445 :
446 0 : bool ScFormulaDlg::IsDocAllowed(SfxObjectShell* pDocSh) const
447 : {
448 : // not allowed: different from this doc, and no name
449 : // pDocSh is always a ScDocShell
450 0 : if ( pDocSh && &static_cast<ScDocShell*>(pDocSh)->GetDocument() != pDoc && !pDocSh->HasName() )
451 0 : return false;
452 :
453 0 : return true; // everything else is allowed
454 : }
455 :
456 0 : void ScFormulaDlg::SetActive()
457 : {
458 0 : const IFunctionDescription* pFunc = getCurrentFunctionDescription();
459 0 : if ( pFunc && pFunc->getSuppressedArgumentCount() > 0 )
460 : {
461 0 : RefInputDone();
462 0 : SetEdSelection();
463 : }
464 0 : }
465 :
466 0 : void ScFormulaDlg::SaveLRUEntry(const ScFuncDesc* pFuncDescP)
467 : {
468 0 : if (pFuncDescP && pFuncDescP->nFIndex!=0)
469 : {
470 0 : ScModule* pScMod = SC_MOD();
471 0 : pScMod->InsertEntryToLRUList(pFuncDescP->nFIndex);
472 : }
473 0 : }
474 :
475 0 : void ScFormulaDlg::doClose(bool /*_bOk*/)
476 : {
477 0 : m_aHelper.DoClose( ScFormulaDlgWrapper::GetChildWindowId() );
478 0 : }
479 0 : void ScFormulaDlg::insertEntryToLRUList(const formula::IFunctionDescription* _pDesc)
480 : {
481 0 : const ScFuncDesc* pDesc = dynamic_cast<const ScFuncDesc*>(_pDesc);
482 0 : SaveLRUEntry(pDesc);
483 0 : }
484 0 : void ScFormulaDlg::showReference(const OUString& _sFormula)
485 : {
486 0 : ShowReference(_sFormula);
487 0 : }
488 0 : void ScFormulaDlg::ShowReference(const OUString& _sFormula)
489 : {
490 0 : m_aHelper.ShowReference(_sFormula);
491 0 : }
492 0 : void ScFormulaDlg::HideReference( bool bDoneRefMode )
493 : {
494 0 : m_aHelper.HideReference(bDoneRefMode);
495 0 : }
496 0 : void ScFormulaDlg::ViewShellChanged()
497 : {
498 0 : ScFormulaReferenceHelper::ViewShellChanged();
499 0 : }
500 0 : void ScFormulaDlg::AddRefEntry( )
501 : {
502 :
503 0 : }
504 0 : bool ScFormulaDlg::IsTableLocked( ) const
505 : {
506 : // default: reference input can also be used to switch the table
507 0 : return false;
508 : }
509 0 : void ScFormulaDlg::ToggleCollapsed( formula::RefEdit* pEdit, formula::RefButton* pButton)
510 : {
511 0 : m_aHelper.ToggleCollapsed(pEdit,pButton);
512 0 : }
513 0 : void ScFormulaDlg::ReleaseFocus( formula::RefEdit* pEdit, formula::RefButton* pButton)
514 : {
515 0 : m_aHelper.ReleaseFocus(pEdit,pButton);
516 0 : }
517 0 : void ScFormulaDlg::dispatch(bool _bOK, bool _bMatrixChecked)
518 : {
519 0 : SfxBoolItem aRetItem( SID_DLG_RETOK, _bOK );
520 0 : SfxBoolItem aMatItem( SID_DLG_MATRIX, _bMatrixChecked );
521 0 : SfxStringItem aStrItem( SCITEM_STRING, getCurrentFormula() );
522 :
523 : // if edit line is empty (caused by document switching) -> string is empty
524 : // -> don't delete old formula
525 0 : if ( aStrItem.GetValue().isEmpty() )
526 0 : aRetItem.SetValue( false ); // sal_False = Cancel
527 :
528 0 : ScFormulaReferenceHelper::SetDispatcherLock( false ); // turn off modal-mode
529 :
530 0 : clear();
531 :
532 0 : GetBindings().GetDispatcher()->Execute( SID_INS_FUNCTION,
533 : SfxCallMode::ASYNCHRON | SfxCallMode::RECORD,
534 0 : &aRetItem, &aStrItem, &aMatItem, 0L );
535 0 : }
536 0 : void ScFormulaDlg::setDispatcherLock( bool bLock )
537 : {
538 0 : ScFormulaReferenceHelper::SetDispatcherLock( bLock );
539 0 : }
540 0 : void ScFormulaDlg::setReferenceInput(const formula::FormEditData* _pData)
541 : {
542 0 : ScModule* pScMod = SC_MOD();
543 0 : ScFormEditData& rData = const_cast<ScFormEditData&>(dynamic_cast<const ScFormEditData&>(*_pData));
544 0 : pScMod->SetRefInputHdl(rData.GetInputHandler());
545 0 : }
546 0 : void ScFormulaDlg::deleteFormData()
547 : {
548 0 : ScModule* pScMod = SC_MOD();
549 0 : pScMod->ClearFormEditData(); // pData is invalid!
550 0 : }
551 0 : void ScFormulaDlg::clear()
552 : {
553 0 : pDoc = NULL;
554 :
555 : //restore reference inputhandler
556 0 : ScModule* pScMod = SC_MOD();
557 0 : pScMod->SetRefInputHdl(NULL);
558 :
559 : // force Enable() of edit line
560 0 : ScTabViewShell* pScViewShell = PTR_CAST(ScTabViewShell, SfxViewShell::Current());
561 0 : if ( pScViewShell )
562 0 : pScViewShell->UpdateInputHandler();
563 0 : }
564 0 : void ScFormulaDlg::switchBack()
565 : {
566 0 : ScModule* pScMod = SC_MOD();
567 : // back to the document
568 : // (foreign doc could be above - #34222#)
569 0 : ScInputHandler* pHdl = pScMod->GetInputHdl();
570 0 : if ( pHdl )
571 : {
572 0 : pHdl->ViewShellGone(NULL); // -> get active view
573 0 : pHdl->ShowRefFrame();
574 : }
575 :
576 : // restore current chart (cause mouse-RefInput)
577 0 : ScTabViewShell* pScViewShell = PTR_CAST(ScTabViewShell, SfxViewShell::Current());
578 0 : if ( pScViewShell )
579 : {
580 0 : ScViewData& rVD=pScViewShell->GetViewData();
581 0 : SCTAB nExecTab = aCursorPos.Tab();
582 0 : if ( nExecTab != rVD.GetTabNo() )
583 0 : pScViewShell->SetTabNo( nExecTab );
584 :
585 0 : SCROW nRow=aCursorPos.Row();
586 0 : SCCOL nCol=aCursorPos.Col();
587 :
588 0 : if(rVD.GetCurX()!=nCol || rVD.GetCurY()!=nRow)
589 0 : pScViewShell->SetCursor(nCol,nRow);
590 : }
591 0 : }
592 0 : formula::FormEditData* ScFormulaDlg::getFormEditData() const
593 : {
594 0 : ScModule* pScMod = SC_MOD();
595 0 : return pScMod->GetFormEditData();
596 : }
597 0 : void ScFormulaDlg::setCurrentFormula(const OUString& _sReplacement)
598 : {
599 0 : ScModule* pScMod = SC_MOD();
600 : {
601 : //fdo#69971 We need the EditEngine Modification handler of the inputbar that we
602 : //are feeding to be disabled while this dialog is open. Otherwise we end up in
603 : //a situation where...
604 : //a) this ScFormulaDlg changes the editengine
605 : //b) the modify callback gets called
606 : //c) which also modifies the editengine
607 : //d) on return from that modify handler the editengine attempts to use
608 : // old node pointers which were replaced and removed by c
609 : //
610 : //We turn it off in the ctor and back on in the dtor, but if calc has
611 : //to repaint, e.g. when switching to another window and back, then in
612 : //ScMultiTextWnd::Paint a new editengine will have been created via
613 : //GetEditView with its default Modification handler enabled. So ensure
614 : //its off when we will access it via InputReplaceSelection
615 0 : pScMod->InputTurnOffWinEngine();
616 : }
617 0 : pScMod->InputReplaceSelection(_sReplacement);
618 0 : }
619 0 : void ScFormulaDlg::setSelection(sal_Int32 _nStart, sal_Int32 _nEnd)
620 : {
621 0 : ScModule* pScMod = SC_MOD();
622 0 : pScMod->InputSetSelection( _nStart, _nEnd );
623 0 : }
624 0 : void ScFormulaDlg::getSelection(sal_Int32& _nStart, sal_Int32& _nEnd) const
625 : {
626 0 : ScModule* pScMod = SC_MOD();
627 0 : pScMod->InputGetSelection( _nStart, _nEnd );
628 0 : }
629 0 : OUString ScFormulaDlg::getCurrentFormula() const
630 : {
631 0 : ScModule* pScMod = SC_MOD();
632 0 : return pScMod->InputGetFormulaStr();
633 : }
634 0 : formula::IFunctionManager* ScFormulaDlg::getFunctionManager()
635 : {
636 0 : return ScGlobal::GetStarCalcFunctionMgr();
637 : }
638 0 : uno::Reference< sheet::XFormulaParser> ScFormulaDlg::getFormulaParser() const
639 : {
640 0 : return m_xParser;
641 : }
642 0 : uno::Reference< sheet::XFormulaOpCodeMapper> ScFormulaDlg::getFormulaOpCodeMapper() const
643 : {
644 0 : return m_xOpCodeMapper;
645 : }
646 :
647 0 : table::CellAddress ScFormulaDlg::getReferencePosition() const
648 : {
649 0 : return table::CellAddress(aCursorPos.Tab(),aCursorPos.Col(),aCursorPos.Row());
650 : }
651 :
652 0 : ::std::unique_ptr<formula::FormulaTokenArray> ScFormulaDlg::convertToTokenArray(const uno::Sequence< sheet::FormulaToken >& _aTokenList)
653 : {
654 0 : ::std::unique_ptr<formula::FormulaTokenArray> pArray(new ScTokenArray());
655 0 : pArray->Fill(_aTokenList, pDoc->GetSharedStringPool(), pDoc->GetExternalRefManager());
656 0 : return pArray;
657 156 : }
658 :
659 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|