diff options
Diffstat (limited to 'binfilter/bf_sc/source/filter/xml/sc_xmltabi.cxx')
-rw-r--r-- | binfilter/bf_sc/source/filter/xml/sc_xmltabi.cxx | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/binfilter/bf_sc/source/filter/xml/sc_xmltabi.cxx b/binfilter/bf_sc/source/filter/xml/sc_xmltabi.cxx new file mode 100644 index 000000000000..dfb3878b3533 --- /dev/null +++ b/binfilter/bf_sc/source/filter/xml/sc_xmltabi.cxx @@ -0,0 +1,268 @@ +/* -*- 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. + * + ************************************************************************/ + +#ifdef _MSC_VER +#pragma hdrstop +#endif + +// INCLUDE --------------------------------------------------------------- + +#include "xmltabi.hxx" +#include "xmlimprt.hxx" +#include "xmlrowi.hxx" +#include "xmlcoli.hxx" +#include "xmlsceni.hxx" +#include "document.hxx" +#include "olinetab.hxx" + +#include "XMLConverter.hxx" +#include "XMLTableShapesContext.hxx" +#include "XMLTableSourceContext.hxx" +#include "XMLStylesImportHelper.hxx" + +#include <bf_xmloff/nmspmap.hxx> + +#include <com/sun/star/sheet/XPrintAreas.hpp> +namespace binfilter { + +using namespace ::com::sun::star; +using namespace xmloff::token; + +//------------------------------------------------------------------ + +ScXMLTableContext::ScXMLTableContext( ScXMLImport& rImport, + USHORT nPrfx, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList, + const sal_Bool bTempIsSubTable, + const sal_Int32 nSpannedCols) : + SvXMLImportContext( rImport, nPrfx, rLName ), + bStartFormPage(sal_False) +{ + if (!bTempIsSubTable) + { + sal_Bool bProtection(sal_False); + ::rtl::OUString sName; + ::rtl::OUString sStyleName; + ::rtl::OUString sPassword; + sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0; + const SvXMLTokenMap& rAttrTokenMap = GetScImport().GetTableAttrTokenMap(); + for( sal_Int16 i=0; i < nAttrCount; i++ ) + { + ::rtl::OUString sAttrName = xAttrList->getNameByIndex( i ); + ::rtl::OUString aLocalName; + USHORT nPrefix = GetScImport().GetNamespaceMap().GetKeyByAttrName( + sAttrName, &aLocalName ); + ::rtl::OUString sValue = xAttrList->getValueByIndex( i ); + + switch( rAttrTokenMap.Get( nPrefix, aLocalName ) ) + { + case XML_TOK_TABLE_NAME: + sName = sValue; + break; + case XML_TOK_TABLE_STYLE_NAME: + sStyleName = sValue; + break; + case XML_TOK_TABLE_PROTECTION: + bProtection = IsXMLToken(sValue, XML_TRUE); + break; + case XML_TOK_TABLE_PRINT_RANGES: + sPrintRanges = sValue; + break; + case XML_TOK_TABLE_PASSWORD: + sPassword = sValue; + break; + } + } + GetScImport().GetTables().NewSheet(sName, sStyleName, bProtection, sPassword); + } + else + { + GetScImport().GetTables().NewTable(nSpannedCols); + } +} + +ScXMLTableContext::~ScXMLTableContext() +{ +} + +SvXMLImportContext *ScXMLTableContext::CreateChildContext( USHORT nPrefix, + const ::rtl::OUString& rLName, + const ::com::sun::star::uno::Reference< + ::com::sun::star::xml::sax::XAttributeList>& xAttrList ) +{ + SvXMLImportContext *pContext = 0; + + const SvXMLTokenMap& rTokenMap = GetScImport().GetTableElemTokenMap(); + switch( rTokenMap.Get( nPrefix, rLName ) ) + { + case XML_TOK_TABLE_COL_GROUP: + pContext = new ScXMLTableColsContext( GetScImport(), nPrefix, + rLName, xAttrList, + sal_False, sal_True ); + break; + case XML_TOK_TABLE_HEADER_COLS: + pContext = new ScXMLTableColsContext( GetScImport(), nPrefix, + rLName, xAttrList, + sal_True, sal_False ); + break; + case XML_TOK_TABLE_COLS: + pContext = new ScXMLTableColsContext( GetScImport(), nPrefix, + rLName, xAttrList, + sal_False, sal_False ); + break; + case XML_TOK_TABLE_COL: + pContext = new ScXMLTableColContext( GetScImport(), nPrefix, + rLName, xAttrList ); + break; + case XML_TOK_TABLE_ROW_GROUP: + pContext = new ScXMLTableRowsContext( GetScImport(), nPrefix, + rLName, xAttrList, + sal_False, sal_True ); + break; + case XML_TOK_TABLE_HEADER_ROWS: + pContext = new ScXMLTableRowsContext( GetScImport(), nPrefix, + rLName, xAttrList, + sal_True, sal_False ); + break; + case XML_TOK_TABLE_ROWS: + pContext = new ScXMLTableRowsContext( GetScImport(), nPrefix, + rLName, xAttrList, + sal_False, sal_False ); + break; + case XML_TOK_TABLE_ROW: + pContext = new ScXMLTableRowContext( GetScImport(), nPrefix, + rLName, xAttrList//, + //this + ); + break; + case XML_TOK_TABLE_SOURCE: + pContext = new ScXMLTableSourceContext( GetScImport(), nPrefix, rLName, xAttrList); + break; + case XML_TOK_TABLE_SCENARIO: + pContext = new ScXMLTableScenarioContext( GetScImport(), nPrefix, rLName, xAttrList); + break; + case XML_TOK_TABLE_SHAPES: + pContext = new ScXMLTableShapesContext( GetScImport(), nPrefix, rLName, xAttrList); + break; + case XML_TOK_TABLE_FORMS: + { + GetScImport().GetFormImport()->startPage(GetScImport().GetTables().GetCurrentXDrawPage()); + bStartFormPage = sal_True; + pContext = GetScImport().GetFormImport()->createOfficeFormsContext( GetScImport(), nPrefix, rLName ); + } + break; + } + + if( !pContext ) + pContext = new SvXMLImportContext( GetImport(), nPrefix, rLName ); + + return pContext; +} + +void ScXMLTableContext::EndElement() +{ + GetScImport().LockSolarMutex(); + GetScImport().GetStylesImportHelper()->EndTable(); + ScDocument* pDoc = GetScImport().GetDocument(); + if (pDoc) + { + if (sPrintRanges.getLength()) + { + uno::Reference< sheet::XSpreadsheet > xTable = GetScImport().GetTables().GetCurrentXSheet(); + if( xTable.is() ) + { + uno::Reference< sheet::XPrintAreas > xPrintAreas( xTable, uno::UNO_QUERY ); + if( xPrintAreas.is() ) + { + uno::Sequence< table::CellRangeAddress > aRangeList; + ScXMLConverter::GetRangeListFromString( aRangeList, sPrintRanges, pDoc ); + xPrintAreas->setPrintAreas( aRangeList ); + } + } + } + + ScOutlineTable* pOutlineTable = pDoc->GetOutlineTable(GetScImport().GetTables().GetCurrentSheet(), sal_False); + if (pOutlineTable) + { + ScOutlineArray* pColArray = pOutlineTable->GetColArray(); + sal_Int32 nDepth = pColArray->GetDepth(); + sal_Int32 i; + for (i = 0; i < nDepth; i++) + { + sal_Int32 nCount = pColArray->GetCount(static_cast<USHORT>(i)); + sal_Bool bChanged(sal_False); + for (sal_Int32 j = 0; j < nCount && !bChanged; j++) + { + ScOutlineEntry* pEntry = pColArray->GetEntry(static_cast<USHORT>(i), static_cast<USHORT>(j)); + if (pEntry->IsHidden()) + { + pColArray->SetVisibleBelow(static_cast<USHORT>(i), static_cast<USHORT>(j), sal_False); + bChanged = sal_True; + } + } + } + ScOutlineArray* pRowArray = pOutlineTable->GetRowArray(); + nDepth = pRowArray->GetDepth(); + for (i = 0; i < nDepth; i++) + { + sal_Int32 nCount = pRowArray->GetCount(static_cast<USHORT>(i)); + sal_Bool bChanged(sal_False); + for (sal_Int32 j = 0; j < nCount && !bChanged; j++) + { + ScOutlineEntry* pEntry = pRowArray->GetEntry(static_cast<USHORT>(i), static_cast<USHORT>(j)); + if (pEntry->IsHidden()) + { + pRowArray->SetVisibleBelow(static_cast<USHORT>(i), static_cast<USHORT>(j), sal_False); + bChanged = sal_True; + } + } + } + } + if (GetScImport().GetTables().HasDrawPage()) + { + if (GetScImport().GetTables().HasXShapes()) + { + GetScImport().GetShapeImport()->popGroupAndSort(); + uno::Reference<drawing::XShapes> xXShapes(GetScImport().GetTables().GetCurrentXShapes()); + GetScImport().GetShapeImport()->endPage(xXShapes); + } + if (bStartFormPage) + GetScImport().GetFormImport()->endPage(); + } + + GetScImport().GetTables().DeleteTable(); + GetScImport().GetProgressBarHelper()->Increment(); + } + GetScImport().UnlockSolarMutex(); +} + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |