diff options
Diffstat (limited to 'sc/source/filter/xml/xmlcelli.cxx')
-rw-r--r-- | sc/source/filter/xml/xmlcelli.cxx | 1132 |
1 files changed, 0 insertions, 1132 deletions
diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx deleted file mode 100644 index ada421bd9..000000000 --- a/sc/source/filter/xml/xmlcelli.cxx +++ /dev/null @@ -1,1132 +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 "xmlcelli.hxx" -#include "xmlimprt.hxx" -#include "xmltabi.hxx" -#include "xmlstyli.hxx" -#include "xmlannoi.hxx" -#include "global.hxx" -#include "document.hxx" -#include "cellsuno.hxx" -#include "docuno.hxx" -#include "unonames.hxx" -#include "postit.hxx" -#include "sheetdata.hxx" - -#include "XMLTableShapeImportHelper.hxx" -#include "XMLTextPContext.hxx" -#include "XMLStylesImportHelper.hxx" - -#include "arealink.hxx" -#include <sfx2/linkmgr.hxx> -#include "convuno.hxx" -#include "XMLConverter.hxx" -#include "scerrors.hxx" -#include "editutil.hxx" -#include "cell.hxx" - -#include <xmloff/xmltkmap.hxx> -#include <xmloff/xmltoken.hxx> -#include <xmloff/nmspmap.hxx> -#include <xmloff/xmluconv.hxx> -#include <xmloff/families.hxx> -#include <xmloff/numehelp.hxx> -#include <xmloff/xmlnmspe.hxx> -#include <svl/zforlist.hxx> -#include <svx/svdocapt.hxx> -#include <editeng/outlobj.hxx> -#include <editeng/editobj.hxx> -#include <svx/unoapi.hxx> -#include <svl/languageoptions.hxx> - -#include <com/sun/star/frame/XModel.hpp> -#include <com/sun/star/text/XText.hpp> -#include <com/sun/star/sheet/XSpreadsheets.hpp> -#include <com/sun/star/sheet/XSpreadsheet.hpp> -#include <com/sun/star/sheet/XCellRangeAddressable.hpp> - -#include <com/sun/star/util/XMergeable.hpp> -#include <com/sun/star/sheet/XSheetCondition.hpp> -#include <com/sun/star/table/XCellRange.hpp> -#include <com/sun/star/table/CellAddress.hpp> -#include <com/sun/star/util/NumberFormat.hpp> -#include <com/sun/star/util/XNumberFormatsSupplier.hpp> -#include <com/sun/star/util/XNumberFormatTypes.hpp> -#include <com/sun/star/util/Date.hpp> -#include <com/sun/star/lang/Locale.hpp> -#include <com/sun/star/text/ControlCharacter.hpp> - -#include <rtl/ustrbuf.hxx> -#include <tools/date.hxx> -#include <i18npool/lang.h> -#include <comphelper/extract.hxx> - -#define SC_CURRENCYSYMBOL "CurrencySymbol" - -using namespace com::sun::star; -using namespace xmloff::token; - -using rtl::OUString; - -//------------------------------------------------------------------ - -ScXMLTableRowCellContext::ScXMLTableRowCellContext( ScXMLImport& rImport, - sal_uInt16 nPrfx, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList, - const sal_Bool bTempIsCovered, - const sal_Int32 nTempRepeatedRows ) : - SvXMLImportContext( rImport, nPrfx, rLName ), - pContentValidationName(NULL), - pDetectiveObjVec(NULL), - pCellRangeSource(NULL), - fValue(0.0), - nMergedRows(1), - nMergedCols(1), - nRepeatedRows(nTempRepeatedRows), - nCellsRepeated(1), - rXMLImport((ScXMLImport&)rImport), - eGrammar( formula::FormulaGrammar::GRAM_STORAGE_DEFAULT), - nCellType(util::NumberFormat::TEXT), - bIsMerged(false), - bIsMatrix(false), - bHasSubTable(false), - bIsCovered(bTempIsCovered), - bIsEmpty(sal_True), - bHasTextImport(false), - bIsFirstTextImport(false), - bSolarMutexLocked(false), - bFormulaTextResult(false) -{ - rXMLImport.SetRemoveLastChar(false); - rXMLImport.GetTables().AddColumn(bTempIsCovered); - const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; - rtl::OUString aLocalName; - rtl::OUString* pStyleName = NULL; - rtl::OUString* pCurrencySymbol = NULL; - const SvXMLTokenMap& rTokenMap = rImport.GetTableRowCellAttrTokenMap(); - for (sal_Int16 i = 0; i < nAttrCount; ++i) - { - sal_uInt16 nAttrPrefix = rImport.GetNamespaceMap().GetKeyByAttrName( - xAttrList->getNameByIndex(i), &aLocalName); - - const rtl::OUString& sValue = xAttrList->getValueByIndex(i); - sal_uInt16 nToken = rTokenMap.Get(nAttrPrefix, aLocalName); - switch (nToken) - { - case XML_TOK_TABLE_ROW_CELL_ATTR_STYLE_NAME: - pStyleName = new rtl::OUString(sValue); - break; - case XML_TOK_TABLE_ROW_CELL_ATTR_CONTENT_VALIDATION_NAME: - OSL_ENSURE(!pContentValidationName, "here should be only one Validation Name"); - pContentValidationName = new rtl::OUString(sValue); - break; - case XML_TOK_TABLE_ROW_CELL_ATTR_SPANNED_ROWS: - bIsMerged = sal_True; - nMergedRows = sValue.toInt32(); - break; - case XML_TOK_TABLE_ROW_CELL_ATTR_SPANNED_COLS: - bIsMerged = sal_True; - nMergedCols = sValue.toInt32(); - break; - case XML_TOK_TABLE_ROW_CELL_ATTR_SPANNED_MATRIX_COLS: - bIsMatrix = sal_True; - nMatrixCols = sValue.toInt32(); - break; - case XML_TOK_TABLE_ROW_CELL_ATTR_SPANNED_MATRIX_ROWS: - bIsMatrix = sal_True; - nMatrixRows = sValue.toInt32(); - break; - case XML_TOK_TABLE_ROW_CELL_ATTR_REPEATED: - nCellsRepeated = std::max( sValue.toInt32(), (sal_Int32) 1 ); - break; - case XML_TOK_TABLE_ROW_CELL_ATTR_VALUE_TYPE: - nCellType = GetScImport().GetCellType(sValue); - bIsEmpty = false; - break; - case XML_TOK_TABLE_ROW_CELL_ATTR_VALUE: - { - if (sValue.getLength()) - { - rXMLImport.GetMM100UnitConverter().convertDouble(fValue, sValue); - bIsEmpty = false; - } - } - break; - case XML_TOK_TABLE_ROW_CELL_ATTR_DATE_VALUE: - { - if (sValue.getLength() && rXMLImport.SetNullDateOnUnitConverter()) - { - rXMLImport.GetMM100UnitConverter().convertDateTime(fValue, sValue); - bIsEmpty = false; - } - } - break; - case XML_TOK_TABLE_ROW_CELL_ATTR_TIME_VALUE: - { - if (sValue.getLength()) - { - rXMLImport.GetMM100UnitConverter().convertTime(fValue, sValue); - bIsEmpty = false; - } - } - break; - case XML_TOK_TABLE_ROW_CELL_ATTR_STRING_VALUE: - { - if (sValue.getLength()) - { - OSL_ENSURE(!pOUTextValue, "here should be only one string value"); - pOUTextValue.reset(sValue); - bIsEmpty = false; - } - } - break; - case XML_TOK_TABLE_ROW_CELL_ATTR_BOOLEAN_VALUE: - { - if (sValue.getLength()) - { - if ( IsXMLToken(sValue, XML_TRUE) ) - fValue = 1.0; - else if ( IsXMLToken(sValue, XML_FALSE) ) - fValue = 0.0; - else - rXMLImport.GetMM100UnitConverter().convertDouble(fValue, sValue); - bIsEmpty = false; - } - } - break; - case XML_TOK_TABLE_ROW_CELL_ATTR_FORMULA: - { - if (sValue.getLength()) - { - OSL_ENSURE(!pOUFormula, "here should be only one formula"); - rtl::OUString aFormula, aFormulaNmsp; - rXMLImport.ExtractFormulaNamespaceGrammar( aFormula, aFormulaNmsp, eGrammar, sValue ); - pOUFormula.reset( FormulaWithNamespace( aFormula, aFormulaNmsp ) ); - } - } - break; - case XML_TOK_TABLE_ROW_CELL_ATTR_CURRENCY: - pCurrencySymbol = new rtl::OUString(sValue); - break; - default: - ; - } - } - if (pOUFormula) - { - if (nCellType == util::NumberFormat::TEXT) - bFormulaTextResult = sal_True; - nCellType = util::NumberFormat::UNDEFINED; - } - rXMLImport.GetStylesImportHelper()->SetAttributes(pStyleName, pCurrencySymbol, nCellType); -} - -ScXMLTableRowCellContext::~ScXMLTableRowCellContext() -{ - if (pContentValidationName) - delete pContentValidationName; - if (pDetectiveObjVec) - delete pDetectiveObjVec; - if (pCellRangeSource) - delete pCellRangeSource; -} - -void ScXMLTableRowCellContext::LockSolarMutex() -{ - if (!bSolarMutexLocked) - { - GetScImport().LockSolarMutex(); - bSolarMutexLocked = sal_True; - } -} - -void ScXMLTableRowCellContext::UnlockSolarMutex() -{ - if (bSolarMutexLocked) - { - GetScImport().UnlockSolarMutex(); - bSolarMutexLocked = false; - } -} - -void ScXMLTableRowCellContext::SetCursorOnTextImport(const rtl::OUString& rOUTempText) -{ - com::sun::star::table::CellAddress aCellPos = rXMLImport.GetTables().GetRealCellPos(); - if (CellExists(aCellPos)) - { - uno::Reference<table::XCellRange> xCellRange(rXMLImport.GetTables().GetCurrentXCellRange()); - if (xCellRange.is()) - { - xBaseCell.set(xCellRange->getCellByPosition(aCellPos.Column, aCellPos.Row)); - if (xBaseCell.is()) - { - xLockable.set(xBaseCell, uno::UNO_QUERY); - if (xLockable.is()) - xLockable->addActionLock(); - uno::Reference<text::XText> xText(xBaseCell, uno::UNO_QUERY); - if (xText.is()) - { - uno::Reference<text::XTextCursor> xTextCursor(xText->createTextCursor()); - if (xTextCursor.is()) - { - xTextCursor->setString(rOUTempText); - xTextCursor->gotoEnd(false); - rXMLImport.GetTextImport()->SetCursor(xTextCursor); - } - } - } - } - } - else - { - OSL_FAIL("this method should only be called for a existing cell"); - } -} - -SvXMLImportContext *ScXMLTableRowCellContext::CreateChildContext( sal_uInt16 nPrefix, - const ::rtl::OUString& rLName, - const ::com::sun::star::uno::Reference< - ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) -{ - SvXMLImportContext *pContext = 0; - - const SvXMLTokenMap& rTokenMap = rXMLImport.GetTableRowCellElemTokenMap(); - sal_Bool bTextP(false); - switch( rTokenMap.Get( nPrefix, rLName ) ) - { - case XML_TOK_TABLE_ROW_CELL_P: - { - bIsEmpty = false; - bTextP = sal_True; - com::sun::star::table::CellAddress aCellPos = rXMLImport.GetTables().GetRealCellPos(); - if (((nCellType == util::NumberFormat::TEXT) || bFormulaTextResult) && - !rXMLImport.GetTables().IsPartOfMatrix(aCellPos.Column, aCellPos.Row)) - { - if (!bHasTextImport) - { - bIsFirstTextImport = sal_True; - bHasTextImport = sal_True; - pContext = new ScXMLTextPContext(rXMLImport, nPrefix, rLName, xAttrList, this); - } - else - { - // com::sun::star::table::CellAddress aCellPos = rXMLImport.GetTables().GetRealCellPos(); - if (CellExists(aCellPos)) - { - if (bIsFirstTextImport && !rXMLImport.GetRemoveLastChar()) - { - if (pOUTextContent) - { - SetCursorOnTextImport(*pOUTextContent); - pOUTextContent.reset(); - } - else - SetCursorOnTextImport(rtl::OUString()); - rXMLImport.SetRemoveLastChar(sal_True); - uno::Reference < text::XTextCursor > xTextCursor(rXMLImport.GetTextImport()->GetCursor()); - if (xTextCursor.is()) - { - uno::Reference < text::XText > xText (xTextCursor->getText()); - uno::Reference < text::XTextRange > xTextRange (xTextCursor, uno::UNO_QUERY); - if (xText.is() && xTextRange.is()) - xText->insertControlCharacter(xTextRange, text::ControlCharacter::PARAGRAPH_BREAK, false); - } - } - pContext = rXMLImport.GetTextImport()->CreateTextChildContext( - rXMLImport, nPrefix, rLName, xAttrList); - bIsFirstTextImport = false; - } - } - } - } - break; - case XML_TOK_TABLE_ROW_CELL_TABLE: - { - const sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; - rtl::OUString aLocalName; - for( sal_Int16 i=0; i < nAttrCount; i++ ) - { - sal_uInt16 nAttrPrefix = rXMLImport.GetNamespaceMap().GetKeyByAttrName( - xAttrList->getNameByIndex( i ), &aLocalName ); - if ( nAttrPrefix == XML_NAMESPACE_TABLE - && IsXMLToken(aLocalName, XML_IS_SUB_TABLE)) - { - bHasSubTable = IsXMLToken(xAttrList->getValueByIndex( i ), XML_TRUE); - } - } - OSL_ENSURE(bHasSubTable, "it should be a subtable"); - pContext = new ScXMLTableContext( rXMLImport , nPrefix, - rLName, xAttrList, - sal_True, nMergedCols); - nMergedCols = 1; - bIsMerged = false; - } - break; - case XML_TOK_TABLE_ROW_CELL_ANNOTATION: - { - bIsEmpty = false; - OSL_ENSURE( !mxAnnotationData.get(), "ScXMLTableRowCellContext::CreateChildContext - multiple annotations in one cell" ); - mxAnnotationData.reset( new ScXMLAnnotationData ); - pContext = new ScXMLAnnotationContext( rXMLImport, nPrefix, rLName, - xAttrList, *mxAnnotationData, this); - } - break; - case XML_TOK_TABLE_ROW_CELL_DETECTIVE: - { - bIsEmpty = false; - if (!pDetectiveObjVec) - pDetectiveObjVec = new ScMyImpDetectiveObjVec(); - pContext = new ScXMLDetectiveContext( - rXMLImport, nPrefix, rLName, pDetectiveObjVec ); - } - break; - case XML_TOK_TABLE_ROW_CELL_CELL_RANGE_SOURCE: - { - bIsEmpty = false; - if (!pCellRangeSource) - pCellRangeSource = new ScMyImpCellRangeSource(); - pContext = new ScXMLCellRangeSourceContext( - rXMLImport, nPrefix, rLName, xAttrList, pCellRangeSource ); - } - break; - } - - if (!pContext && !bTextP) - { - com::sun::star::table::CellAddress aCellPos = rXMLImport.GetTables().GetRealCellPos(); - uno::Reference<drawing::XShapes> xShapes (rXMLImport.GetTables().GetCurrentXShapes()); - if (xShapes.is()) - { - if (aCellPos.Column > MAXCOL) - aCellPos.Column = MAXCOL; - if (aCellPos.Row > MAXROW) - aCellPos.Row = MAXROW; - XMLTableShapeImportHelper* pTableShapeImport = (XMLTableShapeImportHelper*)rXMLImport.GetShapeImport().get(); - pTableShapeImport->SetOnTable(false); - pTableShapeImport->SetCell(aCellPos); - pContext = rXMLImport.GetShapeImport()->CreateGroupChildContext( - rXMLImport, nPrefix, rLName, xAttrList, xShapes); - if (pContext) - { - bIsEmpty = false; - rXMLImport.ProgressBarIncrement(false); - } - } - } - - if( !pContext ) - pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); - - return pContext; -} - -sal_Bool ScXMLTableRowCellContext::IsMerged (const uno::Reference <table::XCellRange>& xCellRange, const sal_Int32 nCol, const sal_Int32 nRow, - table::CellRangeAddress& aCellAddress) const -{ - table::CellAddress aCell; // don't need to set the sheet, because every sheet can contain the same count of cells. - aCell.Column = nCol; - aCell.Row = nRow; - if (CellExists(aCell)) - { - uno::Reference<sheet::XSheetCellRange> xMergeSheetCellRange (xCellRange->getCellRangeByPosition(nCol,nRow,nCol,nRow), uno::UNO_QUERY); - uno::Reference<sheet::XSpreadsheet> xTable (xMergeSheetCellRange->getSpreadsheet()); - uno::Reference<sheet::XSheetCellCursor> xMergeSheetCursor (xTable->createCursorByRange(xMergeSheetCellRange)); - if (xMergeSheetCursor.is()) - { - xMergeSheetCursor->collapseToMergedArea(); - uno::Reference<sheet::XCellRangeAddressable> xMergeCellAddress (xMergeSheetCursor, uno::UNO_QUERY); - if (xMergeCellAddress.is()) - { - aCellAddress = xMergeCellAddress->getRangeAddress(); - if (aCellAddress.StartColumn == nCol && aCellAddress.EndColumn == nCol && - aCellAddress.StartRow == nRow && aCellAddress.EndRow == nRow) - return false; - else - return sal_True; - } - } - } - return false; -} - -void ScXMLTableRowCellContext::DoMerge(const com::sun::star::table::CellAddress& aCellPos, - const sal_Int32 nCols, const sal_Int32 nRows) -{ - if (CellExists(aCellPos)) - { - uno::Reference<table::XCellRange> xCellRange(rXMLImport.GetTables().GetCurrentXCellRange()); - if ( xCellRange.is() ) - { - // Stored merge range may actually be of a larger extend than what - // we support, in which case getCellRangeByPosition() throws - // IndexOutOfBoundsException. Do nothing then. - try - { - table::CellRangeAddress aCellAddress; - if (IsMerged(xCellRange, aCellPos.Column, aCellPos.Row, aCellAddress)) - { - //unmerge - uno::Reference <util::XMergeable> xMergeable (xCellRange->getCellRangeByPosition(aCellAddress.StartColumn, aCellAddress.StartRow, - aCellAddress.EndColumn, aCellAddress.EndRow), uno::UNO_QUERY); - if (xMergeable.is()) - xMergeable->merge(false); - } - - //merge - uno::Reference <util::XMergeable> xMergeable (xCellRange->getCellRangeByPosition(aCellAddress.StartColumn, aCellAddress.StartRow, - aCellAddress.EndColumn + nCols, aCellAddress.EndRow + nRows), uno::UNO_QUERY); - if (xMergeable.is()) - xMergeable->merge(sal_True); - } - catch ( lang::IndexOutOfBoundsException & ) - { - OSL_FAIL("ScXMLTableRowCellContext::DoMerge: range to be merged larger than what we support"); - } - } - } -} - -void ScXMLTableRowCellContext::SetContentValidation(com::sun::star::uno::Reference<com::sun::star::beans::XPropertySet>& xPropSet) -{ - if (pContentValidationName) - { - ScMyImportValidation aValidation; - aValidation.eGrammar1 = aValidation.eGrammar2 = GetScImport().GetDocument()->GetStorageGrammar(); - if (rXMLImport.GetValidation(*pContentValidationName, aValidation)) - { - uno::Reference<beans::XPropertySet> xPropertySet(xPropSet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_VALIXML))), uno::UNO_QUERY); - if (xPropertySet.is()) - { - if (aValidation.sErrorMessage.getLength()) - xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ERRMESS)), uno::makeAny(aValidation.sErrorMessage)); - if (aValidation.sErrorTitle.getLength()) - xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ERRTITLE)), uno::makeAny(aValidation.sErrorTitle)); - if (aValidation.sImputMessage.getLength()) - xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_INPMESS)), uno::makeAny(aValidation.sImputMessage)); - if (aValidation.sImputTitle.getLength()) - xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_INPTITLE)), uno::makeAny(aValidation.sImputTitle)); - xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_SHOWERR)), uno::makeAny(aValidation.bShowErrorMessage)); - xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_SHOWINP)), uno::makeAny(aValidation.bShowImputMessage)); - xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_TYPE)), uno::makeAny(aValidation.aValidationType)); - xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_IGNOREBL)), uno::makeAny(aValidation.bIgnoreBlanks)); - xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_SHOWLIST)), uno::makeAny(aValidation.nShowList)); - xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ERRALSTY)), uno::makeAny(aValidation.aAlertStyle)); - uno::Reference<sheet::XSheetCondition> xCondition(xPropertySet, uno::UNO_QUERY); - if (xCondition.is()) - { - xCondition->setFormula1(aValidation.sFormula1); - xCondition->setFormula2(aValidation.sFormula2); - xCondition->setOperator(aValidation.aOperator); - // source position must be set as string, because it may - // refer to a sheet that hasn't been loaded yet. - xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_SOURCESTR)), uno::makeAny(aValidation.sBaseCellAddress)); - // Transport grammar and formula namespace - xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_FORMULANMSP1)), uno::makeAny(aValidation.sFormulaNmsp1)); - xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_FORMULANMSP2)), uno::makeAny(aValidation.sFormulaNmsp2)); - xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_GRAMMAR1)), uno::makeAny(static_cast<sal_Int32>(aValidation.eGrammar1))); - xPropertySet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_GRAMMAR2)), uno::makeAny(static_cast<sal_Int32>(aValidation.eGrammar2))); - } - } - xPropSet->setPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_VALIXML)), uno::makeAny(xPropertySet)); - - // For now, any sheet with validity is blocked from stream-copying. - // Later, the validation names could be stored along with the style names. - ScSheetSaveData* pSheetData = ScModelObj::getImplementation(GetImport().GetModel())->GetSheetSaveData(); - pSheetData->BlockSheet( GetScImport().GetTables().GetCurrentSheet() ); - } - } -} - -void ScXMLTableRowCellContext::SetCellProperties(const uno::Reference<table::XCellRange>& xCellRange, - const table::CellAddress& aCellAddress) -{ - if (CellExists(aCellAddress) && pContentValidationName && pContentValidationName->getLength()) - { - sal_Int32 nBottom = aCellAddress.Row + nRepeatedRows - 1; - sal_Int32 nRight = aCellAddress.Column + nCellsRepeated - 1; - if (nBottom > MAXROW) - nBottom = MAXROW; - if (nRight > MAXCOL) - nRight = MAXCOL; - uno::Reference <beans::XPropertySet> xProperties (xCellRange->getCellRangeByPosition(aCellAddress.Column, aCellAddress.Row, - nRight, nBottom), uno::UNO_QUERY); - if (xProperties.is()) - SetContentValidation(xProperties); - } -} - -void ScXMLTableRowCellContext::SetCellProperties(const uno::Reference<table::XCell>& xCell) -{ - if (pContentValidationName && pContentValidationName->getLength()) - { - uno::Reference <beans::XPropertySet> xProperties (xCell, uno::UNO_QUERY); - if (xProperties.is()) - SetContentValidation(xProperties); - } -} - -void ScXMLTableRowCellContext::SetAnnotation(const table::CellAddress& aCellAddress) -{ - ScDocument* pDoc = rXMLImport.GetDocument(); - if( !pDoc || !mxAnnotationData.get() ) - return; - - LockSolarMutex(); - - ScAddress aPos; - ScUnoConversion::FillScAddress( aPos, aCellAddress ); - ScPostIt* pNote = 0; - - uno::Reference< drawing::XShapes > xShapes = rXMLImport.GetTables().GetCurrentXShapes(); - uno::Reference< container::XIndexAccess > xShapesIA( xShapes, uno::UNO_QUERY ); - sal_Int32 nOldShapeCount = xShapesIA.is() ? xShapesIA->getCount() : 0; - - OSL_ENSURE( !mxAnnotationData->mxShape.is() || mxAnnotationData->mxShapes.is(), - "ScXMLTableRowCellContext::SetAnnotation - shape without drawing page" ); - if( mxAnnotationData->mxShape.is() && mxAnnotationData->mxShapes.is() ) - { - OSL_ENSURE( mxAnnotationData->mxShapes.get() == xShapes.get(), "ScXMLTableRowCellContext::SetAnnotation - diffenet drawing pages" ); - SdrObject* pObject = ::GetSdrObjectFromXShape( mxAnnotationData->mxShape ); - OSL_ENSURE( pObject, "ScXMLTableRowCellContext::SetAnnotation - cannot get SdrObject from shape" ); - - /* Try to reuse the drawing object already created (but only if the - note is visible, and the object is a caption object). */ - if( mxAnnotationData->mbShown && mxAnnotationData->mbUseShapePos ) - { - if( SdrCaptionObj* pCaption = dynamic_cast< SdrCaptionObj* >( pObject ) ) - { - OSL_ENSURE( !pCaption->GetLogicRect().IsEmpty(), "ScXMLTableRowCellContext::SetAnnotation - invalid caption rectangle" ); - // create the cell note with the caption object - pNote = ScNoteUtil::CreateNoteFromCaption( *pDoc, aPos, *pCaption, true ); - // forget pointer to object (do not create note again below) - pObject = 0; - } - } - - // drawing object has not been used to create a note -> use shape data - if( pObject ) - { - // rescue settings from drawing object before the shape is removed - ::std::auto_ptr< SfxItemSet > xItemSet( new SfxItemSet( pObject->GetMergedItemSet() ) ); - ::std::auto_ptr< OutlinerParaObject > xOutlinerObj; - if( OutlinerParaObject* pOutlinerObj = pObject->GetOutlinerParaObject() ) - xOutlinerObj.reset( new OutlinerParaObject( *pOutlinerObj ) ); - Rectangle aCaptionRect; - if( mxAnnotationData->mbUseShapePos ) - aCaptionRect = pObject->GetLogicRect(); - // remove the shape from the drawing page, this invalidates pObject - mxAnnotationData->mxShapes->remove( mxAnnotationData->mxShape ); - pObject = 0; - // update current number of existing objects - if( xShapesIA.is() ) - nOldShapeCount = xShapesIA->getCount(); - - // an outliner object is required (empty note captions not allowed) - if( xOutlinerObj.get() ) - { - // create cell note with all data from drawing object - pNote = ScNoteUtil::CreateNoteFromObjectData( *pDoc, aPos, - xItemSet.release(), xOutlinerObj.release(), - aCaptionRect, mxAnnotationData->mbShown, false ); - } - } - } - else if( mxAnnotationData->maSimpleText.getLength() > 0 ) - { - // create note from simple text - pNote = ScNoteUtil::CreateNoteFromString( *pDoc, aPos, - mxAnnotationData->maSimpleText, mxAnnotationData->mbShown, false ); - } - - // set author and date - if( pNote ) - { - double fDate; - rXMLImport.GetMM100UnitConverter().convertDateTime( fDate, mxAnnotationData->maCreateDate ); - SvNumberFormatter* pNumForm = pDoc->GetFormatTable(); - sal_uInt32 nfIndex = pNumForm->GetFormatIndex( NF_DATE_SYS_DDMMYYYY, LANGUAGE_SYSTEM ); - String aDate; - Color* pColor = 0; - Color** ppColor = &pColor; - pNumForm->GetOutputString( fDate, nfIndex, aDate, ppColor ); - pNote->SetDate( aDate ); - pNote->SetAuthor( mxAnnotationData->maAuthor ); - } - - // register a shape that has been newly created in the ScNoteUtil functions - if( xShapesIA.is() && (nOldShapeCount < xShapesIA->getCount()) ) - { - uno::Reference< drawing::XShape > xShape; - rXMLImport.GetShapeImport()->shapeWithZIndexAdded( xShape, xShapesIA->getCount() ); - } - - // store the style names for stream copying - ScSheetSaveData* pSheetData = ScModelObj::getImplementation(rXMLImport.GetModel())->GetSheetSaveData(); - pSheetData->HandleNoteStyles( mxAnnotationData->maStyleName, mxAnnotationData->maTextStyle, aPos ); - - std::vector<ScXMLAnnotationStyleEntry>::const_iterator aIter = mxAnnotationData->maContentStyles.begin(); - std::vector<ScXMLAnnotationStyleEntry>::const_iterator aEnd = mxAnnotationData->maContentStyles.end(); - while (aIter != aEnd) - { - pSheetData->AddNoteContentStyle( aIter->mnFamily, aIter->maName, aPos, aIter->maSelection ); - ++aIter; - } -} - -// core implementation -void ScXMLTableRowCellContext::SetDetectiveObj( const table::CellAddress& rPosition ) -{ - if( CellExists(rPosition) && pDetectiveObjVec && pDetectiveObjVec->size() ) - { - LockSolarMutex(); - ScDetectiveFunc aDetFunc( rXMLImport.GetDocument(), rPosition.Sheet ); - uno::Reference<container::XIndexAccess> xShapesIndex (rXMLImport.GetTables().GetCurrentXShapes(), uno::UNO_QUERY); // make draw page - ScMyImpDetectiveObjVec::iterator aItr(pDetectiveObjVec->begin()); - ScMyImpDetectiveObjVec::iterator aEndItr(pDetectiveObjVec->end()); - while(aItr != aEndItr) - { - ScAddress aScAddress; - ScUnoConversion::FillScAddress( aScAddress, rPosition ); - aDetFunc.InsertObject( aItr->eObjType, aScAddress, aItr->aSourceRange, aItr->bHasError ); - if (xShapesIndex.is()) - { - sal_Int32 nShapes = xShapesIndex->getCount(); - uno::Reference < drawing::XShape > xShape; - rXMLImport.GetShapeImport()->shapeWithZIndexAdded(xShape, nShapes); - } - ++aItr; - } - } -} - -// core implementation -void ScXMLTableRowCellContext::SetCellRangeSource( const table::CellAddress& rPosition ) -{ - if( CellExists(rPosition) && pCellRangeSource && pCellRangeSource->sSourceStr.getLength() && - pCellRangeSource->sFilterName.getLength() && pCellRangeSource->sURL.getLength() ) - { - ScDocument* pDoc = rXMLImport.GetDocument(); - if (pDoc) - { - LockSolarMutex(); - ScRange aDestRange( static_cast<SCCOL>(rPosition.Column), static_cast<SCROW>(rPosition.Row), rPosition.Sheet, - static_cast<SCCOL>(rPosition.Column + pCellRangeSource->nColumns - 1), - static_cast<SCROW>(rPosition.Row + pCellRangeSource->nRows - 1), rPosition.Sheet ); - String sFilterName( pCellRangeSource->sFilterName ); - String sSourceStr( pCellRangeSource->sSourceStr ); - ScAreaLink* pLink = new ScAreaLink( pDoc->GetDocumentShell(), pCellRangeSource->sURL, - sFilterName, pCellRangeSource->sFilterOptions, sSourceStr, aDestRange, pCellRangeSource->nRefresh ); - sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager(); - pLinkManager->InsertFileLink( *pLink, OBJECT_CLIENT_FILE, pCellRangeSource->sURL, &sFilterName, &sSourceStr ); - } - } -} - -bool lcl_IsEmptyOrNote( ScDocument* pDoc, const table::CellAddress& rCurrentPos ) -{ - ScAddress aScAddress; - ScUnoConversion::FillScAddress( aScAddress, rCurrentPos ); - ScBaseCell* pCell = pDoc->GetCell( aScAddress ); - return ( !pCell || pCell->GetCellType() == CELLTYPE_NOTE ); -} - -void ScXMLTableRowCellContext::EndElement() -{ - if (!bHasSubTable) - { - if (bHasTextImport && rXMLImport.GetRemoveLastChar()) - { - if (rXMLImport.GetTextImport()->GetCursor().is()) - { - //GetImport().GetTextImport()->GetCursor()->gotoEnd(sal_False); - if( GetImport().GetTextImport()->GetCursor()->goLeft( 1, sal_True ) ) - { - GetImport().GetTextImport()->GetText()->insertString( - GetImport().GetTextImport()->GetCursorAsRange(), rtl::OUString(), - sal_True ); - } - rXMLImport.GetTextImport()->ResetCursor(); - } - } - table::CellAddress aCellPos = rXMLImport.GetTables().GetRealCellPos(); - if (aCellPos.Column > 0 && nRepeatedRows > 1) - aCellPos.Row -= (nRepeatedRows - 1); - uno::Reference<table::XCellRange> xCellRange(rXMLImport.GetTables().GetCurrentXCellRange()); - if (xCellRange.is()) - { - if (bIsMerged) - DoMerge(aCellPos, nMergedCols - 1, nMergedRows - 1); - if ( !pOUFormula ) - { - ::boost::optional< rtl::OUString > pOUText; - - if(nCellType == util::NumberFormat::TEXT) - { - if (xLockable.is()) - xLockable->removeActionLock(); - - // #i61702# The formatted text content of xBaseCell / xLockable is invalidated, - // so it can't be used after calling removeActionLock (getString always uses the document). - - if (CellExists(aCellPos) && ((nCellsRepeated > 1) || (nRepeatedRows > 1))) - { - if (!xBaseCell.is()) - { - try - { - xBaseCell.set(xCellRange->getCellByPosition(aCellPos.Column, aCellPos.Row)); - } - catch (lang::IndexOutOfBoundsException&) - { - OSL_FAIL("It seems here are to many columns or rows"); - } - } - uno::Reference <text::XText> xTempText (xBaseCell, uno::UNO_QUERY); - if (xTempText.is()) - { - pOUText.reset(xTempText->getString()); - } - } - if ( (!pOUTextContent && !pOUText && !pOUTextValue) - && ( (pOUTextContent && !pOUTextContent->getLength()) || !pOUTextContent ) - && ( (pOUText && !pOUText->getLength()) || !pOUText ) - && ( (pOUTextValue && !pOUTextValue->getLength()) || !pOUTextValue )) - bIsEmpty = sal_True; - } - sal_Bool bWasEmpty = bIsEmpty; -// uno::Reference <table::XCell> xCell; - table::CellAddress aCurrentPos( aCellPos ); - if ((pContentValidationName && pContentValidationName->getLength()) || - mxAnnotationData.get() || pDetectiveObjVec || pCellRangeSource) - bIsEmpty = false; - - ScMyTables& rTables = rXMLImport.GetTables(); - for (sal_Int32 i = 0; i < nCellsRepeated; ++i) - { - aCurrentPos.Column = aCellPos.Column + i; - if (i > 0) - rTables.AddColumn(false); - if (!bIsEmpty) - { - for (sal_Int32 j = 0; j < nRepeatedRows; ++j) - { - aCurrentPos.Row = aCellPos.Row + j; - if ((aCurrentPos.Column == 0) && (j > 0)) - { - rTables.AddRow(); - rTables.AddColumn(false); - } - if (CellExists(aCurrentPos)) - { - // test - bypass the API - // if (xBaseCell.is() && (aCurrentPos == aCellPos)) - // xCell.set(xBaseCell); - // else - // { - // try - // { - // xCell.set(xCellRange->getCellByPosition(aCurrentPos.Column, aCurrentPos.Row)); - // } - // catch (lang::IndexOutOfBoundsException&) - // { - // OSL_FAIL("It seems here are to many columns or rows"); - // } - // } - - // test - bypass the API - // if ((!(bIsCovered) || (xCell->getType() == table::CellContentType_EMPTY))) - if ((!(bIsCovered) || lcl_IsEmptyOrNote( rXMLImport.GetDocument(), aCurrentPos ))) - { - switch (nCellType) - { - case util::NumberFormat::TEXT: - { - sal_Bool bDoIncrement = sal_True; - if (rTables.IsPartOfMatrix(aCurrentPos.Column, aCurrentPos.Row)) - { - LockSolarMutex(); - // test - bypass the API - // ScCellObj* pCellObj = (ScCellObj*)ScCellRangesBase::getImplementation(xCell); - // if (pCellObj) - // { - // if(pOUTextValue && pOUTextValue->getLength()) - // pCellObj->SetFormulaResultString(*pOUTextValue); - // else if (pOUTextContent && pOUTextContent->getLength()) - // pCellObj->SetFormulaResultString(*pOUTextContent); - // else if ( i > 0 && pOUText && pOUText->getLength() ) - // { - // pCellObj->SetFormulaResultString(*pOUText); - // } - // else - // bDoIncrement = sal_False; - // } - // else - // bDoIncrement = sal_False; - ScAddress aScAddress; - ScUnoConversion::FillScAddress( aScAddress, aCurrentPos ); - ScBaseCell* pCell = rXMLImport.GetDocument()->GetCell( aScAddress ); - bDoIncrement = ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA ); - if ( bDoIncrement ) - { - ScFormulaCell* pFCell = static_cast<ScFormulaCell*>(pCell); - if (pOUTextValue && pOUTextValue->getLength()) - pFCell->SetHybridString( *pOUTextValue ); - else if (pOUTextContent && pOUTextContent->getLength()) - pFCell->SetHybridString( *pOUTextContent ); - else if ( i > 0 && pOUText && pOUText->getLength() ) - pFCell->SetHybridString( *pOUText ); - else - bDoIncrement = false; - } - } - else - { - // test - bypass the API - // uno::Reference <text::XText> xText (xCell, uno::UNO_QUERY); - // if (xText.is()) - // { - // if(pOUTextValue && pOUTextValue->getLength()) - // xText->setString(*pOUTextValue); - // else if (pOUTextContent && pOUTextContent->getLength()) - // xText->setString(*pOUTextContent); - // else if ( i > 0 && pOUText && pOUText->getLength() ) - // { - // xText->setString(*pOUText); - // } - // else - // bDoIncrement = sal_False; - // } - LockSolarMutex(); - ScBaseCell* pNewCell = NULL; - ScDocument* pDoc = rXMLImport.GetDocument(); - if (pOUTextValue && pOUTextValue->getLength()) - pNewCell = ScBaseCell::CreateTextCell( *pOUTextValue, pDoc ); - else if (pOUTextContent && pOUTextContent->getLength()) - pNewCell = ScBaseCell::CreateTextCell( *pOUTextContent, pDoc ); - else if ( i > 0 && pOUText && pOUText->getLength() ) - pNewCell = ScBaseCell::CreateTextCell( *pOUText, pDoc ); - - bDoIncrement = pNewCell != NULL; - if ( bDoIncrement ) - { - ScAddress aScAddress; - ScUnoConversion::FillScAddress( aScAddress, aCurrentPos ); - pDoc->PutCell( aScAddress, pNewCell ); - } - } - // #i56027# This is about setting simple text, not edit cells, - // so ProgressBarIncrement must be called with bEditCell = FALSE. - // Formatted text that is put into the cell by the child context - // is handled below (bIsEmpty is sal_True then). - if (bDoIncrement || bHasTextImport) - rXMLImport.ProgressBarIncrement(false); - } - break; - case util::NumberFormat::NUMBER: - case util::NumberFormat::PERCENT: - case util::NumberFormat::CURRENCY: - case util::NumberFormat::TIME: - case util::NumberFormat::DATETIME: - case util::NumberFormat::LOGICAL: - { - if (rTables.IsPartOfMatrix(aCurrentPos.Column, aCurrentPos.Row)) - { - LockSolarMutex(); - // test - bypass the API - // ScCellObj* pCellObj = (ScCellObj*)ScCellRangesBase::getImplementation(xCell); - // if (pCellObj) - // pCellObj->SetFormulaResultDouble(fValue); - ScAddress aScAddress; - ScUnoConversion::FillScAddress( aScAddress, aCurrentPos ); - ScBaseCell* pCell = rXMLImport.GetDocument()->GetCell( aScAddress ); - if ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA ) - static_cast<ScFormulaCell*>(pCell)->SetHybridDouble( fValue ); - } - else - { - // test - bypass the API - // xCell->setValue(fValue); - LockSolarMutex(); - - // #i62435# Initialize the value cell's script type - // if the default style's number format is latin-only. - // If the cell uses a different format, the script type - // will be reset when the style is applied. - - ScBaseCell* pNewCell = new ScValueCell(fValue); - if ( rXMLImport.IsLatinDefaultStyle() ) - pNewCell->SetScriptType( SCRIPTTYPE_LATIN ); - rXMLImport.GetDocument()->PutCell( - sal::static_int_cast<SCCOL>( aCurrentPos.Column ), - sal::static_int_cast<SCROW>( aCurrentPos.Row ), - sal::static_int_cast<SCTAB>( aCurrentPos.Sheet ), - pNewCell ); - } - rXMLImport.ProgressBarIncrement(false); - } - break; - default: - { - OSL_FAIL("no cell type given"); - } - break; - } - } - - SetAnnotation(aCurrentPos); - SetDetectiveObj( aCurrentPos ); - SetCellRangeSource( aCurrentPos ); - } - else - { - if (!bWasEmpty || mxAnnotationData.get()) - { - if (aCurrentPos.Row > MAXROW) - rXMLImport.SetRangeOverflowType(SCWARN_IMPORT_ROW_OVERFLOW); - else - rXMLImport.SetRangeOverflowType(SCWARN_IMPORT_COLUMN_OVERFLOW); - } - } - } - } - else - { - // #i56027# If the child context put formatted text into the cell, - // bIsEmpty is sal_True and ProgressBarIncrement has to be called - // with bEditCell = TRUE. - if (bHasTextImport) - rXMLImport.ProgressBarIncrement(sal_True); - if ((i == 0) && (aCellPos.Column == 0)) - for (sal_Int32 j = 1; j < nRepeatedRows; ++j) - { - rTables.AddRow(); - rTables.AddColumn(false); - } - } - } - if (nCellsRepeated > 1 || nRepeatedRows > 1) - { - SetCellProperties(xCellRange, aCellPos); // set now only the validation for the complete range with the given cell as start cell - //SetType(xCellRange, aCellPos); - SCCOL nStartCol(aCellPos.Column < MAXCOL ? static_cast<SCCOL>(aCellPos.Column) : MAXCOL); - SCROW nStartRow(aCellPos.Row < MAXROW ? static_cast<SCROW>(aCellPos.Row) : MAXROW); - SCCOL nEndCol(aCellPos.Column + nCellsRepeated - 1 < MAXCOL ? static_cast<SCCOL>(aCellPos.Column + nCellsRepeated - 1) : MAXCOL); - SCROW nEndRow(aCellPos.Row + nRepeatedRows - 1 < MAXROW ? static_cast<SCROW>(aCellPos.Row + nRepeatedRows - 1) : MAXROW); - ScRange aScRange( nStartCol, nStartRow, aCellPos.Sheet, - nEndCol, nEndRow, aCellPos.Sheet ); - rXMLImport.GetStylesImportHelper()->AddRange(aScRange); - } - else if (CellExists(aCellPos)) - { - rXMLImport.GetStylesImportHelper()->AddCell(aCellPos); - - // test - bypass the API - // SetCellProperties(xCell); // set now only the validation - SetCellProperties(xCellRange, aCellPos); - - //SetType(xTempCell); - } - } - else // if ( !pOUFormula ) - { - if (CellExists(aCellPos)) - { - uno::Reference <table::XCell> xCell; - try - { - xCell.set(xCellRange->getCellByPosition(aCellPos.Column , aCellPos.Row)); - } - catch (lang::IndexOutOfBoundsException&) - { - OSL_FAIL("It seems here are to many columns or rows"); - } - if (xCell.is()) - { - SetCellProperties(xCell); // set now only the validation - OSL_ENSURE(((nCellsRepeated == 1) && (nRepeatedRows == 1)), "repeated cells with formula not possible now"); - rXMLImport.GetStylesImportHelper()->AddCell(aCellPos); - if (!bIsMatrix) - { - LockSolarMutex(); - ScCellObj* pCellObj = - static_cast<ScCellObj*>(ScCellRangesBase::getImplementation( - xCell)); - if (pCellObj) - { - pCellObj->SetFormulaWithGrammar( pOUFormula->first, pOUFormula->second, eGrammar); - if (bFormulaTextResult && pOUTextValue && pOUTextValue->getLength()) - pCellObj->SetFormulaResultString( *pOUTextValue); - else - pCellObj->SetFormulaResultDouble( fValue); - } - } - else - { - if (nMatrixCols > 0 && nMatrixRows > 0) - { - rXMLImport.GetTables().AddMatrixRange( - aCellPos.Column, aCellPos.Row, - aCellPos.Column + nMatrixCols - 1, - aCellPos.Row + nMatrixRows - 1, - pOUFormula->first, pOUFormula->second, eGrammar); - } - } - SetAnnotation( aCellPos ); - SetDetectiveObj( aCellPos ); - SetCellRangeSource( aCellPos ); - rXMLImport.ProgressBarIncrement(false); - } - } - else - { - if (aCellPos.Row > MAXROW) - rXMLImport.SetRangeOverflowType(SCWARN_IMPORT_ROW_OVERFLOW); - else - rXMLImport.SetRangeOverflowType(SCWARN_IMPORT_COLUMN_OVERFLOW); - } - - } // if ( !pOUFormula ) - } - UnlockSolarMutex(); - } - bIsMerged = false; - bHasSubTable = false; - nMergedCols = 1; - nMergedRows = 1; - nCellsRepeated = 1; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |