1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
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>
39 #define NEXTLINE OUString("\r\n")
45 using namespace ::com::sun::star::uno
;
49 TYPEINIT1_AUTOFACTORY( SwEnvItem
, SfxPoolItem
);
51 SW_DLLPUBLIC String
MakeSender()
53 SvtUserOptions
& rUserOpt
= SW_MOD()->GetUserOptions();
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"))
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
95 SwEnvItem::SwEnvItem() :
96 SfxPoolItem(FN_ENVELOP
)
98 aAddrText
= aEmptyStr
;
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
;
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
),
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
;
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
;
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())
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",
195 pValues
[nProp
] >>= aEnvItem
.lAddrFromLeft
;// "Format/AddresseeFromLeft",
196 aEnvItem
.lAddrFromLeft
= MM100_TO_TWIP(aEnvItem
.lAddrFromLeft
);
199 pValues
[nProp
] >>= aEnvItem
.lAddrFromTop
; // "Format/AddresseeFromTop",
200 aEnvItem
.lAddrFromTop
= MM100_TO_TWIP(aEnvItem
.lAddrFromTop
);
203 pValues
[nProp
] >>= aEnvItem
.lSendFromLeft
; // "Format/SenderFromLeft",
204 aEnvItem
.lSendFromLeft
= MM100_TO_TWIP(aEnvItem
.lSendFromLeft
);
207 pValues
[nProp
] >>= aEnvItem
.lSendFromTop
;// "Format/SenderFromTop",
208 aEnvItem
.lSendFromTop
= MM100_TO_TWIP(aEnvItem
.lSendFromTop
);
211 pValues
[nProp
] >>= aEnvItem
.lWidth
; // "Format/Width",
212 aEnvItem
.lWidth
= MM100_TO_TWIP(aEnvItem
.lWidth
);
215 pValues
[nProp
] >>= aEnvItem
.lHeight
; // "Format/Height",
216 aEnvItem
.lHeight
= MM100_TO_TWIP(aEnvItem
.lHeight
);
221 pValues
[nProp
] >>= nTemp
; aEnvItem
.eAlign
= (SwEnvAlign
)nTemp
; break;// "Print/Alignment",
223 case 10: aEnvItem
.bPrintFromAbove
= *(sal_Bool
*)pValues
[nProp
].getValue(); break;// "Print/FromAbove",
225 pValues
[nProp
] >>= aEnvItem
.lShiftRight
;
226 aEnvItem
.lShiftRight
= MM100_TO_TWIP(aEnvItem
.lShiftRight
);// "Print/Right",
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
++)
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
285 "Format/Height", // 8
286 "Print/Alignment", // 9
287 "Print/FromAbove", // 10
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
]);
301 bool SwEnvItem::QueryValue( Any
& rVal
, sal_uInt8 nMemberId
) const
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;
320 OSL_FAIL("Wrong memberId");
326 bool SwEnvItem::PutValue(const Any
& rVal
, sal_uInt8 nMemberId
)
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;
343 bRet
= (rVal
>>= nTemp
);
345 eAlign
= SwEnvAlign(nTemp
);
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;
352 OSL_FAIL("Wrong memberId");
357 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */