xref: /AOO41X/main/sc/source/filter/inc/namebuff.hxx (revision 38d50f7b14e1cf975d8c6468d9633894cd59b523)
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