1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 #ifndef SC_XLADDRESS_HXX
25 #define SC_XLADDRESS_HXX
26
27 #include <vector>
28 #include "address.hxx"
29
30 class ScRangeList;
31 class XclImpStream;
32 class XclExpStream;
33
34 // ============================================================================
35
36 /** A 2D cell address struct with Excel column and row indexes. */
37 struct XclAddress
38 {
39 sal_uInt16 mnCol;
40 sal_uInt16 mnRow;
41
XclAddressXclAddress42 inline explicit XclAddress( ScAddress::Uninitialized ) {}
XclAddressXclAddress43 inline explicit XclAddress() : mnCol( 0 ), mnRow( 0 ) {}
XclAddressXclAddress44 inline explicit XclAddress( sal_uInt16 nCol, sal_uInt16 nRow ) : mnCol( nCol ), mnRow( nRow ) {}
45
SetXclAddress46 inline void Set( sal_uInt16 nCol, sal_uInt16 nRow ) { mnCol = nCol; mnRow = nRow; }
47
48 void Read( XclImpStream& rStrm, bool bCol16Bit = true );
49 void Write( XclExpStream& rStrm, bool bCol16Bit = true ) const;
50 };
51
operator ==(const XclAddress & rL,const XclAddress & rR)52 inline bool operator==( const XclAddress& rL, const XclAddress& rR )
53 {
54 return (rL.mnCol == rR.mnCol) && (rL.mnRow == rR.mnRow);
55 }
56
operator <(const XclAddress & rL,const XclAddress & rR)57 inline bool operator<( const XclAddress& rL, const XclAddress& rR )
58 {
59 return (rL.mnCol < rR.mnCol) || ((rL.mnCol == rR.mnCol) && (rL.mnRow < rR.mnRow));
60 }
61
operator >>(XclImpStream & rStrm,XclAddress & rXclPos)62 inline XclImpStream& operator>>( XclImpStream& rStrm, XclAddress& rXclPos )
63 {
64 rXclPos.Read( rStrm );
65 return rStrm;
66 }
67
operator <<(XclExpStream & rStrm,const XclAddress & rXclPos)68 inline XclExpStream& operator<<( XclExpStream& rStrm, const XclAddress& rXclPos )
69 {
70 rXclPos.Write( rStrm );
71 return rStrm;
72 }
73
74 // ----------------------------------------------------------------------------
75
76 /** A 2D cell range address struct with Excel column and row indexes. */
77 struct XclRange
78 {
79 XclAddress maFirst;
80 XclAddress maLast;
81
XclRangeXclRange82 inline explicit XclRange( ScAddress::Uninitialized e ) : maFirst( e ), maLast( e ) {}
XclRangeXclRange83 inline explicit XclRange() {}
XclRangeXclRange84 inline explicit XclRange( const XclAddress& rPos ) : maFirst( rPos ), maLast( rPos ) {}
XclRangeXclRange85 inline explicit XclRange( const XclAddress& rFirst, const XclAddress& rLast ) : maFirst( rFirst ), maLast( rLast ) {}
XclRangeXclRange86 inline explicit XclRange( sal_uInt16 nCol1, sal_uInt16 nRow1, sal_uInt16 nCol2, sal_uInt16 nRow2 ) :
87 maFirst( nCol1, nRow1 ), maLast( nCol2, nRow2 ) {}
88
SetXclRange89 inline void Set( const XclAddress& rFirst, const XclAddress& rLast )
90 { maFirst = rFirst; maLast = rLast; }
SetXclRange91 inline void Set( sal_uInt16 nCol1, sal_uInt16 nRow1, sal_uInt16 nCol2, sal_uInt16 nRow2 )
92 { maFirst.Set( nCol1, nRow1 ); maLast.Set( nCol2, nRow2 ); }
93
GetColCountXclRange94 inline sal_uInt16 GetColCount() const { return maLast.mnCol - maFirst.mnCol + 1; }
GetRowCountXclRange95 inline sal_uInt16 GetRowCount() const { return maLast.mnRow - maFirst.mnRow + 1; }
96 bool Contains( const XclAddress& rPos ) const;
97
98 void Read( XclImpStream& rStrm, bool bCol16Bit = true );
99 void Write( XclExpStream& rStrm, bool bCol16Bit = true ) const;
100 };
101
operator ==(const XclRange & rL,const XclRange & rR)102 inline bool operator==( const XclRange& rL, const XclRange& rR )
103 {
104 return (rL.maFirst == rR.maFirst) && (rL.maLast == rR.maLast);
105 }
106
operator <(const XclRange & rL,const XclRange & rR)107 inline bool operator<( const XclRange& rL, const XclRange& rR )
108 {
109 return (rL.maFirst < rR.maFirst) || ((rL.maFirst == rR.maFirst) && (rL.maLast < rR.maLast));
110 }
111
operator >>(XclImpStream & rStrm,XclRange & rXclRange)112 inline XclImpStream& operator>>( XclImpStream& rStrm, XclRange& rXclRange )
113 {
114 rXclRange.Read( rStrm );
115 return rStrm;
116 }
117
operator <<(XclExpStream & rStrm,const XclRange & rXclRange)118 inline XclExpStream& operator<<( XclExpStream& rStrm, const XclRange& rXclRange )
119 {
120 rXclRange.Write( rStrm );
121 return rStrm;
122 }
123
124 // ----------------------------------------------------------------------------
125
126 /** A 2D cell range address list with Excel column and row indexes. */
127 class XclRangeList : public ::std::vector< XclRange >
128 {
129 public:
XclRangeList()130 inline explicit XclRangeList() {}
131
132 XclRange GetEnclosingRange() const;
133
134 void Read( XclImpStream& rStrm, bool bCol16Bit = true );
135 void Write( XclExpStream& rStrm, bool bCol16Bit = true ) const;
136 void WriteSubList( XclExpStream& rStrm,
137 size_t nBegin, size_t nCount, bool bCol16Bit = true ) const;
138 };
139
operator >>(XclImpStream & rStrm,XclRangeList & rXclRanges)140 inline XclImpStream& operator>>( XclImpStream& rStrm, XclRangeList& rXclRanges )
141 {
142 rXclRanges.Read( rStrm );
143 return rStrm;
144 }
145
operator <<(XclExpStream & rStrm,const XclRangeList & rXclRanges)146 inline XclExpStream& operator<<( XclExpStream& rStrm, const XclRangeList& rXclRanges )
147 {
148 rXclRanges.Write( rStrm );
149 return rStrm;
150 }
151
152 // ============================================================================
153
154 class XclTracer;
155
156 /** Base class for import/export address converters. */
157 class XclAddressConverterBase
158 {
159 public:
160 explicit XclAddressConverterBase( XclTracer& rTracer, const ScAddress& rMaxPos );
161 virtual ~XclAddressConverterBase();
162
163 /** Returns whether the "some columns have been cut" warning box should be shown. */
IsColTruncated() const164 inline bool IsColTruncated() const { return mbColTrunc; }
165 /** Returns whether the "some rows have been cut" warning box should be shown. */
IsRowTruncated() const166 inline bool IsRowTruncated() const { return mbRowTrunc; }
167 /** Returns whether the "some sheets have been cut" warning box should be shown. */
IsTabTruncated() const168 inline bool IsTabTruncated() const { return mbTabTrunc; }
169
170 // ------------------------------------------------------------------------
171
172 /** Checks if the passed sheet index is valid.
173 @param nScTab The sheet index to check.
174 @param bWarn true = Sets the internal flag that produces a warning box
175 after loading/saving the file, if the sheet index is not valid.
176 @return true = Sheet index in nScTab is valid. */
177 bool CheckScTab( SCTAB nScTab, bool bWarn );
178
179 // ------------------------------------------------------------------------
180 protected:
181 XclTracer& mrTracer; /// Tracer for invalid addresses.
182 ScAddress maMaxPos; /// Default maximum position.
183 sal_uInt16 mnMaxCol; /// Maximum column index, as 16-bit value.
184 sal_uInt16 mnMaxRow; /// Maximum row index, as 16-bit value.
185 bool mbColTrunc; /// Flag for "columns truncated" warning box.
186 bool mbRowTrunc; /// Flag for "rows truncated" warning box.
187 bool mbTabTrunc; /// Flag for "tables truncated" warning box.
188 };
189
190 // ============================================================================
191
192 #endif
193
194