bump product version to 4.1.6.2
[LibreOffice.git] / sw / source / ui / envelp / envimg.cxx
blob63be8798743c58f117870b7296a0b2580f926818
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <hintids.hxx>
21 #include <comphelper/string.hxx>
22 #include <tools/stream.hxx>
23 #include <tools/resid.hxx>
24 #include <sfx2/app.hxx>
25 #include <editeng/paperinf.hxx>
26 #include <com/sun/star/uno/Sequence.hxx>
27 #include <unotools/useroptions.hxx>
28 #include <tools/shl.hxx>
29 #include <swmodule.hxx>
30 #include <swtypes.hxx>
31 #include <envimg.hxx>
33 #include <cmdid.h>
34 #include <envelp.hrc>
36 #include <unomid.h>
38 #ifdef WNT
39 #define NEXTLINE OUString("\r\n")
40 #else
41 #define NEXTLINE '\n'
42 #endif
44 using namespace utl;
45 using namespace ::com::sun::star::uno;
49 TYPEINIT1_AUTOFACTORY( SwEnvItem, SfxPoolItem );
51 SW_DLLPUBLIC String MakeSender()
53 SvtUserOptions& rUserOpt = SW_MOD()->GetUserOptions();
55 String sRet;
56 String sSenderToken(SW_RES(STR_SENDER_TOKENS));
57 xub_StrLen nTokenCount = comphelper::string::getTokenCount(sSenderToken, ';');
58 sal_Int32 nSttPos = 0;
59 bool bLastLength = true;
60 for( xub_StrLen i = 0; i < nTokenCount; i++ )
62 String sToken = sSenderToken.GetToken( 0, ';', nSttPos );
63 if(sToken.EqualsAscii("COMPANY"))
65 xub_StrLen nOldLen = sRet.Len();
66 sRet += (String)rUserOpt.GetCompany();
67 bLastLength = sRet.Len() != nOldLen;
69 else if(sToken.EqualsAscii("CR"))
71 if(bLastLength)
72 sRet +=NEXTLINE;
73 bLastLength = true;
75 else if(sToken.EqualsAscii("FIRSTNAME"))
76 sRet += (String)rUserOpt.GetFirstName();
77 else if(sToken.EqualsAscii("LASTNAME"))
78 sRet += (String)rUserOpt.GetLastName();
79 else if(sToken.EqualsAscii("ADDRESS"))
80 sRet += (String)rUserOpt.GetStreet();
81 else if(sToken.EqualsAscii("COUNTRY"))
82 sRet += (String)rUserOpt.GetCountry();
83 else if(sToken.EqualsAscii("POSTALCODE"))
84 sRet += (String)rUserOpt.GetZip();
85 else if(sToken.EqualsAscii("CITY"))
86 sRet += (String)rUserOpt.GetCity();
87 else if(sToken.EqualsAscii("STATEPROV"))
88 sRet += (String)rUserOpt.GetState();
89 else if(sToken.Len()) //spaces
90 sRet += sToken;
92 return sRet;
95 SwEnvItem::SwEnvItem() :
96 SfxPoolItem(FN_ENVELOP)
98 aAddrText = aEmptyStr;
99 bSend = sal_True;
100 aSendText = MakeSender();
101 lSendFromLeft = 566; // 1 cm
102 lSendFromTop = 566; // 1 cm
103 Size aEnvSz = SvxPaperInfo::GetPaperSize(PAPER_ENV_C65);
104 lWidth = aEnvSz.Width();
105 lHeight = aEnvSz.Height();
106 eAlign = ENV_HOR_LEFT;
107 bPrintFromAbove = sal_True;
108 lShiftRight = 0;
109 lShiftDown = 0;
111 lAddrFromLeft = std::max(lWidth, lHeight) / 2;
112 lAddrFromTop = std::min(lWidth, lHeight) / 2;
115 SwEnvItem::SwEnvItem(const SwEnvItem& rItem) :
116 SfxPoolItem(FN_ENVELOP),
117 aAddrText (rItem.aAddrText),
118 bSend (rItem.bSend),
119 aSendText (rItem.aSendText),
120 lAddrFromLeft (rItem.lAddrFromLeft),
121 lAddrFromTop (rItem.lAddrFromTop),
122 lSendFromLeft (rItem.lSendFromLeft),
123 lSendFromTop (rItem.lSendFromTop),
124 lWidth (rItem.lWidth),
125 lHeight (rItem.lHeight),
126 eAlign (rItem.eAlign),
127 bPrintFromAbove(rItem.bPrintFromAbove),
128 lShiftRight (rItem.lShiftRight),
129 lShiftDown (rItem.lShiftDown)
133 SwEnvItem& SwEnvItem::operator =(const SwEnvItem& rItem)
135 aAddrText = rItem.aAddrText;
136 bSend = rItem.bSend;
137 aSendText = rItem.aSendText;
138 lSendFromLeft = rItem.lSendFromLeft;
139 lSendFromTop = rItem.lSendFromTop;
140 lAddrFromLeft = rItem.lAddrFromLeft;
141 lAddrFromTop = rItem.lAddrFromTop;
142 lWidth = rItem.lWidth;
143 lHeight = rItem.lHeight;
144 eAlign = rItem.eAlign;
145 bPrintFromAbove = rItem.bPrintFromAbove;
146 lShiftRight = rItem.lShiftRight;
147 lShiftDown = rItem.lShiftDown;
148 return *this;
151 int SwEnvItem::operator ==(const SfxPoolItem& rItem) const
153 const SwEnvItem& rEnv = (const SwEnvItem&) rItem;
155 return aAddrText == rEnv.aAddrText &&
156 bSend == rEnv.bSend &&
157 aSendText == rEnv.aSendText &&
158 lSendFromLeft == rEnv.lSendFromLeft &&
159 lSendFromTop == rEnv.lSendFromTop &&
160 lAddrFromLeft == rEnv.lAddrFromLeft &&
161 lAddrFromTop == rEnv.lAddrFromTop &&
162 lWidth == rEnv.lWidth &&
163 lHeight == rEnv.lHeight &&
164 eAlign == rEnv.eAlign &&
165 bPrintFromAbove == rEnv.bPrintFromAbove &&
166 lShiftRight == rEnv.lShiftRight &&
167 lShiftDown == rEnv.lShiftDown;
170 SfxPoolItem* SwEnvItem::Clone(SfxItemPool*) const
172 return new SwEnvItem(*this);
175 SwEnvCfgItem::SwEnvCfgItem() :
176 ConfigItem("Office.Writer/Envelope")
178 Sequence<OUString> aNames = GetPropertyNames();
179 Sequence<Any> aValues = GetProperties(aNames);
180 EnableNotification(aNames);
181 const Any* pValues = aValues.getConstArray();
182 OSL_ENSURE(aValues.getLength() == aNames.getLength(), "GetProperties failed");
183 if(aValues.getLength() == aNames.getLength())
185 for(int nProp = 0; nProp < aNames.getLength(); nProp++)
187 if(pValues[nProp].hasValue())
189 switch(nProp)
191 case 0: pValues[nProp] >>= aEnvItem.aAddrText; break;// "Inscription/Addressee",
192 case 1: pValues[nProp] >>= aEnvItem.aSendText; break;// "Inscription/Sender",
193 case 2: aEnvItem.bSend = *(sal_Bool*)pValues[nProp].getValue(); break;// "Inscription/UseSender",
194 case 3:
195 pValues[nProp] >>= aEnvItem.lAddrFromLeft;// "Format/AddresseeFromLeft",
196 aEnvItem.lAddrFromLeft = MM100_TO_TWIP(aEnvItem.lAddrFromLeft);
197 break;
198 case 4:
199 pValues[nProp] >>= aEnvItem.lAddrFromTop; // "Format/AddresseeFromTop",
200 aEnvItem.lAddrFromTop = MM100_TO_TWIP(aEnvItem.lAddrFromTop);
201 break;
202 case 5:
203 pValues[nProp] >>= aEnvItem.lSendFromLeft; // "Format/SenderFromLeft",
204 aEnvItem.lSendFromLeft = MM100_TO_TWIP(aEnvItem.lSendFromLeft);
205 break;
206 case 6:
207 pValues[nProp] >>= aEnvItem.lSendFromTop;// "Format/SenderFromTop",
208 aEnvItem.lSendFromTop = MM100_TO_TWIP(aEnvItem.lSendFromTop);
209 break;
210 case 7:
211 pValues[nProp] >>= aEnvItem.lWidth; // "Format/Width",
212 aEnvItem.lWidth = MM100_TO_TWIP(aEnvItem.lWidth);
213 break;
214 case 8:
215 pValues[nProp] >>= aEnvItem.lHeight; // "Format/Height",
216 aEnvItem.lHeight = MM100_TO_TWIP(aEnvItem.lHeight);
217 break;
218 case 9:
220 sal_Int32 nTemp = 0;
221 pValues[nProp] >>= nTemp; aEnvItem.eAlign = (SwEnvAlign)nTemp; break;// "Print/Alignment",
223 case 10: aEnvItem.bPrintFromAbove = *(sal_Bool*)pValues[nProp].getValue(); break;// "Print/FromAbove",
224 case 11:
225 pValues[nProp] >>= aEnvItem.lShiftRight;
226 aEnvItem.lShiftRight = MM100_TO_TWIP(aEnvItem.lShiftRight);// "Print/Right",
227 break;
228 case 12:
229 pValues[nProp] >>= aEnvItem.lShiftDown;
230 aEnvItem.lShiftDown = MM100_TO_TWIP(aEnvItem.lShiftDown);
231 break;// "Print/Down"
238 SwEnvCfgItem::~SwEnvCfgItem()
242 void SwEnvCfgItem::Commit()
244 Sequence<OUString> aNames = GetPropertyNames();
245 Sequence<Any> aValues(aNames.getLength());
246 Any* pValues = aValues.getArray();
248 const Type& rType = ::getBooleanCppuType();
249 for(int nProp = 0; nProp < aNames.getLength(); nProp++)
251 switch(nProp)
253 case 0: pValues[nProp] <<= aEnvItem.aAddrText; break;// "Inscription/Addressee",
254 case 1: pValues[nProp] <<= aEnvItem.aSendText; break;// "Inscription/Sender",
255 case 2: pValues[nProp].setValue(&aEnvItem.bSend, rType);break;// "Inscription/UseSender",
256 case 3: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lAddrFromLeft)) ; break;// "Format/AddresseeFromLeft",
257 case 4: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lAddrFromTop)) ; break;// "Format/AddresseeFromTop",
258 case 5: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lSendFromLeft)) ; break;// "Format/SenderFromLeft",
259 case 6: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lSendFromTop)) ; break;// "Format/SenderFromTop",
260 case 7: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lWidth)) ; break;// "Format/Width",
261 case 8: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lHeight)) ; break;// "Format/Height",
262 case 9: pValues[nProp] <<= sal_Int32(aEnvItem.eAlign); break;// "Print/Alignment",
263 case 10: pValues[nProp].setValue(&aEnvItem.bPrintFromAbove, rType); break;// "Print/FromAbove",
264 case 11: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lShiftRight));break; // "Print/Right",
265 case 12: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lShiftDown)); break;// "Print/Down"
268 PutProperties(aNames, aValues);
271 void SwEnvCfgItem::Notify( const ::com::sun::star::uno::Sequence< OUString >& ) {}
273 Sequence<OUString> SwEnvCfgItem::GetPropertyNames()
275 static const char* aPropNames[] =
277 "Inscription/Addressee", // 0
278 "Inscription/Sender", // 1
279 "Inscription/UseSender", // 2
280 "Format/AddresseeFromLeft", // 3
281 "Format/AddresseeFromTop", // 4
282 "Format/SenderFromLeft", // 5
283 "Format/SenderFromTop", // 6
284 "Format/Width", // 7
285 "Format/Height", // 8
286 "Print/Alignment", // 9
287 "Print/FromAbove", // 10
288 "Print/Right", // 11
289 "Print/Down" // 12
291 const int nCount = 13;
292 Sequence<OUString> aNames(nCount);
293 OUString* pNames = aNames.getArray();
295 for(int i = 0; i < nCount; i++)
296 pNames[i] = OUString::createFromAscii(aPropNames[i]);
298 return aNames;
301 bool SwEnvItem::QueryValue( Any& rVal, sal_uInt8 nMemberId ) const
303 bool bRet = true;
304 switch(nMemberId & ~CONVERT_TWIPS)
306 case MID_ENV_ADDR_TEXT : rVal <<= aAddrText; break;
307 case MID_ENV_SEND : rVal <<= bSend; break;
308 case MID_SEND_TEXT : rVal <<= aSendText; break;
309 case MID_ENV_ADDR_FROM_LEFT : rVal <<= lAddrFromLeft; break;
310 case MID_ENV_ADDR_FROM_TOP : rVal <<= lAddrFromTop; break;
311 case MID_ENV_SEND_FROM_LEFT : rVal <<= lSendFromLeft; break;
312 case MID_ENV_SEND_FROM_TOP : rVal <<= lSendFromTop; break;
313 case MID_ENV_WIDTH : rVal <<= lWidth; break;
314 case MID_ENV_HEIGHT : rVal <<= lHeight; break;
315 case MID_ENV_ALIGN : rVal <<= (sal_Int16) eAlign; break;
316 case MID_ENV_PRINT_FROM_ABOVE : rVal <<= bPrintFromAbove; break;
317 case MID_ENV_SHIFT_RIGHT : rVal <<= lShiftRight; break;
318 case MID_ENV_SHIFT_DOWN : rVal <<= lShiftDown; break;
319 default:
320 OSL_FAIL("Wrong memberId");
321 bRet = false;
323 return bRet;
326 bool SwEnvItem::PutValue(const Any& rVal, sal_uInt8 nMemberId)
328 bool bRet = false;
329 switch(nMemberId & ~CONVERT_TWIPS)
331 case MID_ENV_ADDR_TEXT : bRet = (rVal >>= aAddrText); break;
332 case MID_ENV_SEND : bRet = (rVal >>= bSend); break;
333 case MID_SEND_TEXT : bRet = (rVal >>= aSendText); break;
334 case MID_ENV_ADDR_FROM_LEFT : bRet = (rVal >>= lAddrFromLeft); break;
335 case MID_ENV_ADDR_FROM_TOP : bRet = (rVal >>= lAddrFromTop); break;
336 case MID_ENV_SEND_FROM_LEFT : bRet = (rVal >>= lSendFromLeft); break;
337 case MID_ENV_SEND_FROM_TOP : bRet = (rVal >>= lSendFromTop); break;
338 case MID_ENV_WIDTH : bRet = (rVal >>= lWidth); break;
339 case MID_ENV_HEIGHT : bRet = (rVal >>= lHeight); break;
340 case MID_ENV_ALIGN :
342 sal_Int16 nTemp = 0;
343 bRet = (rVal >>= nTemp);
344 if (bRet)
345 eAlign = SwEnvAlign(nTemp);
346 break;
348 case MID_ENV_PRINT_FROM_ABOVE : bRet = (rVal >>= bPrintFromAbove); break;
349 case MID_ENV_SHIFT_RIGHT : bRet = (rVal >>= lShiftRight); break;
350 case MID_ENV_SHIFT_DOWN : bRet = (rVal >>= lShiftDown); break;
351 default:
352 OSL_FAIL("Wrong memberId");
354 return bRet;
357 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */