xref: /trunk/main/cui/source/dialogs/zoom.cxx (revision 2ee96f1c)
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_cui.hxx"
26 
27 // include ---------------------------------------------------------------
28 
29 #include <tools/shl.hxx>
30 #include <svl/itemset.hxx>
31 #include <svl/itempool.hxx>
32 #include <sfx2/objsh.hxx>
33 #include <vcl/msgbox.hxx>
34 
35 #define _SVX_ZOOM_CXX
36 
37 #include <cuires.hrc>
38 #include "zoom.hrc"
39 
40 #include "zoom.hxx"
41 #include <svx/zoomitem.hxx>
42 #include <svx/viewlayoutitem.hxx>
43 #include <dialmgr.hxx>
44 #include <svx/zoom_def.hxx>
45 #include <svx/dialogs.hrc>	// RID_SVXDLG_ZOOM
46 #include <layout/layout-pre.hxx>
47 
48 #if ENABLE_LAYOUT
49 #undef CUI_RES
50 #define CUI_RES(x) #x
51 #undef SfxModalDialog
52 #define SfxModalDialog( parent, id ) Dialog( parent, "zoom.xml", id )
53 #endif /* ENABLE_LAYOUT */
54 
55 // static ----------------------------------------------------------------
56 
57 #define SPECIAL_FACTOR	((sal_uInt16)0xFFFF)
58 
59 // class SvxZoomDialog ---------------------------------------------------
60 
GetFactor() const61 sal_uInt16 SvxZoomDialog::GetFactor() const
62 {
63     if ( a100Btn.IsChecked() )
64 		return 100;
65     if ( aUserBtn.IsChecked() )
66 		return (sal_uInt16)aUserEdit.GetValue();
67 	else
68 		return SPECIAL_FACTOR;
69 }
70 
71 // -----------------------------------------------------------------------
72 
SetFactor(sal_uInt16 nNewFactor,sal_uInt16 nBtnId)73 void SvxZoomDialog::SetFactor( sal_uInt16 nNewFactor, sal_uInt16 nBtnId )
74 {
75 	aUserEdit.Disable();
76 
77 	if ( !nBtnId )
78 	{
79         if ( nNewFactor == 100 )
80 		{
81 			a100Btn.Check();
82 			a100Btn.GrabFocus();
83 		}
84         else
85 		{
86 			aUserBtn.Check();
87 			aUserEdit.Enable();
88 			aUserEdit.SetValue( (long)nNewFactor );
89 			aUserEdit.GrabFocus();
90 		}
91 	}
92 	else
93 	{
94 		aUserEdit.SetValue( (long)nNewFactor );
95 
96 		if ( ZOOMBTN_OPTIMAL == nBtnId )
97 		{
98 			aOptimalBtn.Check();
99 			aOptimalBtn.GrabFocus();
100 		}
101 		else if ( ZOOMBTN_PAGEWIDTH == nBtnId )
102 		{
103 			aPageWidthBtn.Check();
104 			aPageWidthBtn.GrabFocus();
105 		}
106 		else if ( ZOOMBTN_WHOLEPAGE == nBtnId )
107 		{
108 			aWholePageBtn.Check();
109 			aWholePageBtn.GrabFocus();
110 		}
111 	}
112 }
113 
114 // -----------------------------------------------------------------------
115 
HideButton(sal_uInt16 nBtnId)116 void SvxZoomDialog::HideButton( sal_uInt16 nBtnId )
117 {
118 	switch ( nBtnId )
119 	{
120 		case ZOOMBTN_OPTIMAL: // Optimal-Button
121 			aOptimalBtn.Hide();
122 			break;
123 
124 		case ZOOMBTN_PAGEWIDTH: // Seitenbreite-Button
125 			aPageWidthBtn.Hide();
126 			break;
127 
128 		case ZOOMBTN_WHOLEPAGE: // Ganze Seite-Button
129 			aWholePageBtn.Hide();
130 			break;
131 
132 		default:
133 			DBG_ERROR( "Falsche Button-Nummer!!!" );
134 	}
135 }
136 
137 // -----------------------------------------------------------------------
138 
SetLimits(sal_uInt16 nMin,sal_uInt16 nMax)139 void SvxZoomDialog::SetLimits( sal_uInt16 nMin, sal_uInt16 nMax )
140 {
141 	DBG_ASSERT( nMin < nMax, "invalid limits" );
142     aUserEdit.SetMin( nMin );
143 	aUserEdit.SetFirst( nMin );
144     aUserEdit.SetMax( nMax );
145 	aUserEdit.SetLast( nMax );
146 }
147 
148 // -----------------------------------------------------------------------
149 
SvxZoomDialog(Window * pParent,const SfxItemSet & rCoreSet)150 SvxZoomDialog::SvxZoomDialog( Window* pParent, const SfxItemSet& rCoreSet ) :
151 
152 	SfxModalDialog( pParent, CUI_RES( RID_SVXDLG_ZOOM ) ),
153 
154     aZoomFl         ( this, CUI_RES( FL_ZOOM ) ),
155     aOptimalBtn     ( this, CUI_RES( BTN_OPTIMAL ) ),
156     aWholePageBtn   ( this, CUI_RES( BTN_WHOLE_PAGE ) ),
157     aPageWidthBtn   ( this, CUI_RES( BTN_PAGE_WIDTH ) ),
158     a100Btn         ( this, CUI_RES( BTN_100 ) ),
159     aUserBtn        ( this, CUI_RES( BTN_USER ) ),
160 	aUserEdit       ( this, CUI_RES( ED_USER ) ),
161 
162     aViewLayoutFl   ( this, CUI_RES( FL_VIEWLAYOUT ) ),
163     aAutomaticBtn   ( this, CUI_RES( BTN_AUTOMATIC ) ),
164     aSingleBtn      ( this, CUI_RES( BTN_SINGLE ) ),
165     aColumnsBtn     ( this, CUI_RES( BTN_COLUMNS ) ),
166     aColumnsEdit    ( this, CUI_RES( ED_COLUMNS ) ),
167     aBookModeChk    ( this, CUI_RES( CHK_BOOK ) ),
168 
169     aBottomFl       ( this, CUI_RES( FL_BOTTOM ) ),
170     aOKBtn          ( this, CUI_RES( BTN_ZOOM_OK ) ),
171 	aCancelBtn      ( this, CUI_RES( BTN_ZOOM_CANCEL ) ),
172 	aHelpBtn	    ( this, CUI_RES( BTN_ZOOM_HELP ) ),
173 
174 	rSet		( rCoreSet ),
175 	pOutSet     ( NULL ),
176 	bModified	( sal_False )
177 
178 {
179 #if ENABLE_LAYOUT
180     SetHelpId (".uno:Zoom");
181 #endif /* ENABLE_LAYOUT */
182 	Link aLink = LINK( this, SvxZoomDialog, UserHdl );
183     a100Btn.SetClickHdl( aLink );
184     aOptimalBtn.SetClickHdl( aLink );
185 	aPageWidthBtn.SetClickHdl( aLink );
186 	aWholePageBtn.SetClickHdl( aLink );
187 	aUserBtn.SetClickHdl( aLink );
188 
189     Link aViewLayoutLink = LINK( this, SvxZoomDialog, ViewLayoutUserHdl );
190     aAutomaticBtn.SetClickHdl( aViewLayoutLink );
191     aSingleBtn.SetClickHdl( aViewLayoutLink );
192     aColumnsBtn.SetClickHdl( aViewLayoutLink );
193 
194     Link aViewLayoutSpinLink = LINK( this, SvxZoomDialog, ViewLayoutSpinHdl );
195     aColumnsEdit.SetModifyHdl( aViewLayoutSpinLink );
196 
197     Link aViewLayoutCheckLink = LINK( this, SvxZoomDialog, ViewLayoutCheckHdl );
198     aBookModeChk.SetClickHdl( aViewLayoutCheckLink );
199 
200     aOKBtn.SetClickHdl( LINK( this, SvxZoomDialog, OKHdl ) );
201 	aUserEdit.SetModifyHdl( LINK( this, SvxZoomDialog, SpinHdl ) );
202 
203 	// Default-Werte
204 	sal_uInt16 nValue = 100;
205 	sal_uInt16 nMin = 10;
206 	sal_uInt16 nMax = 1000;
207 
208 	// ggf. erst den alten Wert besorgen
209 	const SfxUInt16Item* pOldUserItem = 0;
210 	SfxObjectShell* pSh = SfxObjectShell::Current();
211 
212 	if ( pSh )
213 		pOldUserItem = (const SfxUInt16Item*)pSh->GetItem( SID_ATTR_ZOOM_USER );
214 
215 	if ( pOldUserItem )
216 		nValue = pOldUserItem->GetValue();
217 
218 	// UserEdit initialisieren
219 	if ( nMin > nValue )
220 		nMin = nValue;
221 	if ( nMax < nValue )
222 		nMax = nValue;
223     aUserEdit.SetMin( nMin );
224 	aUserEdit.SetFirst( nMin );
225     aUserEdit.SetMax( nMax );
226 	aUserEdit.SetLast( nMax );
227 	aUserEdit.SetValue( nValue );
228 
229 	aUserEdit.SetAccessibleRelationLabeledBy( &aUserBtn );
230 	aUserEdit.SetAccessibleName(aUserBtn.GetText());
231 	aColumnsEdit.SetAccessibleRelationLabeledBy(&aColumnsBtn);
232 	aColumnsEdit.SetAccessibleName(aColumnsBtn.GetText());
233 	aColumnsEdit.SetAccessibleRelationMemberOf(&aColumnsBtn);
234     aBookModeChk.SetAccessibleRelationLabeledBy(&aColumnsBtn);
235 	aBookModeChk.SetAccessibleRelationMemberOf(&aColumnsBtn);
236 
237 	const SfxPoolItem& rItem = rSet.Get( rSet.GetPool()->GetWhich( SID_ATTR_ZOOM ) );
238 
239 	if ( rItem.ISA(SvxZoomItem) )
240 	{
241 		const SvxZoomItem& rZoomItem = (const SvxZoomItem&)rItem;
242         const sal_uInt16 nZoom = rZoomItem.GetValue();
243         const SvxZoomType eType = rZoomItem.GetType();
244         const sal_uInt16 nValSet = rZoomItem.GetValueSet();
245 		sal_uInt16 nBtnId = 0;
246 
247 		switch ( eType )
248 		{
249 			case SVX_ZOOM_OPTIMAL:
250 				nBtnId = ZOOMBTN_OPTIMAL;
251 				break;
252 			case SVX_ZOOM_PAGEWIDTH:
253 				nBtnId = ZOOMBTN_PAGEWIDTH;
254 				break;
255 			case SVX_ZOOM_WHOLEPAGE:
256 				nBtnId = ZOOMBTN_WHOLEPAGE;
257 				break;
258 			case SVX_ZOOM_PERCENT:
259 				break;
260             case SVX_ZOOM_PAGEWIDTH_NOBORDER:
261                 break;
262 		}
263 
264         if ( !(SVX_ZOOM_ENABLE_100 & nValSet) )
265 			a100Btn.Disable();
266         if ( !(SVX_ZOOM_ENABLE_OPTIMAL & nValSet) )
267 			aOptimalBtn.Disable();
268 		if ( !(SVX_ZOOM_ENABLE_PAGEWIDTH & nValSet) )
269 			aPageWidthBtn.Disable();
270 		if ( !(SVX_ZOOM_ENABLE_WHOLEPAGE & nValSet) )
271 			aWholePageBtn.Disable();
272         SetFactor( nZoom, nBtnId );
273 	}
274 	else
275 	{
276         const sal_uInt16 nZoom = ( (const SfxUInt16Item&)rItem ).GetValue();
277         SetFactor( nZoom );
278 	}
279 
280     const SfxPoolItem* pViewLayoutItem = 0;
281     if ( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_VIEWLAYOUT, sal_False, &pViewLayoutItem ) )
282     {
283         const sal_uInt16 nColumns = static_cast<const SvxViewLayoutItem*>(pViewLayoutItem)->GetValue();
284         const bool bBookMode  = static_cast<const SvxViewLayoutItem*>(pViewLayoutItem)->IsBookMode();
285 
286         if ( 0 == nColumns )
287         {
288             aAutomaticBtn.Check();
289             aColumnsEdit.SetValue( 2 );
290             aColumnsEdit.Disable();
291             aBookModeChk.Disable();
292         }
293         else if ( 1 == nColumns)
294         {
295             aSingleBtn.Check();
296             aColumnsEdit.SetValue( 2 );
297             aColumnsEdit.Disable();
298             aBookModeChk.Disable();
299         }
300         else
301         {
302             aColumnsBtn.Check();
303             if ( !bBookMode )
304             {
305                 aColumnsEdit.SetValue( nColumns );
306                 if ( 0 != nColumns % 2 )
307                     aBookModeChk.Disable();
308             }
309             else
310             {
311                 aColumnsEdit.SetValue( nColumns );
312                 aBookModeChk.Check();
313             }
314         }
315     }
316     else
317     {
318         // hide view layout related controls:
319         aViewLayoutFl.Disable();
320         aAutomaticBtn.Disable();
321         aSingleBtn.Disable();
322         aColumnsBtn.Disable();
323         aColumnsEdit.Disable();
324         aBookModeChk.Disable();
325     }
326 
327 	FreeResource();
328 }
329 
330 // -----------------------------------------------------------------------
331 
~SvxZoomDialog()332 SvxZoomDialog::~SvxZoomDialog()
333 {
334 	delete pOutSet;
335 	pOutSet = 0;
336 }
337 
338 // -----------------------------------------------------------------------
339 
IMPL_LINK(SvxZoomDialog,UserHdl,RadioButton *,pBtn)340 IMPL_LINK( SvxZoomDialog, UserHdl, RadioButton *, pBtn )
341 {
342 	bModified |= sal_True;
343 
344 	if ( pBtn == &aUserBtn )
345 	{
346 		aUserEdit.Enable();
347 		aUserEdit.GrabFocus();
348 	}
349 	else
350 		aUserEdit.Disable();
351 	return 0;
352 }
353 
354 // -----------------------------------------------------------------------
355 
IMPL_LINK(SvxZoomDialog,SpinHdl,MetricField *,EMPTYARG)356 IMPL_LINK( SvxZoomDialog, SpinHdl, MetricField *, EMPTYARG )
357 {
358 	if ( !aUserBtn.IsChecked() )
359 		return 0;
360 	bModified |= sal_True;
361 	return 0;
362 }
363 
364 // -----------------------------------------------------------------------
365 
IMPL_LINK(SvxZoomDialog,ViewLayoutUserHdl,RadioButton *,pBtn)366 IMPL_LINK( SvxZoomDialog, ViewLayoutUserHdl, RadioButton *, pBtn )
367 {
368     bModified |= sal_True;
369 
370     if ( pBtn == &aAutomaticBtn )
371     {
372         aColumnsEdit.Disable();
373         aBookModeChk.Disable();
374     }
375     else if ( pBtn == &aSingleBtn )
376     {
377         aColumnsEdit.Disable();
378         aBookModeChk.Disable();
379     }
380     else if ( pBtn == &aColumnsBtn )
381     {
382         aColumnsEdit.Enable();
383         aColumnsEdit.GrabFocus();
384         if ( 0 == aColumnsEdit.GetValue() % 2 )
385             aBookModeChk.Enable();
386     }
387     else
388     {
389         DBG_ERROR( "Wrong Button" );
390         return 0;
391     }
392 
393     return 0;
394 }
395 
396 // -----------------------------------------------------------------------
397 
IMPL_LINK(SvxZoomDialog,ViewLayoutSpinHdl,MetricField *,pEdt)398 IMPL_LINK( SvxZoomDialog, ViewLayoutSpinHdl, MetricField *, pEdt )
399 {
400     if ( pEdt == &aColumnsEdit && !aColumnsBtn.IsChecked() )
401         return 0;
402 
403     if ( 0 == aColumnsEdit.GetValue() % 2 )
404         aBookModeChk.Enable();
405     else
406     {
407         aBookModeChk.Check( sal_False );
408         aBookModeChk.Disable();
409     }
410 
411     bModified |= sal_True;
412 
413     return 0;
414 }
415 
416 // -----------------------------------------------------------------------
417 
IMPL_LINK(SvxZoomDialog,ViewLayoutCheckHdl,CheckBox *,pChk)418 IMPL_LINK( SvxZoomDialog, ViewLayoutCheckHdl, CheckBox *, pChk )
419 {
420     if ( pChk == &aBookModeChk && !aColumnsBtn.IsChecked() )
421         return 0;
422 
423     bModified |= sal_True;
424 
425     return 0;
426 }
427 
428 // -----------------------------------------------------------------------
429 
IMPL_LINK(SvxZoomDialog,OKHdl,Button *,pBtn)430 IMPL_LINK( SvxZoomDialog, OKHdl, Button *, pBtn )
431 {
432 	if ( bModified || &aOKBtn != pBtn )
433 	{
434         SvxZoomItem aZoomItem( SVX_ZOOM_PERCENT, 0, rSet.GetPool()->GetWhich( SID_ATTR_ZOOM ) );
435         SvxViewLayoutItem aViewLayoutItem( 0, false, rSet.GetPool()->GetWhich( SID_ATTR_VIEWLAYOUT ) );
436 
437 		if ( &aOKBtn == pBtn )
438 		{
439 			sal_uInt16 nFactor = GetFactor();
440 
441 			if ( SPECIAL_FACTOR == nFactor )
442 			{
443 				if ( aOptimalBtn.IsChecked() )
444                     aZoomItem.SetType( SVX_ZOOM_OPTIMAL );
445 				else if ( aPageWidthBtn.IsChecked() )
446                     aZoomItem.SetType( SVX_ZOOM_PAGEWIDTH );
447 				else if ( aWholePageBtn.IsChecked() )
448                     aZoomItem.SetType( SVX_ZOOM_WHOLEPAGE );
449 			}
450 			else
451                 aZoomItem.SetValue( nFactor );
452 
453             if ( aAutomaticBtn.IsChecked() )
454             {
455                 aViewLayoutItem.SetValue( 0 );
456                 aViewLayoutItem.SetBookMode( false );
457             }
458             if ( aSingleBtn.IsChecked() )
459             {
460                 aViewLayoutItem.SetValue( 1 );
461                 aViewLayoutItem.SetBookMode( false );
462             }
463             else if ( aColumnsBtn.IsChecked() )
464             {
465                 aViewLayoutItem.SetValue( static_cast<sal_uInt16>(aColumnsEdit.GetValue()) );
466                 aViewLayoutItem.SetBookMode( aBookModeChk.IsChecked() );
467             }
468         }
469 		else
470 		{
471 			DBG_ERROR( "Wrong Button" );
472 			return 0;
473 		}
474 		pOutSet = new SfxItemSet( rSet );
475         pOutSet->Put( aZoomItem );
476 
477         // don't set attribute in case the whole viewlayout stuff is disabled:
478         if ( aViewLayoutFl.IsEnabled() )
479             pOutSet->Put( aViewLayoutItem );
480 
481 		// Wert aus dem UserEdit "uber den Dialog hinaus merken
482 		SfxObjectShell* pSh = SfxObjectShell::Current();
483 
484 		if ( pSh )
485 			pSh->PutItem( SfxUInt16Item( SID_ATTR_ZOOM_USER,
486 										 (sal_uInt16)aUserEdit.GetValue() ) );
487 		EndDialog( RET_OK );
488 	}
489 	else
490 		EndDialog( RET_CANCEL );
491 	return 0;
492 }
493 
494 
495