xref: /trunk/main/sc/source/core/data/docpool.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sc.hxx"
30 
31 
32 
33 #include "scitems.hxx"
34 #include <tools/shl.hxx>
35 #include <vcl/outdev.hxx>
36 #include <svl/aeitem.hxx>
37 #include <svl/itemiter.hxx>
38 #include <svx/algitem.hxx>
39 #include <editeng/boxitem.hxx>
40 #include <editeng/bolnitem.hxx>
41 #include <editeng/brshitem.hxx>
42 #include <editeng/charreliefitem.hxx>
43 #include <editeng/cntritem.hxx>
44 #include <editeng/colritem.hxx>
45 #include <editeng/crsditem.hxx>
46 #include <svx/dialmgr.hxx>
47 #include <editeng/emphitem.hxx>
48 #include <editeng/fhgtitem.hxx>
49 #include <editeng/fontitem.hxx>
50 #include <editeng/forbiddenruleitem.hxx>
51 #include <editeng/frmdiritem.hxx>
52 #include <editeng/hngpnctitem.hxx>
53 #include <editeng/itemtype.hxx>
54 #include <editeng/langitem.hxx>
55 #include <editeng/lrspitem.hxx>
56 #include <svx/pageitem.hxx>
57 #include <editeng/pbinitem.hxx>
58 #include <editeng/postitem.hxx>
59 #include <svx/rotmodit.hxx>
60 #include <editeng/scriptspaceitem.hxx>
61 #include <editeng/shaditem.hxx>
62 #include <editeng/shdditem.hxx>
63 #include <editeng/sizeitem.hxx>
64 #include <svx/svxitems.hrc>
65 #include <editeng/udlnitem.hxx>
66 #include <editeng/ulspitem.hxx>
67 #include <editeng/wghtitem.hxx>
68 #include <editeng/wrlmitem.hxx>
69 #include <editeng/xmlcnitm.hxx>
70 
71 #include "docpool.hxx"
72 #include "global.hxx"
73 #include "attrib.hxx"
74 #include "patattr.hxx"
75 #include "globstr.hrc"
76 #include "sc.hrc"           // Slot-IDs
77 
78 
79 #define SC_MAX_POOLREF      (SFX_ITEMS_OLD_MAXREF - 39)
80 #define SC_SAFE_POOLREF     (SC_MAX_POOLREF + 20)
81 
82 // STATIC DATA -----------------------------------------------------------
83 
84 sal_uInt16* ScDocumentPool::pVersionMap1 = 0;
85 sal_uInt16* ScDocumentPool::pVersionMap2 = 0;
86 sal_uInt16* ScDocumentPool::pVersionMap3 = 0;
87 sal_uInt16* ScDocumentPool::pVersionMap4 = 0;
88 sal_uInt16* ScDocumentPool::pVersionMap5 = 0;
89 sal_uInt16* ScDocumentPool::pVersionMap6 = 0;
90 sal_uInt16* ScDocumentPool::pVersionMap7 = 0;
91 sal_uInt16* ScDocumentPool::pVersionMap8 = 0;
92 sal_uInt16* ScDocumentPool::pVersionMap9 = 0;
93 sal_uInt16* ScDocumentPool::pVersionMap10 = 0;
94 sal_uInt16* ScDocumentPool::pVersionMap11 = 0;
95 
96 // ATTR_FONT_TWOLINES (not used) was changed to ATTR_USERDEF (not saved in binary format) in 641c
97 
98 static SfxItemInfo __READONLY_DATA  aItemInfos[] =
99 {
100     { SID_ATTR_CHAR_FONT,           SFX_ITEM_POOLABLE },    // ATTR_FONT
101     { SID_ATTR_CHAR_FONTHEIGHT,     SFX_ITEM_POOLABLE },    // ATTR_FONT_HEIGHT
102     { SID_ATTR_CHAR_WEIGHT,         SFX_ITEM_POOLABLE },    // ATTR_FONT_WEIGHT
103     { SID_ATTR_CHAR_POSTURE,        SFX_ITEM_POOLABLE },    // ATTR_FONT_POSTURE
104     { SID_ATTR_CHAR_UNDERLINE,      SFX_ITEM_POOLABLE },    // ATTR_FONT_UNDERLINE
105     { SID_ATTR_CHAR_OVERLINE,       SFX_ITEM_POOLABLE },    // ATTR_FONT_OVERLINE
106     { SID_ATTR_CHAR_STRIKEOUT,      SFX_ITEM_POOLABLE },    // ATTR_FONT_CROSSEDOUT
107     { SID_ATTR_CHAR_CONTOUR,        SFX_ITEM_POOLABLE },    // ATTR_FONT_CONTOUR
108     { SID_ATTR_CHAR_SHADOWED,       SFX_ITEM_POOLABLE },    // ATTR_FONT_SHADOWED
109     { SID_ATTR_CHAR_COLOR,          SFX_ITEM_POOLABLE },    // ATTR_FONT_COLOR
110     { SID_ATTR_CHAR_LANGUAGE,       SFX_ITEM_POOLABLE },    // ATTR_FONT_LANGUAGE
111     { SID_ATTR_CHAR_CJK_FONT,       SFX_ITEM_POOLABLE },    // ATTR_CJK_FONT            from 614
112     { SID_ATTR_CHAR_CJK_FONTHEIGHT, SFX_ITEM_POOLABLE },    // ATTR_CJK_FONT_HEIGHT     from 614
113     { SID_ATTR_CHAR_CJK_WEIGHT,     SFX_ITEM_POOLABLE },    // ATTR_CJK_FONT_WEIGHT     from 614
114     { SID_ATTR_CHAR_CJK_POSTURE,    SFX_ITEM_POOLABLE },    // ATTR_CJK_FONT_POSTURE    from 614
115     { SID_ATTR_CHAR_CJK_LANGUAGE,   SFX_ITEM_POOLABLE },    // ATTR_CJK_FONT_LANGUAGE   from 614
116     { SID_ATTR_CHAR_CTL_FONT,       SFX_ITEM_POOLABLE },    // ATTR_CTL_FONT            from 614
117     { SID_ATTR_CHAR_CTL_FONTHEIGHT, SFX_ITEM_POOLABLE },    // ATTR_CTL_FONT_HEIGHT     from 614
118     { SID_ATTR_CHAR_CTL_WEIGHT,     SFX_ITEM_POOLABLE },    // ATTR_CTL_FONT_WEIGHT     from 614
119     { SID_ATTR_CHAR_CTL_POSTURE,    SFX_ITEM_POOLABLE },    // ATTR_CTL_FONT_POSTURE    from 614
120     { SID_ATTR_CHAR_CTL_LANGUAGE,   SFX_ITEM_POOLABLE },    // ATTR_CTL_FONT_LANGUAGE   from 614
121     { SID_ATTR_CHAR_EMPHASISMARK,   SFX_ITEM_POOLABLE },    // ATTR_FONT_EMPHASISMARK   from 614
122     { 0,                            SFX_ITEM_POOLABLE },    // ATTR_USERDEF             from 614 / 641c
123     { SID_ATTR_CHAR_WORDLINEMODE,   SFX_ITEM_POOLABLE },    // ATTR_FONT_WORDLINE       from 632b
124     { SID_ATTR_CHAR_RELIEF,         SFX_ITEM_POOLABLE },    // ATTR_FONT_RELIEF         from 632b
125     { SID_ATTR_ALIGN_HYPHENATION,   SFX_ITEM_POOLABLE },    // ATTR_HYPHENATE           from 632b
126     { 0,                            SFX_ITEM_POOLABLE },    // ATTR_SCRIPTSPACE         from 614d
127     { 0,                            SFX_ITEM_POOLABLE },    // ATTR_HANGPUNCTUATION     from 614d
128     { SID_ATTR_PARA_FORBIDDEN_RULES,SFX_ITEM_POOLABLE },    // ATTR_FORBIDDEN_RULES     from 614d
129     { SID_ATTR_ALIGN_HOR_JUSTIFY,   SFX_ITEM_POOLABLE },    // ATTR_HOR_JUSTIFY
130     { SID_ATTR_ALIGN_INDENT,        SFX_ITEM_POOLABLE },    // ATTR_INDENT          ab 350
131     { SID_ATTR_ALIGN_VER_JUSTIFY,   SFX_ITEM_POOLABLE },    // ATTR_VER_JUSTIFY
132     { SID_ATTR_ALIGN_STACKED,       SFX_ITEM_POOLABLE },    // ATTR_STACKED         from 680/dr14 (replaces ATTR_ORIENTATION)
133     { SID_ATTR_ALIGN_DEGREES,       SFX_ITEM_POOLABLE },    // ATTR_ROTATE_VALUE    ab 367
134     { SID_ATTR_ALIGN_LOCKPOS,       SFX_ITEM_POOLABLE },    // ATTR_ROTATE_MODE     ab 367
135     { SID_ATTR_ALIGN_ASIANVERTICAL, SFX_ITEM_POOLABLE },    // ATTR_VERTICAL_ASIAN  from 642
136     { SID_ATTR_FRAMEDIRECTION,      SFX_ITEM_POOLABLE },    // ATTR_WRITINGDIR      from 643
137     { SID_ATTR_ALIGN_LINEBREAK,     SFX_ITEM_POOLABLE },    // ATTR_LINEBREAK
138     { SID_ATTR_ALIGN_SHRINKTOFIT,   SFX_ITEM_POOLABLE },    // ATTR_SHRINKTOFIT     from 680/dr14
139     { SID_ATTR_BORDER_DIAG_TLBR,    SFX_ITEM_POOLABLE },    // ATTR_BORDER_TLBR     from 680/dr14
140     { SID_ATTR_BORDER_DIAG_BLTR,    SFX_ITEM_POOLABLE },    // ATTR_BORDER_BLTR     from 680/dr14
141     { SID_ATTR_ALIGN_MARGIN,        SFX_ITEM_POOLABLE },    // ATTR_MARGIN
142     { 0,                            SFX_ITEM_POOLABLE },    // ATTR_MERGE
143     { 0,                            SFX_ITEM_POOLABLE },    // ATTR_MERGE_FLAG
144     { SID_ATTR_NUMBERFORMAT_VALUE,  SFX_ITEM_POOLABLE },    // ATTR_VALUE_FORMAT
145     { ATTR_LANGUAGE_FORMAT,         SFX_ITEM_POOLABLE },    // ATTR_LANGUAGE_FORMAT ab 329, wird im Dialog mit SID_ATTR_NUMBERFORMAT_VALUE kombiniert
146     { SID_ATTR_BRUSH,               SFX_ITEM_POOLABLE },    // ATTR_BACKGROUND
147     { SID_SCATTR_PROTECTION,        SFX_ITEM_POOLABLE },    // ATTR_PROTECTION
148     { SID_ATTR_BORDER_OUTER,        SFX_ITEM_POOLABLE },    // ATTR_BORDER
149     { SID_ATTR_BORDER_INNER,        SFX_ITEM_POOLABLE },    // ATTR_BORDER_INNER
150     { SID_ATTR_BORDER_SHADOW,       SFX_ITEM_POOLABLE },    // ATTR_SHADOW
151     { 0,                            SFX_ITEM_POOLABLE },    // ATTR_VALIDDATA
152     { 0,                            SFX_ITEM_POOLABLE },    // ATTR_CONDITIONAL
153     { 0,                            SFX_ITEM_POOLABLE },    // ATTR_PATTERN
154     { SID_ATTR_LRSPACE,             SFX_ITEM_POOLABLE },    // ATTR_LRSPACE
155     { SID_ATTR_ULSPACE,             SFX_ITEM_POOLABLE },    // ATTR_ULSPACE
156     { SID_ATTR_PAGE,                SFX_ITEM_POOLABLE },    // ATTR_PAGE
157     { 0,                            SFX_ITEM_POOLABLE },    // ATTR_PAGE_PAPERTRAY, seit 303 nur noch dummy
158     { SID_ATTR_PAGE_PAPERBIN,       SFX_ITEM_POOLABLE },    // ATTR_PAGE_PAPERBIN
159     { SID_ATTR_PAGE_SIZE,           SFX_ITEM_POOLABLE },    // ATTR_PAGE_SIZE
160     { SID_ATTR_PAGE_MAXSIZE,        SFX_ITEM_POOLABLE },    // ATTR_PAGE_MAXSIZE
161     { SID_ATTR_PAGE_EXT1,           SFX_ITEM_POOLABLE },    // ATTR_PAGE_HORCENTER
162     { SID_ATTR_PAGE_EXT2,           SFX_ITEM_POOLABLE },    // ATTR_PAGE_VERCENTER
163     { SID_ATTR_PAGE_ON,             SFX_ITEM_POOLABLE },    // ATTR_PAGE_ON
164     { SID_ATTR_PAGE_DYNAMIC,        SFX_ITEM_POOLABLE },    // ATTR_PAGE_DYNAMIC
165     { SID_ATTR_PAGE_SHARED,         SFX_ITEM_POOLABLE },    // ATTR_PAGE_SHARED
166     { SID_SCATTR_PAGE_NOTES,        SFX_ITEM_POOLABLE },    // ATTR_PAGE_NOTES
167     { SID_SCATTR_PAGE_GRID,         SFX_ITEM_POOLABLE },    // ATTR_PAGE_GRID
168     { SID_SCATTR_PAGE_HEADERS,      SFX_ITEM_POOLABLE },    // ATTR_PAGE_HEADERS
169     { SID_SCATTR_PAGE_CHARTS,       SFX_ITEM_POOLABLE },    // ATTR_PAGE_CHARTS
170     { SID_SCATTR_PAGE_OBJECTS,      SFX_ITEM_POOLABLE },    // ATTR_PAGE_OBJECTS
171     { SID_SCATTR_PAGE_DRAWINGS,     SFX_ITEM_POOLABLE },    // ATTR_PAGE_DRAWINGS
172     { SID_SCATTR_PAGE_TOPDOWN,      SFX_ITEM_POOLABLE },    // ATTR_PAGE_TOPDOWN
173     { SID_SCATTR_PAGE_SCALE,        SFX_ITEM_POOLABLE },    // ATTR_PAGE_SCALE
174     { SID_SCATTR_PAGE_SCALETOPAGES, SFX_ITEM_POOLABLE },    // ATTR_PAGE_SCALETOPAGES
175     { SID_SCATTR_PAGE_FIRSTPAGENO,  SFX_ITEM_POOLABLE },    // ATTR_PAGE_FIRSTPAGENO
176     { SID_SCATTR_PAGE_PRINTAREA,    SFX_ITEM_POOLABLE },    // ATTR_PAGE_PRINTAREA
177     { SID_SCATTR_PAGE_REPEATROW,    SFX_ITEM_POOLABLE },    // ATTR_PAGE_REPEATROW
178     { SID_SCATTR_PAGE_REPEATCOL,    SFX_ITEM_POOLABLE },    // ATTR_PAGE_REPEATCOL
179     { SID_SCATTR_PAGE_PRINTTABLES,  SFX_ITEM_POOLABLE },    // ATTR_PAGE_PRINTTABLES
180     { SID_SCATTR_PAGE_HEADERLEFT,   SFX_ITEM_POOLABLE },    // ATTR_PAGE_HEADERLEFT
181     { SID_SCATTR_PAGE_FOOTERLEFT,   SFX_ITEM_POOLABLE },    // ATTR_PAGE_FOOTERLEFT
182     { SID_SCATTR_PAGE_HEADERRIGHT,  SFX_ITEM_POOLABLE },    // ATTR_PAGE_HEADERRIGHT
183     { SID_SCATTR_PAGE_FOOTERRIGHT,  SFX_ITEM_POOLABLE },    // ATTR_PAGE_FOOTERRIGHT
184     { SID_ATTR_PAGE_HEADERSET,      SFX_ITEM_POOLABLE },    // ATTR_PAGE_HEADERSET
185     { SID_ATTR_PAGE_FOOTERSET,      SFX_ITEM_POOLABLE },    // ATTR_PAGE_FOOTERSET
186     { SID_SCATTR_PAGE_FORMULAS,     SFX_ITEM_POOLABLE },    // ATTR_PAGE_FORMULAS
187     { SID_SCATTR_PAGE_NULLVALS,     SFX_ITEM_POOLABLE },    // ATTR_PAGE_NULLVALS
188     { SID_SCATTR_PAGE_SCALETO,      SFX_ITEM_POOLABLE }     // ATTR_PAGE_SCALETO
189 };
190 
191 // -----------------------------------------------------------------------
192 
193 ScDocumentPool::ScDocumentPool( SfxItemPool* pSecPool, sal_Bool bLoadRefCounts )
194 
195     :   SfxItemPool ( String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("ScDocumentPool")),
196                         ATTR_STARTINDEX, ATTR_ENDINDEX,
197                         aItemInfos, NULL, bLoadRefCounts ),
198         pSecondary  ( pSecPool )
199 {
200     //  latin font from GetDefaultFonts is not used, DEFAULTFONT_LATIN_SPREADSHEET instead
201     Font aStdFont = OutputDevice::GetDefaultFont( DEFAULTFONT_LATIN_SPREADSHEET, LANGUAGE_ENGLISH_US,
202                                                     DEFAULTFONT_FLAGS_ONLYONE );
203     SvxFontItem* pStdFont = new SvxFontItem( aStdFont.GetFamily(),
204                                             aStdFont.GetName(), aStdFont.GetStyleName(),
205                                             aStdFont.GetPitch(), aStdFont.GetCharSet(),
206                                             ATTR_FONT );
207 
208     SvxFontItem* pCjkFont = new SvxFontItem( ATTR_CJK_FONT );
209     SvxFontItem* pCtlFont = new SvxFontItem( ATTR_CTL_FONT );
210     SvxFontItem aDummy( ATTR_FONT );
211     GetDefaultFonts( aDummy, *pCjkFont, *pCtlFont );
212 
213     SvxBoxInfoItem* pGlobalBorderInnerAttr = new SvxBoxInfoItem( ATTR_BORDER_INNER );
214     SfxItemSet*     pSet = new SfxItemSet( *this, ATTR_PATTERN_START, ATTR_PATTERN_END );
215     SfxItemSet      aSetItemItemSet( *this,
216                                      ATTR_BACKGROUND, ATTR_BACKGROUND,
217                                      ATTR_BORDER,     ATTR_SHADOW,
218                                      ATTR_LRSPACE,    ATTR_ULSPACE,
219                                      ATTR_PAGE_SIZE,  ATTR_PAGE_SIZE,
220                                      ATTR_PAGE_ON,    ATTR_PAGE_SHARED,
221                                      0 );
222 
223     pGlobalBorderInnerAttr->SetLine(NULL, BOXINFO_LINE_HORI);
224     pGlobalBorderInnerAttr->SetLine(NULL, BOXINFO_LINE_VERT);
225     pGlobalBorderInnerAttr->SetTable(sal_True);
226     pGlobalBorderInnerAttr->SetDist(sal_True);
227     pGlobalBorderInnerAttr->SetMinDist(sal_False);
228 
229     ppPoolDefaults = new SfxPoolItem*[ATTR_ENDINDEX-ATTR_STARTINDEX+1];
230 
231     ppPoolDefaults[ ATTR_FONT            - ATTR_STARTINDEX ] = pStdFont;
232     ppPoolDefaults[ ATTR_FONT_HEIGHT     - ATTR_STARTINDEX ] = new SvxFontHeightItem( 200, 100, ATTR_FONT_HEIGHT );       // 10 pt;
233     ppPoolDefaults[ ATTR_FONT_WEIGHT     - ATTR_STARTINDEX ] = new SvxWeightItem( WEIGHT_NORMAL, ATTR_FONT_WEIGHT );
234     ppPoolDefaults[ ATTR_FONT_POSTURE    - ATTR_STARTINDEX ] = new SvxPostureItem( ITALIC_NONE, ATTR_FONT_POSTURE );
235     ppPoolDefaults[ ATTR_FONT_UNDERLINE  - ATTR_STARTINDEX ] = new SvxUnderlineItem( UNDERLINE_NONE, ATTR_FONT_UNDERLINE );
236     ppPoolDefaults[ ATTR_FONT_OVERLINE   - ATTR_STARTINDEX ] = new SvxOverlineItem( UNDERLINE_NONE, ATTR_FONT_OVERLINE );
237     ppPoolDefaults[ ATTR_FONT_CROSSEDOUT - ATTR_STARTINDEX ] = new SvxCrossedOutItem( STRIKEOUT_NONE, ATTR_FONT_CROSSEDOUT );
238     ppPoolDefaults[ ATTR_FONT_CONTOUR    - ATTR_STARTINDEX ] = new SvxContourItem( sal_False, ATTR_FONT_CONTOUR );
239     ppPoolDefaults[ ATTR_FONT_SHADOWED   - ATTR_STARTINDEX ] = new SvxShadowedItem( sal_False, ATTR_FONT_SHADOWED );
240     ppPoolDefaults[ ATTR_FONT_COLOR      - ATTR_STARTINDEX ] = new SvxColorItem( Color(COL_AUTO), ATTR_FONT_COLOR );
241     ppPoolDefaults[ ATTR_FONT_LANGUAGE   - ATTR_STARTINDEX ] = new SvxLanguageItem( LanguageType(LANGUAGE_DONTKNOW), ATTR_FONT_LANGUAGE );
242     ppPoolDefaults[ ATTR_CJK_FONT        - ATTR_STARTINDEX ] = pCjkFont;
243     ppPoolDefaults[ ATTR_CJK_FONT_HEIGHT - ATTR_STARTINDEX ] = new SvxFontHeightItem( 200, 100, ATTR_CJK_FONT_HEIGHT );
244     ppPoolDefaults[ ATTR_CJK_FONT_WEIGHT - ATTR_STARTINDEX ] = new SvxWeightItem( WEIGHT_NORMAL, ATTR_CJK_FONT_WEIGHT );
245     ppPoolDefaults[ ATTR_CJK_FONT_POSTURE- ATTR_STARTINDEX ] = new SvxPostureItem( ITALIC_NONE, ATTR_CJK_FONT_POSTURE );
246     ppPoolDefaults[ ATTR_CJK_FONT_LANGUAGE-ATTR_STARTINDEX ] = new SvxLanguageItem( LanguageType(LANGUAGE_DONTKNOW),
247                                                                     ATTR_CJK_FONT_LANGUAGE );
248     ppPoolDefaults[ ATTR_CTL_FONT        - ATTR_STARTINDEX ] = pCtlFont;
249     ppPoolDefaults[ ATTR_CTL_FONT_HEIGHT - ATTR_STARTINDEX ] = new SvxFontHeightItem( 200, 100, ATTR_CTL_FONT_HEIGHT );
250     ppPoolDefaults[ ATTR_CTL_FONT_WEIGHT - ATTR_STARTINDEX ] = new SvxWeightItem( WEIGHT_NORMAL, ATTR_CTL_FONT_WEIGHT );
251     ppPoolDefaults[ ATTR_CTL_FONT_POSTURE- ATTR_STARTINDEX ] = new SvxPostureItem( ITALIC_NONE, ATTR_CTL_FONT_POSTURE );
252     ppPoolDefaults[ ATTR_CTL_FONT_LANGUAGE-ATTR_STARTINDEX ] = new SvxLanguageItem( LanguageType(LANGUAGE_DONTKNOW),
253                                                                     ATTR_CTL_FONT_LANGUAGE );
254     ppPoolDefaults[ ATTR_FONT_EMPHASISMARK-ATTR_STARTINDEX ] = new SvxEmphasisMarkItem( EMPHASISMARK_NONE, ATTR_FONT_EMPHASISMARK );
255     ppPoolDefaults[ ATTR_USERDEF         - ATTR_STARTINDEX ] = new SvXMLAttrContainerItem( ATTR_USERDEF );
256     ppPoolDefaults[ ATTR_FONT_WORDLINE   - ATTR_STARTINDEX ] = new SvxWordLineModeItem(sal_False, ATTR_FONT_WORDLINE );
257     ppPoolDefaults[ ATTR_FONT_RELIEF     - ATTR_STARTINDEX ] = new SvxCharReliefItem( RELIEF_NONE, ATTR_FONT_RELIEF );
258     ppPoolDefaults[ ATTR_HYPHENATE       - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_HYPHENATE );
259     ppPoolDefaults[ ATTR_SCRIPTSPACE     - ATTR_STARTINDEX ] = new SvxScriptSpaceItem( sal_False, ATTR_SCRIPTSPACE);
260     ppPoolDefaults[ ATTR_HANGPUNCTUATION - ATTR_STARTINDEX ] = new SvxHangingPunctuationItem( sal_False, ATTR_HANGPUNCTUATION);
261     ppPoolDefaults[ ATTR_FORBIDDEN_RULES - ATTR_STARTINDEX ] = new SvxForbiddenRuleItem( sal_False, ATTR_FORBIDDEN_RULES);
262     ppPoolDefaults[ ATTR_HOR_JUSTIFY     - ATTR_STARTINDEX ] = new SvxHorJustifyItem( SVX_HOR_JUSTIFY_STANDARD, ATTR_HOR_JUSTIFY);
263     ppPoolDefaults[ ATTR_INDENT          - ATTR_STARTINDEX ] = new SfxUInt16Item( ATTR_INDENT, 0 );
264     ppPoolDefaults[ ATTR_VER_JUSTIFY     - ATTR_STARTINDEX ] = new SvxVerJustifyItem( SVX_VER_JUSTIFY_STANDARD, ATTR_VER_JUSTIFY);
265     ppPoolDefaults[ ATTR_STACKED         - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_STACKED, sal_False );
266     ppPoolDefaults[ ATTR_ROTATE_VALUE    - ATTR_STARTINDEX ] = new SfxInt32Item( ATTR_ROTATE_VALUE, 0 );
267     ppPoolDefaults[ ATTR_ROTATE_MODE     - ATTR_STARTINDEX ] = new SvxRotateModeItem( SVX_ROTATE_MODE_BOTTOM, ATTR_ROTATE_MODE );
268     ppPoolDefaults[ ATTR_VERTICAL_ASIAN  - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_VERTICAL_ASIAN );
269     //  The default for the ATTR_WRITINGDIR cell attribute must by FRMDIR_ENVIRONMENT,
270     //  so that value is returned when asking for a default cell's attributes.
271     //  The value from the page style is set as DefaultHorizontalTextDirection for the EditEngine.
272     ppPoolDefaults[ ATTR_WRITINGDIR      - ATTR_STARTINDEX ] = new SvxFrameDirectionItem( FRMDIR_ENVIRONMENT, ATTR_WRITINGDIR );
273     ppPoolDefaults[ ATTR_LINEBREAK       - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_LINEBREAK );
274     ppPoolDefaults[ ATTR_SHRINKTOFIT     - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_SHRINKTOFIT );
275     ppPoolDefaults[ ATTR_BORDER_TLBR     - ATTR_STARTINDEX ] = new SvxLineItem( ATTR_BORDER_TLBR );
276     ppPoolDefaults[ ATTR_BORDER_BLTR     - ATTR_STARTINDEX ] = new SvxLineItem( ATTR_BORDER_BLTR );
277     ppPoolDefaults[ ATTR_MARGIN          - ATTR_STARTINDEX ] = new SvxMarginItem( ATTR_MARGIN );
278     ppPoolDefaults[ ATTR_MERGE           - ATTR_STARTINDEX ] = new ScMergeAttr;
279     ppPoolDefaults[ ATTR_MERGE_FLAG      - ATTR_STARTINDEX ] = new ScMergeFlagAttr;
280     ppPoolDefaults[ ATTR_VALUE_FORMAT    - ATTR_STARTINDEX ] = new SfxUInt32Item( ATTR_VALUE_FORMAT, 0 );
281     ppPoolDefaults[ ATTR_LANGUAGE_FORMAT - ATTR_STARTINDEX ] = new SvxLanguageItem( ScGlobal::eLnge, ATTR_LANGUAGE_FORMAT );
282     ppPoolDefaults[ ATTR_BACKGROUND      - ATTR_STARTINDEX ] = new SvxBrushItem( Color(COL_TRANSPARENT), ATTR_BACKGROUND );
283     ppPoolDefaults[ ATTR_PROTECTION      - ATTR_STARTINDEX ] = new ScProtectionAttr;
284     ppPoolDefaults[ ATTR_BORDER          - ATTR_STARTINDEX ] = new SvxBoxItem( ATTR_BORDER );
285     ppPoolDefaults[ ATTR_BORDER_INNER    - ATTR_STARTINDEX ] = pGlobalBorderInnerAttr;
286     ppPoolDefaults[ ATTR_SHADOW          - ATTR_STARTINDEX ] = new SvxShadowItem( ATTR_SHADOW );
287     ppPoolDefaults[ ATTR_VALIDDATA       - ATTR_STARTINDEX ] = new SfxUInt32Item( ATTR_VALIDDATA, 0 );
288     ppPoolDefaults[ ATTR_CONDITIONAL     - ATTR_STARTINDEX ] = new SfxUInt32Item( ATTR_CONDITIONAL, 0 );
289 
290     //  GetRscString funktioniert erst nach ScGlobal::Init, zu erkennen am EmptyBrushItem
291     //! zusaetzliche Methode ScGlobal::IsInit() oder so...
292     //! oder erkennen, ob dies der Secondary-Pool fuer einen MessagePool ist
293     if ( ScGlobal::GetEmptyBrushItem() )
294         ppPoolDefaults[ ATTR_PATTERN     - ATTR_STARTINDEX ] = new ScPatternAttr( pSet, ScGlobal::GetRscString(STR_STYLENAME_STANDARD) );
295     else
296         ppPoolDefaults[ ATTR_PATTERN     - ATTR_STARTINDEX ] = new ScPatternAttr( pSet,
297             String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM(STRING_STANDARD)) ); //! without name?
298 
299     ppPoolDefaults[ ATTR_LRSPACE         - ATTR_STARTINDEX ] = new SvxLRSpaceItem( ATTR_LRSPACE );
300     ppPoolDefaults[ ATTR_ULSPACE         - ATTR_STARTINDEX ] = new SvxULSpaceItem( ATTR_ULSPACE );
301     ppPoolDefaults[ ATTR_PAGE            - ATTR_STARTINDEX ] = new SvxPageItem( ATTR_PAGE );
302     ppPoolDefaults[ ATTR_PAGE_PAPERTRAY  - ATTR_STARTINDEX ] = new SfxAllEnumItem( ATTR_PAGE_PAPERTRAY );
303     ppPoolDefaults[ ATTR_PAGE_PAPERBIN   - ATTR_STARTINDEX ] = new SvxPaperBinItem( ATTR_PAGE_PAPERBIN );
304     ppPoolDefaults[ ATTR_PAGE_SIZE       - ATTR_STARTINDEX ] = new SvxSizeItem( ATTR_PAGE_SIZE );
305     ppPoolDefaults[ ATTR_PAGE_MAXSIZE    - ATTR_STARTINDEX ] = new SvxSizeItem( ATTR_PAGE_MAXSIZE );
306     ppPoolDefaults[ ATTR_PAGE_HORCENTER  - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_HORCENTER );
307     ppPoolDefaults[ ATTR_PAGE_VERCENTER  - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_VERCENTER );
308     ppPoolDefaults[ ATTR_PAGE_ON         - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_ON, sal_True );
309     ppPoolDefaults[ ATTR_PAGE_DYNAMIC    - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_DYNAMIC, sal_True );
310     ppPoolDefaults[ ATTR_PAGE_SHARED     - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_SHARED, sal_True );
311     ppPoolDefaults[ ATTR_PAGE_NOTES      - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_NOTES, sal_False );
312     ppPoolDefaults[ ATTR_PAGE_GRID       - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_GRID, sal_False );
313     ppPoolDefaults[ ATTR_PAGE_HEADERS    - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_HEADERS, sal_False );
314     ppPoolDefaults[ ATTR_PAGE_CHARTS     - ATTR_STARTINDEX ] = new ScViewObjectModeItem( ATTR_PAGE_CHARTS );
315     ppPoolDefaults[ ATTR_PAGE_OBJECTS    - ATTR_STARTINDEX ] = new ScViewObjectModeItem( ATTR_PAGE_OBJECTS );
316     ppPoolDefaults[ ATTR_PAGE_DRAWINGS   - ATTR_STARTINDEX ] = new ScViewObjectModeItem( ATTR_PAGE_DRAWINGS );
317     ppPoolDefaults[ ATTR_PAGE_TOPDOWN    - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_TOPDOWN, sal_True );
318     ppPoolDefaults[ ATTR_PAGE_SCALE      - ATTR_STARTINDEX ] = new SfxUInt16Item( ATTR_PAGE_SCALE, 100 );
319     ppPoolDefaults[ ATTR_PAGE_SCALETOPAGES-ATTR_STARTINDEX ] = new SfxUInt16Item( ATTR_PAGE_SCALETOPAGES, 1 );
320     ppPoolDefaults[ ATTR_PAGE_FIRSTPAGENO- ATTR_STARTINDEX ] = new SfxUInt16Item( ATTR_PAGE_FIRSTPAGENO, 1 );
321     ppPoolDefaults[ ATTR_PAGE_PRINTAREA  - ATTR_STARTINDEX ] = new ScRangeItem( ATTR_PAGE_PRINTAREA );
322     ppPoolDefaults[ ATTR_PAGE_REPEATROW  - ATTR_STARTINDEX ] = new ScRangeItem( ATTR_PAGE_REPEATROW );
323     ppPoolDefaults[ ATTR_PAGE_REPEATCOL  - ATTR_STARTINDEX ] = new ScRangeItem( ATTR_PAGE_REPEATCOL );
324     ppPoolDefaults[ ATTR_PAGE_PRINTTABLES- ATTR_STARTINDEX ] = new ScTableListItem( ATTR_PAGE_PRINTTABLES );
325     ppPoolDefaults[ ATTR_PAGE_HEADERLEFT - ATTR_STARTINDEX ] = new ScPageHFItem( ATTR_PAGE_HEADERLEFT );
326     ppPoolDefaults[ ATTR_PAGE_FOOTERLEFT - ATTR_STARTINDEX ] = new ScPageHFItem( ATTR_PAGE_FOOTERLEFT );
327     ppPoolDefaults[ ATTR_PAGE_HEADERRIGHT- ATTR_STARTINDEX ] = new ScPageHFItem( ATTR_PAGE_HEADERRIGHT );
328     ppPoolDefaults[ ATTR_PAGE_FOOTERRIGHT- ATTR_STARTINDEX ] = new ScPageHFItem( ATTR_PAGE_FOOTERRIGHT );
329     ppPoolDefaults[ ATTR_PAGE_HEADERSET  - ATTR_STARTINDEX ] = new SvxSetItem( ATTR_PAGE_HEADERSET, aSetItemItemSet );
330     ppPoolDefaults[ ATTR_PAGE_FOOTERSET  - ATTR_STARTINDEX ] = new SvxSetItem( ATTR_PAGE_FOOTERSET, aSetItemItemSet );
331     ppPoolDefaults[ ATTR_PAGE_FORMULAS   - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_FORMULAS, sal_False );
332     ppPoolDefaults[ ATTR_PAGE_NULLVALS   - ATTR_STARTINDEX ] = new SfxBoolItem( ATTR_PAGE_NULLVALS, sal_True );
333     ppPoolDefaults[ ATTR_PAGE_SCALETO    - ATTR_STARTINDEX ] = new ScPageScaleToItem( 1, 1 );
334 //  ppPoolDefaults[ ATTR_ITEM_DOUBLE     - ATTR_STARTINDEX ] = new ScDoubleItem( ATTR_ITEM_DOUBLE, 0 );
335 
336     SetDefaults( ppPoolDefaults );
337 
338     if ( pSecondary )
339         SetSecondaryPool( pSecondary );
340 
341     // ATTR_LANGUAGE_FORMAT ab sv329 eingefuegt, VersionMap in _ScGlobal__Init
342     SetVersionMap( 1, 100, 157, pVersionMap1 );
343 
344     // ATTR_VALIDDATA, ATTR_CONDITIONAL ab 341
345     SetVersionMap( 2, 100, 158, pVersionMap2 );
346 
347     // ATTR_INDENT ab 350
348     SetVersionMap( 3, 100, 160, pVersionMap3 );
349 
350     // ATTR_ROTATE_VALUE, ATTR_ROTATE_MODE ab 367
351     SetVersionMap( 4, 100, 161, pVersionMap4 );
352 
353     // CJK, CTL, EMPHASISMARK, TWOLINES from 614
354     SetVersionMap( 5, 100, 163, pVersionMap5 );
355 
356     // ATTR_SCRIPTSPACE, ATTR_HANGPUNCTUATION, ATTR_FORBIDDEN_RULES from 614d
357     SetVersionMap( 6, 100, 175, pVersionMap6 );
358 
359     // ATTR_FONT_WORDLINE, ATTR_FONT_RELIEF, ATTR_HYPHENATE from 632b
360     SetVersionMap( 7, 100, 178, pVersionMap7 );
361 
362     // ATTR_VERTICAL_ASIAN from 642q
363     SetVersionMap( 8, 100, 181, pVersionMap8 );
364 
365     // ATTR_WRITINGDIR from 643y
366     SetVersionMap( 9, 100, 182, pVersionMap9 );
367 
368     // ATTR_PAGE_SCALETO added in 680/sab008
369     // new version map not required
370 
371     // ATTR_SHRINKTOFIT, ATTR_BORDER_TL_BR, ATTR_BORDER_BL_TR added in 680/dr14
372     SetVersionMap( 10, 100, 184, pVersionMap10 );
373 
374     // ATTR_FONT_OVERLINE added in DEV300/overline2
375     SetVersionMap( 11, 100, 187, pVersionMap11 );
376 }
377 
378 __EXPORT ScDocumentPool::~ScDocumentPool()
379 {
380     Delete();
381 
382     for ( sal_uInt16 i=0; i < ATTR_ENDINDEX-ATTR_STARTINDEX+1; i++ )
383     {
384         SetRefCount( *ppPoolDefaults[i], 0 );
385         delete ppPoolDefaults[i];
386     }
387 
388     delete[] ppPoolDefaults;
389     SfxItemPool::Free(pSecondary);
390 }
391 
392 void ScDocumentPool::InitVersionMaps()
393 {
394     DBG_ASSERT( !pVersionMap1 && !pVersionMap2 &&
395                 !pVersionMap3 && !pVersionMap4 &&
396                 !pVersionMap5 && !pVersionMap6 &&
397                 !pVersionMap7 && !pVersionMap8 &&
398                 !pVersionMap9 && !pVersionMap10 &&
399                 !pVersionMap11, "InitVersionMaps call multiple times" );
400 
401     // alte WhichId's mappen
402     // nicht mit ATTR_* zaehlen, falls die sich nochmal aendern
403 
404     //  erste Map: ATTR_LANGUAGE_FORMAT ab sv329 eingefuegt
405 
406     const sal_uInt16 nMap1Start = 100;  // alter ATTR_STARTINDEX
407     const sal_uInt16 nMap1End   = 157;  // alter ATTR_ENDINDEX
408     const sal_uInt16 nMap1Count = nMap1End - nMap1Start + 1;
409     const sal_uInt16 nMap1New   = 18;   // ATTR_LANGUAGE_FORMAT - ATTR_STARTINDEX
410     pVersionMap1 = new sal_uInt16 [ nMap1Count ];
411     sal_uInt16 i, j;
412     for ( i=0, j=nMap1Start; i < nMap1New; i++, j++ )
413         pVersionMap1[i] = j;
414     // ein Eintrag eingefuegt...
415     for ( i=nMap1New, j=nMap1Start+nMap1New+1; i < nMap1Count; i++, j++ )
416         pVersionMap1[i] = j;
417 
418     //  zweite Map: ATTR_VALIDDATA und ATTR_CONDITIONAL ab 341 eingefuegt
419 
420     const sal_uInt16 nMap2Start = 100;  // ATTR_STARTINDEX
421     const sal_uInt16 nMap2End   = 158;  // ATTR_ENDINDEX
422     const sal_uInt16 nMap2Count = nMap2End - nMap2Start + 1;
423     const sal_uInt16 nMap2New   = 24;   // ATTR_VALIDDATA - ATTR_STARTINDEX
424     pVersionMap2 = new sal_uInt16 [ nMap2Count ];
425     for ( i=0, j=nMap2Start; i < nMap2New; i++, j++ )
426         pVersionMap2[i] = j;
427     // zwei Eintraege eingefuegt...
428     for ( i=nMap2New, j=nMap2Start+nMap2New+2; i < nMap2Count; i++, j++ )
429         pVersionMap2[i] = j;
430 
431     //  dritte Map: ATTR_INDENT ab 350 eingefuegt
432 
433     const sal_uInt16 nMap3Start = 100;  // ATTR_STARTINDEX
434     const sal_uInt16 nMap3End   = 160;  // ATTR_ENDINDEX
435     const sal_uInt16 nMap3Count = nMap3End - nMap3Start + 1;
436     const sal_uInt16 nMap3New   = 11;   // ATTR_INDENT - ATTR_STARTINDEX
437     pVersionMap3 = new sal_uInt16 [ nMap3Count ];
438     for ( i=0, j=nMap3Start; i < nMap3New; i++, j++ )
439         pVersionMap3[i] = j;
440     // ein Eintrag eingefuegt...
441     for ( i=nMap3New, j=nMap3Start+nMap3New+1; i < nMap3Count; i++, j++ )
442         pVersionMap3[i] = j;
443 
444     //  vierte Map: ATTR_ROTATE_VALUE und ATTR_ROTATE_MODE ab 367 eingefuegt
445 
446     const sal_uInt16 nMap4Start = 100;  // ATTR_STARTINDEX
447     const sal_uInt16 nMap4End   = 161;  // ATTR_ENDINDEX
448     const sal_uInt16 nMap4Count = nMap4End - nMap4Start + 1;
449     const sal_uInt16 nMap4New   = 14;   // ATTR_ROTATE_VALUE - ATTR_STARTINDEX
450     pVersionMap4 = new sal_uInt16 [ nMap4Count ];
451     for ( i=0, j=nMap4Start; i < nMap4New; i++, j++ )
452         pVersionMap4[i] = j;
453     // zwei Eintraege eingefuegt...
454     for ( i=nMap4New, j=nMap4Start+nMap4New+2; i < nMap4Count; i++, j++ )
455         pVersionMap4[i] = j;
456 
457     //  fifth map: CJK..., CTL..., EMPHASISMARK, TWOLINES (12 items) added in 614
458 
459     const sal_uInt16 nMap5Start = 100;  // ATTR_STARTINDEX
460     const sal_uInt16 nMap5End   = 163;  // ATTR_ENDINDEX
461     const sal_uInt16 nMap5Count = nMap5End - nMap5Start + 1;
462     const sal_uInt16 nMap5New   = 10;   // ATTR_CJK_FONT - ATTR_STARTINDEX
463     pVersionMap5 = new sal_uInt16 [ nMap5Count ];
464     for ( i=0, j=nMap5Start; i < nMap5New; i++, j++ )
465         pVersionMap5[i] = j;
466     // 12 entries inserted
467     for ( i=nMap5New, j=nMap5Start+nMap5New+12; i < nMap5Count; i++, j++ )
468         pVersionMap5[i] = j;
469 
470     // sixth map: ATTR_SCRIPTSPACE, ATTR_HANGPUNCTUATION, ATTR_FORBIDDEN_RULES added in 614d
471 
472     const sal_uInt16 nMap6Start = 100;  // ATTR_STARTINDEX
473     const sal_uInt16 nMap6End   = 175;  // ATTR_ENDINDEX
474     const sal_uInt16 nMap6Count = nMap6End - nMap6Start + 1;
475     const sal_uInt16 nMap6New   = 22;   // ATTR_SCRIPTSPACE - ATTR_STARTINDEX
476     pVersionMap6 = new sal_uInt16 [ nMap6Count ];
477     for ( i=0, j=nMap6Start; i < nMap6New; i++, j++ )
478         pVersionMap6[i] = j;
479     // 3 entries inserted
480     for ( i=nMap6New, j=nMap6Start+nMap6New+3; i < nMap6Count; i++, j++ )
481         pVersionMap6[i] = j;
482 
483     //  seventh map: ATTR_FONT_WORDLINE, ATTR_FONT_RELIEF, ATTR_HYPHENATE added in 632b
484 
485     const sal_uInt16 nMap7Start = 100;  // ATTR_STARTINDEX
486     const sal_uInt16 nMap7End   = 178;  // ATTR_ENDINDEX
487     const sal_uInt16 nMap7Count = nMap7End - nMap7Start + 1;
488     const sal_uInt16 nMap7New   = 22;   // ATTR_FONT_WORDLINE - ATTR_STARTINDEX
489     pVersionMap7 = new sal_uInt16 [ nMap7Count ];
490     for ( i=0, j=nMap7Start; i < nMap7New; i++, j++ )
491         pVersionMap7[i] = j;
492     // 3 entries inserted
493     for ( i=nMap7New, j=nMap7Start+nMap7New+3; i < nMap7Count; i++, j++ )
494         pVersionMap7[i] = j;
495 
496     //  eighth map: ATTR_VERTICAL_ASIAN added in 642q
497 
498     const sal_uInt16 nMap8Start = 100;  // ATTR_STARTINDEX
499     const sal_uInt16 nMap8End   = 181;  // ATTR_ENDINDEX
500     const sal_uInt16 nMap8Count = nMap8End - nMap8Start + 1;
501     const sal_uInt16 nMap8New   = 34;   // ATTR_VERTICAL_ASIAN - ATTR_STARTINDEX
502     pVersionMap8 = new sal_uInt16 [ nMap8Count ];
503     for ( i=0, j=nMap8Start; i < nMap8New; i++, j++ )
504         pVersionMap8[i] = j;
505     // 1 entry inserted
506     for ( i=nMap8New, j=nMap8Start+nMap8New+1; i < nMap8Count; i++, j++ )
507         pVersionMap8[i] = j;
508 
509     //  9th map: ATTR_WRITINGDIR added in 643y
510 
511     const sal_uInt16 nMap9Start = 100;  // ATTR_STARTINDEX
512     const sal_uInt16 nMap9End   = 182;  // ATTR_ENDINDEX
513     const sal_uInt16 nMap9Count = nMap9End - nMap9Start + 1;
514     const sal_uInt16 nMap9New   = 35;   // ATTR_WRITINGDIR - ATTR_STARTINDEX
515     pVersionMap9 = new sal_uInt16 [ nMap9Count ];
516     for ( i=0, j=nMap9Start; i < nMap9New; i++, j++ )
517         pVersionMap9[i] = j;
518     // 1 entry inserted
519     for ( i=nMap9New, j=nMap9Start+nMap9New+1; i < nMap9Count; i++, j++ )
520         pVersionMap9[i] = j;
521 
522     // ATTR_PAGE_SCALETO added in 680/sab008
523 
524     // 10th map: ATTR_SHRINKTOFIT, ATTR_BORDER_TL_BR, ATTR_BORDER_BL_TR added in 680/dr14
525 
526     const sal_uInt16 nMap10Start = 100;  // ATTR_STARTINDEX
527     const sal_uInt16 nMap10End   = 184;  // ATTR_ENDINDEX
528     const sal_uInt16 nMap10Count = nMap10End - nMap10Start + 1;
529     const sal_uInt16 nMap10New   = 37;   // ATTR_SHRINKTOFIT - ATTR_STARTINDEX
530     pVersionMap10 = new sal_uInt16 [ nMap10Count ];
531     for ( i=0, j=nMap10Start; i < nMap10New; i++, j++ )
532         pVersionMap10[i] = j;
533     // 3 entries inserted
534     for ( i=nMap10New, j=nMap10Start+nMap10New+3; i < nMap10Count; i++, j++ )
535         pVersionMap10[i] = j;
536 
537     // 11th map: ATTR_FONT_OVERLINE added in DEV300/overline2
538 
539     const sal_uInt16 nMap11Start = 100;  // ATTR_STARTINDEX
540     const sal_uInt16 nMap11End   = 187;  // ATTR_ENDINDEX
541     const sal_uInt16 nMap11Count = nMap11End - nMap11Start + 1;
542     const sal_uInt16 nMap11New   = 5;    // ATTR_FONT_OVERLINE - ATTR_STARTINDEX
543     pVersionMap11 = new sal_uInt16 [ nMap11Count ];
544     for ( i=0, j=nMap11Start; i < nMap11New; i++, j++ )
545         pVersionMap11[i] = j;
546     // 1 entry inserted
547     for ( i=nMap11New, j=nMap11Start+nMap11New+1; i < nMap11Count; i++, j++ )
548         pVersionMap11[i] = j;
549 }
550 
551 void ScDocumentPool::DeleteVersionMaps()
552 {
553     DBG_ASSERT( pVersionMap1 && pVersionMap2 &&
554                 pVersionMap3 && pVersionMap4 &&
555                 pVersionMap5 && pVersionMap6 &&
556                 pVersionMap7 && pVersionMap8 &&
557                 pVersionMap9 && pVersionMap10 &&
558                 pVersionMap11, "DeleteVersionMaps without maps" );
559 
560     delete[] pVersionMap11;
561     pVersionMap11 = 0;
562     delete[] pVersionMap10;
563     pVersionMap10 = 0;
564     delete[] pVersionMap9;
565     pVersionMap9 = 0;
566     delete[] pVersionMap8;
567     pVersionMap8 = 0;
568     delete[] pVersionMap7;
569     pVersionMap7 = 0;
570     delete[] pVersionMap6;
571     pVersionMap6 = 0;
572     delete[] pVersionMap5;
573     pVersionMap5 = 0;
574     delete[] pVersionMap4;
575     pVersionMap4 = 0;
576     delete[] pVersionMap3;
577     pVersionMap3 = 0;
578     delete[] pVersionMap2;
579     pVersionMap2 = 0;
580     delete[] pVersionMap1;
581     pVersionMap1 = 0;
582 }
583 
584 // ----------------------------------------------------------------------------------------
585 //
586 //  Fuer die Pattern-Attribute (SetItems) kann der sal_uInt16 RefCount leicht ueberlaufen
587 //  (z.B. 600 ganze Zeilen abwechselnd formatieren).
588 //  Darum wird der RefCount bei SC_MAX_POOLREF festgehalten und nicht mehr hoch- oder
589 //  heruntergezaehlt. Dieser RefCount wird dann erst beim naechsten Laden neu gezaehlt.
590 //  Die Differenz zwischen SC_MAX_POOLREF und SC_SAFE_POOLREF ist ein wenig groesser
591 //  als noetig, um zu erkennen, wenn der RefCount aus Versehen doch "normal" veraendert
592 //  wird (Assertions).
593 //
594 
595 const SfxPoolItem& __EXPORT ScDocumentPool::Put( const SfxPoolItem& rItem, sal_uInt16 nWhich )
596 {
597     if ( rItem.Which() != ATTR_PATTERN )                // nur Pattern ist special
598         return SfxItemPool::Put( rItem, nWhich );
599 
600     //  das Default-Pattern dieses Pools nicht kopieren
601     if (&rItem == ppPoolDefaults[ ATTR_PATTERN - ATTR_STARTINDEX ])
602         return rItem;
603 
604     //  ansonsten muss Put immer passieren, weil es ein anderer Pool sein kann
605     const SfxPoolItem& rNew = SfxItemPool::Put( rItem, nWhich );
606     CheckRef( rNew );
607     return rNew;
608 }
609 
610 void __EXPORT ScDocumentPool::Remove( const SfxPoolItem& rItem )
611 {
612     if ( rItem.Which() == ATTR_PATTERN )                // nur Pattern ist special
613     {
614         sal_uLong nRef = rItem.GetRefCount();
615         if ( nRef >= (sal_uLong) SC_MAX_POOLREF && nRef <= (sal_uLong) SFX_ITEMS_OLD_MAXREF )
616         {
617             if ( nRef != (sal_uLong) SC_SAFE_POOLREF )
618             {
619                 DBG_ERROR("Wer fummelt da an meinen Ref-Counts herum");
620                 SetRefCount( (SfxPoolItem&)rItem, (sal_uLong) SC_SAFE_POOLREF );
621             }
622             return;                 // nicht herunterzaehlen
623         }
624     }
625     SfxItemPool::Remove( rItem );
626 }
627 
628 void ScDocumentPool::CheckRef( const SfxPoolItem& rItem )   // static
629 {
630     sal_uLong nRef = rItem.GetRefCount();
631     if ( nRef >= (sal_uLong) SC_MAX_POOLREF && nRef <= (sal_uLong) SFX_ITEMS_OLD_MAXREF )
632     {
633         // beim Apply vom Cache wird evtl. um 2 hochgezaehlt (auf MAX+1 oder SAFE+2),
634         // heruntergezaehlt wird nur einzeln (in LoadCompleted)
635         DBG_ASSERT( nRef<=(sal_uLong)SC_MAX_POOLREF+1 || (nRef>=(sal_uLong)SC_SAFE_POOLREF-1 && nRef<=(sal_uLong)SC_SAFE_POOLREF+2),
636                 "ScDocumentPool::CheckRef" );
637         SetRefCount( (SfxPoolItem&)rItem, (sal_uLong) SC_SAFE_POOLREF );
638     }
639 }
640 
641 // ----------------------------------------------------------------------------------------
642 
643 void ScDocumentPool::StyleDeleted( ScStyleSheet* pStyle )
644 {
645     sal_uInt32 nCount = GetItemCount2(ATTR_PATTERN);
646     for (sal_uInt32 i=0; i<nCount; i++)
647     {
648         ScPatternAttr* pPattern = (ScPatternAttr*)GetItem2(ATTR_PATTERN, i);
649         if ( pPattern && pPattern->GetStyleSheet() == pStyle )
650             pPattern->StyleToName();
651     }
652 }
653 
654 void ScDocumentPool::CellStyleCreated( const String& rName )
655 {
656     // If a style was created, don't keep any pattern with its name string in the pool,
657     // because it would compare equal to a pattern with a pointer to the new style.
658     // Calling StyleSheetChanged isn't enough because the pool may still contain items
659     // for undo or clipboard content.
660 
661     sal_uInt32 nCount = GetItemCount2(ATTR_PATTERN);
662     for (sal_uInt32 i=0; i<nCount; i++)
663     {
664         ScPatternAttr *const pPattern =
665             const_cast<ScPatternAttr*>(
666                 static_cast<ScPatternAttr const*>(GetItem2(ATTR_PATTERN, i)));
667         if ( pPattern && pPattern->GetStyleSheet() == NULL )
668         {
669             const String* pStyleName = pPattern->GetStyleName();
670             if ( pStyleName && *pStyleName == rName )
671                 pPattern->UpdateStyleSheet();           // find and store style pointer
672         }
673     }
674 }
675 
676 SfxItemPool* __EXPORT ScDocumentPool::Clone() const
677 {
678     return new SfxItemPool (*this, sal_True);
679 }
680 
681 SfxItemPresentation lcl_HFPresentation
682 (
683     const SfxPoolItem&  rItem,
684     SfxItemPresentation ePresentation,
685     SfxMapUnit          eCoreMetric,
686     SfxMapUnit          ePresentationMetric,
687     String&             rText,
688     const IntlWrapper* pIntl
689 )
690 {
691     const SfxItemSet& rSet = ((const SfxSetItem&)rItem).GetItemSet();
692     const SfxPoolItem* pItem;
693 
694     if ( SFX_ITEM_SET == rSet.GetItemState(ATTR_PAGE_ON,sal_False,&pItem) )
695     {
696         if( sal_False == ((const SfxBoolItem*)pItem)->GetValue() )
697             return SFX_ITEM_PRESENTATION_NONE;
698     }
699 
700     SfxItemIter aIter( rSet );
701     pItem = aIter.FirstItem();
702     String  aText;
703     String  aDel = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM( " + " ));
704 
705     while( pItem )
706     {
707         sal_uInt16 nWhich = pItem->Which();
708 
709         aText.Erase();
710 
711         switch( nWhich )
712         {
713             case ATTR_PAGE_ON:
714             case ATTR_PAGE_DYNAMIC:
715             case ATTR_PAGE_SHARED:
716             break;
717 
718             case ATTR_LRSPACE:
719             {
720                 SvxLRSpaceItem& rLRItem = (SvxLRSpaceItem&)*pItem;
721                 sal_uInt16 nPropLeftMargin  = rLRItem.GetPropLeft();
722                 sal_uInt16 nPropRightMargin = rLRItem.GetPropRight();
723                 sal_uInt16 nLeftMargin, nRightMargin;
724                 long nTmp;
725                 nTmp = rLRItem.GetLeft();
726                 nLeftMargin = nTmp < 0 ? 0 : sal_uInt16(nTmp);
727                 nTmp = rLRItem.GetRight();
728                 nRightMargin = nTmp < 0 ? 0 : sal_uInt16(nTmp);
729 
730                 aText = EE_RESSTR(RID_SVXITEMS_LRSPACE_LEFT);
731                 if ( 100 != nPropLeftMargin )
732                 {
733                     aText += String::CreateFromInt32( nPropLeftMargin );
734                     aText += '%';
735                 }
736                 else
737                 {
738                     aText += GetMetricText( (long)nLeftMargin,
739                                            eCoreMetric, ePresentationMetric, pIntl );
740                     aText += EE_RESSTR(GetMetricId(ePresentationMetric));
741                 }
742                 aText += cpDelim;
743 
744                 // nPropFirstLineOfst haben wir nicht
745 
746                 aText += EE_RESSTR(RID_SVXITEMS_LRSPACE_RIGHT);
747                 if ( 100 != nPropRightMargin )
748                 {
749                     aText += String::CreateFromInt32( nPropRightMargin );
750                     aText += '%';
751                 }
752                 else
753                 {
754                     aText += GetMetricText( (long)nRightMargin,
755                                             eCoreMetric, ePresentationMetric, pIntl );
756                     aText += EE_RESSTR(GetMetricId(ePresentationMetric));
757                 }
758             }
759             break;
760 
761             default:
762                 if ( !pIntl )
763                     pIntl = ScGlobal::GetScIntlWrapper();
764                 pItem->GetPresentation( ePresentation, eCoreMetric, ePresentationMetric, aText, pIntl );
765 
766         }
767 
768         if ( aText.Len() )
769         {
770             rText += aText;
771             rText += aDel;
772         }
773 
774         pItem = aIter.NextItem();
775     }
776 
777     rText.EraseTrailingChars();
778     rText.EraseTrailingChars( '+' );
779     rText.EraseTrailingChars();
780 
781     return ePresentation;
782 }
783 
784 SfxItemPresentation __EXPORT ScDocumentPool::GetPresentation(
785     const SfxPoolItem&  rItem,
786     SfxItemPresentation ePresentation,
787     SfxMapUnit          ePresentationMetric,
788     String&             rText,
789     const IntlWrapper* pIntl ) const
790 {
791     sal_uInt16  nW = rItem.Which();
792     String aStrYes  ( ScGlobal::GetRscString(STR_YES) );
793     String aStrNo   ( ScGlobal::GetRscString(STR_NO) );
794     String aStrSep = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM(": "));
795 
796     switch( nW )
797     {
798         case ATTR_PAGE_TOPDOWN:
799         switch ( ePresentation )
800         {
801             case SFX_ITEM_PRESENTATION_COMPLETE:
802             rText  = ScGlobal::GetRscString(STR_SCATTR_PAGE_PRINTDIR);
803             rText += aStrSep;
804 //          break; // DURCHFALLEN!!!
805             case SFX_ITEM_PRESENTATION_NAMELESS:
806             rText += ((const SfxBoolItem&)rItem).GetValue() ?
807                 ScGlobal::GetRscString(STR_SCATTR_PAGE_TOPDOWN) :
808                 ScGlobal::GetRscString(STR_SCATTR_PAGE_LEFTRIGHT) ;
809             break;
810             default:
811             {
812                 // added to avoid warnings
813             }
814         }
815         break;
816 
817         case ATTR_PAGE_HEADERS:
818         switch ( ePresentation )
819         {
820             case SFX_ITEM_PRESENTATION_COMPLETE:
821             rText  = ScGlobal::GetRscString(STR_SCATTR_PAGE_HEADERS);
822             rText += aStrSep;
823 //          break; // DURCHFALLEN!!!
824             case SFX_ITEM_PRESENTATION_NAMELESS:
825             rText += ((const SfxBoolItem&)rItem).GetValue() ? aStrYes : aStrNo ;
826             break;
827             default:
828             {
829                 // added to avoid warnings
830             }
831         }
832         break;
833 
834         case ATTR_PAGE_NULLVALS:
835         switch ( ePresentation )
836         {
837             case SFX_ITEM_PRESENTATION_COMPLETE:
838             rText  = ScGlobal::GetRscString(STR_SCATTR_PAGE_NULLVALS);
839             rText += aStrSep;
840 //          break; // DURCHFALLEN!!!
841             case SFX_ITEM_PRESENTATION_NAMELESS:
842             rText += ((const SfxBoolItem&)rItem).GetValue() ? aStrYes : aStrNo ;
843             break;
844             default:
845             {
846                 // added to avoid warnings
847             }
848         }
849         break;
850 
851         case ATTR_PAGE_FORMULAS:
852         switch ( ePresentation )
853         {
854             case SFX_ITEM_PRESENTATION_COMPLETE:
855             rText  = ScGlobal::GetRscString(STR_SCATTR_PAGE_FORMULAS);
856             rText += aStrSep;
857 //          break; // DURCHFALLEN!!!
858             case SFX_ITEM_PRESENTATION_NAMELESS:
859             rText += ((const SfxBoolItem&)rItem).GetValue() ? aStrYes : aStrNo ;
860             break;
861             default:
862             {
863                 // added to avoid warnings
864             }
865         }
866         break;
867 
868         case ATTR_PAGE_NOTES:
869         switch ( ePresentation )
870         {
871             case SFX_ITEM_PRESENTATION_COMPLETE:
872             rText  = ScGlobal::GetRscString(STR_SCATTR_PAGE_NOTES);
873             rText += aStrSep;
874 //          break; // DURCHFALLEN!!!
875             case SFX_ITEM_PRESENTATION_NAMELESS:
876             rText += ((const SfxBoolItem&)rItem).GetValue() ? aStrYes : aStrNo ;
877             break;
878             default:
879             {
880                 // added to avoid warnings
881             }
882         }
883         break;
884 
885         case ATTR_PAGE_GRID:
886         switch ( ePresentation )
887         {
888             case SFX_ITEM_PRESENTATION_COMPLETE:
889             rText  = ScGlobal::GetRscString(STR_SCATTR_PAGE_GRID);
890             rText += aStrSep;
891 //          break; // DURCHFALLEN!!!
892             case SFX_ITEM_PRESENTATION_NAMELESS:
893             rText += ((const SfxBoolItem&)rItem).GetValue() ? aStrYes : aStrNo ;
894             break;
895             default:
896             {
897                 // added to avoid warnings
898             }
899         }
900         break;
901 
902         case ATTR_PAGE_SCALETOPAGES:
903         {
904             sal_uInt16  nPagNo = ((const SfxUInt16Item&)rItem).GetValue();
905 
906             if( nPagNo )
907             {
908                 switch ( ePresentation )
909                 {
910                     case SFX_ITEM_PRESENTATION_COMPLETE:
911                     {
912                         rText.Assign( ScGlobal::GetRscString( STR_SCATTR_PAGE_SCALETOPAGES ) ).Append( aStrSep );
913                     }
914 //                  break; // DURCHFALLEN!!!
915                     case SFX_ITEM_PRESENTATION_NAMELESS:
916                     {
917                         String aPages( ScGlobal::GetRscString( STR_SCATTR_PAGE_SCALE_PAGES ) );
918                         aPages.SearchAndReplaceAscii( "%1", String::CreateFromInt32( nPagNo ) );
919                         rText.Append( aPages );
920                     }
921                     break;
922                     default:
923                     {
924                         // added to avoid warnings
925                     }
926                 }
927             }
928             else
929             {
930                 ePresentation = SFX_ITEM_PRESENTATION_NONE;
931             }
932         }
933         break;
934 
935         case ATTR_PAGE_FIRSTPAGENO:
936         {
937             sal_uInt16  nPagNo = ((const SfxUInt16Item&)rItem).GetValue();
938 
939             if( nPagNo )
940             {
941                 switch ( ePresentation )
942                 {
943                     case SFX_ITEM_PRESENTATION_COMPLETE:
944                     rText  = ScGlobal::GetRscString(STR_SCATTR_PAGE_FIRSTPAGENO);
945                     rText += aStrSep;
946 //                  break; // DURCHFALLEN!!!
947                     case SFX_ITEM_PRESENTATION_NAMELESS:
948                     rText += String::CreateFromInt32( nPagNo );
949                     break;
950                     default:
951                     {
952                         // added to avoid warnings
953                     }
954                 }
955             }
956             else
957             {
958                 ePresentation = SFX_ITEM_PRESENTATION_NONE;
959             }
960         }
961         break;
962 
963         case ATTR_PAGE_SCALE:
964         {
965             sal_uInt16  nPercent = ((const SfxUInt16Item&)rItem).GetValue();
966 
967             if( nPercent )
968             {
969                 switch ( ePresentation )
970                 {
971                     case SFX_ITEM_PRESENTATION_COMPLETE:
972                     rText  = ScGlobal::GetRscString(STR_SCATTR_PAGE_SCALE);
973                     rText += aStrSep;
974 //                  break; // DURCHFALLEN!!!
975                     case SFX_ITEM_PRESENTATION_NAMELESS:
976                     rText += String::CreateFromInt32( nPercent );
977                     rText += '%';
978                     break;
979                     default:
980                     {
981                         // added to avoid warnings
982                     }
983                 }
984             }
985             else
986             {
987                 ePresentation = SFX_ITEM_PRESENTATION_NONE;
988             }
989         }
990         break;
991 
992         case ATTR_PAGE_HEADERSET:
993         {
994             String  aBuffer;
995 
996             if( lcl_HFPresentation( rItem, ePresentation, GetMetric( nW ), ePresentationMetric, aBuffer, pIntl ) != SFX_ITEM_PRESENTATION_NONE )
997             {
998                 rText  = ScGlobal::GetRscString(STR_HEADER);
999                 rText.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " ( " ));
1000                 rText += aBuffer;
1001                 rText.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " ) " ));
1002             }
1003         }
1004         break;
1005 
1006         case ATTR_PAGE_FOOTERSET:
1007         {
1008             String  aBuffer;
1009 
1010             if( lcl_HFPresentation( rItem, ePresentation, GetMetric( nW ), ePresentationMetric, aBuffer, pIntl ) != SFX_ITEM_PRESENTATION_NONE )
1011             {
1012                 rText  = ScGlobal::GetRscString(STR_FOOTER);
1013                 rText.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " ( " ));
1014                 rText += aBuffer;
1015                 rText.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " ) " ));
1016             }
1017         }
1018         break;
1019 
1020 /*
1021         case ATTR_PAGE_HEADERLEFT:
1022         rText = "SID_SCATTR_PAGE_HEADERLEFT";
1023         break;
1024 
1025         case ATTR_PAGE_FOOTERLEFT:
1026         rText = "SID_SCATTR_PAGE_FOOTERLEFT";
1027         break;
1028 
1029         case ATTR_PAGE_HEADERRIGHT:
1030         rText = "SID_SCATTR_PAGE_HEADERRIGHT";
1031         break;
1032 
1033         case ATTR_PAGE_FOOTERRIGHT:
1034         rText = "SID_SCATTR_PAGE_FOOTERRIGHT";
1035         break;
1036 */
1037 
1038         default:
1039             if ( !pIntl )
1040                 pIntl = ScGlobal::GetScIntlWrapper();
1041             ePresentation = rItem.GetPresentation( ePresentation, GetMetric( nW ), ePresentationMetric, rText, pIntl );
1042         break;
1043     }
1044 
1045     return ePresentation;
1046 }
1047 
1048 SfxMapUnit __EXPORT ScDocumentPool::GetMetric( sal_uInt16 nWhich ) const
1049 {
1050     //  eigene Attribute: Twips, alles andere 1/100 mm
1051 
1052     if ( nWhich >= ATTR_STARTINDEX && nWhich <= ATTR_ENDINDEX )
1053         return SFX_MAPUNIT_TWIP;
1054     else
1055         return SFX_MAPUNIT_100TH_MM;
1056 }
1057 
1058 
1059 
1060 
1061 
1062