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