diff --git a/sc/source/filter/xml/xmlexprt.cxx b/sc/source/filter/xml/xmlexprt.cxx index 5ed08dfa70f6..8fbeb8ab22ff 100644 --- a/sc/source/filter/xml/xmlexprt.cxx +++ b/sc/source/filter/xml/xmlexprt.cxx @@ -60,6 +60,8 @@ #include "stylehelper.hxx" #include "edittextiterator.hxx" #include "editattributemap.hxx" +#include +#include #include #include @@ -147,6 +149,7 @@ #include "XMLCodeNameProvider.hxx" +#include #include #include @@ -814,37 +817,35 @@ table::CellRangeAddress ScXMLExport::GetEndAddress(const uno::Reference& xSpreadDoc, - ScMyAreaLinksContainer& rAreaLinks ) +void ScXMLExport::GetAreaLinks( ScMyAreaLinksContainer& rAreaLinks ) { - uno::Reference< beans::XPropertySet > xPropSet( xSpreadDoc, uno::UNO_QUERY ); - if( !xPropSet.is() ) return; - - uno::Reference< container::XIndexAccess > xLinksIAccess( xPropSet->getPropertyValue( OUString( SC_UNO_AREALINKS ) ), uno::UNO_QUERY); - if( xLinksIAccess.is() ) + if (pDoc->GetLinkManager()) { - const OUString sFilter( SC_UNONAME_FILTER ); - const OUString sFilterOpt( SC_UNONAME_FILTOPT ); - const OUString sURL( SC_UNONAME_LINKURL ); - const OUString sRefresh( SC_UNONAME_REFDELAY ); - - sal_Int32 nCount(xLinksIAccess->getCount()); - for( sal_Int32 nIndex = 0; nIndex < nCount; ++nIndex ) + const sfx2::SvBaseLinks& rLinks = pDoc->GetLinkManager()->GetLinks(); + for (size_t i = 0; i < rLinks.size(); i++) { - uno::Reference< sheet::XAreaLink > xAreaLink(xLinksIAccess->getByIndex( nIndex ), uno::UNO_QUERY); - if( xAreaLink.is() ) + ScAreaLink *pLink = dynamic_cast(&(*(*rLinks[i]))); + if (pLink) { ScMyAreaLink aAreaLink; - aAreaLink.aDestRange = xAreaLink->getDestArea(); - aAreaLink.sSourceStr = xAreaLink->getSourceArea(); - uno::Reference< beans::XPropertySet > xLinkProp( xAreaLink, uno::UNO_QUERY ); - if( xLinkProp.is() ) - { - xLinkProp->getPropertyValue( sFilter ) >>= aAreaLink.sFilter; - xLinkProp->getPropertyValue( sFilterOpt ) >>= aAreaLink.sFilterOptions; - xLinkProp->getPropertyValue( sURL ) >>= aAreaLink.sURL; - xLinkProp->getPropertyValue( sRefresh ) >>= aAreaLink.nRefresh; - } + ScUnoConversion::FillApiRange( aAreaLink.aDestRange, pLink->GetDestArea() ); + aAreaLink.sSourceStr = pLink->GetSource(); + aAreaLink.sFilter = pLink->GetFilter(); + aAreaLink.sFilterOptions = pLink->GetOptions(); + aAreaLink.sURL = pLink->GetFile(); + aAreaLink.nRefresh = pLink->GetTimeout(); + rAreaLinks.AddNewAreaLink( aAreaLink ); + } + DataStream *pStream = dynamic_cast(&(*(*rLinks[i]))); + if (pStream) + { + ScMyAreaLink aAreaLink; + ScUnoConversion::FillApiRange( aAreaLink.aDestRange, pStream->GetRange() ); + aAreaLink.sSourceStr = pStream->GetMove(); + aAreaLink.sFilter = OUString::number(pStream->GetLimit()); + aAreaLink.sFilterOptions = "DataStream"; + aAreaLink.sURL = pStream->GetURL(); + aAreaLink.nRefresh = pStream->GetSettings(); rAreaLinks.AddNewAreaLink( aAreaLink ); } } @@ -1904,7 +1905,7 @@ void ScXMLExport::_ExportContent() WriteCalculationSettings(xSpreadDoc); sal_Int32 nTableCount(xIndex->getCount()); ScMyAreaLinksContainer aAreaLinks; - GetAreaLinks( xSpreadDoc, aAreaLinks ); + GetAreaLinks( aAreaLinks ); ScMyEmptyDatabaseRangesContainer aEmptyRanges(aExportDatabaseRanges.GetEmptyDatabaseRanges()); ScMyDetectiveOpContainer aDetectiveOpContainer; GetDetectiveOpList( aDetectiveOpContainer ); diff --git a/sc/source/filter/xml/xmlexprt.hxx b/sc/source/filter/xml/xmlexprt.hxx index cc649bd3df72..4ece1d5bb9ff 100644 --- a/sc/source/filter/xml/xmlexprt.hxx +++ b/sc/source/filter/xml/xmlexprt.hxx @@ -144,7 +144,7 @@ class ScXMLExport : public SvXMLExport com::sun::star::table::CellRangeAddress GetEndAddress(const com::sun::star::uno::Reference& xTable, const sal_Int32 nTable); // ScMyEmptyDatabaseRangesContainer GetEmptyDatabaseRanges(); - void GetAreaLinks( com::sun::star::uno::Reference< com::sun::star::sheet::XSpreadsheetDocument>& xSpreadDoc, ScMyAreaLinksContainer& rAreaLinks ); + void GetAreaLinks( ScMyAreaLinksContainer& rAreaLinks ); void GetDetectiveOpList( ScMyDetectiveOpContainer& rDetOp ); void WriteSingleColumn(const sal_Int32 nRepeatColumns, const sal_Int32 nStyleIndex, const sal_Int32 nIndex, const bool bIsAutoStyle, const bool bIsVisible); diff --git a/sc/source/ui/docshell/datastream.cxx b/sc/source/ui/docshell/datastream.cxx index a57512cdf7da..aef6c3b0794b 100644 --- a/sc/source/ui/docshell/datastream.cxx +++ b/sc/source/ui/docshell/datastream.cxx @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -166,9 +167,44 @@ void DataStream::MakeToolbarVisible(ScDocShell *pShell) DataStream* DataStream::Set(ScDocShell *pShell, const OUString& rURL, const OUString& rRange, sal_Int32 nLimit, const OUString& rMove, sal_uInt32 nSettings) { + // Each DataStream needs a destination area in order to be exported. + // There can be only one ScAreaLink / DataStream per cell. + // So - if we don't need range (DataStream with mbValuesInLine == false), + // just find a free cell for now. + sfx2::LinkManager* pLinkManager = pShell->GetDocument()->GetLinkManager(); + ScRange aDestArea; + aDestArea.Parse(rRange, pShell->GetDocument()); + sal_uInt16 nLinkPos = 0; + while (nLinkPos < pLinkManager->GetLinks().size()) + { + sfx2::SvBaseLink* pBase = *pLinkManager->GetLinks()[nLinkPos]; + if (rRange.isEmpty()) + { + if ( (pBase->ISA(ScAreaLink) && dynamic_cast + (&(*pBase))->GetDestArea().aStart == aDestArea.aStart) + || (pBase->ISA(DataStream) && dynamic_cast + (&(*pBase))->GetRange().aStart == aDestArea.aStart) ) + { + aDestArea.Move(0, 1, 0); + nLinkPos = 0; + continue; + } + else + ++nLinkPos; + } + else if ( (pBase->ISA(ScAreaLink) && dynamic_cast + (&(*pBase))->GetDestArea().aStart == aDestArea.aStart) + || (pBase->ISA(DataStream) && dynamic_cast + (&(*pBase))->GetRange().aStart == aDestArea.aStart) ) + { + pLinkManager->Remove( pBase ); + } + else + ++nLinkPos; + } + sfx2::SvBaseLink *pLink = 0; pLink = new DataStream( pShell, rURL, rRange, nLimit, rMove, nSettings ); - sfx2::LinkManager* pLinkManager = pShell->GetDocument()->GetLinkManager(); pLinkManager->InsertFileLink( *pLink, OBJECT_CLIENT_FILE, rURL, NULL, NULL ); return dynamic_cast(pLink); } @@ -181,20 +217,19 @@ DataStream::DataStream(ScDocShell *pShell, const OUString& rURL, const OUString& , mbRunning(false) , mpLines(0) , mnLinesCount(0) - , mpRange(new ScRange()) , mpEndRange(NULL) { mxThread = new datastreams::CallerThread( this ); mxThread->launch(); - Decode(rURL, rRange, rMove, nSettings); + Decode(rURL, rRange, nLimit, rMove, nSettings); - mpStartRange.reset( new ScRange(*mpRange.get()) ); - sal_Int32 nHeight = mpRange->aEnd.Row() - mpRange->aStart.Row() + 1; + maStartRange = maRange; + sal_Int32 nHeight = maRange.aEnd.Row() - maRange.aStart.Row() + 1; nLimit = nHeight * (nLimit / nHeight); - if (nLimit && mpRange->aStart.Row() + nLimit - 1 < MAXROW) + if (nLimit && maRange.aStart.Row() + nLimit - 1 < MAXROW) { - mpEndRange.reset( new ScRange(*mpRange) ); + mpEndRange.reset( new ScRange(maRange) ); mpEndRange->Move(0, nLimit - nHeight, 0); } } @@ -235,28 +270,32 @@ OString DataStream::ConsumeLine() return mpLines->at(mnLinesCount++); } -void DataStream::Decode( const OUString& rURL, const OUString& rRange, - const OUString& rMove, sal_uInt32 nSettings) +void DataStream::Decode(const OUString& rURL, const OUString& rRange, + const sal_Int32 nLimit, const OUString& rMove, const sal_uInt32 nSettings) { + msURL = rURL; + msRange = rRange; + mnLimit = nLimit; + msMove = rMove; + mnSettings = nSettings; + maRange.Parse(msRange); SvStream *pStream = 0; - if (nSettings & SCRIPT_STREAM) - pStream = new SvScriptStream(rURL); + if (mnSettings & SCRIPT_STREAM) + pStream = new SvScriptStream(msURL); else - pStream = new SvFileStream(rURL, STREAM_READ); + pStream = new SvFileStream(msURL, STREAM_READ); mxReaderThread = new datastreams::ReaderThread( pStream ); mxReaderThread->launch(); - mbValuesInLine = nSettings & VALUES_IN_LINE; + mbValuesInLine = mnSettings & VALUES_IN_LINE; if (!mbValuesInLine) return; - mpRange->Parse(rRange, mpScDocument); - - if (rMove == "NO_MOVE") + if (msMove == "NO_MOVE") meMove = NO_MOVE; - else if (rMove == "RANGE_DOWN") + else if (msMove == "RANGE_DOWN") meMove = RANGE_DOWN; - else if (rMove == "MOVE_DOWN") + else if (msMove == "MOVE_DOWN") meMove = MOVE_DOWN; } @@ -283,17 +322,17 @@ void DataStream::MoveData() switch (meMove) { case RANGE_DOWN: - if (mpRange->aStart == mpEndRange->aStart) + if (maRange.aStart == mpEndRange->aStart) meMove = MOVE_UP; break; case MOVE_UP: - mpScDocument->DeleteRow(*mpStartRange); + mpScDocument->DeleteRow(maStartRange); mpScDocument->InsertRow(*mpEndRange); break; case MOVE_DOWN: if (mpEndRange.get()) mpScDocument->DeleteRow(*mpEndRange); - mpScDocument->InsertRow(*mpRange); + mpScDocument->InsertRow(maRange); break; case NO_MOVE: break; @@ -306,7 +345,7 @@ bool DataStream::ImportData() MoveData(); if (mbValuesInLine) { - SCROW nHeight = mpRange->aEnd.Row() - mpRange->aStart.Row() + 1; + SCROW nHeight = maRange.aEnd.Row() - maRange.aStart.Row() + 1; OStringBuffer aBuf; while (nHeight--) { @@ -314,7 +353,7 @@ bool DataStream::ImportData() aBuf.append('\n'); } SvMemoryStream aMemoryStream((void *)aBuf.getStr(), aBuf.getLength(), STREAM_READ); - ScImportExport aImport(mpScDocument, *mpRange); + ScImportExport aImport(mpScDocument, maRange); aImport.SetSeparator(','); aImport.ImportStream(aMemoryStream, OUString(), FORMAT_STRING); } @@ -352,13 +391,13 @@ bool DataStream::ImportData() if (meMove == RANGE_DOWN) { - mpRange->Move(0, mpRange->aEnd.Row() - mpRange->aStart.Row() + 1, 0); + maRange.Move(0, maRange.aEnd.Row() - maRange.aStart.Row() + 1, 0); mpScDocShell->GetViewData()->GetView()->AlignToCursor( - mpRange->aStart.Col(), mpRange->aStart.Row(), SC_FOLLOW_JUMP); + maRange.aStart.Col(), maRange.aStart.Row(), SC_FOLLOW_JUMP); } SCROW aEndRow = mpEndRange.get() ? mpEndRange->aEnd.Row() : MAXROW; - mpScDocShell->PostPaint( ScRange( mpStartRange->aStart, ScAddress( mpRange->aEnd.Col(), - aEndRow, mpRange->aStart.Tab()) ), PAINT_GRID ); + mpScDocShell->PostPaint( ScRange( maStartRange.aStart, ScAddress( maRange.aEnd.Col(), + aEndRow, maRange.aStart.Tab()) ), PAINT_GRID ); return mbRunning; } diff --git a/sc/source/ui/inc/datastream.hxx b/sc/source/ui/inc/datastream.hxx index 00c000ff95da..b60a988f527e 100644 --- a/sc/source/ui/inc/datastream.hxx +++ b/sc/source/ui/inc/datastream.hxx @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -23,7 +24,6 @@ namespace datastreams { } class ScDocShell; class ScDocument; -class ScRange; class Window; typedef std::vector LinesList; @@ -31,7 +31,8 @@ typedef std::vector LinesList; class DataStream : boost::noncopyable, public sfx2::SvBaseLink { OString ConsumeLine(); - void Decode(const OUString& rURL, const OUString& rRange, const OUString& rMove, sal_uInt32 nSettings); + void Decode(const OUString& rURL, const OUString& rRange, const sal_Int32 nLimit, + const OUString& rMove, const sal_uInt32 nSettings); void MoveData(); public: @@ -49,6 +50,11 @@ public: const OUString& , const css::uno::Any& ) SAL_OVERRIDE; virtual void Edit(Window* , const Link& ) SAL_OVERRIDE; + const ScRange& GetRange() const { return maRange; } + const OUString& GetURL() const { return msURL; } + const sal_Int32& GetLimit() const { return mnLimit; } + const OUString& GetMove() const { return msMove; } + const sal_uInt32& GetSettings() const { return mnSettings; } bool ImportData(); void Start(); void Stop(); @@ -56,14 +62,19 @@ public: private: ScDocShell *mpScDocShell; ScDocument *mpScDocument; + OUString msURL; + OUString msRange; + OUString msMove; + sal_Int32 mnLimit; + sal_uInt32 mnSettings; MoveEnum meMove; bool mbRunning; bool mbIsUndoEnabled; bool mbValuesInLine; LinesList *mpLines; size_t mnLinesCount; - boost::scoped_ptr mpRange; - boost::scoped_ptr mpStartRange; + ScRange maRange; + ScRange maStartRange; boost::scoped_ptr mpEndRange; rtl::Reference mxThread; rtl::Reference mxReaderThread; diff --git a/sc/source/ui/miscdlgs/datastreamdlg.cxx b/sc/source/ui/miscdlgs/datastreamdlg.cxx index 92b3290d7ff8..b2666877e356 100644 --- a/sc/source/ui/miscdlgs/datastreamdlg.cxx +++ b/sc/source/ui/miscdlgs/datastreamdlg.cxx @@ -66,6 +66,7 @@ void DataStreamDlg::UpdateEnable() m_pVclFrameLimit->Hide(); m_pVclFrameMove->Hide(); m_pVclFrameRange->Hide(); + m_pEdRange->SetText(""); } else {