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 <svl/stritem.hxx>
22 : #include <svl/whiter.hxx>
23 : #include <svl/zformat.hxx>
24 : #include <editeng/boxitem.hxx>
25 : #include <svx/numinf.hxx>
26 : #include <svl/srchitem.hxx>
27 : #include <svx/zoomslideritem.hxx>
28 : #include <sfx2/bindings.hxx>
29 : #include <sfx2/viewfrm.hxx>
30 : #include <sfx2/dispatch.hxx>
31 : #include <sfx2/request.hxx>
32 : #include <vcl/msgbox.hxx>
33 :
34 : #include "global.hxx"
35 : #include "attrib.hxx"
36 : #include "patattr.hxx"
37 : #include "document.hxx"
38 : #include "cell.hxx" // Input Status Edit-Zellen
39 : #include "globstr.hrc"
40 : #include "scmod.hxx"
41 : #include "inputhdl.hxx"
42 : #include "inputwin.hxx"
43 : #include "docsh.hxx"
44 : #include "viewdata.hxx"
45 : #include "appoptio.hxx"
46 : #include "sc.hrc"
47 : #include "stlpool.hxx"
48 : #include "tabvwsh.hxx"
49 : #include "dwfunctr.hxx"
50 : #include "scabstdlg.hxx"
51 : #include "compiler.hxx"
52 : #include "markdata.hxx"
53 :
54 :
55 0 : sal_Bool ScTabViewShell::GetFunction( String& rFuncStr, sal_uInt16 nErrCode )
56 : {
57 0 : String aStr;
58 :
59 0 : ScSubTotalFunc eFunc = (ScSubTotalFunc) SC_MOD()->GetAppOptions().GetStatusFunc();
60 0 : ScViewData* pViewData = GetViewData();
61 0 : ScMarkData& rMark = pViewData->GetMarkData();
62 0 : bool bIgnoreError = (rMark.IsMarked() || rMark.IsMultiMarked());
63 :
64 0 : if (bIgnoreError && (eFunc == SUBTOTAL_FUNC_CNT || eFunc == SUBTOTAL_FUNC_CNT2))
65 0 : nErrCode = 0;
66 :
67 0 : if (nErrCode)
68 : {
69 0 : rFuncStr = ScGlobal::GetLongErrorString(nErrCode);
70 0 : return true;
71 : }
72 :
73 0 : sal_uInt16 nGlobStrId = 0;
74 0 : switch (eFunc)
75 : {
76 0 : case SUBTOTAL_FUNC_AVE: nGlobStrId = STR_FUN_TEXT_AVG; break;
77 0 : case SUBTOTAL_FUNC_CNT: nGlobStrId = STR_FUN_TEXT_COUNT; break;
78 0 : case SUBTOTAL_FUNC_CNT2: nGlobStrId = STR_FUN_TEXT_COUNT2; break;
79 0 : case SUBTOTAL_FUNC_MAX: nGlobStrId = STR_FUN_TEXT_MAX; break;
80 0 : case SUBTOTAL_FUNC_MIN: nGlobStrId = STR_FUN_TEXT_MIN; break;
81 0 : case SUBTOTAL_FUNC_SUM: nGlobStrId = STR_FUN_TEXT_SUM; break;
82 : default:
83 : {
84 : // added to avoid warnings
85 : }
86 : }
87 0 : if (nGlobStrId)
88 : {
89 0 : ScDocument* pDoc = pViewData->GetDocument();
90 0 : SCCOL nPosX = pViewData->GetCurX();
91 0 : SCROW nPosY = pViewData->GetCurY();
92 0 : SCTAB nTab = pViewData->GetTabNo();
93 :
94 0 : aStr = ScGlobal::GetRscString(nGlobStrId);
95 0 : aStr += '=';
96 :
97 0 : ScAddress aCursor( nPosX, nPosY, nTab );
98 : double nVal;
99 0 : if ( pDoc->GetSelectionFunction( eFunc, aCursor, rMark, nVal ) )
100 : {
101 0 : if ( nVal == 0.0 )
102 0 : aStr += '0';
103 : else
104 : {
105 : // Anzahl im Standardformat, die anderen nach Cursorposition
106 0 : SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
107 0 : sal_uInt32 nNumFmt = 0;
108 0 : if ( eFunc != SUBTOTAL_FUNC_CNT && eFunc != SUBTOTAL_FUNC_CNT2 )
109 : {
110 : // Zahlformat aus Attributen oder Formel
111 0 : pDoc->GetNumberFormat( nPosX, nPosY, nTab, nNumFmt );
112 0 : if ( (nNumFmt % SV_COUNTRY_LANGUAGE_OFFSET) == 0 )
113 : {
114 : ScBaseCell* pCell;
115 0 : pDoc->GetCell( nPosX, nPosY, nTab, pCell );
116 0 : if (pCell && pCell->GetCellType() == CELLTYPE_FORMULA)
117 : {
118 :
119 0 : nNumFmt = ((ScFormulaCell*)pCell)->GetStandardFormat(*pFormatter, nNumFmt );
120 : }
121 : }
122 : }
123 :
124 0 : String aValStr;
125 : Color* pDummy;
126 0 : pFormatter->GetOutputString( nVal, nNumFmt, aValStr, &pDummy );
127 0 : aStr += aValStr;
128 : }
129 : }
130 :
131 0 : rFuncStr = aStr;
132 0 : return sal_True;
133 : }
134 :
135 0 : return false;
136 : }
137 :
138 :
139 :
140 : // Funktionen, die je nach Selektion disabled sind
141 : // Default:
142 : // SID_DELETE,
143 : // SID_DELETE_CONTENTS,
144 : // FID_DELETE_CELL
145 : // FID_VALIDATION
146 :
147 :
148 0 : void ScTabViewShell::GetState( SfxItemSet& rSet )
149 : {
150 0 : ScViewData* pViewData = GetViewData();
151 0 : ScDocument* pDoc = pViewData->GetDocument();
152 0 : ScDocShell* pDocShell = pViewData->GetDocShell();
153 0 : ScMarkData& rMark = pViewData->GetMarkData();
154 0 : SCCOL nPosX = pViewData->GetCurX();
155 0 : SCROW nPosY = pViewData->GetCurY();
156 0 : SCTAB nTab = pViewData->GetTabNo();
157 0 : sal_uInt16 nMyId = 0;
158 :
159 0 : SfxViewFrame* pThisFrame = GetViewFrame();
160 0 : sal_Bool bOle = GetViewFrame()->GetFrame().IsInPlace();
161 :
162 0 : SCTAB nTabCount = pDoc->GetTableCount();
163 0 : SCTAB nTabSelCount = rMark.GetSelectCount();
164 :
165 0 : SfxWhichIter aIter(rSet);
166 0 : sal_uInt16 nWhich = aIter.FirstWhich();
167 :
168 0 : while ( nWhich )
169 : {
170 0 : switch ( nWhich )
171 : {
172 : case FID_CHG_COMMENT:
173 : {
174 0 : ScDocShell* pDocSh = GetViewData()->GetDocShell();
175 0 : ScAddress aPos( nPosX, nPosY, nTab );
176 0 : if ( pDocSh->IsReadOnly() || !pDocSh->GetChangeAction(aPos) || pDocSh->IsDocShared() )
177 0 : rSet.DisableItem( nWhich );
178 : }
179 0 : break;
180 :
181 : case SID_OPENDLG_EDIT_PRINTAREA:
182 : case SID_ADD_PRINTAREA:
183 : case SID_DEFINE_PRINTAREA:
184 : {
185 0 : if ( pDocShell && pDocShell->IsDocShared() )
186 : {
187 0 : rSet.DisableItem( nWhich );
188 : }
189 : }
190 0 : break;
191 :
192 : case SID_DELETE_PRINTAREA:
193 0 : if ( nTabSelCount > 1 )
194 : {
195 : // #i22589# also take "Print Entire Sheet" into account here
196 0 : sal_Bool bHas = false;
197 0 : for (SCTAB i=0; !bHas && i<nTabCount; i++)
198 0 : bHas = rMark.GetTableSelect(i) && (pDoc->GetPrintRangeCount(i) || pDoc->IsPrintEntireSheet(i));
199 0 : if (!bHas)
200 0 : rSet.DisableItem( nWhich );
201 : }
202 0 : else if ( !pDoc->GetPrintRangeCount( nTab ) && !pDoc->IsPrintEntireSheet( nTab ) )
203 0 : rSet.DisableItem( nWhich );
204 0 : if ( pDocShell && pDocShell->IsDocShared() )
205 : {
206 0 : rSet.DisableItem( nWhich );
207 : }
208 0 : break;
209 :
210 : case SID_STATUS_PAGESTYLE:
211 : case SID_HFEDIT:
212 0 : GetViewData()->GetDocShell()->GetStatePageStyle( *this, rSet, nTab );
213 0 : break;
214 :
215 : case SID_SEARCH_ITEM:
216 : {
217 0 : SvxSearchItem aItem(ScGlobal::GetSearchItem()); // make a copy.
218 : // Search on current selection if a range is marked.
219 0 : aItem.SetSelection(rMark.IsMarked());
220 0 : rSet.Put(aItem);
221 0 : break;
222 : }
223 :
224 : case SID_SEARCH_OPTIONS:
225 : {
226 0 : sal_uInt16 nOptions = 0xffff; // alles erlaubt
227 : // wenn ReadOnly, kein Ersetzen:
228 0 : if (GetViewData()->GetDocShell()->IsReadOnly())
229 0 : nOptions &= ~( SEARCH_OPTIONS_REPLACE | SEARCH_OPTIONS_REPLACE_ALL );
230 0 : rSet.Put( SfxUInt16Item( nWhich, nOptions ) );
231 : }
232 0 : break;
233 :
234 : case SID_CURRENTCELL:
235 : {
236 0 : ScAddress aScAddress( GetViewData()->GetCurX(), GetViewData()->GetCurY(), 0 );
237 0 : String aAddr;
238 0 : aScAddress.Format( aAddr, SCA_ABS, NULL, pDoc->GetAddressConvention() );
239 0 : SfxStringItem aPosItem( SID_CURRENTCELL, aAddr );
240 :
241 0 : rSet.Put( aPosItem );
242 : }
243 0 : break;
244 :
245 : case SID_CURRENTTAB:
246 : // Tabelle fuer Basic ist 1-basiert
247 0 : rSet.Put( SfxUInt16Item( nWhich, static_cast<sal_uInt16>(GetViewData()->GetTabNo()) + 1 ) );
248 0 : break;
249 :
250 : case SID_CURRENTDOC:
251 0 : rSet.Put( SfxStringItem( nWhich, GetViewData()->GetDocShell()->GetTitle() ) );
252 0 : break;
253 :
254 : case FID_TOGGLEINPUTLINE:
255 : {
256 0 : sal_uInt16 nId = ScInputWindowWrapper::GetChildWindowId();
257 :
258 0 : if ( pThisFrame->KnowsChildWindow( nId ) )
259 : {
260 0 : SfxChildWindow* pWnd = pThisFrame->GetChildWindow( nId );
261 0 : rSet.Put( SfxBoolItem( nWhich, pWnd ? sal_True : false ) );
262 : }
263 : else
264 0 : rSet.DisableItem( nWhich );
265 : }
266 0 : break;
267 :
268 : case FID_DEL_MANUALBREAKS:
269 0 : if (!pDoc->HasManualBreaks(nTab))
270 0 : rSet.DisableItem( nWhich );
271 0 : break;
272 :
273 : case FID_RESET_PRINTZOOM:
274 : {
275 : // disablen, wenn schon Default eingestellt
276 :
277 0 : String aStyleName = pDoc->GetPageStyle( nTab );
278 0 : ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool();
279 : SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aStyleName,
280 0 : SFX_STYLE_FAMILY_PAGE );
281 : OSL_ENSURE( pStyleSheet, "PageStyle not found" );
282 0 : if ( pStyleSheet )
283 : {
284 0 : SfxItemSet& rStyleSet = pStyleSheet->GetItemSet();
285 : sal_uInt16 nScale = ((const SfxUInt16Item&)
286 0 : rStyleSet.Get(ATTR_PAGE_SCALE)).GetValue();
287 : sal_uInt16 nPages = ((const SfxUInt16Item&)
288 0 : rStyleSet.Get(ATTR_PAGE_SCALETOPAGES)).GetValue();
289 0 : if ( nScale == 100 && nPages == 0 )
290 0 : rSet.DisableItem( nWhich );
291 0 : }
292 : }
293 0 : break;
294 :
295 : case FID_SCALE:
296 : case SID_ATTR_ZOOM:
297 0 : if ( bOle )
298 0 : rSet.DisableItem( nWhich );
299 : else
300 : {
301 0 : const Fraction& rOldY = GetViewData()->GetZoomY();
302 0 : sal_uInt16 nZoom = (sal_uInt16)(( rOldY.GetNumerator() * 100 )
303 0 : / rOldY.GetDenominator());
304 0 : rSet.Put( SvxZoomItem( SVX_ZOOM_PERCENT, nZoom, nWhich ) );
305 : }
306 0 : break;
307 :
308 : case SID_ATTR_ZOOMSLIDER:
309 : {
310 0 : if ( bOle )
311 0 : rSet.DisableItem( nWhich );
312 : else
313 : {
314 0 : const Fraction& rOldY = GetViewData()->GetZoomY();
315 0 : sal_uInt16 nCurrentZoom = (sal_uInt16)(( rOldY.GetNumerator() * 100 ) / rOldY.GetDenominator());
316 :
317 0 : if( nCurrentZoom )
318 : {
319 0 : SvxZoomSliderItem aZoomSliderItem( nCurrentZoom, MINZOOM, MAXZOOM, SID_ATTR_ZOOMSLIDER );
320 0 : aZoomSliderItem.AddSnappingPoint( 100 );
321 0 : rSet.Put( aZoomSliderItem );
322 : }
323 : }
324 : }
325 0 : break;
326 :
327 : case FID_TOGGLESYNTAX:
328 0 : rSet.Put(SfxBoolItem(nWhich, GetViewData()->IsSyntaxMode()));
329 0 : break;
330 :
331 : case FID_TOGGLEHEADERS:
332 0 : rSet.Put(SfxBoolItem(nWhich, GetViewData()->IsHeaderMode()));
333 0 : break;
334 :
335 : case FID_TOGGLEFORMULA:
336 : {
337 0 : const ScViewOptions& rOpts = pViewData->GetOptions();
338 0 : sal_Bool bFormulaMode = rOpts.GetOption( VOPT_FORMULAS );
339 0 : rSet.Put(SfxBoolItem(nWhich, bFormulaMode ));
340 : }
341 0 : break;
342 :
343 : case FID_NORMALVIEWMODE:
344 : case FID_PAGEBREAKMODE:
345 : // always handle both slots - they exclude each other
346 0 : if ( bOle )
347 : {
348 0 : rSet.DisableItem( FID_NORMALVIEWMODE );
349 0 : rSet.DisableItem( FID_PAGEBREAKMODE );
350 : }
351 : else
352 : {
353 0 : rSet.Put(SfxBoolItem(FID_NORMALVIEWMODE, !GetViewData()->IsPagebreakMode()));
354 0 : rSet.Put(SfxBoolItem(FID_PAGEBREAKMODE, GetViewData()->IsPagebreakMode()));
355 : }
356 0 : break;
357 :
358 : case FID_FUNCTION_BOX:
359 0 : nMyId = ScFunctionChildWindow::GetChildWindowId();
360 0 : rSet.Put(SfxBoolItem(FID_FUNCTION_BOX, pThisFrame->HasChildWindow(nMyId)));
361 0 : break;
362 :
363 : case FID_PROTECT_DOC:
364 : {
365 0 : if ( pDocShell && pDocShell->IsDocShared() )
366 : {
367 0 : rSet.DisableItem( nWhich );
368 : }
369 : else
370 : {
371 0 : rSet.Put( SfxBoolItem( nWhich, pDoc->IsDocProtected() ) );
372 : }
373 : }
374 0 : break;
375 :
376 : case FID_PROTECT_TABLE:
377 : {
378 0 : if ( pDocShell && pDocShell->IsDocShared() )
379 : {
380 0 : rSet.DisableItem( nWhich );
381 : }
382 : else
383 : {
384 0 : rSet.Put( SfxBoolItem( nWhich, pDoc->IsTabProtected( nTab ) ) );
385 : }
386 : }
387 0 : break;
388 :
389 : case SID_AUTO_OUTLINE:
390 : {
391 0 : if (pDoc->GetChangeTrack()!=NULL || GetViewData()->IsMultiMarked())
392 : {
393 0 : rSet.DisableItem( nWhich );
394 : }
395 : }
396 0 : break;
397 :
398 : case SID_OUTLINE_DELETEALL:
399 : {
400 0 : SCTAB nOlTab = GetViewData()->GetTabNo();
401 0 : ScOutlineTable* pOlTable = pDoc->GetOutlineTable( nOlTab );
402 0 : if (pOlTable == NULL)
403 0 : rSet.DisableItem( nWhich );
404 : }
405 0 : break;
406 :
407 : case SID_WINDOW_SPLIT:
408 : rSet.Put(SfxBoolItem(nWhich,
409 0 : pViewData->GetHSplitMode() == SC_SPLIT_NORMAL ||
410 0 : pViewData->GetVSplitMode() == SC_SPLIT_NORMAL ));
411 0 : break;
412 :
413 : case SID_WINDOW_FIX:
414 : rSet.Put(SfxBoolItem(nWhich,
415 0 : pViewData->GetHSplitMode() == SC_SPLIT_FIX ||
416 0 : pViewData->GetVSplitMode() == SC_SPLIT_FIX ));
417 0 : break;
418 :
419 : case FID_CHG_SHOW:
420 : {
421 0 : if ( pDoc->GetChangeTrack() == NULL || ( pDocShell && pDocShell->IsDocShared() ) )
422 0 : rSet.DisableItem( nWhich );
423 : }
424 0 : break;
425 : case FID_CHG_ACCEPT:
426 : {
427 : rSet.Put(SfxBoolItem(FID_CHG_ACCEPT,
428 0 : pThisFrame->HasChildWindow(FID_CHG_ACCEPT)));
429 0 : if(pDoc->GetChangeTrack()==NULL)
430 : {
431 0 : if ( !pThisFrame->HasChildWindow(FID_CHG_ACCEPT) )
432 : {
433 0 : rSet.DisableItem( nWhich);
434 : }
435 : }
436 0 : if ( pDocShell && pDocShell->IsDocShared() )
437 : {
438 0 : rSet.DisableItem( nWhich );
439 : }
440 : }
441 0 : break;
442 :
443 : case SID_FORMATPAGE:
444 : //! bei geschuetzten Tabellen ???
445 0 : if ( pDocShell && ( pDocShell->IsReadOnly() || pDocShell->IsDocShared() ) )
446 0 : rSet.DisableItem( nWhich );
447 0 : break;
448 :
449 : case SID_PRINTPREVIEW:
450 : // Toggle-Slot braucht einen State
451 0 : rSet.Put( SfxBoolItem( nWhich, false ) );
452 0 : break;
453 :
454 : case SID_READONLY_MODE:
455 0 : rSet.Put( SfxBoolItem( nWhich, GetViewData()->GetDocShell()->IsReadOnly() ) );
456 0 : break;
457 :
458 : case FID_TAB_DESELECTALL:
459 0 : if ( nTabSelCount == 1 )
460 0 : rSet.DisableItem( nWhich ); // enabled only if several sheets are selected
461 0 : break;
462 :
463 : } // switch ( nWitch )
464 0 : nWhich = aIter.NextWhich();
465 0 : } // while ( nWitch )
466 0 : }
467 :
468 : //------------------------------------------------------------------
469 0 : void ScTabViewShell::ExecuteCellFormatDlg( SfxRequest& rReq, sal_uInt16 nTabPage )
470 : {
471 0 : SfxAbstractTabDialog * pDlg = NULL;
472 0 : ScDocument* pDoc = GetViewData()->GetDocument();
473 :
474 0 : SvxBoxItem aLineOuter( ATTR_BORDER );
475 0 : SvxBoxInfoItem aLineInner( ATTR_BORDER_INNER );
476 :
477 0 : SvxNumberInfoItem* pNumberInfoItem = NULL;
478 0 : const ScPatternAttr* pOldAttrs = GetSelectionPattern();
479 : SfxItemSet* pOldSet = new SfxItemSet(
480 0 : pOldAttrs->GetItemSet() );
481 :
482 :
483 : // Umrandungs-Items holen und in den Set packen:
484 0 : GetSelectionFrame( aLineOuter, aLineInner );
485 0 : pOldSet->Put( aLineOuter );
486 0 : pOldSet->Put( aLineInner );
487 :
488 : // NumberFormat Value aus Value und Language erzeugen und eintueten
489 : pOldSet->Put( SfxUInt32Item( ATTR_VALUE_FORMAT,
490 0 : pOldAttrs->GetNumberFormat( pDoc->GetFormatTable() ) ) );
491 :
492 0 : MakeNumberInfoItem( pDoc, GetViewData(), &pNumberInfoItem );
493 :
494 0 : pOldSet->MergeRange( SID_ATTR_NUMBERFORMAT_INFO, SID_ATTR_NUMBERFORMAT_INFO );
495 0 : pOldSet->Put(*pNumberInfoItem );
496 :
497 0 : bInFormatDialog = true;
498 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
499 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
500 :
501 0 : pDlg = pFact->CreateScAttrDlg( GetViewFrame(), GetDialogParent(), pOldSet, RID_SCDLG_ATTR);
502 : OSL_ENSURE(pDlg, "Dialog create fail!");
503 0 : if ( nTabPage != 0xffff )
504 0 : pDlg->SetCurPageId( nTabPage );
505 0 : short nResult = pDlg->Execute();
506 0 : bInFormatDialog = false;
507 :
508 0 : if ( nResult == RET_OK )
509 : {
510 0 : const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
511 :
512 0 : const SfxPoolItem* pItem=NULL;
513 0 : if(pOutSet->GetItemState(SID_ATTR_NUMBERFORMAT_INFO,sal_True,&pItem)==SFX_ITEM_SET)
514 : {
515 :
516 0 : UpdateNumberFormatter((const SvxNumberInfoItem&)*pItem);
517 : }
518 :
519 0 : ApplyAttributes( pOutSet, pOldSet );
520 :
521 0 : rReq.Done( *pOutSet );
522 : }
523 0 : delete pOldSet;
524 0 : delete pNumberInfoItem;
525 0 : delete pDlg;
526 0 : }
527 :
528 : //------------------------------------------------------------------
529 :
530 0 : bool ScTabViewShell::IsRefInputMode() const
531 : {
532 0 : ScModule* pScMod = SC_MOD();
533 0 : if ( pScMod )
534 : {
535 0 : if( pScMod->IsRefDialogOpen() )
536 0 : return pScMod->IsFormulaMode();
537 0 : if( pScMod->IsFormulaMode() )
538 : {
539 0 : ScInputHandler* pHdl = pScMod->GetInputHdl();
540 0 : if ( pHdl )
541 : {
542 0 : String aString = pHdl->GetEditString();
543 0 : if ( !pHdl->GetSelIsRef() && aString.Len() > 1 &&
544 0 : ( aString.GetChar(0) == '+' || aString.GetChar(0) == '-' ) )
545 : {
546 0 : const ScViewData* pViewData = GetViewData();
547 0 : if ( pViewData )
548 : {
549 0 : ScDocument* pDoc = pViewData->GetDocument();
550 0 : if ( pDoc )
551 : {
552 0 : const ScAddress aPos( pViewData->GetCurPos() );
553 0 : ScCompiler aComp( pDoc, aPos );
554 0 : aComp.SetGrammar(pDoc->GetGrammar());
555 0 : aComp.SetCloseBrackets( false );
556 0 : ScTokenArray* pArr = aComp.CompileString( aString );
557 0 : if ( pArr && pArr->MayReferenceFollow() )
558 : {
559 0 : return true;
560 0 : }
561 : }
562 : }
563 : }
564 : else
565 : {
566 0 : return true;
567 0 : }
568 : }
569 : }
570 : }
571 :
572 0 : return false;
573 : }
574 :
575 : //------------------------------------------------------------------
576 :
577 0 : void ScTabViewShell::ExecuteInputDirect()
578 : {
579 0 : if ( !IsRefInputMode() )
580 : {
581 0 : ScModule* pScMod = SC_MOD();
582 0 : if ( pScMod )
583 : {
584 0 : pScMod->InputEnterHandler();
585 : }
586 : }
587 0 : }
588 :
589 : //------------------------------------------------------------------
590 :
591 0 : void ScTabViewShell::UpdateInputHandler( sal_Bool bForce /* = sal_False */, sal_Bool bStopEditing /* = sal_True */ )
592 : {
593 0 : ScInputHandler* pHdl = pInputHandler ? pInputHandler : SC_MOD()->GetInputHdl();
594 :
595 0 : if ( pHdl )
596 : {
597 0 : String aString;
598 0 : const EditTextObject* pObject = NULL;
599 0 : ScViewData* pViewData = GetViewData();
600 0 : ScDocument* pDoc = pViewData->GetDocument();
601 : CellType eType;
602 0 : SCCOL nPosX = pViewData->GetCurX();
603 0 : SCROW nPosY = pViewData->GetCurY();
604 0 : SCTAB nTab = pViewData->GetTabNo();
605 0 : SCTAB nStartTab = 0;
606 0 : SCTAB nEndTab = 0;
607 0 : SCCOL nStartCol = 0;
608 0 : SCROW nStartRow = 0;
609 0 : SCCOL nEndCol = 0;
610 0 : SCROW nEndRow = 0;
611 :
612 : pViewData->GetSimpleArea( nStartCol, nStartRow, nStartTab,
613 0 : nEndCol, nEndRow, nEndTab );
614 :
615 0 : PutInOrder( nStartCol, nEndCol );
616 0 : PutInOrder( nStartRow, nEndRow );
617 0 : PutInOrder( nStartTab, nEndTab );
618 :
619 0 : sal_Bool bHideFormula = false;
620 0 : sal_Bool bHideAll = false;
621 :
622 0 : if (pDoc->IsTabProtected(nTab))
623 : {
624 : const ScProtectionAttr* pProt = (const ScProtectionAttr*)
625 : pDoc->GetAttr( nPosX,nPosY,nTab,
626 0 : ATTR_PROTECTION);
627 0 : bHideFormula = pProt->GetHideFormula();
628 0 : bHideAll = pProt->GetHideCell();
629 : }
630 :
631 0 : if (!bHideAll)
632 : {
633 0 : pDoc->GetCellType( nPosX, nPosY, nTab, eType );
634 0 : if (eType == CELLTYPE_FORMULA)
635 : {
636 0 : if (!bHideFormula)
637 0 : pDoc->GetFormula( nPosX, nPosY, nTab, aString );
638 : }
639 0 : else if (eType == CELLTYPE_EDIT)
640 : {
641 : ScBaseCell* pCell;
642 0 : pDoc->GetCell( nPosX, nPosY, nTab, pCell );
643 0 : ((ScEditCell*)pCell)->GetData( pObject );
644 : }
645 : else
646 : {
647 0 : pDoc->GetInputString( nPosX, nPosY, nTab, aString );
648 0 : if (eType == CELLTYPE_STRING)
649 : {
650 : // Bei Bedarf ein ' vorneweg, damit der String nicht ungewollt
651 : // als Zahl interpretiert wird, und um dem Benutzer zu zeigen,
652 : // dass es ein String ist (#35060#).
653 : //! Auch bei Zahlformat "Text"? -> dann beim Editieren wegnehmen
654 :
655 0 : SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
656 : sal_uInt32 nNumFmt;
657 0 : pDoc->GetNumberFormat( nPosX, nPosY, nTab, nNumFmt );
658 : double fDummy;
659 0 : if ( pFormatter->IsNumberFormat(aString, nNumFmt, fDummy) )
660 0 : aString.Insert('\'',0);
661 : }
662 : }
663 : }
664 :
665 : ScInputHdlState aState( ScAddress( nPosX, nPosY, nTab ),
666 : ScAddress( nStartCol, nStartRow, nTab ),
667 : ScAddress( nEndCol, nEndRow, nTab ),
668 : aString,
669 0 : pObject );
670 :
671 : // if using the view's local input handler, this view can always be set
672 : // as current view inside NotifyChange.
673 0 : ScTabViewShell* pSourceSh = pInputHandler ? this : NULL;
674 :
675 0 : pHdl->NotifyChange( &aState, bForce, pSourceSh, bStopEditing );
676 : }
677 :
678 0 : SfxBindings& rBindings = GetViewFrame()->GetBindings();
679 0 : rBindings.Invalidate( SID_STATUS_SUM ); // immer zusammen mit Eingabezeile
680 0 : rBindings.Invalidate( SID_ATTR_SIZE );
681 0 : rBindings.Invalidate( SID_TABLE_CELL );
682 0 : }
683 :
684 0 : void ScTabViewShell::UpdateInputHandlerCellAdjust( SvxCellHorJustify eJust )
685 : {
686 0 : if( ScInputHandler* pHdl = pInputHandler ? pInputHandler : SC_MOD()->GetInputHdl() )
687 0 : pHdl->UpdateCellAdjust( eJust );
688 0 : }
689 :
690 : //------------------------------------------------------------------
691 :
692 0 : void ScTabViewShell::ExecuteSave( SfxRequest& rReq )
693 : {
694 : // nur SID_SAVEDOC / SID_SAVEASDOC
695 :
696 : // Eingabe auf jeden Fall abschliessen, auch wenn eine Formel bearbeitet wird
697 0 : SC_MOD()->InputEnterHandler();
698 :
699 0 : if ( GetViewData()->GetDocShell()->IsDocShared() )
700 : {
701 0 : GetViewData()->GetDocShell()->SetDocumentModified();
702 : }
703 :
704 : // ansonsten normal weiter
705 0 : GetViewData()->GetDocShell()->ExecuteSlot( rReq );
706 0 : }
707 :
708 0 : void ScTabViewShell::GetSaveState( SfxItemSet& rSet )
709 : {
710 0 : SfxShell* pDocSh = GetViewData()->GetDocShell();
711 :
712 0 : SfxWhichIter aIter(rSet);
713 0 : sal_uInt16 nWhich = aIter.FirstWhich();
714 0 : while( nWhich )
715 : {
716 0 : if ( nWhich != SID_SAVEDOC || !GetViewData()->GetDocShell()->IsDocShared() )
717 : {
718 : // get state from DocShell
719 0 : pDocSh->GetSlotState( nWhich, NULL, &rSet );
720 : }
721 0 : nWhich = aIter.NextWhich();
722 0 : }
723 0 : }
724 :
725 0 : void ScTabViewShell::ExecDrawOpt( SfxRequest& rReq )
726 : {
727 0 : ScViewOptions aViewOptions = GetViewData()->GetOptions();
728 0 : ScGridOptions aGridOptions = aViewOptions.GetGridOptions();
729 :
730 0 : SfxBindings& rBindings = GetViewFrame()->GetBindings();
731 0 : const SfxItemSet* pArgs = rReq.GetArgs();
732 : const SfxPoolItem* pItem;
733 0 : sal_uInt16 nSlotId = rReq.GetSlot();
734 0 : switch (nSlotId)
735 : {
736 : case SID_GRID_VISIBLE:
737 0 : if ( pArgs && pArgs->GetItemState(nSlotId,sal_True,&pItem) == SFX_ITEM_SET )
738 : {
739 0 : aGridOptions.SetGridVisible( ((const SfxBoolItem*)pItem)->GetValue() );
740 0 : aViewOptions.SetGridOptions(aGridOptions);
741 0 : rBindings.Invalidate(SID_GRID_VISIBLE);
742 : }
743 0 : break;
744 :
745 : case SID_GRID_USE:
746 0 : if ( pArgs && pArgs->GetItemState(nSlotId,sal_True,&pItem) == SFX_ITEM_SET )
747 : {
748 0 : aGridOptions.SetUseGridSnap( ((const SfxBoolItem*)pItem)->GetValue() );
749 0 : aViewOptions.SetGridOptions(aGridOptions);
750 0 : rBindings.Invalidate(SID_GRID_USE);
751 : }
752 0 : break;
753 :
754 : case SID_HELPLINES_MOVE:
755 0 : if ( pArgs && pArgs->GetItemState(nSlotId,sal_True,&pItem) == SFX_ITEM_SET )
756 : {
757 0 : aViewOptions.SetOption( VOPT_HELPLINES, ((const SfxBoolItem*)pItem)->GetValue() );
758 0 : rBindings.Invalidate(SID_HELPLINES_MOVE);
759 : }
760 0 : break;
761 : }
762 :
763 0 : GetViewData()->SetOptions(aViewOptions);
764 0 : }
765 :
766 0 : void ScTabViewShell::GetDrawOptState( SfxItemSet& rSet )
767 : {
768 0 : SfxBoolItem aBool;
769 :
770 0 : const ScViewOptions& rViewOptions = GetViewData()->GetOptions();
771 0 : const ScGridOptions& rGridOptions = rViewOptions.GetGridOptions();
772 :
773 0 : aBool.SetValue(rGridOptions.GetGridVisible());
774 0 : aBool.SetWhich( SID_GRID_VISIBLE );
775 0 : rSet.Put( aBool );
776 :
777 0 : aBool.SetValue(rGridOptions.GetUseGridSnap());
778 0 : aBool.SetWhich( SID_GRID_USE );
779 0 : rSet.Put( aBool );
780 :
781 0 : aBool.SetValue(rViewOptions.GetOption( VOPT_HELPLINES ));
782 0 : aBool.SetWhich( SID_HELPLINES_MOVE );
783 0 : rSet.Put( aBool );
784 15 : }
785 :
786 :
787 :
788 :
789 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|