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 "cell.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 : //============================================================================
59 : using namespace formula;
60 : using namespace com::sun::star;
61 :
62 : ScDocument* ScFormulaDlg::pDoc = NULL;
63 5 : ScAddress ScFormulaDlg::aCursorPos;
64 :
65 :
66 :
67 : // --------------------------------------------------------------------------
68 : // Initialisierung / gemeinsame Funktionen fuer Dialog
69 : // --------------------------------------------------------------------------
70 :
71 0 : ScFormulaDlg::ScFormulaDlg( SfxBindings* pB, SfxChildWindow* pCW,
72 : Window* pParent, ScViewData* pViewData,formula::IFunctionManager* _pFunctionMgr )
73 : : formula::FormulaDlg( pB, pCW, pParent, true,true,true, _pFunctionMgr,this)
74 0 : , m_aHelper(this,pB)
75 : {
76 0 : m_aHelper.SetWindow(this);
77 0 : ScModule* pScMod = SC_MOD();
78 0 : pScMod->InputEnterHandler();
79 0 : ScTabViewShell* pScViewShell = NULL;
80 :
81 : // title has to be from the view that opened the dialog,
82 : // even if it's not the current view
83 :
84 0 : if ( pB )
85 : {
86 0 : SfxDispatcher* pMyDisp = pB->GetDispatcher();
87 0 : if (pMyDisp)
88 : {
89 0 : SfxViewFrame* pMyViewFrm = pMyDisp->GetFrame();
90 0 : if (pMyViewFrm)
91 : {
92 0 : pScViewShell = PTR_CAST( ScTabViewShell, pMyViewFrm->GetViewShell() );
93 0 : if( pScViewShell )
94 0 : pScViewShell->UpdateInputHandler(true);
95 : }
96 : }
97 : }
98 :
99 0 : if ( pDoc == NULL )
100 0 : pDoc = pViewData->GetDocument();
101 0 : m_xParser.set(ScServiceProvider::MakeInstance(SC_SERVICE_FORMULAPARS,(ScDocShell*)pDoc->GetDocumentShell()),uno::UNO_QUERY);
102 0 : uno::Reference< beans::XPropertySet> xSet(m_xParser,uno::UNO_QUERY);
103 0 : xSet->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_COMPILEFAP)),uno::makeAny(sal_True));
104 :
105 0 : m_xOpCodeMapper.set(ScServiceProvider::MakeInstance(SC_SERVICE_OPCODEMAPPER,(ScDocShell*)pDoc->GetDocumentShell()),uno::UNO_QUERY);
106 :
107 0 : ScInputHandler* pInputHdl = SC_MOD()->GetInputHdl(pScViewShell);
108 :
109 : OSL_ENSURE( pInputHdl, "Missing input handler :-/" );
110 :
111 0 : if ( pInputHdl )
112 0 : pInputHdl->NotifyChange( NULL );
113 :
114 0 : m_aHelper.enableInput( false );
115 0 : m_aHelper.EnableSpreadsheets();
116 0 : m_aHelper.Init();
117 0 : m_aHelper.SetDispatcherLock( sal_True );
118 :
119 0 : notifyChange();
120 0 : fill();
121 :
122 0 : ScFormEditData* pData = pScMod->GetFormEditData();
123 0 : if (!pData)
124 : {
125 : //Nun wird es Zeit den Inputhandler festzulegen
126 0 : pScMod->SetRefInputHdl(pScMod->GetInputHdl());
127 :
128 0 : pDoc = pViewData->GetDocument();
129 0 : SCCOL nCol = pViewData->GetCurX();
130 0 : SCROW nRow = pViewData->GetCurY();
131 0 : SCTAB nTab = pViewData->GetTabNo();
132 0 : aCursorPos = ScAddress( nCol, nRow, nTab );
133 :
134 0 : pScMod->InitFormEditData(); // neu anlegen
135 0 : pData = pScMod->GetFormEditData();
136 0 : pData->SetInputHandler(pScMod->GetInputHdl());
137 0 : pData->SetDocShell(pViewData->GetDocShell());
138 :
139 : OSL_ENSURE(pData,"FormEditData ist nicht da");
140 :
141 0 : formula::FormulaDlgMode eMode = FORMULA_FORMDLG_FORMULA; // Default...
142 :
143 : // Formel vorhanden? Dann editieren
144 :
145 0 : String aFormula;
146 0 : pDoc->GetFormula( nCol, nRow, nTab, aFormula );
147 0 : sal_Bool bEdit = ( aFormula.Len() > 1 );
148 0 : sal_Bool bMatrix = false;
149 0 : if ( bEdit )
150 : {
151 0 : bMatrix = CheckMatrix(aFormula);
152 :
153 0 : xub_StrLen nFStart = 0;
154 0 : xub_StrLen nFEnd = 0;
155 0 : if ( GetFormulaHelper().GetNextFunc( aFormula, false, nFStart, &nFEnd) )
156 : {
157 0 : pScMod->InputReplaceSelection( aFormula );
158 0 : pScMod->InputSetSelection( nFStart, nFEnd );
159 : xub_StrLen PrivStart, PrivEnd;
160 0 : pScMod->InputGetSelection( PrivStart, PrivEnd);
161 :
162 0 : eMode = SetMeText(pScMod->InputGetFormulaStr(),PrivStart, PrivEnd,bMatrix,sal_True,sal_True);
163 0 : pData->SetFStart( nFStart );
164 : }
165 : else
166 0 : bEdit = false;
167 : }
168 :
169 0 : if ( !bEdit )
170 : {
171 0 : rtl::OUString aNewFormula('=');
172 0 : if ( aFormula.Len() > 0 && aFormula.GetChar(0) == '=' )
173 0 : aNewFormula = aFormula;
174 :
175 0 : pScMod->InputReplaceSelection( aNewFormula );
176 0 : pScMod->InputSetSelection( 1, aNewFormula.getLength()+1 );
177 : xub_StrLen PrivStart, PrivEnd;
178 0 : pScMod->InputGetSelection( PrivStart, PrivEnd);
179 0 : SetMeText(pScMod->InputGetFormulaStr(),PrivStart, PrivEnd,bMatrix,false,false);
180 :
181 0 : pData->SetFStart( 1 ); // hinter dem "="
182 : }
183 :
184 0 : pData->SetMode( (sal_uInt16) eMode );
185 0 : String rStrExp = GetMeText();
186 :
187 0 : pCell = new ScFormulaCell( pDoc, aCursorPos, rStrExp );
188 :
189 0 : Update(rStrExp);
190 0 : }
191 :
192 0 : }
193 :
194 0 : void ScFormulaDlg::notifyChange()
195 : {
196 0 : ScModule* pScMod = SC_MOD();
197 :
198 0 : ScInputHandler* pInputHdl = pScMod->GetInputHdl();
199 0 : if ( pInputHdl )
200 0 : pInputHdl->NotifyChange( NULL );
201 0 : }
202 : // -----------------------------------------------------------------------------
203 0 : void ScFormulaDlg::fill()
204 : {
205 0 : ScModule* pScMod = SC_MOD();
206 0 : ScFormEditData* pData = pScMod->GetFormEditData();
207 0 : notifyChange();
208 0 : String rStrExp;
209 0 : if (pData)
210 : {
211 : // Daten schon vorhanden -> Zustand wiederherstellen (nach Umschalten)
212 : // pDoc und aCursorPos nicht neu initialisieren
213 : //pDoc = pViewData->GetDocument();
214 0 : if(IsInputHdl(pData->GetInputHandler()))
215 : {
216 0 : pScMod->SetRefInputHdl(pData->GetInputHandler());
217 : }
218 : else
219 : {
220 : PtrTabViewShell pTabViewShell;
221 0 : ScInputHandler* pInputHdl = GetNextInputHandler(pData->GetDocShell(),&pTabViewShell);
222 :
223 0 : if ( pInputHdl == NULL ) //DocShell hat keinen InputHandler mehr,
224 : { //hat der Anwender halt Pech gehabt.
225 0 : disableOk();
226 0 : pInputHdl = pScMod->GetInputHdl();
227 : }
228 : else
229 : {
230 0 : pInputHdl->SetRefViewShell(pTabViewShell);
231 : }
232 0 : pScMod->SetRefInputHdl(pInputHdl);
233 0 : pData->SetInputHandler(pInputHdl);
234 : }
235 :
236 0 : String aOldFormulaTmp(pScMod->InputGetFormulaStr());
237 0 : pScMod->InputSetSelection( 0, aOldFormulaTmp.Len());
238 :
239 0 : rStrExp=pData->GetUndoStr();
240 0 : pScMod->InputReplaceSelection(rStrExp);
241 :
242 0 : SetMeText(rStrExp);
243 :
244 0 : pCell = new ScFormulaCell( pDoc, aCursorPos, rStrExp );
245 :
246 0 : Update();
247 : // Jetzt nochmals zurueckschalten, da evtl. neues Doc geoeffnet wurde!
248 0 : pScMod->SetRefInputHdl(NULL);
249 0 : }
250 0 : }
251 :
252 0 : ScFormulaDlg::~ScFormulaDlg()
253 : {
254 0 : ScModule* pScMod = SC_MOD();
255 0 : ScFormEditData* pData = pScMod->GetFormEditData();
256 :
257 0 : if (pData) // wird nicht ueber Close zerstoert;
258 : {
259 : //Referenz Inputhandler zuruecksetzen
260 0 : pScMod->SetRefInputHdl(NULL);
261 0 : StoreFormEditData(pData);
262 : } // if (pData) // wird nicht ueber Close zerstoert;
263 :
264 0 : delete pCell;
265 0 : }
266 :
267 0 : sal_Bool ScFormulaDlg::IsInputHdl(ScInputHandler* pHdl)
268 : {
269 0 : sal_Bool bAlive = false;
270 :
271 : // gehoert der InputHandler zu irgendeiner ViewShell ?
272 :
273 0 : TypeId aScType = TYPE(ScTabViewShell);
274 0 : SfxViewShell* pSh = SfxViewShell::GetFirst( &aScType );
275 0 : while ( pSh && !bAlive )
276 : {
277 0 : if (((ScTabViewShell*)pSh)->GetInputHandler() == pHdl)
278 0 : bAlive = sal_True;
279 0 : pSh = SfxViewShell::GetNext( *pSh, &aScType );
280 : }
281 :
282 0 : return bAlive;
283 :
284 : }
285 :
286 0 : ScInputHandler* ScFormulaDlg::GetNextInputHandler(ScDocShell* pDocShell,PtrTabViewShell* ppViewSh)
287 : {
288 0 : ScInputHandler* pHdl=NULL;
289 :
290 0 : SfxViewFrame* pFrame = SfxViewFrame::GetFirst( pDocShell );
291 0 : while( pFrame && pHdl==NULL)
292 : {
293 0 : SfxViewShell* p = pFrame->GetViewShell();
294 0 : ScTabViewShell* pViewSh = PTR_CAST(ScTabViewShell,p);
295 0 : if(pViewSh!=NULL)
296 : {
297 0 : pHdl=pViewSh->GetInputHandler();
298 0 : if(ppViewSh!=NULL) *ppViewSh=pViewSh;
299 : }
300 0 : pFrame = SfxViewFrame::GetNext( *pFrame, pDocShell );
301 : }
302 :
303 :
304 0 : return pHdl;
305 : }
306 :
307 :
308 0 : sal_Bool ScFormulaDlg::Close()
309 : {
310 0 : DoEnter(false);
311 0 : return sal_True;
312 : }
313 :
314 : // --------------------------------------------------------------------------
315 : // Funktionen fuer rechte Seite
316 : // --------------------------------------------------------------------------
317 0 : bool ScFormulaDlg::calculateValue( const String& rStrExp, String& rStrResult )
318 : {
319 0 : sal_Bool bResult = sal_True;
320 :
321 : SAL_WNODEPRECATED_DECLARATIONS_PUSH
322 0 : ::std::auto_ptr<ScFormulaCell> pFCell( new ScFormulaCell( pDoc, aCursorPos, rStrExp ) );
323 : SAL_WNODEPRECATED_DECLARATIONS_POP
324 :
325 : // HACK! um bei ColRowNames kein #REF! zu bekommen,
326 : // wenn ein Name eigentlich als Bereich in die Gesamt-Formel
327 : // eingefuegt wird, bei der Einzeldarstellung aber als
328 : // single-Zellbezug interpretiert wird
329 0 : sal_Bool bColRowName = pCell->HasColRowName();
330 0 : if ( bColRowName )
331 : {
332 : // ColRowName im RPN-Code?
333 0 : if ( pCell->GetCode()->GetCodeLen() <= 1 )
334 : { // ==1: einzelner ist als Parameter immer Bereich
335 : // ==0: es waere vielleicht einer, wenn..
336 0 : rtl::OUStringBuffer aBraced;
337 0 : aBraced.append('(');
338 0 : aBraced.append(rStrExp);
339 0 : aBraced.append(')');
340 0 : pFCell.reset( new ScFormulaCell( pDoc, aCursorPos, aBraced.makeStringAndClear() ) );
341 : }
342 : else
343 0 : bColRowName = false;
344 : }
345 :
346 0 : sal_uInt16 nErrCode = pFCell->GetErrCode();
347 0 : if ( nErrCode == 0 )
348 : {
349 0 : SvNumberFormatter& aFormatter = *(pDoc->GetFormatTable());
350 : Color* pColor;
351 0 : if ( pFCell->IsValue() )
352 : {
353 0 : double n = pFCell->GetValue();
354 : sal_uLong nFormat = aFormatter.GetStandardFormat( n, 0,
355 0 : pFCell->GetFormatType(), ScGlobal::eLnge );
356 : aFormatter.GetOutputString( n, nFormat,
357 0 : rStrResult, &pColor );
358 : }
359 : else
360 : {
361 0 : OUString aStr = pFCell->GetString();
362 0 : OUString sTempOut(rStrResult);
363 : sal_uLong nFormat = aFormatter.GetStandardFormat(
364 0 : pFCell->GetFormatType(), ScGlobal::eLnge);
365 : aFormatter.GetOutputString( aStr, nFormat,
366 0 : sTempOut, &pColor );
367 0 : rStrResult = sTempOut;
368 : }
369 :
370 0 : ScRange aTestRange;
371 0 : if ( bColRowName || (aTestRange.Parse(rStrExp) & SCA_VALID) )
372 0 : rStrResult.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " ..." ));
373 : // Bereich
374 : }
375 : else
376 0 : rStrResult += ScGlobal::GetErrorString(nErrCode);
377 :
378 0 : if(!isUserMatrix() && pFCell->GetMatrixFlag())
379 : {
380 0 : CheckMatrix();
381 : }
382 :
383 0 : return bResult;
384 : }
385 :
386 :
387 :
388 : // virtuelle Methoden von ScAnyRefDlg:
389 0 : void ScFormulaDlg::RefInputStart( formula::RefEdit* pEdit, formula::RefButton* pButton )
390 : {
391 0 : pEdit->SetSelection(Selection(0, SELECTION_MAX));
392 0 : ::std::pair<formula::RefButton*,formula::RefEdit*> aPair = RefInputStartBefore( pEdit, pButton );
393 0 : m_aHelper.RefInputStart( aPair.second, aPair.first);
394 0 : RefInputStartAfter( aPair.second, aPair.first );
395 0 : }
396 0 : void ScFormulaDlg::RefInputDone( sal_Bool bForced )
397 : {
398 0 : m_aHelper.RefInputDone( bForced );
399 0 : RefInputDoneAfter( bForced );
400 0 : }
401 :
402 0 : void ScFormulaDlg::SetReference( const ScRange& rRef, ScDocument* pRefDoc )
403 : {
404 0 : const IFunctionDescription* pFunc = getCurrentFunctionDescription();
405 0 : if ( pFunc && pFunc->getSuppressedArgumentCount() > 0 )
406 : {
407 0 : Selection theSel;
408 0 : sal_Bool bRefNull = UpdateParaWin(theSel);
409 :
410 0 : if ( rRef.aStart != rRef.aEnd && bRefNull )
411 : {
412 0 : RefInputStart(GetActiveEdit());
413 : }
414 :
415 0 : String aRefStr;
416 0 : sal_Bool bOtherDoc = ( pRefDoc != pDoc && pRefDoc->GetDocumentShell()->HasName() );
417 0 : if ( bOtherDoc )
418 : {
419 : // Referenz auf anderes Dokument - wie inputhdl.cxx
420 :
421 : OSL_ENSURE(rRef.aStart.Tab()==rRef.aEnd.Tab(), "nStartTab!=nEndTab");
422 :
423 0 : String aTmp;
424 0 : rRef.Format( aTmp, SCA_VALID|SCA_TAB_3D, pRefDoc ); // immer 3d
425 :
426 0 : SfxObjectShell* pObjSh = pRefDoc->GetDocumentShell();
427 :
428 : // #i75893# convert escaped URL of the document to something user friendly
429 : // String aFileName = pObjSh->GetMedium()->GetName();
430 0 : String aFileName = pObjSh->GetMedium()->GetURLObject().GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS );
431 :
432 0 : aRefStr = '\'';
433 0 : aRefStr += aFileName;
434 0 : aRefStr.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "'#" ));
435 0 : aRefStr += aTmp;
436 : }
437 : else
438 : {
439 : // We can't use ScRange::Format here because in R1C1 mode we need
440 : // to display the reference position relative to the cursor
441 : // position.
442 0 : ScTokenArray aArray;
443 : ScComplexRefData aRefData;
444 0 : aRefData.InitRangeRel(rRef, aCursorPos);
445 0 : bool bSingle = aRefData.Ref1 == aRefData.Ref2;
446 0 : if (aCursorPos.Tab() != rRef.aStart.Tab())
447 0 : aRefData.Ref1.SetFlag3D(true);
448 0 : if (bSingle)
449 0 : aArray.AddSingleReference(aRefData.Ref1);
450 : else
451 0 : aArray.AddDoubleReference(aRefData);
452 0 : ScCompiler aComp(pDoc, aCursorPos, aArray);
453 0 : aComp.SetGrammar(pDoc->GetGrammar());
454 0 : ::rtl::OUStringBuffer aBuf;
455 0 : aComp.CreateStringFromTokenArray(aBuf);
456 0 : aRefStr = aBuf.makeStringAndClear();
457 : }
458 :
459 0 : UpdateParaWin(theSel,aRefStr);
460 : }
461 0 : }
462 :
463 0 : sal_Bool ScFormulaDlg::IsRefInputMode() const
464 : {
465 0 : const IFunctionDescription* pDesc = getCurrentFunctionDescription();
466 0 : sal_Bool bRef = (pDesc && (pDesc->getSuppressedArgumentCount() > 0)) && (pDoc!=NULL);
467 0 : return bRef;
468 : }
469 :
470 0 : sal_Bool ScFormulaDlg::IsDocAllowed(SfxObjectShell* pDocSh) const
471 : {
472 : // not allowed: different from this doc, and no name
473 : // pDocSh is always a ScDocShell
474 0 : if ( pDocSh && ((ScDocShell*)pDocSh)->GetDocument() != pDoc && !pDocSh->HasName() )
475 0 : return false;
476 :
477 0 : return sal_True; // everything else is allowed
478 : }
479 :
480 0 : void ScFormulaDlg::SetActive()
481 : {
482 0 : const IFunctionDescription* pFunc = getCurrentFunctionDescription();
483 0 : if ( pFunc && pFunc->getSuppressedArgumentCount() > 0 )
484 : {
485 0 : RefInputDone();
486 0 : SetEdSelection();
487 : }
488 0 : }
489 :
490 0 : void ScFormulaDlg::SaveLRUEntry(const ScFuncDesc* pFuncDescP)
491 : {
492 0 : if (pFuncDescP && pFuncDescP->nFIndex!=0)
493 : {
494 0 : ScModule* pScMod = SC_MOD();
495 0 : pScMod->InsertEntryToLRUList(pFuncDescP->nFIndex);
496 : }
497 0 : }
498 :
499 0 : void ScFormulaDlg::doClose(sal_Bool /*_bOk*/)
500 : {
501 0 : m_aHelper.DoClose( ScFormulaDlgWrapper::GetChildWindowId() );
502 0 : }
503 0 : void ScFormulaDlg::insertEntryToLRUList(const formula::IFunctionDescription* _pDesc)
504 : {
505 0 : const ScFuncDesc* pDesc = dynamic_cast<const ScFuncDesc*>(_pDesc);
506 0 : SaveLRUEntry(pDesc);
507 0 : }
508 0 : void ScFormulaDlg::showReference(const String& _sFormula)
509 : {
510 0 : ShowReference(_sFormula);
511 0 : }
512 0 : void ScFormulaDlg::ShowReference(const String& _sFormula)
513 : {
514 0 : m_aHelper.ShowReference(_sFormula);
515 0 : }
516 0 : void ScFormulaDlg::HideReference( sal_Bool bDoneRefMode )
517 : {
518 0 : m_aHelper.HideReference(bDoneRefMode);
519 0 : }
520 0 : void ScFormulaDlg::ViewShellChanged()
521 : {
522 0 : m_aHelper.ViewShellChanged();
523 0 : }
524 0 : void ScFormulaDlg::AddRefEntry( )
525 : {
526 :
527 0 : }
528 0 : sal_Bool ScFormulaDlg::IsTableLocked( ) const
529 : {
530 : // per Default kann bei Referenzeingabe auch die Tabelle umgeschaltet werden
531 0 : return false;
532 : }
533 0 : void ScFormulaDlg::ToggleCollapsed( formula::RefEdit* pEdit, formula::RefButton* pButton)
534 : {
535 0 : m_aHelper.ToggleCollapsed(pEdit,pButton);
536 0 : }
537 0 : void ScFormulaDlg::ReleaseFocus( formula::RefEdit* pEdit, formula::RefButton* pButton)
538 : {
539 0 : m_aHelper.ReleaseFocus(pEdit,pButton);
540 0 : }
541 0 : void ScFormulaDlg::dispatch(sal_Bool _bOK,sal_Bool _bMartixChecked)
542 : {
543 0 : SfxBoolItem aRetItem( SID_DLG_RETOK, _bOK );
544 0 : SfxBoolItem aMatItem( SID_DLG_MATRIX, _bMartixChecked );
545 0 : SfxStringItem aStrItem( SCITEM_STRING, getCurrentFormula() );
546 :
547 : // Wenn durch Dokument-Umschalterei die Eingabezeile weg war/ist,
548 : // ist der String leer. Dann nicht die alte Formel loeschen.
549 0 : if ( !aStrItem.GetValue().Len() )
550 0 : aRetItem.SetValue( false ); // sal_False = Cancel
551 :
552 0 : m_aHelper.SetDispatcherLock( false ); // Modal-Modus ausschalten
553 :
554 0 : clear();
555 :
556 0 : GetBindings().GetDispatcher()->Execute( SID_INS_FUNCTION,
557 : SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD,
558 0 : &aRetItem, &aStrItem, &aMatItem, 0L );
559 0 : }
560 0 : void ScFormulaDlg::setDispatcherLock( sal_Bool bLock )
561 : {
562 0 : m_aHelper.SetDispatcherLock( bLock );
563 0 : }
564 0 : void ScFormulaDlg::setReferenceInput(const formula::FormEditData* _pData)
565 : {
566 0 : ScModule* pScMod = SC_MOD();
567 0 : ScFormEditData* pData = const_cast<ScFormEditData*>(dynamic_cast<const ScFormEditData*>(_pData));
568 0 : pScMod->SetRefInputHdl(pData->GetInputHandler());
569 0 : }
570 0 : void ScFormulaDlg::deleteFormData()
571 : {
572 0 : ScModule* pScMod = SC_MOD();
573 0 : pScMod->ClearFormEditData(); // pData wird ungueltig!
574 0 : }
575 0 : void ScFormulaDlg::clear()
576 : {
577 0 : pDoc = NULL;
578 :
579 : //Referenz Inputhandler zuruecksetzen
580 0 : ScModule* pScMod = SC_MOD();
581 0 : pScMod->SetRefInputHdl(NULL);
582 :
583 : // Enable() der Eingabezeile erzwingen:
584 0 : ScTabViewShell* pScViewShell = PTR_CAST(ScTabViewShell, SfxViewShell::Current());
585 0 : if ( pScViewShell )
586 0 : pScViewShell->UpdateInputHandler();
587 0 : }
588 0 : void ScFormulaDlg::switchBack()
589 : {
590 0 : ScModule* pScMod = SC_MOD();
591 : // auf das Dokument zurueckschalten
592 : // (noetig, weil ein fremdes oben sein kann - #34222#)
593 0 : ScInputHandler* pHdl = pScMod->GetInputHdl();
594 0 : if ( pHdl )
595 : {
596 0 : pHdl->ViewShellGone(NULL); // -> aktive View neu holen
597 0 : pHdl->ShowRefFrame();
598 : }
599 :
600 : // aktuelle Tabelle ggF. restaurieren (wg. Maus-RefInput)
601 0 : ScTabViewShell* pScViewShell = PTR_CAST(ScTabViewShell, SfxViewShell::Current());
602 0 : if ( pScViewShell )
603 : {
604 0 : ScViewData* pVD=pScViewShell->GetViewData();
605 0 : SCTAB nExecTab = aCursorPos.Tab();
606 0 : if ( nExecTab != pVD->GetTabNo() )
607 0 : pScViewShell->SetTabNo( nExecTab );
608 :
609 0 : SCROW nRow=aCursorPos.Row();
610 0 : SCCOL nCol=aCursorPos.Col();
611 :
612 0 : if(pVD->GetCurX()!=nCol || pVD->GetCurY()!=nRow)
613 0 : pScViewShell->SetCursor(nCol,nRow);
614 : }
615 0 : }
616 0 : formula::FormEditData* ScFormulaDlg::getFormEditData() const
617 : {
618 0 : ScModule* pScMod = SC_MOD();
619 0 : return pScMod->GetFormEditData();
620 : }
621 0 : void ScFormulaDlg::setCurrentFormula(const String& _sReplacement)
622 : {
623 0 : ScModule* pScMod = SC_MOD();
624 0 : pScMod->InputReplaceSelection(_sReplacement);
625 0 : }
626 0 : void ScFormulaDlg::setSelection(xub_StrLen _nStart,xub_StrLen _nEnd)
627 : {
628 0 : ScModule* pScMod = SC_MOD();
629 0 : pScMod->InputSetSelection( _nStart, _nEnd );
630 0 : }
631 0 : void ScFormulaDlg::getSelection(xub_StrLen& _nStart,xub_StrLen& _nEnd) const
632 : {
633 0 : ScModule* pScMod = SC_MOD();
634 0 : pScMod->InputGetSelection( _nStart, _nEnd );
635 0 : }
636 0 : String ScFormulaDlg::getCurrentFormula() const
637 : {
638 0 : ScModule* pScMod = SC_MOD();
639 0 : return pScMod->InputGetFormulaStr();
640 : }
641 0 : formula::IFunctionManager* ScFormulaDlg::getFunctionManager()
642 : {
643 0 : return ScGlobal::GetStarCalcFunctionMgr();
644 : }
645 0 : uno::Reference< sheet::XFormulaParser> ScFormulaDlg::getFormulaParser() const
646 : {
647 0 : return m_xParser;
648 : }
649 0 : uno::Reference< sheet::XFormulaOpCodeMapper> ScFormulaDlg::getFormulaOpCodeMapper() const
650 : {
651 0 : return m_xOpCodeMapper;
652 : }
653 :
654 0 : table::CellAddress ScFormulaDlg::getReferencePosition() const
655 : {
656 0 : return table::CellAddress(aCursorPos.Tab(),aCursorPos.Col(),aCursorPos.Row());
657 : }
658 :
659 : SAL_WNODEPRECATED_DECLARATIONS_PUSH
660 0 : ::std::auto_ptr<formula::FormulaTokenArray> ScFormulaDlg::convertToTokenArray(const uno::Sequence< sheet::FormulaToken >& _aTokenList)
661 : {
662 0 : ::std::auto_ptr<formula::FormulaTokenArray> pArray(new ScTokenArray());
663 0 : pArray->Fill( _aTokenList, pDoc->GetExternalRefManager());
664 0 : return pArray;
665 : }
666 15 : SAL_WNODEPRECATED_DECLARATIONS_POP
667 :
668 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|