1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sc.hxx" 26 27 28 29 //------------------------------------------------------------------ 30 31 // INCLUDE --------------------------------------------------------------- 32 33 #include "scitems.hxx" 34 #include <sfx2/viewfrm.hxx> 35 #include <sfx2/app.hxx> 36 #include <sfx2/request.hxx> 37 #include <svl/aeitem.hxx> 38 #include <basic/sbxcore.hxx> 39 #include <svl/whiter.hxx> 40 #include <svl/zforlist.hxx> 41 #include <vcl/msgbox.hxx> 42 #include <svl/stritem.hxx> 43 #include <svl/visitem.hxx> 44 #include <unotools/moduleoptions.hxx> 45 46 #include <com/sun/star/frame/FrameSearchFlag.hpp> 47 #include <com/sun/star/sdbc/XResultSet.hpp> 48 49 #include "cellsh.hxx" 50 #include "tabvwsh.hxx" 51 #include "sc.hrc" 52 #include "globstr.hrc" 53 #include "global.hxx" 54 #include "scmod.hxx" 55 #include "docsh.hxx" 56 #include "document.hxx" 57 #include "uiitems.hxx" 58 #include "dbfunc.hxx" 59 #include "dbdocfun.hxx" 60 //CHINA001 #include "lbseldlg.hxx" 61 //CHINA001 #include "sortdlg.hxx" 62 #include "filtdlg.hxx" 63 #include "dbnamdlg.hxx" 64 //CHINA001 #include "subtdlg.hxx" 65 #include "reffact.hxx" 66 #include "pvlaydlg.hxx" 67 #include "validat.hxx" 68 #include "scresid.hxx" 69 //CHINA001 #include "validate.hxx" 70 #include "pivot.hxx" 71 #include "dpobject.hxx" 72 //CHINA001 #include "dapitype.hxx" 73 //CHINA001 #include "dapidata.hxx" 74 #include "dpsdbtab.hxx" // ScImportSourceDesc 75 #include "dpshttab.hxx" // ScSheetSourceDesc 76 77 #include "validate.hrc" //CHINA001 add for ScValidationDlg 78 #include "scui_def.hxx" //CHINA001 79 #include "scabstdlg.hxx" //CHINA001 80 #include "impex.hxx" 81 #include "asciiopt.hxx" 82 using namespace com::sun::star; 83 84 //#include "strindlg.hxx" //! Test !!!!! 85 86 //static ScArea aPivotSource; //! wohin? (ueber den Dialog retten) 87 88 89 #define IS_AVAILABLE(WhichId,ppItem) \ 90 (pReqArgs->GetItemState((WhichId), sal_True, ppItem ) == SFX_ITEM_SET) 91 92 //------------------------------------------------------------------ 93 94 bool lcl_GetTextToColumnsRange( const ScViewData* pData, ScRange& rRange ) 95 { 96 DBG_ASSERT( pData, "lcl_GetTextToColumnsRange: pData is null!" ); 97 98 bool bRet = false; 99 const ScMarkData& rMark = pData->GetMarkData(); 100 101 if ( rMark.IsMarked() ) 102 { 103 if ( !rMark.IsMultiMarked() ) 104 { 105 rMark.GetMarkArea( rRange ); 106 if ( rRange.aStart.Col() == rRange.aEnd.Col() ) 107 { 108 bRet = true; 109 } 110 } 111 } 112 else 113 { 114 const SCCOL nCol = pData->GetCurX(); 115 const SCROW nRow = pData->GetCurY(); 116 const SCTAB nTab = pData->GetTabNo(); 117 rRange = ScRange( nCol, nRow, nTab, nCol, nRow, nTab ); 118 bRet = true; 119 } 120 121 const ScDocument* pDoc = pData->GetDocument(); 122 DBG_ASSERT( pDoc, "lcl_GetTextToColumnsRange: pDoc is null!" ); 123 124 if ( bRet && pDoc->IsBlockEmpty( rRange.aStart.Tab(), rRange.aStart.Col(), 125 rRange.aStart.Row(), rRange.aEnd.Col(), 126 rRange.aEnd.Row() ) ) 127 { 128 bRet = false; 129 } 130 131 return bRet; 132 } 133 134 sal_Bool lcl_GetSortParam( const ScViewData* pData, ScSortParam& rSortParam ) 135 { 136 ScTabViewShell* pTabViewShell = pData->GetViewShell(); 137 ScDBData* pDBData = pTabViewShell->GetDBData(); 138 ScDocument* pDoc = pData->GetDocument(); 139 SCTAB nTab = pData->GetTabNo(); 140 ScDirection eFillDir = DIR_TOP; 141 sal_Bool bSort = sal_True; 142 ScRange aExternalRange; 143 144 if( rSortParam.nCol1 != rSortParam.nCol2 ) 145 eFillDir = DIR_LEFT; 146 if( rSortParam.nRow1 != rSortParam.nRow2 ) 147 eFillDir = DIR_TOP; 148 149 SCSIZE nCount = pDoc->GetEmptyLinesInBlock( rSortParam.nCol1, rSortParam.nRow1, nTab, rSortParam.nCol2, rSortParam.nRow2, nTab, eFillDir ); 150 151 if( rSortParam.nRow2 == MAXROW ) 152 aExternalRange = ScRange( rSortParam.nCol1,sal::static_int_cast<SCROW>( nCount ), nTab ); 153 else 154 aExternalRange = ScRange( pData->GetCurX(), pData->GetCurY(), nTab ); 155 156 SCROW nStartRow = aExternalRange.aStart.Row(); 157 SCCOL nStartCol = aExternalRange.aStart.Col(); 158 SCROW nEndRow = aExternalRange.aEnd.Row(); 159 SCCOL nEndCol = aExternalRange.aEnd.Col(); 160 pDoc->GetDataArea( aExternalRange.aStart.Tab(), nStartCol, nStartRow, nEndCol, nEndRow, sal_False, false ); 161 aExternalRange.aStart.SetRow( nStartRow ); 162 aExternalRange.aStart.SetCol( nStartCol ); 163 aExternalRange.aEnd.SetRow( nEndRow ); 164 aExternalRange.aEnd.SetCol( nEndCol ); 165 166 if(( rSortParam.nCol1 == rSortParam.nCol2 && aExternalRange.aStart.Col() != aExternalRange.aEnd.Col() ) || 167 ( rSortParam.nRow1 == rSortParam.nRow2 && aExternalRange.aStart.Row() != aExternalRange.aEnd.Row() ) ) 168 { 169 sal_uInt16 nFmt = SCA_VALID; 170 String aExtendStr,aCurrentStr; 171 172 pTabViewShell->AddHighlightRange( aExternalRange,Color( COL_LIGHTBLUE ) ); 173 ScRange rExtendRange( aExternalRange.aStart.Col(), aExternalRange.aStart.Row(), nTab, aExternalRange.aEnd.Col(), aExternalRange.aEnd.Row(), nTab ); 174 rExtendRange.Format( aExtendStr, nFmt, pDoc ); 175 176 ScRange rCurrentRange( rSortParam.nCol1, rSortParam.nRow1, nTab, rSortParam.nCol2, rSortParam.nRow2, nTab ); 177 rCurrentRange.Format( aCurrentStr, nFmt, pDoc ); 178 179 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); 180 DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 181 182 VclAbstractDialog* pWarningDlg = pFact->CreateScSortWarningDlg( pTabViewShell->GetDialogParent(),aExtendStr,aCurrentStr,RID_SCDLG_SORT_WARNING ); 183 DBG_ASSERT(pWarningDlg, "Dialog create fail!");//CHINA001 184 short bResult = pWarningDlg->Execute(); 185 if( bResult == BTN_EXTEND_RANGE || bResult == BTN_CURRENT_SELECTION ) 186 { 187 if( bResult == BTN_EXTEND_RANGE ) 188 { 189 pTabViewShell->MarkRange( aExternalRange, sal_False ); 190 pDBData->SetArea( nTab, aExternalRange.aStart.Col(), aExternalRange.aStart.Row(), aExternalRange.aEnd.Col(), aExternalRange.aEnd.Row() ); 191 } 192 } 193 else 194 { 195 bSort = sal_False; 196 pData->GetDocShell()->CancelAutoDBRange(); 197 } 198 199 delete pWarningDlg; 200 pTabViewShell->ClearHighlightRanges(); 201 } 202 return bSort; 203 } 204 205 //<!-- Added by PengYunQuan for Validity Cell Range Picker 206 //after end execute from !IsModalInputMode, it is safer to delay deleting 207 namespace 208 { 209 long DelayDeleteAbstractDialog( void *pAbstractDialog, void * /*pArg*/ ) 210 { 211 delete reinterpret_cast<VclAbstractDialog*>( pAbstractDialog ); 212 return 0; 213 } 214 } 215 //--> Added by PengYunQuan for Validity Cell Range Picker 216 217 void ScCellShell::ExecuteDB( SfxRequest& rReq ) 218 { 219 ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell(); 220 sal_uInt16 nSlotId = rReq.GetSlot(); 221 const SfxItemSet* pReqArgs = rReq.GetArgs(); 222 ScModule* pScMod = SC_MOD(); 223 224 pTabViewShell->HideListBox(); // Autofilter-DropDown-Listbox 225 226 if ( GetViewData()->HasEditView( GetViewData()->GetActivePart() ) ) 227 { 228 pScMod->InputEnterHandler(); 229 pTabViewShell->UpdateInputHandler(); 230 } 231 232 switch ( nSlotId ) 233 { 234 case SID_VIEW_DATA_SOURCE_BROWSER: 235 { 236 // check if database beamer is open 237 238 SfxViewFrame* pViewFrame = pTabViewShell->GetViewFrame(); 239 sal_Bool bWasOpen = sal_False; 240 { 241 uno::Reference<frame::XFrame> xFrame = pViewFrame->GetFrame().GetFrameInterface(); 242 uno::Reference<frame::XFrame> xBeamerFrame = xFrame->findFrame( 243 rtl::OUString::createFromAscii("_beamer"), 244 frame::FrameSearchFlag::CHILDREN); 245 if ( xBeamerFrame.is() ) 246 bWasOpen = sal_True; 247 } 248 249 if ( bWasOpen ) 250 { 251 // close database beamer: just forward to SfxViewFrame 252 253 pViewFrame->ExecuteSlot( rReq ); 254 } 255 else 256 { 257 // show database beamer: SfxViewFrame call must be synchronous 258 259 pViewFrame->ExecuteSlot( rReq, (sal_Bool) sal_False ); // sal_False = synchronous 260 261 // select current database in database beamer 262 263 ScImportParam aImportParam; 264 ScDBData* pDBData = pTabViewShell->GetDBData(sal_True,SC_DB_OLD); // don't create if none found 265 if (pDBData) 266 pDBData->GetImportParam( aImportParam ); 267 268 ScDBDocFunc::ShowInBeamer( aImportParam, pTabViewShell->GetViewFrame() ); 269 } 270 rReq.Done(); // needed because it's a toggle slot 271 } 272 break; 273 274 case SID_REIMPORT_DATA: 275 { 276 sal_Bool bOk = sal_False; 277 ScDBData* pDBData = pTabViewShell->GetDBData(sal_True,SC_DB_OLD); 278 if (pDBData) 279 { 280 ScImportParam aImportParam; 281 pDBData->GetImportParam( aImportParam ); 282 if (aImportParam.bImport && !pDBData->HasImportSelection()) 283 { 284 pTabViewShell->ImportData( aImportParam ); 285 pDBData->SetImportParam( aImportParam ); //! Undo ?? 286 bOk = sal_True; 287 } 288 } 289 290 if (!bOk && ! rReq.IsAPI() ) 291 pTabViewShell->ErrorMessage(STR_REIMPORT_EMPTY); 292 293 if( bOk ) 294 rReq.Done(); 295 } 296 break; 297 298 case SID_REFRESH_DBAREA: 299 { 300 ScDBData* pDBData = pTabViewShell->GetDBData(sal_True,SC_DB_OLD); 301 if (pDBData) 302 { 303 // Import wiederholen wie SID_REIMPORT_DATA 304 305 sal_Bool bContinue = sal_True; 306 ScImportParam aImportParam; 307 pDBData->GetImportParam( aImportParam ); 308 if (aImportParam.bImport && !pDBData->HasImportSelection()) 309 { 310 bContinue = pTabViewShell->ImportData( aImportParam ); 311 pDBData->SetImportParam( aImportParam ); //! Undo ?? 312 313 // markieren (Groesse kann sich geaendert haben) 314 ScRange aNewRange; 315 pDBData->GetArea(aNewRange); 316 pTabViewShell->MarkRange(aNewRange); 317 } 318 319 if ( bContinue ) // #41905# Fehler beim Import -> Abbruch 320 { 321 // interne Operationen, wenn welche gespeichert 322 323 if ( pDBData->HasQueryParam() || pDBData->HasSortParam() || 324 pDBData->HasSubTotalParam() ) 325 pTabViewShell->RepeatDB(); 326 327 // Pivottabellen die den Bereich als Quelldaten haben 328 329 ScRange aRange; 330 pDBData->GetArea(aRange); 331 GetViewData()->GetDocShell()->RefreshPivotTables(aRange); 332 } 333 } 334 rReq.Done(); 335 } 336 break; 337 338 case SID_SBA_BRW_INSERT: 339 { 340 DBG_ERROR( "Deprecated Slot" ); 341 } 342 break; 343 344 case SID_SUBTOTALS: 345 { 346 const SfxItemSet* pArgs = rReq.GetArgs(); 347 if ( pArgs ) 348 { 349 pTabViewShell->DoSubTotals( ((const ScSubTotalItem&) pArgs->Get( SCITEM_SUBTDATA )). 350 GetSubTotalData() ); 351 rReq.Done(); 352 } 353 else 354 { 355 //CHINA001 ScSubTotalDlg* pDlg = NULL; 356 SfxAbstractTabDialog * pDlg = NULL; 357 ScSubTotalParam aSubTotalParam; 358 SfxItemSet aArgSet( GetPool(), SCITEM_SUBTDATA, SCITEM_SUBTDATA ); 359 360 ScDBData* pDBData = pTabViewShell->GetDBData(); 361 pDBData->GetSubTotalParam( aSubTotalParam ); 362 aSubTotalParam.bRemoveOnly = sal_False; 363 364 aArgSet.Put( ScSubTotalItem( SCITEM_SUBTDATA, GetViewData(), &aSubTotalParam ) ); 365 //CHINA001 pDlg = new ScSubTotalDlg( pTabViewShell->GetDialogParent(), &aArgSet ); 366 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); 367 DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 368 369 pDlg = pFact->CreateScSubTotalDlg( pTabViewShell->GetDialogParent(), &aArgSet, RID_SCDLG_SUBTOTALS ); 370 DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001 371 pDlg->SetCurPageId(1); 372 373 short bResult = pDlg->Execute(); 374 375 if ( (bResult == RET_OK) || (bResult == SCRET_REMOVE) ) 376 { 377 const SfxItemSet* pOutSet = NULL; 378 379 if ( bResult == RET_OK ) 380 { 381 pOutSet = pDlg->GetOutputItemSet(); 382 aSubTotalParam = 383 ((const ScSubTotalItem&) 384 pOutSet->Get( SCITEM_SUBTDATA )). 385 GetSubTotalData(); 386 } 387 else // if (bResult == SCRET_REMOVE) 388 { 389 pOutSet = &aArgSet; 390 aSubTotalParam.bRemoveOnly = sal_True; 391 aSubTotalParam.bReplace = sal_True; 392 aArgSet.Put( ScSubTotalItem( SCITEM_SUBTDATA, 393 GetViewData(), 394 &aSubTotalParam ) ); 395 } 396 397 pTabViewShell->DoSubTotals( aSubTotalParam ); 398 rReq.Done( *pOutSet ); 399 } 400 else 401 GetViewData()->GetDocShell()->CancelAutoDBRange(); 402 403 delete pDlg; 404 } 405 } 406 break; 407 408 case SID_SORT_DESCENDING: 409 case SID_SORT_ASCENDING: 410 { 411 //#i60401 ux-ctest: Calc does not support all users' strategies regarding sorting data 412 //the patch comes from maoyg 413 ScSortParam aSortParam; 414 ScDBData* pDBData = pTabViewShell->GetDBData(); 415 ScViewData* pData = GetViewData(); 416 417 pDBData->GetSortParam( aSortParam ); 418 419 if( lcl_GetSortParam( pData, aSortParam ) ) 420 { 421 SfxItemSet aArgSet( GetPool(), SCITEM_SORTDATA, SCITEM_SORTDATA ); 422 SCCOL nCol = GetViewData()->GetCurX(); 423 SCCOL nTab = GetViewData()->GetTabNo(); 424 ScDocument* pDoc = GetViewData()->GetDocument(); 425 426 pDBData->GetSortParam( aSortParam ); 427 sal_Bool bHasHeader = pDoc->HasColHeader( aSortParam.nCol1, aSortParam.nRow1, aSortParam.nCol2, aSortParam.nRow2, nTab ); 428 429 if( nCol < aSortParam.nCol1 ) 430 nCol = aSortParam.nCol1; 431 else if( nCol > aSortParam.nCol2 ) 432 nCol = aSortParam.nCol2; 433 434 aSortParam.bHasHeader = bHasHeader; 435 aSortParam.bByRow = sal_True; 436 aSortParam.bCaseSens = sal_False; 437 aSortParam.bIncludePattern = sal_True; 438 aSortParam.bInplace = sal_True; 439 aSortParam.bDoSort[0] = sal_True; 440 aSortParam.nField[0] = nCol; 441 aSortParam.bAscending[0] = (nSlotId == SID_SORT_ASCENDING); 442 443 for ( sal_uInt16 i=1; i<MAXSORT; i++ ) 444 aSortParam.bDoSort[i] = sal_False; 445 446 aArgSet.Put( ScSortItem( SCITEM_SORTDATA, GetViewData(), &aSortParam ) ); 447 448 pTabViewShell->UISort( aSortParam ); // Teilergebnisse bei Bedarf neu 449 450 rReq.Done(); 451 } 452 } 453 break; 454 455 case SID_SORT: 456 { 457 const SfxItemSet* pArgs = rReq.GetArgs(); 458 459 //#i60401 ux-ctest: Calc does not support all users' strategies regarding sorting data 460 //the patch comes from maoyg 461 462 if ( pArgs ) // Basic 463 { 464 ScSortParam aSortParam; 465 ScDBData* pDBData = pTabViewShell->GetDBData(); 466 ScViewData* pData = GetViewData(); 467 468 pDBData->GetSortParam( aSortParam ); 469 470 if( lcl_GetSortParam( pData, aSortParam ) ) 471 { 472 ScDocument* pDoc = GetViewData()->GetDocument(); 473 474 pDBData->GetSortParam( aSortParam ); 475 sal_Bool bHasHeader = pDoc->HasColHeader( aSortParam.nCol1, aSortParam.nRow1, aSortParam.nCol2, aSortParam.nRow2, pData->GetTabNo() ); 476 if( bHasHeader ) 477 aSortParam.bHasHeader = bHasHeader; 478 479 aSortParam.bInplace = sal_True; // von Basic immer 480 481 const SfxPoolItem* pItem; 482 if ( pArgs->GetItemState( SID_SORT_BYROW, sal_True, &pItem ) == SFX_ITEM_SET ) 483 aSortParam.bByRow = ((const SfxBoolItem*)pItem)->GetValue(); 484 if ( pArgs->GetItemState( SID_SORT_HASHEADER, sal_True, &pItem ) == SFX_ITEM_SET ) 485 aSortParam.bHasHeader = ((const SfxBoolItem*)pItem)->GetValue(); 486 if ( pArgs->GetItemState( SID_SORT_CASESENS, sal_True, &pItem ) == SFX_ITEM_SET ) 487 aSortParam.bCaseSens = ((const SfxBoolItem*)pItem)->GetValue(); 488 if ( pArgs->GetItemState( SID_SORT_ATTRIBS, sal_True, &pItem ) == SFX_ITEM_SET ) 489 aSortParam.bIncludePattern = ((const SfxBoolItem*)pItem)->GetValue(); 490 if ( pArgs->GetItemState( SID_SORT_USERDEF, sal_True, &pItem ) == SFX_ITEM_SET ) 491 { 492 sal_uInt16 nUserIndex = ((const SfxUInt16Item*)pItem)->GetValue(); 493 aSortParam.bUserDef = ( nUserIndex != 0 ); 494 if ( nUserIndex ) 495 aSortParam.nUserIndex = nUserIndex - 1; // Basic: 1-basiert 496 } 497 498 SCCOLROW nField0 = 0; 499 if ( pArgs->GetItemState( FN_PARAM_1, sal_True, &pItem ) == SFX_ITEM_SET ) 500 nField0 = ((const SfxInt32Item*)pItem)->GetValue(); 501 aSortParam.bDoSort[0] = ( nField0 != 0 ); 502 aSortParam.nField[0] = nField0 > 0 ? (nField0-1) : 0; 503 if ( pArgs->GetItemState( FN_PARAM_2, sal_True, &pItem ) == SFX_ITEM_SET ) 504 aSortParam.bAscending[0] = ((const SfxBoolItem*)pItem)->GetValue(); 505 SCCOLROW nField1 = 0; 506 if ( pArgs->GetItemState( FN_PARAM_3, sal_True, &pItem ) == SFX_ITEM_SET ) 507 nField1 = ((const SfxInt32Item*)pItem)->GetValue(); 508 aSortParam.bDoSort[1] = ( nField1 != 0 ); 509 aSortParam.nField[1] = nField1 > 0 ? (nField1-1) : 0; 510 if ( pArgs->GetItemState( FN_PARAM_4, sal_True, &pItem ) == SFX_ITEM_SET ) 511 aSortParam.bAscending[1] = ((const SfxBoolItem*)pItem)->GetValue(); 512 SCCOLROW nField2 = 0; 513 if ( pArgs->GetItemState( FN_PARAM_5, sal_True, &pItem ) == SFX_ITEM_SET ) 514 nField2 = ((const SfxInt32Item*)pItem)->GetValue(); 515 aSortParam.bDoSort[2] = ( nField2 != 0 ); 516 aSortParam.nField[2] = nField2 > 0 ? (nField2-1) : 0; 517 if ( pArgs->GetItemState( FN_PARAM_6, sal_True, &pItem ) == SFX_ITEM_SET ) 518 aSortParam.bAscending[2] = ((const SfxBoolItem*)pItem)->GetValue(); 519 520 // Teilergebnisse bei Bedarf neu 521 pTabViewShell->UISort( aSortParam ); 522 rReq.Done(); 523 } 524 } 525 else 526 { 527 ScSortParam aSortParam; 528 ScDBData* pDBData = pTabViewShell->GetDBData(); 529 ScViewData* pData = GetViewData(); 530 531 pDBData->GetSortParam( aSortParam ); 532 533 if( lcl_GetSortParam( pData, aSortParam ) ) 534 { 535 SfxAbstractTabDialog* pDlg = NULL; 536 ScDocument* pDoc = GetViewData()->GetDocument(); 537 SfxItemSet aArgSet( GetPool(), SCITEM_SORTDATA, SCITEM_SORTDATA ); 538 539 pDBData->GetSortParam( aSortParam ); 540 sal_Bool bHasHeader = pDoc->HasColHeader( aSortParam.nCol1, aSortParam.nRow1, aSortParam.nCol2, aSortParam.nRow2, pData->GetTabNo() ); 541 if( bHasHeader ) 542 aSortParam.bHasHeader = bHasHeader; 543 544 aArgSet.Put( ScSortItem( SCITEM_SORTDATA, GetViewData(), &aSortParam ) ); 545 546 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); 547 DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 548 549 pDlg = pFact->CreateScSortDlg( pTabViewShell->GetDialogParent(), &aArgSet, RID_SCDLG_SORT ); 550 DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001 551 pDlg->SetCurPageId(1); 552 553 if ( pDlg->Execute() == RET_OK ) 554 { 555 const SfxItemSet* pOutSet = pDlg->GetOutputItemSet(); 556 const ScSortParam& rOutParam = ((const ScSortItem&) 557 pOutSet->Get( SCITEM_SORTDATA )).GetSortData(); 558 559 // Teilergebnisse bei Bedarf neu 560 pTabViewShell->UISort( rOutParam ); 561 562 if ( rOutParam.bInplace ) 563 { 564 rReq.AppendItem( SfxBoolItem( SID_SORT_BYROW, 565 rOutParam.bByRow ) ); 566 rReq.AppendItem( SfxBoolItem( SID_SORT_HASHEADER, 567 rOutParam.bHasHeader ) ); 568 rReq.AppendItem( SfxBoolItem( SID_SORT_CASESENS, 569 rOutParam.bCaseSens ) ); 570 rReq.AppendItem( SfxBoolItem( SID_SORT_ATTRIBS, 571 rOutParam.bIncludePattern ) ); 572 sal_uInt16 nUser = rOutParam.bUserDef ? ( rOutParam.nUserIndex + 1 ) : 0; 573 rReq.AppendItem( SfxUInt16Item( SID_SORT_USERDEF, nUser ) ); 574 if ( rOutParam.bDoSort[0] ) 575 { 576 rReq.AppendItem( SfxInt32Item( FN_PARAM_1, 577 rOutParam.nField[0] + 1 ) ); 578 rReq.AppendItem( SfxBoolItem( FN_PARAM_2, 579 rOutParam.bAscending[0] ) ); 580 } 581 if ( rOutParam.bDoSort[1] ) 582 { 583 rReq.AppendItem( SfxInt32Item( FN_PARAM_3, 584 rOutParam.nField[1] + 1 ) ); 585 rReq.AppendItem( SfxBoolItem( FN_PARAM_4, 586 rOutParam.bAscending[1] ) ); 587 } 588 if ( rOutParam.bDoSort[2] ) 589 { 590 rReq.AppendItem( SfxInt32Item( FN_PARAM_5, 591 rOutParam.nField[2] + 1 ) ); 592 rReq.AppendItem( SfxBoolItem( FN_PARAM_6, 593 rOutParam.bAscending[2] ) ); 594 } 595 } 596 597 rReq.Done(); 598 } 599 else 600 GetViewData()->GetDocShell()->CancelAutoDBRange(); 601 602 delete pDlg; 603 } 604 } 605 } 606 break; 607 608 case SID_FILTER: 609 { 610 const SfxItemSet* pArgs = rReq.GetArgs(); 611 if ( pArgs ) 612 { 613 DBG_ERROR("SID_FILTER with arguments?"); 614 pTabViewShell->Query( ((const ScQueryItem&) 615 pArgs->Get( SCITEM_QUERYDATA )).GetQueryData(), NULL, sal_True ); 616 rReq.Done(); 617 } 618 else 619 { 620 sal_uInt16 nId = ScFilterDlgWrapper::GetChildWindowId(); 621 SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame(); 622 SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId ); 623 624 pScMod->SetRefDialog( nId, pWnd ? sal_False : sal_True ); 625 } 626 } 627 break; 628 629 case SID_SPECIAL_FILTER: 630 { 631 const SfxItemSet* pArgs = rReq.GetArgs(); 632 if ( pArgs ) 633 { 634 DBG_ERROR("SID_SPECIAL_FILTER with arguments?"); 635 pTabViewShell->Query( ((const ScQueryItem&) 636 pArgs->Get( SCITEM_QUERYDATA )).GetQueryData(), NULL, sal_True ); 637 rReq.Done(); 638 } 639 else 640 { 641 sal_uInt16 nId = ScSpecialFilterDlgWrapper::GetChildWindowId(); 642 SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame(); 643 SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId ); 644 645 pScMod->SetRefDialog( nId, pWnd ? sal_False : sal_True ); 646 } 647 } 648 break; 649 650 case FID_FILTER_OK: 651 { 652 const SfxPoolItem* pItem; 653 if ( pReqArgs && SFX_ITEM_SET == 654 pReqArgs->GetItemState( SCITEM_QUERYDATA, sal_True, &pItem ) ) 655 { 656 const ScQueryItem& rQueryItem = static_cast<const ScQueryItem&>(*pItem); 657 658 SCTAB nCurTab = GetViewData()->GetTabNo(); 659 SCTAB nRefTab = GetViewData()->GetRefTabNo(); 660 661 // If RefInput switched to a different sheet from the data sheet, 662 // switch back: 663 664 if ( nCurTab != nRefTab ) 665 { 666 pTabViewShell->SetTabNo( nRefTab ); 667 pTabViewShell->PaintExtras(); 668 } 669 670 ScRange aAdvSource; 671 if (rQueryItem.GetAdvancedQuerySource(aAdvSource)) 672 pTabViewShell->Query( rQueryItem.GetQueryData(), &aAdvSource, sal_True ); 673 else 674 pTabViewShell->Query( rQueryItem.GetQueryData(), NULL, sal_True ); 675 rReq.Done( *pReqArgs ); 676 } 677 } 678 break; 679 680 case SID_UNFILTER: 681 { 682 ScQueryParam aParam; 683 ScDBData* pDBData = pTabViewShell->GetDBData(); 684 685 pDBData->GetQueryParam( aParam ); 686 SCSIZE nEC = aParam.GetEntryCount(); 687 for (SCSIZE i=0; i<nEC; i++) 688 aParam.GetEntry(i).bDoQuery = sal_False; 689 aParam.bDuplicate = sal_True; 690 pTabViewShell->Query( aParam, NULL, sal_True ); 691 rReq.Done(); 692 } 693 break; 694 695 case SID_AUTO_FILTER: 696 pTabViewShell->ToggleAutoFilter(); 697 rReq.Done(); 698 break; 699 700 case SID_AUTOFILTER_HIDE: 701 pTabViewShell->HideAutoFilter(); 702 rReq.Done(); 703 break; 704 705 case SID_PIVOT_TABLE: 706 { 707 const SfxPoolItem* pItem; 708 if ( pReqArgs && SFX_ITEM_SET == 709 pReqArgs->GetItemState( SCITEM_PIVOTDATA, sal_True, &pItem ) ) 710 { 711 SCTAB nCurTab = GetViewData()->GetTabNo(); 712 SCTAB nRefTab = GetViewData()->GetRefTabNo(); 713 714 // Wenn RefInput auf andere Tabelle als Datentabelle umgeschaltet 715 // hat wieder zurueckschalten: 716 717 if ( nCurTab != nRefTab ) 718 { 719 pTabViewShell->SetTabNo( nRefTab ); 720 pTabViewShell->PaintExtras(); 721 } 722 723 const ScDPObject* pDPObject = pTabViewShell->GetDialogDPObject(); 724 if ( pDPObject ) 725 { 726 const ScPivotItem* pPItem = (const ScPivotItem*)pItem; 727 bool bSuccess = pTabViewShell->MakePivotTable( 728 pPItem->GetData(), pPItem->GetDestRange(), pPItem->IsNewSheet(), *pDPObject ); 729 SfxBoolItem aRet(0, bSuccess); 730 rReq.SetReturnValue(aRet); 731 } 732 rReq.Done(); 733 } 734 else if (rReq.IsAPI()) 735 SbxBase::SetError(SbxERR_BAD_PARAMETER); 736 } 737 break; 738 739 case SID_OPENDLG_PIVOTTABLE: 740 { 741 ScViewData* pData = GetViewData(); 742 ScDocument* pDoc = pData->GetDocument(); 743 744 ScDPObject* pNewDPObject = NULL; 745 746 // ScPivot is no longer used... 747 ScDPObject* pDPObj = pDoc->GetDPAtCursor( 748 pData->GetCurX(), pData->GetCurY(), 749 pData->GetTabNo() ); 750 if ( pDPObj ) // on an existing table? 751 { 752 pNewDPObject = new ScDPObject( *pDPObj ); 753 } 754 else // create new table 755 { 756 // select database range or data 757 pTabViewShell->GetDBData( sal_True, SC_DB_OLD ); 758 ScMarkData& rMark = GetViewData()->GetMarkData(); 759 if ( !rMark.IsMarked() && !rMark.IsMultiMarked() ) 760 pTabViewShell->MarkDataArea( sal_False ); 761 762 // output to cursor position for non-sheet data 763 ScAddress aDestPos( pData->GetCurX(), pData->GetCurY(), 764 pData->GetTabNo() ); 765 766 // first select type of source data 767 768 sal_Bool bEnableExt = ScDPObject::HasRegisteredSources(); 769 //CHINA001 ScDataPilotSourceTypeDlg* pTypeDlg = new ScDataPilotSourceTypeDlg( 770 //CHINA001 pTabViewShell->GetDialogParent(), bEnableExt ); 771 772 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); 773 DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 774 775 AbstractScDataPilotSourceTypeDlg* pTypeDlg = pFact->CreateScDataPilotSourceTypeDlg( pTabViewShell->GetDialogParent(), bEnableExt, RID_SCDLG_DAPITYPE ); 776 DBG_ASSERT(pTypeDlg, "Dialog create fail!");//CHINA001 777 if ( pTypeDlg->Execute() == RET_OK ) 778 { 779 if ( pTypeDlg->IsExternal() ) 780 { 781 uno::Sequence<rtl::OUString> aSources = ScDPObject::GetRegisteredSources(); 782 //CHINA001 ScDataPilotServiceDlg* pServDlg = new ScDataPilotServiceDlg( 783 //CHINA001 pTabViewShell->GetDialogParent(), aSources ); 784 AbstractScDataPilotServiceDlg* pServDlg = pFact->CreateScDataPilotServiceDlg( pTabViewShell->GetDialogParent(), aSources, RID_SCDLG_DAPISERVICE ); 785 DBG_ASSERT(pServDlg, "Dialog create fail!");//CHINA001 786 if ( pServDlg->Execute() == RET_OK ) 787 { 788 ScDPServiceDesc aServDesc( 789 pServDlg->GetServiceName(), 790 pServDlg->GetParSource(), 791 pServDlg->GetParName(), 792 pServDlg->GetParUser(), 793 pServDlg->GetParPass() ); 794 pNewDPObject = new ScDPObject( pDoc ); 795 pNewDPObject->SetServiceData( aServDesc ); 796 } 797 delete pServDlg; 798 } 799 else if ( pTypeDlg->IsDatabase() ) 800 { 801 //CHINA001 ScDataPilotDatabaseDlg* pDataDlg = new ScDataPilotDatabaseDlg( 802 //CHINA001 pTabViewShell->GetDialogParent() ); 803 //ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); 804 DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 805 806 AbstractScDataPilotDatabaseDlg* pDataDlg = pFact->CreateScDataPilotDatabaseDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_DAPIDATA); 807 DBG_ASSERT(pDataDlg, "Dialog create fail!");//CHINA001 808 if ( pDataDlg->Execute() == RET_OK ) 809 { 810 ScImportSourceDesc aImpDesc; 811 pDataDlg->GetValues( aImpDesc ); 812 pNewDPObject = new ScDPObject( pDoc ); 813 pNewDPObject->SetImportDesc( aImpDesc ); 814 } 815 delete pDataDlg; 816 } 817 else // selection 818 { 819 //! use database ranges (select before type dialog?) 820 ScRange aRange; 821 ScMarkType eType = GetViewData()->GetSimpleArea(aRange); 822 if ( (eType & SC_MARK_SIMPLE) == SC_MARK_SIMPLE ) 823 { 824 // Shrink the range to the data area. 825 SCCOL nStartCol = aRange.aStart.Col(), nEndCol = aRange.aEnd.Col(); 826 SCROW nStartRow = aRange.aStart.Row(), nEndRow = aRange.aEnd.Row(); 827 if (pDoc->ShrinkToDataArea(aRange.aStart.Tab(), nStartCol, nStartRow, nEndCol, nEndRow)) 828 { 829 aRange.aStart.SetCol(nStartCol); 830 aRange.aStart.SetRow(nStartRow); 831 aRange.aEnd.SetCol(nEndCol); 832 aRange.aEnd.SetRow(nEndRow); 833 rMark.SetMarkArea(aRange); 834 pTabViewShell->MarkRange(aRange); 835 } 836 837 sal_Bool bOK = sal_True; 838 if ( pDoc->HasSubTotalCells( aRange ) ) 839 { 840 // confirm selection if it contains SubTotal cells 841 842 QueryBox aBox( pTabViewShell->GetDialogParent(), 843 WinBits(WB_YES_NO | WB_DEF_YES), 844 ScGlobal::GetRscString(STR_DATAPILOT_SUBTOTAL) ); 845 if (aBox.Execute() == RET_NO) 846 bOK = sal_False; 847 } 848 if (bOK) 849 { 850 ScSheetSourceDesc aShtDesc; 851 aShtDesc.aSourceRange = aRange; 852 pNewDPObject = new ScDPObject( pDoc ); 853 pNewDPObject->SetSheetDesc( aShtDesc ); 854 855 // output below source data 856 if ( aRange.aEnd.Row()+2 <= MAXROW - 4 ) 857 aDestPos = ScAddress( aRange.aStart.Col(), 858 aRange.aEnd.Row()+2, 859 aRange.aStart.Tab() ); 860 } 861 } 862 } 863 } 864 delete pTypeDlg; 865 866 if ( pNewDPObject ) 867 pNewDPObject->SetOutRange( aDestPos ); 868 869 #if 0 870 ScDBData* pDBData = pTabViewShell->GetDBData(); 871 String aErrMsg; 872 873 pDBData->GetArea( nTab, nCol1, nRow1, nCol2, nRow2 ); 874 875 bAreaOk = sal_True; 876 if ( nRow2-nRow1 < 1 ) 877 { 878 // "mindestens eine Datenzeile" 879 pTabViewShell->ErrorMessage(STR_PIVOT_INVALID_DBAREA); 880 bAreaOk = sal_False; 881 } 882 else if (!pDBData->HasHeader()) 883 { 884 if ( MessBox( pTabViewShell->GetDialogParent(), WinBits(WB_YES_NO | WB_DEF_YES), 885 ScGlobal::GetRscString( STR_MSSG_DOSUBTOTALS_0 ), // "StarCalc" 886 ScGlobal::GetRscString( STR_MSSG_MAKEAUTOFILTER_0 ) // Koepfe aus erster Zeile? 887 ).Execute() == RET_YES ) 888 { 889 pDBData->SetHeader( sal_True ); //! Undo ?? 890 } 891 else 892 bAreaOk = sal_False; 893 } 894 #endif 895 } 896 897 pTabViewShell->SetDialogDPObject( pNewDPObject ); // is copied 898 if ( pNewDPObject ) 899 { 900 // start layout dialog 901 902 sal_uInt16 nId = ScPivotLayoutWrapper::GetChildWindowId(); 903 SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame(); 904 SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId ); 905 pScMod->SetRefDialog( nId, pWnd ? sal_False : sal_True ); 906 } 907 delete pNewDPObject; 908 } 909 break; 910 911 case SID_DEFINE_DBNAME: 912 { 913 914 sal_uInt16 nId = ScDbNameDlgWrapper::GetChildWindowId(); 915 SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame(); 916 SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId ); 917 918 pScMod->SetRefDialog( nId, pWnd ? sal_False : sal_True ); 919 920 } 921 break; 922 923 case SID_SELECT_DB: 924 { 925 if ( pReqArgs ) 926 { 927 const SfxStringItem* pItem = 928 (const SfxStringItem*)&pReqArgs->Get( SID_SELECT_DB ); 929 930 if( pItem ) 931 { 932 pTabViewShell->GotoDBArea( pItem->GetValue() ); 933 rReq.Done(); 934 } 935 else 936 { 937 DBG_ERROR("NULL"); 938 } 939 } 940 else 941 { 942 ScDocument* pDoc = GetViewData()->GetDocument(); 943 ScDBCollection* pDBCol = pDoc->GetDBCollection(); 944 945 if ( pDBCol ) 946 { 947 List aList; 948 sal_uInt16 nDBCount = pDBCol->GetCount(); 949 ScDBData* pDbData = NULL; 950 String* pDBName = NULL; 951 952 for ( sal_uInt16 i=0; i < nDBCount; i++ ) 953 { 954 pDbData = (ScDBData*)(pDBCol->At( i )); 955 if ( pDbData ) 956 { 957 pDBName = new String; 958 pDbData->GetName( *pDBName ); 959 960 if ( !pDbData->IsInternalUnnamed() ) 961 aList.Insert( pDBName ); 962 else 963 DELETEZ(pDBName); 964 } 965 } 966 967 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); 968 DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 969 970 AbstractScSelEntryDlg* pDlg = pFact->CreateScSelEntryDlg( pTabViewShell->GetDialogParent(), 971 RID_SCDLG_SELECTDB, 972 String(ScResId(SCSTR_SELECTDB)), 973 String(ScResId(SCSTR_AREAS)), 974 aList, 975 RID_SCDLG_SELECTDB); 976 DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001 977 if ( pDlg->Execute() == RET_OK ) 978 { 979 String aName = pDlg->GetSelectEntry(); 980 pTabViewShell->GotoDBArea( aName ); 981 rReq.AppendItem( SfxStringItem( SID_SELECT_DB, aName ) ); 982 rReq.Done(); 983 } 984 985 delete pDlg; 986 987 void* pEntry = aList.First(); 988 while ( pEntry ) 989 { 990 delete (String*) aList.Remove( pEntry ); 991 pEntry = aList.Next(); 992 } 993 } 994 } 995 } 996 break; 997 998 case FID_VALIDATION: 999 { 1000 const SfxPoolItem* pItem; 1001 const SfxItemSet* pArgs = rReq.GetArgs(); 1002 if ( pArgs ) 1003 { 1004 DBG_ERROR("spaeter..."); 1005 } 1006 else 1007 { 1008 //CHINA001 SfxItemSet aArgSet( GetPool(), ScTPValidationValue::GetRanges() ); 1009 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); 1010 DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 1011 ::GetTabPageRanges ScTPValidationValueGetRanges = pFact->GetTabPageRangesFunc(TP_VALIDATION_VALUES); 1012 DBG_ASSERT(ScTPValidationValueGetRanges, "TabPage create fail!");//CHINA001 1013 SfxItemSet aArgSet( GetPool(), (*ScTPValidationValueGetRanges)() );//CHINA001 1014 ScValidationMode eMode = SC_VALID_ANY; 1015 ScConditionMode eOper = SC_COND_EQUAL; 1016 String aExpr1, aExpr2; 1017 sal_Bool bBlank = sal_True; 1018 sal_Int16 nListType = ValidListType::UNSORTED; 1019 sal_Bool bShowHelp = sal_False; 1020 String aHelpTitle, aHelpText; 1021 sal_Bool bShowError = sal_False; 1022 ScValidErrorStyle eErrStyle = SC_VALERR_STOP; 1023 String aErrTitle, aErrText; 1024 1025 ScDocument* pDoc = GetViewData()->GetDocument(); 1026 SCCOL nCurX = GetViewData()->GetCurX(); 1027 SCROW nCurY = GetViewData()->GetCurY(); 1028 SCTAB nTab = GetViewData()->GetTabNo(); 1029 ScAddress aCursorPos( nCurX, nCurY, nTab ); 1030 sal_uLong nIndex = ((SfxUInt32Item*)pDoc->GetAttr( 1031 nCurX, nCurY, nTab, ATTR_VALIDDATA ))->GetValue(); 1032 if ( nIndex ) 1033 { 1034 const ScValidationData* pOldData = pDoc->GetValidationEntry( nIndex ); 1035 if ( pOldData ) 1036 { 1037 eMode = pOldData->GetDataMode(); 1038 eOper = pOldData->GetOperation(); 1039 sal_uLong nNumFmt = 0; 1040 if ( eMode == SC_VALID_DATE || eMode == SC_VALID_TIME ) 1041 { 1042 short nType = ( eMode == SC_VALID_DATE ) ? NUMBERFORMAT_DATE 1043 : NUMBERFORMAT_TIME; 1044 nNumFmt = pDoc->GetFormatTable()->GetStandardFormat( 1045 nType, ScGlobal::eLnge ); 1046 } 1047 aExpr1 = pOldData->GetExpression( aCursorPos, 0, nNumFmt ); 1048 aExpr2 = pOldData->GetExpression( aCursorPos, 1, nNumFmt ); 1049 bBlank = pOldData->IsIgnoreBlank(); 1050 nListType = pOldData->GetListType(); 1051 1052 bShowHelp = pOldData->GetInput( aHelpTitle, aHelpText ); 1053 bShowError = pOldData->GetErrMsg( aErrTitle, aErrText, eErrStyle ); 1054 1055 aArgSet.Put( SfxAllEnumItem( FID_VALID_MODE, sal::static_int_cast<sal_uInt16>(eMode) ) ); 1056 aArgSet.Put( SfxAllEnumItem( FID_VALID_CONDMODE, sal::static_int_cast<sal_uInt16>(eOper) ) ); 1057 aArgSet.Put( SfxStringItem( FID_VALID_VALUE1, aExpr1 ) ); 1058 aArgSet.Put( SfxStringItem( FID_VALID_VALUE2, aExpr2 ) ); 1059 aArgSet.Put( SfxBoolItem( FID_VALID_BLANK, bBlank ) ); 1060 aArgSet.Put( SfxInt16Item( FID_VALID_LISTTYPE, nListType ) ); 1061 aArgSet.Put( SfxBoolItem( FID_VALID_SHOWHELP, bShowHelp ) ); 1062 aArgSet.Put( SfxStringItem( FID_VALID_HELPTITLE, aHelpTitle ) ); 1063 aArgSet.Put( SfxStringItem( FID_VALID_HELPTEXT, aHelpText ) ); 1064 aArgSet.Put( SfxBoolItem( FID_VALID_SHOWERR, bShowError ) ); 1065 aArgSet.Put( SfxAllEnumItem( FID_VALID_ERRSTYLE, sal::static_int_cast<sal_uInt16>(eErrStyle) ) ); 1066 aArgSet.Put( SfxStringItem( FID_VALID_ERRTITLE, aErrTitle ) ); 1067 aArgSet.Put( SfxStringItem( FID_VALID_ERRTEXT, aErrText ) ); 1068 } 1069 } 1070 1071 //CHINA001 ScValidationDlg* pDlg = new ScValidationDlg( NULL, &aArgSet ); 1072 //CHINA001 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); 1073 //CHINA001 DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 1074 1075 //<!--Modified by PengYunQuan for Validity Cell Range Picker 1076 //SfxAbstractTabDialog* pDlg = pFact->CreateScValidationDlg( NULL, &aArgSet, TAB_DLG_VALIDATION ); 1077 SfxAbstractTabDialog* pDlg = pFact->CreateScValidationDlg( NULL, &aArgSet, TAB_DLG_VALIDATION, pTabViewShell ); 1078 //-->Modified by PengYunQuan for Validity Cell Range Picker 1079 DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001 1080 1081 //<!--Modified by PengYunQuan for Validity Cell Range Picker 1082 //if ( pDlg->Execute() == RET_OK ) 1083 short nResult = pDlg->Execute(); 1084 pTabViewShell->SetTabNo( nTab );//When picking Cell Range ,other Tab may be switched. Need restore the correct tab 1085 if ( nResult == RET_OK ) 1086 //-->Modified by PengYunQuan for Validity Cell Range Picker 1087 { 1088 const SfxItemSet* pOutSet = pDlg->GetOutputItemSet(); 1089 1090 if ( pOutSet->GetItemState( FID_VALID_MODE, sal_True, &pItem ) == SFX_ITEM_SET ) 1091 eMode = (ScValidationMode) ((const SfxAllEnumItem*)pItem)->GetValue(); 1092 if ( pOutSet->GetItemState( FID_VALID_CONDMODE, sal_True, &pItem ) == SFX_ITEM_SET ) 1093 eOper = (ScConditionMode) ((const SfxAllEnumItem*)pItem)->GetValue(); 1094 if ( pOutSet->GetItemState( FID_VALID_VALUE1, sal_True, &pItem ) == SFX_ITEM_SET ) 1095 { 1096 String aTemp1 = ((const SfxStringItem*)pItem)->GetValue(); 1097 if (eMode == SC_VALID_DATE || eMode == SC_VALID_TIME) 1098 { 1099 sal_uInt32 nNumIndex = 0; 1100 double nVal; 1101 if (pDoc->GetFormatTable()->IsNumberFormat(aTemp1, nNumIndex, nVal)) 1102 aExpr1 =String( ::rtl::math::doubleToUString( nVal, 1103 rtl_math_StringFormat_Automatic, rtl_math_DecimalPlaces_Max, 1104 ScGlobal::pLocaleData->getNumDecimalSep().GetChar(0), sal_True)); 1105 else 1106 aExpr1 = aTemp1; 1107 } 1108 else 1109 aExpr1 = aTemp1; 1110 } 1111 if ( pOutSet->GetItemState( FID_VALID_VALUE2, sal_True, &pItem ) == SFX_ITEM_SET ) 1112 { 1113 String aTemp2 = ((const SfxStringItem*)pItem)->GetValue(); 1114 if (eMode == SC_VALID_DATE || eMode == SC_VALID_TIME) 1115 { 1116 sal_uInt32 nNumIndex = 0; 1117 double nVal; 1118 if (pDoc->GetFormatTable()->IsNumberFormat(aTemp2, nNumIndex, nVal)) 1119 aExpr2 =String( ::rtl::math::doubleToUString( nVal, 1120 rtl_math_StringFormat_Automatic, rtl_math_DecimalPlaces_Max, 1121 ScGlobal::pLocaleData->getNumDecimalSep().GetChar(0), sal_True)); 1122 else 1123 aExpr2 = aTemp2; 1124 } 1125 else 1126 aExpr2 = aTemp2; 1127 } 1128 1129 if ( pOutSet->GetItemState( FID_VALID_BLANK, sal_True, &pItem ) == SFX_ITEM_SET ) 1130 bBlank = ((const SfxBoolItem*)pItem)->GetValue(); 1131 if ( pOutSet->GetItemState( FID_VALID_LISTTYPE, sal_True, &pItem ) == SFX_ITEM_SET ) 1132 nListType = ((const SfxInt16Item*)pItem)->GetValue(); 1133 1134 if ( pOutSet->GetItemState( FID_VALID_SHOWHELP, sal_True, &pItem ) == SFX_ITEM_SET ) 1135 bShowHelp = ((const SfxBoolItem*)pItem)->GetValue(); 1136 if ( pOutSet->GetItemState( FID_VALID_HELPTITLE, sal_True, &pItem ) == SFX_ITEM_SET ) 1137 aHelpTitle = ((const SfxStringItem*)pItem)->GetValue(); 1138 if ( pOutSet->GetItemState( FID_VALID_HELPTEXT, sal_True, &pItem ) == SFX_ITEM_SET ) 1139 aHelpText = ((const SfxStringItem*)pItem)->GetValue(); 1140 1141 if ( pOutSet->GetItemState( FID_VALID_SHOWERR, sal_True, &pItem ) == SFX_ITEM_SET ) 1142 bShowError = ((const SfxBoolItem*)pItem)->GetValue(); 1143 if ( pOutSet->GetItemState( FID_VALID_ERRSTYLE, sal_True, &pItem ) == SFX_ITEM_SET ) 1144 eErrStyle = (ScValidErrorStyle) ((const SfxAllEnumItem*)pItem)->GetValue(); 1145 if ( pOutSet->GetItemState( FID_VALID_ERRTITLE, sal_True, &pItem ) == SFX_ITEM_SET ) 1146 aErrTitle = ((const SfxStringItem*)pItem)->GetValue(); 1147 if ( pOutSet->GetItemState( FID_VALID_ERRTEXT, sal_True, &pItem ) == SFX_ITEM_SET ) 1148 aErrText = ((const SfxStringItem*)pItem)->GetValue(); 1149 1150 ScValidationData aData( eMode, eOper, aExpr1, aExpr2, pDoc, aCursorPos ); 1151 aData.SetIgnoreBlank( bBlank ); 1152 aData.SetListType( nListType ); 1153 1154 aData.SetInput(aHelpTitle, aHelpText); // sets bShowInput to TRUE 1155 if (!bShowHelp) 1156 aData.ResetInput(); // reset only bShowInput 1157 1158 aData.SetError(aErrTitle, aErrText, eErrStyle); // sets bShowError to TRUE 1159 if (!bShowError) 1160 aData.ResetError(); // reset only bShowError 1161 1162 pTabViewShell->SetValidation( aData ); 1163 rReq.Done( *pOutSet ); 1164 } 1165 //<!-- Modified by PengYunQuan for Validity Cell Range Picker 1166 //after end execute from !IsModalInputMode, it is safer to delay deleting 1167 //delete pDlg; 1168 Application::PostUserEvent( Link( pDlg, &DelayDeleteAbstractDialog ) ); 1169 //--> Modified by PengYunQuan for Validity Cell Range Picker 1170 } 1171 } 1172 break; 1173 1174 case SID_TEXT_TO_COLUMNS: 1175 { 1176 ScViewData* pData = GetViewData(); 1177 DBG_ASSERT( pData, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pData is null!" ); 1178 ScRange aRange; 1179 1180 if ( lcl_GetTextToColumnsRange( pData, aRange ) ) 1181 { 1182 ScDocument* pDoc = pData->GetDocument(); 1183 DBG_ASSERT( pDoc, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pDoc is null!" ); 1184 1185 ScImportExport aExport( pDoc, aRange ); 1186 aExport.SetExportTextOptions( ScExportTextOptions( ScExportTextOptions::None, 0, false ) ); 1187 1188 // #i87703# text to columns fails with tab separator 1189 aExport.SetDelimiter( static_cast< sal_Unicode >( 0 ) ); 1190 1191 SvMemoryStream aStream; 1192 aStream.SetStreamCharSet( RTL_TEXTENCODING_UNICODE ); 1193 ScImportExport::SetNoEndianSwap( aStream ); 1194 aExport.ExportStream( aStream, String(), FORMAT_STRING ); 1195 1196 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); 1197 DBG_ASSERT( pFact, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pFact is null!" ); 1198 AbstractScImportAsciiDlg *pDlg = pFact->CreateScImportAsciiDlg( 1199 NULL, String(), &aStream, RID_SCDLG_ASCII ); 1200 DBG_ASSERT( pDlg, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pDlg is null!" ); 1201 pDlg->SetTextToColumnsMode(); 1202 1203 if ( pDlg->Execute() == RET_OK ) 1204 { 1205 ScDocShell* pDocSh = pData->GetDocShell(); 1206 DBG_ASSERT( pDocSh, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pDocSh is null!" ); 1207 1208 String aUndo = ScGlobal::GetRscString( STR_UNDO_TEXTTOCOLUMNS ); 1209 pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo ); 1210 1211 ScImportExport aImport( pDoc, aRange.aStart ); 1212 ScAsciiOptions aOptions; 1213 pDlg->GetOptions( aOptions ); 1214 aImport.SetExtOptions( aOptions ); 1215 aImport.SetApi( false ); 1216 aStream.Seek( 0 ); 1217 aImport.ImportStream( aStream, String(), FORMAT_STRING ); 1218 1219 pDocSh->GetUndoManager()->LeaveListAction(); 1220 } 1221 delete pDlg; 1222 } 1223 } 1224 break; 1225 } 1226 } 1227 1228 void __EXPORT ScCellShell::GetDBState( SfxItemSet& rSet ) 1229 { 1230 ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell(); 1231 ScViewData* pData = GetViewData(); 1232 ScDocShell* pDocSh = pData->GetDocShell(); 1233 ScDocument* pDoc = pDocSh->GetDocument(); 1234 SCCOL nPosX = pData->GetCurX(); 1235 SCROW nPosY = pData->GetCurY(); 1236 SCTAB nTab = pData->GetTabNo(); 1237 1238 sal_Bool bAutoFilter = sal_False; 1239 sal_Bool bAutoFilterTested = sal_False; 1240 1241 SfxWhichIter aIter(rSet); 1242 sal_uInt16 nWhich = aIter.FirstWhich(); 1243 while (nWhich) 1244 { 1245 switch (nWhich) 1246 { 1247 case SID_REFRESH_DBAREA: 1248 { 1249 // importierte Daten ohne Selektion 1250 // oder Filter,Sortierung,Teilergebis (auch ohne Import) 1251 sal_Bool bOk = sal_False; 1252 ScDBData* pDBData = pTabViewShell->GetDBData(sal_False,SC_DB_OLD); 1253 if (pDBData && pDoc->GetChangeTrack() == NULL) 1254 { 1255 if ( pDBData->HasImportParam() ) 1256 bOk = !pDBData->HasImportSelection(); 1257 else 1258 { 1259 bOk = pDBData->HasQueryParam() || 1260 pDBData->HasSortParam() || 1261 pDBData->HasSubTotalParam(); 1262 } 1263 } 1264 if (!bOk) 1265 rSet.DisableItem( nWhich ); 1266 } 1267 break; 1268 1269 case SID_FILTER: 1270 case SID_SPECIAL_FILTER: 1271 { 1272 ScRange aDummy; 1273 ScMarkType eMarkType = GetViewData()->GetSimpleArea( aDummy); 1274 if (eMarkType != SC_MARK_SIMPLE && eMarkType != SC_MARK_SIMPLE_FILTERED) 1275 { 1276 rSet.DisableItem( nWhich ); 1277 } 1278 } 1279 break; 1280 1281 1282 //Bei Redlining und Multiselektion Disablen 1283 case SID_SORT_ASCENDING: 1284 case SID_SORT_DESCENDING: 1285 case SCITEM_SORTDATA: 1286 case SCITEM_SUBTDATA: 1287 case SID_OPENDLG_PIVOTTABLE: 1288 { 1289 //! move ReadOnly check to idl flags 1290 1291 if ( pDocSh->IsReadOnly() || pDoc->GetChangeTrack()!=NULL || 1292 GetViewData()->IsMultiMarked() ) 1293 { 1294 rSet.DisableItem( nWhich ); 1295 } 1296 } 1297 break; 1298 1299 case SID_REIMPORT_DATA: 1300 { 1301 // nur importierte Daten ohne Selektion 1302 ScDBData* pDBData = pTabViewShell->GetDBData(sal_False,SC_DB_OLD); 1303 if (!pDBData || !pDBData->HasImportParam() || pDBData->HasImportSelection() || 1304 pDoc->GetChangeTrack()!=NULL) 1305 { 1306 rSet.DisableItem( nWhich ); 1307 } 1308 } 1309 break; 1310 1311 case SID_VIEW_DATA_SOURCE_BROWSER: 1312 { 1313 if (!SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::E_SDATABASE)) 1314 rSet.Put(SfxVisibilityItem(nWhich, sal_False)); 1315 else 1316 // get state (BoolItem) from SfxViewFrame 1317 pTabViewShell->GetViewFrame()->GetSlotState( nWhich, NULL, &rSet ); 1318 } 1319 break; 1320 case SID_SBA_BRW_INSERT: 1321 { 1322 // SBA will ein sal_Bool-Item, damit ueberhaupt enabled 1323 1324 sal_Bool bEnable = sal_True; 1325 rSet.Put(SfxBoolItem(nWhich, bEnable)); 1326 } 1327 break; 1328 1329 case SID_AUTO_FILTER: 1330 case SID_AUTOFILTER_HIDE: 1331 { 1332 if (!bAutoFilterTested) 1333 { 1334 bAutoFilter = pDoc->HasAutoFilter( nPosX, nPosY, nTab ); 1335 bAutoFilterTested = sal_True; 1336 } 1337 if ( nWhich == SID_AUTO_FILTER ) 1338 { 1339 ScRange aDummy; 1340 ScMarkType eMarkType = GetViewData()->GetSimpleArea( aDummy); 1341 if (eMarkType != SC_MARK_SIMPLE && eMarkType != SC_MARK_SIMPLE_FILTERED) 1342 { 1343 rSet.DisableItem( nWhich ); 1344 } 1345 else if (pDoc->GetDPAtBlock(aDummy)) 1346 { 1347 rSet.DisableItem( nWhich ); 1348 } 1349 else 1350 rSet.Put( SfxBoolItem( nWhich, bAutoFilter ) ); 1351 } 1352 else 1353 if (!bAutoFilter) 1354 rSet.DisableItem( nWhich ); 1355 } 1356 break; 1357 1358 case SID_UNFILTER: 1359 { 1360 SCCOL nStartCol, nEndCol; 1361 SCROW nStartRow, nEndRow; 1362 SCTAB nStartTab, nEndTab; 1363 sal_Bool bAnyQuery = sal_False; 1364 1365 sal_Bool bSelected = (GetViewData()->GetSimpleArea( 1366 nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab ) 1367 == SC_MARK_SIMPLE); 1368 1369 if ( bSelected ) 1370 { 1371 if (nStartCol==nEndCol && nStartRow==nEndRow) 1372 bSelected = sal_False; 1373 } 1374 else 1375 { 1376 nStartCol = GetViewData()->GetCurX(); 1377 nStartRow = GetViewData()->GetCurY(); 1378 nStartTab = GetViewData()->GetTabNo(); 1379 } 1380 1381 ScDBData* pDBData = bSelected 1382 ? pDoc->GetDBAtArea( nStartTab, nStartCol, nStartRow, nEndCol, nEndRow ) 1383 : pDoc->GetDBAtCursor( nStartCol, nStartRow, nStartTab ); 1384 1385 if ( pDBData ) 1386 { 1387 ScQueryParam aParam; 1388 pDBData->GetQueryParam( aParam ); 1389 if ( aParam.GetEntry(0).bDoQuery ) 1390 bAnyQuery = sal_True; 1391 } 1392 1393 if ( !bAnyQuery ) 1394 rSet.DisableItem( nWhich ); 1395 } 1396 break; 1397 1398 case SID_DEFINE_DBNAME: 1399 { 1400 if ( pDocSh && pDocSh->IsDocShared() ) 1401 { 1402 rSet.DisableItem( nWhich ); 1403 } 1404 } 1405 break; 1406 1407 case SID_TEXT_TO_COLUMNS: 1408 { 1409 ScRange aRange; 1410 if ( !lcl_GetTextToColumnsRange( pData, aRange ) ) 1411 { 1412 rSet.DisableItem( nWhich ); 1413 } 1414 } 1415 break; 1416 } 1417 nWhich = aIter.NextWhich(); 1418 } 1419 } 1420 1421 1422 1423