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