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 // MARKER(update_precomp.py): autogen include statement, do not remove
23 #include "precompiled_sc.hxx"
24 #include "scextopt.hxx"
25
26 #include <vector>
27 #include <map>
28 #include <boost/shared_ptr.hpp>
29
30 // ============================================================================
31
ScExtDocSettings()32 ScExtDocSettings::ScExtDocSettings() :
33 mfTabBarWidth( -1.0 ),
34 mnLinkCnt( 0 ),
35 mnDisplTab( 0 )
36 {
37 }
38
39 // ============================================================================
40
ScExtTabSettings()41 ScExtTabSettings::ScExtTabSettings() :
42 maUsedArea( ScAddress::INITIALIZE_INVALID ),
43 maCursor( ScAddress::INITIALIZE_INVALID ),
44 maFirstVis( ScAddress::INITIALIZE_INVALID ),
45 maSecondVis( ScAddress::INITIALIZE_INVALID ),
46 maFreezePos( 0, 0, 0 ),
47 maSplitPos( 0, 0 ),
48 meActivePane( SCEXT_PANE_TOPLEFT ),
49 maGridColor( COL_AUTO ),
50 mnNormalZoom( 0 ),
51 mnPageZoom( 0 ),
52 mbSelected( false ),
53 mbFrozenPanes( false ),
54 mbPageMode( false )
55 {
56 }
57
58 // ============================================================================
59
60 /** A container for ScExtTabSettings objects.
61 @descr Internally, a std::map with shared pointers to ScExtTabSettings is
62 used. The copy constructor and assignment operator make deep copies of the
63 objects. */
64 class ScExtTabSettingsCont
65 {
66 public:
67 explicit ScExtTabSettingsCont();
68 ScExtTabSettingsCont( const ScExtTabSettingsCont& rSrc );
69 ScExtTabSettingsCont& operator=( const ScExtTabSettingsCont& rSrc );
70
71 const ScExtTabSettings* GetTabSettings( SCTAB nTab ) const;
72 ScExtTabSettings& GetOrCreateTabSettings( SCTAB nTab );
73
74 private:
75 typedef ::boost::shared_ptr< ScExtTabSettings > ScExtTabSettingsRef;
76 typedef ::std::map< SCTAB, ScExtTabSettingsRef > ScExtTabSettingsMap;
77
78 /** Makes a deep copy of all objects in the passed map. */
79 void CopyFromMap( const ScExtTabSettingsMap& rMap );
80
81 ScExtTabSettingsMap maMap;
82 };
83
84 // ----------------------------------------------------------------------------
85
ScExtTabSettingsCont()86 ScExtTabSettingsCont::ScExtTabSettingsCont()
87 {
88 }
89
ScExtTabSettingsCont(const ScExtTabSettingsCont & rSrc)90 ScExtTabSettingsCont::ScExtTabSettingsCont( const ScExtTabSettingsCont& rSrc )
91 {
92 CopyFromMap( rSrc.maMap );
93 }
94
operator =(const ScExtTabSettingsCont & rSrc)95 ScExtTabSettingsCont& ScExtTabSettingsCont::operator=( const ScExtTabSettingsCont& rSrc )
96 {
97 CopyFromMap( rSrc.maMap );
98 return *this;
99 }
100
GetTabSettings(SCTAB nTab) const101 const ScExtTabSettings* ScExtTabSettingsCont::GetTabSettings( SCTAB nTab ) const
102 {
103 ScExtTabSettingsMap::const_iterator aIt = maMap.find( nTab );
104 return (aIt == maMap.end()) ? 0 : aIt->second.get();
105 }
106
GetOrCreateTabSettings(SCTAB nTab)107 ScExtTabSettings& ScExtTabSettingsCont::GetOrCreateTabSettings( SCTAB nTab )
108 {
109 ScExtTabSettingsRef& rxTabSett = maMap[ nTab ];
110 if( !rxTabSett )
111 rxTabSett.reset( new ScExtTabSettings );
112 return *rxTabSett;
113 }
114
CopyFromMap(const ScExtTabSettingsMap & rMap)115 void ScExtTabSettingsCont::CopyFromMap( const ScExtTabSettingsMap& rMap )
116 {
117 maMap.clear();
118 for( ScExtTabSettingsMap::const_iterator aIt = rMap.begin(), aEnd = rMap.end(); aIt != aEnd; ++aIt )
119 maMap[ aIt->first ].reset( new ScExtTabSettings( *aIt->second ) );
120 }
121
122 // ============================================================================
123
124 /** Implementation struct for ScExtDocOptions containing all members. */
125 struct ScExtDocOptionsImpl
126 {
127 typedef ::std::vector< String > StringVec;
128
129 ScExtDocSettings maDocSett; // Global document settings.
130 ScExtTabSettingsCont maTabSett; // Settings for all sheets.
131 StringVec maCodeNames; // Codenames for all sheets (VBA module names).
132 bool mbChanged; // Use only if something has been changed.
133
134 explicit ScExtDocOptionsImpl();
135 };
136
ScExtDocOptionsImpl()137 ScExtDocOptionsImpl::ScExtDocOptionsImpl() :
138 mbChanged( false )
139 {
140 }
141
142 // ----------------------------------------------------------------------------
143
ScExtDocOptions()144 ScExtDocOptions::ScExtDocOptions() :
145 mxImpl( new ScExtDocOptionsImpl )
146 {
147 }
148
ScExtDocOptions(const ScExtDocOptions & rSrc)149 ScExtDocOptions::ScExtDocOptions( const ScExtDocOptions& rSrc ) :
150 mxImpl( new ScExtDocOptionsImpl( *rSrc.mxImpl ) )
151 {
152 }
153
~ScExtDocOptions()154 ScExtDocOptions::~ScExtDocOptions()
155 {
156 }
157
operator =(const ScExtDocOptions & rSrc)158 ScExtDocOptions& ScExtDocOptions::operator=( const ScExtDocOptions& rSrc )
159 {
160 *mxImpl = *rSrc.mxImpl;
161 return *this;
162 }
163
IsChanged() const164 bool ScExtDocOptions::IsChanged() const
165 {
166 return mxImpl->mbChanged;
167 }
168
SetChanged(bool bChanged)169 void ScExtDocOptions::SetChanged( bool bChanged )
170 {
171 mxImpl->mbChanged = bChanged;
172 }
173
GetDocSettings() const174 const ScExtDocSettings& ScExtDocOptions::GetDocSettings() const
175 {
176 return mxImpl->maDocSett;
177 }
178
GetDocSettings()179 ScExtDocSettings& ScExtDocOptions::GetDocSettings()
180 {
181 return mxImpl->maDocSett;
182 }
183
GetTabSettings(SCTAB nTab) const184 const ScExtTabSettings* ScExtDocOptions::GetTabSettings( SCTAB nTab ) const
185 {
186 return mxImpl->maTabSett.GetTabSettings( nTab );
187 }
188
GetOrCreateTabSettings(SCTAB nTab)189 ScExtTabSettings& ScExtDocOptions::GetOrCreateTabSettings( SCTAB nTab )
190 {
191 return mxImpl->maTabSett.GetOrCreateTabSettings( nTab );
192 }
193
GetCodeNameCount() const194 SCTAB ScExtDocOptions::GetCodeNameCount() const
195 {
196 return static_cast< SCTAB >( mxImpl->maCodeNames.size() );
197 }
198
GetCodeName(SCTAB nTab) const199 const String& ScExtDocOptions::GetCodeName( SCTAB nTab ) const
200 {
201 DBG_ASSERT( (0 <= nTab) && (nTab < GetCodeNameCount()), "ScExtDocOptions::GetCodeName - invalid sheet index" );
202 return ((0 <= nTab) && (nTab < GetCodeNameCount())) ? mxImpl->maCodeNames[ static_cast< size_t >( nTab ) ] : EMPTY_STRING;
203 }
204
SetCodeName(SCTAB nTab,const String & rCodeName)205 void ScExtDocOptions::SetCodeName( SCTAB nTab, const String& rCodeName )
206 {
207 DBG_ASSERT( nTab >= 0, "ScExtDocOptions::SetCodeName - invalid sheet index" );
208 if( nTab >= 0 )
209 {
210 size_t nIndex = static_cast< size_t >( nTab );
211 if( nIndex >= mxImpl->maCodeNames.size() )
212 mxImpl->maCodeNames.resize( nIndex + 1 );
213 mxImpl->maCodeNames[ nIndex ] = rCodeName;
214 }
215 }
216
217 /* vim: set noet sw=4 ts=4: */
218