xref: /trunk/main/sc/source/filter/inc/namebuff.hxx (revision 38d50f7b)
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_NAMEBUFF_HXX
25 #define SC_NAMEBUFF_HXX
26 
27 #include <tools/debug.hxx>
28 #include <tools/string.hxx>
29 #include "compiler.hxx"
30 #include "root.hxx"
31 #include "xiroot.hxx"
32 
33 #include "rangenam.hxx"
34 #include <hash_map>
35 #include <list>
36 
37 class ScDocument;
38 class ScTokenArray;
39 class NameBuffer;
40 
41 
42 
43 
44 class StringHashEntry
45 {
46 private:
47 	friend class NameBuffer;
48 	String			aString;
49 	sal_uInt32			nHash;
50 
51 	static sal_uInt32	MakeHashCode( const String& );
52 public:
53 	inline			StringHashEntry( const String& );
54 	inline			StringHashEntry( void );
55 	inline void		operator =(	const sal_Char* );
56 	inline void		operator =(	const String& );
57 	inline void		operator =( const StringHashEntry& );
58 	inline sal_Bool		operator ==( const StringHashEntry& ) const;
59 };
60 
61 
StringHashEntry(void)62 inline StringHashEntry::StringHashEntry( void )
63 {
64 }
65 
66 
StringHashEntry(const String & r)67 inline StringHashEntry::StringHashEntry( const String& r ) : aString( r )
68 {
69 	nHash = MakeHashCode( r );
70 }
71 
72 
operator =(const sal_Char * p)73 inline void StringHashEntry::operator =( const sal_Char* p )
74 {
75 	aString.AssignAscii( p );
76 	nHash = MakeHashCode( aString );
77 }
78 
79 
operator =(const String & r)80 inline void StringHashEntry::operator =( const String& r )
81 {
82 	aString = r;
83 	nHash = MakeHashCode( r );
84 }
85 
86 
operator =(const StringHashEntry & r)87 inline void StringHashEntry::operator =( const StringHashEntry& r )
88 {
89 	nHash = r.nHash;
90 	aString = r.aString;
91 }
92 
93 
operator ==(const StringHashEntry & r) const94 inline sal_Bool StringHashEntry::operator ==( const StringHashEntry& r ) const
95 {
96 	return ( nHash == r.nHash && aString ==  r.aString );
97 }
98 
99 
100 
101 class NameBuffer : private List, public ExcRoot
102 {
103 private:
104 	sal_uInt16					nBase;		// Index-Basis
105 public:
106 //    inline                  NameBuffer( void );   //#94039# prevent empty rootdata
107 	inline					NameBuffer( RootData* );
108 	inline					NameBuffer( RootData*, sal_uInt16 nNewBase );
109 
110 	virtual					~NameBuffer();
111 	inline const String*	Get( sal_uInt16 nIndex );
112 	inline sal_uInt16			GetLastIndex( void );
113 	inline void				SetBase( sal_uInt16 nNewBase = 0 );
114 	void					operator <<( const String& rNewString );
115 };
116 
117 //#94039# prevent empty rootdata
118 //inline NameBuffer::NameBuffer( void )
119 //{
120 //    nBase = 0;
121 //}
122 
123 
NameBuffer(RootData * p)124 inline NameBuffer::NameBuffer( RootData* p ) : ExcRoot( p )
125 {
126 	nBase = 0;
127 }
128 
129 
NameBuffer(RootData * p,sal_uInt16 nNewBase)130 inline NameBuffer::NameBuffer( RootData* p, sal_uInt16 nNewBase ) : ExcRoot( p )
131 {
132 	nBase = nNewBase;
133 }
134 
135 
Get(sal_uInt16 n)136 inline const String* NameBuffer::Get( sal_uInt16 n )
137 {
138 	if( n < nBase )
139 		return NULL;
140 	else
141 	{
142 		StringHashEntry* pObj = ( StringHashEntry* ) List::GetObject( n );
143 
144 		if( pObj )
145 			return &pObj->aString;
146 		else
147 			return NULL;
148 	}
149 }
150 
151 
GetLastIndex(void)152 inline sal_uInt16 NameBuffer::GetLastIndex( void )
153 {
154 	DBG_ASSERT( Count() + nBase <= 0xFFFF, "*NameBuffer::GetLastIndex(): Ich hab' die Nase voll!" );
155 
156 	return ( sal_uInt16 ) ( Count() + nBase );
157 }
158 
159 
SetBase(sal_uInt16 nNewBase)160 inline void NameBuffer::SetBase( sal_uInt16 nNewBase )
161 {
162 	nBase = nNewBase;
163 }
164 
165 
166 
167 
168 class ShrfmlaBuffer : public ExcRoot
169 {
170 	struct ScAddressHashFunc : public std::unary_function< const ScAddress &, size_t >
171 	{
172 		size_t operator() (const ScAddress &addr) const;
173 	};
174     typedef std::hash_map <ScAddress, sal_uInt16, ScAddressHashFunc> ShrfmlaHash;
175 	typedef	std::list <ScRange>									 ShrfmlaList;
176 
177 	ShrfmlaHash	 index_hash;
178 	ShrfmlaList	 index_list;
179     size_t                  mnCurrIdx;
180 
181 public:
182 							ShrfmlaBuffer( RootData* pRD );
183 	virtual					~ShrfmlaBuffer();
184     void                    Clear();
185 	void					Store( const ScRange& rRange, const ScTokenArray& );
186     sal_uInt16                  Find (const ScAddress & rAddress ) const;
187 
188 	static String			CreateName( const ScRange& );
189 	};
190 
191 
192 
193 
194 class RangeNameBufferWK3 : private List
195 {
196 private:
197 	struct ENTRY
198 		{
199 		StringHashEntry		aStrHashEntry;
200 		ScComplexRefData		aScComplexRefDataRel;
201 		String				aScAbsName;
202 		sal_uInt16				nAbsInd;		// == 0 -> noch keine Abs-Name!
203 		sal_uInt16				nRelInd;
204 		sal_Bool				bSingleRef;
ENTRYRangeNameBufferWK3::ENTRY205 							ENTRY( const String& rName, const String& rScName, const ScComplexRefData& rCRD ) :
206 								aStrHashEntry( rName ),
207 								aScComplexRefDataRel( rCRD ),
208 								aScAbsName( rScName )
209 							{
210 								nAbsInd = 0;
211 								aScAbsName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "_ABS" ) );
212 							}
213 		};
214 
215 	ScTokenArray*			pScTokenArray;
216 	sal_uInt16					nIntCount;
217 public:
218 							RangeNameBufferWK3( void );
219 	virtual					~RangeNameBufferWK3();
220 	void					Add( const String& rName, const ScComplexRefData& rCRD );
221 	inline void				Add( const String& rName, const ScRange& aScRange );
222 	sal_Bool					FindRel( const String& rRef, sal_uInt16& rIndex );
223 	sal_Bool					FindAbs( const String& rRef, sal_uInt16& rIndex );
224 };
225 
226 
Add(const String & rName,const ScRange & aScRange)227 inline void RangeNameBufferWK3::Add( const String& rName, const ScRange& aScRange )
228 {
229 	ScComplexRefData		aCRD;
230 	ScSingleRefData*		pSRD;
231 	const ScAddress*	pScAddr;
232 
233 	pSRD = &aCRD.Ref1;
234 	pScAddr = &aScRange.aStart;
235 	pSRD->SetFlag3D( sal_True );
236 	pSRD->nCol = pScAddr->Col();
237 	pSRD->nRow = pScAddr->Row();
238 	pSRD->nTab = pScAddr->Tab();
239 
240 	// zunaechst ALLE Refs nur absolut
241 	pSRD->SetColRel( sal_False );
242 	pSRD->SetRowRel( sal_False );
243 	pSRD->SetTabRel( sal_False );
244 
245 	pSRD = &aCRD.Ref2;
246 	pScAddr = &aScRange.aEnd;
247 	pSRD->SetFlag3D( sal_True );
248 	pSRD->nCol = pScAddr->Col();
249 	pSRD->nRow = pScAddr->Row();
250 	pSRD->nTab = pScAddr->Tab();
251 
252 	// zunaechst ALLE Refs nur absolut
253 	pSRD->SetColRel( sal_False );
254 	pSRD->SetRowRel( sal_False );
255 	pSRD->SetTabRel( sal_False );
256 
257 	Add( rName, aCRD );
258 }
259 
260 
261 
262 
263 class ExtSheetBuffer : private List, public ExcRoot
264 {
265 private:
266 	struct Cont
267 		{
268 		String		aFile;
269 		String		aTab;
270 		sal_uInt16		nTabNum;	// 0xFFFF -> noch nicht angelegt
271 								// 0xFFFE -> versucht anzulegen, ging aber schief
272 								// 0xFFFD -> soll im selben Workbook sein, findet's aber nicht
273 		sal_Bool		bSWB;
274 		sal_Bool		bLink;
ContExtSheetBuffer::Cont275 					Cont( const String& rFilePathAndName, const String& rTabName ) :
276 						aFile( rFilePathAndName ),
277 						aTab( rTabName )
278 					{
279 						nTabNum = 0xFFFF;	// -> Tabelle noch nicht erzeugt
280 						bSWB = bLink = sal_False;
281 					}
ContExtSheetBuffer::Cont282 					Cont( const String& rFilePathAndName, const String& rTabName,
283 						const sal_Bool bSameWB ) :
284 						aFile( rFilePathAndName ),
285 						aTab( rTabName )
286 					{
287 						nTabNum = 0xFFFF;	// -> Tabelle noch nicht erzeugt
288 						bSWB = bSameWB;
289 						bLink = sal_False;
290 					}
291 		};
292 public:
293 	inline			ExtSheetBuffer( RootData* );
294 	virtual			~ExtSheetBuffer();
295 
296     sal_Int16       Add( const String& rFilePathAndName,
297 						const String& rTabName, const sal_Bool bSameWorkbook = sal_False );
298 
299 	sal_Bool			GetScTabIndex( sal_uInt16 nExcSheetIndex, sal_uInt16& rIn_LastTab_Out_ScIndex );
300 	sal_Bool			IsLink( const sal_uInt16 nExcSheetIndex ) const;
301 	sal_Bool			GetLink( const sal_uInt16 nExcSheetIndex, String &rAppl, String &rDoc ) const;
302 
303 	void			Reset( void );
304 };
305 
306 
ExtSheetBuffer(RootData * p)307 inline ExtSheetBuffer::ExtSheetBuffer( RootData* p ) : ExcRoot( p )
308 {
309 }
310 
311 
312 
313 
314 struct ExtName
315 {
316 	String			aName;
317 	sal_uInt32			nStorageId;
318 	sal_uInt16			nFlags;
319 
ExtNameExtName320     inline          ExtName( const String& r, sal_uInt16 n ) : aName( r ), nStorageId( 0 ), nFlags( n ) {}
321 
322 	sal_Bool			IsDDE( void ) const;
323     sal_Bool            IsOLE( void ) const;
324 };
325 
326 
327 
328 
329 class ExtNameBuff : protected XclImpRoot
330 {
331 public:
332     explicit        ExtNameBuff( const XclImpRoot& rRoot );
333 
334     void            AddDDE( const String& rName, sal_Int16 nRefIdx );
335     void            AddOLE( const String& rName, sal_Int16 nRefIdx, sal_uInt32 nStorageId );
336     void            AddName( const String& rName, sal_Int16 nRefIdx );
337 
338     const ExtName*  GetNameByIndex( sal_Int16 nRefIdx, sal_uInt16 nNameIdx ) const;
339 
340     void            Reset();
341 
342 private:
343     typedef ::std::vector< ExtName >            ExtNameVec;
344     typedef ::std::map< sal_Int16, ExtNameVec > ExtNameMap;
345 
346     ExtNameMap      maExtNames;
347 };
348 
349 
350 #endif
351 
352 
353