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