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 <o3tl/any.hxx>
21 #include <osl/diagnose.h>
22 #include <editeng/paperinf.hxx>
23 #include <com/sun/star/uno/Sequence.hxx>
24 #include <rtl/ustrbuf.hxx>
25 #include <tools/UnitConversion.hxx>
26 #include <unotools/useroptions.hxx>
27 #include <swmodule.hxx>
28 #include <swtypes.hxx>
30 #include <strings.hrc>
37 #define NEXTLINE "\r\n"
43 using namespace ::com::sun::star::uno
;
46 SfxPoolItem
* SwEnvItem::CreateDefault() { return new SwEnvItem
; }
50 SvtUserOptions
& rUserOpt
= SW_MOD()->GetUserOptions();
52 const OUString
sSenderToken(SwResId(STR_SENDER_TOKENS
));
53 if (sSenderToken
.isEmpty())
57 sal_Int32 nSttPos
= 0;
58 bool bLastLength
= true;
60 OUString sToken
= sSenderToken
.getToken( 0, ';', nSttPos
);
61 if (sToken
== "COMPANY")
63 sal_Int32 nOldLen
= sRet
.getLength();
64 sRet
.append(rUserOpt
.GetCompany());
65 bLastLength
= sRet
.getLength() != nOldLen
;
67 else if (sToken
== "CR")
70 sRet
.append(NEXTLINE
);
73 else if (sToken
== "FIRSTNAME")
74 sRet
.append(rUserOpt
.GetFirstName());
75 else if (sToken
== "LASTNAME")
76 sRet
.append(rUserOpt
.GetLastName());
77 else if (sToken
== "ADDRESS")
78 sRet
.append(rUserOpt
.GetStreet());
79 else if (sToken
== "COUNTRY")
80 sRet
.append(rUserOpt
.GetCountry());
81 else if (sToken
== "POSTALCODE")
82 sRet
.append(rUserOpt
.GetZip());
83 else if (sToken
== "CITY")
84 sRet
.append(rUserOpt
.GetCity());
85 else if (sToken
== "STATEPROV")
86 sRet
.append(rUserOpt
.GetState());
87 else if (!sToken
.isEmpty()) //spaces
90 return sRet
.makeStringAndClear();
93 SwEnvItem::SwEnvItem() :
94 SfxPoolItem(FN_ENVELOP
)
97 m_aSendText
= MakeSender();
98 m_nSendFromLeft
= 566; // 1 cm
99 m_nSendFromTop
= 566; // 1 cm
100 Size aEnvSz
= SvxPaperInfo::GetPaperSize(PAPER_ENV_C65
);
101 m_nWidth
= aEnvSz
.Width();
102 m_nHeight
= aEnvSz
.Height();
103 m_eAlign
= ENV_HOR_LEFT
;
104 m_bPrintFromAbove
= true;
108 m_nAddrFromLeft
= std::max(m_nWidth
, m_nHeight
) / 2;
109 m_nAddrFromTop
= std::min(m_nWidth
, m_nHeight
) / 2;
112 SwEnvItem
& SwEnvItem::operator =(const SwEnvItem
& rItem
)
114 m_aAddrText
= rItem
.m_aAddrText
;
115 m_bSend
= rItem
.m_bSend
;
116 m_aSendText
= rItem
.m_aSendText
;
117 m_nSendFromLeft
= rItem
.m_nSendFromLeft
;
118 m_nSendFromTop
= rItem
.m_nSendFromTop
;
119 m_nAddrFromLeft
= rItem
.m_nAddrFromLeft
;
120 m_nAddrFromTop
= rItem
.m_nAddrFromTop
;
121 m_nWidth
= rItem
.m_nWidth
;
122 m_nHeight
= rItem
.m_nHeight
;
123 m_eAlign
= rItem
.m_eAlign
;
124 m_bPrintFromAbove
= rItem
.m_bPrintFromAbove
;
125 m_nShiftRight
= rItem
.m_nShiftRight
;
126 m_nShiftDown
= rItem
.m_nShiftDown
;
130 bool SwEnvItem::operator ==(const SfxPoolItem
& rItem
) const
132 const SwEnvItem
& rEnv
= static_cast<const SwEnvItem
&>( rItem
);
134 return m_aAddrText
== rEnv
.m_aAddrText
&&
135 m_bSend
== rEnv
.m_bSend
&&
136 m_aSendText
== rEnv
.m_aSendText
&&
137 m_nSendFromLeft
== rEnv
.m_nSendFromLeft
&&
138 m_nSendFromTop
== rEnv
.m_nSendFromTop
&&
139 m_nAddrFromLeft
== rEnv
.m_nAddrFromLeft
&&
140 m_nAddrFromTop
== rEnv
.m_nAddrFromTop
&&
141 m_nWidth
== rEnv
.m_nWidth
&&
142 m_nHeight
== rEnv
.m_nHeight
&&
143 m_eAlign
== rEnv
.m_eAlign
&&
144 m_bPrintFromAbove
== rEnv
.m_bPrintFromAbove
&&
145 m_nShiftRight
== rEnv
.m_nShiftRight
&&
146 m_nShiftDown
== rEnv
.m_nShiftDown
;
149 SwEnvItem
* SwEnvItem::Clone(SfxItemPool
*) const
151 return new SwEnvItem(*this);
154 SwEnvCfgItem::SwEnvCfgItem() :
155 ConfigItem("Office.Writer/Envelope")
157 Sequence
<OUString
> aNames
= GetPropertyNames();
158 Sequence
<Any
> aValues
= GetProperties(aNames
);
159 EnableNotification(aNames
);
160 const Any
* pValues
= aValues
.getConstArray();
161 OSL_ENSURE(aValues
.getLength() == aNames
.getLength(), "GetProperties failed");
162 if(aValues
.getLength() != aNames
.getLength())
165 for(int nProp
= 0; nProp
< aNames
.getLength(); nProp
++)
167 if(pValues
[nProp
].hasValue())
171 case 0: pValues
[nProp
] >>= m_aEnvItem
.m_aAddrText
; break;// "Inscription/Addressee",
172 case 1: pValues
[nProp
] >>= m_aEnvItem
.m_aSendText
; break;// "Inscription/Sender",
173 case 2: m_aEnvItem
.m_bSend
= *o3tl::doAccess
<bool>(pValues
[nProp
]); break;// "Inscription/UseSender",
175 pValues
[nProp
] >>= m_aEnvItem
.m_nAddrFromLeft
;// "Format/AddresseeFromLeft",
176 m_aEnvItem
.m_nAddrFromLeft
= convertMm100ToTwip(m_aEnvItem
.m_nAddrFromLeft
);
179 pValues
[nProp
] >>= m_aEnvItem
.m_nAddrFromTop
; // "Format/AddresseeFromTop",
180 m_aEnvItem
.m_nAddrFromTop
= convertMm100ToTwip(m_aEnvItem
.m_nAddrFromTop
);
183 pValues
[nProp
] >>= m_aEnvItem
.m_nSendFromLeft
; // "Format/SenderFromLeft",
184 m_aEnvItem
.m_nSendFromLeft
= convertMm100ToTwip(m_aEnvItem
.m_nSendFromLeft
);
187 pValues
[nProp
] >>= m_aEnvItem
.m_nSendFromTop
;// "Format/SenderFromTop",
188 m_aEnvItem
.m_nSendFromTop
= convertMm100ToTwip(m_aEnvItem
.m_nSendFromTop
);
191 pValues
[nProp
] >>= m_aEnvItem
.m_nWidth
; // "Format/Width",
192 m_aEnvItem
.m_nWidth
= convertMm100ToTwip(m_aEnvItem
.m_nWidth
);
195 pValues
[nProp
] >>= m_aEnvItem
.m_nHeight
; // "Format/Height",
196 m_aEnvItem
.m_nHeight
= convertMm100ToTwip(m_aEnvItem
.m_nHeight
);
201 pValues
[nProp
] >>= nTemp
; m_aEnvItem
.m_eAlign
= static_cast<SwEnvAlign
>(nTemp
); break;// "Print/Alignment",
203 case 10: m_aEnvItem
.m_bPrintFromAbove
= *o3tl::doAccess
<bool>(pValues
[nProp
]); break;// "Print/FromAbove",
205 pValues
[nProp
] >>= m_aEnvItem
.m_nShiftRight
;
206 m_aEnvItem
.m_nShiftRight
= convertMm100ToTwip(m_aEnvItem
.m_nShiftRight
);// "Print/Right",
209 pValues
[nProp
] >>= m_aEnvItem
.m_nShiftDown
;
210 m_aEnvItem
.m_nShiftDown
= convertMm100ToTwip(m_aEnvItem
.m_nShiftDown
);
211 break;// "Print/Down"
217 SwEnvCfgItem::~SwEnvCfgItem()
221 void SwEnvCfgItem::ImplCommit()
223 Sequence
<OUString
> aNames
= GetPropertyNames();
224 Sequence
<Any
> aValues(aNames
.getLength());
225 Any
* pValues
= aValues
.getArray();
227 for(int nProp
= 0; nProp
< aNames
.getLength(); nProp
++)
231 case 0: pValues
[nProp
] <<= m_aEnvItem
.m_aAddrText
; break;// "Inscription/Addressee",
232 case 1: pValues
[nProp
] <<= m_aEnvItem
.m_aSendText
; break;// "Inscription/Sender",
233 case 2: pValues
[nProp
] <<= m_aEnvItem
.m_bSend
; break;// "Inscription/UseSender",
234 case 3: pValues
[nProp
] <<= static_cast <sal_Int32
>(convertTwipToMm100(m_aEnvItem
.m_nAddrFromLeft
)) ; break;// "Format/AddresseeFromLeft",
235 case 4: pValues
[nProp
] <<= static_cast <sal_Int32
>(convertTwipToMm100(m_aEnvItem
.m_nAddrFromTop
)) ; break;// "Format/AddresseeFromTop",
236 case 5: pValues
[nProp
] <<= static_cast <sal_Int32
>(convertTwipToMm100(m_aEnvItem
.m_nSendFromLeft
)) ; break;// "Format/SenderFromLeft",
237 case 6: pValues
[nProp
] <<= static_cast <sal_Int32
>(convertTwipToMm100(m_aEnvItem
.m_nSendFromTop
)) ; break;// "Format/SenderFromTop",
238 case 7: pValues
[nProp
] <<= static_cast <sal_Int32
>(convertTwipToMm100(m_aEnvItem
.m_nWidth
)) ; break;// "Format/Width",
239 case 8: pValues
[nProp
] <<= static_cast <sal_Int32
>(convertTwipToMm100(m_aEnvItem
.m_nHeight
)) ; break;// "Format/Height",
240 case 9: pValues
[nProp
] <<= sal_Int32(m_aEnvItem
.m_eAlign
); break;// "Print/Alignment",
241 case 10: pValues
[nProp
] <<= m_aEnvItem
.m_bPrintFromAbove
; break;// "Print/FromAbove",
242 case 11: pValues
[nProp
] <<= static_cast <sal_Int32
>(convertTwipToMm100(m_aEnvItem
.m_nShiftRight
));break; // "Print/Right",
243 case 12: pValues
[nProp
] <<= static_cast <sal_Int32
>(convertTwipToMm100(m_aEnvItem
.m_nShiftDown
)); break;// "Print/Down"
246 PutProperties(aNames
, aValues
);
249 void SwEnvCfgItem::Notify( const css::uno::Sequence
< OUString
>& ) {}
251 Sequence
<OUString
> SwEnvCfgItem::GetPropertyNames()
253 static const char* aPropNames
[] =
255 "Inscription/Addressee", // 0
256 "Inscription/Sender", // 1
257 "Inscription/UseSender", // 2
258 "Format/AddresseeFromLeft", // 3
259 "Format/AddresseeFromTop", // 4
260 "Format/SenderFromLeft", // 5
261 "Format/SenderFromTop", // 6
263 "Format/Height", // 8
264 "Print/Alignment", // 9
265 "Print/FromAbove", // 10
269 const int nCount
= 13;
270 Sequence
<OUString
> aNames(nCount
);
271 OUString
* pNames
= aNames
.getArray();
273 for(int i
= 0; i
< nCount
; i
++)
274 pNames
[i
] = OUString::createFromAscii(aPropNames
[i
]);
279 bool SwEnvItem::QueryValue( Any
& rVal
, sal_uInt8 nMemberId
) const
282 switch(nMemberId
& ~CONVERT_TWIPS
)
284 case MID_ENV_ADDR_TEXT
: rVal
<<= m_aAddrText
; break;
285 case MID_ENV_SEND
: rVal
<<= m_bSend
; break;
286 case MID_SEND_TEXT
: rVal
<<= m_aSendText
; break;
287 case MID_ENV_ADDR_FROM_LEFT
: rVal
<<= m_nAddrFromLeft
; break;
288 case MID_ENV_ADDR_FROM_TOP
: rVal
<<= m_nAddrFromTop
; break;
289 case MID_ENV_SEND_FROM_LEFT
: rVal
<<= m_nSendFromLeft
; break;
290 case MID_ENV_SEND_FROM_TOP
: rVal
<<= m_nSendFromTop
; break;
291 case MID_ENV_WIDTH
: rVal
<<= m_nWidth
; break;
292 case MID_ENV_HEIGHT
: rVal
<<= m_nHeight
; break;
293 case MID_ENV_ALIGN
: rVal
<<= static_cast<sal_Int16
>(m_eAlign
); break;
294 case MID_ENV_PRINT_FROM_ABOVE
: rVal
<<= m_bPrintFromAbove
; break;
295 case MID_ENV_SHIFT_RIGHT
: rVal
<<= m_nShiftRight
; break;
296 case MID_ENV_SHIFT_DOWN
: rVal
<<= m_nShiftDown
; break;
298 OSL_FAIL("Wrong memberId");
304 bool SwEnvItem::PutValue(const Any
& rVal
, sal_uInt8 nMemberId
)
307 switch(nMemberId
& ~CONVERT_TWIPS
)
309 case MID_ENV_ADDR_TEXT
: bRet
= (rVal
>>= m_aAddrText
); break;
310 case MID_ENV_SEND
: bRet
= (rVal
>>= m_bSend
); break;
311 case MID_SEND_TEXT
: bRet
= (rVal
>>= m_aSendText
); break;
312 case MID_ENV_ADDR_FROM_LEFT
: bRet
= (rVal
>>= m_nAddrFromLeft
); break;
313 case MID_ENV_ADDR_FROM_TOP
: bRet
= (rVal
>>= m_nAddrFromTop
); break;
314 case MID_ENV_SEND_FROM_LEFT
: bRet
= (rVal
>>= m_nSendFromLeft
); break;
315 case MID_ENV_SEND_FROM_TOP
: bRet
= (rVal
>>= m_nSendFromTop
); break;
316 case MID_ENV_WIDTH
: bRet
= (rVal
>>= m_nWidth
); break;
317 case MID_ENV_HEIGHT
: bRet
= (rVal
>>= m_nHeight
); break;
321 bRet
= (rVal
>>= nTemp
);
323 m_eAlign
= SwEnvAlign(nTemp
);
326 case MID_ENV_PRINT_FROM_ABOVE
: bRet
= (rVal
>>= m_bPrintFromAbove
); break;
327 case MID_ENV_SHIFT_RIGHT
: bRet
= (rVal
>>= m_nShiftRight
); break;
328 case MID_ENV_SHIFT_DOWN
: bRet
= (rVal
>>= m_nShiftDown
); break;
330 OSL_FAIL("Wrong memberId");
335 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */