xref: /AOO41X/main/oox/source/xls/worksheetsettings.cxx (revision e1d5bd03a6ea7ac2b26b792c9e2a94e9f347a43b)
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 #include "oox/xls/worksheetsettings.hxx"
25 
26 #include <com/sun/star/util/XProtectable.hpp>
27 #include "oox/core/filterbase.hxx"
28 #include "oox/helper/attributelist.hxx"
29 #include "oox/xls/biffinputstream.hxx"
30 #include "oox/xls/pagesettings.hxx"
31 #include "oox/xls/workbooksettings.hxx"
32 
33 namespace oox {
34 namespace xls {
35 
36 // ============================================================================
37 
38 using namespace ::com::sun::star::beans;
39 using namespace ::com::sun::star::uno;
40 using namespace ::com::sun::star::util;
41 
42 using ::oox::core::CodecHelper;
43 using ::rtl::OUString;
44 
45 // ============================================================================
46 
47 namespace {
48 
49 const sal_uInt8 BIFF12_SHEETPR_FILTERMODE       = 0x01;
50 const sal_uInt8 BIFF12_SHEETPR_EVAL_CF          = 0x02;
51 
52 const sal_uInt32 BIFF_SHEETEXT_NOTABCOLOR       = 0x7F;
53 
54 const sal_uInt16 BIFF_SHEETPR_DIALOGSHEET       = 0x0010;
55 const sal_uInt16 BIFF_SHEETPR_APPLYSTYLES       = 0x0020;
56 const sal_uInt16 BIFF_SHEETPR_SYMBOLSBELOW      = 0x0040;
57 const sal_uInt16 BIFF_SHEETPR_SYMBOLSRIGHT      = 0x0080;
58 const sal_uInt16 BIFF_SHEETPR_FITTOPAGES        = 0x0100;
59 const sal_uInt16 BIFF_SHEETPR_SKIPEXT           = 0x0200;       // BIFF3-BIFF4
60 
61 const sal_uInt32 BIFF_SHEETPROT_OBJECTS         = 0x00000001;
62 const sal_uInt32 BIFF_SHEETPROT_SCENARIOS       = 0x00000002;
63 const sal_uInt32 BIFF_SHEETPROT_FORMAT_CELLS    = 0x00000004;
64 const sal_uInt32 BIFF_SHEETPROT_FORMAT_COLUMNS  = 0x00000008;
65 const sal_uInt32 BIFF_SHEETPROT_FORMAT_ROWS     = 0x00000010;
66 const sal_uInt32 BIFF_SHEETPROT_INSERT_COLUMNS  = 0x00000020;
67 const sal_uInt32 BIFF_SHEETPROT_INSERT_ROWS     = 0x00000040;
68 const sal_uInt32 BIFF_SHEETPROT_INSERT_HLINKS   = 0x00000080;
69 const sal_uInt32 BIFF_SHEETPROT_DELETE_COLUMNS  = 0x00000100;
70 const sal_uInt32 BIFF_SHEETPROT_DELETE_ROWS     = 0x00000200;
71 const sal_uInt32 BIFF_SHEETPROT_SELECT_LOCKED   = 0x00000400;
72 const sal_uInt32 BIFF_SHEETPROT_SORT            = 0x00000800;
73 const sal_uInt32 BIFF_SHEETPROT_AUTOFILTER      = 0x00001000;
74 const sal_uInt32 BIFF_SHEETPROT_PIVOTTABLES     = 0x00002000;
75 const sal_uInt32 BIFF_SHEETPROT_SELECT_UNLOCKED = 0x00004000;
76 
77 } // namespace
78 
79 // ============================================================================
80 
81 SheetSettingsModel::SheetSettingsModel() :
82     mbFilterMode( false ),
83     mbApplyStyles( false ),
84     mbSummaryBelow( true ),
85     mbSummaryRight( true )
86 {
87 }
88 
89 // ============================================================================
90 
91 SheetProtectionModel::SheetProtectionModel() :
92     mnPasswordHash( 0 ),
93     mbSheet( false ),
94     mbObjects( false ),
95     mbScenarios( false ),
96     mbFormatCells( true ),
97     mbFormatColumns( true ),
98     mbFormatRows( true ),
99     mbInsertColumns( true ),
100     mbInsertRows( true ),
101     mbInsertHyperlinks( true ),
102     mbDeleteColumns( true ),
103     mbDeleteRows( true ),
104     mbSelectLocked( false ),
105     mbSort( true ),
106     mbAutoFilter( true ),
107     mbPivotTables( true ),
108     mbSelectUnlocked( false )
109 {
110 }
111 
112 // ============================================================================
113 
114 WorksheetSettings::WorksheetSettings( const WorksheetHelper& rHelper ) :
115     WorksheetHelper( rHelper ),
116     maPhoneticSett( rHelper )
117 {
118 }
119 
120 void WorksheetSettings::importSheetPr( const AttributeList& rAttribs )
121 {
122     maSheetSettings.maCodeName = rAttribs.getString( XML_codeName, OUString() );
123     maSheetSettings.mbFilterMode = rAttribs.getBool( XML_filterMode, false );
124 }
125 
126 void WorksheetSettings::importChartSheetPr( const AttributeList& rAttribs )
127 {
128     maSheetSettings.maCodeName = rAttribs.getString( XML_codeName, OUString() );
129 }
130 
131 void WorksheetSettings::importTabColor( const AttributeList& rAttribs )
132 {
133     maSheetSettings.maTabColor.importColor( rAttribs );
134 }
135 
136 void WorksheetSettings::importOutlinePr( const AttributeList& rAttribs )
137 {
138     maSheetSettings.mbApplyStyles  = rAttribs.getBool( XML_applyStyles, false );
139     maSheetSettings.mbSummaryBelow = rAttribs.getBool( XML_summaryBelow, true );
140     maSheetSettings.mbSummaryRight = rAttribs.getBool( XML_summaryRight, true );
141 }
142 
143 void WorksheetSettings::importSheetProtection( const AttributeList& rAttribs )
144 {
145     maSheetProt.mnPasswordHash     = CodecHelper::getPasswordHash( rAttribs, XML_password );
146     maSheetProt.mbSheet            = rAttribs.getBool( XML_sheet, false );
147     maSheetProt.mbObjects          = rAttribs.getBool( XML_objects, false );
148     maSheetProt.mbScenarios        = rAttribs.getBool( XML_scenarios, false );
149     maSheetProt.mbFormatCells      = rAttribs.getBool( XML_formatCells, true );
150     maSheetProt.mbFormatColumns    = rAttribs.getBool( XML_formatColumns, true );
151     maSheetProt.mbFormatRows       = rAttribs.getBool( XML_formatRows, true );
152     maSheetProt.mbInsertColumns    = rAttribs.getBool( XML_insertColumns, true );
153     maSheetProt.mbInsertRows       = rAttribs.getBool( XML_insertRows, true );
154     maSheetProt.mbInsertHyperlinks = rAttribs.getBool( XML_insertHyperlinks, true );
155     maSheetProt.mbDeleteColumns    = rAttribs.getBool( XML_deleteColumns, true );
156     maSheetProt.mbDeleteRows       = rAttribs.getBool( XML_deleteRows, true );
157     maSheetProt.mbSelectLocked     = rAttribs.getBool( XML_selectLockedCells, false );
158     maSheetProt.mbSort             = rAttribs.getBool( XML_sort, true );
159     maSheetProt.mbAutoFilter       = rAttribs.getBool( XML_autoFilter, true );
160     maSheetProt.mbPivotTables      = rAttribs.getBool( XML_pivotTables, true );
161     maSheetProt.mbSelectUnlocked   = rAttribs.getBool( XML_selectUnlockedCells, false );
162 }
163 
164 void WorksheetSettings::importChartProtection( const AttributeList& rAttribs )
165 {
166     maSheetProt.mnPasswordHash = CodecHelper::getPasswordHash( rAttribs, XML_password );
167     maSheetProt.mbSheet        = rAttribs.getBool( XML_content, false );
168     maSheetProt.mbObjects      = rAttribs.getBool( XML_objects, false );
169 }
170 
171 void WorksheetSettings::importPhoneticPr( const AttributeList& rAttribs )
172 {
173     maPhoneticSett.importPhoneticPr( rAttribs );
174 }
175 
176 void WorksheetSettings::importSheetPr( SequenceInputStream& rStrm )
177 {
178     sal_uInt16 nFlags1;
179     sal_uInt8 nFlags2;
180     rStrm >> nFlags1 >> nFlags2 >> maSheetSettings.maTabColor;
181     rStrm.skip( 8 );    // sync anchor cell
182     rStrm >> maSheetSettings.maCodeName;
183     // sheet settings
184     maSheetSettings.mbFilterMode = getFlag( nFlags2, BIFF12_SHEETPR_FILTERMODE );
185     // outline settings, equal flags in all BIFFs
186     maSheetSettings.mbApplyStyles  = getFlag( nFlags1, BIFF_SHEETPR_APPLYSTYLES );
187     maSheetSettings.mbSummaryRight = getFlag( nFlags1, BIFF_SHEETPR_SYMBOLSRIGHT );
188     maSheetSettings.mbSummaryBelow = getFlag( nFlags1, BIFF_SHEETPR_SYMBOLSBELOW );
189     /*  Fit printout to width/height - for whatever reason, this flag is still
190         stored separated from the page settings */
191     getPageSettings().setFitToPagesMode( getFlag( nFlags1, BIFF_SHEETPR_FITTOPAGES ) );
192 }
193 
194 void WorksheetSettings::importChartSheetPr( SequenceInputStream& rStrm )
195 {
196     rStrm.skip( 2 );    // flags, contains only the 'published' flag
197     rStrm >> maSheetSettings.maTabColor >> maSheetSettings.maCodeName;
198 }
199 
200 void WorksheetSettings::importSheetProtection( SequenceInputStream& rStrm )
201 {
202     rStrm >> maSheetProt.mnPasswordHash;
203     // no flags field for all these boolean flags?!?
204     maSheetProt.mbSheet            = rStrm.readInt32() != 0;
205     maSheetProt.mbObjects          = rStrm.readInt32() != 0;
206     maSheetProt.mbScenarios        = rStrm.readInt32() != 0;
207     maSheetProt.mbFormatCells      = rStrm.readInt32() != 0;
208     maSheetProt.mbFormatColumns    = rStrm.readInt32() != 0;
209     maSheetProt.mbFormatRows       = rStrm.readInt32() != 0;
210     maSheetProt.mbInsertColumns    = rStrm.readInt32() != 0;
211     maSheetProt.mbInsertRows       = rStrm.readInt32() != 0;
212     maSheetProt.mbInsertHyperlinks = rStrm.readInt32() != 0;
213     maSheetProt.mbDeleteColumns    = rStrm.readInt32() != 0;
214     maSheetProt.mbDeleteRows       = rStrm.readInt32() != 0;
215     maSheetProt.mbSelectLocked     = rStrm.readInt32() != 0;
216     maSheetProt.mbSort             = rStrm.readInt32() != 0;
217     maSheetProt.mbAutoFilter       = rStrm.readInt32() != 0;
218     maSheetProt.mbPivotTables      = rStrm.readInt32() != 0;
219     maSheetProt.mbSelectUnlocked   = rStrm.readInt32() != 0;
220 }
221 
222 void WorksheetSettings::importChartProtection( SequenceInputStream& rStrm )
223 {
224     rStrm >> maSheetProt.mnPasswordHash;
225     // no flags field for all these boolean flags?!?
226     maSheetProt.mbSheet            = rStrm.readInt32() != 0;
227     maSheetProt.mbObjects          = rStrm.readInt32() != 0;
228 }
229 
230 void WorksheetSettings::importPhoneticPr( SequenceInputStream& rStrm )
231 {
232     maPhoneticSett.importPhoneticPr( rStrm );
233 }
234 
235 void WorksheetSettings::importSheetExt( BiffInputStream& rStrm )
236 {
237     rStrm.skip( 16 );
238     sal_uInt32 nFlags;
239     rStrm >> nFlags;
240     sal_uInt8 nColorIdx = extractValue< sal_uInt8 >( nFlags, 0, 7 );
241     if( nColorIdx != BIFF_SHEETEXT_NOTABCOLOR )
242         maSheetSettings.maTabColor.setPaletteClr( nColorIdx );
243 }
244 
245 void WorksheetSettings::importSheetPr( BiffInputStream& rStrm )
246 {
247     sal_uInt16 nFlags;
248     rStrm >> nFlags;
249     // worksheet vs. dialogsheet
250     if( getFlag( nFlags, BIFF_SHEETPR_DIALOGSHEET ) )
251     {
252         OSL_ENSURE( getSheetType() == SHEETTYPE_WORKSHEET, "WorksheetSettings::importSheetPr - unexpected sheet type" );
253         setSheetType( SHEETTYPE_DIALOGSHEET );
254     }
255     // outline settings
256     maSheetSettings.mbApplyStyles  = getFlag( nFlags, BIFF_SHEETPR_APPLYSTYLES );
257     maSheetSettings.mbSummaryRight = getFlag( nFlags, BIFF_SHEETPR_SYMBOLSRIGHT );
258     maSheetSettings.mbSummaryBelow = getFlag( nFlags, BIFF_SHEETPR_SYMBOLSBELOW );
259     // fit printout to width/height
260     getPageSettings().setFitToPagesMode( getFlag( nFlags, BIFF_SHEETPR_FITTOPAGES ) );
261     // save external linked values, in BIFF5-BIFF8 moved to BOOKBOOK record
262     if( getBiff() <= BIFF4 )
263         getWorkbookSettings().setSaveExtLinkValues( !getFlag( nFlags, BIFF_SHEETPR_SKIPEXT ) );
264 }
265 
266 void WorksheetSettings::importProtect( BiffInputStream& rStrm )
267 {
268     maSheetProt.mbSheet = rStrm.readuInt16() != 0;
269 }
270 
271 void WorksheetSettings::importObjectProtect( BiffInputStream& rStrm )
272 {
273     maSheetProt.mbObjects = rStrm.readuInt16() != 0;
274 }
275 
276 void WorksheetSettings::importScenProtect( BiffInputStream& rStrm )
277 {
278     maSheetProt.mbScenarios = rStrm.readuInt16() != 0;
279 }
280 
281 void WorksheetSettings::importPassword( BiffInputStream& rStrm )
282 {
283     rStrm >> maSheetProt.mnPasswordHash;
284 }
285 
286 void WorksheetSettings::importSheetProtection( BiffInputStream& rStrm )
287 {
288     sal_uInt32 nFlags = rStrm.readuInt32();
289     // set flag means protection is disabled
290     maSheetProt.mbObjects          = !getFlag( nFlags, BIFF_SHEETPROT_OBJECTS );
291     maSheetProt.mbScenarios        = !getFlag( nFlags, BIFF_SHEETPROT_SCENARIOS );
292     maSheetProt.mbFormatCells      = !getFlag( nFlags, BIFF_SHEETPROT_FORMAT_CELLS );
293     maSheetProt.mbFormatColumns    = !getFlag( nFlags, BIFF_SHEETPROT_FORMAT_COLUMNS );
294     maSheetProt.mbFormatRows       = !getFlag( nFlags, BIFF_SHEETPROT_FORMAT_ROWS );
295     maSheetProt.mbInsertColumns    = !getFlag( nFlags, BIFF_SHEETPROT_INSERT_COLUMNS );
296     maSheetProt.mbInsertRows       = !getFlag( nFlags, BIFF_SHEETPROT_INSERT_ROWS );
297     maSheetProt.mbInsertHyperlinks = !getFlag( nFlags, BIFF_SHEETPROT_INSERT_HLINKS );
298     maSheetProt.mbDeleteColumns    = !getFlag( nFlags, BIFF_SHEETPROT_DELETE_COLUMNS );
299     maSheetProt.mbDeleteRows       = !getFlag( nFlags, BIFF_SHEETPROT_DELETE_ROWS );
300     maSheetProt.mbSelectLocked     = !getFlag( nFlags, BIFF_SHEETPROT_SELECT_LOCKED );
301     maSheetProt.mbSort             = !getFlag( nFlags, BIFF_SHEETPROT_SORT );
302     maSheetProt.mbAutoFilter       = !getFlag( nFlags, BIFF_SHEETPROT_AUTOFILTER );
303     maSheetProt.mbPivotTables      = !getFlag( nFlags, BIFF_SHEETPROT_PIVOTTABLES );
304     maSheetProt.mbSelectUnlocked   = !getFlag( nFlags, BIFF_SHEETPROT_SELECT_UNLOCKED );
305 }
306 
307 void WorksheetSettings::importCodeName( BiffInputStream& rStrm )
308 {
309     maSheetSettings.maCodeName = rStrm.readUniString();
310 }
311 
312 void WorksheetSettings::importPhoneticPr( BiffInputStream& rStrm )
313 {
314     maPhoneticSett.importPhoneticPr( rStrm );
315 }
316 
317 void WorksheetSettings::finalizeImport()
318 {
319     // sheet protection
320     if( maSheetProt.mbSheet ) try
321     {
322         Reference< XProtectable > xProtectable( getSheet(), UNO_QUERY_THROW );
323         xProtectable->protect( OUString() );
324     }
325     catch( Exception& )
326     {
327     }
328 
329     // VBA code name
330     PropertySet aPropSet( getSheet() );
331     aPropSet.setProperty( PROP_CodeName, maSheetSettings.maCodeName );
332 
333     // sheet tab color
334     if( !maSheetSettings.maTabColor.isAuto() )
335     {
336         sal_Int32 nColor = maSheetSettings.maTabColor.getColor( getBaseFilter().getGraphicHelper() );
337         aPropSet.setProperty( PROP_TabColor, nColor );
338     }
339 }
340 
341 // ============================================================================
342 
343 } // namespace xls
344 } // namespace oox
345