summaryrefslogtreecommitdiff
path: root/sc/source/filter/rtf/eeimpars.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/filter/rtf/eeimpars.cxx')
-rw-r--r--sc/source/filter/rtf/eeimpars.cxx645
1 files changed, 645 insertions, 0 deletions
diff --git a/sc/source/filter/rtf/eeimpars.cxx b/sc/source/filter/rtf/eeimpars.cxx
new file mode 100644
index 000000000000..ec01c82efce1
--- /dev/null
+++ b/sc/source/filter/rtf/eeimpars.cxx
@@ -0,0 +1,645 @@
+/* -*- 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 "scitems.hxx"
+#include <editeng/eeitem.hxx>
+
+
+#include <editeng/adjitem.hxx>
+#include <editeng/editobj.hxx>
+#include <editeng/editview.hxx>
+#include <editeng/escpitem.hxx>
+#include <editeng/langitem.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svdpage.hxx>
+#include <editeng/scripttypeitem.hxx>
+#include <svtools/htmlcfg.hxx>
+#include <sfx2/sfxhtml.hxx>
+#include <svtools/parhtml.hxx>
+#include <svl/zforlist.hxx>
+#include <vcl/virdev.hxx>
+#include <vcl/svapp.hxx>
+#include <unotools/syslocale.hxx>
+#include <unotools/charclass.hxx>
+
+#include "eeimport.hxx"
+#include "global.hxx"
+#include "document.hxx"
+#include "editutil.hxx"
+#include "stlsheet.hxx"
+#include "docpool.hxx"
+#include "attrib.hxx"
+#include "patattr.hxx"
+#include "cell.hxx"
+#include "eeparser.hxx"
+#include "drwlayer.hxx"
+#include "rangenam.hxx"
+#include "progress.hxx"
+#include "stringutil.hxx"
+
+#include "globstr.hrc"
+
+// in fuins1.cxx
+extern void ScLimitSizeOnDrawPage( Size& rSize, Point& rPos, const Size& rPage );
+
+//------------------------------------------------------------------------
+
+ScEEImport::ScEEImport( ScDocument* pDocP, const ScRange& rRange ) :
+ maRange( rRange ),
+ mpDoc( pDocP ),
+ mpParser( NULL ),
+ mpRowHeights( new Table )
+{
+ const ScPatternAttr* pPattern = mpDoc->GetPattern(
+ maRange.aStart.Col(), maRange.aStart.Row(), maRange.aStart.Tab() );
+ mpEngine = new ScTabEditEngine( *pPattern, mpDoc->GetEditPool() );
+ mpEngine->SetUpdateMode( false );
+ mpEngine->EnableUndo( false );
+}
+
+
+ScEEImport::~ScEEImport()
+{
+ // Reihenfolge wichtig, sonst knallt's irgendwann irgendwo in irgendeinem Dtor!
+ // Ist gewaehrleistet, da ScEEImport Basisklasse ist
+ delete mpEngine; // nach Parser!
+ delete mpRowHeights;
+}
+
+
+sal_uLong ScEEImport::Read( SvStream& rStream, const String& rBaseURL )
+{
+ sal_uLong nErr = mpParser->Read( rStream, rBaseURL );
+
+ SCCOL nEndCol;
+ SCROW nEndRow;
+ mpParser->GetDimensions( nEndCol, nEndRow );
+ if ( nEndCol != 0 )
+ {
+ nEndCol += maRange.aStart.Col() - 1;
+ if ( nEndCol > MAXCOL )
+ nEndCol = MAXCOL;
+ }
+ else
+ nEndCol = maRange.aStart.Col();
+ if ( nEndRow != 0 )
+ {
+ nEndRow += maRange.aStart.Row() - 1;
+ if ( nEndRow > MAXROW )
+ nEndRow = MAXROW;
+ }
+ else
+ nEndRow = maRange.aStart.Row();
+ maRange.aEnd.Set( nEndCol, nEndRow, maRange.aStart.Tab() );
+
+ return nErr;
+}
+
+
+void ScEEImport::WriteToDocument( sal_Bool bSizeColsRows, double nOutputFactor, SvNumberFormatter* pFormatter, bool bConvertDate )
+{
+ ScProgress* pProgress = new ScProgress( mpDoc->GetDocumentShell(),
+ ScGlobal::GetRscString( STR_LOAD_DOC ), mpParser->ListSize() );
+ sal_uLong nProgress = 0;
+
+ SCCOL nStartCol, nEndCol;
+ SCROW nStartRow, nEndRow;
+ SCTAB nTab;
+ SCROW nOverlapRowMax, nLastMergedRow;
+ SCCOL nMergeColAdd;
+ nStartCol = maRange.aStart.Col();
+ nStartRow = maRange.aStart.Row();
+ nTab = maRange.aStart.Tab();
+ nEndCol = maRange.aEnd.Col();
+ nEndRow = maRange.aEnd.Row();
+ nOverlapRowMax = 0;
+ nMergeColAdd = 0;
+ nLastMergedRow = SCROW_MAX;
+ sal_Bool bHasGraphics = false;
+ ScEEParseEntry* pE;
+ if (!pFormatter)
+ pFormatter = mpDoc->GetFormatTable();
+ bool bNumbersEnglishUS = false;
+ if (pFormatter->GetLanguage() == LANGUAGE_SYSTEM)
+ {
+ // Automatic language option selected. Check for the global 'use US English' option.
+ SvxHtmlOptions aOpt;
+ bNumbersEnglishUS = aOpt.IsNumbersEnglishUS();
+ }
+ ScDocumentPool* pDocPool = mpDoc->GetPool();
+ ScRangeName* pRangeNames = mpDoc->GetRangeName();
+ for ( size_t i = 0, nListSize = mpParser->ListSize(); i < nListSize; ++i )
+ {
+ pE = mpParser->ListEntry( i );
+ SCROW nRow = nStartRow + pE->nRow;
+ if ( nRow != nLastMergedRow )
+ nMergeColAdd = 0;
+ SCCOL nCol = nStartCol + pE->nCol + nMergeColAdd;
+ // RowMerge feststellen, pures ColMerge und ColMerge der ersten
+ // MergeRow bereits beim parsen
+ if ( nRow <= nOverlapRowMax )
+ {
+ while ( nCol <= MAXCOL && mpDoc->HasAttrib( nCol, nRow, nTab,
+ nCol, nRow, nTab, HASATTR_OVERLAPPED ) )
+ {
+ nCol++;
+ nMergeColAdd++;
+ }
+ nLastMergedRow = nRow;
+ }
+ // fuer zweiten Durchlauf eintragen
+ pE->nCol = nCol;
+ pE->nRow = nRow;
+ if ( ValidCol(nCol) && ValidRow(nRow) )
+ {
+ SfxItemSet aSet = mpEngine->GetAttribs( pE->aSel );
+ // Default raus, wir setzen selber links/rechts je nachdem ob Text
+ // oder Zahl; EditView.GetAttribs liefert immer kompletten Set
+ // mit Defaults aufgefuellt
+ const SfxPoolItem& rItem = aSet.Get( EE_PARA_JUST );
+ if ( ((const SvxAdjustItem&)rItem).GetAdjust() == SVX_ADJUST_LEFT )
+ aSet.ClearItem( EE_PARA_JUST );
+
+ // Testen, ob einfacher String ohne gemischte Attribute
+ sal_Bool bSimple = ( pE->aSel.nStartPara == pE->aSel.nEndPara );
+ for (sal_uInt16 nId = EE_CHAR_START; nId <= EE_CHAR_END && bSimple; nId++)
+ {
+ const SfxPoolItem* pItem = 0;
+ SfxItemState eState = aSet.GetItemState( nId, sal_True, &pItem );
+ if (eState == SFX_ITEM_DONTCARE)
+ bSimple = false;
+ else if (eState == SFX_ITEM_SET)
+ {
+ if ( nId == EE_CHAR_ESCAPEMENT ) // Hoch-/Tiefstellen immer ueber EE
+ {
+ if ( (SvxEscapement)((const SvxEscapementItem*)pItem)->GetEnumValue()
+ != SVX_ESCAPEMENT_OFF )
+ bSimple = false;
+ }
+ }
+ }
+ if ( bSimple )
+ { // Feldbefehle enthalten?
+ SfxItemState eFieldState = aSet.GetItemState( EE_FEATURE_FIELD, false );
+ if ( eFieldState == SFX_ITEM_DONTCARE || eFieldState == SFX_ITEM_SET )
+ bSimple = false;
+ }
+
+ // HTML
+ String aValStr, aNumStr;
+ double fVal;
+ sal_uInt32 nNumForm = 0;
+ LanguageType eNumLang = LANGUAGE_NONE;
+ if ( pE->pNumStr )
+ { // SDNUM muss sein wenn SDVAL
+ aNumStr = *pE->pNumStr;
+ if ( pE->pValStr )
+ aValStr = *pE->pValStr;
+ fVal = SfxHTMLParser::GetTableDataOptionsValNum(
+ nNumForm, eNumLang, aValStr, aNumStr, *pFormatter );
+ }
+
+ // Attribute setzen
+ ScPatternAttr aAttr( pDocPool );
+ aAttr.GetFromEditItemSet( &aSet );
+ SfxItemSet& rSet = aAttr.GetItemSet();
+ if ( aNumStr.Len() )
+ {
+ rSet.Put( SfxUInt32Item( ATTR_VALUE_FORMAT, nNumForm ) );
+ rSet.Put( SvxLanguageItem( eNumLang, ATTR_LANGUAGE_FORMAT ) );
+ }
+ const SfxItemSet& rESet = pE->aItemSet;
+ if ( rESet.Count() )
+ {
+ const SfxPoolItem* pItem;
+ if ( rESet.GetItemState( ATTR_BACKGROUND, false, &pItem) == SFX_ITEM_SET )
+ rSet.Put( *pItem );
+ if ( rESet.GetItemState( ATTR_BORDER, false, &pItem) == SFX_ITEM_SET )
+ rSet.Put( *pItem );
+ if ( rESet.GetItemState( ATTR_SHADOW, false, &pItem) == SFX_ITEM_SET )
+ rSet.Put( *pItem );
+ // HTML
+ if ( rESet.GetItemState( ATTR_HOR_JUSTIFY, false, &pItem) == SFX_ITEM_SET )
+ rSet.Put( *pItem );
+ if ( rESet.GetItemState( ATTR_VER_JUSTIFY, false, &pItem) == SFX_ITEM_SET )
+ rSet.Put( *pItem );
+ if ( rESet.GetItemState( ATTR_LINEBREAK, false, &pItem) == SFX_ITEM_SET )
+ rSet.Put( *pItem );
+ if ( rESet.GetItemState( ATTR_FONT_COLOR, false, &pItem) == SFX_ITEM_SET )
+ rSet.Put( *pItem );
+ if ( rESet.GetItemState( ATTR_FONT_UNDERLINE, false, &pItem) == SFX_ITEM_SET )
+ rSet.Put( *pItem );
+ // HTML LATIN/CJK/CTL script type dependent
+ const SfxPoolItem* pFont;
+ if ( rESet.GetItemState( ATTR_FONT, false, &pFont) != SFX_ITEM_SET )
+ pFont = 0;
+ const SfxPoolItem* pHeight;
+ if ( rESet.GetItemState( ATTR_FONT_HEIGHT, false, &pHeight) != SFX_ITEM_SET )
+ pHeight = 0;
+ const SfxPoolItem* pWeight;
+ if ( rESet.GetItemState( ATTR_FONT_WEIGHT, false, &pWeight) != SFX_ITEM_SET )
+ pWeight = 0;
+ const SfxPoolItem* pPosture;
+ if ( rESet.GetItemState( ATTR_FONT_POSTURE, false, &pPosture) != SFX_ITEM_SET )
+ pPosture = 0;
+ if ( pFont || pHeight || pWeight || pPosture )
+ {
+ String aStr( mpEngine->GetText( pE->aSel ) );
+ sal_uInt8 nScriptType = mpDoc->GetStringScriptType( aStr );
+ const sal_uInt8 nScripts[3] = { SCRIPTTYPE_LATIN,
+ SCRIPTTYPE_ASIAN, SCRIPTTYPE_COMPLEX };
+ for ( sal_uInt8 j=0; j<3; ++j )
+ {
+ if ( nScriptType & nScripts[j] )
+ {
+ if ( pFont )
+ rSet.Put( *pFont, ScGlobal::GetScriptedWhichID(
+ nScripts[j], ATTR_FONT ));
+ if ( pHeight )
+ rSet.Put( *pHeight, ScGlobal::GetScriptedWhichID(
+ nScripts[j], ATTR_FONT_HEIGHT ));
+ if ( pWeight )
+ rSet.Put( *pWeight, ScGlobal::GetScriptedWhichID(
+ nScripts[j], ATTR_FONT_WEIGHT ));
+ if ( pPosture )
+ rSet.Put( *pPosture, ScGlobal::GetScriptedWhichID(
+ nScripts[j], ATTR_FONT_POSTURE ));
+ }
+ }
+ }
+ }
+ if ( pE->nColOverlap > 1 || pE->nRowOverlap > 1 )
+ { // merged cells, mit SfxItemSet Put schneller als mit
+ // nachtraeglichem ScDocument DoMerge
+ ScMergeAttr aMerge( pE->nColOverlap, pE->nRowOverlap );
+ rSet.Put( aMerge );
+ SCROW nRO = 0;
+ if ( pE->nColOverlap > 1 )
+ mpDoc->ApplyFlagsTab( nCol+1, nRow,
+ nCol + pE->nColOverlap - 1, nRow, nTab,
+ SC_MF_HOR );
+ if ( pE->nRowOverlap > 1 )
+ {
+ nRO = nRow + pE->nRowOverlap - 1;
+ mpDoc->ApplyFlagsTab( nCol, nRow+1,
+ nCol, nRO , nTab,
+ SC_MF_VER );
+ if ( nRO > nOverlapRowMax )
+ nOverlapRowMax = nRO;
+ }
+ if ( pE->nColOverlap > 1 && pE->nRowOverlap > 1 )
+ mpDoc->ApplyFlagsTab( nCol+1, nRow+1,
+ nCol + pE->nColOverlap - 1, nRO, nTab,
+ SC_MF_HOR | SC_MF_VER );
+ }
+ const ScStyleSheet* pStyleSheet =
+ mpDoc->GetPattern( nCol, nRow, nTab )->GetStyleSheet();
+ aAttr.SetStyleSheet( (ScStyleSheet*)pStyleSheet );
+ mpDoc->SetPattern( nCol, nRow, nTab, aAttr, sal_True );
+
+ // Daten eintragen
+ if (bSimple)
+ {
+ ScSetStringParam aParam;
+ aParam.mpNumFormatter = pFormatter;
+ aParam.mbDetectNumberFormat = true;
+ aParam.mbSetTextCellFormat = true;
+
+ if ( aValStr.Len() )
+ mpDoc->SetValue( nCol, nRow, nTab, fVal );
+ else if ( !pE->aSel.HasRange() )
+ {
+ // maybe ALT text of IMG or similar
+ mpDoc->SetString( nCol, nRow, nTab, pE->aAltText, &aParam );
+ // wenn SelRange komplett leer kann nachfolgender Text im gleichen Absatz liegen!
+ }
+ else
+ {
+ String aStr;
+ if( pE->bEntirePara )
+ {
+ aStr = mpEngine->GetText( pE->aSel.nStartPara );
+ }
+ else
+ {
+ aStr = mpEngine->GetText( pE->aSel );
+ aStr.EraseLeadingAndTrailingChars();
+ }
+
+ // TODO: RTF import should follow the language tag,
+ // currently this follows the HTML options for both, HTML
+ // and RTF.
+ bool bEnUsRecognized = false;
+ if (bNumbersEnglishUS)
+ {
+ pFormatter->ChangeIntl( LANGUAGE_ENGLISH_US);
+ sal_uInt32 nIndex = pFormatter->GetStandardIndex( LANGUAGE_ENGLISH_US);
+ double fEnVal = 0.0;
+ if (pFormatter->IsNumberFormat( aStr, nIndex, fEnVal))
+ {
+ bEnUsRecognized = true;
+ sal_uInt32 nNewIndex =
+ pFormatter->GetFormatForLanguageIfBuiltIn(
+ nIndex, LANGUAGE_SYSTEM);
+ DBG_ASSERT( nNewIndex != nIndex, "ScEEImport::WriteToDocument: NumbersEnglishUS not a built-in format?");
+ pFormatter->GetInputLineString( fEnVal, nNewIndex, aStr);
+ }
+ pFormatter->ChangeIntl( LANGUAGE_SYSTEM);
+ }
+
+ // #105460#, #i4180# String cells can't contain tabs or linebreaks
+ // -> replace with spaces
+ aStr.SearchAndReplaceAll( (sal_Unicode)'\t', (sal_Unicode)' ' );
+ aStr.SearchAndReplaceAll( (sal_Unicode)'\n', (sal_Unicode)' ' );
+
+ if (bNumbersEnglishUS && !bEnUsRecognized)
+ mpDoc->PutCell( nCol, nRow, nTab, new ScStringCell( aStr));
+ else
+ {
+ aParam.mbDetectNumberFormat = bConvertDate;
+ mpDoc->SetString( nCol, nRow, nTab, aStr, &aParam );
+ }
+ }
+ }
+ else
+ {
+ EditTextObject* pObject = mpEngine->CreateTextObject( pE->aSel );
+ mpDoc->PutCell( nCol, nRow, nTab, new ScEditCell( pObject,
+ mpDoc, mpEngine->GetEditTextObjectPool() ) );
+ delete pObject;
+ }
+ if ( pE->maImageList.size() )
+ bHasGraphics |= GraphicSize( nCol, nRow, nTab, pE );
+ if ( pE->pName )
+ { // Anchor Name => RangeName
+ if (!pRangeNames->findByName(*pE->pName))
+ {
+ ScRangeData* pData = new ScRangeData( mpDoc, *pE->pName,
+ ScAddress( nCol, nRow, nTab ) );
+ pRangeNames->insert( pData );
+ }
+ }
+ }
+ pProgress->SetStateOnPercent( ++nProgress );
+ }
+ if ( bSizeColsRows )
+ {
+ // Spaltenbreiten
+ Table* pColWidths = mpParser->GetColWidths();
+ if ( pColWidths->Count() )
+ {
+ nProgress = 0;
+ pProgress->SetState( nProgress, nEndCol - nStartCol + 1 );
+ for ( SCCOL nCol = nStartCol; nCol <= nEndCol; nCol++ )
+ {
+ sal_uInt16 nWidth = (sal_uInt16)(sal_uLong) pColWidths->Get( nCol );
+ if ( nWidth )
+ mpDoc->SetColWidth( nCol, nTab, nWidth );
+ pProgress->SetState( ++nProgress );
+ }
+ }
+ DELETEZ( pProgress ); // SetOptimalHeight hat seinen eigenen ProgressBar
+ // Zeilenhoehen anpassen, Basis 100% Zoom
+ Fraction aZoom( 1, 1 );
+ double nPPTX = ScGlobal::nScreenPPTX * (double) aZoom
+ / nOutputFactor; // Faktor ist Drucker zu Bildschirm
+ double nPPTY = ScGlobal::nScreenPPTY * (double) aZoom;
+ VirtualDevice aVirtDev;
+ mpDoc->SetOptimalHeight( 0, nEndRow, 0,
+ static_cast< sal_uInt16 >( ScGlobal::nLastRowHeightExtra ), &aVirtDev,
+ nPPTX, nPPTY, aZoom, aZoom, false );
+ if ( mpRowHeights->Count() )
+ {
+ for ( SCROW nRow = nStartRow; nRow <= nEndRow; nRow++ )
+ {
+ sal_uInt16 nHeight = (sal_uInt16)(sal_uLong) mpRowHeights->Get( nRow );
+ if ( nHeight > mpDoc->GetRowHeight( nRow, nTab ) )
+ mpDoc->SetRowHeight( nRow, nTab, nHeight );
+ }
+ }
+ }
+ if ( bHasGraphics )
+ {
+ // Grafiken einfuegen
+ for ( size_t i = 0, nListSize = mpParser->ListSize(); i < nListSize; ++i )
+ {
+ pE = mpParser->ListEntry( i );
+ if ( !pE->maImageList.empty() )
+ {
+ SCCOL nCol = pE->nCol;
+ SCROW nRow = pE->nRow;
+ if ( ValidCol(nCol) && ValidRow(nRow) )
+ InsertGraphic( nCol, nRow, nTab, pE );
+ }
+ }
+ }
+ if ( pProgress )
+ delete pProgress;
+}
+
+
+sal_Bool ScEEImport::GraphicSize( SCCOL nCol, SCROW nRow, SCTAB /*nTab*/, ScEEParseEntry* pE )
+{
+ if ( !pE->maImageList.size() )
+ return false;
+ sal_Bool bHasGraphics = false;
+ OutputDevice* pDefaultDev = Application::GetDefaultDevice();
+ long nWidth, nHeight;
+ nWidth = nHeight = 0;
+ sal_Char nDir = nHorizontal;
+ for ( sal_uInt32 i = 0; i < pE->maImageList.size() ; ++i )
+ {
+ ScHTMLImage* pI = &pE->maImageList[ i ];
+ if ( pI->pGraphic )
+ bHasGraphics = sal_True;
+ Size aSizePix = pI->aSize;
+ aSizePix.Width() += 2 * pI->aSpace.X();
+ aSizePix.Height() += 2 * pI->aSpace.Y();
+ Size aLogicSize = pDefaultDev->PixelToLogic( aSizePix, MapMode( MAP_TWIP ) );
+ if ( nDir & nHorizontal )
+ nWidth += aLogicSize.Width();
+ else if ( nWidth < aLogicSize.Width() )
+ nWidth = aLogicSize.Width();
+ if ( nDir & nVertical )
+ nHeight += aLogicSize.Height();
+ else if ( nHeight < aLogicSize.Height() )
+ nHeight = aLogicSize.Height();
+ nDir = pI->nDir;
+ }
+ // Spaltenbreiten
+ Table* pColWidths = mpParser->GetColWidths();
+ long nThisWidth = (long) pColWidths->Get( nCol );
+ long nColWidths = nThisWidth;
+ SCCOL nColSpanCol = nCol + pE->nColOverlap;
+ for ( SCCOL nC = nCol + 1; nC < nColSpanCol; nC++ )
+ {
+ nColWidths += (long) pColWidths->Get( nC );
+ }
+ if ( nWidth > nColWidths )
+ { // Differenz nur in der ersten Spalte eintragen
+ if ( nThisWidth )
+ pColWidths->Replace( nCol, (void*)(nWidth - nColWidths + nThisWidth) );
+ else
+ pColWidths->Insert( nCol, (void*)(nWidth - nColWidths) );
+ }
+ // Zeilenhoehen, Differenz auf alle betroffenen Zeilen verteilen
+ SCROW nRowSpan = pE->nRowOverlap;
+ nHeight /= nRowSpan;
+ if ( nHeight == 0 )
+ nHeight = 1; // fuer eindeutigen Vergleich
+ for ( SCROW nR = nRow; nR < nRow + nRowSpan; nR++ )
+ {
+ long nRowHeight = (long) mpRowHeights->Get( nR );
+ if ( nHeight > nRowHeight )
+ {
+ if ( nRowHeight )
+ mpRowHeights->Replace( nR, (void*)nHeight );
+ else
+ mpRowHeights->Insert( nR, (void*)nHeight );
+ }
+ }
+ return bHasGraphics;
+}
+
+
+void ScEEImport::InsertGraphic( SCCOL nCol, SCROW nRow, SCTAB nTab,
+ ScEEParseEntry* pE )
+{
+ if ( !pE->maImageList.size() )
+ return ;
+ ScDrawLayer* pModel = mpDoc->GetDrawLayer();
+ if (!pModel)
+ {
+ mpDoc->InitDrawLayer();
+ pModel = mpDoc->GetDrawLayer();
+ }
+ SdrPage* pPage = pModel->GetPage( static_cast<sal_uInt16>(nTab) );
+ OutputDevice* pDefaultDev = Application::GetDefaultDevice();
+
+ Point aCellInsertPos(
+ (long)((double) mpDoc->GetColOffset( nCol, nTab ) * HMM_PER_TWIPS),
+ (long)((double) mpDoc->GetRowOffset( nRow, nTab ) * HMM_PER_TWIPS) );
+
+ Point aInsertPos( aCellInsertPos );
+ Point aSpace;
+ Size aLogicSize;
+ sal_Char nDir = nHorizontal;
+ for ( sal_uInt32 i = 0; i < pE->maImageList.size(); ++i )
+ {
+ ScHTMLImage* pI = &pE->maImageList[ i ];
+ if ( nDir & nHorizontal )
+ { // horizontal
+ aInsertPos.X() += aLogicSize.Width();
+ aInsertPos.X() += aSpace.X();
+ aInsertPos.Y() = aCellInsertPos.Y();
+ }
+ else
+ { // vertikal
+ aInsertPos.X() = aCellInsertPos.X();
+ aInsertPos.Y() += aLogicSize.Height();
+ aInsertPos.Y() += aSpace.Y();
+ }
+ // Offset des Spacings drauf
+ aSpace = pDefaultDev->PixelToLogic( pI->aSpace, MapMode( MAP_100TH_MM ) );
+ aInsertPos += aSpace;
+
+ Size aSizePix = pI->aSize;
+ aLogicSize = pDefaultDev->PixelToLogic( aSizePix, MapMode( MAP_100TH_MM ) );
+ // Groesse begrenzen
+ ::ScLimitSizeOnDrawPage( aLogicSize, aInsertPos, pPage->GetSize() );
+
+ if ( pI->pGraphic )
+ {
+ Rectangle aRect ( aInsertPos, aLogicSize );
+ SdrGrafObj* pObj = new SdrGrafObj( *pI->pGraphic, aRect );
+ // calling SetGraphicLink here doesn't work
+ pObj->SetName( pI->aURL );
+
+ pPage->InsertObject( pObj );
+
+ // SetGraphicLink has to be used after inserting the object,
+ // otherwise an empty graphic is swapped in and the contact stuff crashes.
+ // See #i37444#.
+ pObj->SetGraphicLink( pI->aURL, pI->aFilterName );
+
+ pObj->SetLogicRect( aRect ); // erst nach InsertObject !!!
+ }
+ nDir = pI->nDir;
+ }
+}
+
+
+ScEEParser::ScEEParser( EditEngine* pEditP ) :
+ pEdit( pEditP ),
+ pPool( EditEngine::CreatePool() ),
+ pDocPool( new ScDocumentPool ),
+ pColWidths( new Table ),
+ nLastToken(0),
+ nColCnt(0),
+ nRowCnt(0),
+ nColMax(0),
+ nRowMax(0)
+{
+ // pPool wird spaeter bei RTFIMP_START dem SvxRTFParser untergejubelt
+ pPool->SetSecondaryPool( pDocPool );
+ pPool->FreezeIdRanges();
+ NewActEntry( NULL );
+}
+
+
+ScEEParser::~ScEEParser()
+{
+ delete pActEntry;
+ delete pColWidths;
+ if ( !maList.empty() ) maList.clear();
+
+ // Pool erst loeschen nachdem die Listen geloescht wurden
+ pPool->SetSecondaryPool( NULL );
+ SfxItemPool::Free(pDocPool);
+ SfxItemPool::Free(pPool);
+}
+
+
+void ScEEParser::NewActEntry( ScEEParseEntry* pE )
+{ // neuer freifliegender pActEntry
+ pActEntry = new ScEEParseEntry( pPool );
+ pActEntry->aSel.nStartPara = (pE ? pE->aSel.nEndPara + 1 : 0);
+ pActEntry->aSel.nStartPos = 0;
+}
+
+
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */