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_sw.hxx" 30 31 32 #include <hintids.hxx> 33 #include <tools/stream.hxx> 34 #include <tools/resid.hxx> 35 #include <sfx2/app.hxx> 36 #include <editeng/paperinf.hxx> 37 #include <com/sun/star/uno/Sequence.hxx> 38 #include <unotools/useroptions.hxx> 39 #include <tools/shl.hxx> 40 #include <swmodule.hxx> 41 #include <errhdl.hxx> 42 #include <swtypes.hxx> 43 #include <envimg.hxx> 44 45 #ifndef _CMDID_H 46 #include <cmdid.h> 47 #endif 48 #ifndef _ENVELP_HRC 49 #include <envelp.hrc> 50 #endif 51 52 #include <unomid.h> 53 54 #ifdef WNT 55 #define NEXTLINE UniString::CreateFromAscii("\r\n") 56 #else 57 #define NEXTLINE '\n' 58 #endif 59 60 using namespace utl; 61 using namespace rtl; 62 using namespace ::com::sun::star::uno; 63 64 65 TYPEINIT1_AUTOFACTORY( SwEnvItem, SfxPoolItem ); 66 67 // -------------------------------------------------------------------------- 68 SW_DLLPUBLIC String MakeSender() 69 { 70 SvtUserOptions& rUserOpt = SW_MOD()->GetUserOptions(); 71 72 String sRet; 73 String sSenderToken(SW_RES(STR_SENDER_TOKENS)); 74 xub_StrLen nSttPos = 0, nTokenCount = sSenderToken.GetTokenCount(';'); 75 sal_Bool bLastLength = sal_True; 76 for( xub_StrLen i = 0; i < nTokenCount; i++ ) 77 { 78 String sToken = sSenderToken.GetToken( 0, ';', nSttPos ); 79 if(sToken.EqualsAscii("COMPANY")) 80 { 81 xub_StrLen nOldLen = sRet.Len(); 82 sRet += (String)rUserOpt.GetCompany(); 83 bLastLength = sRet.Len() != nOldLen; 84 } 85 else if(sToken.EqualsAscii("CR")) 86 { 87 if(bLastLength) 88 sRet +=NEXTLINE; 89 bLastLength = sal_True; 90 } 91 else if(sToken.EqualsAscii("FIRSTNAME")) 92 sRet += (String)rUserOpt.GetFirstName(); 93 else if(sToken.EqualsAscii("LASTNAME")) 94 sRet += (String)rUserOpt.GetLastName(); 95 else if(sToken.EqualsAscii("ADDRESS")) 96 sRet += (String)rUserOpt.GetStreet(); 97 else if(sToken.EqualsAscii("COUNTRY")) 98 sRet += (String)rUserOpt.GetCountry(); 99 else if(sToken.EqualsAscii("POSTALCODE")) 100 sRet += (String)rUserOpt.GetZip(); 101 else if(sToken.EqualsAscii("CITY")) 102 sRet += (String)rUserOpt.GetCity(); 103 else if(sToken.EqualsAscii("STATEPROV")) 104 sRet += (String)rUserOpt.GetState(); 105 else if(sToken.Len()) //spaces 106 sRet += sToken; 107 } 108 return sRet; 109 } 110 // -------------------------------------------------------------------------- 111 SwEnvItem::SwEnvItem() : 112 SfxPoolItem(FN_ENVELOP) 113 { 114 aAddrText = aEmptyStr; 115 bSend = sal_True; 116 aSendText = MakeSender(); 117 lSendFromLeft = 566; // 1 cm 118 lSendFromTop = 566; // 1 cm 119 Size aEnvSz = SvxPaperInfo::GetPaperSize(PAPER_ENV_C65); 120 lWidth = aEnvSz.Width(); 121 lHeight = aEnvSz.Height(); 122 eAlign = ENV_HOR_LEFT; 123 bPrintFromAbove = sal_True; 124 lShiftRight = 0; 125 lShiftDown = 0; 126 127 lAddrFromLeft = Max(lWidth, lHeight) / 2; 128 lAddrFromTop = Min(lWidth, lHeight) / 2; 129 } 130 // -------------------------------------------------------------------------- 131 SwEnvItem::SwEnvItem(const SwEnvItem& rItem) : 132 SfxPoolItem(FN_ENVELOP), 133 aAddrText (rItem.aAddrText), 134 bSend (rItem.bSend), 135 aSendText (rItem.aSendText), 136 lAddrFromLeft (rItem.lAddrFromLeft), 137 lAddrFromTop (rItem.lAddrFromTop), 138 lSendFromLeft (rItem.lSendFromLeft), 139 lSendFromTop (rItem.lSendFromTop), 140 lWidth (rItem.lWidth), 141 lHeight (rItem.lHeight), 142 eAlign (rItem.eAlign), 143 bPrintFromAbove(rItem.bPrintFromAbove), 144 lShiftRight (rItem.lShiftRight), 145 lShiftDown (rItem.lShiftDown) 146 { 147 } 148 149 // -------------------------------------------------------------------------- 150 SwEnvItem& SwEnvItem::operator =(const SwEnvItem& rItem) 151 { 152 aAddrText = rItem.aAddrText; 153 bSend = rItem.bSend; 154 aSendText = rItem.aSendText; 155 lSendFromLeft = rItem.lSendFromLeft; 156 lSendFromTop = rItem.lSendFromTop; 157 lAddrFromLeft = rItem.lAddrFromLeft; 158 lAddrFromTop = rItem.lAddrFromTop; 159 lWidth = rItem.lWidth; 160 lHeight = rItem.lHeight; 161 eAlign = rItem.eAlign; 162 bPrintFromAbove = rItem.bPrintFromAbove; 163 lShiftRight = rItem.lShiftRight; 164 lShiftDown = rItem.lShiftDown; 165 return *this; 166 } 167 // -------------------------------------------------------------------------- 168 int SwEnvItem::operator ==(const SfxPoolItem& rItem) const 169 { 170 const SwEnvItem& rEnv = (const SwEnvItem&) rItem; 171 172 return aAddrText == rEnv.aAddrText && 173 bSend == rEnv.bSend && 174 aSendText == rEnv.aSendText && 175 lSendFromLeft == rEnv.lSendFromLeft && 176 lSendFromTop == rEnv.lSendFromTop && 177 lAddrFromLeft == rEnv.lAddrFromLeft && 178 lAddrFromTop == rEnv.lAddrFromTop && 179 lWidth == rEnv.lWidth && 180 lHeight == rEnv.lHeight && 181 eAlign == rEnv.eAlign && 182 bPrintFromAbove == rEnv.bPrintFromAbove && 183 lShiftRight == rEnv.lShiftRight && 184 lShiftDown == rEnv.lShiftDown; 185 } 186 187 // -------------------------------------------------------------------------- 188 SfxPoolItem* SwEnvItem::Clone(SfxItemPool*) const 189 { 190 return new SwEnvItem(*this); 191 } 192 // -------------------------------------------------------------------------- 193 // -------------------------------------------------------------------------- 194 SwEnvCfgItem::SwEnvCfgItem() : 195 ConfigItem(C2U("Office.Writer/Envelope")) 196 { 197 Sequence<OUString> aNames = GetPropertyNames(); 198 Sequence<Any> aValues = GetProperties(aNames); 199 EnableNotification(aNames); 200 const Any* pValues = aValues.getConstArray(); 201 DBG_ASSERT(aValues.getLength() == aNames.getLength(), "GetProperties failed"); 202 if(aValues.getLength() == aNames.getLength()) 203 { 204 for(int nProp = 0; nProp < aNames.getLength(); nProp++) 205 { 206 if(pValues[nProp].hasValue()) 207 { 208 switch(nProp) 209 { 210 case 0: pValues[nProp] >>= aEnvItem.aAddrText; break;// "Inscription/Addressee", 211 case 1: pValues[nProp] >>= aEnvItem.aSendText; break;// "Inscription/Sender", 212 case 2: aEnvItem.bSend = *(sal_Bool*)pValues[nProp].getValue(); break;// "Inscription/UseSender", 213 case 3: 214 pValues[nProp] >>= aEnvItem.lAddrFromLeft;// "Format/AddresseeFromLeft", 215 aEnvItem.lAddrFromLeft = MM100_TO_TWIP(aEnvItem.lAddrFromLeft); 216 break; 217 case 4: 218 pValues[nProp] >>= aEnvItem.lAddrFromTop; // "Format/AddresseeFromTop", 219 aEnvItem.lAddrFromTop = MM100_TO_TWIP(aEnvItem.lAddrFromTop); 220 break; 221 case 5: 222 pValues[nProp] >>= aEnvItem.lSendFromLeft; // "Format/SenderFromLeft", 223 aEnvItem.lSendFromLeft = MM100_TO_TWIP(aEnvItem.lSendFromLeft); 224 break; 225 case 6: 226 pValues[nProp] >>= aEnvItem.lSendFromTop;// "Format/SenderFromTop", 227 aEnvItem.lSendFromTop = MM100_TO_TWIP(aEnvItem.lSendFromTop); 228 break; 229 case 7: 230 pValues[nProp] >>= aEnvItem.lWidth; // "Format/Width", 231 aEnvItem.lWidth = MM100_TO_TWIP(aEnvItem.lWidth); 232 break; 233 case 8: 234 pValues[nProp] >>= aEnvItem.lHeight; // "Format/Height", 235 aEnvItem.lHeight = MM100_TO_TWIP(aEnvItem.lHeight); 236 break; 237 case 9: 238 { 239 sal_Int32 nTemp = 0; 240 pValues[nProp] >>= nTemp; aEnvItem.eAlign = (SwEnvAlign)nTemp; break;// "Print/Alignment", 241 } 242 case 10: aEnvItem.bPrintFromAbove = *(sal_Bool*)pValues[nProp].getValue(); break;// "Print/FromAbove", 243 case 11: 244 pValues[nProp] >>= aEnvItem.lShiftRight; 245 aEnvItem.lShiftRight = MM100_TO_TWIP(aEnvItem.lShiftRight);// "Print/Right", 246 break; 247 case 12: 248 pValues[nProp] >>= aEnvItem.lShiftDown; 249 aEnvItem.lShiftDown = MM100_TO_TWIP(aEnvItem.lShiftDown); 250 break;// "Print/Down" 251 } 252 } 253 } 254 } 255 } 256 /* -----------------------------26.09.00 14:04-------------------------------- 257 258 ---------------------------------------------------------------------------*/ 259 SwEnvCfgItem::~SwEnvCfgItem() 260 { 261 } 262 /* -----------------------------26.09.00 14:05-------------------------------- 263 264 ---------------------------------------------------------------------------*/ 265 void SwEnvCfgItem::Commit() 266 { 267 Sequence<OUString> aNames = GetPropertyNames(); 268 Sequence<Any> aValues(aNames.getLength()); 269 Any* pValues = aValues.getArray(); 270 271 const Type& rType = ::getBooleanCppuType(); 272 for(int nProp = 0; nProp < aNames.getLength(); nProp++) 273 { 274 switch(nProp) 275 { 276 case 0: pValues[nProp] <<= aEnvItem.aAddrText; break;// "Inscription/Addressee", 277 case 1: pValues[nProp] <<= aEnvItem.aSendText; break;// "Inscription/Sender", 278 case 2: pValues[nProp].setValue(&aEnvItem.bSend, rType);break;// "Inscription/UseSender", 279 case 3: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lAddrFromLeft)) ; break;// "Format/AddresseeFromLeft", 280 case 4: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lAddrFromTop)) ; break;// "Format/AddresseeFromTop", 281 case 5: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lSendFromLeft)) ; break;// "Format/SenderFromLeft", 282 case 6: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lSendFromTop)) ; break;// "Format/SenderFromTop", 283 case 7: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lWidth)) ; break;// "Format/Width", 284 case 8: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lHeight)) ; break;// "Format/Height", 285 case 9: pValues[nProp] <<= sal_Int32(aEnvItem.eAlign); break;// "Print/Alignment", 286 case 10: pValues[nProp].setValue(&aEnvItem.bPrintFromAbove, rType); break;// "Print/FromAbove", 287 case 11: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lShiftRight));break; // "Print/Right", 288 case 12: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lShiftDown)); break;// "Print/Down" 289 } 290 } 291 PutProperties(aNames, aValues); 292 } 293 294 void SwEnvCfgItem::Notify( const ::com::sun::star::uno::Sequence< rtl::OUString >& ) {} 295 296 /* -----------------------------26.09.00 14:04-------------------------------- 297 298 ---------------------------------------------------------------------------*/ 299 Sequence<rtl::OUString> SwEnvCfgItem::GetPropertyNames() 300 { 301 static const char* aPropNames[] = 302 { 303 "Inscription/Addressee", // 0 304 "Inscription/Sender", // 1 305 "Inscription/UseSender", // 2 306 "Format/AddresseeFromLeft", // 3 307 "Format/AddresseeFromTop", // 4 308 "Format/SenderFromLeft", // 5 309 "Format/SenderFromTop", // 6 310 "Format/Width", // 7 311 "Format/Height", // 8 312 "Print/Alignment", // 9 313 "Print/FromAbove", // 10 314 "Print/Right", // 11 315 "Print/Down" // 12 316 }; 317 const int nCount = 13; 318 Sequence<OUString> aNames(nCount); 319 OUString* pNames = aNames.getArray(); 320 for(int i = 0; i < nCount; i++) 321 pNames[i] = OUString::createFromAscii(aPropNames[i]); 322 return aNames; 323 } 324 325 sal_Bool SwEnvItem::QueryValue( Any& rVal, sal_uInt8 nMemberId ) const 326 { 327 sal_Bool bRet = sal_True; 328 switch(nMemberId & ~CONVERT_TWIPS) 329 { 330 case MID_ENV_ADDR_TEXT : rVal <<= aAddrText; break; 331 case MID_ENV_SEND : rVal <<= bSend; break; 332 case MID_SEND_TEXT : rVal <<= aSendText; break; 333 case MID_ENV_ADDR_FROM_LEFT : rVal <<= lAddrFromLeft; break; 334 case MID_ENV_ADDR_FROM_TOP : rVal <<= lAddrFromTop; break; 335 case MID_ENV_SEND_FROM_LEFT : rVal <<= lSendFromLeft; break; 336 case MID_ENV_SEND_FROM_TOP : rVal <<= lSendFromTop; break; 337 case MID_ENV_WIDTH : rVal <<= lWidth; break; 338 case MID_ENV_HEIGHT : rVal <<= lHeight; break; 339 case MID_ENV_ALIGN : rVal <<= (sal_Int16) eAlign; break; 340 case MID_ENV_PRINT_FROM_ABOVE : rVal <<= bPrintFromAbove; break; 341 case MID_ENV_SHIFT_RIGHT : rVal <<= lShiftRight; break; 342 case MID_ENV_SHIFT_DOWN : rVal <<= lShiftDown; break; 343 default: 344 DBG_ERROR("Wrong memberId"); 345 bRet = sal_False; 346 } 347 return bRet; 348 } 349 /* -----------------------------26.04.01 12:26-------------------------------- 350 351 ---------------------------------------------------------------------------*/ 352 sal_Bool SwEnvItem::PutValue(const Any& rVal, sal_uInt8 nMemberId) 353 { 354 sal_Bool bRet = sal_False; 355 switch(nMemberId & ~CONVERT_TWIPS) 356 { 357 case MID_ENV_ADDR_TEXT : bRet = (rVal >>= aAddrText); break; 358 case MID_ENV_SEND : bRet = (rVal >>= bSend); break; 359 case MID_SEND_TEXT : bRet = (rVal >>= aSendText); break; 360 case MID_ENV_ADDR_FROM_LEFT : bRet = (rVal >>= lAddrFromLeft); break; 361 case MID_ENV_ADDR_FROM_TOP : bRet = (rVal >>= lAddrFromTop); break; 362 case MID_ENV_SEND_FROM_LEFT : bRet = (rVal >>= lSendFromLeft); break; 363 case MID_ENV_SEND_FROM_TOP : bRet = (rVal >>= lSendFromTop); break; 364 case MID_ENV_WIDTH : bRet = (rVal >>= lWidth); break; 365 case MID_ENV_HEIGHT : bRet = (rVal >>= lHeight); break; 366 case MID_ENV_ALIGN : 367 { 368 sal_Int16 nTemp = 0; 369 bRet = (rVal >>= nTemp); 370 if (bRet) 371 eAlign = SwEnvAlign(nTemp); 372 break; 373 } 374 case MID_ENV_PRINT_FROM_ABOVE : bRet = (rVal >>= bPrintFromAbove); break; 375 case MID_ENV_SHIFT_RIGHT : bRet = (rVal >>= lShiftRight); break; 376 case MID_ENV_SHIFT_DOWN : bRet = (rVal >>= lShiftDown); break; 377 default: 378 DBG_ERROR("Wrong memberId"); 379 } 380 return bRet; 381 } 382