xref: /trunk/main/sw/source/ui/envelp/envfmt.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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 #ifdef SW_DLLIMPLEMENTATION
32 #undef SW_DLLIMPLEMENTATION
33 #endif
34 
35 
36 
37 
38 #include <hintids.hxx>
39 
40 #include <tools/pstm.hxx>
41 
42 #define _SVSTDARR_LONGSSORT
43 #define _SVSTDARR_LONGS
44 #include <svl/svstdarr.hxx>
45 #include <editeng/paperinf.hxx>
46 #ifndef _SVX_TSTPITEM_HXX //autogen
47 #include <editeng/tstpitem.hxx>
48 #endif
49 #include <editeng/lrspitem.hxx>
50 #include <editeng/brshitem.hxx>
51 #ifndef _MSGBOX_HXX //autogen
52 #include <vcl/msgbox.hxx>
53 #endif
54 #ifndef _MENU_HXX //autogen
55 #include <vcl/menu.hxx>
56 #endif
57 
58 #ifndef _CMDID_H
59 #include <cmdid.h>
60 #endif
61 #include <frmatr.hxx>
62 #include <swtypes.hxx>
63 #include <wrtsh.hxx>
64 #ifndef _VIEW_HXX
65 #include <view.hxx>
66 #endif
67 #ifndef _BASESH_HXX
68 #include <basesh.hxx>
69 #endif
70 #include <drpcps.hxx>
71 #include <envfmt.hxx>
72 #include <fmtcol.hxx>
73 #ifndef _PARDLG_HXX
74 #include "swuipardlg.hxx"
75 #endif
76 #include <pattern.hxx>
77 #include <poolfmt.hxx>
78 #include <uiborder.hxx>
79 #include <uitool.hxx>
80 
81 #ifndef _ENVFMT_HRC
82 #include <envfmt.hrc>
83 #endif
84 
85 #include "swabstdlg.hxx"
86 #include "chrdlg.hrc"
87 
88 namespace swui
89 {
90     SwAbstractDialogFactory * GetFactory();
91 }
92 
93 static PopupMenu *pMenu;
94 static long lUserW = 5669; // 10 cm
95 static long lUserH = 5669; // 10 cm
96 
97 // --------------------------------------------------------------------------
98 
99 
100 SwEnvFmtPage::SwEnvFmtPage(Window* pParent, const SfxItemSet& rSet) :
101 
102     SfxTabPage(pParent, SW_RES(TP_ENV_FMT), rSet),
103 
104     aAddrFL             (this, SW_RES( FL_ADDRESSEE )),
105     aAddrPosInfo        (this, SW_RES( TXT_ADDR_POS )),
106     aAddrLeftText       (this, SW_RES( TXT_ADDR_LEFT )),
107     aAddrLeftField      (this, SW_RES( FLD_ADDR_LEFT )),
108     aAddrTopText        (this, SW_RES( TXT_ADDR_TOP )),
109     aAddrTopField       (this, SW_RES( FLD_ADDR_TOP )),
110     aAddrFormatInfo     (this, SW_RES( TXT_ADDR_FORMAT )),
111     aAddrEditButton     (this, SW_RES( BTN_ADDR_EDIT )),
112     aSendFL             (this, SW_RES( FL_SENDER )),
113     aSendPosInfo        (this, SW_RES( TXT_SEND_POS )),
114     aSendLeftText       (this, SW_RES( TXT_SEND_LEFT )),
115     aSendLeftField      (this, SW_RES( FLD_SEND_LEFT )),
116     aSendTopText        (this, SW_RES( TXT_SEND_TOP )),
117     aSendTopField       (this, SW_RES( FLD_SEND_TOP )),
118     aSendFormatInfo     (this, SW_RES( TXT_SEND_FORMAT )),
119     aSendEditButton     (this, SW_RES( BTN_SEND_EDIT )),
120     aSizeFL             (this, SW_RES( FL_SIZE )),
121     aSizeFormatText     (this, SW_RES( TXT_SIZE_FORMAT )),
122     aSizeFormatBox      (this, SW_RES( BOX_SIZE_FORMAT )),
123     aSizeWidthText      (this, SW_RES( TXT_SIZE_WIDTH )),
124     aSizeWidthField     (this, SW_RES( FLD_SIZE_WIDTH )),
125     aSizeHeightText     (this, SW_RES( TXT_SIZE_HEIGHT )),
126     aSizeHeightField    (this, SW_RES( FLD_SIZE_HEIGHT )),
127     aPreview            (this, SW_RES( WIN_PREVIEW ))
128 
129 {
130     FreeResource();
131     SetExchangeSupport();
132 
133     // Metriken
134     FieldUnit aMetric = ::GetDfltMetric(sal_False);
135     SetMetric(aAddrLeftField,   aMetric);
136     SetMetric(aAddrTopField,    aMetric);
137     SetMetric(aSendLeftField,   aMetric);
138     SetMetric(aSendTopField,    aMetric);
139     SetMetric(aSizeWidthField,  aMetric);
140     SetMetric(aSizeHeightField, aMetric);
141 
142     // Menues einhaengen
143     ::pMenu = new PopupMenu(SW_RES(MNU_EDIT));
144     aAddrEditButton.SetPopupMenu(::pMenu);
145     aSendEditButton.SetPopupMenu(::pMenu);
146 
147     // Handler installieren
148     Link aLk = LINK(this, SwEnvFmtPage, ModifyHdl);
149     aAddrLeftField  .SetUpHdl( aLk );
150     aAddrTopField   .SetUpHdl( aLk );
151     aSendLeftField  .SetUpHdl( aLk );
152     aSendTopField   .SetUpHdl( aLk );
153     aSizeWidthField .SetUpHdl( aLk );
154     aSizeHeightField.SetUpHdl( aLk );
155 
156     aAddrLeftField  .SetDownHdl( aLk );
157     aAddrTopField   .SetDownHdl( aLk );
158     aSendLeftField  .SetDownHdl( aLk );
159     aSendTopField   .SetDownHdl( aLk );
160     aSizeWidthField .SetDownHdl( aLk );
161     aSizeHeightField.SetDownHdl( aLk );
162 
163     aAddrLeftField  .SetLoseFocusHdl( aLk );
164     aAddrTopField   .SetLoseFocusHdl( aLk );
165     aSendLeftField  .SetLoseFocusHdl( aLk );
166     aSendTopField   .SetLoseFocusHdl( aLk );
167     aSizeWidthField .SetLoseFocusHdl( aLk );
168     aSizeHeightField.SetLoseFocusHdl( aLk );
169 
170     aLk = LINK(this, SwEnvFmtPage, EditHdl );
171     aAddrEditButton.SetSelectHdl( aLk );
172     aSendEditButton.SetSelectHdl( aLk );
173 
174     aPreview.SetBorderStyle( WINDOW_BORDER_MONO );
175 
176     aSizeFormatBox     .SetSelectHdl(LINK(this, SwEnvFmtPage, FormatHdl));
177 
178     // aSizeFormatBox
179     for (sal_uInt16 i = PAPER_A3; i <= PAPER_KAI32BIG; i++)
180     {
181         if (i != PAPER_USER)
182         {
183             String aPaperName = SvxPaperInfo::GetName((Paper) i),
184                    aEntryName;
185 
186             sal_uInt16 nPos   = 0;
187             sal_Bool   bFound = sal_False;
188             while (nPos < aSizeFormatBox.GetEntryCount() && !bFound)
189             {
190                 aEntryName = aSizeFormatBox.GetEntry(i);
191                 if (aEntryName < aPaperName)
192                     nPos++;
193                 else
194                     bFound = sal_True;
195             }
196             aSizeFormatBox.InsertEntry(aPaperName, nPos);
197             aIDs.Insert((sal_uInt16) i, nPos);
198         }
199     }
200     aSizeFormatBox.InsertEntry(SvxPaperInfo::GetName(PAPER_USER));
201     aIDs.Insert((sal_uInt16) PAPER_USER, aIDs.Count());
202 
203 }
204 
205 // --------------------------------------------------------------------------
206 
207 
208 __EXPORT SwEnvFmtPage::~SwEnvFmtPage()
209 {
210     aAddrEditButton.SetPopupMenu(0);
211     aSendEditButton.SetPopupMenu(0);
212     delete ::pMenu;
213 }
214 
215 // --------------------------------------------------------------------------
216 
217 
218 IMPL_LINK_INLINE_START( SwEnvFmtPage, ModifyHdl, Edit *, pEdit )
219 {
220     long lWVal = static_cast< long >(GetFldVal(aSizeWidthField ));
221     long lHVal = static_cast< long >(GetFldVal(aSizeHeightField));
222 
223     long lWidth  = Max(lWVal, lHVal);
224     long lHeight = Min(lWVal, lHVal);
225 
226     if (pEdit == &aSizeWidthField || pEdit == &aSizeHeightField)
227     {
228         Paper ePaper = SvxPaperInfo::GetSvxPaper(
229             Size(lHeight, lWidth), MAP_TWIP, sal_True);
230         for (sal_uInt16 i = 0; i < aIDs.Count(); i++)
231             if (aIDs[i] == (sal_uInt16)ePaper)
232                 aSizeFormatBox.SelectEntryPos(i);
233 
234         // Benutzergroesse merken
235         if (aIDs[aSizeFormatBox.GetSelectEntryPos()] == (sal_uInt16)PAPER_USER)
236         {
237             lUserW = lWidth ;
238             lUserH = lHeight;
239         }
240 
241         aSizeFormatBox.GetSelectHdl().Call(&aSizeFormatBox);
242     }
243     else
244     {
245         FillItem(GetParent()->aEnvItem);
246         SetMinMax();
247         aPreview.Invalidate();
248     }
249     return 0;
250 }
251 IMPL_LINK_INLINE_END( SwEnvFmtPage, ModifyHdl, Edit *, pEdit )
252 
253 // --------------------------------------------------------------------------
254 
255 
256 IMPL_LINK( SwEnvFmtPage, EditHdl, MenuButton *, pButton )
257 {
258     SwWrtShell* pSh = GetParent()->pSh;
259     ASSERT(pSh, "Shell fehlt");
260 
261     // Collection-Ptr ermitteln
262     sal_Bool bSender = pButton != &aAddrEditButton;
263 
264     SwTxtFmtColl* pColl = pSh->GetTxtCollFromPool( static_cast< sal_uInt16 >(
265         bSender ? RES_POOLCOLL_SENDADRESS : RES_POOLCOLL_JAKETADRESS));
266     ASSERT(pColl, "Text-Collection fehlt");
267 
268     switch (pButton->GetCurItemId())
269     {
270         case MID_CHAR:
271         {
272             SfxItemSet *pCollSet = GetCollItemSet(pColl, bSender);
273 
274             // Damit die Hintergrundfarbe nicht uebergebuegelt wird:
275             SfxAllItemSet aTmpSet(*pCollSet);
276 
277             // Das CHRATR_BACKGROUND-Attribut wird fuer den Dialog in
278             // ein RES_BACKGROUND verwandelt und wieder zurueck ...
279             const SfxPoolItem *pTmpBrush;
280 
281             if( SFX_ITEM_SET == aTmpSet.GetItemState( RES_CHRATR_BACKGROUND,
282                 sal_True, &pTmpBrush ) )
283             {
284                 SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
285                 aTmpBrush.SetWhich( RES_BACKGROUND );
286                 aTmpSet.Put( aTmpBrush );
287             }
288             else
289                 aTmpSet.ClearItem( RES_BACKGROUND );
290 
291             SwAbstractDialogFactory* pFact = swui::GetFactory();
292             DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
293 
294             SfxAbstractTabDialog* pDlg = pFact->CreateSwCharDlg( GetParent(), pSh->GetView(), aTmpSet, DLG_CHAR ,&pColl->GetName() );
295             DBG_ASSERT(pDlg, "Dialogdiet fail!");
296             if (pDlg->Execute() == RET_OK)
297             {
298                 SfxItemSet aOutputSet( *pDlg->GetOutputItemSet() );
299                 if( SFX_ITEM_SET == aOutputSet.GetItemState( RES_BACKGROUND,
300                     sal_False, &pTmpBrush ) )
301                 {
302                     SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) );
303                     aTmpBrush.SetWhich( RES_CHRATR_BACKGROUND );
304                     pCollSet->Put( aTmpBrush );
305                 }
306                 aOutputSet.ClearItem( RES_BACKGROUND );
307                 //pColl->SetAttr( aTmpSet );
308                 pCollSet->Put(aOutputSet);
309             }
310             delete pDlg;
311         }
312         break;
313 
314         case MID_PARA:
315         {
316             SfxItemSet *pCollSet = GetCollItemSet(pColl, bSender);
317 
318             // Damit die Tabulatoren nicht uebergebuegelt werden:
319             SfxAllItemSet aTmpSet(*pCollSet);
320 
321             // Tabulatoren, DefaultTabs ins ItemSet Stecken
322             const SvxTabStopItem& rDefTabs = (const SvxTabStopItem&)
323                 pSh->GetView().GetCurShell()->GetPool().GetDefaultItem(RES_PARATR_TABSTOP);
324 
325             sal_uInt16 nDefDist = ::GetTabDist( rDefTabs );
326             SfxUInt16Item aDefDistItem( SID_ATTR_TABSTOP_DEFAULTS, nDefDist );
327             aTmpSet.Put( aDefDistItem );
328 
329             // Aktueller Tab
330             SfxUInt16Item aTabPos( SID_ATTR_TABSTOP_POS, 0 );
331             aTmpSet.Put( aTabPos );
332 
333             // linker Rand als Offset
334             const long nOff = ((SvxLRSpaceItem&)aTmpSet.Get( RES_LR_SPACE )).
335                                                                 GetTxtLeft();
336             SfxInt32Item aOff( SID_ATTR_TABSTOP_OFFSET, nOff );
337             aTmpSet.Put( aOff );
338 
339             // BoxInfo setzen
340             ::PrepareBoxInfo( aTmpSet, *pSh );
341 
342             SwParaDlg *pDlg = new SwParaDlg(GetParent(), pSh->GetView(), aTmpSet, DLG_ENVELOP, &pColl->GetName());
343 
344             if ( pDlg->Execute() == RET_OK )
345             {
346                 // Defaults evtl umsetzen
347                 const SfxPoolItem* pItem = 0;
348                 SfxItemSet* pOutputSet = (SfxItemSet*)pDlg->GetOutputItemSet();
349                 sal_uInt16 nNewDist;
350                 if( SFX_ITEM_SET == pOutputSet->GetItemState( SID_ATTR_TABSTOP_DEFAULTS,
351                     sal_False, &pItem ) &&
352                     nDefDist != (nNewDist = ((SfxUInt16Item*)pItem)->GetValue()) )
353                 {
354                     SvxTabStopItem aDefTabs( 0, 0, SVX_TAB_ADJUST_DEFAULT, RES_PARATR_TABSTOP );
355                     MakeDefTabs( nNewDist, aDefTabs );
356                     pSh->SetDefault( aDefTabs );
357                     pOutputSet->ClearItem( SID_ATTR_TABSTOP_DEFAULTS );
358                 }
359                 if( pOutputSet->Count() )
360                 {
361                     //pColl->SetAttr( *pOutputSet );
362                     pCollSet->Put(*pOutputSet);
363                 }
364             }
365             delete pDlg;
366         }
367         break;
368     }
369     return 0;
370 }
371 
372 /*------------------------------------------------------------------------
373   Beschreibung: Ein temporaeres Itemset, das bei Abbruch verworfen wird
374 ------------------------------------------------------------------------*/
375 
376 SfxItemSet *SwEnvFmtPage::GetCollItemSet(SwTxtFmtColl* pColl, sal_Bool bSender)
377 {
378     SfxItemSet *&pAddrSet = bSender ? GetParent()->pSenderSet : GetParent()->pAddresseeSet;
379 
380     if (!pAddrSet)
381     {
382         // Range ermitteln (Ranges beider Itemsets mergen)
383         const sal_uInt16 *pRanges = pColl->GetAttrSet().GetRanges();
384 
385         static sal_uInt16 __READONLY_DATA aRanges[] =
386         {
387             RES_PARATR_BEGIN, RES_PARATR_ADJUST,
388             RES_PARATR_TABSTOP, RES_PARATR_END-1,
389             RES_LR_SPACE, RES_UL_SPACE,
390             RES_BACKGROUND, RES_SHADOW,
391             SID_ATTR_TABSTOP_POS, SID_ATTR_TABSTOP_POS,
392             SID_ATTR_TABSTOP_DEFAULTS, SID_ATTR_TABSTOP_DEFAULTS,
393             SID_ATTR_TABSTOP_OFFSET, SID_ATTR_TABSTOP_OFFSET,
394             SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
395             0, 0
396         };
397 
398         // BruteForce-Merge, weil MergeRange in SvTools buggy ist:
399         sal_uInt16 i = 0;
400         SvLongsSort aMergedRanges( 0, 10 );
401 
402         while (pRanges[i])
403         {
404             for (sal_uInt16 nPos = pRanges[i]; nPos <= pRanges[i+1]; nPos++)
405                 aMergedRanges.Insert(nPos);
406             i += 2;
407         }
408 
409         i = 0;
410 
411         while (aRanges[i])
412         {
413             for (sal_uInt16 nPos = aRanges[i]; nPos <= aRanges[i+1]; nPos++)
414                 aMergedRanges.Insert(nPos);
415             i += 2;
416         }
417 
418         // Ranges kompaktieren
419         SvLongs aCompactedRanges( 0, 10 );
420 
421         aCompactedRanges.Insert(aMergedRanges[0], aCompactedRanges.Count());
422 
423         for (i = 0; i < aMergedRanges.Count(); i++)
424         {
425             while (i + 1 < aMergedRanges.Count() &&
426                 aMergedRanges[i+1] - aMergedRanges[i] == 1)
427             {
428                 i++;
429             }
430             long nEnd = aMergedRanges[i];
431             aCompactedRanges.Insert(nEnd, aCompactedRanges.Count());
432 
433             if (i + 1 < aMergedRanges.Count())
434             {
435                 long nStart = aMergedRanges[i+1];
436                 aCompactedRanges.Insert(nStart, aCompactedRanges.Count());
437             }
438         }
439 
440         // Neue Ranges erzeugen
441         sal_uInt16 *pNewRanges = new sal_uInt16[aCompactedRanges.Count() + 1];
442         for (i = 0; i < aCompactedRanges.Count(); i++)
443             pNewRanges[i] = (sal_uInt16)aCompactedRanges[i];
444 
445         pNewRanges[i] = 0;
446 
447         pAddrSet = new SfxItemSet(GetParent()->pSh->GetView().GetCurShell()->GetPool(),
448                                 pNewRanges);
449 
450         pAddrSet->Put(pColl->GetAttrSet());
451         delete[] pNewRanges;
452     }
453 
454     return pAddrSet;
455 }
456 
457 // --------------------------------------------------------------------------
458 
459 
460 IMPL_LINK( SwEnvFmtPage, FormatHdl, ListBox *, EMPTYARG )
461 {
462     long lWidth;
463     long lHeight;
464     long lSendFromLeft;
465     long lSendFromTop;
466     long lAddrFromLeft;
467     long lAddrFromTop;
468 
469     sal_uInt16 nPaper = aIDs[aSizeFormatBox.GetSelectEntryPos()];
470     if (nPaper != (sal_uInt16)PAPER_USER)
471     {
472         Size aSz = SvxPaperInfo::GetPaperSize((Paper)nPaper);
473         lWidth  = Max(aSz.Width(), aSz.Height());
474         lHeight = Min(aSz.Width(), aSz.Height());
475     }
476     else
477     {
478         lWidth  = lUserW;
479         lHeight = lUserH;
480     }
481 
482     lSendFromLeft = 566;            // 1cm
483     lSendFromTop  = 566;            // 1cm
484     lAddrFromLeft = lWidth  / 2;
485     lAddrFromTop  = lHeight / 2;
486 
487     SetFldVal(aAddrLeftField, lAddrFromLeft);
488     SetFldVal(aAddrTopField , lAddrFromTop );
489     SetFldVal(aSendLeftField, lSendFromLeft);
490     SetFldVal(aSendTopField , lSendFromTop );
491 
492     SetFldVal(aSizeWidthField , lWidth );
493     SetFldVal(aSizeHeightField, lHeight);
494 
495     SetMinMax();
496 
497     FillItem(GetParent()->aEnvItem);
498     aPreview.Invalidate();
499     return 0;
500 }
501 
502 // --------------------------------------------------------------------------
503 
504 
505 void SwEnvFmtPage::SetMinMax()
506 {
507     long lWVal = static_cast< long >(GetFldVal(aSizeWidthField ));
508     long lHVal = static_cast< long >(GetFldVal(aSizeHeightField));
509 
510     long lWidth  = Max(lWVal, lHVal),
511          lHeight = Min(lWVal, lHVal);
512 
513     // Min und Max
514     aAddrLeftField.SetMin((long) 100 * (GetFldVal(aSendLeftField) + 566), FUNIT_TWIP);
515     aAddrLeftField.SetMax((long) 100 * (lWidth  - 2 * 566), FUNIT_TWIP);
516     aAddrTopField .SetMin((long) 100 * (GetFldVal(aSendTopField ) + 2 * 566), FUNIT_TWIP);
517     aAddrTopField .SetMax((long) 100 * (lHeight - 2 * 566), FUNIT_TWIP);
518     aSendLeftField.SetMin((long) 100 * (566), FUNIT_TWIP);
519     aSendLeftField.SetMax((long) 100 * (GetFldVal(aAddrLeftField) - 566), FUNIT_TWIP);
520     aSendTopField .SetMin((long) 100 * (566), FUNIT_TWIP);
521     aSendTopField .SetMax((long) 100 * (GetFldVal(aAddrTopField ) - 2 * 566), FUNIT_TWIP);
522 
523     // First und Last
524     aAddrLeftField.SetFirst(aAddrLeftField.GetMin());
525     aAddrLeftField.SetLast (aAddrLeftField.GetMax());
526     aAddrTopField .SetFirst(aAddrTopField .GetMin());
527     aAddrTopField .SetLast (aAddrTopField .GetMax());
528     aSendLeftField.SetFirst(aSendLeftField.GetMin());
529     aSendLeftField.SetLast (aSendLeftField.GetMax());
530     aSendTopField .SetFirst(aSendTopField .GetMin());
531     aSendTopField .SetLast (aSendTopField .GetMax());
532 
533     // Fields neu formatieren
534     aAddrLeftField  .Reformat();
535     aAddrTopField   .Reformat();
536     aSendLeftField  .Reformat();
537     aSendTopField   .Reformat();
538     aSizeWidthField .Reformat();
539     aSizeHeightField.Reformat();
540 }
541 
542 // --------------------------------------------------------------------------
543 
544 
545 SfxTabPage* __EXPORT SwEnvFmtPage::Create(Window* pParent, const SfxItemSet& rSet)
546 {
547     return new SwEnvFmtPage(pParent, rSet);
548 }
549 
550 // ----------------------------------------------------------------------------
551 
552 
553 void __EXPORT SwEnvFmtPage::ActivatePage(const SfxItemSet& rSet)
554 {
555     SfxItemSet aSet(rSet);
556     aSet.Put(GetParent()->aEnvItem);
557     Reset(aSet);
558 }
559 
560 // ----------------------------------------------------------------------------
561 
562 
563 int __EXPORT SwEnvFmtPage::DeactivatePage(SfxItemSet* _pSet)
564 {
565     if( _pSet )
566         FillItemSet(*_pSet);
567     return SfxTabPage::LEAVE_PAGE;
568 }
569 
570 // --------------------------------------------------------------------------
571 
572 
573 void SwEnvFmtPage::FillItem(SwEnvItem& rItem)
574 {
575     rItem.lAddrFromLeft = static_cast< sal_Int32 >(GetFldVal(aAddrLeftField));
576     rItem.lAddrFromTop  = static_cast< sal_Int32 >(GetFldVal(aAddrTopField ));
577     rItem.lSendFromLeft = static_cast< sal_Int32 >(GetFldVal(aSendLeftField));
578     rItem.lSendFromTop  = static_cast< sal_Int32 >(GetFldVal(aSendTopField ));
579 
580     sal_uInt16 nPaper = aIDs[aSizeFormatBox.GetSelectEntryPos()];
581     if (nPaper == (sal_uInt16)PAPER_USER)
582     {
583         long lWVal = static_cast< long >(GetFldVal(aSizeWidthField ));
584         long lHVal = static_cast< long >(GetFldVal(aSizeHeightField));
585         rItem.lWidth  = Max(lWVal, lHVal);
586         rItem.lHeight = Min(lWVal, lHVal);
587     }
588     else
589     {
590         long lWVal = SvxPaperInfo::GetPaperSize((Paper)nPaper).Width ();
591         long lHVal = SvxPaperInfo::GetPaperSize((Paper)nPaper).Height();
592         rItem.lWidth  = Max(lWVal, lHVal);
593         rItem.lHeight = Min(lWVal, lHVal);
594     }
595 }
596 
597 // --------------------------------------------------------------------------
598 
599 
600 sal_Bool __EXPORT SwEnvFmtPage::FillItemSet(SfxItemSet& rSet)
601 {
602     FillItem(GetParent()->aEnvItem);
603     rSet.Put(GetParent()->aEnvItem);
604     return sal_True;
605 }
606 
607 // --------------------------------------------------------------------------
608 
609 
610 void __EXPORT SwEnvFmtPage::Reset(const SfxItemSet& rSet)
611 {
612     const SwEnvItem& rItem = (const SwEnvItem&) rSet.Get(FN_ENVELOP);
613 
614     Paper ePaper = SvxPaperInfo::GetSvxPaper(
615         Size( Min(rItem.lWidth, rItem.lHeight),
616         Max(rItem.lWidth, rItem.lHeight)), MAP_TWIP, sal_True);
617     for (sal_uInt16 i = 0; i < (sal_uInt16) aIDs.Count(); i++)
618         if (aIDs[i] == (sal_uInt16)ePaper)
619             aSizeFormatBox.SelectEntryPos(i);
620 
621     // Die MetricFields
622     SetFldVal(aAddrLeftField, rItem.lAddrFromLeft);
623     SetFldVal(aAddrTopField , rItem.lAddrFromTop );
624     SetFldVal(aSendLeftField, rItem.lSendFromLeft);
625     SetFldVal(aSendTopField , rItem.lSendFromTop );
626     SetFldVal(aSizeWidthField  , Max(rItem.lWidth, rItem.lHeight));
627     SetFldVal(aSizeHeightField , Min(rItem.lWidth, rItem.lHeight));
628     SetMinMax();
629 
630     DELETEZ(GetParent()->pSenderSet);
631     DELETEZ(GetParent()->pAddresseeSet);
632 }
633 
634 
635 
636