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