xref: /aoo41x/main/sw/source/ui/envelp/envimg.cxx (revision cdf0e10c)
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