diff options
Diffstat (limited to 'sc/source/ui/docshell/dbdocimp.cxx')
-rw-r--r-- | sc/source/ui/docshell/dbdocimp.cxx | 723 |
1 files changed, 0 insertions, 723 deletions
diff --git a/sc/source/ui/docshell/dbdocimp.cxx b/sc/source/ui/docshell/dbdocimp.cxx deleted file mode 100644 index 69ae81bfd..000000000 --- a/sc/source/ui/docshell/dbdocimp.cxx +++ /dev/null @@ -1,723 +0,0 @@ -/* -*- 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 - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -// INCLUDE --------------------------------------------------------- - -#include <comphelper/processfactory.hxx> -#include <comphelper/types.hxx> -#include <vcl/msgbox.hxx> -#include <svx/dataaccessdescriptor.hxx> -#include <sfx2/viewfrm.hxx> - -#include <com/sun/star/sdb/CommandType.hpp> -#include <com/sun/star/sdb/XCompletedExecution.hpp> -#include <com/sun/star/sdbc/XRow.hpp> -#include <com/sun/star/sdbc/XRowSet.hpp> -#include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp> -#include <com/sun/star/lang/XMultiServiceFactory.hpp> -#include <com/sun/star/beans/XPropertySet.hpp> -#include <com/sun/star/frame/XDispatchProvider.hpp> -#include <com/sun/star/frame/FrameSearchFlag.hpp> -#include <com/sun/star/view/XSelectionSupplier.hpp> - - -#include "dbdocfun.hxx" -#include "docsh.hxx" -#include "globstr.hrc" -#include "scerrors.hxx" -#include "dbdata.hxx" -#include "markdata.hxx" -#include "undodat.hxx" -#include "progress.hxx" -#include "patattr.hxx" -#include "docpool.hxx" -#include "attrib.hxx" -#include "dbdocutl.hxx" -#include "editable.hxx" -#include "hints.hxx" -#include "chgtrack.hxx" - -using namespace com::sun::star; - -#define SC_SERVICE_ROWSET "com.sun.star.sdb.RowSet" -#define SC_SERVICE_INTHANDLER "com.sun.star.task.InteractionHandler" - -//! move to a header file? -#define SC_DBPROP_DATASOURCENAME "DataSourceName" -#define SC_DBPROP_COMMAND "Command" -#define SC_DBPROP_COMMANDTYPE "CommandType" -#define SC_DBPROP_SELECTION "Selection" -#define SC_DBPROP_CURSOR "Cursor" - -void ScDBDocFunc::ShowInBeamer( const ScImportParam& rParam, SfxViewFrame* pFrame ) -{ - // called after opening the database beamer - - if ( !pFrame || !rParam.bImport ) - return; - - uno::Reference<frame::XFrame> xFrame = pFrame->GetFrame().GetFrameInterface(); - uno::Reference<frame::XDispatchProvider> xDP(xFrame, uno::UNO_QUERY); - - uno::Reference<frame::XFrame> xBeamerFrame = xFrame->findFrame( - rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_beamer")), - frame::FrameSearchFlag::CHILDREN); - if (xBeamerFrame.is()) - { - uno::Reference<frame::XController> xController = xBeamerFrame->getController(); - uno::Reference<view::XSelectionSupplier> xControllerSelection(xController, uno::UNO_QUERY); - if (xControllerSelection.is()) - { - sal_Int32 nType = rParam.bSql ? sdb::CommandType::COMMAND : - ( (rParam.nType == ScDbQuery) ? sdb::CommandType::QUERY : - sdb::CommandType::TABLE ); - - ::svx::ODataAccessDescriptor aSelection; - aSelection.setDataSource(rParam.aDBName); - aSelection[svx::daCommand] <<= rParam.aStatement; - aSelection[svx::daCommandType] <<= nType; - - xControllerSelection->select(uno::makeAny(aSelection.createPropertyValueSequence())); - } - else - { - OSL_FAIL("no selection supplier in the beamer!"); - } - } -} - -// ----------------------------------------------------------------- - -bool ScDBDocFunc::DoImportUno( const ScAddress& rPos, - const uno::Sequence<beans::PropertyValue>& aArgs ) -{ - bool bDone = false; - - ScImportParam aImParam; - aImParam.nCol1 = aImParam.nCol2 = rPos.Col(); - aImParam.nRow1 = aImParam.nRow2 = rPos.Row(); - aImParam.bImport = true; - - uno::Reference<sdbc::XResultSet> xResSet; - uno::Sequence<uno::Any> aSelection; - - rtl::OUString aStrVal; - const beans::PropertyValue* pPropArray = aArgs.getConstArray(); - long nPropCount = aArgs.getLength(); - long i; - for (i = 0; i < nPropCount; i++) - { - const beans::PropertyValue& rProp = pPropArray[i]; - String aPropName = rProp.Name; - - if ( aPropName.EqualsAscii( SC_DBPROP_DATASOURCENAME )) - { - if ( rProp.Value >>= aStrVal ) - aImParam.aDBName = aStrVal; - } - else if ( aPropName.EqualsAscii( SC_DBPROP_COMMAND )) - { - if ( rProp.Value >>= aStrVal ) - aImParam.aStatement = aStrVal; - } - else if ( aPropName.EqualsAscii( SC_DBPROP_COMMANDTYPE )) - { - sal_Int32 nType = 0; - if ( rProp.Value >>= nType ) - { - aImParam.bSql = ( nType == sdb::CommandType::COMMAND ); - aImParam.nType = sal::static_int_cast<sal_uInt8>( ( nType == sdb::CommandType::QUERY ) ? ScDbQuery : ScDbTable ); - // nType is ignored if bSql is set - } - } - else if ( aPropName.EqualsAscii( SC_DBPROP_SELECTION )) - { - rProp.Value >>= aSelection; - } - else if ( aPropName.EqualsAscii( SC_DBPROP_CURSOR )) - { - rProp.Value >>= xResSet; - } - } - - std::vector<sal_Int32> aList; - long nSelLen = aSelection.getLength(); - for (i = 0; i < nSelLen; i++) - { - sal_Int32 nEntry = 0; - if ( aSelection[i] >>= nEntry ) - aList.push_back( nEntry ); - } - - bool bAddrInsert = false; //!??? - if ( bAddrInsert ) - { - bDone = DoImport( rPos.Tab(), aImParam, xResSet, &aList, sal_True, bAddrInsert ); - } - else - { - // create database range - //! merge this with SID_SBA_IMPORT execute in docsh4.cxx - - ScDBData* pDBData = rDocShell.GetDBData( ScRange(rPos), SC_DB_IMPORT, SC_DBSEL_KEEP ); - OSL_ENSURE(pDBData, "can't create DB data"); - String sTarget = pDBData->GetName(); - - //! change UpdateImport to use only one of rTableName, rStatement - - String aTableName, aStatement; - if ( aImParam.bSql ) - aStatement = aImParam.aStatement; - else - aTableName = aImParam.aStatement; - - UpdateImport( sTarget, aImParam.aDBName, aTableName, aStatement, - aImParam.bNative, aImParam.nType, xResSet, &aList ); - bDone = true; - } - - return bDone; -} - -// ----------------------------------------------------------------- - -bool ScDBDocFunc::DoImport( SCTAB nTab, const ScImportParam& rParam, - const uno::Reference< sdbc::XResultSet >& xResultSet, - const std::vector<sal_Int32> *pSelection, bool bRecord, bool bAddrInsert ) -{ - ScDocument* pDoc = rDocShell.GetDocument(); - ScChangeTrack *pChangeTrack = NULL; - ScRange aChangedRange; - - if (bRecord && !pDoc->IsUndoEnabled()) - bRecord = false; - - ScDBData* pDBData = NULL; - if ( !bAddrInsert ) - { - pDBData = pDoc->GetDBAtArea( nTab, rParam.nCol1, rParam.nRow1, - rParam.nCol2, rParam.nRow2 ); - if (!pDBData) - { - OSL_FAIL( "DoImport: no DBData" ); - return false; - } - } - - Window* pWaitWin = rDocShell.GetActiveDialogParent(); - if (pWaitWin) - pWaitWin->EnterWait(); - ScDocShellModificator aModificator( rDocShell ); - - sal_Bool bSuccess = false; - sal_Bool bApi = false; //! pass as argument - sal_Bool bTruncated = false; // for warning - sal_uInt16 nErrStringId = 0; - String aErrorMessage; - - SCCOL nCol = rParam.nCol1; - SCROW nRow = rParam.nRow1; - SCCOL nEndCol = nCol; // end of resulting database area - SCROW nEndRow = nRow; - long i; - - sal_Bool bDoSelection = false; - sal_Bool bRealSelection = false; // sal_True if not everything is selected - sal_uLong nListPos = 0; - sal_uLong nRowsRead = 0; - sal_uLong nListCount = 0; - - // -1 is special - if ( !pSelection->empty() && (*pSelection)[0] != -1 ) - { - bDoSelection = sal_True; - nListCount = pSelection->size(); - } - - // ImportDoc - also used for Redo - ScDocument* pImportDoc = new ScDocument( SCDOCMODE_UNDO ); - pImportDoc->InitUndo( pDoc, nTab, nTab ); - ScColumn::DoubleAllocSwitch aAllocSwitch(true); - - // - // get data from database into import document - // - - try - { - // progress bar - // only text (title is still needed, for the cancel button) - ScProgress aProgress( &rDocShell, ScGlobal::GetRscString(STR_UNDO_IMPORTDATA), 0 ); - - uno::Reference<sdbc::XRowSet> xRowSet = uno::Reference<sdbc::XRowSet>( - xResultSet, uno::UNO_QUERY ); - sal_Bool bDispose = false; - if ( !xRowSet.is() ) - { - bDispose = sal_True; - xRowSet = uno::Reference<sdbc::XRowSet>( - comphelper::getProcessServiceFactory()->createInstance( - rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_SERVICE_ROWSET )) ), - uno::UNO_QUERY); - uno::Reference<beans::XPropertySet> xRowProp( xRowSet, uno::UNO_QUERY ); - OSL_ENSURE( xRowProp.is(), "can't get RowSet" ); - if ( xRowProp.is() ) - { - // - // set source parameters - // - - sal_Int32 nType = rParam.bSql ? sdb::CommandType::COMMAND : - ( (rParam.nType == ScDbQuery) ? sdb::CommandType::QUERY : - sdb::CommandType::TABLE ); - uno::Any aAny; - - aAny <<= rParam.aDBName; - xRowProp->setPropertyValue( - rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_DBPROP_DATASOURCENAME)), aAny ); - - aAny <<= rParam.aStatement; - xRowProp->setPropertyValue( - rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_DBPROP_COMMAND)), aAny ); - - aAny <<= nType; - xRowProp->setPropertyValue( - rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_DBPROP_COMMANDTYPE)), aAny ); - - uno::Reference<sdb::XCompletedExecution> xExecute( xRowSet, uno::UNO_QUERY ); - if ( xExecute.is() ) - { - uno::Reference<task::XInteractionHandler> xHandler( - comphelper::getProcessServiceFactory()->createInstance( - rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_SERVICE_INTHANDLER )) ), - uno::UNO_QUERY); - xExecute->executeWithCompletion( xHandler ); - } - else - xRowSet->execute(); - } - } - if ( xRowSet.is() ) - { - // - // get column descriptions - // - - long nColCount = 0; - uno::Reference<sdbc::XResultSetMetaData> xMeta; - uno::Reference<sdbc::XResultSetMetaDataSupplier> xMetaSupp( xRowSet, uno::UNO_QUERY ); - if ( xMetaSupp.is() ) - xMeta = xMetaSupp->getMetaData(); - if ( xMeta.is() ) - nColCount = xMeta->getColumnCount(); // this is the number of real columns - - if ( rParam.nCol1 + nColCount - 1 > MAXCOL ) - { - nColCount = 0; - //! error message - } - - uno::Reference<sdbc::XRow> xRow( xRowSet, uno::UNO_QUERY ); - if ( nColCount > 0 && xRow.is() ) - { - nEndCol = (SCCOL)( rParam.nCol1 + nColCount - 1 ); - - uno::Sequence<sal_Int32> aColTypes( nColCount ); // column types - uno::Sequence<sal_Bool> aColCurr( nColCount ); // currency flag is not in types - sal_Int32* pTypeArr = aColTypes.getArray(); - sal_Bool* pCurrArr = aColCurr.getArray(); - for (i=0; i<nColCount; i++) - { - pTypeArr[i] = xMeta->getColumnType( i+1 ); - pCurrArr[i] = xMeta->isCurrency( i+1 ); - } - - if ( !bAddrInsert ) // read column names - { - nCol = rParam.nCol1; - for (i=0; i<nColCount; i++) - { - pImportDoc->SetString( nCol, nRow, nTab, - xMeta->getColumnLabel( i+1 ) ); - ++nCol; - } - ++nRow; - } - - sal_Bool bEnd = false; - if ( !bDoSelection ) - xRowSet->beforeFirst(); - sal_uInt16 nInserted = 0; - while ( !bEnd ) - { - // skip rows that are not selected - if ( !bDoSelection ) - { - if ( (bEnd = !xRowSet->next()) == false ) - ++nRowsRead; - } - else - { - if (nListPos < nListCount) - { - sal_uInt32 nNextRow = (*pSelection)[nListPos]; - if ( nRowsRead+1 < nNextRow ) - bRealSelection = sal_True; - bEnd = !xRowSet->absolute(nRowsRead = nNextRow); - ++nListPos; - } - else - { - bRealSelection = xRowSet->next(); - bEnd = sal_True; // more data available but not used - } - } - - if ( !bEnd ) - { - if ( ValidRow(nRow) ) - { - nCol = rParam.nCol1; - for (i=0; i<nColCount; i++) - { - ScDatabaseDocUtil::PutData( pImportDoc, nCol, nRow, nTab, - xRow, i+1, pTypeArr[i], pCurrArr[i] ); - ++nCol; - } - nEndRow = nRow; - ++nRow; - - // progress bar - - ++nInserted; - if (!(nInserted & 15)) - { - String aPict = ScGlobal::GetRscString( STR_PROGRESS_IMPORT ); - String aText = aPict.GetToken(0,'#'); - aText += String::CreateFromInt32( nInserted ); - aText += aPict.GetToken(1,'#'); - - if (!aProgress.SetStateText( 0, aText )) // stopped by user? - { - bEnd = sal_True; - bSuccess = false; - nErrStringId = STR_DATABASE_ABORTED; - } - } - } - else // past the end of the spreadsheet - { - bEnd = sal_True; // don't continue - bTruncated = sal_True; // warning flag - } - } - } - - bSuccess = sal_True; - } - - if ( bDispose ) - ::comphelper::disposeComponent( xRowSet ); - } - } - catch ( sdbc::SQLException& rError ) - { - aErrorMessage = rError.Message; - } - catch ( uno::Exception& ) - { - OSL_FAIL("Unexpected exception in database"); - } - - pImportDoc->DoColResize( nTab, rParam.nCol1,nEndCol, 0 ); - - // - // test for cell protection - // - - sal_Bool bKeepFormat = !bAddrInsert && pDBData->IsKeepFmt(); - sal_Bool bMoveCells = !bAddrInsert && pDBData->IsDoSize(); - SCCOL nFormulaCols = 0; // columns to be filled with formulas - if (bMoveCells && nEndCol == rParam.nCol2) - { - // if column count changes, formulas would become invalid anyway - // -> only set nFormulaCols for unchanged column count - - SCCOL nTestCol = rParam.nCol2 + 1; // right of the data - SCROW nTestRow = rParam.nRow1 + 1; // below the title row - while ( nTestCol <= MAXCOL && - pDoc->GetCellType(ScAddress( nTestCol, nTestRow, nTab )) == CELLTYPE_FORMULA ) - ++nTestCol, ++nFormulaCols; - } - - if (bSuccess) - { - // old and new range editable? - ScEditableTester aTester; - aTester.TestBlock( pDoc, nTab, rParam.nCol1,rParam.nRow1,rParam.nCol2,rParam.nRow2 ); - aTester.TestBlock( pDoc, nTab, rParam.nCol1,rParam.nRow1,nEndCol,nEndRow ); - if ( !aTester.IsEditable() ) - { - nErrStringId = aTester.GetMessageId(); - bSuccess = false; - } - else if ( (pChangeTrack = pDoc->GetChangeTrack()) != NULL ) - aChangedRange = ScRange(rParam.nCol1, rParam.nRow1, nTab, - nEndCol+nFormulaCols, nEndRow, nTab ); - } - - if ( bSuccess && bMoveCells ) - { - ScRange aOld( rParam.nCol1, rParam.nRow1, nTab, - rParam.nCol2+nFormulaCols, rParam.nRow2, nTab ); - ScRange aNew( rParam.nCol1, rParam.nRow1, nTab, - nEndCol+nFormulaCols, nEndRow, nTab ); - if (!pDoc->CanFitBlock( aOld, aNew )) - { - nErrStringId = STR_MSSG_DOSUBTOTALS_2; // can't insert cells - bSuccess = false; - } - } - - // - // copy data from import doc into real document - // - - if ( bSuccess ) - { - if (bKeepFormat) - { - // keep formatting of title and first data row from the document - // CopyToDocument also copies styles, Apply... needs separate calls - - SCCOL nMinEndCol = Min( rParam.nCol2, nEndCol ); // not too much - nMinEndCol = sal::static_int_cast<SCCOL>( nMinEndCol + nFormulaCols ); // only if column count unchanged - pImportDoc->DeleteAreaTab( 0,0, MAXCOL,MAXROW, nTab, IDF_ATTRIB ); - pDoc->CopyToDocument( rParam.nCol1, rParam.nRow1, nTab, - nMinEndCol, rParam.nRow1, nTab, - IDF_ATTRIB, false, pImportDoc ); - - SCROW nDataStartRow = rParam.nRow1+1; - for (SCCOL nCopyCol=rParam.nCol1; nCopyCol<=nMinEndCol; nCopyCol++) - { - const ScPatternAttr* pSrcPattern = pDoc->GetPattern( - nCopyCol, nDataStartRow, nTab ); - pImportDoc->ApplyPatternAreaTab( nCopyCol, nDataStartRow, nCopyCol, nEndRow, - nTab, *pSrcPattern ); - const ScStyleSheet* pStyle = pSrcPattern->GetStyleSheet(); - if (pStyle) - pImportDoc->ApplyStyleAreaTab( nCopyCol, nDataStartRow, nCopyCol, nEndRow, - nTab, *pStyle ); - } - } - - // don't set cell protection attribute if table is protected - if (pDoc->IsTabProtected(nTab)) - { - ScPatternAttr aPattern(pImportDoc->GetPool()); - aPattern.GetItemSet().Put( ScProtectionAttr( false,false,false,false ) ); - pImportDoc->ApplyPatternAreaTab( 0,0,MAXCOL,MAXROW, nTab, aPattern ); - } - - // - // copy old data for undo - // - - SCCOL nUndoEndCol = Max( nEndCol, rParam.nCol2 ); // rParam = old end - SCROW nUndoEndRow = Max( nEndRow, rParam.nRow2 ); - - ScDocument* pUndoDoc = NULL; - ScDBData* pUndoDBData = NULL; - if ( bRecord ) - { - pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); - pUndoDoc->InitUndo( pDoc, nTab, nTab ); - - if ( !bAddrInsert ) - pUndoDBData = new ScDBData( *pDBData ); - } - - ScMarkData aNewMark; - aNewMark.SelectOneTable( nTab ); - - if (bRecord) - { - // do not touch notes (ScUndoImportData does not support drawing undo) - sal_uInt16 nCopyFlags = IDF_ALL & ~IDF_NOTE; - - // nFormulaCols is set only if column count is unchanged - pDoc->CopyToDocument( rParam.nCol1, rParam.nRow1, nTab, - nEndCol+nFormulaCols, nEndRow, nTab, - nCopyFlags, false, pUndoDoc ); - if ( rParam.nCol2 > nEndCol ) - pDoc->CopyToDocument( nEndCol+1, rParam.nRow1, nTab, - nUndoEndCol, nUndoEndRow, nTab, - nCopyFlags, false, pUndoDoc ); - if ( rParam.nRow2 > nEndRow ) - pDoc->CopyToDocument( rParam.nCol1, nEndRow+1, nTab, - nUndoEndCol+nFormulaCols, nUndoEndRow, nTab, - nCopyFlags, false, pUndoDoc ); - } - - // - // move new data - // - - if (bMoveCells) - { - // clear only the range without the formulas, - // so the formula title and first row are preserved - - ScRange aDelRange( rParam.nCol1, rParam.nRow1, nTab, - rParam.nCol2, rParam.nRow2, nTab ); - pDoc->DeleteAreaTab( aDelRange, IDF_ALL & ~IDF_NOTE ); // ohne die Formeln - - ScRange aOld( rParam.nCol1, rParam.nRow1, nTab, - rParam.nCol2+nFormulaCols, rParam.nRow2, nTab ); - ScRange aNew( rParam.nCol1, rParam.nRow1, nTab, - nEndCol+nFormulaCols, nEndRow, nTab ); - pDoc->FitBlock( aOld, aNew, false ); // Formeln nicht loeschen - } - else if ( nEndCol < rParam.nCol2 ) // DeleteArea calls PutInOrder - pDoc->DeleteArea( nEndCol+1, rParam.nRow1, rParam.nCol2, rParam.nRow2, - aNewMark, IDF_CONTENTS & ~IDF_NOTE ); - - // CopyToDocument doesn't remove contents - pDoc->DeleteAreaTab( rParam.nCol1, rParam.nRow1, nEndCol, nEndRow, nTab, IDF_CONTENTS & ~IDF_NOTE ); - - // remove each column from ImportDoc after copying to reduce memory usage - sal_Bool bOldAutoCalc = pDoc->GetAutoCalc(); - pDoc->SetAutoCalc( false ); // outside of the loop - for (SCCOL nCopyCol = rParam.nCol1; nCopyCol <= nEndCol; nCopyCol++) - { - pImportDoc->CopyToDocument( nCopyCol, rParam.nRow1, nTab, nCopyCol, nEndRow, nTab, - IDF_ALL, false, pDoc ); - pImportDoc->DeleteAreaTab( nCopyCol, rParam.nRow1, nCopyCol, nEndRow, nTab, IDF_CONTENTS ); - pImportDoc->DoColResize( nTab, nCopyCol, nCopyCol, 0 ); - } - pDoc->SetAutoCalc( bOldAutoCalc ); - - if (nFormulaCols > 0) // copy formulas - { - if (bKeepFormat) // formats for formulas - pImportDoc->CopyToDocument( nEndCol+1, rParam.nRow1, nTab, - nEndCol+nFormulaCols, nEndRow, nTab, - IDF_ATTRIB, false, pDoc ); - // fill formulas - ScMarkData aMark; - aMark.SelectOneTable(nTab); - pDoc->Fill( nEndCol+1, rParam.nRow1+1, nEndCol+nFormulaCols, rParam.nRow1+1, - aMark, nEndRow-rParam.nRow1-1, FILL_TO_BOTTOM, FILL_SIMPLE ); - } - - // if new range is smaller, clear old contents - - if (!bMoveCells) // move has happened above - { - if ( rParam.nCol2 > nEndCol ) - pDoc->DeleteArea( nEndCol+1, rParam.nRow1, rParam.nCol2, rParam.nRow2, - aNewMark, IDF_CONTENTS ); - if ( rParam.nRow2 > nEndRow ) - pDoc->DeleteArea( rParam.nCol1, nEndRow+1, rParam.nCol2, rParam.nRow2, - aNewMark, IDF_CONTENTS ); - } - - if( !bAddrInsert ) // update database range - { - pDBData->SetImportParam( rParam ); - pDBData->SetHeader( sal_True ); - pDBData->SetByRow( sal_True ); - pDBData->SetArea( nTab, rParam.nCol1,rParam.nRow1, nEndCol,nEndRow ); - pDBData->SetImportSelection( bRealSelection ); - pDoc->CompileDBFormula(); - } - - if (bRecord) - { - ScDocument* pRedoDoc = pImportDoc; - pImportDoc = NULL; - - if (nFormulaCols > 0) // include filled formulas for redo - pDoc->CopyToDocument( rParam.nCol1, rParam.nRow1, nTab, - nEndCol+nFormulaCols, nEndRow, nTab, - IDF_ALL & ~IDF_NOTE, false, pRedoDoc ); - - ScDBData* pRedoDBData = pDBData ? new ScDBData( *pDBData ) : NULL; - - rDocShell.GetUndoManager()->AddUndoAction( - new ScUndoImportData( &rDocShell, nTab, - rParam, nUndoEndCol, nUndoEndRow, - nFormulaCols, - pUndoDoc, pRedoDoc, pUndoDBData, pRedoDBData ) ); - } - - pDoc->SetDirty(); - rDocShell.PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID ); - aModificator.SetDocumentModified(); - - ScDBRangeRefreshedHint aHint( rParam ); - pDoc->BroadcastUno( aHint ); - - if (pWaitWin) - pWaitWin->LeaveWait(); - - if ( bTruncated && !bApi ) // show warning - ErrorHandler::HandleError(SCWARN_IMPORT_RANGE_OVERFLOW); - } - else if ( !bApi ) - { - if (pWaitWin) - pWaitWin->LeaveWait(); - - if (!aErrorMessage.Len()) - { - if (!nErrStringId) - nErrStringId = STR_MSSG_IMPORTDATA_0; - aErrorMessage = ScGlobal::GetRscString( nErrStringId ); - } - InfoBox aInfoBox( rDocShell.GetActiveDialogParent(), aErrorMessage ); - aInfoBox.Execute(); - } - - delete pImportDoc; - - if (bSuccess && pChangeTrack) - pChangeTrack->AppendInsert ( aChangedRange ); - - return bSuccess; -} - - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |