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