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