xref: /AOO41X/main/sw/source/ui/envelp/envimg.cxx (revision efeef26f81c84063fb0a91bde3856d4a51172d90)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 
27 
28 #include <hintids.hxx>
29 #include <tools/stream.hxx>
30 #include <tools/resid.hxx>
31 #include <sfx2/app.hxx>
32 #include <editeng/paperinf.hxx>
33 #include <com/sun/star/uno/Sequence.hxx>
34 #include <unotools/useroptions.hxx>
35 #include <tools/shl.hxx>
36 #include <swmodule.hxx>
37 #include <errhdl.hxx>
38 #include <swtypes.hxx>
39 #include <envimg.hxx>
40 
41 #ifndef _CMDID_H
42 #include <cmdid.h>
43 #endif
44 #ifndef _ENVELP_HRC
45 #include <envelp.hrc>
46 #endif
47 
48 #include <unomid.h>
49 
50 #ifdef WNT
51 #define NEXTLINE  UniString::CreateFromAscii("\r\n")
52 #else
53 #define NEXTLINE  '\n'
54 #endif
55 
56 using namespace utl;
57 using namespace rtl;
58 using namespace ::com::sun::star::uno;
59 
60 
61 TYPEINIT1_AUTOFACTORY( SwEnvItem, SfxPoolItem );
62 
63 // --------------------------------------------------------------------------
MakeSender()64 SW_DLLPUBLIC String MakeSender()
65 {
66     SvtUserOptions& rUserOpt = SW_MOD()->GetUserOptions();
67 
68     String sRet;
69     String sSenderToken(SW_RES(STR_SENDER_TOKENS));
70     xub_StrLen nSttPos = 0, nTokenCount = sSenderToken.GetTokenCount(';');
71     sal_Bool bLastLength = sal_True;
72     for( xub_StrLen i = 0; i < nTokenCount; i++ )
73     {
74         String sToken = sSenderToken.GetToken( 0, ';', nSttPos );
75         if(sToken.EqualsAscii("COMPANY"))
76         {
77             xub_StrLen nOldLen = sRet.Len();
78             sRet += (String)rUserOpt.GetCompany();
79             bLastLength = sRet.Len() != nOldLen;
80         }
81         else if(sToken.EqualsAscii("CR"))
82         {
83             if(bLastLength)
84                 sRet +=NEXTLINE;
85             bLastLength = sal_True;
86         }
87         else if(sToken.EqualsAscii("FIRSTNAME"))
88             sRet += (String)rUserOpt.GetFirstName();
89         else if(sToken.EqualsAscii("LASTNAME"))
90             sRet += (String)rUserOpt.GetLastName();
91         else if(sToken.EqualsAscii("ADDRESS"))
92             sRet += (String)rUserOpt.GetStreet();
93         else if(sToken.EqualsAscii("COUNTRY"))
94             sRet += (String)rUserOpt.GetCountry();
95         else if(sToken.EqualsAscii("POSTALCODE"))
96             sRet += (String)rUserOpt.GetZip();
97         else if(sToken.EqualsAscii("CITY"))
98             sRet += (String)rUserOpt.GetCity();
99         else if(sToken.EqualsAscii("STATEPROV"))
100             sRet += (String)rUserOpt.GetState();
101         else if(sToken.Len()) //spaces
102             sRet += sToken;
103     }
104     return sRet;
105 }
106 // --------------------------------------------------------------------------
SwEnvItem()107 SwEnvItem::SwEnvItem() :
108     SfxPoolItem(FN_ENVELOP)
109 {
110     aAddrText       = aEmptyStr;
111     bSend           = sal_True;
112     aSendText       = MakeSender();
113     lSendFromLeft   = 566; // 1 cm
114     lSendFromTop    = 566; // 1 cm
115     Size aEnvSz     = SvxPaperInfo::GetPaperSize(PAPER_ENV_C65);
116     lWidth          = aEnvSz.Width();
117     lHeight         = aEnvSz.Height();
118     eAlign          = ENV_HOR_LEFT;
119     bPrintFromAbove = sal_True;
120     lShiftRight     = 0;
121     lShiftDown      = 0;
122 
123     lAddrFromLeft   = Max(lWidth, lHeight) / 2;
124     lAddrFromTop    = Min(lWidth, lHeight) / 2;
125 }
126 // --------------------------------------------------------------------------
SwEnvItem(const SwEnvItem & rItem)127 SwEnvItem::SwEnvItem(const SwEnvItem& rItem) :
128     SfxPoolItem(FN_ENVELOP),
129     aAddrText      (rItem.aAddrText),
130     bSend          (rItem.bSend),
131     aSendText      (rItem.aSendText),
132     lAddrFromLeft  (rItem.lAddrFromLeft),
133     lAddrFromTop   (rItem.lAddrFromTop),
134     lSendFromLeft  (rItem.lSendFromLeft),
135     lSendFromTop   (rItem.lSendFromTop),
136     lWidth         (rItem.lWidth),
137     lHeight        (rItem.lHeight),
138     eAlign         (rItem.eAlign),
139     bPrintFromAbove(rItem.bPrintFromAbove),
140     lShiftRight    (rItem.lShiftRight),
141     lShiftDown     (rItem.lShiftDown)
142 {
143 }
144 
145 // --------------------------------------------------------------------------
operator =(const SwEnvItem & rItem)146 SwEnvItem& SwEnvItem::operator =(const SwEnvItem& rItem)
147 {
148     aAddrText       = rItem.aAddrText;
149     bSend           = rItem.bSend;
150     aSendText       = rItem.aSendText;
151     lSendFromLeft   = rItem.lSendFromLeft;
152     lSendFromTop    = rItem.lSendFromTop;
153     lAddrFromLeft   = rItem.lAddrFromLeft;
154     lAddrFromTop    = rItem.lAddrFromTop;
155     lWidth          = rItem.lWidth;
156     lHeight         = rItem.lHeight;
157     eAlign          = rItem.eAlign;
158     bPrintFromAbove = rItem.bPrintFromAbove;
159     lShiftRight     = rItem.lShiftRight;
160     lShiftDown      = rItem.lShiftDown;
161     return *this;
162 }
163 // --------------------------------------------------------------------------
operator ==(const SfxPoolItem & rItem) const164 int SwEnvItem::operator ==(const SfxPoolItem& rItem) const
165 {
166     const SwEnvItem& rEnv = (const SwEnvItem&) rItem;
167 
168     return aAddrText       == rEnv.aAddrText       &&
169            bSend           == rEnv.bSend           &&
170            aSendText       == rEnv.aSendText       &&
171            lSendFromLeft   == rEnv.lSendFromLeft   &&
172            lSendFromTop    == rEnv.lSendFromTop    &&
173            lAddrFromLeft   == rEnv.lAddrFromLeft   &&
174            lAddrFromTop    == rEnv.lAddrFromTop    &&
175            lWidth          == rEnv.lWidth          &&
176            lHeight         == rEnv.lHeight         &&
177            eAlign          == rEnv.eAlign          &&
178            bPrintFromAbove == rEnv.bPrintFromAbove &&
179            lShiftRight     == rEnv.lShiftRight     &&
180            lShiftDown      == rEnv.lShiftDown;
181 }
182 
183 // --------------------------------------------------------------------------
Clone(SfxItemPool *) const184 SfxPoolItem* SwEnvItem::Clone(SfxItemPool*) const
185 {
186     return new SwEnvItem(*this);
187 }
188 // --------------------------------------------------------------------------
189 // --------------------------------------------------------------------------
SwEnvCfgItem()190 SwEnvCfgItem::SwEnvCfgItem() :
191     ConfigItem(C2U("Office.Writer/Envelope"))
192 {
193     Sequence<OUString> aNames = GetPropertyNames();
194     Sequence<Any> aValues = GetProperties(aNames);
195     EnableNotification(aNames);
196     const Any* pValues = aValues.getConstArray();
197     DBG_ASSERT(aValues.getLength() == aNames.getLength(), "GetProperties failed");
198     if(aValues.getLength() == aNames.getLength())
199     {
200         for(int nProp = 0; nProp < aNames.getLength(); nProp++)
201         {
202             if(pValues[nProp].hasValue())
203             {
204                 switch(nProp)
205                 {
206                     case  0: pValues[nProp] >>= aEnvItem.aAddrText; break;// "Inscription/Addressee",
207                     case  1: pValues[nProp] >>= aEnvItem.aSendText; break;// "Inscription/Sender",
208                     case  2: aEnvItem.bSend = *(sal_Bool*)pValues[nProp].getValue(); break;// "Inscription/UseSender",
209                     case  3:
210                         pValues[nProp] >>= aEnvItem.lAddrFromLeft;// "Format/AddresseeFromLeft",
211                         aEnvItem.lAddrFromLeft = MM100_TO_TWIP(aEnvItem.lAddrFromLeft);
212                     break;
213                     case  4:
214                         pValues[nProp] >>= aEnvItem.lAddrFromTop;  // "Format/AddresseeFromTop",
215                         aEnvItem.lAddrFromTop = MM100_TO_TWIP(aEnvItem.lAddrFromTop);
216                     break;
217                     case  5:
218                         pValues[nProp] >>= aEnvItem.lSendFromLeft; // "Format/SenderFromLeft",
219                         aEnvItem.lSendFromLeft = MM100_TO_TWIP(aEnvItem.lSendFromLeft);
220                     break;
221                     case  6:
222                         pValues[nProp] >>= aEnvItem.lSendFromTop;// "Format/SenderFromTop",
223                         aEnvItem.lSendFromTop = MM100_TO_TWIP(aEnvItem.lSendFromTop);
224                     break;
225                     case  7:
226                         pValues[nProp] >>= aEnvItem.lWidth; // "Format/Width",
227                         aEnvItem.lWidth = MM100_TO_TWIP(aEnvItem.lWidth);
228                     break;
229                     case  8:
230                         pValues[nProp] >>= aEnvItem.lHeight; // "Format/Height",
231                         aEnvItem.lHeight = MM100_TO_TWIP(aEnvItem.lHeight);
232                     break;
233                     case  9:
234                     {
235                         sal_Int32 nTemp = 0;
236                         pValues[nProp] >>= nTemp; aEnvItem.eAlign = (SwEnvAlign)nTemp; break;// "Print/Alignment",
237                     }
238                     case 10: aEnvItem.bPrintFromAbove = *(sal_Bool*)pValues[nProp].getValue(); break;// "Print/FromAbove",
239                     case 11:
240                         pValues[nProp] >>= aEnvItem.lShiftRight;
241                         aEnvItem.lShiftRight = MM100_TO_TWIP(aEnvItem.lShiftRight);// "Print/Right",
242                     break;
243                     case 12:
244                         pValues[nProp] >>= aEnvItem.lShiftDown;
245                         aEnvItem.lShiftDown = MM100_TO_TWIP(aEnvItem.lShiftDown);
246                     break;// "Print/Down"
247                 }
248             }
249         }
250     }
251 }
252 /* -----------------------------26.09.00 14:04--------------------------------
253 
254  ---------------------------------------------------------------------------*/
~SwEnvCfgItem()255 SwEnvCfgItem::~SwEnvCfgItem()
256 {
257 }
258 /* -----------------------------26.09.00 14:05--------------------------------
259 
260  ---------------------------------------------------------------------------*/
Commit()261 void    SwEnvCfgItem::Commit()
262 {
263     Sequence<OUString> aNames = GetPropertyNames();
264     Sequence<Any> aValues(aNames.getLength());
265     Any* pValues = aValues.getArray();
266 
267     const Type& rType = ::getBooleanCppuType();
268     for(int nProp = 0; nProp < aNames.getLength(); nProp++)
269     {
270         switch(nProp)
271         {
272             case  0: pValues[nProp] <<= aEnvItem.aAddrText; break;// "Inscription/Addressee",
273             case  1: pValues[nProp] <<= aEnvItem.aSendText; break;// "Inscription/Sender",
274             case  2: pValues[nProp].setValue(&aEnvItem.bSend, rType);break;// "Inscription/UseSender",
275             case  3: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lAddrFromLeft)) ; break;// "Format/AddresseeFromLeft",
276             case  4: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lAddrFromTop))  ; break;// "Format/AddresseeFromTop",
277             case  5: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lSendFromLeft)) ; break;// "Format/SenderFromLeft",
278             case  6: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lSendFromTop))  ; break;// "Format/SenderFromTop",
279             case  7: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lWidth))  ; break;// "Format/Width",
280             case  8: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lHeight)) ; break;// "Format/Height",
281             case  9: pValues[nProp] <<= sal_Int32(aEnvItem.eAlign); break;// "Print/Alignment",
282             case 10: pValues[nProp].setValue(&aEnvItem.bPrintFromAbove, rType); break;// "Print/FromAbove",
283             case 11: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lShiftRight));break; // "Print/Right",
284             case 12: pValues[nProp] <<= static_cast <sal_Int32>(TWIP_TO_MM100(aEnvItem.lShiftDown)); break;// "Print/Down"
285         }
286     }
287     PutProperties(aNames, aValues);
288 }
289 
Notify(const::com::sun::star::uno::Sequence<rtl::OUString> &)290 void SwEnvCfgItem::Notify( const ::com::sun::star::uno::Sequence< rtl::OUString >& ) {}
291 
292 /* -----------------------------26.09.00 14:04--------------------------------
293 
294  ---------------------------------------------------------------------------*/
GetPropertyNames()295 Sequence<rtl::OUString> SwEnvCfgItem::GetPropertyNames()
296 {
297     static const char* aPropNames[] =
298     {
299         "Inscription/Addressee",    //  0
300         "Inscription/Sender",       //  1
301         "Inscription/UseSender",    //  2
302         "Format/AddresseeFromLeft", //  3
303         "Format/AddresseeFromTop",  //  4
304         "Format/SenderFromLeft",    //  5
305         "Format/SenderFromTop",     //  6
306         "Format/Width",             //  7
307         "Format/Height",            //  8
308         "Print/Alignment",          //  9
309         "Print/FromAbove",          // 10
310         "Print/Right",              // 11
311         "Print/Down"                // 12
312     };
313     const int nCount = 13;
314     Sequence<OUString> aNames(nCount);
315     OUString* pNames = aNames.getArray();
316     for(int i = 0; i < nCount; i++)
317         pNames[i] = OUString::createFromAscii(aPropNames[i]);
318     return aNames;
319 }
320 
QueryValue(Any & rVal,sal_uInt8 nMemberId) const321 sal_Bool SwEnvItem::QueryValue( Any& rVal, sal_uInt8 nMemberId ) const
322 {
323     sal_Bool bRet = sal_True;
324     switch(nMemberId & ~CONVERT_TWIPS)
325     {
326         case MID_ENV_ADDR_TEXT : rVal <<= aAddrText; break;
327         case MID_ENV_SEND : rVal <<= bSend; break;
328         case MID_SEND_TEXT : rVal <<= aSendText; break;
329         case MID_ENV_ADDR_FROM_LEFT : rVal <<= lAddrFromLeft; break;
330         case MID_ENV_ADDR_FROM_TOP : rVal <<= lAddrFromTop; break;
331         case MID_ENV_SEND_FROM_LEFT : rVal <<= lSendFromLeft; break;
332         case MID_ENV_SEND_FROM_TOP : rVal <<= lSendFromTop; break;
333         case MID_ENV_WIDTH : rVal <<= lWidth; break;
334         case MID_ENV_HEIGHT : rVal <<= lHeight; break;
335         case MID_ENV_ALIGN            : rVal <<= (sal_Int16) eAlign; break;
336         case MID_ENV_PRINT_FROM_ABOVE  : rVal <<= bPrintFromAbove; break;
337         case MID_ENV_SHIFT_RIGHT      : rVal <<= lShiftRight; break;
338         case MID_ENV_SHIFT_DOWN       : rVal <<= lShiftDown; break;
339         default:
340             DBG_ERROR("Wrong memberId");
341             bRet = sal_False;
342     }
343     return bRet;
344 }
345 /* -----------------------------26.04.01 12:26--------------------------------
346 
347  ---------------------------------------------------------------------------*/
PutValue(const Any & rVal,sal_uInt8 nMemberId)348 sal_Bool SwEnvItem::PutValue(const Any& rVal, sal_uInt8 nMemberId)
349 {
350     sal_Bool bRet = sal_False;
351     switch(nMemberId  & ~CONVERT_TWIPS)
352     {
353         case MID_ENV_ADDR_TEXT : bRet = (rVal >>= aAddrText); break;
354         case MID_ENV_SEND : bRet = (rVal >>= bSend); break;
355         case MID_SEND_TEXT : bRet = (rVal >>= aSendText); break;
356         case MID_ENV_ADDR_FROM_LEFT : bRet = (rVal >>= lAddrFromLeft); break;
357         case MID_ENV_ADDR_FROM_TOP : bRet = (rVal >>= lAddrFromTop); break;
358         case MID_ENV_SEND_FROM_LEFT : bRet = (rVal >>= lSendFromLeft); break;
359         case MID_ENV_SEND_FROM_TOP : bRet = (rVal >>= lSendFromTop); break;
360         case MID_ENV_WIDTH : bRet = (rVal >>= lWidth); break;
361         case MID_ENV_HEIGHT : bRet = (rVal >>= lHeight); break;
362         case MID_ENV_ALIGN :
363         {
364             sal_Int16 nTemp = 0;
365             bRet = (rVal >>= nTemp);
366             if (bRet)
367                 eAlign = SwEnvAlign(nTemp);
368             break;
369         }
370         case MID_ENV_PRINT_FROM_ABOVE  : bRet = (rVal >>= bPrintFromAbove); break;
371         case MID_ENV_SHIFT_RIGHT      : bRet = (rVal >>= lShiftRight); break;
372         case MID_ENV_SHIFT_DOWN       : bRet = (rVal >>= lShiftDown); break;
373         default:
374             DBG_ERROR("Wrong memberId");
375     }
376     return bRet;
377 }
378