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