LCOV - code coverage report
Current view: top level - usr/local/src/libreoffice/sc/source/ui/view - cellsh2.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 23 586 3.9 %
Date: 2013-07-09 Functions: 3 7 42.9 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "scitems.hxx"
      21             : #include <sfx2/viewfrm.hxx>
      22             : #include <sfx2/app.hxx>
      23             : #include <sfx2/request.hxx>
      24             : #include <svl/aeitem.hxx>
      25             : #include <basic/sbxcore.hxx>
      26             : #include <svl/whiter.hxx>
      27             : #include <svl/zforlist.hxx>
      28             : #include <vcl/msgbox.hxx>
      29             : #include <svl/stritem.hxx>
      30             : #include <svl/visitem.hxx>
      31             : #include <unotools/moduleoptions.hxx>
      32             : 
      33             : #include <com/sun/star/frame/FrameSearchFlag.hpp>
      34             : #include <com/sun/star/sdbc/XResultSet.hpp>
      35             : 
      36             : #include "cellsh.hxx"
      37             : #include "tabvwsh.hxx"
      38             : #include "sc.hrc"
      39             : #include "globstr.hrc"
      40             : #include "global.hxx"
      41             : #include "globalnames.hxx"
      42             : #include "scmod.hxx"
      43             : #include "docsh.hxx"
      44             : #include "document.hxx"
      45             : #include "uiitems.hxx"
      46             : #include "dbfunc.hxx"
      47             : #include "dbdocfun.hxx"
      48             : #include "filtdlg.hxx"
      49             : #include "dbnamdlg.hxx"
      50             : #include "reffact.hxx"
      51             : #include "validat.hxx"
      52             : #include "scresid.hxx"
      53             : 
      54             : #include "validate.hrc" // ScValidationDlg
      55             : #include "scui_def.hxx"
      56             : #include "scabstdlg.hxx"
      57             : #include "impex.hxx"
      58             : #include "asciiopt.hxx"
      59             : #include "queryentry.hxx"
      60             : #include "markdata.hxx"
      61             : 
      62             : using namespace com::sun::star;
      63             : 
      64           0 : static bool lcl_GetTextToColumnsRange( const ScViewData* pData, ScRange& rRange )
      65             : {
      66             :     OSL_ENSURE( pData, "lcl_GetTextToColumnsRange: pData is null!" );
      67             : 
      68           0 :     bool bRet = false;
      69           0 :     const ScMarkData& rMark = pData->GetMarkData();
      70             : 
      71           0 :     if ( rMark.IsMarked() )
      72             :     {
      73           0 :         if ( !rMark.IsMultiMarked() )
      74             :         {
      75           0 :             rMark.GetMarkArea( rRange );
      76           0 :             if ( rRange.aStart.Col() == rRange.aEnd.Col() )
      77             :             {
      78           0 :                 bRet = true;
      79             :             }
      80             :         }
      81             :     }
      82             :     else
      83             :     {
      84           0 :         const SCCOL nCol = pData->GetCurX();
      85           0 :         const SCROW nRow = pData->GetCurY();
      86           0 :         const SCTAB nTab = pData->GetTabNo();
      87           0 :         rRange = ScRange( nCol, nRow, nTab, nCol, nRow, nTab );
      88           0 :         bRet = true;
      89             :     }
      90             : 
      91           0 :     const ScDocument* pDoc = pData->GetDocument();
      92             :     OSL_ENSURE( pDoc, "lcl_GetTextToColumnsRange: pDoc is null!" );
      93             : 
      94           0 :     if ( bRet && pDoc->IsBlockEmpty( rRange.aStart.Tab(), rRange.aStart.Col(),
      95           0 :                                      rRange.aStart.Row(), rRange.aEnd.Col(),
      96           0 :                                      rRange.aEnd.Row() ) )
      97             :     {
      98           0 :         bRet = false;
      99             :     }
     100             : 
     101           0 :     return bRet;
     102             : }
     103             : 
     104           0 : static sal_Bool lcl_GetSortParam( const ScViewData* pData, ScSortParam& rSortParam )
     105             : {
     106           0 :     ScTabViewShell* pTabViewShell   = pData->GetViewShell();
     107           0 :     ScDBData*   pDBData             = pTabViewShell->GetDBData();
     108           0 :     ScDocument* pDoc                = pData->GetDocument();
     109           0 :     SCTAB nTab                      = pData->GetTabNo();
     110           0 :     ScDirection eFillDir            = DIR_TOP;
     111           0 :     sal_Bool  bSort                     = sal_True;
     112           0 :     ScRange aExternalRange;
     113             : 
     114           0 :     if( rSortParam.nCol1 != rSortParam.nCol2 )
     115           0 :         eFillDir = DIR_LEFT;
     116           0 :     if( rSortParam.nRow1 != rSortParam.nRow2 )
     117           0 :         eFillDir = DIR_TOP;
     118             : 
     119           0 :     SCSIZE nCount = pDoc->GetEmptyLinesInBlock( rSortParam.nCol1, rSortParam.nRow1, nTab, rSortParam.nCol2, rSortParam.nRow2, nTab, eFillDir );
     120             : 
     121           0 :     if( rSortParam.nRow2 == MAXROW )
     122           0 :         aExternalRange = ScRange( rSortParam.nCol1,sal::static_int_cast<SCROW>( nCount ), nTab );
     123             :     else
     124           0 :         aExternalRange = ScRange( pData->GetCurX(), pData->GetCurY(), nTab );
     125             : 
     126           0 :     SCROW nStartRow = aExternalRange.aStart.Row();
     127           0 :     SCCOL nStartCol = aExternalRange.aStart.Col();
     128           0 :     SCROW nEndRow   = aExternalRange.aEnd.Row();
     129           0 :     SCCOL nEndCol   = aExternalRange.aEnd.Col();
     130           0 :     pDoc->GetDataArea( aExternalRange.aStart.Tab(), nStartCol, nStartRow, nEndCol, nEndRow, false, false );
     131           0 :     aExternalRange.aStart.SetRow( nStartRow );
     132           0 :     aExternalRange.aStart.SetCol( nStartCol );
     133           0 :     aExternalRange.aEnd.SetRow( nEndRow );
     134           0 :     aExternalRange.aEnd.SetCol( nEndCol );
     135             : 
     136           0 :     if(( rSortParam.nCol1 == rSortParam.nCol2 && aExternalRange.aStart.Col() != aExternalRange.aEnd.Col() ) ||
     137           0 :         ( rSortParam.nRow1 == rSortParam.nRow2 && aExternalRange.aStart.Row() != aExternalRange.aEnd.Row() ) )
     138             :     {
     139           0 :         sal_uInt16 nFmt = SCA_VALID;
     140           0 :         String aExtendStr,aCurrentStr;
     141             : 
     142           0 :         pTabViewShell->AddHighlightRange( aExternalRange,Color( COL_LIGHTBLUE ) );
     143           0 :         ScRange rExtendRange( aExternalRange.aStart.Col(), aExternalRange.aStart.Row(), nTab, aExternalRange.aEnd.Col(), aExternalRange.aEnd.Row(), nTab );
     144           0 :         rExtendRange.Format( aExtendStr, nFmt, pDoc );
     145             : 
     146           0 :         ScRange rCurrentRange( rSortParam.nCol1, rSortParam.nRow1, nTab, rSortParam.nCol2, rSortParam.nRow2, nTab );
     147           0 :         rCurrentRange.Format( aCurrentStr, nFmt, pDoc );
     148             : 
     149           0 :         ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
     150             :         OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
     151             : 
     152           0 :         AbstractScSortWarningDlg* pWarningDlg = pFact->CreateScSortWarningDlg( pTabViewShell->GetDialogParent(), aExtendStr, aCurrentStr );
     153             :         OSL_ENSURE(pWarningDlg, "Dialog create fail!");
     154           0 :         short bResult = pWarningDlg->Execute();
     155           0 :         if( bResult == BTN_EXTEND_RANGE || bResult == BTN_CURRENT_SELECTION )
     156             :         {
     157           0 :             if( bResult == BTN_EXTEND_RANGE )
     158             :             {
     159           0 :                 pTabViewShell->MarkRange( aExternalRange, false );
     160           0 :                 pDBData->SetArea( nTab, aExternalRange.aStart.Col(), aExternalRange.aStart.Row(), aExternalRange.aEnd.Col(), aExternalRange.aEnd.Row() );
     161             :             }
     162             :         }
     163             :         else
     164             :         {
     165           0 :             bSort = false;
     166           0 :             pData->GetDocShell()->CancelAutoDBRange();
     167             :         }
     168             : 
     169           0 :         delete pWarningDlg;
     170           0 :         pTabViewShell->ClearHighlightRanges();
     171             :     }
     172           0 :     return bSort;
     173             : }
     174             : 
     175             : //after end execute from !IsModalInputMode, it is safer to delay deleting
     176             : namespace
     177             : {
     178           0 :     long DelayDeleteAbstractDialog( void *pAbstractDialog, void * /*pArg*/ )
     179             :     {
     180           0 :         delete reinterpret_cast<SfxAbstractTabDialog*>( pAbstractDialog );
     181           0 :         return 0;
     182             :     }
     183             : }
     184             : 
     185           0 : void ScCellShell::ExecuteDB( SfxRequest& rReq )
     186             : {
     187           0 :     ScTabViewShell* pTabViewShell   = GetViewData()->GetViewShell();
     188           0 :     sal_uInt16 nSlotId = rReq.GetSlot();
     189           0 :     const SfxItemSet*   pReqArgs    = rReq.GetArgs();
     190           0 :     ScModule*           pScMod      = SC_MOD();
     191             : 
     192           0 :     pTabViewShell->HideListBox();                   // Autofilter-DropDown-Listbox
     193             : 
     194           0 :     if ( GetViewData()->HasEditView( GetViewData()->GetActivePart() ) )
     195             :     {
     196           0 :         pScMod->InputEnterHandler();
     197           0 :         pTabViewShell->UpdateInputHandler();
     198             :     }
     199             : 
     200           0 :     switch ( nSlotId )
     201             :     {
     202             :         case SID_VIEW_DATA_SOURCE_BROWSER:
     203             :             {
     204             :                 //  check if database beamer is open
     205             : 
     206           0 :                 SfxViewFrame* pViewFrame = pTabViewShell->GetViewFrame();
     207           0 :                 sal_Bool bWasOpen = false;
     208             :                 {
     209           0 :                     uno::Reference<frame::XFrame> xFrame = pViewFrame->GetFrame().GetFrameInterface();
     210           0 :                     uno::Reference<frame::XFrame> xBeamerFrame = xFrame->findFrame(
     211             :                                                         OUString("_beamer"),
     212           0 :                                                         frame::FrameSearchFlag::CHILDREN);
     213           0 :                     if ( xBeamerFrame.is() )
     214           0 :                         bWasOpen = sal_True;
     215             :                 }
     216             : 
     217           0 :                 if ( bWasOpen )
     218             :                 {
     219             :                     //  close database beamer: just forward to SfxViewFrame
     220             : 
     221           0 :                     pViewFrame->ExecuteSlot( rReq );
     222             :                 }
     223             :                 else
     224             :                 {
     225             :                     //  show database beamer: SfxViewFrame call must be synchronous
     226             : 
     227           0 :                     pViewFrame->ExecuteSlot( rReq, (sal_Bool) false );      // sal_False = synchronous
     228             : 
     229             :                     //  select current database in database beamer
     230             : 
     231           0 :                     ScImportParam aImportParam;
     232           0 :                     ScDBData* pDBData = pTabViewShell->GetDBData(sal_True,SC_DB_OLD);       // don't create if none found
     233           0 :                     if (pDBData)
     234           0 :                         pDBData->GetImportParam( aImportParam );
     235             : 
     236           0 :                     ScDBDocFunc::ShowInBeamer( aImportParam, pTabViewShell->GetViewFrame() );
     237             :                 }
     238           0 :                 rReq.Done();        // needed because it's a toggle slot
     239             :             }
     240           0 :             break;
     241             : 
     242             :         case SID_REIMPORT_DATA:
     243             :             {
     244           0 :                 sal_Bool bOk = false;
     245           0 :                 ScDBData* pDBData = pTabViewShell->GetDBData(sal_True,SC_DB_OLD);
     246           0 :                 if (pDBData)
     247             :                 {
     248           0 :                     ScImportParam aImportParam;
     249           0 :                     pDBData->GetImportParam( aImportParam );
     250           0 :                     if (aImportParam.bImport && !pDBData->HasImportSelection())
     251             :                     {
     252           0 :                         pTabViewShell->ImportData( aImportParam );
     253           0 :                         pDBData->SetImportParam( aImportParam );    //! Undo ??
     254           0 :                         bOk = sal_True;
     255           0 :                     }
     256             :                 }
     257             : 
     258           0 :                 if (!bOk && ! rReq.IsAPI() )
     259           0 :                     pTabViewShell->ErrorMessage(STR_REIMPORT_EMPTY);
     260             : 
     261           0 :                 if( bOk )
     262           0 :                     rReq.Done();
     263             :             }
     264           0 :             break;
     265             : 
     266             :         case SID_REFRESH_DBAREA:
     267             :             {
     268           0 :                 ScDBData* pDBData = pTabViewShell->GetDBData(sal_True,SC_DB_OLD);
     269           0 :                 if (pDBData)
     270             :                 {
     271             :                     //  repeat import like SID_REIMPORT_DATA
     272             : 
     273           0 :                     sal_Bool bContinue = sal_True;
     274           0 :                     ScImportParam aImportParam;
     275           0 :                     pDBData->GetImportParam( aImportParam );
     276           0 :                     if (aImportParam.bImport && !pDBData->HasImportSelection())
     277             :                     {
     278           0 :                         bContinue = pTabViewShell->ImportData( aImportParam );
     279           0 :                         pDBData->SetImportParam( aImportParam );    //! Undo ??
     280             : 
     281             :                         //  mark (size may have been changed)
     282           0 :                         ScRange aNewRange;
     283           0 :                         pDBData->GetArea(aNewRange);
     284           0 :                         pTabViewShell->MarkRange(aNewRange);
     285             :                     }
     286             : 
     287           0 :                     if ( bContinue )        // fail at import -> break
     288             :                     {
     289             :                         //  internal operations, when any stored
     290             : 
     291           0 :                         if ( pDBData->HasQueryParam() || pDBData->HasSortParam() ||
     292           0 :                                                           pDBData->HasSubTotalParam() )
     293           0 :                             pTabViewShell->RepeatDB();
     294             : 
     295             :                         //  pivot tables that have the range as data source
     296             : 
     297           0 :                         ScRange aRange;
     298           0 :                         pDBData->GetArea(aRange);
     299           0 :                         GetViewData()->GetDocShell()->RefreshPivotTables(aRange);
     300           0 :                     }
     301             :                 }
     302           0 :                 rReq.Done();
     303             :             }
     304           0 :             break;
     305             : 
     306             :         case SID_SBA_BRW_INSERT:
     307             :             {
     308             :                 OSL_FAIL( "Deprecated Slot" );
     309             :             }
     310           0 :             break;
     311             : 
     312             :         case SID_DATA_FORM:
     313             :             {
     314           0 :                 ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
     315             :                 OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
     316             : 
     317             :                 AbstractScDataFormDlg* pDlg = pFact->CreateScDataFormDlg(
     318           0 :                     pTabViewShell->GetDialogParent(), pTabViewShell);
     319             :                 OSL_ENSURE(pDlg, "Dialog create fail!");
     320             : 
     321           0 :                 pDlg->Execute();
     322             : 
     323           0 :                 rReq.Done();
     324             :             }
     325           0 :             break;
     326             : 
     327             :         case SID_SUBTOTALS:
     328           0 :             ExecuteSubtotals(rReq);
     329           0 :             break;
     330             : 
     331             :         case SID_SORT_DESCENDING:
     332             :         case SID_SORT_ASCENDING:
     333             :             {
     334             :                 //#i60401 ux-ctest: Calc does not support all users' strategies regarding sorting data
     335             :                 //the patch comes from maoyg
     336           0 :                 ScSortParam aSortParam;
     337           0 :                 ScDBData*   pDBData = pTabViewShell->GetDBData();
     338           0 :                 ScViewData* pData   = GetViewData();
     339             : 
     340           0 :                 pDBData->GetSortParam( aSortParam );
     341             : 
     342           0 :                 if( lcl_GetSortParam( pData, aSortParam ) )
     343             :                 {
     344           0 :                     SfxItemSet  aArgSet( GetPool(), SCITEM_SORTDATA, SCITEM_SORTDATA );
     345           0 :                     SCCOL nCol  = GetViewData()->GetCurX();
     346           0 :                     SCCOL nTab  = GetViewData()->GetTabNo();
     347           0 :                     ScDocument* pDoc    = GetViewData()->GetDocument();
     348             : 
     349           0 :                     pDBData->GetSortParam( aSortParam );
     350           0 :                     sal_Bool bHasHeader = pDoc->HasColHeader( aSortParam.nCol1, aSortParam.nRow1, aSortParam.nCol2, aSortParam.nRow2, nTab );
     351             : 
     352           0 :                     if( nCol < aSortParam.nCol1 )
     353           0 :                         nCol = aSortParam.nCol1;
     354           0 :                     else if( nCol > aSortParam.nCol2 )
     355           0 :                         nCol = aSortParam.nCol2;
     356             : 
     357           0 :                     aSortParam.bHasHeader       = bHasHeader;
     358           0 :                     aSortParam.bByRow           = true;
     359           0 :                     aSortParam.bCaseSens        = false;
     360           0 :                     aSortParam.bNaturalSort     = false;
     361           0 :                     aSortParam.bIncludePattern  = true;
     362           0 :                     aSortParam.bInplace         = true;
     363           0 :                     aSortParam.maKeyState[0].bDoSort = true;
     364           0 :                     aSortParam.maKeyState[0].nField = nCol;
     365           0 :                     aSortParam.maKeyState[0].bAscending = ( nSlotId == SID_SORT_ASCENDING );
     366             : 
     367           0 :                     for ( sal_uInt16 i=1; i<aSortParam.GetSortKeyCount(); i++ )
     368           0 :                         aSortParam.maKeyState[i].bDoSort = false;
     369             : 
     370           0 :                     aArgSet.Put( ScSortItem( SCITEM_SORTDATA, GetViewData(), &aSortParam ) );
     371             : 
     372           0 :                     pTabViewShell->UISort( aSortParam );        // subtotal when needed new
     373             : 
     374           0 :                     rReq.Done();
     375           0 :                 }
     376             :             }
     377           0 :             break;
     378             : 
     379             :         case SID_SORT:
     380             :             {
     381           0 :                 const SfxItemSet* pArgs = rReq.GetArgs();
     382             : 
     383             :                 //#i60401 ux-ctest: Calc does not support all users' strategies regarding sorting data
     384             :                 //the patch comes from maoyg
     385             : 
     386           0 :                 if ( pArgs )        // Basic
     387             :                 {
     388           0 :                     ScSortParam aSortParam;
     389           0 :                     ScDBData*   pDBData = pTabViewShell->GetDBData();
     390           0 :                     ScViewData* pData   = GetViewData();
     391             : 
     392           0 :                     pDBData->GetSortParam( aSortParam );
     393             : 
     394           0 :                     if( lcl_GetSortParam( pData, aSortParam ) )
     395             :                     {
     396           0 :                         ScDocument* pDoc = GetViewData()->GetDocument();
     397             : 
     398           0 :                         pDBData->GetSortParam( aSortParam );
     399           0 :                         sal_Bool bHasHeader = pDoc->HasColHeader( aSortParam.nCol1, aSortParam.nRow1, aSortParam.nCol2, aSortParam.nRow2, pData->GetTabNo() );
     400           0 :                         if( bHasHeader )
     401           0 :                             aSortParam.bHasHeader = bHasHeader;
     402             : 
     403           0 :                         aSortParam.bInplace = sal_True;             // from Basic always
     404             : 
     405             :                         const SfxPoolItem* pItem;
     406           0 :                         if ( pArgs->GetItemState( SID_SORT_BYROW, sal_True, &pItem ) == SFX_ITEM_SET )
     407           0 :                             aSortParam.bByRow = static_cast<const SfxBoolItem*>(pItem)->GetValue();
     408           0 :                         if ( pArgs->GetItemState( SID_SORT_HASHEADER, sal_True, &pItem ) == SFX_ITEM_SET )
     409           0 :                             aSortParam.bHasHeader = static_cast<const SfxBoolItem*>(pItem)->GetValue();
     410           0 :                         if ( pArgs->GetItemState( SID_SORT_CASESENS, sal_True, &pItem ) == SFX_ITEM_SET )
     411           0 :                             aSortParam.bCaseSens = static_cast<const SfxBoolItem*>(pItem)->GetValue();
     412           0 :                         if ( pArgs->GetItemState( SID_SORT_NATURALSORT, true, &pItem ) == SFX_ITEM_SET )
     413           0 :                             aSortParam.bNaturalSort = static_cast<const SfxBoolItem*>(pItem)->GetValue();
     414           0 :                         if ( pArgs->GetItemState( SID_SORT_ATTRIBS, true, &pItem ) == SFX_ITEM_SET )
     415           0 :                             aSortParam.bIncludePattern = static_cast<const SfxBoolItem*>(pItem)->GetValue();
     416           0 :                         if ( pArgs->GetItemState( SID_SORT_USERDEF, sal_True, &pItem ) == SFX_ITEM_SET )
     417             :                         {
     418           0 :                             sal_uInt16 nUserIndex = static_cast<const SfxUInt16Item*>(pItem)->GetValue();
     419           0 :                             aSortParam.bUserDef = ( nUserIndex != 0 );
     420           0 :                             if ( nUserIndex )
     421           0 :                                 aSortParam.nUserIndex = nUserIndex - 1;     // Basic: 1-based
     422             :                         }
     423             : 
     424           0 :                         SCCOLROW nField0 = 0;
     425           0 :                         if ( pArgs->GetItemState( FN_PARAM_1, sal_True, &pItem ) == SFX_ITEM_SET )
     426           0 :                             nField0 = static_cast<const SfxInt32Item*>(pItem)->GetValue();
     427           0 :                         aSortParam.maKeyState[0].bDoSort = ( nField0 != 0 );
     428           0 :                         aSortParam.maKeyState[0].nField = nField0 > 0 ? (nField0-1) : 0;
     429           0 :                         if ( pArgs->GetItemState( FN_PARAM_2, sal_True, &pItem ) == SFX_ITEM_SET )
     430           0 :                             aSortParam.maKeyState[0].bAscending = static_cast<const SfxBoolItem*>(pItem)->GetValue();
     431           0 :                         SCCOLROW nField1 = 0;
     432           0 :                         if ( pArgs->GetItemState( FN_PARAM_3, sal_True, &pItem ) == SFX_ITEM_SET )
     433           0 :                             nField1 = static_cast<const SfxInt32Item*>(pItem)->GetValue();
     434           0 :                         aSortParam.maKeyState[1].bDoSort = ( nField1 != 0 );
     435           0 :                         aSortParam.maKeyState[1].nField = nField1 > 0 ? (nField1-1) : 0;
     436           0 :                         if ( pArgs->GetItemState( FN_PARAM_4, sal_True, &pItem ) == SFX_ITEM_SET )
     437           0 :                             aSortParam.maKeyState[1].bAscending = static_cast<const SfxBoolItem*>(pItem)->GetValue();
     438           0 :                         SCCOLROW nField2 = 0;
     439           0 :                         if ( pArgs->GetItemState( FN_PARAM_5, sal_True, &pItem ) == SFX_ITEM_SET )
     440           0 :                             nField2 = static_cast<const SfxInt32Item*>(pItem)->GetValue();
     441           0 :                         aSortParam.maKeyState[2].bDoSort = ( nField2 != 0 );
     442           0 :                         aSortParam.maKeyState[2].nField = nField2 > 0 ? (nField2-1) : 0;
     443           0 :                         if ( pArgs->GetItemState( FN_PARAM_6, sal_True, &pItem ) == SFX_ITEM_SET )
     444           0 :                             aSortParam.maKeyState[2].bAscending = static_cast<const SfxBoolItem*>(pItem)->GetValue();
     445             : 
     446             :                         // subtotal when needed new
     447           0 :                         pTabViewShell->UISort( aSortParam );
     448           0 :                         rReq.Done();
     449           0 :                     }
     450             :                 }
     451             :                 else
     452             :                 {
     453           0 :                     ScSortParam aSortParam;
     454           0 :                     ScDBData*   pDBData = pTabViewShell->GetDBData();
     455           0 :                     ScViewData* pData   = GetViewData();
     456             : 
     457           0 :                     pDBData->GetSortParam( aSortParam );
     458             : 
     459           0 :                     if( lcl_GetSortParam( pData, aSortParam ) )
     460             :                     {
     461           0 :                         SfxAbstractTabDialog* pDlg = NULL;
     462           0 :                         ScDocument* pDoc = GetViewData()->GetDocument();
     463           0 :                         SfxItemSet  aArgSet( GetPool(), SCITEM_SORTDATA, SCITEM_SORTDATA );
     464             : 
     465           0 :                         pDBData->GetSortParam( aSortParam );
     466           0 :                         sal_Bool bHasHeader = pDoc->HasColHeader( aSortParam.nCol1, aSortParam.nRow1, aSortParam.nCol2, aSortParam.nRow2, pData->GetTabNo() );
     467           0 :                         if( bHasHeader )
     468           0 :                             aSortParam.bHasHeader = bHasHeader;
     469             : 
     470           0 :                         aArgSet.Put( ScSortItem( SCITEM_SORTDATA, GetViewData(), &aSortParam ) );
     471             : 
     472           0 :                         ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
     473             :                         OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
     474             : 
     475           0 :                         pDlg = pFact->CreateScSortDlg( pTabViewShell->GetDialogParent(),  &aArgSet, RID_SCDLG_SORT );
     476             :                         OSL_ENSURE(pDlg, "Dialog create fail!");
     477           0 :                     pDlg->SetCurPageId(1);  // 1=sort field tab  2=sort options tab
     478             : 
     479           0 :                         if ( pDlg->Execute() == RET_OK )
     480             :                         {
     481           0 :                             const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
     482             :                             const ScSortParam& rOutParam = ((const ScSortItem&)
     483           0 :                                 pOutSet->Get( SCITEM_SORTDATA )).GetSortData();
     484             : 
     485             :                             // subtotal when needed new
     486             : 
     487           0 :                             pTabViewShell->UISort( rOutParam );
     488             : 
     489           0 :                             if ( rOutParam.bInplace )
     490             :                             {
     491             :                                 rReq.AppendItem( SfxBoolItem( SID_SORT_BYROW,
     492           0 :                                     rOutParam.bByRow ) );
     493             :                                 rReq.AppendItem( SfxBoolItem( SID_SORT_HASHEADER,
     494           0 :                                     rOutParam.bHasHeader ) );
     495             :                                 rReq.AppendItem( SfxBoolItem( SID_SORT_CASESENS,
     496           0 :                                     rOutParam.bCaseSens ) );
     497             :                             rReq.AppendItem( SfxBoolItem( SID_SORT_NATURALSORT,
     498           0 :                                                 rOutParam.bNaturalSort ) );
     499             :                                 rReq.AppendItem( SfxBoolItem( SID_SORT_ATTRIBS,
     500           0 :                                     rOutParam.bIncludePattern ) );
     501           0 :                                 sal_uInt16 nUser = rOutParam.bUserDef ? ( rOutParam.nUserIndex + 1 ) : 0;
     502           0 :                                 rReq.AppendItem( SfxUInt16Item( SID_SORT_USERDEF, nUser ) );
     503           0 :                                 if ( rOutParam.maKeyState[0].bDoSort )
     504             :                                 {
     505             :                                     rReq.AppendItem( SfxInt32Item( FN_PARAM_1,
     506           0 :                                         rOutParam.maKeyState[0].nField + 1 ) );
     507             :                                     rReq.AppendItem( SfxBoolItem( FN_PARAM_2,
     508           0 :                                         rOutParam.maKeyState[0].bAscending ) );
     509             :                                 }
     510           0 :                                 if ( rOutParam.maKeyState[1].bDoSort )
     511             :                                 {
     512             :                                     rReq.AppendItem( SfxInt32Item( FN_PARAM_3,
     513           0 :                                         rOutParam.maKeyState[1].nField + 1 ) );
     514             :                                     rReq.AppendItem( SfxBoolItem( FN_PARAM_4,
     515           0 :                                         rOutParam.maKeyState[1].bAscending ) );
     516             :                                 }
     517           0 :                                 if ( rOutParam.maKeyState[2].bDoSort )
     518             :                                 {
     519             :                                     rReq.AppendItem( SfxInt32Item( FN_PARAM_5,
     520           0 :                                         rOutParam.maKeyState[2].nField + 1 ) );
     521             :                                     rReq.AppendItem( SfxBoolItem( FN_PARAM_6,
     522           0 :                                         rOutParam.maKeyState[2].bAscending ) );
     523             :                                 }
     524             :                             }
     525             : 
     526           0 :                             rReq.Done();
     527             :                         }
     528             :                         else
     529           0 :                             GetViewData()->GetDocShell()->CancelAutoDBRange();
     530             : 
     531           0 :                         delete pDlg;
     532           0 :                     }
     533             :                 }
     534             :             }
     535           0 :             break;
     536             : 
     537             :         case SID_FILTER:
     538             :             {
     539           0 :                 const SfxItemSet* pArgs = rReq.GetArgs();
     540           0 :                 if ( pArgs )
     541             :                 {
     542             :                     OSL_FAIL("SID_FILTER with arguments?");
     543             :                     pTabViewShell->Query( ((const ScQueryItem&)
     544           0 :                             pArgs->Get( SCITEM_QUERYDATA )).GetQueryData(), NULL, sal_True );
     545           0 :                     rReq.Done();
     546             :                 }
     547             :                 else
     548             :                 {
     549           0 :                     sal_uInt16          nId  = ScFilterDlgWrapper::GetChildWindowId();
     550           0 :                     SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
     551           0 :                     SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
     552             : 
     553           0 :                     pScMod->SetRefDialog( nId, pWnd ? false : sal_True );
     554             :                 }
     555             :             }
     556           0 :             break;
     557             : 
     558             :         case SID_SPECIAL_FILTER:
     559             :             {
     560           0 :                 const SfxItemSet* pArgs = rReq.GetArgs();
     561           0 :                 if ( pArgs )
     562             :                 {
     563             :                     OSL_FAIL("SID_SPECIAL_FILTER with arguments?");
     564             :                     pTabViewShell->Query( ((const ScQueryItem&)
     565           0 :                             pArgs->Get( SCITEM_QUERYDATA )).GetQueryData(), NULL, sal_True );
     566           0 :                     rReq.Done();
     567             :                 }
     568             :                 else
     569             :                 {
     570           0 :                     sal_uInt16          nId  = ScSpecialFilterDlgWrapper::GetChildWindowId();
     571           0 :                     SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
     572           0 :                     SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
     573             : 
     574           0 :                     pScMod->SetRefDialog( nId, pWnd ? false : sal_True );
     575             :                 }
     576             :             }
     577           0 :             break;
     578             : 
     579             :         case FID_FILTER_OK:
     580             :             {
     581             :                 const SfxPoolItem* pItem;
     582           0 :                 if ( pReqArgs && SFX_ITEM_SET ==
     583           0 :                         pReqArgs->GetItemState( SCITEM_QUERYDATA, sal_True, &pItem ) )
     584             :                 {
     585           0 :                     const ScQueryItem& rQueryItem = static_cast<const ScQueryItem&>(*pItem);
     586             : 
     587           0 :                     SCTAB nCurTab = GetViewData()->GetTabNo();
     588           0 :                     SCTAB nRefTab = GetViewData()->GetRefTabNo();
     589             : 
     590             :                     // If RefInput switched to a different sheet from the data sheet,
     591             :                     // switch back:
     592             : 
     593           0 :                     if ( nCurTab != nRefTab )
     594             :                     {
     595           0 :                         pTabViewShell->SetTabNo( nRefTab );
     596           0 :                         pTabViewShell->PaintExtras();
     597             :                     }
     598             : 
     599           0 :                     ScRange aAdvSource;
     600           0 :                     if (rQueryItem.GetAdvancedQuerySource(aAdvSource))
     601           0 :                         pTabViewShell->Query( rQueryItem.GetQueryData(), &aAdvSource, sal_True );
     602             :                     else
     603           0 :                         pTabViewShell->Query( rQueryItem.GetQueryData(), NULL, sal_True );
     604           0 :                     rReq.Done( *pReqArgs );
     605             :                 }
     606             :             }
     607           0 :             break;
     608             : 
     609             :         case SID_UNFILTER:
     610             :             {
     611           0 :                 ScQueryParam aParam;
     612           0 :                 ScDBData*    pDBData = pTabViewShell->GetDBData();
     613             : 
     614           0 :                 pDBData->GetQueryParam( aParam );
     615           0 :                 SCSIZE nEC = aParam.GetEntryCount();
     616           0 :                 for (SCSIZE i=0; i<nEC; i++)
     617           0 :                     aParam.GetEntry(i).bDoQuery = false;
     618           0 :                 aParam.bDuplicate = sal_True;
     619           0 :                 pTabViewShell->Query( aParam, NULL, sal_True );
     620           0 :                 rReq.Done();
     621             :             }
     622           0 :             break;
     623             : 
     624             :         case SID_AUTO_FILTER:
     625           0 :             pTabViewShell->ToggleAutoFilter();
     626           0 :             rReq.Done();
     627           0 :             break;
     628             : 
     629             :         case SID_AUTOFILTER_HIDE:
     630           0 :             pTabViewShell->HideAutoFilter();
     631           0 :             rReq.Done();
     632           0 :             break;
     633             : 
     634             :         case SID_PIVOT_TABLE:
     635             :             {
     636             :                 const SfxPoolItem* pItem;
     637           0 :                 if ( pReqArgs && SFX_ITEM_SET ==
     638           0 :                         pReqArgs->GetItemState( SCITEM_PIVOTDATA, sal_True, &pItem ) )
     639             :                 {
     640           0 :                     SCTAB nCurTab = GetViewData()->GetTabNo();
     641           0 :                     SCTAB nRefTab = GetViewData()->GetRefTabNo();
     642             : 
     643             :                     // If RefInput switched to a different sheet from the data sheet,
     644             :                     // switch back:
     645             : 
     646           0 :                     if ( nCurTab != nRefTab )
     647             :                     {
     648           0 :                         pTabViewShell->SetTabNo( nRefTab );
     649           0 :                         pTabViewShell->PaintExtras();
     650             :                     }
     651             : 
     652           0 :                     const ScDPObject* pDPObject = pTabViewShell->GetDialogDPObject();
     653           0 :                     if ( pDPObject )
     654             :                     {
     655           0 :                         const ScPivotItem* pPItem = (const ScPivotItem*)pItem;
     656             :                         bool bSuccess = pTabViewShell->MakePivotTable(
     657           0 :                             pPItem->GetData(), pPItem->GetDestRange(), pPItem->IsNewSheet(), *pDPObject );
     658           0 :                         SfxBoolItem aRet(0, bSuccess);
     659           0 :                         rReq.SetReturnValue(aRet);
     660             :                     }
     661           0 :                     rReq.Done();
     662             :                 }
     663             : #ifndef DISABLE_SCRIPTING
     664           0 :                 else if (rReq.IsAPI())
     665           0 :                     SbxBase::SetError(SbxERR_BAD_PARAMETER);
     666             : #endif
     667             :             }
     668           0 :             break;
     669             : 
     670             :         case SID_OPENDLG_PIVOTTABLE:
     671           0 :             ExecuteDataPilotDialog();
     672           0 :             break;
     673             :         case SID_DEFINE_DBNAME:
     674             :             {
     675             : 
     676           0 :                 sal_uInt16          nId  = ScDbNameDlgWrapper::GetChildWindowId();
     677           0 :                 SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
     678           0 :                 SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
     679             : 
     680           0 :                 pScMod->SetRefDialog( nId, pWnd ? false : sal_True );
     681             : 
     682             :             }
     683           0 :             break;
     684             : 
     685             :         case SID_SELECT_DB:
     686             :             {
     687           0 :                 if ( pReqArgs )
     688             :                 {
     689             :                     const SfxStringItem* pItem =
     690           0 :                         (const SfxStringItem*)&pReqArgs->Get( SID_SELECT_DB );
     691             : 
     692           0 :                     if( pItem )
     693             :                     {
     694           0 :                         pTabViewShell->GotoDBArea( pItem->GetValue() );
     695           0 :                         rReq.Done();
     696             :                     }
     697             :                     else
     698             :                     {
     699             :                         OSL_FAIL("NULL");
     700             :                     }
     701             :                 }
     702             :                 else
     703             :                 {
     704           0 :                     ScDocument*     pDoc   = GetViewData()->GetDocument();
     705           0 :                     ScDBCollection* pDBCol = pDoc->GetDBCollection();
     706             : 
     707           0 :                     if ( pDBCol )
     708             :                     {
     709           0 :                         std::vector<String> aList;
     710           0 :                         const ScDBCollection::NamedDBs& rDBs = pDBCol->getNamedDBs();
     711           0 :                         ScDBCollection::NamedDBs::const_iterator itr = rDBs.begin(), itrEnd = rDBs.end();
     712           0 :                         for (; itr != itrEnd; ++itr)
     713           0 :                             aList.push_back(itr->GetName());
     714             : 
     715           0 :                         ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
     716             :                         OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
     717             : 
     718             :                         AbstractScSelEntryDlg* pDlg = pFact->CreateScSelEntryDlg( pTabViewShell->GetDialogParent(),
     719           0 :                                                                                 aList );
     720             :                         OSL_ENSURE(pDlg, "Dialog create fail!");
     721           0 :                         if ( pDlg->Execute() == RET_OK )
     722             :                         {
     723           0 :                             String aName = pDlg->GetSelectEntry();
     724           0 :                             pTabViewShell->GotoDBArea( aName );
     725           0 :                             rReq.AppendItem( SfxStringItem( SID_SELECT_DB, aName ) );
     726           0 :                             rReq.Done();
     727             :                         }
     728             : 
     729           0 :                         delete pDlg;
     730             :                     }
     731             :                 }
     732             :             }
     733           0 :             break;
     734             : 
     735             :         case SID_MANAGE_XML_SOURCE:
     736           0 :             ExecuteXMLSourceDialog();
     737           0 :         break;
     738             :         case FID_VALIDATION:
     739             :             {
     740             :                 const SfxPoolItem* pItem;
     741           0 :                 const SfxItemSet* pArgs = rReq.GetArgs();
     742           0 :                 if ( pArgs )
     743             :                 {
     744             :                     OSL_FAIL("later...");
     745             :                 }
     746             :                 else
     747             :                 {
     748           0 :                     ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
     749             :                     OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
     750           0 :                     ::GetTabPageRanges ScTPValidationValueGetRanges = pFact->GetTabPageRangesFunc(TP_VALIDATION_VALUES);
     751             :                     OSL_ENSURE(ScTPValidationValueGetRanges, "TabPage create fail!");
     752           0 :                     SfxItemSet aArgSet( GetPool(), (*ScTPValidationValueGetRanges)() );
     753           0 :                     ScValidationMode eMode = SC_VALID_ANY;
     754           0 :                     ScConditionMode eOper = SC_COND_EQUAL;
     755           0 :                     String aExpr1, aExpr2;
     756           0 :                     sal_Bool bBlank = sal_True;
     757           0 :                     sal_Int16 nListType = ValidListType::UNSORTED;
     758           0 :                     sal_Bool bShowHelp = false;
     759           0 :                     String aHelpTitle, aHelpText;
     760           0 :                     sal_Bool bShowError = false;
     761           0 :                     ScValidErrorStyle eErrStyle = SC_VALERR_STOP;
     762           0 :                     String aErrTitle, aErrText;
     763             : 
     764           0 :                     ScDocument* pDoc = GetViewData()->GetDocument();
     765           0 :                     SCCOL nCurX = GetViewData()->GetCurX();
     766           0 :                     SCROW nCurY = GetViewData()->GetCurY();
     767           0 :                     SCTAB nTab = GetViewData()->GetTabNo();
     768           0 :                     ScAddress aCursorPos( nCurX, nCurY, nTab );
     769             :                     sal_uLong nIndex = ((SfxUInt32Item*)pDoc->GetAttr(
     770           0 :                                 nCurX, nCurY, nTab, ATTR_VALIDDATA ))->GetValue();
     771           0 :                     if ( nIndex )
     772             :                     {
     773           0 :                         const ScValidationData* pOldData = pDoc->GetValidationEntry( nIndex );
     774           0 :                         if ( pOldData )
     775             :                         {
     776           0 :                             eMode = pOldData->GetDataMode();
     777           0 :                             eOper = pOldData->GetOperation();
     778           0 :                             sal_uLong nNumFmt = 0;
     779           0 :                             if ( eMode == SC_VALID_DATE || eMode == SC_VALID_TIME )
     780             :                             {
     781             :                                 short nType = ( eMode == SC_VALID_DATE ) ? NUMBERFORMAT_DATE
     782           0 :                                                                          : NUMBERFORMAT_TIME;
     783             :                                 nNumFmt = pDoc->GetFormatTable()->GetStandardFormat(
     784           0 :                                                                     nType, ScGlobal::eLnge );
     785             :                             }
     786           0 :                             aExpr1 = pOldData->GetExpression( aCursorPos, 0, nNumFmt );
     787           0 :                             aExpr2 = pOldData->GetExpression( aCursorPos, 1, nNumFmt );
     788           0 :                             bBlank = pOldData->IsIgnoreBlank();
     789           0 :                             nListType = pOldData->GetListType();
     790             : 
     791           0 :                             bShowHelp = pOldData->GetInput( aHelpTitle, aHelpText );
     792           0 :                             bShowError = pOldData->GetErrMsg( aErrTitle, aErrText, eErrStyle );
     793             : 
     794           0 :                             aArgSet.Put( SfxAllEnumItem( FID_VALID_MODE,        sal::static_int_cast<sal_uInt16>(eMode) ) );
     795           0 :                             aArgSet.Put( SfxAllEnumItem( FID_VALID_CONDMODE,    sal::static_int_cast<sal_uInt16>(eOper) ) );
     796           0 :                             aArgSet.Put( SfxStringItem(  FID_VALID_VALUE1,      aExpr1 ) );
     797           0 :                             aArgSet.Put( SfxStringItem(  FID_VALID_VALUE2,      aExpr2 ) );
     798           0 :                             aArgSet.Put( SfxBoolItem(    FID_VALID_BLANK,       bBlank ) );
     799           0 :                             aArgSet.Put( SfxInt16Item(   FID_VALID_LISTTYPE,    nListType ) );
     800           0 :                             aArgSet.Put( SfxBoolItem(    FID_VALID_SHOWHELP,    bShowHelp ) );
     801           0 :                             aArgSet.Put( SfxStringItem(  FID_VALID_HELPTITLE,   aHelpTitle ) );
     802           0 :                             aArgSet.Put( SfxStringItem(  FID_VALID_HELPTEXT,    aHelpText ) );
     803           0 :                             aArgSet.Put( SfxBoolItem(    FID_VALID_SHOWERR,     bShowError ) );
     804           0 :                             aArgSet.Put( SfxAllEnumItem( FID_VALID_ERRSTYLE,    sal::static_int_cast<sal_uInt16>(eErrStyle) ) );
     805           0 :                             aArgSet.Put( SfxStringItem(  FID_VALID_ERRTITLE,    aErrTitle ) );
     806           0 :                             aArgSet.Put( SfxStringItem(  FID_VALID_ERRTEXT,     aErrText ) );
     807             :                         }
     808             :                     }
     809             : 
     810             :                     // cell range picker
     811           0 :                     SfxAbstractTabDialog* pDlg = pFact->CreateScValidationDlg( NULL, &aArgSet, TAB_DLG_VALIDATION, pTabViewShell );
     812             :                     OSL_ENSURE(pDlg, "Dialog create fail!");
     813             : 
     814           0 :                     short nResult = pDlg->Execute();
     815             :                     //When picking Cell Range, other Tab may be switched. Need restore the correct tab
     816           0 :                     pTabViewShell->SetTabNo( nTab );
     817           0 :                     if ( nResult == RET_OK )
     818             :                     {
     819           0 :                         const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
     820             : 
     821           0 :                         if ( pOutSet->GetItemState( FID_VALID_MODE, sal_True, &pItem ) == SFX_ITEM_SET )
     822           0 :                             eMode = (ScValidationMode) ((const SfxAllEnumItem*)pItem)->GetValue();
     823           0 :                         if ( pOutSet->GetItemState( FID_VALID_CONDMODE, sal_True, &pItem ) == SFX_ITEM_SET )
     824           0 :                             eOper = (ScConditionMode) ((const SfxAllEnumItem*)pItem)->GetValue();
     825           0 :                         if ( pOutSet->GetItemState( FID_VALID_VALUE1, sal_True, &pItem ) == SFX_ITEM_SET )
     826             :                         {
     827           0 :                             String aTemp1 = ((const SfxStringItem*)pItem)->GetValue();
     828           0 :                             if (eMode == SC_VALID_DATE || eMode == SC_VALID_TIME)
     829             :                             {
     830           0 :                                 sal_uInt32 nNumIndex = 0;
     831             :                                 double nVal;
     832           0 :                                 if (pDoc->GetFormatTable()->IsNumberFormat(aTemp1, nNumIndex, nVal))
     833           0 :                                     aExpr1 =String( ::rtl::math::doubleToUString( nVal,
     834             :                                             rtl_math_StringFormat_Automatic, rtl_math_DecimalPlaces_Max,
     835           0 :                                             ScGlobal::pLocaleData->getNumDecimalSep()[0], sal_True));
     836             :                                 else
     837           0 :                                     aExpr1 = aTemp1;
     838             :                             }
     839             :                             else
     840           0 :                                 aExpr1 = aTemp1;
     841             :                         }
     842           0 :                         if ( pOutSet->GetItemState( FID_VALID_VALUE2, sal_True, &pItem ) == SFX_ITEM_SET )
     843             :                         {
     844           0 :                             String aTemp2 = ((const SfxStringItem*)pItem)->GetValue();
     845           0 :                             if (eMode == SC_VALID_DATE || eMode == SC_VALID_TIME)
     846             :                             {
     847           0 :                                 sal_uInt32 nNumIndex = 0;
     848             :                                 double nVal;
     849           0 :                                 if (pDoc->GetFormatTable()->IsNumberFormat(aTemp2, nNumIndex, nVal))
     850           0 :                                     aExpr2 =String( ::rtl::math::doubleToUString( nVal,
     851             :                                             rtl_math_StringFormat_Automatic, rtl_math_DecimalPlaces_Max,
     852           0 :                                             ScGlobal::pLocaleData->getNumDecimalSep()[0], sal_True));
     853             :                                 else
     854           0 :                                     aExpr2 = aTemp2;
     855             :                             }
     856             :                             else
     857           0 :                                 aExpr2 = aTemp2;
     858             :                         }
     859             : 
     860           0 :                         if ( pOutSet->GetItemState( FID_VALID_BLANK, sal_True, &pItem ) == SFX_ITEM_SET )
     861           0 :                             bBlank = ((const SfxBoolItem*)pItem)->GetValue();
     862           0 :                         if ( pOutSet->GetItemState( FID_VALID_LISTTYPE, sal_True, &pItem ) == SFX_ITEM_SET )
     863           0 :                             nListType = ((const SfxInt16Item*)pItem)->GetValue();
     864             : 
     865           0 :                         if ( pOutSet->GetItemState( FID_VALID_SHOWHELP, sal_True, &pItem ) == SFX_ITEM_SET )
     866           0 :                             bShowHelp = ((const SfxBoolItem*)pItem)->GetValue();
     867           0 :                         if ( pOutSet->GetItemState( FID_VALID_HELPTITLE, sal_True, &pItem ) == SFX_ITEM_SET )
     868           0 :                             aHelpTitle = ((const SfxStringItem*)pItem)->GetValue();
     869           0 :                         if ( pOutSet->GetItemState( FID_VALID_HELPTEXT, sal_True, &pItem ) == SFX_ITEM_SET )
     870           0 :                             aHelpText = ((const SfxStringItem*)pItem)->GetValue();
     871             : 
     872           0 :                         if ( pOutSet->GetItemState( FID_VALID_SHOWERR, sal_True, &pItem ) == SFX_ITEM_SET )
     873           0 :                             bShowError = ((const SfxBoolItem*)pItem)->GetValue();
     874           0 :                         if ( pOutSet->GetItemState( FID_VALID_ERRSTYLE, sal_True, &pItem ) == SFX_ITEM_SET )
     875           0 :                             eErrStyle = (ScValidErrorStyle) ((const SfxAllEnumItem*)pItem)->GetValue();
     876           0 :                         if ( pOutSet->GetItemState( FID_VALID_ERRTITLE, sal_True, &pItem ) == SFX_ITEM_SET )
     877           0 :                             aErrTitle = ((const SfxStringItem*)pItem)->GetValue();
     878           0 :                         if ( pOutSet->GetItemState( FID_VALID_ERRTEXT, sal_True, &pItem ) == SFX_ITEM_SET )
     879           0 :                             aErrText = ((const SfxStringItem*)pItem)->GetValue();
     880             : 
     881           0 :                         ScValidationData aData( eMode, eOper, aExpr1, aExpr2, pDoc, aCursorPos );
     882           0 :                         aData.SetIgnoreBlank( bBlank );
     883           0 :                         aData.SetListType( nListType );
     884             : 
     885           0 :                         aData.SetInput(aHelpTitle, aHelpText);          // sets bShowInput to TRUE
     886           0 :                         if (!bShowHelp)
     887           0 :                             aData.ResetInput();                         // reset only bShowInput
     888             : 
     889           0 :                         aData.SetError(aErrTitle, aErrText, eErrStyle); // sets bShowError to TRUE
     890           0 :                         if (!bShowError)
     891           0 :                             aData.ResetError();                         // reset only bShowError
     892             : 
     893           0 :                         pTabViewShell->SetValidation( aData );
     894           0 :                         pTabViewShell->TestHintWindow();
     895           0 :                         rReq.Done( *pOutSet );
     896             :                     }
     897             :                     //after end execute from !IsModalInputMode, it is safer to delay deleting
     898             :                     //delete pDlg;
     899           0 :                     Application::PostUserEvent( Link( pDlg, &DelayDeleteAbstractDialog ) );
     900             :                 }
     901             :             }
     902           0 :             break;
     903             : 
     904             :         case SID_TEXT_TO_COLUMNS:
     905             :             {
     906           0 :                 ScViewData* pData = GetViewData();
     907             :                 OSL_ENSURE( pData, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pData is null!" );
     908           0 :                 ScRange aRange;
     909             : 
     910           0 :                 if ( lcl_GetTextToColumnsRange( pData, aRange ) )
     911             :                 {
     912           0 :                     ScDocument* pDoc = pData->GetDocument();
     913             :                     OSL_ENSURE( pDoc, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pDoc is null!" );
     914             : 
     915           0 :                     ScImportExport aExport( pDoc, aRange );
     916           0 :                     aExport.SetExportTextOptions( ScExportTextOptions( ScExportTextOptions::None, 0, false ) );
     917             : 
     918             :                     // #i87703# text to columns fails with tab separator
     919           0 :                     aExport.SetDelimiter( static_cast< sal_Unicode >( 0 ) );
     920             : 
     921           0 :                     SvMemoryStream aStream;
     922           0 :                     aStream.SetStreamCharSet( RTL_TEXTENCODING_UNICODE );
     923           0 :                     ScImportExport::SetNoEndianSwap( aStream );
     924           0 :                     aExport.ExportStream( aStream, String(), FORMAT_STRING );
     925             : 
     926           0 :                     ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
     927             :                     OSL_ENSURE( pFact, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pFact is null!" );
     928             :                     AbstractScImportAsciiDlg *pDlg = pFact->CreateScImportAsciiDlg(
     929           0 :                         NULL, String(), &aStream, SC_TEXTTOCOLUMNS);
     930             :                     OSL_ENSURE( pDlg, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pDlg is null!" );
     931             : 
     932           0 :                     if ( pDlg->Execute() == RET_OK )
     933             :                     {
     934           0 :                         ScDocShell* pDocSh = pData->GetDocShell();
     935             :                         OSL_ENSURE( pDocSh, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pDocSh is null!" );
     936             : 
     937           0 :                         String aUndo = ScGlobal::GetRscString( STR_UNDO_TEXTTOCOLUMNS );
     938           0 :                         pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo );
     939             : 
     940           0 :                         ScImportExport aImport( pDoc, aRange.aStart );
     941           0 :                         ScAsciiOptions aOptions;
     942           0 :                         pDlg->GetOptions( aOptions );
     943           0 :                         pDlg->SaveParameters();
     944           0 :                         aImport.SetExtOptions( aOptions );
     945           0 :                         aImport.SetApi( false );
     946           0 :                         aStream.Seek( 0 );
     947           0 :                         aImport.ImportStream( aStream, String(), FORMAT_STRING );
     948             : 
     949           0 :                         pDocSh->GetUndoManager()->LeaveListAction();
     950             :                     }
     951           0 :                     delete pDlg;
     952             :                 }
     953             :             }
     954           0 :             break;
     955             :         }
     956           0 : }
     957             : 
     958         491 : void ScCellShell::GetDBState( SfxItemSet& rSet )
     959             : {
     960         491 :     ScTabViewShell* pTabViewShell   = GetViewData()->GetViewShell();
     961         491 :     ScViewData* pData       = GetViewData();
     962         491 :     ScDocShell* pDocSh      = pData->GetDocShell();
     963         491 :     ScDocument* pDoc        = pDocSh->GetDocument();
     964         491 :     SCCOL       nPosX       = pData->GetCurX();
     965         491 :     SCROW       nPosY       = pData->GetCurY();
     966         491 :     SCTAB       nTab        = pData->GetTabNo();
     967             : 
     968         491 :     sal_Bool bAutoFilter = false;
     969         491 :     sal_Bool bAutoFilterTested = false;
     970             : 
     971         491 :     SfxWhichIter aIter(rSet);
     972         491 :     sal_uInt16 nWhich = aIter.FirstWhich();
     973        1555 :     while (nWhich)
     974             :     {
     975         573 :         switch (nWhich)
     976             :         {
     977             :             case SID_REFRESH_DBAREA:
     978             :                 {
     979             :                     //  imported data without selection
     980             :                     //  or filter,sort,subtotal (also without import)
     981           0 :                     sal_Bool bOk = false;
     982           0 :                     ScDBData* pDBData = pTabViewShell->GetDBData(false,SC_DB_OLD);
     983           0 :                     if (pDBData && pDoc->GetChangeTrack() == NULL)
     984             :                     {
     985           0 :                         if ( pDBData->HasImportParam() )
     986           0 :                             bOk = !pDBData->HasImportSelection();
     987             :                         else
     988             :                         {
     989           0 :                             bOk = pDBData->HasQueryParam() ||
     990           0 :                                   pDBData->HasSortParam() ||
     991           0 :                                   pDBData->HasSubTotalParam();
     992             :                         }
     993             :                     }
     994           0 :                     if (!bOk)
     995           0 :                         rSet.DisableItem( nWhich );
     996             :                 }
     997           0 :                 break;
     998             : 
     999             :             case SID_FILTER:
    1000             :             case SID_SPECIAL_FILTER:
    1001             :                 {
    1002           0 :                     ScRange aDummy;
    1003           0 :                     ScMarkType eMarkType = GetViewData()->GetSimpleArea( aDummy);
    1004           0 :                     if (eMarkType != SC_MARK_SIMPLE && eMarkType != SC_MARK_SIMPLE_FILTERED)
    1005             :                     {
    1006           0 :                         rSet.DisableItem( nWhich );
    1007             :                     }
    1008             :                 }
    1009           0 :                 break;
    1010             : 
    1011             : 
    1012             :                 //in case of Redlining and multiselection disable
    1013             :             case SID_SORT_ASCENDING:
    1014             :             case SID_SORT_DESCENDING:
    1015             :             case SCITEM_SORTDATA:
    1016             :             case SCITEM_SUBTDATA:
    1017             :             case SID_OPENDLG_PIVOTTABLE:
    1018             :                 {
    1019             :                     //! move ReadOnly check to idl flags
    1020             : 
    1021         764 :                     if ( pDocSh->IsReadOnly() || pDoc->GetChangeTrack()!=NULL ||
    1022         382 :                             GetViewData()->IsMultiMarked() )
    1023             :                     {
    1024           0 :                         rSet.DisableItem( nWhich );
    1025             :                     }
    1026             :                 }
    1027         382 :                 break;
    1028             : 
    1029             :             case SID_REIMPORT_DATA:
    1030             :                 {
    1031             :                     //  only imported data without selection
    1032           0 :                     ScDBData* pDBData = pTabViewShell->GetDBData(false,SC_DB_OLD);
    1033           0 :                     if (!pDBData || !pDBData->HasImportParam() || pDBData->HasImportSelection() ||
    1034           0 :                         pDoc->GetChangeTrack()!=NULL)
    1035             :                     {
    1036           0 :                         rSet.DisableItem( nWhich );
    1037             :                     }
    1038             :                 }
    1039           0 :                 break;
    1040             : 
    1041             :             case SID_VIEW_DATA_SOURCE_BROWSER:
    1042             :                 {
    1043         191 :                     if (!SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::E_SDATABASE))
    1044           0 :                         rSet.Put(SfxVisibilityItem(nWhich, false));
    1045             :                     else
    1046             :                         //  get state (BoolItem) from SfxViewFrame
    1047         191 :                         pTabViewShell->GetViewFrame()->GetSlotState( nWhich, NULL, &rSet );
    1048             :                 }
    1049         191 :                 break;
    1050             :             case SID_SBA_BRW_INSERT:
    1051             :                 {
    1052             :                     //  SBA wants a sal_Bool-item, enabled
    1053             : 
    1054           0 :                     sal_Bool bEnable = sal_True;
    1055           0 :                     rSet.Put(SfxBoolItem(nWhich, bEnable));
    1056             :                 }
    1057           0 :                 break;
    1058             : 
    1059             :             case SID_AUTO_FILTER:
    1060             :             case SID_AUTOFILTER_HIDE:
    1061             :                 {
    1062           0 :                     if (!bAutoFilterTested)
    1063             :                     {
    1064           0 :                         bAutoFilter = pDoc->HasAutoFilter( nPosX, nPosY, nTab );
    1065           0 :                         bAutoFilterTested = sal_True;
    1066             :                     }
    1067           0 :                     if ( nWhich == SID_AUTO_FILTER )
    1068             :                     {
    1069           0 :                         ScRange aDummy;
    1070           0 :                         ScMarkType eMarkType = GetViewData()->GetSimpleArea( aDummy);
    1071           0 :                         if (eMarkType != SC_MARK_SIMPLE && eMarkType != SC_MARK_SIMPLE_FILTERED)
    1072             :                         {
    1073           0 :                             rSet.DisableItem( nWhich );
    1074             :                         }
    1075           0 :                         else if (pDoc->GetDPAtBlock(aDummy))
    1076             :                         {
    1077           0 :                             rSet.DisableItem( nWhich );
    1078             :                         }
    1079             :                         else
    1080           0 :                             rSet.Put( SfxBoolItem( nWhich, bAutoFilter ) );
    1081             :                     }
    1082             :                     else
    1083           0 :                         if (!bAutoFilter)
    1084           0 :                             rSet.DisableItem( nWhich );
    1085             :                 }
    1086           0 :                 break;
    1087             : 
    1088             :             case SID_UNFILTER:
    1089             :                 {
    1090             :                     SCCOL nStartCol, nEndCol;
    1091             :                     SCROW  nStartRow, nEndRow;
    1092             :                     SCTAB  nStartTab, nEndTab;
    1093           0 :                     sal_Bool bAnyQuery = false;
    1094             : 
    1095             :                     sal_Bool bSelected = (GetViewData()->GetSimpleArea(
    1096           0 :                                 nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab )
    1097           0 :                             == SC_MARK_SIMPLE);
    1098             : 
    1099           0 :                     if ( bSelected )
    1100             :                     {
    1101           0 :                         if (nStartCol==nEndCol && nStartRow==nEndRow)
    1102           0 :                             bSelected = false;
    1103             :                     }
    1104             :                     else
    1105             :                     {
    1106           0 :                         nStartCol = GetViewData()->GetCurX();
    1107           0 :                         nStartRow = GetViewData()->GetCurY();
    1108           0 :                         nStartTab = GetViewData()->GetTabNo();
    1109             :                     }
    1110             : 
    1111             :                     ScDBData* pDBData = bSelected
    1112           0 :                                 ? pDoc->GetDBAtArea( nStartTab, nStartCol, nStartRow, nEndCol, nEndRow )
    1113           0 :                                 : pDoc->GetDBAtCursor( nStartCol, nStartRow, nStartTab );
    1114             : 
    1115           0 :                     if ( pDBData )
    1116             :                     {
    1117           0 :                         ScQueryParam aParam;
    1118           0 :                         pDBData->GetQueryParam( aParam );
    1119           0 :                         if ( aParam.GetEntry(0).bDoQuery )
    1120           0 :                             bAnyQuery = sal_True;
    1121             :                     }
    1122             : 
    1123           0 :                     if ( !bAnyQuery )
    1124           0 :                         rSet.DisableItem( nWhich );
    1125             :                 }
    1126           0 :                 break;
    1127             : 
    1128             :             case SID_DEFINE_DBNAME:
    1129             :                 {
    1130           0 :                     if ( pDocSh && pDocSh->IsDocShared() )
    1131             :                     {
    1132           0 :                         rSet.DisableItem( nWhich );
    1133             :                     }
    1134             :                 }
    1135           0 :                 break;
    1136             : 
    1137             :             case SID_TEXT_TO_COLUMNS:
    1138             :                 {
    1139           0 :                     ScRange aRange;
    1140           0 :                     if ( !lcl_GetTextToColumnsRange( pData, aRange ) )
    1141             :                     {
    1142           0 :                         rSet.DisableItem( nWhich );
    1143             :                     }
    1144             :                 }
    1145           0 :                 break;
    1146             :         }
    1147         573 :         nWhich = aIter.NextWhich();
    1148         491 :     }
    1149         584 : }
    1150             : 
    1151             : 
    1152             : 
    1153             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10