/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ #ifndef INCLUDED_SC_SOURCE_FILTER_INC_XLADDRESS_HXX #define INCLUDED_SC_SOURCE_FILTER_INC_XLADDRESS_HXX #include #include "address.hxx" class XclImpStream; class XclExpStream; /** A 2D cell address struct with Excel column and row indexes. */ struct XclAddress { sal_uInt16 mnCol; sal_uInt32 mnRow; inline explicit XclAddress( ScAddress::Uninitialized ) {} inline explicit XclAddress() : mnCol( 0 ), mnRow( 0 ) {} inline explicit XclAddress( sal_uInt16 nCol, sal_uInt32 nRow ) : mnCol( nCol ), mnRow( nRow ) {} inline void Set( sal_uInt16 nCol, sal_uInt32 nRow ) { mnCol = nCol; mnRow = nRow; } void Read( XclImpStream& rStrm ); void Write( XclExpStream& rStrm ) const; }; inline XclImpStream& operator>>( XclImpStream& rStrm, XclAddress& rXclPos ) { rXclPos.Read( rStrm ); return rStrm; } inline XclExpStream& operator<<( XclExpStream& rStrm, const XclAddress& rXclPos ) { rXclPos.Write( rStrm ); return rStrm; } /** A 2D cell range address struct with Excel column and row indexes. */ struct XclRange { XclAddress maFirst; XclAddress maLast; inline explicit XclRange( ScAddress::Uninitialized e ) : maFirst( e ), maLast( e ) {} inline explicit XclRange() {} inline explicit XclRange( const XclAddress& rPos ) : maFirst( rPos ), maLast( rPos ) {} inline explicit XclRange( sal_uInt16 nCol1, sal_uInt32 nRow1, sal_uInt16 nCol2, sal_uInt32 nRow2 ) : maFirst( nCol1, nRow1 ), maLast( nCol2, nRow2 ) {} inline void Set( sal_uInt16 nCol1, sal_uInt32 nRow1, sal_uInt16 nCol2, sal_uInt32 nRow2 ) { maFirst.Set( nCol1, nRow1 ); maLast.Set( nCol2, nRow2 ); } inline sal_uInt16 GetColCount() const { return maLast.mnCol - maFirst.mnCol + 1; } inline sal_uInt32 GetRowCount() const { return maLast.mnRow - maFirst.mnRow + 1; } bool Contains( const XclAddress& rPos ) const; void Read( XclImpStream& rStrm, bool bCol16Bit = true ); void Write( XclExpStream& rStrm, bool bCol16Bit = true ) const; }; inline XclImpStream& operator>>( XclImpStream& rStrm, XclRange& rXclRange ) { rXclRange.Read( rStrm ); return rStrm; } inline XclExpStream& operator<<( XclExpStream& rStrm, const XclRange& rXclRange ) { rXclRange.Write( rStrm ); return rStrm; } typedef ::std::vector< XclRange > XclRangeVector; /** A 2D cell range address list with Excel column and row indexes. */ class XclRangeList { private: XclRangeVector mRanges; public: inline explicit XclRangeList() : mRanges() {} size_t size() const { return mRanges.size(); } bool empty() const { return mRanges.empty(); } XclRangeVector::const_iterator begin() const { return mRanges.begin(); } XclRangeVector::const_iterator end() const { return mRanges.end(); } void clear() { mRanges.clear(); } void push_back(const XclRange &rRange) { mRanges.push_back(rRange); } XclRange GetEnclosingRange() const; void Read( XclImpStream& rStrm, bool bCol16Bit = true, sal_uInt16 nCountInStream = 0 ); void Write( XclExpStream& rStrm, bool bCol16Bit = true, sal_uInt16 nCountInStream = 0 ) const; void WriteSubList( XclExpStream& rStrm, size_t nBegin, size_t nCount, bool bCol16Bit = true, sal_uInt16 nCountInStream = 0 ) const; }; inline XclImpStream& operator>>( XclImpStream& rStrm, XclRangeList& rXclRanges ) { rXclRanges.Read( rStrm ); return rStrm; } inline XclExpStream& operator<<( XclExpStream& rStrm, const XclRangeList& rXclRanges ) { rXclRanges.Write( rStrm ); return rStrm; } class XclTracer; /** Base class for import/export address converters. */ class XclAddressConverterBase { public: explicit XclAddressConverterBase( XclTracer& rTracer, const ScAddress& rMaxPos ); virtual ~XclAddressConverterBase(); /** Returns whether the "some columns have been cut" warning box should be shown. */ inline bool IsColTruncated() const { return mbColTrunc; } /** Returns whether the "some rows have been cut" warning box should be shown. */ inline bool IsRowTruncated() const { return mbRowTrunc; } /** Returns whether the "some sheets have been cut" warning box should be shown. */ inline bool IsTabTruncated() const { return mbTabTrunc; } /** Checks if the passed sheet index is valid. @param nScTab The sheet index to check. Sets the internal flag that produces a warning box after loading/saving the file, if the sheet index is not valid. */ void CheckScTab( SCTAB nScTab ); protected: XclTracer& mrTracer; /// Tracer for invalid addresses. ScAddress maMaxPos; /// Default maximum position. sal_uInt16 mnMaxCol; /// Maximum column index, as 16-bit value. sal_uInt32 mnMaxRow; /// Maximum row index. bool mbColTrunc; /// Flag for "columns truncated" warning box. bool mbRowTrunc; /// Flag for "rows truncated" warning box. bool mbTabTrunc; /// Flag for "tables truncated" warning box. }; #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */