/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ #include //------------------------------------------------------------------ //svdraw.hxx #define _SDR_NOITEMS #define _SDR_NOTOUCH #define _SDR_NOTRANSFORM #define _SI_NOSBXCONTROLS #define _VCONT_HXX #define _SI_NOOTHERFORMS #define _VCTRLS_HXX #define _SI_NOCONTROL #define _SETBRW_HXX #define _VCBRW_HXX #define _SI_NOSBXCONTROLS //------------------------------------------------------------------ #include #include #include "scitems.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "cellsh.hxx" #include "sc.hrc" #include "document.hxx" #include "patattr.hxx" #include "scmod.hxx" #include "scresid.hxx" #include "tabvwsh.hxx" #include "impex.hxx" #include "reffind.hxx" #include "uiitems.hxx" #include "reffact.hxx" #include "inputhdl.hxx" #include "transobj.hxx" #include "drwtrans.hxx" #include "docfunc.hxx" #include "editable.hxx" #include "dpobject.hxx" #include "dpsave.hxx" #include "dpgroup.hxx" // for ScDPNumGroupInfo #include "spellparam.hxx" #include "postit.hxx" #include "clipparam.hxx" #include "pivot.hxx" #include "dpsdbtab.hxx" // ScImportSourceDesc #include "dpshttab.hxx" // ScSheetSourceDesc #include "dbdata.hxx" #include "docsh.hxx" #include "cliputil.hxx" #include "markdata.hxx" #include "docpool.hxx" #include "globstr.hrc" #include "scui_def.hxx" #include #include "scabstdlg.hxx" #include #include #include #include #include #include #include #include using namespace ::com::sun::star; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::uno; using ::rtl::OUString; //------------------------------------------------------------------ void ScCellShell::ExecuteEdit( SfxRequest& rReq ) { ScModule* pScMod = SC_MOD(); ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell(); SfxBindings& rBindings = pTabViewShell->GetViewFrame()->GetBindings(); const SfxItemSet* pReqArgs = rReq.GetArgs(); sal_uInt16 nSlot = rReq.GetSlot(); pTabViewShell->HideListBox(); // Autofilter-DropDown-Listbox // finish input if ( GetViewData()->HasEditView( GetViewData()->GetActivePart() ) ) { switch ( nSlot ) { case FID_DEFINE_NAME: case FID_ADD_NAME: case FID_USE_NAME: case FID_INSERT_NAME: case SID_SPELL_DIALOG: case SID_HANGUL_HANJA_CONVERSION: pScMod->InputEnterHandler(); pTabViewShell->UpdateInputHandler(); break; default: break; } } switch ( nSlot ) { // // insert / delete cells / rows / columns // case FID_INS_ROW: pTabViewShell->InsertCells(INS_INSROWS); rReq.Done(); break; case FID_INS_COLUMN: pTabViewShell->InsertCells(INS_INSCOLS); rReq.Done(); break; case FID_INS_CELLSDOWN: pTabViewShell->InsertCells(INS_CELLSDOWN); rReq.Done(); break; case FID_INS_CELLSRIGHT: pTabViewShell->InsertCells(INS_CELLSRIGHT); rReq.Done(); break; case SID_DEL_ROWS: pTabViewShell->DeleteCells( DEL_DELROWS ); rReq.Done(); break; case SID_DEL_COLS: pTabViewShell->DeleteCells( DEL_DELCOLS ); rReq.Done(); break; case FID_INS_CELL: { InsCellCmd eCmd=INS_NONE; if ( pReqArgs ) { const SfxPoolItem* pItem; String aFlags; if( pReqArgs->HasItem( FID_INS_CELL, &pItem ) ) aFlags = ((const SfxStringItem*)pItem)->GetValue(); if( aFlags.Len() ) { switch( aFlags.GetChar(0) ) { case 'V': eCmd = INS_CELLSDOWN ;break; case '>': eCmd = INS_CELLSRIGHT ;break; case 'R': eCmd = INS_INSROWS ;break; case 'C': eCmd = INS_INSCOLS ;break; } } } else { if ( GetViewData()->SimpleColMarked() ) eCmd = INS_INSCOLS; else if ( GetViewData()->SimpleRowMarked() ) eCmd = INS_INSROWS; else { ScDocument* pDoc = GetViewData()->GetDocument(); sal_Bool bTheFlag=(pDoc->GetChangeTrack()!=NULL); ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); OSL_ENSURE(pFact, "ScAbstractFactory create fail!"); AbstractScInsertCellDlg* pDlg = pFact->CreateScInsertCellDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_INSCELL, bTheFlag); OSL_ENSURE(pDlg, "Dialog create fail!"); if (pDlg->Execute() == RET_OK) eCmd = pDlg->GetInsCellCmd(); delete pDlg; } } if (eCmd!=INS_NONE) { pTabViewShell->InsertCells( eCmd ); if( ! rReq.IsAPI() ) { String aParam; switch( eCmd ) { case INS_CELLSDOWN: aParam='V'; break; case INS_CELLSRIGHT: aParam='>'; break; case INS_INSROWS: aParam='R'; break; case INS_INSCOLS: aParam='C'; break; default: { // added to avoid warnings } } rReq.AppendItem( SfxStringItem( FID_INS_CELL, aParam ) ); rReq.Done(); } } } break; case FID_DELETE_CELL: { DelCellCmd eCmd = DEL_NONE; if ( pReqArgs ) { const SfxPoolItem* pItem; String aFlags; if( pReqArgs->HasItem( FID_DELETE_CELL, &pItem ) ) aFlags = ((const SfxStringItem*)pItem)->GetValue(); if( aFlags.Len() ) { switch( aFlags.GetChar(0) ) { case 'U': eCmd = DEL_CELLSUP ;break; case 'L': eCmd = DEL_CELLSLEFT ;break; case 'R': eCmd = DEL_DELROWS ;break; case 'C': eCmd = DEL_DELCOLS ;break; } } } else { if ( GetViewData()->SimpleColMarked() ) eCmd = DEL_DELCOLS; else if ( GetViewData()->SimpleRowMarked() ) eCmd = DEL_DELROWS; else { ScRange aRange; ScDocument* pDoc = GetViewData()->GetDocument(); sal_Bool bTheFlag=GetViewData()->IsMultiMarked() || (GetViewData()->GetSimpleArea(aRange) == SC_MARK_SIMPLE_FILTERED) || (pDoc->GetChangeTrack() != NULL); ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); OSL_ENSURE(pFact, "ScAbstractFactory create fail!"); AbstractScDeleteCellDlg* pDlg = pFact->CreateScDeleteCellDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_DELCELL, bTheFlag ); OSL_ENSURE(pDlg, "Dialog create fail!"); if (pDlg->Execute() == RET_OK) eCmd = pDlg->GetDelCellCmd(); delete pDlg; } } if (eCmd != DEL_NONE ) { pTabViewShell->DeleteCells( eCmd ); if( ! rReq.IsAPI() ) { String aParam; switch( eCmd ) { case DEL_CELLSUP: aParam='U'; break; case DEL_CELLSLEFT: aParam='L'; break; case DEL_DELROWS: aParam='R'; break; case DEL_DELCOLS: aParam='C'; break; default: { // added to avoid warnings } } rReq.AppendItem( SfxStringItem( FID_DELETE_CELL, aParam ) ); rReq.Done(); } } } break; // // delete contents from cells // case SID_DELETE_CONTENTS: pTabViewShell->DeleteContents( IDF_CONTENTS ); rReq.Done(); break; case SID_DELETE: { sal_uInt16 nFlags = IDF_NONE; if ( pReqArgs!=NULL && pTabViewShell->SelectionEditable() ) { const SfxPoolItem* pItem; String aFlags = 'A'; if( pReqArgs->HasItem( SID_DELETE, &pItem ) ) aFlags = ((const SfxStringItem*)pItem)->GetValue(); aFlags.ToUpperAscii(); sal_Bool bCont = sal_True; for( xub_StrLen i=0 ; bCont && iCreateScDeleteContentsDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_DELCONT ); OSL_ENSURE(pDlg, "Dialog create fail!"); ScDocument* pDoc = GetViewData()->GetDocument(); SCTAB nTab = GetViewData()->GetTabNo(); if ( pDoc->IsTabProtected(nTab) ) pDlg->DisableObjects(); if (pDlg->Execute() == RET_OK) { nFlags = pDlg->GetDelContentsCmdBits(); } delete pDlg; } else pTabViewShell->ErrorMessage(aTester.GetMessageId()); } if( nFlags != IDF_NONE ) { pTabViewShell->DeleteContents( nFlags ); if( ! rReq.IsAPI() ) { String aFlags; if( nFlags == IDF_ALL ) { aFlags += 'A'; } else { if( nFlags & IDF_STRING ) aFlags += 'S'; if( nFlags & IDF_VALUE ) aFlags += 'V'; if( nFlags & IDF_DATETIME ) aFlags += 'D'; if( nFlags & IDF_FORMULA ) aFlags += 'F'; if( nFlags & IDF_NOTE ) aFlags += 'N'; if( nFlags & IDF_ATTRIB ) aFlags += 'T'; if( nFlags & IDF_OBJECTS ) aFlags += 'O'; } rReq.AppendItem( SfxStringItem( SID_DELETE, aFlags ) ); rReq.Done(); } } } break; // // fill... // case FID_FILL_TO_BOTTOM: pTabViewShell->FillSimple( FILL_TO_BOTTOM ); rReq.Done(); break; case FID_FILL_TO_RIGHT: pTabViewShell->FillSimple( FILL_TO_RIGHT ); rReq.Done(); break; case FID_FILL_TO_TOP: pTabViewShell->FillSimple( FILL_TO_TOP ); rReq.Done(); break; case FID_FILL_TO_LEFT: pTabViewShell->FillSimple( FILL_TO_LEFT ); rReq.Done(); break; case FID_FILL_TAB: { sal_uInt16 nFlags = IDF_NONE; sal_uInt16 nFunction = PASTE_NOFUNC; sal_Bool bSkipEmpty = false; sal_Bool bAsLink = false; if ( pReqArgs!=NULL && pTabViewShell->SelectionEditable() ) { const SfxPoolItem* pItem; String aFlags = 'A'; if( pReqArgs->HasItem( FID_FILL_TAB, &pItem ) ) aFlags = ((const SfxStringItem*)pItem)->GetValue(); aFlags.ToUpperAscii(); sal_Bool bCont = sal_True; for( xub_StrLen i=0 ; bCont && iCreateScInsertContentsDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_INSCONT, 0, /* nCheckDefaults */ &ScGlobal::GetRscString(STR_FILL_TAB)); OSL_ENSURE(pDlg, "Dialog create fail!"); pDlg->SetFillMode(true); if (pDlg->Execute() == RET_OK) { nFlags = pDlg->GetInsContentsCmdBits(); nFunction = pDlg->GetFormulaCmdBits(); bSkipEmpty = pDlg->IsSkipEmptyCells(); bAsLink = pDlg->IsLink(); // there is no MoveMode with fill tabs } delete pDlg; } if( nFlags != IDF_NONE ) { pTabViewShell->FillTab( nFlags, nFunction, bSkipEmpty, bAsLink ); if( ! rReq.IsAPI() ) { String aFlags; if( nFlags == IDF_ALL ) { aFlags += 'A'; } else { if( nFlags & IDF_STRING ) aFlags += 'S'; if( nFlags & IDF_VALUE ) aFlags += 'V'; if( nFlags & IDF_DATETIME ) aFlags += 'D'; if( nFlags & IDF_FORMULA ) aFlags += 'F'; if( nFlags & IDF_NOTE ) aFlags += 'N'; if( nFlags & IDF_ATTRIB ) aFlags += 'T'; } rReq.AppendItem( SfxStringItem( FID_FILL_TAB, aFlags ) ); rReq.Done(); } } } break; case FID_FILL_SERIES: { SCCOL nStartCol; SCROW nStartRow; SCTAB nStartTab; SCCOL nEndCol; SCROW nEndRow; SCTAB nEndTab; sal_uInt16 nPossDir = FDS_OPT_NONE; FillDir eFillDir = FILL_TO_BOTTOM; FillCmd eFillCmd = FILL_LINEAR; FillDateCmd eFillDateCmd = FILL_DAY; double fStartVal = MAXDOUBLE; double fIncVal = 1; double fMaxVal = MAXDOUBLE; sal_Bool bDoIt = false; GetViewData()->GetSimpleArea( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab ); if( nStartCol!=nEndCol ) { nPossDir |= FDS_OPT_HORZ; eFillDir=FILL_TO_RIGHT; } if( nStartRow!=nEndRow ) { nPossDir |= FDS_OPT_VERT; eFillDir=FILL_TO_BOTTOM; } ScDocument* pDoc = GetViewData()->GetDocument(); SvNumberFormatter* pFormatter = pDoc->GetFormatTable(); if( pReqArgs ) { const SfxPoolItem* pItem; String aFillDir, aFillCmd, aFillDateCmd; String aFillStep, aFillStart, aFillMax; sal_uInt32 nKey; double fTmpVal; bDoIt=false; if( pReqArgs->HasItem( FID_FILL_SERIES, &pItem ) ) aFillDir = ((const SfxStringItem*)pItem)->GetValue(); if( pReqArgs->HasItem( FN_PARAM_1, &pItem ) ) aFillCmd = ((const SfxStringItem*)pItem)->GetValue(); if( pReqArgs->HasItem( FN_PARAM_2, &pItem ) ) aFillDateCmd = ((const SfxStringItem*)pItem)->GetValue(); if( pReqArgs->HasItem( FN_PARAM_3, &pItem ) ) aFillStep = ((const SfxStringItem*)pItem)->GetValue(); if( pReqArgs->HasItem( FN_PARAM_4, &pItem ) ) aFillStart = ((const SfxStringItem*)pItem)->GetValue(); if( pReqArgs->HasItem( FN_PARAM_5, &pItem ) ) aFillMax = ((const SfxStringItem*)pItem)->GetValue(); if( aFillDir.Len() ) switch( aFillDir.GetChar(0) ) { case 'B': case 'b': eFillDir=FILL_TO_BOTTOM; break; case 'R': case 'r': eFillDir=FILL_TO_RIGHT; break; case 'T': case 't': eFillDir=FILL_TO_TOP; break; case 'L': case 'l': eFillDir=FILL_TO_LEFT; break; } if( aFillCmd.Len() ) switch( aFillCmd.GetChar(0) ) { case 'S': case 's': eFillCmd=FILL_SIMPLE; break; case 'L': case 'l': eFillCmd=FILL_LINEAR; break; case 'G': case 'g': eFillCmd=FILL_GROWTH; break; case 'D': case 'd': eFillCmd=FILL_DATE; break; case 'A': case 'a': eFillCmd=FILL_AUTO; break; } if( aFillDateCmd.Len() ) switch( aFillDateCmd.GetChar(0) ) { case 'D': case 'd': eFillDateCmd=FILL_DAY; break; case 'W': case 'w': eFillDateCmd=FILL_WEEKDAY; break; case 'M': case 'm': eFillDateCmd=FILL_MONTH; break; case 'Y': case 'y': eFillDateCmd=FILL_YEAR; break; } nKey = 0; if( pFormatter->IsNumberFormat( aFillStart, nKey, fTmpVal )) fStartVal = fTmpVal; nKey = 0; if( pFormatter->IsNumberFormat( aFillStep, nKey, fTmpVal )) fIncVal = fTmpVal; nKey = 0; if( pFormatter->IsNumberFormat( aFillMax, nKey, fTmpVal )) fMaxVal = fTmpVal; bDoIt = sal_True; } else // (pReqArgs == NULL) => raise Dialog { sal_uInt32 nPrivFormat; CellType eCellType; pDoc->GetNumberFormat( nStartCol, nStartRow, nStartTab, nPrivFormat ); pDoc->GetCellType( nStartCol, nStartRow, nStartTab,eCellType ); const SvNumberformat* pPrivEntry = pFormatter->GetEntry( nPrivFormat ); if (!pPrivEntry) { OSL_FAIL("Numberformat not found !!!"); } else { short nPrivType = pPrivEntry->GetType(); if ( ( nPrivType & NUMBERFORMAT_DATE)>0) { eFillCmd=FILL_DATE; } else if(eCellType==CELLTYPE_STRING) { eFillCmd=FILL_AUTO; } } // String aStartStr; // suggest default Startvalue only, when just 1 row or column if ( nStartCol == nEndCol || nStartRow == nEndRow ) { double fInputEndVal = 0.0; String aEndStr; pDoc->GetInputString( nStartCol, nStartRow, nStartTab, aStartStr); pDoc->GetValue( nStartCol, nStartRow, nStartTab, fStartVal ); if(eFillDir==FILL_TO_BOTTOM && nStartRow < nEndRow ) { pDoc->GetInputString( nStartCol, nStartRow+1, nStartTab, aEndStr); if(aEndStr.Len()>0) { pDoc->GetValue( nStartCol, nStartRow+1, nStartTab, fInputEndVal); fIncVal=fInputEndVal-fStartVal; } } else { if(nStartCol < nEndCol) { pDoc->GetInputString( nStartCol+1, nStartRow, nStartTab, aEndStr); if(aEndStr.Len()>0) { pDoc->GetValue( nStartCol+1, nStartRow, nStartTab, fInputEndVal); fIncVal=fInputEndVal-fStartVal; } } } if(eFillCmd==FILL_DATE) { Date aNullDate = *pDoc->GetFormatTable()->GetNullDate(); Date aStartDate = aNullDate; aStartDate+= (long)fStartVal; Date aEndDate = aNullDate; aEndDate+= (long)fInputEndVal; double fTempDate=0; if(aStartDate.GetYear()!=aEndDate.GetYear()) { eFillDateCmd = FILL_YEAR; fTempDate=aEndDate.GetYear()-aStartDate.GetYear(); } if(aStartDate.GetMonth()!=aEndDate.GetMonth()) { eFillDateCmd = FILL_MONTH; fTempDate=fTempDate*12+aEndDate.GetMonth()-aStartDate.GetMonth(); } if(aStartDate.GetDay()==aEndDate.GetDay()) { fIncVal=fTempDate; } } } ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); OSL_ENSURE(pFact, "ScAbstractFactory create fail!"); AbstractScFillSeriesDlg* pDlg = pFact->CreateScFillSeriesDlg( pTabViewShell->GetDialogParent(), *pDoc, eFillDir, eFillCmd, eFillDateCmd, aStartStr, fIncVal, fMaxVal, nPossDir, RID_SCDLG_FILLSERIES); OSL_ENSURE(pDlg, "Dialog create fail!"); if ( nStartCol != nEndCol && nStartRow != nEndRow ) { pDlg->SetEdStartValEnabled(false); } if ( pDlg->Execute() == RET_OK ) { eFillDir = pDlg->GetFillDir(); eFillCmd = pDlg->GetFillCmd(); eFillDateCmd = pDlg->GetFillDateCmd(); if(eFillCmd==FILL_AUTO) { String aStr=pDlg->GetStartStr(); if(aStr.Len()>0) pTabViewShell->EnterData( nStartCol, nStartRow, nStartTab, aStr ); } fStartVal = pDlg->GetStart(); fIncVal = pDlg->GetStep(); fMaxVal = pDlg->GetMax(); bDoIt = sal_True; } delete pDlg; } if( bDoIt ) { //nScFillModeMouseModifier = 0; // no Ctrl/Copy pTabViewShell->FillSeries( eFillDir, eFillCmd, eFillDateCmd, fStartVal, fIncVal, fMaxVal ); if( ! rReq.IsAPI() ) { String aPara; Color* pColor=0; switch( eFillDir ) { case FILL_TO_BOTTOM: aPara = 'B'; break; case FILL_TO_RIGHT: aPara = 'R'; break; case FILL_TO_TOP: aPara = 'T'; break; case FILL_TO_LEFT: aPara = 'L'; break; default: aPara.Erase(); break; } rReq.AppendItem( SfxStringItem( FID_FILL_SERIES, aPara ) ); switch( eFillCmd ) { case FILL_SIMPLE: aPara = 'S'; break; case FILL_LINEAR: aPara = 'L'; break; case FILL_GROWTH: aPara = 'G'; break; case FILL_DATE: aPara = 'D'; break; case FILL_AUTO: aPara = 'A'; break; default: aPara.Erase(); break; } rReq.AppendItem( SfxStringItem( FN_PARAM_1, aPara ) ); switch( eFillDateCmd ) { case FILL_DAY: aPara = 'D'; break; case FILL_WEEKDAY: aPara = 'W'; break; case FILL_MONTH: aPara = 'M'; break; case FILL_YEAR: aPara = 'Y'; break; default: aPara.Erase(); break; } rReq.AppendItem( SfxStringItem( FN_PARAM_2, aPara ) ); sal_uLong nFormatKey = pFormatter->GetStandardFormat(NUMBERFORMAT_NUMBER, ScGlobal::eLnge ); pFormatter->GetOutputString( fIncVal, nFormatKey, aPara, &pColor ); rReq.AppendItem( SfxStringItem( FN_PARAM_3, aPara ) ); pFormatter->GetOutputString( fStartVal, nFormatKey, aPara, &pColor ); rReq.AppendItem( SfxStringItem( FN_PARAM_4, aPara ) ); pFormatter->GetOutputString( fMaxVal, nFormatKey, aPara, &pColor ); rReq.AppendItem( SfxStringItem( FN_PARAM_5, aPara ) ); rReq.Done(); } } } break; case FID_FILL_AUTO: { SCCOL nStartCol; SCROW nStartRow; SCCOL nEndCol; SCROW nEndRow; SCTAB nStartTab, nEndTab; GetViewData()->GetFillData( nStartCol, nStartRow, nEndCol, nEndRow ); SCCOL nFillCol = GetViewData()->GetRefEndX(); SCROW nFillRow = GetViewData()->GetRefEndY(); ScDocument* pDoc = GetViewData()->GetDocument(); if( pReqArgs != NULL ) { const SfxPoolItem* pItem; if( pReqArgs->HasItem( FID_FILL_AUTO, &pItem ) ) { ScAddress aScAddress; String aArg = ((const SfxStringItem*)pItem)->GetValue(); if( aScAddress.Parse( aArg, pDoc, pDoc->GetAddressConvention() ) & SCA_VALID ) { nFillRow = aScAddress.Row(); nFillCol = aScAddress.Col(); } } GetViewData()->GetSimpleArea( nStartCol,nStartRow,nStartTab, nEndCol,nEndRow,nEndTab ); } else // call via mouse { // not in a merged cell if ( nStartCol == nEndCol && nStartRow == nEndRow ) { SCCOL nMergeCol = nStartCol; SCROW nMergeRow = nStartRow; if ( GetViewData()->GetDocument()->ExtendMerge( nStartCol, nStartRow, nMergeCol, nMergeRow, GetViewData()->GetTabNo() ) ) { if ( nFillCol >= nStartCol && nFillCol <= nMergeCol && nFillRow == nStartRow ) nFillCol = nStartCol; if ( nFillRow >= nStartRow && nFillRow <= nMergeRow && nFillCol == nStartCol ) nFillRow = nStartRow; } } } if ( nFillCol != nEndCol || nFillRow != nEndRow ) { if ( nFillCol==nEndCol || nFillRow==nEndRow ) { FillDir eDir = FILL_TO_BOTTOM; SCCOLROW nCount = 0; if ( nFillCol==nEndCol ) { if ( nFillRow > nEndRow ) { eDir = FILL_TO_BOTTOM; nCount = nFillRow - nEndRow; } else if ( nFillRow < nStartRow ) { eDir = FILL_TO_TOP; nCount = nStartRow - nFillRow; } } else { if ( nFillCol > nEndCol ) { eDir = FILL_TO_RIGHT; nCount = nFillCol - nEndCol; } else if ( nFillCol < nStartCol ) { eDir = FILL_TO_LEFT; nCount = nStartCol - nFillCol; } } if ( nCount != 0) { pTabViewShell->FillAuto( eDir, nStartCol, nStartRow, nEndCol, nEndRow, nCount ); if( ! rReq.IsAPI() ) { String aAdrStr; ScAddress aAdr( nFillCol, nFillRow, 0 ); aAdr.Format( aAdrStr, SCR_ABS, pDoc, pDoc->GetAddressConvention() ); rReq.AppendItem( SfxStringItem( FID_FILL_AUTO, aAdrStr ) ); rReq.Done(); } } } else { OSL_FAIL( "Direction not unique for autofill" ); } } } break; // // disposal (Outlines) // SID_AUTO_OUTLINE, SID_OUTLINE_DELETEALL in Execute (in docsh.idl) // case SID_OUTLINE_HIDE: if ( GetViewData()->GetDocument()->GetDPAtCursor( GetViewData()->GetCurX(), GetViewData()->GetCurY(), GetViewData()->GetTabNo() ) ) pTabViewShell->SetDataPilotDetails( false ); else pTabViewShell->HideMarkedOutlines(); rReq.Done(); break; case SID_OUTLINE_SHOW: { ScDPObject* pDPObj = GetViewData()->GetDocument()->GetDPAtCursor( GetViewData()->GetCurX(), GetViewData()->GetCurY(), GetViewData()->GetTabNo() ); if ( pDPObj ) { Sequence aFilters; sal_uInt16 nOrientation; if ( pTabViewShell->HasSelectionForDrillDown( nOrientation ) ) { ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); OSL_ENSURE(pFact, "ScAbstractFactory create fail!"); AbstractScDPShowDetailDlg* pDlg = pFact->CreateScDPShowDetailDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_DPSHOWDETAIL, *pDPObj, nOrientation ); OSL_ENSURE(pDlg, "Dialog create fail!"); if ( pDlg->Execute() == RET_OK ) { rtl::OUString aNewDimName( pDlg->GetDimensionName() ); pTabViewShell->SetDataPilotDetails( true, &aNewDimName ); } } else if ( !pDPObj->IsServiceData() && pDPObj->GetDataFieldPositionData( ScAddress( GetViewData()->GetCurX(), GetViewData()->GetCurY(), GetViewData()->GetTabNo() ), aFilters ) ) pTabViewShell->ShowDataPilotSourceData( *pDPObj, aFilters ); else pTabViewShell->SetDataPilotDetails(true); } else pTabViewShell->ShowMarkedOutlines(); rReq.Done(); } break; case SID_OUTLINE_MAKE: { sal_Bool bColumns = false; sal_Bool bOk = sal_True; if ( GetViewData()->GetDocument()->GetDPAtCursor( GetViewData()->GetCurX(), GetViewData()->GetCurY(), GetViewData()->GetTabNo() ) ) { ScDPNumGroupInfo aNumInfo; aNumInfo.mbEnable = true; aNumInfo.mbAutoStart = true; aNumInfo.mbAutoEnd = true; sal_Int32 nParts = 0; if ( pTabViewShell->HasSelectionForDateGroup( aNumInfo, nParts ) ) { ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); OSL_ENSURE( pFact, "ScAbstractFactory create fail!" ); Date aNullDate( *GetViewData()->GetDocument()->GetFormatTable()->GetNullDate() ); AbstractScDPDateGroupDlg* pDlg = pFact->CreateScDPDateGroupDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_DPDATEGROUP, aNumInfo, nParts, aNullDate ); OSL_ENSURE( pDlg, "Dialog create fail!" ); if( pDlg->Execute() == RET_OK ) { aNumInfo = pDlg->GetGroupInfo(); pTabViewShell->DateGroupDataPilot( aNumInfo, pDlg->GetDatePart() ); } } else if ( pTabViewShell->HasSelectionForNumGroup( aNumInfo ) ) { ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); OSL_ENSURE( pFact, "ScAbstractFactory create fail!" ); AbstractScDPNumGroupDlg* pDlg = pFact->CreateScDPNumGroupDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_DPNUMGROUP, aNumInfo ); OSL_ENSURE( pDlg, "Dialog create fail!" ); if( pDlg->Execute() == RET_OK ) pTabViewShell->NumGroupDataPilot( pDlg->GetGroupInfo() ); } else pTabViewShell->GroupDataPilot(); bOk = false; } else if( pReqArgs != NULL ) { const SfxPoolItem* pItem; bOk = false; if( pReqArgs->HasItem( SID_OUTLINE_MAKE, &pItem ) ) { String aCol = ((const SfxStringItem*)pItem)->GetValue(); aCol.ToUpperAscii(); switch( aCol.GetChar(0) ) { case 'R': bColumns=false; bOk = sal_True;break; case 'C': bColumns=sal_True; bOk = sal_True;break; } } } else // Dialog, when not whole rows/columns are marked { if ( GetViewData()->SimpleColMarked() && !GetViewData()->SimpleRowMarked() ) bColumns = sal_True; else if ( !GetViewData()->SimpleColMarked() && GetViewData()->SimpleRowMarked() ) bColumns = false; else { ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); OSL_ENSURE(pFact, "ScAbstractFactory create fail!"); AbstractScGroupDlg* pDlg = pFact->CreateAbstractScGroupDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_GRP_MAKE, RID_SCDLG_GRP_MAKE,false); OSL_ENSURE(pDlg, "Dialog create fail!"); if ( pDlg->Execute() == RET_OK ) bColumns = pDlg->GetColsChecked(); else bOk = false; delete pDlg; } } if (bOk) { pTabViewShell->MakeOutline( bColumns ); if( ! rReq.IsAPI() ) { String aCol = bColumns ? 'C' : 'R'; rReq.AppendItem( SfxStringItem( SID_OUTLINE_MAKE, aCol ) ); rReq.Done(); } } } break; case SID_OUTLINE_REMOVE: { sal_Bool bColumns = false; sal_Bool bOk = sal_True; if ( GetViewData()->GetDocument()->GetDPAtCursor( GetViewData()->GetCurX(), GetViewData()->GetCurY(), GetViewData()->GetTabNo() ) ) { pTabViewShell->UngroupDataPilot(); bOk = false; } else if( pReqArgs != NULL ) { const SfxPoolItem* pItem; bOk = false; if( pReqArgs->HasItem( SID_OUTLINE_REMOVE, &pItem ) ) { String aCol = ((const SfxStringItem*)pItem)->GetValue(); aCol.ToUpperAscii(); switch( aCol.GetChar(0) ) { case 'R': bColumns=false; bOk = sal_True;break; case 'C': bColumns=sal_True; bOk = sal_True;break; } } } else // Dialog only when removal for rows and columns is possible { sal_Bool bColPoss, bRowPoss; pTabViewShell->TestRemoveOutline( bColPoss, bRowPoss ); if ( bColPoss && bRowPoss ) { ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); OSL_ENSURE(pFact, "ScAbstractFactory create fail!"); AbstractScGroupDlg* pDlg = pFact->CreateAbstractScGroupDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_GRP_KILL, RID_SCDLG_GRP_KILL,true); OSL_ENSURE(pDlg, "Dialog create fail!"); if ( pDlg->Execute() == RET_OK ) bColumns = pDlg->GetColsChecked(); else bOk = false; delete pDlg; } else if ( bColPoss ) bColumns = sal_True; else if ( bRowPoss ) bColumns = false; else bOk = false; } if (bOk) { pTabViewShell->RemoveOutline( bColumns ); if( ! rReq.IsAPI() ) { String aCol = bColumns ? 'C' : 'R'; rReq.AppendItem( SfxStringItem( SID_OUTLINE_REMOVE, aCol ) ); rReq.Done(); } } } break; // // Clipboard // case SID_COPY: // for graphs in DrawShell { WaitObject aWait( GetViewData()->GetDialogParent() ); pTabViewShell->CopyToClip( NULL, false, false, true ); rReq.Done(); GetViewData()->SetPasteMode( (ScPasteFlags) (SC_PASTE_MODE | SC_PASTE_BORDER) ); pTabViewShell->ShowCursor(); pTabViewShell->UpdateCopySourceOverlay(); } break; case SID_CUT: // for graphs in DrawShell { WaitObject aWait( GetViewData()->GetDialogParent() ); pTabViewShell->CutToClip( NULL, true ); rReq.Done(); GetViewData()->SetPasteMode( (ScPasteFlags)(SC_PASTE_MODE | SC_PASTE_BORDER)); pTabViewShell->ShowCursor(); pTabViewShell->UpdateCopySourceOverlay(); } break; case SID_PASTE: { ScClipUtil::PasteFromClipboard ( GetViewData(), pTabViewShell, true ); rReq.Done(); } break; case SID_CLIPBOARD_FORMAT_ITEMS: { WaitObject aWait( GetViewData()->GetDialogParent() ); sal_uLong nFormat = 0; const SfxPoolItem* pItem; if ( pReqArgs && pReqArgs->GetItemState(nSlot, sal_True, &pItem) == SFX_ITEM_SET && pItem->ISA(SfxUInt32Item) ) { nFormat = ((const SfxUInt32Item*)pItem)->GetValue(); } if ( nFormat ) { Window* pWin = GetViewData()->GetActiveWin(); sal_Bool bCells = ( ScTransferObj::GetOwnClipboard( pWin ) != NULL ); sal_Bool bDraw = ( ScDrawTransferObj::GetOwnClipboard( pWin ) != NULL ); sal_Bool bOle = ( nFormat == SOT_FORMATSTR_ID_EMBED_SOURCE ); if ( bCells && bOle ) pTabViewShell->PasteFromSystem(); else if ( bDraw && bOle ) pTabViewShell->PasteDraw(); else pTabViewShell->PasteFromSystem(nFormat); } //?else //? pTabViewShell->PasteFromSystem(); rReq.Done(); } pTabViewShell->CellContentChanged(); break; case FID_INS_CELL_CONTENTS: { sal_uInt16 nFlags = IDF_NONE; sal_uInt16 nFunction = PASTE_NOFUNC; sal_Bool bSkipEmpty = false; sal_Bool bTranspose = false; sal_Bool bAsLink = false; InsCellCmd eMoveMode = INS_NONE; Window* pWin = GetViewData()->GetActiveWin(); ScDocument* pDoc = GetViewData()->GetDocument(); sal_Bool bOtherDoc = !pDoc->IsClipboardSource(); ScTransferObj* pOwnClip = ScTransferObj::GetOwnClipboard( pWin ); if ( pOwnClip ) { // keep a reference in case the clipboard is changed during dialog or PasteFromClip uno::Reference aOwnClipRef( pOwnClip ); if ( pReqArgs!=NULL && pTabViewShell->SelectionEditable() ) { const SfxPoolItem* pItem; String aFlags = 'A'; if( pReqArgs->HasItem( FID_INS_CELL_CONTENTS, &pItem ) ) aFlags = ((const SfxStringItem*)pItem)->GetValue(); aFlags.ToUpperAscii(); sal_Bool bCont = sal_True; for( xub_StrLen i=0 ; bCont && iGetValue(); if ( pSkipItem ) bSkipEmpty = pSkipItem->GetValue(); if ( pTransposeItem ) bTranspose = pTransposeItem->GetValue(); if ( pLinkItem ) bAsLink = pLinkItem->GetValue(); if ( pMoveItem ) eMoveMode = (InsCellCmd) pMoveItem->GetValue(); } else { ScEditableTester aTester( pTabViewShell ); if (aTester.IsEditable()) { ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); OSL_ENSURE(pFact, "ScAbstractFactory create fail!"); AbstractScInsertContentsDlg* pDlg = pFact->CreateScInsertContentsDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_INSCONT); OSL_ENSURE(pDlg, "Dialog create fail!"); pDlg->SetOtherDoc( bOtherDoc ); // if ChangeTrack MoveMode disable pDlg->SetChangeTrack( pDoc->GetChangeTrack() != NULL ); // cut/move references may disable shift // directions if source and destination ranges intersect if ( !bOtherDoc ) { if ( pOwnClip && pOwnClip->GetDocument()->IsCutMode() ) { ScViewData* pData = GetViewData(); if ( pData->GetMarkData().GetTableSelect( pData->GetTabNo() ) ) { SCCOL nPosX = pData->GetCurX(); SCROW nPosY = pData->GetCurY(); SCCOL nClipStartX, nClipSizeX; SCROW nClipStartY, nClipSizeY; pOwnClip->GetDocument()->GetClipStart( nClipStartX, nClipStartY ); // for CutMode, filtered rows can always be included pOwnClip->GetDocument()->GetClipArea( nClipSizeX, nClipSizeY, sal_True ); int nDisableShift = 0; if ( nClipStartX <= nPosX + nClipSizeX && nPosX <= nClipStartX + nClipSizeX ) nDisableShift |= SC_CELL_SHIFT_DISABLE_DOWN; if ( nClipStartY <= nPosY + nClipSizeY && nPosY <= nClipStartY + nClipSizeY ) nDisableShift |= SC_CELL_SHIFT_DISABLE_RIGHT; if ( nDisableShift ) pDlg->SetCellShiftDisabled( nDisableShift ); } } } if (pDlg->Execute() == RET_OK) { nFlags = pDlg->GetInsContentsCmdBits(); nFunction = pDlg->GetFormulaCmdBits(); bSkipEmpty = pDlg->IsSkipEmptyCells(); bTranspose = pDlg->IsTranspose(); bAsLink = pDlg->IsLink(); eMoveMode = pDlg->GetMoveMode(); } delete pDlg; } else pTabViewShell->ErrorMessage(aTester.GetMessageId()); } if( nFlags != IDF_NONE ) { { WaitObject aWait( GetViewData()->GetDialogParent() ); if ( bAsLink && bOtherDoc ) pTabViewShell->PasteFromSystem(SOT_FORMATSTR_ID_LINK); // DDE insert else { pTabViewShell->PasteFromClip( nFlags, pOwnClip->GetDocument(), nFunction, bSkipEmpty, bTranspose, bAsLink, eMoveMode, IDF_NONE, sal_True ); // allow warning dialog } } if( !pReqArgs ) { String aFlags; if( nFlags == IDF_ALL ) { aFlags += 'A'; } else { if( nFlags & IDF_STRING ) aFlags += 'S'; if( nFlags & IDF_VALUE ) aFlags += 'V'; if( nFlags & IDF_DATETIME ) aFlags += 'D'; if( nFlags & IDF_FORMULA ) aFlags += 'F'; if( nFlags & IDF_NOTE ) aFlags += 'N'; if( nFlags & IDF_ATTRIB ) aFlags += 'T'; } rReq.AppendItem( SfxStringItem( FID_INS_CELL_CONTENTS, aFlags ) ); rReq.AppendItem( SfxBoolItem( FN_PARAM_2, bSkipEmpty ) ); rReq.AppendItem( SfxBoolItem( FN_PARAM_3, bTranspose ) ); rReq.AppendItem( SfxBoolItem( FN_PARAM_4, bAsLink ) ); rReq.AppendItem( SfxUInt16Item( FN_PARAM_1, nFunction ) ); rReq.AppendItem( SfxInt16Item( FN_PARAM_5, (sal_Int16) eMoveMode ) ); rReq.Done(); } } } } pTabViewShell->CellContentChanged(); // => PasteFromXXX ??? break; case SID_PASTE_ONLY_VALUE: case SID_PASTE_ONLY_TEXT: case SID_PASTE_ONLY_FORMULA: { Window* pWin = GetViewData()->GetActiveWin(); if ( ScTransferObj::GetOwnClipboard( pWin ) ) // own cell data { rReq.SetSlot( FID_INS_CELL_CONTENTS ); rtl::OUString aFlags; if ( nSlot == SID_PASTE_ONLY_VALUE ) aFlags = "V"; else if ( nSlot == SID_PASTE_ONLY_TEXT ) aFlags = "S"; else aFlags = "F"; rReq.AppendItem( SfxStringItem( FID_INS_CELL_CONTENTS, aFlags ) ); ExecuteSlot( rReq, GetInterface() ); rReq.SetReturnValue(SfxInt16Item(nSlot, 1)); // 1 = success pTabViewShell->CellContentChanged(); } else rReq.SetReturnValue(SfxInt16Item(nSlot, 0)); // 0 = fail break; } case SID_PASTE_SPECIAL: // differentiate between own cell data and draw objects/external data // this makes FID_INS_CELL_CONTENTS superfluous { Window* pWin = GetViewData()->GetActiveWin(); // Clipboard-ID given as parameter? Basic "PasteSpecial(Format)" const SfxPoolItem* pItem=NULL; if ( pReqArgs && pReqArgs->GetItemState(nSlot, sal_True, &pItem) == SFX_ITEM_SET && pItem->ISA(SfxUInt32Item) ) { sal_uLong nFormat = ((const SfxUInt32Item*)pItem)->GetValue(); sal_Bool bRet=sal_True; { WaitObject aWait( GetViewData()->GetDialogParent() ); sal_Bool bDraw = ( ScDrawTransferObj::GetOwnClipboard( pWin ) != NULL ); if ( bDraw && nFormat == SOT_FORMATSTR_ID_EMBED_SOURCE ) pTabViewShell->PasteDraw(); else bRet = pTabViewShell->PasteFromSystem(nFormat, sal_True); // TRUE: no error messages } if ( bRet ) { rReq.SetReturnValue(SfxInt16Item(nSlot, bRet)); // 1 = success, 0 = fail rReq.Done(); } else // if format is not available -> fallback to request without parameters pItem = NULL; } if ( !pItem ) { if ( ScTransferObj::GetOwnClipboard( pWin ) ) // own cell data { rReq.SetSlot( FID_INS_CELL_CONTENTS ); ExecuteSlot( rReq, GetInterface() ); rReq.SetReturnValue(SfxInt16Item(nSlot, 1)); // 1 = success } else // draw objects or external data { sal_Bool bDraw = ( ScDrawTransferObj::GetOwnClipboard( pWin ) != NULL ); SvxClipboardFmtItem aFormats( SID_CLIPBOARD_FORMAT_ITEMS ); GetPossibleClipboardFormats( aFormats ); sal_uInt16 nFormatCount = aFormats.Count(); if ( nFormatCount ) { SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); SfxAbstractPasteDialog* pDlg = pFact->CreatePasteDialog( pTabViewShell->GetDialogParent() ); if ( pDlg ) { for (sal_uInt16 i=0; iInsert( nFormatId, aName ); } TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( pWin ) ); sal_uLong nFormat = pDlg->GetFormat( aDataHelper.GetTransferable() ); if (nFormat > 0) { { WaitObject aWait( GetViewData()->GetDialogParent() ); if ( bDraw && nFormat == SOT_FORMATSTR_ID_EMBED_SOURCE ) pTabViewShell->PasteDraw(); else pTabViewShell->PasteFromSystem(nFormat); } rReq.SetReturnValue(SfxInt16Item(nSlot, 1)); // 1 = success rReq.AppendItem( SfxUInt32Item( nSlot, nFormat ) ); rReq.Done(); } else { rReq.SetReturnValue(SfxInt16Item(nSlot, 0)); // 0 = fail rReq.Ignore(); } delete pDlg; } } else rReq.SetReturnValue(SfxInt16Item(nSlot, 0)); // 0 = fail } } } pTabViewShell->CellContentChanged(); // => PasteFromSystem() ??? break; // // other // case FID_INS_ROWBRK: pTabViewShell->InsertPageBreak( false ); rReq.Done(); break; case FID_INS_COLBRK: pTabViewShell->InsertPageBreak( sal_True ); rReq.Done(); break; case FID_DEL_ROWBRK: pTabViewShell->DeletePageBreak( false ); rReq.Done(); break; case FID_DEL_COLBRK: pTabViewShell->DeletePageBreak( sal_True ); rReq.Done(); break; case SID_DETECTIVE_ADD_PRED: pTabViewShell->DetectiveAddPred(); rReq.Done(); break; case SID_DETECTIVE_DEL_PRED: pTabViewShell->DetectiveDelPred(); rReq.Done(); break; case SID_DETECTIVE_ADD_SUCC: pTabViewShell->DetectiveAddSucc(); rReq.Done(); break; case SID_DETECTIVE_DEL_SUCC: pTabViewShell->DetectiveDelSucc(); rReq.Done(); break; case SID_DETECTIVE_ADD_ERR: pTabViewShell->DetectiveAddError(); rReq.Done(); break; case SID_DETECTIVE_INVALID: pTabViewShell->DetectiveMarkInvalid(); rReq.Done(); break; case SID_DETECTIVE_REFRESH: pTabViewShell->DetectiveRefresh(); rReq.Done(); break; case SID_DETECTIVE_MARK_PRED: pTabViewShell->DetectiveMarkPred(); break; case SID_DETECTIVE_MARK_SUCC: pTabViewShell->DetectiveMarkSucc(); break; case SID_INSERT_CURRENT_DATE: pTabViewShell->InsertCurrentTime( NUMBERFORMAT_DATE, ScGlobal::GetRscString(STR_UNDO_INSERT_CURRENT_DATE)); break; case SID_INSERT_CURRENT_TIME: pTabViewShell->InsertCurrentTime( NUMBERFORMAT_TIME, ScGlobal::GetRscString(STR_UNDO_INSERT_CURRENT_TIME)); break; case SID_SPELL_DIALOG: { SfxViewFrame* pViewFrame = pTabViewShell->GetViewFrame(); if( rReq.GetArgs() ) pViewFrame->SetChildWindow( SID_SPELL_DIALOG, static_cast< const SfxBoolItem& >( rReq.GetArgs()-> Get( SID_SPELL_DIALOG ) ).GetValue() ); else pViewFrame->ToggleChildWindow( SID_SPELL_DIALOG ); pViewFrame->GetBindings().Invalidate( SID_SPELL_DIALOG ); rReq.Ignore(); } break; case SID_HANGUL_HANJA_CONVERSION: pTabViewShell->DoHangulHanjaConversion(); break; case SID_CHINESE_CONVERSION: { //open ChineseTranslationDialog Reference< XComponentContext > xContext( ::cppu::defaultBootstrap_InitialComponentContext() ); //@todo get context from calc if that has one if(xContext.is()) { Reference< lang::XMultiComponentFactory > xMCF( xContext->getServiceManager() ); if(xMCF.is()) { Reference< ui::dialogs::XExecutableDialog > xDialog( xMCF->createInstanceWithContext( rtl::OUString("com.sun.star.linguistic2.ChineseTranslationDialog") , xContext), UNO_QUERY); Reference< lang::XInitialization > xInit( xDialog, UNO_QUERY ); if( xInit.is() ) { // initialize dialog Reference< awt::XWindow > xDialogParentWindow(0); Sequence aSeq(1); Any* pArray = aSeq.getArray(); PropertyValue aParam; aParam.Name = rtl::OUString("ParentWindow"); aParam.Value <<= makeAny(xDialogParentWindow); pArray[0] <<= makeAny(aParam); xInit->initialize( aSeq ); //execute dialog sal_Int16 nDialogRet = xDialog->execute(); if( RET_OK == nDialogRet ) { //get some parameters from the dialog sal_Bool bToSimplified = sal_True; sal_Bool bUseVariants = sal_True; sal_Bool bCommonTerms = sal_True; Reference< beans::XPropertySet > xProp( xDialog, UNO_QUERY ); if( xProp.is() ) { try { xProp->getPropertyValue( rtl::OUString("IsDirectionToSimplified") ) >>= bToSimplified; xProp->getPropertyValue( rtl::OUString("IsUseCharacterVariants") ) >>= bUseVariants; xProp->getPropertyValue( rtl::OUString("IsTranslateCommonTerms") ) >>= bCommonTerms; } catch( Exception& ) { } } //execute translation LanguageType eSourceLang = bToSimplified ? LANGUAGE_CHINESE_TRADITIONAL : LANGUAGE_CHINESE_SIMPLIFIED; LanguageType eTargetLang = bToSimplified ? LANGUAGE_CHINESE_SIMPLIFIED : LANGUAGE_CHINESE_TRADITIONAL; sal_Int32 nOptions = bUseVariants ? i18n::TextConversionOption::USE_CHARACTER_VARIANTS : 0; if( !bCommonTerms ) nOptions |= i18n::TextConversionOption::CHARACTER_BY_CHARACTER; Font aTargetFont = GetViewData()->GetActiveWin()->GetDefaultFont( DEFAULTFONT_CJK_SPREADSHEET, eTargetLang, DEFAULTFONT_FLAGS_ONLYONE ); ScConversionParam aConvParam( SC_CONVERSION_CHINESE_TRANSL, eSourceLang, eTargetLang, aTargetFont, nOptions, false ); pTabViewShell->DoSheetConversion( aConvParam ); } } Reference< lang::XComponent > xComponent( xDialog, UNO_QUERY ); if( xComponent.is() ) xComponent->dispose(); } } } break; case SID_THESAURUS: pTabViewShell->DoThesaurus(); break; case SID_TOGGLE_REL: pTabViewShell->DoRefConversion(); break; case SID_DEC_INDENT: pTabViewShell->ChangeIndent( false ); break; case SID_INC_INDENT: pTabViewShell->ChangeIndent( sal_True ); break; case FID_USE_NAME: { sal_uInt16 nFlags = pTabViewShell->GetCreateNameFlags(); ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); OSL_ENSURE(pFact, "ScAbstractFactory create fail!"); AbstractScNameCreateDlg* pDlg = pFact->CreateScNameCreateDlg(pTabViewShell->GetDialogParent(), nFlags, RID_SCDLG_NAMES_CREATE ); OSL_ENSURE(pDlg, "Dialog create fail!"); if( pDlg->Execute() ) { nFlags = pDlg->GetFlags(); pTabViewShell->CreateNames(nFlags); rReq.Done(); } delete pDlg; } break; case SID_CONSOLIDATE: { const SfxPoolItem* pItem; if ( pReqArgs && SFX_ITEM_SET == pReqArgs->GetItemState( SCITEM_CONSOLIDATEDATA, sal_True, &pItem ) ) { const ScConsolidateParam& rParam = ((const ScConsolidateItem*)pItem)->GetData(); pTabViewShell->Consolidate( rParam ); GetViewData()->GetDocument()->SetConsolidateDlgData( &rParam ); rReq.Done(); } #ifndef DISABLE_SCRIPTING else if (rReq.IsAPI()) SbxBase::SetError(SbxERR_BAD_PARAMETER); #endif } break; case SID_INS_FUNCTION: { const SfxBoolItem* pOkItem = (const SfxBoolItem*)&pReqArgs->Get( SID_DLG_RETOK ); if ( pOkItem->GetValue() ) // OK { String aFormula; const SfxStringItem* pSItem = (const SfxStringItem*)&pReqArgs->Get( SCITEM_STRING ); const SfxBoolItem* pMatrixItem = (const SfxBoolItem*) &pReqArgs->Get( SID_DLG_MATRIX ); aFormula += pSItem->GetValue(); pScMod->ActivateInputWindow( &aFormula, pMatrixItem->GetValue() ); } else // CANCEL { pScMod->ActivateInputWindow( NULL ); } rReq.Ignore(); // only SID_ENTER_STRING is recorded } break; case FID_DEFINE_NAME: if ( pReqArgs ) { const SfxPoolItem* pItem; String aName, aSymbol, aAttrib; if( pReqArgs->HasItem( FID_DEFINE_NAME, &pItem ) ) aName = ((const SfxStringItem*)pItem)->GetValue(); if( pReqArgs->HasItem( FN_PARAM_1, &pItem ) ) aSymbol = ((const SfxStringItem*)pItem)->GetValue(); if( pReqArgs->HasItem( FN_PARAM_2, &pItem ) ) aAttrib = ((const SfxStringItem*)pItem)->GetValue(); if ( aName.Len() && aSymbol.Len() ) { if (pTabViewShell->InsertName( aName, aSymbol, aAttrib )) rReq.Done(); #ifndef DISABLE_SCRIPTING else SbxBase::SetError( SbxERR_BAD_PARAMETER ); // Basic-error #endif } } else { sal_uInt16 nId = ScNameDlgWrapper::GetChildWindowId(); SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame(); SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId ); pScMod->SetRefDialog( nId, pWnd ? false : sal_True ); } break; case FID_ADD_NAME: { sal_uInt16 nId = ScNameDefDlgWrapper::GetChildWindowId(); SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame(); SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId ); pScMod->SetRefDialog( nId, pWnd ? false : sal_True ); } break; case SID_DEFINE_COLROWNAMERANGES: { sal_uInt16 nId = ScColRowNameRangesDlgWrapper::GetChildWindowId(); SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame(); SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId ); pScMod->SetRefDialog( nId, pWnd ? false : sal_True ); } break; case SID_UPDATECHART: { sal_Bool bAll = false; if( pReqArgs ) { const SfxPoolItem* pItem; if( pReqArgs->HasItem( SID_UPDATECHART, &pItem ) ) bAll = ((const SfxBoolItem*)pItem)->GetValue(); } pTabViewShell->UpdateCharts( bAll ); if( ! rReq.IsAPI() ) { rReq.AppendItem( SfxBoolItem( SID_UPDATECHART, bAll ) ); rReq.Done(); } } break; case SID_TABOP: if (pReqArgs) { const ScTabOpItem& rItem = (const ScTabOpItem&) pReqArgs->Get( SID_TABOP ); pTabViewShell->TabOp( rItem.GetData() ); rReq.Done( *pReqArgs ); } break; case SID_SOLVE: if (pReqArgs) { const ScSolveItem& rItem = (const ScSolveItem&) pReqArgs->Get( SCITEM_SOLVEDATA ); pTabViewShell->Solve( rItem.GetData() ); rReq.Done( *pReqArgs ); } break; case FID_INSERT_NAME: { ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); OSL_ENSURE(pFact, "ScAbstractFactory create fail!"); AbstractScNamePasteDlg* pDlg = pFact->CreateScNamePasteDlg( pTabViewShell->GetDialogParent(), GetViewData()->GetDocShell(), RID_SCDLG_NAMES_PASTE ); OSL_ENSURE(pDlg, "Dialog create fail!"); switch( pDlg->Execute() ) { case BTN_PASTE_LIST: pTabViewShell->InsertNameList(); break; case BTN_PASTE_NAME: { ScInputHandler* pHdl = pScMod->GetInputHdl( pTabViewShell ); if (pHdl) { // "=" in KeyEvent, switches to input-mode pScMod->InputKeyEvent( KeyEvent('=',KeyCode()) ); std::vector aNames = pDlg->GetSelectedNames(); if (!aNames.empty()) { rtl::OUStringBuffer aBuffer; for (std::vector::const_iterator itr = aNames.begin(); itr != aNames.end(); ++itr) { aBuffer.append(*itr).append(' '); } pHdl->InsertFunction( aBuffer.makeStringAndClear(), false ); // without "()" } } } break; } delete pDlg; } break; case SID_RANGE_NOTETEXT: if (pReqArgs) { const SfxStringItem& rTextItem = (const SfxStringItem&)pReqArgs->Get( SID_RANGE_NOTETEXT ); // always cursor position ScAddress aPos( GetViewData()->GetCurX(), GetViewData()->GetCurY(), GetViewData()->GetTabNo() ); pTabViewShell->SetNoteText( aPos, rTextItem.GetValue() ); rReq.Done(); } break; case SID_INSERT_POSTIT: if ( pReqArgs ) { const SvxPostItAuthorItem& rAuthorItem = (const SvxPostItAuthorItem&)pReqArgs->Get( SID_ATTR_POSTIT_AUTHOR ); const SvxPostItDateItem& rDateItem = (const SvxPostItDateItem&) pReqArgs->Get( SID_ATTR_POSTIT_DATE ); const SvxPostItTextItem& rTextItem = (const SvxPostItTextItem&) pReqArgs->Get( SID_ATTR_POSTIT_TEXT ); ScAddress aPos( GetViewData()->GetCurX(), GetViewData()->GetCurY(), GetViewData()->GetTabNo() ); pTabViewShell->ReplaceNote( aPos, rTextItem.GetValue(), &rAuthorItem.GetValue(), &rDateItem.GetValue() ); rReq.Done(); } else { pTabViewShell->EditNote(); // note object to edit } break; case FID_NOTE_VISIBLE: { ScDocument* pDoc = GetViewData()->GetDocument(); ScAddress aPos( GetViewData()->GetCurX(), GetViewData()->GetCurY(), GetViewData()->GetTabNo() ); if( ScPostIt* pNote = pDoc->GetNotes( aPos.Tab() )->findByAddress(aPos) ) { bool bShow; const SfxPoolItem* pItem; if ( pReqArgs && (pReqArgs->GetItemState( FID_NOTE_VISIBLE, sal_True, &pItem ) == SFX_ITEM_SET) ) bShow = ((const SfxBoolItem*) pItem)->GetValue(); else bShow = !pNote->IsCaptionShown(); pTabViewShell->ShowNote( bShow ); if (!pReqArgs) rReq.AppendItem( SfxBoolItem( FID_NOTE_VISIBLE, bShow ) ); rReq.Done(); rBindings.Invalidate( FID_NOTE_VISIBLE ); } else rReq.Ignore(); } break; case SID_DELETE_NOTE: pTabViewShell->DeleteContents( IDF_NOTE ); // delete all notes in selection rReq.Done(); break; case SID_CHARMAP: if( pReqArgs != NULL ) { String aChars, aFontName; const SfxItemSet *pArgs = rReq.GetArgs(); const SfxPoolItem* pItem = 0; if ( pArgs ) pArgs->GetItemState(GetPool().GetWhich(SID_CHARMAP), false, &pItem); if ( pItem ) { const SfxStringItem* pStringItem = PTR_CAST( SfxStringItem, pItem ); if ( pStringItem ) aChars = pStringItem->GetValue(); const SfxPoolItem* pFtItem = NULL; pArgs->GetItemState( GetPool().GetWhich(SID_ATTR_SPECIALCHAR), false, &pFtItem); const SfxStringItem* pFontItem = PTR_CAST( SfxStringItem, pFtItem ); if ( pFontItem ) aFontName = pFontItem->GetValue(); } if ( aChars.Len() ) { Font aFont; pTabViewShell->GetSelectionPattern()->GetFont( aFont, SC_AUTOCOL_BLACK, NULL, NULL, NULL, pTabViewShell->GetSelectionScriptType() ); if ( aFontName.Len() ) aFont = Font( aFontName, Size(1,1) ); pTabViewShell->InsertSpecialChar( aChars, aFont ); if( ! rReq.IsAPI() ) rReq.Done(); } } else { SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); // font color doesn't matter here Font aCurFont; pTabViewShell->GetSelectionPattern()->GetFont( aCurFont, SC_AUTOCOL_BLACK, NULL, NULL, NULL, pTabViewShell->GetSelectionScriptType() ); SfxAllItemSet aSet( GetPool() ); aSet.Put( SfxBoolItem( FN_PARAM_1, false ) ); aSet.Put( SvxFontItem( aCurFont.GetFamily(), aCurFont.GetName(), aCurFont.GetStyleName(), aCurFont.GetPitch(), aCurFont.GetCharSet(), GetPool().GetWhich(SID_ATTR_CHAR_FONT) ) ); SfxAbstractDialog* pDlg = pFact->CreateSfxDialog( pTabViewShell->GetDialogParent(), aSet, pTabViewShell->GetViewFrame()->GetFrame().GetFrameInterface(), RID_SVXDLG_CHARMAP ); if ( pDlg->Execute() == RET_OK ) { SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pItem, SfxStringItem, SID_CHARMAP, false ); SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pFontItem, SvxFontItem, SID_ATTR_CHAR_FONT, false ); if ( pItem && pFontItem ) { Font aNewFont( pFontItem->GetFamilyName(), pFontItem->GetStyleName(), Size(1,1) ); aNewFont.SetCharSet( pFontItem->GetCharSet() ); aNewFont.SetPitch( pFontItem->GetPitch() ); pTabViewShell->InsertSpecialChar( pItem->GetValue(), aNewFont ); rReq.AppendItem( *pFontItem ); rReq.AppendItem( *pItem ); rReq.Done(); } } delete pDlg; } break; case SID_SELECT_SCENARIO: { // Testing if ( pReqArgs ) { const SfxStringItem* pItem = (const SfxStringItem*)&pReqArgs->Get( SID_SELECT_SCENARIO ); if( pItem ) { pTabViewShell->UseScenario( pItem->GetValue() ); //! why should the return value be valid?!?! rReq.SetReturnValue( SfxStringItem( SID_SELECT_SCENARIO, pItem->GetValue() ) ); rReq.Done(); } else { OSL_FAIL("NULL"); } } } break; case SID_HYPERLINK_SETLINK: if( pReqArgs ) { const SfxPoolItem* pItem; if( pReqArgs->HasItem( SID_HYPERLINK_SETLINK, &pItem ) ) { const SvxHyperlinkItem* pHyper = (const SvxHyperlinkItem*) pItem; const String& rName = pHyper->GetName(); const String& rURL = pHyper->GetURL(); const String& rTarget = pHyper->GetTargetFrame(); sal_uInt16 nType = (sal_uInt16) pHyper->GetInsertMode(); pTabViewShell->InsertURL( rName, rURL, rTarget, nType ); rReq.Done(); } else rReq.Ignore(); } break; case SID_OPENDLG_CONDFRMT: { ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); OSL_ENSURE(pFact, "ScAbstractFactory create fail!"); ScRangeList aRangeList; ScViewData* pData = GetViewData(); pData->GetMarkData().FillRangeListWithMarks(&aRangeList, false); ScDocument* pDoc = pData->GetDocument(); ScAddress aPos(pData->GetCurX(), pData->GetCurY(), pData->GetTabNo()); if(aRangeList.empty()) { ScRange* pRange = new ScRange(aPos); aRangeList.push_back(pRange); } AbstractScCondFormatDlg* pDlg = NULL; const ScConditionalFormat* pCondFormat = pDoc->GetCondFormat(aPos.Col(), aPos.Row(), aPos.Tab()); if(pCondFormat) { pDlg = pFact->CreateScCondFormatDlg( pTabViewShell->GetDialogParent(), pDoc, pCondFormat, pCondFormat->GetRange(), aPos, RID_SCDLG_CONDFORMAT ); } else { pDlg = pFact->CreateScCondFormatDlg( pTabViewShell->GetDialogParent(), pDoc, NULL, aRangeList, aPos, RID_SCDLG_CONDFORMAT ); } if(pDlg->Execute() == RET_OK) { ScConditionalFormat* pFormat = pDlg->GetConditionalFormat(); sal_uLong nOldIndex = 0; if(pCondFormat) nOldIndex = pCondFormat->GetKey(); pData->GetDocShell()->GetDocFunc().ReplaceConditionalFormat( nOldIndex, pFormat, pData->GetTabNo(), pFormat->GetRange() ); } delete pDlg; } break; case SID_OPENDLG_CONDFRMT_MANAGER: { ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); OSL_ENSURE(pFact, "ScAbstractFactory create fail!"); ScRangeList aRangeList; ScViewData* pData = GetViewData(); pData->GetMarkData().FillRangeListWithMarks(&aRangeList, false); ScDocument* pDoc = pData->GetDocument(); ScAddress aPos(pData->GetCurX(), pData->GetCurY(), pData->GetTabNo()); if(aRangeList.empty()) { ScRange* pRange = new ScRange(aPos); aRangeList.push_back(pRange); } ScConditionalFormatList* pList = pDoc->GetCondFormList( aPos.Tab() ); AbstractScCondFormatManagerDlg* pDlg = pFact->CreateScCondFormatMgrDlg( pTabViewShell->GetDialogParent(), pDoc, pList, aRangeList, aPos, RID_SCDLG_COND_FORMAT_MANAGER); if(pDlg->Execute() == RET_OK) { pDoc->SetCondFormList(pDlg->GetConditionalFormatList(), aPos.Tab()); } delete pDlg; } break; case SID_COLORSCALE: { ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); OSL_ENSURE(pFact, "ScAbstractFactory create fail!"); ScDocument* pDoc = GetViewData()->GetDocument(); AbstractScDataBarSettingsDlg* pDlg = pFact->CreateScDataBarSetttingsDlg( pTabViewShell->GetDialogParent(), pDoc, RID_SCDLG_DATABAR ); OSL_ENSURE(pDlg, "Dialog create fail!"); pDlg->Execute(); delete pDlg; } break; case SID_DATABAR: { ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); OSL_ENSURE(pFact, "ScAbstractFactory create fail!"); ScDocument* pDoc = GetViewData()->GetDocument(); AbstractScDataBarSettingsDlg* pDlg = pFact->CreateScDataBarSetttingsDlg( pTabViewShell->GetDialogParent(), pDoc, RID_SCDLG_DATABAR ); OSL_ENSURE(pDlg, "Dialog create fail!"); if(pDlg->Execute() == RET_OK) { //add here code that handles the data bar inserting } delete pDlg; } break; case SID_EXTERNAL_SOURCE: { String aFile; String aFilter; String aOptions; String aSource; sal_uLong nRefresh=0; SFX_REQUEST_ARG( rReq, pFile, SfxStringItem, SID_FILE_NAME, false ); SFX_REQUEST_ARG( rReq, pSource, SfxStringItem, FN_PARAM_1, false ); if ( pFile && pSource ) { aFile = pFile->GetValue(); aSource = pSource->GetValue(); SFX_REQUEST_ARG( rReq, pFilter, SfxStringItem, SID_FILTER_NAME, false ); if ( pFilter ) aFilter = pFilter->GetValue(); SFX_REQUEST_ARG( rReq, pOptions, SfxStringItem, SID_FILE_FILTEROPTIONS, false ); if ( pOptions ) aOptions = pOptions->GetValue(); SFX_REQUEST_ARG( rReq, pRefresh, SfxUInt32Item, FN_PARAM_2, false ); if ( pRefresh ) nRefresh = pRefresh->GetValue(); } else { ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); OSL_ENSURE(pFact, "ScAbstractFactory create fail!"); delete pImpl->m_pLinkedDlg; pImpl->m_pLinkedDlg = pFact->CreateScLinkedAreaDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_LINKAREA); OSL_ENSURE(pImpl->m_pLinkedDlg, "Dialog create fail!"); delete pImpl->m_pRequest; pImpl->m_pRequest = new SfxRequest( rReq ); pImpl->m_pLinkedDlg->StartExecuteModal( LINK( this, ScCellShell, DialogClosed ) ); return; } ExecuteExternalSource( aFile, aFilter, aOptions, aSource, nRefresh, rReq ); } break; // // // default: OSL_FAIL("incorrect slot in ExecuteEdit"); break; } } void ScCellShell::ExecuteTrans( SfxRequest& rReq ) { sal_Int32 nType = ScViewUtil::GetTransliterationType( rReq.GetSlot() ); if ( nType ) { GetViewData()->GetView()->TransliterateText( nType ); rReq.Done(); } } void ScCellShell::ExecuteRotateTrans( SfxRequest& rReq ) { if( rReq.GetSlot() == SID_TRANSLITERATE_ROTATE_CASE ) GetViewData()->GetView()->TransliterateText( m_aRotateCase.getNextMode() ); } void ScCellShell::ExecuteExternalSource( const String& _rFile, const String& _rFilter, const String& _rOptions, const String& _rSource, sal_uLong _nRefresh, SfxRequest& _rRequest ) { if ( _rFile.Len() && _rSource.Len() ) // filter may be empty { ScRange aLinkRange; sal_Bool bMove = false; ScViewData* pData = GetViewData(); ScMarkData& rMark = pData->GetMarkData(); rMark.MarkToSimple(); if ( rMark.IsMarked() ) { rMark.GetMarkArea( aLinkRange ); bMove = sal_True; // insert/delete cells to fit range } else aLinkRange = ScRange( pData->GetCurX(), pData->GetCurY(), pData->GetTabNo() ); pData->GetDocFunc().InsertAreaLink( _rFile, _rFilter, _rOptions, _rSource, aLinkRange, _nRefresh, bMove, false ); _rRequest.Done(); } else _rRequest.Ignore(); } namespace { bool isDPSourceValid(const ScDPObject& rDPObj) { if (rDPObj.IsImportData()) { // If the data type is database, check if the database is still valid. const ScImportSourceDesc* pDesc = rDPObj.GetImportSourceDesc(); if (!pDesc) return false; const ScDPSaveData* pSaveData = rDPObj.GetSaveData(); const ScDPDimensionSaveData* pDimData = NULL; if (pSaveData) pDimData = pSaveData->GetExistingDimensionData(); const ScDPCache* pCache = pDesc->CreateCache(pDimData); if (!pCache) // cashe creation failed, probably due to invalid connection. return false; } return true; } } void ScCellShell::ExecuteDataPilotDialog() { ScModule* pScMod = SC_MOD(); ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell(); ScViewData* pData = GetViewData(); ScDocument* pDoc = pData->GetDocument(); ::boost::scoped_ptr pNewDPObject(NULL); // ScPivot is no longer used... ScDPObject* pDPObj = pDoc->GetDPAtCursor( pData->GetCurX(), pData->GetCurY(), pData->GetTabNo() ); if ( pDPObj ) // on an existing table? { if (isDPSourceValid(*pDPObj)) pNewDPObject.reset(new ScDPObject(*pDPObj)); } else // create new table { sal_uLong nSrcErrorId = 0; // select database range or data pTabViewShell->GetDBData( true, SC_DB_OLD ); ScMarkData& rMark = GetViewData()->GetMarkData(); if ( !rMark.IsMarked() && !rMark.IsMultiMarked() ) pTabViewShell->MarkDataArea( false ); // output to cursor position for non-sheet data ScAddress aDestPos( pData->GetCurX(), pData->GetCurY(), pData->GetTabNo() ); // first select type of source data bool bEnableExt = ScDPObject::HasRegisteredSources(); ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); OSL_ENSURE(pFact, "ScAbstractFactory create fail!"); ::boost::scoped_ptr pTypeDlg( pFact->CreateScDataPilotSourceTypeDlg( pTabViewShell->GetDialogParent(), bEnableExt, RID_SCDLG_DAPITYPE)); // Populate named ranges (if any). ScRangeName* pRangeName = pDoc->GetRangeName(); if (pRangeName) { ScRangeName::const_iterator itr = pRangeName->begin(), itrEnd = pRangeName->end(); for (; itr != itrEnd; ++itr) pTypeDlg->AppendNamedRange(itr->second->GetName()); } OSL_ENSURE(pTypeDlg, "Dialog create fail!"); if ( pTypeDlg->Execute() == RET_OK ) { if ( pTypeDlg->IsExternal() ) { uno::Sequence aSources = ScDPObject::GetRegisteredSources(); ::boost::scoped_ptr pServDlg( pFact->CreateScDataPilotServiceDlg( pTabViewShell->GetDialogParent(), aSources, RID_SCDLG_DAPISERVICE)); OSL_ENSURE(pServDlg, "Dialog create fail!"); if ( pServDlg->Execute() == RET_OK ) { ScDPServiceDesc aServDesc( pServDlg->GetServiceName(), pServDlg->GetParSource(), pServDlg->GetParName(), pServDlg->GetParUser(), pServDlg->GetParPass() ); pNewDPObject.reset(new ScDPObject(pDoc)); pNewDPObject->SetServiceData( aServDesc ); } } else if ( pTypeDlg->IsDatabase() ) { OSL_ENSURE(pFact, "ScAbstractFactory create fail!"); ::boost::scoped_ptr pDataDlg( pFact->CreateScDataPilotDatabaseDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_DAPIDATA)); OSL_ENSURE(pDataDlg, "Dialog create fail!"); if ( pDataDlg->Execute() == RET_OK ) { ScImportSourceDesc aImpDesc(pDoc); pDataDlg->GetValues( aImpDesc ); pNewDPObject.reset(new ScDPObject(pDoc)); pNewDPObject->SetImportDesc( aImpDesc ); } } else if (pTypeDlg->IsNamedRange()) { OUString aName = pTypeDlg->GetSelectedNamedRange(); ScSheetSourceDesc aShtDesc(pDoc); aShtDesc.SetRangeName(aName); nSrcErrorId = aShtDesc.CheckSourceRange(); if (!nSrcErrorId) { pNewDPObject.reset(new ScDPObject(pDoc)); pNewDPObject->SetSheetDesc(aShtDesc); } } 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); } bool bOK = 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 = false; } if (bOK) { ScSheetSourceDesc aShtDesc(pDoc); aShtDesc.SetSourceRange(aRange); nSrcErrorId = aShtDesc.CheckSourceRange(); if (!nSrcErrorId) { pNewDPObject.reset(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() ); } } } } if (nSrcErrorId) { // Error occurred during data creation. Launch an error and bail out. InfoBox aBox(pTabViewShell->GetDialogParent(), ScGlobal::GetRscString(nSrcErrorId)); aBox.Execute(); return; } if ( pNewDPObject ) pNewDPObject->SetOutRange( aDestPos ); } pTabViewShell->SetDialogDPObject( pNewDPObject.get() ); // 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 ? false : true ); } } void ScCellShell::ExecuteSubtotals(SfxRequest& rReq) { ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell(); const SfxItemSet* pArgs = rReq.GetArgs(); if ( pArgs ) { pTabViewShell->DoSubTotals( ((const ScSubTotalItem&) pArgs->Get( SCITEM_SUBTDATA )). GetSubTotalData() ); rReq.Done(); return; } SfxAbstractTabDialog * pDlg = NULL; ScSubTotalParam aSubTotalParam; SfxItemSet aArgSet( GetPool(), SCITEM_SUBTDATA, SCITEM_SUBTDATA ); // Only get existing named database range. ScDBData* pDBData = pTabViewShell->GetDBData(true, SC_DB_OLD); if (!pDBData) { // No existing DB data at this position. Create an // anonymous DB. pDBData = pTabViewShell->GetAnonymousDBData(); ScRange aDataRange; pDBData->GetArea(aDataRange); pTabViewShell->MarkRange(aDataRange, false); } if (!pDBData) return; pDBData->GetSubTotalParam( aSubTotalParam ); aSubTotalParam.bRemoveOnly = false; aArgSet.Put( ScSubTotalItem( SCITEM_SUBTDATA, GetViewData(), &aSubTotalParam ) ); ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); OSL_ENSURE(pFact, "ScAbstractFactory create fail!"); pDlg = pFact->CreateScSubTotalDlg( pTabViewShell->GetDialogParent(), &aArgSet, RID_SCDLG_SUBTOTALS ); OSL_ENSURE(pDlg, "Dialog create fail!"); 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; } IMPL_LINK_NOARG(ScCellShell, DialogClosed) { OSL_ENSURE( pImpl->m_pLinkedDlg, "ScCellShell::DialogClosed(): invalid request" ); OSL_ENSURE( pImpl->m_pRequest, "ScCellShell::DialogClosed(): invalid request" ); String sFile, sFilter, sOptions, sSource; sal_uLong nRefresh = 0; if ( pImpl->m_pLinkedDlg->GetResult() == RET_OK ) { sFile = pImpl->m_pLinkedDlg->GetURL(); sFilter = pImpl->m_pLinkedDlg->GetFilter(); sOptions = pImpl->m_pLinkedDlg->GetOptions(); sSource = pImpl->m_pLinkedDlg->GetSource(); nRefresh = pImpl->m_pLinkedDlg->GetRefresh(); if ( sFile.Len() ) pImpl->m_pRequest->AppendItem( SfxStringItem( SID_FILE_NAME, sFile ) ); if ( sFilter.Len() ) pImpl->m_pRequest->AppendItem( SfxStringItem( SID_FILTER_NAME, sFilter ) ); if ( sOptions.Len() ) pImpl->m_pRequest->AppendItem( SfxStringItem( SID_FILE_FILTEROPTIONS, sOptions ) ); if ( sSource.Len() ) pImpl->m_pRequest->AppendItem( SfxStringItem( FN_PARAM_1, sSource ) ); if ( nRefresh ) pImpl->m_pRequest->AppendItem( SfxUInt32Item( FN_PARAM_2, nRefresh ) ); } ExecuteExternalSource( sFile, sFilter, sOptions, sSource, nRefresh, *(pImpl->m_pRequest) ); return 0; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */