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