xref: /aoo41x/main/sw/source/ui/envelp/envfmt.cxx (revision efeef26f)
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
10*efeef26fSAndrew Rist  *
11*efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*efeef26fSAndrew Rist  *
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.
19*efeef26fSAndrew Rist  *
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