| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_sc.hxx" |
| |
| |
| |
| //------------------------------------------------------------------ |
| |
| // INCLUDE --------------------------------------------------------------- |
| |
| #include "scitems.hxx" |
| #include <sfx2/viewfrm.hxx> |
| #include <sfx2/app.hxx> |
| #include <sfx2/request.hxx> |
| #include <svl/aeitem.hxx> |
| #include <basic/sbxcore.hxx> |
| #include <svl/whiter.hxx> |
| #include <svl/zforlist.hxx> |
| #include <vcl/msgbox.hxx> |
| #include <svl/stritem.hxx> |
| #include <svl/visitem.hxx> |
| #include <unotools/moduleoptions.hxx> |
| |
| #include <com/sun/star/frame/FrameSearchFlag.hpp> |
| #include <com/sun/star/sdbc/XResultSet.hpp> |
| |
| #include "cellsh.hxx" |
| #include "tabvwsh.hxx" |
| #include "sc.hrc" |
| #include "globstr.hrc" |
| #include "global.hxx" |
| #include "scmod.hxx" |
| #include "docsh.hxx" |
| #include "document.hxx" |
| #include "uiitems.hxx" |
| #include "dbfunc.hxx" |
| #include "dbdocfun.hxx" |
| //CHINA001 #include "lbseldlg.hxx" |
| //CHINA001 #include "sortdlg.hxx" |
| #include "filtdlg.hxx" |
| #include "dbnamdlg.hxx" |
| //CHINA001 #include "subtdlg.hxx" |
| #include "reffact.hxx" |
| #include "pvlaydlg.hxx" |
| #include "validat.hxx" |
| #include "scresid.hxx" |
| //CHINA001 #include "validate.hxx" |
| #include "pivot.hxx" |
| #include "dpobject.hxx" |
| //CHINA001 #include "dapitype.hxx" |
| //CHINA001 #include "dapidata.hxx" |
| #include "dpsdbtab.hxx" // ScImportSourceDesc |
| #include "dpshttab.hxx" // ScSheetSourceDesc |
| |
| #include "validate.hrc" //CHINA001 add for ScValidationDlg |
| #include "scui_def.hxx" //CHINA001 |
| #include "scabstdlg.hxx" //CHINA001 |
| #include "impex.hxx" |
| #include "asciiopt.hxx" |
| using namespace com::sun::star; |
| |
| //#include "strindlg.hxx" //! Test !!!!! |
| |
| //static ScArea aPivotSource; //! wohin? (ueber den Dialog retten) |
| |
| |
| #define IS_AVAILABLE(WhichId,ppItem) \ |
| (pReqArgs->GetItemState((WhichId), sal_True, ppItem ) == SFX_ITEM_SET) |
| |
| //------------------------------------------------------------------ |
| |
| bool lcl_GetTextToColumnsRange( const ScViewData* pData, ScRange& rRange ) |
| { |
| DBG_ASSERT( pData, "lcl_GetTextToColumnsRange: pData is null!" ); |
| |
| bool bRet = false; |
| const ScMarkData& rMark = pData->GetMarkData(); |
| |
| if ( rMark.IsMarked() ) |
| { |
| if ( !rMark.IsMultiMarked() ) |
| { |
| rMark.GetMarkArea( rRange ); |
| if ( rRange.aStart.Col() == rRange.aEnd.Col() ) |
| { |
| bRet = true; |
| } |
| } |
| } |
| else |
| { |
| const SCCOL nCol = pData->GetCurX(); |
| const SCROW nRow = pData->GetCurY(); |
| const SCTAB nTab = pData->GetTabNo(); |
| rRange = ScRange( nCol, nRow, nTab, nCol, nRow, nTab ); |
| bRet = true; |
| } |
| |
| const ScDocument* pDoc = pData->GetDocument(); |
| DBG_ASSERT( pDoc, "lcl_GetTextToColumnsRange: pDoc is null!" ); |
| |
| if ( bRet && pDoc->IsBlockEmpty( rRange.aStart.Tab(), rRange.aStart.Col(), |
| rRange.aStart.Row(), rRange.aEnd.Col(), |
| rRange.aEnd.Row() ) ) |
| { |
| bRet = false; |
| } |
| |
| return bRet; |
| } |
| |
| sal_Bool lcl_GetSortParam( const ScViewData* pData, ScSortParam& rSortParam ) |
| { |
| ScTabViewShell* pTabViewShell = pData->GetViewShell(); |
| ScDBData* pDBData = pTabViewShell->GetDBData(); |
| ScDocument* pDoc = pData->GetDocument(); |
| SCTAB nTab = pData->GetTabNo(); |
| ScDirection eFillDir = DIR_TOP; |
| sal_Bool bSort = sal_True; |
| ScRange aExternalRange; |
| |
| if( rSortParam.nCol1 != rSortParam.nCol2 ) |
| eFillDir = DIR_LEFT; |
| if( rSortParam.nRow1 != rSortParam.nRow2 ) |
| eFillDir = DIR_TOP; |
| |
| SCSIZE nCount = pDoc->GetEmptyLinesInBlock( rSortParam.nCol1, rSortParam.nRow1, nTab, rSortParam.nCol2, rSortParam.nRow2, nTab, eFillDir ); |
| |
| if( rSortParam.nRow2 == MAXROW ) |
| aExternalRange = ScRange( rSortParam.nCol1,sal::static_int_cast<SCROW>( nCount ), nTab ); |
| else |
| aExternalRange = ScRange( pData->GetCurX(), pData->GetCurY(), nTab ); |
| |
| SCROW nStartRow = aExternalRange.aStart.Row(); |
| SCCOL nStartCol = aExternalRange.aStart.Col(); |
| SCROW nEndRow = aExternalRange.aEnd.Row(); |
| SCCOL nEndCol = aExternalRange.aEnd.Col(); |
| pDoc->GetDataArea( aExternalRange.aStart.Tab(), nStartCol, nStartRow, nEndCol, nEndRow, sal_False, false ); |
| aExternalRange.aStart.SetRow( nStartRow ); |
| aExternalRange.aStart.SetCol( nStartCol ); |
| aExternalRange.aEnd.SetRow( nEndRow ); |
| aExternalRange.aEnd.SetCol( nEndCol ); |
| |
| if(( rSortParam.nCol1 == rSortParam.nCol2 && aExternalRange.aStart.Col() != aExternalRange.aEnd.Col() ) || |
| ( rSortParam.nRow1 == rSortParam.nRow2 && aExternalRange.aStart.Row() != aExternalRange.aEnd.Row() ) ) |
| { |
| sal_uInt16 nFmt = SCA_VALID; |
| String aExtendStr,aCurrentStr; |
| |
| pTabViewShell->AddHighlightRange( aExternalRange,Color( COL_LIGHTBLUE ) ); |
| ScRange rExtendRange( aExternalRange.aStart.Col(), aExternalRange.aStart.Row(), nTab, aExternalRange.aEnd.Col(), aExternalRange.aEnd.Row(), nTab ); |
| rExtendRange.Format( aExtendStr, nFmt, pDoc ); |
| |
| ScRange rCurrentRange( rSortParam.nCol1, rSortParam.nRow1, nTab, rSortParam.nCol2, rSortParam.nRow2, nTab ); |
| rCurrentRange.Format( aCurrentStr, nFmt, pDoc ); |
| |
| ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); |
| DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 |
| |
| VclAbstractDialog* pWarningDlg = pFact->CreateScSortWarningDlg( pTabViewShell->GetDialogParent(),aExtendStr,aCurrentStr,RID_SCDLG_SORT_WARNING ); |
| DBG_ASSERT(pWarningDlg, "Dialog create fail!");//CHINA001 |
| short bResult = pWarningDlg->Execute(); |
| if( bResult == BTN_EXTEND_RANGE || bResult == BTN_CURRENT_SELECTION ) |
| { |
| if( bResult == BTN_EXTEND_RANGE ) |
| { |
| pTabViewShell->MarkRange( aExternalRange, sal_False ); |
| pDBData->SetArea( nTab, aExternalRange.aStart.Col(), aExternalRange.aStart.Row(), aExternalRange.aEnd.Col(), aExternalRange.aEnd.Row() ); |
| } |
| } |
| else |
| { |
| bSort = sal_False; |
| pData->GetDocShell()->CancelAutoDBRange(); |
| } |
| |
| delete pWarningDlg; |
| pTabViewShell->ClearHighlightRanges(); |
| } |
| return bSort; |
| } |
| |
| //<!-- Added by PengYunQuan for Validity Cell Range Picker |
| //after end execute from !IsModalInputMode, it is safer to delay deleting |
| namespace |
| { |
| long DelayDeleteAbstractDialog( void *pAbstractDialog, void * /*pArg*/ ) |
| { |
| delete reinterpret_cast<VclAbstractDialog*>( pAbstractDialog ); |
| return 0; |
| } |
| } |
| //--> Added by PengYunQuan for Validity Cell Range Picker |
| |
| void ScCellShell::ExecuteDB( SfxRequest& rReq ) |
| { |
| ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell(); |
| sal_uInt16 nSlotId = rReq.GetSlot(); |
| const SfxItemSet* pReqArgs = rReq.GetArgs(); |
| ScModule* pScMod = SC_MOD(); |
| |
| pTabViewShell->HideListBox(); // Autofilter-DropDown-Listbox |
| |
| if ( GetViewData()->HasEditView( GetViewData()->GetActivePart() ) ) |
| { |
| pScMod->InputEnterHandler(); |
| pTabViewShell->UpdateInputHandler(); |
| } |
| |
| switch ( nSlotId ) |
| { |
| case SID_VIEW_DATA_SOURCE_BROWSER: |
| { |
| // check if database beamer is open |
| |
| SfxViewFrame* pViewFrame = pTabViewShell->GetViewFrame(); |
| sal_Bool bWasOpen = sal_False; |
| { |
| uno::Reference<frame::XFrame> xFrame = pViewFrame->GetFrame().GetFrameInterface(); |
| uno::Reference<frame::XFrame> xBeamerFrame = xFrame->findFrame( |
| rtl::OUString::createFromAscii("_beamer"), |
| frame::FrameSearchFlag::CHILDREN); |
| if ( xBeamerFrame.is() ) |
| bWasOpen = sal_True; |
| } |
| |
| if ( bWasOpen ) |
| { |
| // close database beamer: just forward to SfxViewFrame |
| |
| pViewFrame->ExecuteSlot( rReq ); |
| } |
| else |
| { |
| // show database beamer: SfxViewFrame call must be synchronous |
| |
| pViewFrame->ExecuteSlot( rReq, (sal_Bool) sal_False ); // sal_False = synchronous |
| |
| // select current database in database beamer |
| |
| ScImportParam aImportParam; |
| ScDBData* pDBData = pTabViewShell->GetDBData(sal_True,SC_DB_OLD); // don't create if none found |
| if (pDBData) |
| pDBData->GetImportParam( aImportParam ); |
| |
| ScDBDocFunc::ShowInBeamer( aImportParam, pTabViewShell->GetViewFrame() ); |
| } |
| rReq.Done(); // needed because it's a toggle slot |
| } |
| break; |
| |
| case SID_REIMPORT_DATA: |
| { |
| sal_Bool bOk = sal_False; |
| ScDBData* pDBData = pTabViewShell->GetDBData(sal_True,SC_DB_OLD); |
| if (pDBData) |
| { |
| ScImportParam aImportParam; |
| pDBData->GetImportParam( aImportParam ); |
| if (aImportParam.bImport && !pDBData->HasImportSelection()) |
| { |
| pTabViewShell->ImportData( aImportParam ); |
| pDBData->SetImportParam( aImportParam ); //! Undo ?? |
| bOk = sal_True; |
| } |
| } |
| |
| if (!bOk && ! rReq.IsAPI() ) |
| pTabViewShell->ErrorMessage(STR_REIMPORT_EMPTY); |
| |
| if( bOk ) |
| rReq.Done(); |
| } |
| break; |
| |
| case SID_REFRESH_DBAREA: |
| { |
| ScDBData* pDBData = pTabViewShell->GetDBData(sal_True,SC_DB_OLD); |
| if (pDBData) |
| { |
| // Import wiederholen wie SID_REIMPORT_DATA |
| |
| sal_Bool bContinue = sal_True; |
| ScImportParam aImportParam; |
| pDBData->GetImportParam( aImportParam ); |
| if (aImportParam.bImport && !pDBData->HasImportSelection()) |
| { |
| bContinue = pTabViewShell->ImportData( aImportParam ); |
| pDBData->SetImportParam( aImportParam ); //! Undo ?? |
| |
| // markieren (Groesse kann sich geaendert haben) |
| ScRange aNewRange; |
| pDBData->GetArea(aNewRange); |
| pTabViewShell->MarkRange(aNewRange); |
| } |
| |
| if ( bContinue ) // #41905# Fehler beim Import -> Abbruch |
| { |
| // interne Operationen, wenn welche gespeichert |
| |
| if ( pDBData->HasQueryParam() || pDBData->HasSortParam() || |
| pDBData->HasSubTotalParam() ) |
| pTabViewShell->RepeatDB(); |
| |
| // Pivottabellen die den Bereich als Quelldaten haben |
| |
| ScRange aRange; |
| pDBData->GetArea(aRange); |
| GetViewData()->GetDocShell()->RefreshPivotTables(aRange); |
| } |
| } |
| rReq.Done(); |
| } |
| break; |
| |
| case SID_SBA_BRW_INSERT: |
| { |
| DBG_ERROR( "Deprecated Slot" ); |
| } |
| break; |
| |
| case SID_SUBTOTALS: |
| { |
| const SfxItemSet* pArgs = rReq.GetArgs(); |
| if ( pArgs ) |
| { |
| pTabViewShell->DoSubTotals( ((const ScSubTotalItem&) pArgs->Get( SCITEM_SUBTDATA )). |
| GetSubTotalData() ); |
| rReq.Done(); |
| } |
| else |
| { |
| //CHINA001 ScSubTotalDlg* pDlg = NULL; |
| SfxAbstractTabDialog * pDlg = NULL; |
| ScSubTotalParam aSubTotalParam; |
| SfxItemSet aArgSet( GetPool(), SCITEM_SUBTDATA, SCITEM_SUBTDATA ); |
| |
| ScDBData* pDBData = pTabViewShell->GetDBData(); |
| pDBData->GetSubTotalParam( aSubTotalParam ); |
| aSubTotalParam.bRemoveOnly = sal_False; |
| |
| aArgSet.Put( ScSubTotalItem( SCITEM_SUBTDATA, GetViewData(), &aSubTotalParam ) ); |
| //CHINA001 pDlg = new ScSubTotalDlg( pTabViewShell->GetDialogParent(), &aArgSet ); |
| ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); |
| DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 |
| |
| pDlg = pFact->CreateScSubTotalDlg( pTabViewShell->GetDialogParent(), &aArgSet, RID_SCDLG_SUBTOTALS ); |
| DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001 |
| pDlg->SetCurPageId(1); |
| |
| short bResult = pDlg->Execute(); |
| |
| if ( (bResult == RET_OK) || (bResult == SCRET_REMOVE) ) |
| { |
| const SfxItemSet* pOutSet = NULL; |
| |
| if ( bResult == RET_OK ) |
| { |
| pOutSet = pDlg->GetOutputItemSet(); |
| aSubTotalParam = |
| ((const ScSubTotalItem&) |
| pOutSet->Get( SCITEM_SUBTDATA )). |
| GetSubTotalData(); |
| } |
| else // if (bResult == SCRET_REMOVE) |
| { |
| pOutSet = &aArgSet; |
| aSubTotalParam.bRemoveOnly = sal_True; |
| aSubTotalParam.bReplace = sal_True; |
| aArgSet.Put( ScSubTotalItem( SCITEM_SUBTDATA, |
| GetViewData(), |
| &aSubTotalParam ) ); |
| } |
| |
| pTabViewShell->DoSubTotals( aSubTotalParam ); |
| rReq.Done( *pOutSet ); |
| } |
| else |
| GetViewData()->GetDocShell()->CancelAutoDBRange(); |
| |
| delete pDlg; |
| } |
| } |
| break; |
| |
| case SID_SORT_DESCENDING: |
| case SID_SORT_ASCENDING: |
| { |
| //#i60401 ux-ctest: Calc does not support all users' strategies regarding sorting data |
| //the patch comes from maoyg |
| ScSortParam aSortParam; |
| ScDBData* pDBData = pTabViewShell->GetDBData(); |
| ScViewData* pData = GetViewData(); |
| |
| pDBData->GetSortParam( aSortParam ); |
| |
| if( lcl_GetSortParam( pData, aSortParam ) ) |
| { |
| SfxItemSet aArgSet( GetPool(), SCITEM_SORTDATA, SCITEM_SORTDATA ); |
| SCCOL nCol = GetViewData()->GetCurX(); |
| SCCOL nTab = GetViewData()->GetTabNo(); |
| ScDocument* pDoc = GetViewData()->GetDocument(); |
| |
| pDBData->GetSortParam( aSortParam ); |
| sal_Bool bHasHeader = pDoc->HasColHeader( aSortParam.nCol1, aSortParam.nRow1, aSortParam.nCol2, aSortParam.nRow2, nTab ); |
| |
| if( nCol < aSortParam.nCol1 ) |
| nCol = aSortParam.nCol1; |
| else if( nCol > aSortParam.nCol2 ) |
| nCol = aSortParam.nCol2; |
| |
| aSortParam.bHasHeader = bHasHeader; |
| aSortParam.bByRow = sal_True; |
| aSortParam.bCaseSens = sal_False; |
| aSortParam.bIncludePattern = sal_True; |
| aSortParam.bInplace = sal_True; |
| aSortParam.bDoSort[0] = sal_True; |
| aSortParam.nField[0] = nCol; |
| aSortParam.bAscending[0] = (nSlotId == SID_SORT_ASCENDING); |
| |
| for ( sal_uInt16 i=1; i<MAXSORT; i++ ) |
| aSortParam.bDoSort[i] = sal_False; |
| |
| aArgSet.Put( ScSortItem( SCITEM_SORTDATA, GetViewData(), &aSortParam ) ); |
| |
| pTabViewShell->UISort( aSortParam ); // Teilergebnisse bei Bedarf neu |
| |
| rReq.Done(); |
| } |
| } |
| break; |
| |
| case SID_SORT: |
| { |
| const SfxItemSet* pArgs = rReq.GetArgs(); |
| |
| //#i60401 ux-ctest: Calc does not support all users' strategies regarding sorting data |
| //the patch comes from maoyg |
| |
| if ( pArgs ) // Basic |
| { |
| ScSortParam aSortParam; |
| ScDBData* pDBData = pTabViewShell->GetDBData(); |
| ScViewData* pData = GetViewData(); |
| |
| pDBData->GetSortParam( aSortParam ); |
| |
| if( lcl_GetSortParam( pData, aSortParam ) ) |
| { |
| ScDocument* pDoc = GetViewData()->GetDocument(); |
| |
| pDBData->GetSortParam( aSortParam ); |
| sal_Bool bHasHeader = pDoc->HasColHeader( aSortParam.nCol1, aSortParam.nRow1, aSortParam.nCol2, aSortParam.nRow2, pData->GetTabNo() ); |
| if( bHasHeader ) |
| aSortParam.bHasHeader = bHasHeader; |
| |
| aSortParam.bInplace = sal_True; // von Basic immer |
| |
| const SfxPoolItem* pItem; |
| if ( pArgs->GetItemState( SID_SORT_BYROW, sal_True, &pItem ) == SFX_ITEM_SET ) |
| aSortParam.bByRow = ((const SfxBoolItem*)pItem)->GetValue(); |
| if ( pArgs->GetItemState( SID_SORT_HASHEADER, sal_True, &pItem ) == SFX_ITEM_SET ) |
| aSortParam.bHasHeader = ((const SfxBoolItem*)pItem)->GetValue(); |
| if ( pArgs->GetItemState( SID_SORT_CASESENS, sal_True, &pItem ) == SFX_ITEM_SET ) |
| aSortParam.bCaseSens = ((const SfxBoolItem*)pItem)->GetValue(); |
| if ( pArgs->GetItemState( SID_SORT_ATTRIBS, sal_True, &pItem ) == SFX_ITEM_SET ) |
| aSortParam.bIncludePattern = ((const SfxBoolItem*)pItem)->GetValue(); |
| if ( pArgs->GetItemState( SID_SORT_USERDEF, sal_True, &pItem ) == SFX_ITEM_SET ) |
| { |
| sal_uInt16 nUserIndex = ((const SfxUInt16Item*)pItem)->GetValue(); |
| aSortParam.bUserDef = ( nUserIndex != 0 ); |
| if ( nUserIndex ) |
| aSortParam.nUserIndex = nUserIndex - 1; // Basic: 1-basiert |
| } |
| |
| SCCOLROW nField0 = 0; |
| if ( pArgs->GetItemState( FN_PARAM_1, sal_True, &pItem ) == SFX_ITEM_SET ) |
| nField0 = ((const SfxInt32Item*)pItem)->GetValue(); |
| aSortParam.bDoSort[0] = ( nField0 != 0 ); |
| aSortParam.nField[0] = nField0 > 0 ? (nField0-1) : 0; |
| if ( pArgs->GetItemState( FN_PARAM_2, sal_True, &pItem ) == SFX_ITEM_SET ) |
| aSortParam.bAscending[0] = ((const SfxBoolItem*)pItem)->GetValue(); |
| SCCOLROW nField1 = 0; |
| if ( pArgs->GetItemState( FN_PARAM_3, sal_True, &pItem ) == SFX_ITEM_SET ) |
| nField1 = ((const SfxInt32Item*)pItem)->GetValue(); |
| aSortParam.bDoSort[1] = ( nField1 != 0 ); |
| aSortParam.nField[1] = nField1 > 0 ? (nField1-1) : 0; |
| if ( pArgs->GetItemState( FN_PARAM_4, sal_True, &pItem ) == SFX_ITEM_SET ) |
| aSortParam.bAscending[1] = ((const SfxBoolItem*)pItem)->GetValue(); |
| SCCOLROW nField2 = 0; |
| if ( pArgs->GetItemState( FN_PARAM_5, sal_True, &pItem ) == SFX_ITEM_SET ) |
| nField2 = ((const SfxInt32Item*)pItem)->GetValue(); |
| aSortParam.bDoSort[2] = ( nField2 != 0 ); |
| aSortParam.nField[2] = nField2 > 0 ? (nField2-1) : 0; |
| if ( pArgs->GetItemState( FN_PARAM_6, sal_True, &pItem ) == SFX_ITEM_SET ) |
| aSortParam.bAscending[2] = ((const SfxBoolItem*)pItem)->GetValue(); |
| |
| // Teilergebnisse bei Bedarf neu |
| pTabViewShell->UISort( aSortParam ); |
| rReq.Done(); |
| } |
| } |
| else |
| { |
| ScSortParam aSortParam; |
| ScDBData* pDBData = pTabViewShell->GetDBData(); |
| ScViewData* pData = GetViewData(); |
| |
| pDBData->GetSortParam( aSortParam ); |
| |
| if( lcl_GetSortParam( pData, aSortParam ) ) |
| { |
| SfxAbstractTabDialog* pDlg = NULL; |
| ScDocument* pDoc = GetViewData()->GetDocument(); |
| SfxItemSet aArgSet( GetPool(), SCITEM_SORTDATA, SCITEM_SORTDATA ); |
| |
| pDBData->GetSortParam( aSortParam ); |
| sal_Bool bHasHeader = pDoc->HasColHeader( aSortParam.nCol1, aSortParam.nRow1, aSortParam.nCol2, aSortParam.nRow2, pData->GetTabNo() ); |
| if( bHasHeader ) |
| aSortParam.bHasHeader = bHasHeader; |
| |
| aArgSet.Put( ScSortItem( SCITEM_SORTDATA, GetViewData(), &aSortParam ) ); |
| |
| ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); |
| DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 |
| |
| pDlg = pFact->CreateScSortDlg( pTabViewShell->GetDialogParent(), &aArgSet, RID_SCDLG_SORT ); |
| DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001 |
| pDlg->SetCurPageId(1); |
| |
| if ( pDlg->Execute() == RET_OK ) |
| { |
| const SfxItemSet* pOutSet = pDlg->GetOutputItemSet(); |
| const ScSortParam& rOutParam = ((const ScSortItem&) |
| pOutSet->Get( SCITEM_SORTDATA )).GetSortData(); |
| |
| // Teilergebnisse bei Bedarf neu |
| pTabViewShell->UISort( rOutParam ); |
| |
| if ( rOutParam.bInplace ) |
| { |
| rReq.AppendItem( SfxBoolItem( SID_SORT_BYROW, |
| rOutParam.bByRow ) ); |
| rReq.AppendItem( SfxBoolItem( SID_SORT_HASHEADER, |
| rOutParam.bHasHeader ) ); |
| rReq.AppendItem( SfxBoolItem( SID_SORT_CASESENS, |
| rOutParam.bCaseSens ) ); |
| rReq.AppendItem( SfxBoolItem( SID_SORT_ATTRIBS, |
| rOutParam.bIncludePattern ) ); |
| sal_uInt16 nUser = rOutParam.bUserDef ? ( rOutParam.nUserIndex + 1 ) : 0; |
| rReq.AppendItem( SfxUInt16Item( SID_SORT_USERDEF, nUser ) ); |
| if ( rOutParam.bDoSort[0] ) |
| { |
| rReq.AppendItem( SfxInt32Item( FN_PARAM_1, |
| rOutParam.nField[0] + 1 ) ); |
| rReq.AppendItem( SfxBoolItem( FN_PARAM_2, |
| rOutParam.bAscending[0] ) ); |
| } |
| if ( rOutParam.bDoSort[1] ) |
| { |
| rReq.AppendItem( SfxInt32Item( FN_PARAM_3, |
| rOutParam.nField[1] + 1 ) ); |
| rReq.AppendItem( SfxBoolItem( FN_PARAM_4, |
| rOutParam.bAscending[1] ) ); |
| } |
| if ( rOutParam.bDoSort[2] ) |
| { |
| rReq.AppendItem( SfxInt32Item( FN_PARAM_5, |
| rOutParam.nField[2] + 1 ) ); |
| rReq.AppendItem( SfxBoolItem( FN_PARAM_6, |
| rOutParam.bAscending[2] ) ); |
| } |
| } |
| |
| rReq.Done(); |
| } |
| else |
| GetViewData()->GetDocShell()->CancelAutoDBRange(); |
| |
| delete pDlg; |
| } |
| } |
| } |
| break; |
| |
| case SID_FILTER: |
| { |
| const SfxItemSet* pArgs = rReq.GetArgs(); |
| if ( pArgs ) |
| { |
| DBG_ERROR("SID_FILTER with arguments?"); |
| pTabViewShell->Query( ((const ScQueryItem&) |
| pArgs->Get( SCITEM_QUERYDATA )).GetQueryData(), NULL, sal_True ); |
| rReq.Done(); |
| } |
| else |
| { |
| sal_uInt16 nId = ScFilterDlgWrapper::GetChildWindowId(); |
| SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame(); |
| SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId ); |
| |
| pScMod->SetRefDialog( nId, pWnd ? sal_False : sal_True ); |
| } |
| } |
| break; |
| |
| case SID_SPECIAL_FILTER: |
| { |
| const SfxItemSet* pArgs = rReq.GetArgs(); |
| if ( pArgs ) |
| { |
| DBG_ERROR("SID_SPECIAL_FILTER with arguments?"); |
| pTabViewShell->Query( ((const ScQueryItem&) |
| pArgs->Get( SCITEM_QUERYDATA )).GetQueryData(), NULL, sal_True ); |
| rReq.Done(); |
| } |
| else |
| { |
| sal_uInt16 nId = ScSpecialFilterDlgWrapper::GetChildWindowId(); |
| SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame(); |
| SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId ); |
| |
| pScMod->SetRefDialog( nId, pWnd ? sal_False : sal_True ); |
| } |
| } |
| break; |
| |
| case FID_FILTER_OK: |
| { |
| const SfxPoolItem* pItem; |
| if ( pReqArgs && SFX_ITEM_SET == |
| pReqArgs->GetItemState( SCITEM_QUERYDATA, sal_True, &pItem ) ) |
| { |
| const ScQueryItem& rQueryItem = static_cast<const ScQueryItem&>(*pItem); |
| |
| SCTAB nCurTab = GetViewData()->GetTabNo(); |
| SCTAB nRefTab = GetViewData()->GetRefTabNo(); |
| |
| // If RefInput switched to a different sheet from the data sheet, |
| // switch back: |
| |
| if ( nCurTab != nRefTab ) |
| { |
| pTabViewShell->SetTabNo( nRefTab ); |
| pTabViewShell->PaintExtras(); |
| } |
| |
| ScRange aAdvSource; |
| if (rQueryItem.GetAdvancedQuerySource(aAdvSource)) |
| pTabViewShell->Query( rQueryItem.GetQueryData(), &aAdvSource, sal_True ); |
| else |
| pTabViewShell->Query( rQueryItem.GetQueryData(), NULL, sal_True ); |
| rReq.Done( *pReqArgs ); |
| } |
| } |
| break; |
| |
| case SID_UNFILTER: |
| { |
| ScQueryParam aParam; |
| ScDBData* pDBData = pTabViewShell->GetDBData(); |
| |
| pDBData->GetQueryParam( aParam ); |
| SCSIZE nEC = aParam.GetEntryCount(); |
| for (SCSIZE i=0; i<nEC; i++) |
| aParam.GetEntry(i).bDoQuery = sal_False; |
| aParam.bDuplicate = sal_True; |
| pTabViewShell->Query( aParam, NULL, sal_True ); |
| rReq.Done(); |
| } |
| break; |
| |
| case SID_AUTO_FILTER: |
| pTabViewShell->ToggleAutoFilter(); |
| rReq.Done(); |
| break; |
| |
| case SID_AUTOFILTER_HIDE: |
| pTabViewShell->HideAutoFilter(); |
| rReq.Done(); |
| break; |
| |
| case SID_PIVOT_TABLE: |
| { |
| const SfxPoolItem* pItem; |
| if ( pReqArgs && SFX_ITEM_SET == |
| pReqArgs->GetItemState( SCITEM_PIVOTDATA, sal_True, &pItem ) ) |
| { |
| SCTAB nCurTab = GetViewData()->GetTabNo(); |
| SCTAB nRefTab = GetViewData()->GetRefTabNo(); |
| |
| // Wenn RefInput auf andere Tabelle als Datentabelle umgeschaltet |
| // hat wieder zurueckschalten: |
| |
| if ( nCurTab != nRefTab ) |
| { |
| pTabViewShell->SetTabNo( nRefTab ); |
| pTabViewShell->PaintExtras(); |
| } |
| |
| const ScDPObject* pDPObject = pTabViewShell->GetDialogDPObject(); |
| if ( pDPObject ) |
| { |
| const ScPivotItem* pPItem = (const ScPivotItem*)pItem; |
| bool bSuccess = pTabViewShell->MakePivotTable( |
| pPItem->GetData(), pPItem->GetDestRange(), pPItem->IsNewSheet(), *pDPObject ); |
| SfxBoolItem aRet(0, bSuccess); |
| rReq.SetReturnValue(aRet); |
| } |
| rReq.Done(); |
| } |
| else if (rReq.IsAPI()) |
| SbxBase::SetError(SbxERR_BAD_PARAMETER); |
| } |
| break; |
| |
| case SID_OPENDLG_PIVOTTABLE: |
| { |
| ScViewData* pData = GetViewData(); |
| ScDocument* pDoc = pData->GetDocument(); |
| |
| ScDPObject* pNewDPObject = NULL; |
| |
| // ScPivot is no longer used... |
| ScDPObject* pDPObj = pDoc->GetDPAtCursor( |
| pData->GetCurX(), pData->GetCurY(), |
| pData->GetTabNo() ); |
| if ( pDPObj ) // on an existing table? |
| { |
| pNewDPObject = new ScDPObject( *pDPObj ); |
| } |
| else // create new table |
| { |
| // select database range or data |
| pTabViewShell->GetDBData( sal_True, SC_DB_OLD ); |
| ScMarkData& rMark = GetViewData()->GetMarkData(); |
| if ( !rMark.IsMarked() && !rMark.IsMultiMarked() ) |
| pTabViewShell->MarkDataArea( sal_False ); |
| |
| // output to cursor position for non-sheet data |
| ScAddress aDestPos( pData->GetCurX(), pData->GetCurY(), |
| pData->GetTabNo() ); |
| |
| // first select type of source data |
| |
| sal_Bool bEnableExt = ScDPObject::HasRegisteredSources(); |
| //CHINA001 ScDataPilotSourceTypeDlg* pTypeDlg = new ScDataPilotSourceTypeDlg( |
| //CHINA001 pTabViewShell->GetDialogParent(), bEnableExt ); |
| |
| ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); |
| DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 |
| |
| AbstractScDataPilotSourceTypeDlg* pTypeDlg = pFact->CreateScDataPilotSourceTypeDlg( pTabViewShell->GetDialogParent(), bEnableExt, RID_SCDLG_DAPITYPE ); |
| DBG_ASSERT(pTypeDlg, "Dialog create fail!");//CHINA001 |
| if ( pTypeDlg->Execute() == RET_OK ) |
| { |
| if ( pTypeDlg->IsExternal() ) |
| { |
| uno::Sequence<rtl::OUString> aSources = ScDPObject::GetRegisteredSources(); |
| //CHINA001 ScDataPilotServiceDlg* pServDlg = new ScDataPilotServiceDlg( |
| //CHINA001 pTabViewShell->GetDialogParent(), aSources ); |
| AbstractScDataPilotServiceDlg* pServDlg = pFact->CreateScDataPilotServiceDlg( pTabViewShell->GetDialogParent(), aSources, RID_SCDLG_DAPISERVICE ); |
| DBG_ASSERT(pServDlg, "Dialog create fail!");//CHINA001 |
| if ( pServDlg->Execute() == RET_OK ) |
| { |
| ScDPServiceDesc aServDesc( |
| pServDlg->GetServiceName(), |
| pServDlg->GetParSource(), |
| pServDlg->GetParName(), |
| pServDlg->GetParUser(), |
| pServDlg->GetParPass() ); |
| pNewDPObject = new ScDPObject( pDoc ); |
| pNewDPObject->SetServiceData( aServDesc ); |
| } |
| delete pServDlg; |
| } |
| else if ( pTypeDlg->IsDatabase() ) |
| { |
| //CHINA001 ScDataPilotDatabaseDlg* pDataDlg = new ScDataPilotDatabaseDlg( |
| //CHINA001 pTabViewShell->GetDialogParent() ); |
| //ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); |
| DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 |
| |
| AbstractScDataPilotDatabaseDlg* pDataDlg = pFact->CreateScDataPilotDatabaseDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_DAPIDATA); |
| DBG_ASSERT(pDataDlg, "Dialog create fail!");//CHINA001 |
| if ( pDataDlg->Execute() == RET_OK ) |
| { |
| ScImportSourceDesc aImpDesc; |
| pDataDlg->GetValues( aImpDesc ); |
| pNewDPObject = new ScDPObject( pDoc ); |
| pNewDPObject->SetImportDesc( aImpDesc ); |
| } |
| delete pDataDlg; |
| } |
| else // selection |
| { |
| //! use database ranges (select before type dialog?) |
| ScRange aRange; |
| ScMarkType eType = GetViewData()->GetSimpleArea(aRange); |
| if ( (eType & SC_MARK_SIMPLE) == SC_MARK_SIMPLE ) |
| { |
| // Shrink the range to the data area. |
| SCCOL nStartCol = aRange.aStart.Col(), nEndCol = aRange.aEnd.Col(); |
| SCROW nStartRow = aRange.aStart.Row(), nEndRow = aRange.aEnd.Row(); |
| if (pDoc->ShrinkToDataArea(aRange.aStart.Tab(), nStartCol, nStartRow, nEndCol, nEndRow)) |
| { |
| aRange.aStart.SetCol(nStartCol); |
| aRange.aStart.SetRow(nStartRow); |
| aRange.aEnd.SetCol(nEndCol); |
| aRange.aEnd.SetRow(nEndRow); |
| rMark.SetMarkArea(aRange); |
| pTabViewShell->MarkRange(aRange); |
| } |
| |
| sal_Bool bOK = sal_True; |
| if ( pDoc->HasSubTotalCells( aRange ) ) |
| { |
| // confirm selection if it contains SubTotal cells |
| |
| QueryBox aBox( pTabViewShell->GetDialogParent(), |
| WinBits(WB_YES_NO | WB_DEF_YES), |
| ScGlobal::GetRscString(STR_DATAPILOT_SUBTOTAL) ); |
| if (aBox.Execute() == RET_NO) |
| bOK = sal_False; |
| } |
| if (bOK) |
| { |
| ScSheetSourceDesc aShtDesc; |
| aShtDesc.aSourceRange = aRange; |
| pNewDPObject = new ScDPObject( pDoc ); |
| pNewDPObject->SetSheetDesc( aShtDesc ); |
| |
| // output below source data |
| if ( aRange.aEnd.Row()+2 <= MAXROW - 4 ) |
| aDestPos = ScAddress( aRange.aStart.Col(), |
| aRange.aEnd.Row()+2, |
| aRange.aStart.Tab() ); |
| } |
| } |
| } |
| } |
| delete pTypeDlg; |
| |
| if ( pNewDPObject ) |
| pNewDPObject->SetOutRange( aDestPos ); |
| |
| #if 0 |
| ScDBData* pDBData = pTabViewShell->GetDBData(); |
| String aErrMsg; |
| |
| pDBData->GetArea( nTab, nCol1, nRow1, nCol2, nRow2 ); |
| |
| bAreaOk = sal_True; |
| if ( nRow2-nRow1 < 1 ) |
| { |
| // "mindestens eine Datenzeile" |
| pTabViewShell->ErrorMessage(STR_PIVOT_INVALID_DBAREA); |
| bAreaOk = sal_False; |
| } |
| else if (!pDBData->HasHeader()) |
| { |
| if ( MessBox( pTabViewShell->GetDialogParent(), WinBits(WB_YES_NO | WB_DEF_YES), |
| ScGlobal::GetRscString( STR_MSSG_DOSUBTOTALS_0 ), // "StarCalc" |
| ScGlobal::GetRscString( STR_MSSG_MAKEAUTOFILTER_0 ) // Koepfe aus erster Zeile? |
| ).Execute() == RET_YES ) |
| { |
| pDBData->SetHeader( sal_True ); //! Undo ?? |
| } |
| else |
| bAreaOk = sal_False; |
| } |
| #endif |
| } |
| |
| pTabViewShell->SetDialogDPObject( pNewDPObject ); // is copied |
| if ( pNewDPObject ) |
| { |
| // start layout dialog |
| |
| sal_uInt16 nId = ScPivotLayoutWrapper::GetChildWindowId(); |
| SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame(); |
| SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId ); |
| pScMod->SetRefDialog( nId, pWnd ? sal_False : sal_True ); |
| } |
| delete pNewDPObject; |
| } |
| break; |
| |
| case SID_DEFINE_DBNAME: |
| { |
| |
| sal_uInt16 nId = ScDbNameDlgWrapper::GetChildWindowId(); |
| SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame(); |
| SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId ); |
| |
| pScMod->SetRefDialog( nId, pWnd ? sal_False : sal_True ); |
| |
| } |
| break; |
| |
| case SID_SELECT_DB: |
| { |
| if ( pReqArgs ) |
| { |
| const SfxStringItem* pItem = |
| (const SfxStringItem*)&pReqArgs->Get( SID_SELECT_DB ); |
| |
| if( pItem ) |
| { |
| pTabViewShell->GotoDBArea( pItem->GetValue() ); |
| rReq.Done(); |
| } |
| else |
| { |
| DBG_ERROR("NULL"); |
| } |
| } |
| else |
| { |
| ScDocument* pDoc = GetViewData()->GetDocument(); |
| ScDBCollection* pDBCol = pDoc->GetDBCollection(); |
| |
| if ( pDBCol ) |
| { |
| List aList; |
| sal_uInt16 nDBCount = pDBCol->GetCount(); |
| ScDBData* pDbData = NULL; |
| String* pDBName = NULL; |
| |
| for ( sal_uInt16 i=0; i < nDBCount; i++ ) |
| { |
| pDbData = (ScDBData*)(pDBCol->At( i )); |
| if ( pDbData ) |
| { |
| pDBName = new String; |
| pDbData->GetName( *pDBName ); |
| |
| if ( !pDbData->IsInternalUnnamed() ) |
| aList.Insert( pDBName ); |
| else |
| DELETEZ(pDBName); |
| } |
| } |
| |
| ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); |
| DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 |
| |
| AbstractScSelEntryDlg* pDlg = pFact->CreateScSelEntryDlg( pTabViewShell->GetDialogParent(), |
| RID_SCDLG_SELECTDB, |
| String(ScResId(SCSTR_SELECTDB)), |
| String(ScResId(SCSTR_AREAS)), |
| aList, |
| RID_SCDLG_SELECTDB); |
| DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001 |
| if ( pDlg->Execute() == RET_OK ) |
| { |
| String aName = pDlg->GetSelectEntry(); |
| pTabViewShell->GotoDBArea( aName ); |
| rReq.AppendItem( SfxStringItem( SID_SELECT_DB, aName ) ); |
| rReq.Done(); |
| } |
| |
| delete pDlg; |
| |
| void* pEntry = aList.First(); |
| while ( pEntry ) |
| { |
| delete (String*) aList.Remove( pEntry ); |
| pEntry = aList.Next(); |
| } |
| } |
| } |
| } |
| break; |
| |
| case FID_VALIDATION: |
| { |
| const SfxPoolItem* pItem; |
| const SfxItemSet* pArgs = rReq.GetArgs(); |
| if ( pArgs ) |
| { |
| DBG_ERROR("spaeter..."); |
| } |
| else |
| { |
| //CHINA001 SfxItemSet aArgSet( GetPool(), ScTPValidationValue::GetRanges() ); |
| ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); |
| DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 |
| ::GetTabPageRanges ScTPValidationValueGetRanges = pFact->GetTabPageRangesFunc(TP_VALIDATION_VALUES); |
| DBG_ASSERT(ScTPValidationValueGetRanges, "TabPage create fail!");//CHINA001 |
| SfxItemSet aArgSet( GetPool(), (*ScTPValidationValueGetRanges)() );//CHINA001 |
| ScValidationMode eMode = SC_VALID_ANY; |
| ScConditionMode eOper = SC_COND_EQUAL; |
| String aExpr1, aExpr2; |
| sal_Bool bBlank = sal_True; |
| sal_Int16 nListType = ValidListType::UNSORTED; |
| sal_Bool bShowHelp = sal_False; |
| String aHelpTitle, aHelpText; |
| sal_Bool bShowError = sal_False; |
| ScValidErrorStyle eErrStyle = SC_VALERR_STOP; |
| String aErrTitle, aErrText; |
| |
| ScDocument* pDoc = GetViewData()->GetDocument(); |
| SCCOL nCurX = GetViewData()->GetCurX(); |
| SCROW nCurY = GetViewData()->GetCurY(); |
| SCTAB nTab = GetViewData()->GetTabNo(); |
| ScAddress aCursorPos( nCurX, nCurY, nTab ); |
| sal_uLong nIndex = ((SfxUInt32Item*)pDoc->GetAttr( |
| nCurX, nCurY, nTab, ATTR_VALIDDATA ))->GetValue(); |
| if ( nIndex ) |
| { |
| const ScValidationData* pOldData = pDoc->GetValidationEntry( nIndex ); |
| if ( pOldData ) |
| { |
| eMode = pOldData->GetDataMode(); |
| eOper = pOldData->GetOperation(); |
| sal_uLong nNumFmt = 0; |
| if ( eMode == SC_VALID_DATE || eMode == SC_VALID_TIME ) |
| { |
| short nType = ( eMode == SC_VALID_DATE ) ? NUMBERFORMAT_DATE |
| : NUMBERFORMAT_TIME; |
| nNumFmt = pDoc->GetFormatTable()->GetStandardFormat( |
| nType, ScGlobal::eLnge ); |
| } |
| aExpr1 = pOldData->GetExpression( aCursorPos, 0, nNumFmt ); |
| aExpr2 = pOldData->GetExpression( aCursorPos, 1, nNumFmt ); |
| bBlank = pOldData->IsIgnoreBlank(); |
| nListType = pOldData->GetListType(); |
| |
| bShowHelp = pOldData->GetInput( aHelpTitle, aHelpText ); |
| bShowError = pOldData->GetErrMsg( aErrTitle, aErrText, eErrStyle ); |
| |
| aArgSet.Put( SfxAllEnumItem( FID_VALID_MODE, sal::static_int_cast<sal_uInt16>(eMode) ) ); |
| aArgSet.Put( SfxAllEnumItem( FID_VALID_CONDMODE, sal::static_int_cast<sal_uInt16>(eOper) ) ); |
| aArgSet.Put( SfxStringItem( FID_VALID_VALUE1, aExpr1 ) ); |
| aArgSet.Put( SfxStringItem( FID_VALID_VALUE2, aExpr2 ) ); |
| aArgSet.Put( SfxBoolItem( FID_VALID_BLANK, bBlank ) ); |
| aArgSet.Put( SfxInt16Item( FID_VALID_LISTTYPE, nListType ) ); |
| aArgSet.Put( SfxBoolItem( FID_VALID_SHOWHELP, bShowHelp ) ); |
| aArgSet.Put( SfxStringItem( FID_VALID_HELPTITLE, aHelpTitle ) ); |
| aArgSet.Put( SfxStringItem( FID_VALID_HELPTEXT, aHelpText ) ); |
| aArgSet.Put( SfxBoolItem( FID_VALID_SHOWERR, bShowError ) ); |
| aArgSet.Put( SfxAllEnumItem( FID_VALID_ERRSTYLE, sal::static_int_cast<sal_uInt16>(eErrStyle) ) ); |
| aArgSet.Put( SfxStringItem( FID_VALID_ERRTITLE, aErrTitle ) ); |
| aArgSet.Put( SfxStringItem( FID_VALID_ERRTEXT, aErrText ) ); |
| } |
| } |
| |
| //CHINA001 ScValidationDlg* pDlg = new ScValidationDlg( NULL, &aArgSet ); |
| //CHINA001 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); |
| //CHINA001 DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001 |
| |
| //<!--Modified by PengYunQuan for Validity Cell Range Picker |
| //SfxAbstractTabDialog* pDlg = pFact->CreateScValidationDlg( NULL, &aArgSet, TAB_DLG_VALIDATION ); |
| SfxAbstractTabDialog* pDlg = pFact->CreateScValidationDlg( NULL, &aArgSet, TAB_DLG_VALIDATION, pTabViewShell ); |
| //-->Modified by PengYunQuan for Validity Cell Range Picker |
| DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001 |
| |
| //<!--Modified by PengYunQuan for Validity Cell Range Picker |
| //if ( pDlg->Execute() == RET_OK ) |
| short nResult = pDlg->Execute(); |
| pTabViewShell->SetTabNo( nTab );//When picking Cell Range ,other Tab may be switched. Need restore the correct tab |
| if ( nResult == RET_OK ) |
| //-->Modified by PengYunQuan for Validity Cell Range Picker |
| { |
| const SfxItemSet* pOutSet = pDlg->GetOutputItemSet(); |
| |
| if ( pOutSet->GetItemState( FID_VALID_MODE, sal_True, &pItem ) == SFX_ITEM_SET ) |
| eMode = (ScValidationMode) ((const SfxAllEnumItem*)pItem)->GetValue(); |
| if ( pOutSet->GetItemState( FID_VALID_CONDMODE, sal_True, &pItem ) == SFX_ITEM_SET ) |
| eOper = (ScConditionMode) ((const SfxAllEnumItem*)pItem)->GetValue(); |
| if ( pOutSet->GetItemState( FID_VALID_VALUE1, sal_True, &pItem ) == SFX_ITEM_SET ) |
| { |
| String aTemp1 = ((const SfxStringItem*)pItem)->GetValue(); |
| if (eMode == SC_VALID_DATE || eMode == SC_VALID_TIME) |
| { |
| sal_uInt32 nNumIndex = 0; |
| double nVal; |
| if (pDoc->GetFormatTable()->IsNumberFormat(aTemp1, nNumIndex, nVal)) |
| aExpr1 =String( ::rtl::math::doubleToUString( nVal, |
| rtl_math_StringFormat_Automatic, rtl_math_DecimalPlaces_Max, |
| ScGlobal::pLocaleData->getNumDecimalSep().GetChar(0), sal_True)); |
| else |
| aExpr1 = aTemp1; |
| } |
| else |
| aExpr1 = aTemp1; |
| } |
| if ( pOutSet->GetItemState( FID_VALID_VALUE2, sal_True, &pItem ) == SFX_ITEM_SET ) |
| { |
| String aTemp2 = ((const SfxStringItem*)pItem)->GetValue(); |
| if (eMode == SC_VALID_DATE || eMode == SC_VALID_TIME) |
| { |
| sal_uInt32 nNumIndex = 0; |
| double nVal; |
| if (pDoc->GetFormatTable()->IsNumberFormat(aTemp2, nNumIndex, nVal)) |
| aExpr2 =String( ::rtl::math::doubleToUString( nVal, |
| rtl_math_StringFormat_Automatic, rtl_math_DecimalPlaces_Max, |
| ScGlobal::pLocaleData->getNumDecimalSep().GetChar(0), sal_True)); |
| else |
| aExpr2 = aTemp2; |
| } |
| else |
| aExpr2 = aTemp2; |
| } |
| |
| if ( pOutSet->GetItemState( FID_VALID_BLANK, sal_True, &pItem ) == SFX_ITEM_SET ) |
| bBlank = ((const SfxBoolItem*)pItem)->GetValue(); |
| if ( pOutSet->GetItemState( FID_VALID_LISTTYPE, sal_True, &pItem ) == SFX_ITEM_SET ) |
| nListType = ((const SfxInt16Item*)pItem)->GetValue(); |
| |
| if ( pOutSet->GetItemState( FID_VALID_SHOWHELP, sal_True, &pItem ) == SFX_ITEM_SET ) |
| bShowHelp = ((const SfxBoolItem*)pItem)->GetValue(); |
| if ( pOutSet->GetItemState( FID_VALID_HELPTITLE, sal_True, &pItem ) == SFX_ITEM_SET ) |
| aHelpTitle = ((const SfxStringItem*)pItem)->GetValue(); |
| if ( pOutSet->GetItemState( FID_VALID_HELPTEXT, sal_True, &pItem ) == SFX_ITEM_SET ) |
| aHelpText = ((const SfxStringItem*)pItem)->GetValue(); |
| |
| if ( pOutSet->GetItemState( FID_VALID_SHOWERR, sal_True, &pItem ) == SFX_ITEM_SET ) |
| bShowError = ((const SfxBoolItem*)pItem)->GetValue(); |
| if ( pOutSet->GetItemState( FID_VALID_ERRSTYLE, sal_True, &pItem ) == SFX_ITEM_SET ) |
| eErrStyle = (ScValidErrorStyle) ((const SfxAllEnumItem*)pItem)->GetValue(); |
| if ( pOutSet->GetItemState( FID_VALID_ERRTITLE, sal_True, &pItem ) == SFX_ITEM_SET ) |
| aErrTitle = ((const SfxStringItem*)pItem)->GetValue(); |
| if ( pOutSet->GetItemState( FID_VALID_ERRTEXT, sal_True, &pItem ) == SFX_ITEM_SET ) |
| aErrText = ((const SfxStringItem*)pItem)->GetValue(); |
| |
| ScValidationData aData( eMode, eOper, aExpr1, aExpr2, pDoc, aCursorPos ); |
| aData.SetIgnoreBlank( bBlank ); |
| aData.SetListType( nListType ); |
| |
| aData.SetInput(aHelpTitle, aHelpText); // sets bShowInput to TRUE |
| if (!bShowHelp) |
| aData.ResetInput(); // reset only bShowInput |
| |
| aData.SetError(aErrTitle, aErrText, eErrStyle); // sets bShowError to TRUE |
| if (!bShowError) |
| aData.ResetError(); // reset only bShowError |
| |
| pTabViewShell->SetValidation( aData ); |
| rReq.Done( *pOutSet ); |
| } |
| //<!-- Modified by PengYunQuan for Validity Cell Range Picker |
| //after end execute from !IsModalInputMode, it is safer to delay deleting |
| //delete pDlg; |
| Application::PostUserEvent( Link( pDlg, &DelayDeleteAbstractDialog ) ); |
| //--> Modified by PengYunQuan for Validity Cell Range Picker |
| } |
| } |
| break; |
| |
| case SID_TEXT_TO_COLUMNS: |
| { |
| ScViewData* pData = GetViewData(); |
| DBG_ASSERT( pData, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pData is null!" ); |
| ScRange aRange; |
| |
| if ( lcl_GetTextToColumnsRange( pData, aRange ) ) |
| { |
| ScDocument* pDoc = pData->GetDocument(); |
| DBG_ASSERT( pDoc, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pDoc is null!" ); |
| |
| ScImportExport aExport( pDoc, aRange ); |
| aExport.SetExportTextOptions( ScExportTextOptions( ScExportTextOptions::None, 0, false ) ); |
| |
| // #i87703# text to columns fails with tab separator |
| aExport.SetDelimiter( static_cast< sal_Unicode >( 0 ) ); |
| |
| SvMemoryStream aStream; |
| aStream.SetStreamCharSet( RTL_TEXTENCODING_UNICODE ); |
| ScImportExport::SetNoEndianSwap( aStream ); |
| aExport.ExportStream( aStream, String(), FORMAT_STRING ); |
| |
| ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); |
| DBG_ASSERT( pFact, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pFact is null!" ); |
| AbstractScImportAsciiDlg *pDlg = pFact->CreateScImportAsciiDlg( |
| NULL, String(), &aStream, RID_SCDLG_ASCII ); |
| DBG_ASSERT( pDlg, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pDlg is null!" ); |
| pDlg->SetTextToColumnsMode(); |
| |
| if ( pDlg->Execute() == RET_OK ) |
| { |
| ScDocShell* pDocSh = pData->GetDocShell(); |
| DBG_ASSERT( pDocSh, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pDocSh is null!" ); |
| |
| String aUndo = ScGlobal::GetRscString( STR_UNDO_TEXTTOCOLUMNS ); |
| pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo ); |
| |
| ScImportExport aImport( pDoc, aRange.aStart ); |
| ScAsciiOptions aOptions; |
| pDlg->GetOptions( aOptions ); |
| aImport.SetExtOptions( aOptions ); |
| aImport.SetApi( false ); |
| aStream.Seek( 0 ); |
| aImport.ImportStream( aStream, String(), FORMAT_STRING ); |
| |
| pDocSh->GetUndoManager()->LeaveListAction(); |
| } |
| delete pDlg; |
| } |
| } |
| break; |
| } |
| } |
| |
| void __EXPORT ScCellShell::GetDBState( SfxItemSet& rSet ) |
| { |
| ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell(); |
| ScViewData* pData = GetViewData(); |
| ScDocShell* pDocSh = pData->GetDocShell(); |
| ScDocument* pDoc = pDocSh->GetDocument(); |
| SCCOL nPosX = pData->GetCurX(); |
| SCROW nPosY = pData->GetCurY(); |
| SCTAB nTab = pData->GetTabNo(); |
| |
| sal_Bool bAutoFilter = sal_False; |
| sal_Bool bAutoFilterTested = sal_False; |
| |
| SfxWhichIter aIter(rSet); |
| sal_uInt16 nWhich = aIter.FirstWhich(); |
| while (nWhich) |
| { |
| switch (nWhich) |
| { |
| case SID_REFRESH_DBAREA: |
| { |
| // importierte Daten ohne Selektion |
| // oder Filter,Sortierung,Teilergebis (auch ohne Import) |
| sal_Bool bOk = sal_False; |
| ScDBData* pDBData = pTabViewShell->GetDBData(sal_False,SC_DB_OLD); |
| if (pDBData && pDoc->GetChangeTrack() == NULL) |
| { |
| if ( pDBData->HasImportParam() ) |
| bOk = !pDBData->HasImportSelection(); |
| else |
| { |
| bOk = pDBData->HasQueryParam() || |
| pDBData->HasSortParam() || |
| pDBData->HasSubTotalParam(); |
| } |
| } |
| if (!bOk) |
| rSet.DisableItem( nWhich ); |
| } |
| break; |
| |
| case SID_FILTER: |
| case SID_SPECIAL_FILTER: |
| { |
| ScRange aDummy; |
| ScMarkType eMarkType = GetViewData()->GetSimpleArea( aDummy); |
| if (eMarkType != SC_MARK_SIMPLE && eMarkType != SC_MARK_SIMPLE_FILTERED) |
| { |
| rSet.DisableItem( nWhich ); |
| } |
| } |
| break; |
| |
| |
| //Bei Redlining und Multiselektion Disablen |
| case SID_SORT_ASCENDING: |
| case SID_SORT_DESCENDING: |
| case SCITEM_SORTDATA: |
| case SCITEM_SUBTDATA: |
| case SID_OPENDLG_PIVOTTABLE: |
| { |
| //! move ReadOnly check to idl flags |
| |
| if ( pDocSh->IsReadOnly() || pDoc->GetChangeTrack()!=NULL || |
| GetViewData()->IsMultiMarked() ) |
| { |
| rSet.DisableItem( nWhich ); |
| } |
| } |
| break; |
| |
| case SID_REIMPORT_DATA: |
| { |
| // nur importierte Daten ohne Selektion |
| ScDBData* pDBData = pTabViewShell->GetDBData(sal_False,SC_DB_OLD); |
| if (!pDBData || !pDBData->HasImportParam() || pDBData->HasImportSelection() || |
| pDoc->GetChangeTrack()!=NULL) |
| { |
| rSet.DisableItem( nWhich ); |
| } |
| } |
| break; |
| |
| case SID_VIEW_DATA_SOURCE_BROWSER: |
| { |
| if (!SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::E_SDATABASE)) |
| rSet.Put(SfxVisibilityItem(nWhich, sal_False)); |
| else |
| // get state (BoolItem) from SfxViewFrame |
| pTabViewShell->GetViewFrame()->GetSlotState( nWhich, NULL, &rSet ); |
| } |
| break; |
| case SID_SBA_BRW_INSERT: |
| { |
| // SBA will ein sal_Bool-Item, damit ueberhaupt enabled |
| |
| sal_Bool bEnable = sal_True; |
| rSet.Put(SfxBoolItem(nWhich, bEnable)); |
| } |
| break; |
| |
| case SID_AUTO_FILTER: |
| case SID_AUTOFILTER_HIDE: |
| { |
| if (!bAutoFilterTested) |
| { |
| bAutoFilter = pDoc->HasAutoFilter( nPosX, nPosY, nTab ); |
| bAutoFilterTested = sal_True; |
| } |
| if ( nWhich == SID_AUTO_FILTER ) |
| { |
| ScRange aDummy; |
| ScMarkType eMarkType = GetViewData()->GetSimpleArea( aDummy); |
| if (eMarkType != SC_MARK_SIMPLE && eMarkType != SC_MARK_SIMPLE_FILTERED) |
| { |
| rSet.DisableItem( nWhich ); |
| } |
| else if (pDoc->GetDPAtBlock(aDummy)) |
| { |
| rSet.DisableItem( nWhich ); |
| } |
| else |
| rSet.Put( SfxBoolItem( nWhich, bAutoFilter ) ); |
| } |
| else |
| if (!bAutoFilter) |
| rSet.DisableItem( nWhich ); |
| } |
| break; |
| |
| case SID_UNFILTER: |
| { |
| SCCOL nStartCol, nEndCol; |
| SCROW nStartRow, nEndRow; |
| SCTAB nStartTab, nEndTab; |
| sal_Bool bAnyQuery = sal_False; |
| |
| sal_Bool bSelected = (GetViewData()->GetSimpleArea( |
| nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab ) |
| == SC_MARK_SIMPLE); |
| |
| if ( bSelected ) |
| { |
| if (nStartCol==nEndCol && nStartRow==nEndRow) |
| bSelected = sal_False; |
| } |
| else |
| { |
| nStartCol = GetViewData()->GetCurX(); |
| nStartRow = GetViewData()->GetCurY(); |
| nStartTab = GetViewData()->GetTabNo(); |
| } |
| |
| ScDBData* pDBData = bSelected |
| ? pDoc->GetDBAtArea( nStartTab, nStartCol, nStartRow, nEndCol, nEndRow ) |
| : pDoc->GetDBAtCursor( nStartCol, nStartRow, nStartTab ); |
| |
| if ( pDBData ) |
| { |
| ScQueryParam aParam; |
| pDBData->GetQueryParam( aParam ); |
| if ( aParam.GetEntry(0).bDoQuery ) |
| bAnyQuery = sal_True; |
| } |
| |
| if ( !bAnyQuery ) |
| rSet.DisableItem( nWhich ); |
| } |
| break; |
| |
| case SID_DEFINE_DBNAME: |
| { |
| if ( pDocSh && pDocSh->IsDocShared() ) |
| { |
| rSet.DisableItem( nWhich ); |
| } |
| } |
| break; |
| |
| case SID_TEXT_TO_COLUMNS: |
| { |
| ScRange aRange; |
| if ( !lcl_GetTextToColumnsRange( pData, aRange ) ) |
| { |
| rSet.DisableItem( nWhich ); |
| } |
| } |
| break; |
| } |
| nWhich = aIter.NextWhich(); |
| } |
| } |
| |
| |
| |