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 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_unotools.hxx" 26 27 #include <unotools/misccfg.hxx> 28 #include "rtl/instance.hxx" 29 #include <unotools/configmgr.hxx> 30 #include <unotools/configitem.hxx> 31 #include <tools/debug.hxx> 32 #include <com/sun/star/uno/Any.hxx> 33 #include <com/sun/star/uno/Sequence.hxx> 34 #include <vos/mutex.hxx> 35 #include <osl/mutex.hxx> 36 #include <rtl/logfile.hxx> 37 #include "itemholder1.hxx" 38 39 #define DEFAULT_TAB 2000 40 41 #define DEF_INCH 2540L 42 #define DEF_RELTWIP 1440L 43 44 using namespace rtl; 45 using namespace com::sun::star::uno; 46 47 #define C2U(cChar) OUString::createFromAscii(cChar) 48 49 namespace utl 50 { 51 52 static SfxMiscCfg* pOptions = NULL; 53 static sal_Int32 nRefCount = 0; 54 55 class SfxMiscCfg : public utl::ConfigItem 56 { 57 sal_Bool bPaperSize; // printer warnings 58 sal_Bool bPaperOrientation; 59 sal_Bool bNotFound; 60 sal_Int32 nYear2000; // two digit year representation 61 62 const com::sun::star::uno::Sequence<rtl::OUString>& GetPropertyNames(); 63 void Load(); 64 65 public: 66 SfxMiscCfg( ); 67 ~SfxMiscCfg( ); 68 69 virtual void Notify( const com::sun::star::uno::Sequence<rtl::OUString>& aPropertyNames); 70 virtual void Commit(); 71 72 sal_Bool IsNotFoundWarning() const {return bNotFound;} 73 void SetNotFoundWarning( sal_Bool bSet); 74 75 sal_Bool IsPaperSizeWarning() const {return bPaperSize;} 76 void SetPaperSizeWarning(sal_Bool bSet); 77 78 sal_Bool IsPaperOrientationWarning() const {return bPaperOrientation;} 79 void SetPaperOrientationWarning( sal_Bool bSet); 80 81 // 0 ... 99 82 sal_Int32 GetYear2000() const { return nYear2000; } 83 void SetYear2000( sal_Int32 nSet ); 84 85 }; 86 87 /*-------------------------------------------------------------------- 88 Beschreibung: 89 --------------------------------------------------------------------*/ 90 SfxMiscCfg::SfxMiscCfg() : 91 ConfigItem(C2U("Office.Common") ), 92 bPaperSize(sal_False), 93 bPaperOrientation (sal_False), 94 bNotFound (sal_False), 95 nYear2000( 1930 ) 96 { 97 RTL_LOGFILE_CONTEXT(aLog, "svl SfxMiscCfg::SfxMiscCfg()"); 98 99 Load(); 100 } 101 /* -----------------------------02.03.01 15:31-------------------------------- 102 103 ---------------------------------------------------------------------------*/ 104 SfxMiscCfg::~SfxMiscCfg() 105 { 106 } 107 /*-------------------------------------------------------------------- 108 Beschreibung: 109 --------------------------------------------------------------------*/ 110 111 void SfxMiscCfg::SetNotFoundWarning( sal_Bool bSet) 112 { 113 if(bNotFound != bSet) 114 SetModified(); 115 bNotFound = bSet; 116 } 117 118 /*-------------------------------------------------------------------- 119 Beschreibung: 120 --------------------------------------------------------------------*/ 121 122 void SfxMiscCfg::SetPaperSizeWarning( sal_Bool bSet) 123 { 124 if(bPaperSize != bSet) 125 SetModified(); 126 bPaperSize = bSet; 127 } 128 129 /*-------------------------------------------------------------------- 130 Beschreibung: 131 --------------------------------------------------------------------*/ 132 void SfxMiscCfg::SetPaperOrientationWarning( sal_Bool bSet) 133 { 134 if(bPaperOrientation != bSet) 135 SetModified(); 136 bPaperOrientation = bSet; 137 } 138 /*-------------------------------------------------------------------- 139 Beschreibung: 140 --------------------------------------------------------------------*/ 141 142 void SfxMiscCfg::SetYear2000( sal_Int32 nSet ) 143 { 144 if(nYear2000 != nSet) 145 SetModified(); 146 nYear2000 = nSet; 147 } 148 /* -----------------------------02.03.01 15:31-------------------------------- 149 150 ---------------------------------------------------------------------------*/ 151 const Sequence<OUString>& SfxMiscCfg::GetPropertyNames() 152 { 153 static Sequence<OUString> aNames; 154 if(!aNames.getLength()) 155 { 156 static const char* aPropNames[] = 157 { 158 "Print/Warning/PaperSize", // 0 159 "Print/Warning/PaperOrientation", // 1 160 "Print/Warning/NotFound", // 2 161 "DateFormat/TwoDigitYear", // 3 162 }; 163 const int nCount = 4; 164 aNames.realloc(nCount); 165 OUString* pNames = aNames.getArray(); 166 for(int i = 0; i < nCount; i++) 167 pNames[i] = OUString::createFromAscii(aPropNames[i]); 168 } 169 return aNames; 170 } 171 /* -----------------------------02.03.01 15:31-------------------------------- 172 173 ---------------------------------------------------------------------------*/ 174 void SfxMiscCfg::Load() 175 { 176 const Sequence<OUString>& aNames = GetPropertyNames(); 177 Sequence<Any> aValues = GetProperties(aNames); 178 EnableNotification(aNames); 179 const Any* pValues = aValues.getConstArray(); 180 DBG_ASSERT(aValues.getLength() == aNames.getLength(), "GetProperties failed"); 181 if(aValues.getLength() == aNames.getLength()) 182 { 183 for(int nProp = 0; nProp < aNames.getLength(); nProp++) 184 { 185 if(pValues[nProp].hasValue()) 186 { 187 switch(nProp) 188 { 189 case 0: bPaperSize = *(sal_Bool*)pValues[nProp].getValue(); break; //"Print/Warning/PaperSize", 190 case 1: bPaperOrientation = *(sal_Bool*)pValues[nProp].getValue(); break; //"Print/Warning/PaperOrientation", 191 case 2: bNotFound = *(sal_Bool*)pValues[nProp].getValue() ; break; //"Print/Warning/NotFound", 192 case 3: pValues[nProp] >>= nYear2000;break; //"DateFormat/TwoDigitYear", 193 } 194 } 195 } 196 } 197 } 198 /* -----------------------------02.03.01 15:31-------------------------------- 199 200 ---------------------------------------------------------------------------*/ 201 void SfxMiscCfg::Notify( const com::sun::star::uno::Sequence<rtl::OUString>& ) 202 { 203 Load(); 204 } 205 /* -----------------------------02.03.01 15:31-------------------------------- 206 207 ---------------------------------------------------------------------------*/ 208 void SfxMiscCfg::Commit() 209 { 210 const Sequence<OUString>& aNames = GetPropertyNames(); 211 Sequence<Any> aValues(aNames.getLength()); 212 Any* pValues = aValues.getArray(); 213 214 const Type& rType = ::getBooleanCppuType(); 215 for(int nProp = 0; nProp < aNames.getLength(); nProp++) 216 { 217 switch(nProp) 218 { 219 case 0: pValues[nProp].setValue(&bPaperSize, rType);break; //"Print/Warning/PaperSize", 220 case 1: pValues[nProp].setValue(&bPaperOrientation, rType);break; //"Print/Warning/PaperOrientation", 221 case 2: pValues[nProp].setValue(&bNotFound, rType);break; //"Print/Warning/NotFound", 222 case 3: pValues[nProp] <<= nYear2000;break; //"DateFormat/TwoDigitYear", 223 } 224 } 225 PutProperties(aNames, aValues); 226 } 227 // ----------------------------------------------------------------------- 228 namespace 229 { 230 class LocalSingleton : public rtl::Static< osl::Mutex, LocalSingleton > 231 { 232 }; 233 } 234 235 MiscCfg::MiscCfg( ) 236 { 237 // Global access, must be guarded (multithreading) 238 ::osl::MutexGuard aGuard( LocalSingleton::get() ); 239 if ( !pOptions ) 240 { 241 RTL_LOGFILE_CONTEXT(aLog, "unotools ( ??? ) SfxMiscCfg::ctor()"); 242 pOptions = new SfxMiscCfg; 243 244 ItemHolder1::holdConfigItem(E_MISCCFG); 245 } 246 247 ++nRefCount; 248 pImpl = pOptions; 249 pImpl->AddListener(this); 250 } 251 252 MiscCfg::~MiscCfg( ) 253 { 254 // Global access, must be guarded (multithreading) 255 ::osl::MutexGuard aGuard( LocalSingleton::get() ); 256 pImpl->RemoveListener(this); 257 if ( !--nRefCount ) 258 { 259 if ( pOptions->IsModified() ) 260 pOptions->Commit(); 261 DELETEZ( pOptions ); 262 } 263 } 264 265 sal_Bool MiscCfg::IsNotFoundWarning() const 266 { 267 return pImpl->IsNotFoundWarning(); 268 } 269 270 void MiscCfg::SetNotFoundWarning( sal_Bool bSet) 271 { 272 pImpl->SetNotFoundWarning( bSet ); 273 } 274 275 sal_Bool MiscCfg::IsPaperSizeWarning() const 276 { 277 return pImpl->IsPaperSizeWarning(); 278 } 279 280 void MiscCfg::SetPaperSizeWarning(sal_Bool bSet) 281 { 282 pImpl->SetPaperSizeWarning( bSet ); 283 } 284 285 sal_Bool MiscCfg::IsPaperOrientationWarning() const 286 { 287 return pImpl->IsPaperOrientationWarning(); 288 } 289 290 void MiscCfg::SetPaperOrientationWarning( sal_Bool bSet) 291 { 292 pImpl->SetPaperOrientationWarning( bSet ); 293 } 294 295 sal_Int32 MiscCfg::GetYear2000() const 296 { 297 return pImpl->GetYear2000(); 298 } 299 300 void MiscCfg::SetYear2000( sal_Int32 nSet ) 301 { 302 pImpl->SetYear2000( nSet ); 303 } 304 305 } 306 307