xref: /AOO41X/main/toolkit/workben/layout/zoom.cxx (revision b0724fc6948542b2496e16ea247f985ee5987cfe)
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 #if !TEST_LAYOUT
25 // MARKER(update_precomp.py): autogen include statement, do not remove
26 #include "precompiled_svx.hxx"
27 #endif /* !TEST_LAYOUT */
28 
29 #ifdef SVX_DLLIMPLEMENTATION
30 #undef SVX_DLLIMPLEMENTATION
31 #endif
32 
33 // include ---------------------------------------------------------------
34 
35 #if TEST_LAYOUT
36 #include <cstdio>
37 #endif /* TEST_LAYOUT */
38 #include <tools/shl.hxx>
39 #include <svtools/itemset.hxx>
40 #include <svtools/itempool.hxx>
41 #include <sfx2/objsh.hxx>
42 #include <vcl/msgbox.hxx>
43 
44 #define _SVX_ZOOM_CXX
45 
46 #include <svx/dialogs.hrc>
47 #if !TEST_LAYOUT
48 #include "zoom.hrc"
49 #endif /* !TEST_LAYOUT */
50 
51 #include "zoom.hxx"
52 #if TEST_LAYOUT
53 #define SVX_ZOOM_OPTIMAL "Zoom optimal"
54 #define SVX_ZOOM_PAGEWIDTH "Zoom page width"
55 #define SVX_ZOOM_WHOLEPAGE "Zoom whole page"
56 struct SvxZoomItem
57 {
SetTypeSvxZoomItem58     void SetType( char const* s )
59     {
60         fputs( s, stderr );
61     }
62 
SetValueSvxZoomItem63     void SetValue( int n )
64     {
65         fprintf( stderr, "Zoom factor: %d\n", int( n ) );
66     }
67 };
68 #define SfxPoolItem LAYOUT_SfxPoolItem
69 class LAYOUT_SfxPoolItem
70 {
71 };
72 struct SvxViewLayoutItem : public LAYOUT_SfxPoolItem
73 {
IsBookModeSvxViewLayoutItem74     bool IsBookMode()
75     {
76         return false;
77     }
GetValueSvxViewLayoutItem78     USHORT GetValue()
79     {
80         return 0;
81     }
82 
SetValueSvxViewLayoutItem83     void SetValue( int n )
84     {
85         fprintf( stderr, "Zoom factor: %d\n", int( n ) );
86     }
SetBookModeSvxViewLayoutItem87     void SetBookMode( bool )
88     {
89     }
90 #if 0 // needed for real SfxPoolItem
91     int operator==( const SfxPoolItem& ) const
92     {
93         return 0;
94     }
95     SfxPoolItem* Clone( SfxItemPool* ) const
96     {
97         return 0;
98     }
99 #endif
100 };
101 #else /* !TEST_LAYOUT */
102 #include <svx/zoomitem.hxx>
103 #include <svx/viewlayoutitem.hxx>
104 #include <svx/dialmgr.hxx>
105 #endif /* !TEST_LAYOUT */
106 #include "zoom_def.hxx"
107 
108 #include <layout/layout-pre.hxx>
109 
110 #if ENABLE_LAYOUT
111 #undef SVX_RES
112 #define SVX_RES(x) #x
113 #undef SfxModalDialog
114 #define SfxModalDialog( parent, id ) Dialog( parent, "zoom.xml", id )
115 #endif /* ENABLE_LAYOUT */
116 
117 // static ----------------------------------------------------------------
118 
119 static USHORT pRanges[] =
120 {
121     SID_ATTR_ZOOM,
122     SID_ATTR_ZOOM,
123     0
124 };
125 
126 #define SPECIAL_FACTOR  ((USHORT)0xFFFF)
127 
128 // class SvxZoomDialog ---------------------------------------------------
129 
GetFactor() const130 USHORT SvxZoomDialog::GetFactor() const
131 {
132     if ( a100Btn.IsChecked() )
133         return 100;
134     if ( aUserBtn.IsChecked() )
135         return (USHORT)aUserEdit.GetValue();
136     else
137         return SPECIAL_FACTOR;
138 }
139 
140 // -----------------------------------------------------------------------
141 
SetFactor(USHORT nNewFactor,USHORT nBtnId)142 void SvxZoomDialog::SetFactor( USHORT nNewFactor, USHORT nBtnId )
143 {
144 #if TEST_LAYOUT
145     printf ("\t\t set factor %d\n", (int)nNewFactor);
146 #endif /* !TEST_LAYOUT */
147     aUserEdit.Disable();
148 
149     if ( !nBtnId )
150     {
151         if ( nNewFactor == 100 )
152         {
153             a100Btn.Check();
154             a100Btn.GrabFocus();
155         }
156         else
157         {
158             aUserBtn.Check();
159             aUserEdit.Enable();
160             aUserEdit.SetValue( (long)nNewFactor );
161             aUserEdit.GrabFocus();
162         }
163     }
164     else
165     {
166         aUserEdit.SetValue( (long)nNewFactor );
167 
168         if ( ZOOMBTN_OPTIMAL == nBtnId )
169         {
170             aOptimalBtn.Check();
171             aOptimalBtn.GrabFocus();
172         }
173         else if ( ZOOMBTN_PAGEWIDTH == nBtnId )
174         {
175             aPageWidthBtn.Check();
176             aPageWidthBtn.GrabFocus();
177         }
178         else if ( ZOOMBTN_WHOLEPAGE == nBtnId )
179         {
180             aWholePageBtn.Check();
181             aWholePageBtn.GrabFocus();
182         }
183     }
184 }
185 
186 // -----------------------------------------------------------------------
187 
SetButtonText(USHORT nBtnId,const String & rNewTxt)188 void SvxZoomDialog::SetButtonText( USHORT nBtnId, const String& rNewTxt )
189 {
190     switch ( nBtnId )
191     {
192         case ZOOMBTN_OPTIMAL: // Optimal-Button
193             aOptimalBtn.SetText( rNewTxt );
194             break;
195 
196         case ZOOMBTN_PAGEWIDTH: // Seitenbreite-Button
197             aPageWidthBtn.SetText( rNewTxt );
198             break;
199 
200         case ZOOMBTN_WHOLEPAGE: // Ganze Seite-Button
201             aWholePageBtn.SetText( rNewTxt );
202             break;
203 
204         default:
205             DBG_ERROR( "wrong button number" );
206     }
207 }
208 
209 // -----------------------------------------------------------------------
210 
HideButton(USHORT nBtnId)211 void SvxZoomDialog::HideButton( USHORT nBtnId )
212 {
213     switch ( nBtnId )
214     {
215         case ZOOMBTN_OPTIMAL: // Optimal-Button
216             aOptimalBtn.Hide();
217             break;
218 
219         case ZOOMBTN_PAGEWIDTH: // Seitenbreite-Button
220             aPageWidthBtn.Hide();
221             break;
222 
223         case ZOOMBTN_WHOLEPAGE: // Ganze Seite-Button
224             aWholePageBtn.Hide();
225             break;
226 
227         default:
228             DBG_ERROR( "Falsche Button-Nummer!!!" );
229     }
230 }
231 
232 // -----------------------------------------------------------------------
233 
SetLimits(USHORT nMin,USHORT nMax)234 void SvxZoomDialog::SetLimits( USHORT nMin, USHORT nMax )
235 {
236     DBG_ASSERT( nMin < nMax, "invalid limits" );
237     aUserEdit.SetMin( nMin );
238     aUserEdit.SetFirst( nMin );
239     aUserEdit.SetMax( nMax );
240     aUserEdit.SetLast( nMax );
241 }
242 
243 // -----------------------------------------------------------------------
244 
SetSpinSize(USHORT nNewSpin)245 void SvxZoomDialog::SetSpinSize( USHORT nNewSpin )
246 {
247     aUserEdit.SetSpinSize( nNewSpin );
248 }
249 
250 // -----------------------------------------------------------------------
251 
252 #if TEST_LAYOUT
SvxZoomDialog(Window * pParent)253 SvxZoomDialog::SvxZoomDialog( Window* pParent ) :
254 #else /* !TEST_LAYOUT */
255 SvxZoomDialog::SvxZoomDialog( Window* pParent, const SfxItemSet& rCoreSet ) :
256 #endif /* !TEST_LAYOUT */
257 
258     SfxModalDialog( pParent, SVX_RES( RID_SVXDLG_ZOOM ) ),
259 
260     aZoomFl         ( this, SVX_RES( FL_ZOOM ) ),
261     aOptimalBtn     ( this, SVX_RES( BTN_OPTIMAL ) ),
262     aWholePageBtn   ( this, SVX_RES( BTN_WHOLE_PAGE ) ),
263     aPageWidthBtn   ( this, SVX_RES( BTN_PAGE_WIDTH ) ),
264     a100Btn         ( this, SVX_RES( BTN_100 ) ),
265     aUserBtn        ( this, SVX_RES( BTN_USER ) ),
266     aUserEdit       ( this, SVX_RES( ED_USER ) ),
267 
268     aViewLayoutFl   ( this, SVX_RES( FL_VIEWLAYOUT ) ),
269     aAutomaticBtn   ( this, SVX_RES( BTN_AUTOMATIC ) ),
270     aSingleBtn      ( this, SVX_RES( BTN_SINGLE ) ),
271     aColumnsBtn     ( this, SVX_RES( BTN_COLUMNS ) ),
272     aColumnsEdit    ( this, SVX_RES( ED_COLUMNS ) ),
273     aBookModeChk    ( this, SVX_RES( CHK_BOOK ) ),
274 
275     aBottomFl       ( this, SVX_RES( FL_BOTTOM ) ),
276     aOKBtn          ( this, SVX_RES( BTN_ZOOM_OK ) ),
277     aCancelBtn      ( this, SVX_RES( BTN_ZOOM_CANCEL ) ),
278     aHelpBtn        ( this, SVX_RES( BTN_ZOOM_HELP ) ),
279 
280 #if !TEST_LAYOUT
281     rSet        ( rCoreSet ),
282 #endif /* !TEST_LAYOUT */
283     pOutSet     ( NULL ),
284     bModified   ( FALSE )
285 
286 {
287 #if ENABLE_LAYOUT
288     SetHelpId (SID_ATTR_ZOOM);
289 #endif /* ENABLE_LAYOUT */
290     Link aLink = LINK( this, SvxZoomDialog, UserHdl );
291     a100Btn.SetClickHdl( aLink );
292     aOptimalBtn.SetClickHdl( aLink );
293     aPageWidthBtn.SetClickHdl( aLink );
294     aWholePageBtn.SetClickHdl( aLink );
295     aUserBtn.SetClickHdl( aLink );
296 
297     Link aViewLayoutLink = LINK( this, SvxZoomDialog, ViewLayoutUserHdl );
298     aAutomaticBtn.SetClickHdl( aViewLayoutLink );
299     aSingleBtn.SetClickHdl( aViewLayoutLink );
300     aColumnsBtn.SetClickHdl( aViewLayoutLink );
301 
302     Link aViewLayoutSpinLink = LINK( this, SvxZoomDialog, ViewLayoutSpinHdl );
303     aColumnsEdit.SetModifyHdl( aViewLayoutSpinLink );
304 
305     Link aViewLayoutCheckLink = LINK( this, SvxZoomDialog, ViewLayoutCheckHdl );
306     aBookModeChk.SetClickHdl( aViewLayoutCheckLink );
307 
308     aOKBtn.SetClickHdl( LINK( this, SvxZoomDialog, OKHdl ) );
309     aUserEdit.SetModifyHdl( LINK( this, SvxZoomDialog, SpinHdl ) );
310 
311     // Default-Werte
312     USHORT nValue = 100;
313     USHORT nMin = 10;
314     USHORT nMax = 1000;
315 
316 #if !TEST_LAYOUT
317     // ggf. erst den alten Wert besorgen
318     const SfxUInt16Item* pOldUserItem = 0;
319     SfxObjectShell* pSh = SfxObjectShell::Current();
320 
321     if ( pSh )
322         pOldUserItem = (const SfxUInt16Item*)pSh->GetItem( SID_ATTR_ZOOM_USER );
323 
324     if ( pOldUserItem )
325         nValue = pOldUserItem->GetValue();
326 
327     // UserEdit initialisieren
328     if ( nMin > nValue )
329         nMin = nValue;
330     if ( nMax < nValue )
331         nMax = nValue;
332 #endif /* !TEST_LAYOUT */
333     aUserEdit.SetMin( nMin );
334     aUserEdit.SetFirst( nMin );
335     aUserEdit.SetMax( nMax );
336     aUserEdit.SetLast( nMax );
337     aUserEdit.SetValue( nValue );
338 
339 #if TEST_LAYOUT
340     USHORT nZoom = 100;
341     SetFactor( nZoom );
342 #else /* !TEST_LAYOUT */
343     const SfxPoolItem& rItem = rSet.Get( rSet.GetPool()->GetWhich( SID_ATTR_ZOOM ) );
344 
345     if ( rItem.ISA(SvxZoomItem) )
346     {
347         const SvxZoomItem& rZoomItem = (const SvxZoomItem&)rItem;
348         const USHORT nZoom = rZoomItem.GetValue();
349         const SvxZoomType eType = rZoomItem.GetType();
350         const USHORT nValSet = rZoomItem.GetValueSet();
351         USHORT nBtnId = 0;
352 
353         switch ( eType )
354         {
355             case SVX_ZOOM_OPTIMAL:
356                 nBtnId = ZOOMBTN_OPTIMAL;
357                 break;
358             case SVX_ZOOM_PAGEWIDTH:
359                 nBtnId = ZOOMBTN_PAGEWIDTH;
360                 break;
361             case SVX_ZOOM_WHOLEPAGE:
362                 nBtnId = ZOOMBTN_WHOLEPAGE;
363                 break;
364             case SVX_ZOOM_PERCENT:
365                 break;
366             case SVX_ZOOM_PAGEWIDTH_NOBORDER:
367                 break;
368         }
369 
370         if ( !(SVX_ZOOM_ENABLE_100 & nValSet) )
371             a100Btn.Disable();
372         if ( !(SVX_ZOOM_ENABLE_OPTIMAL & nValSet) )
373             aOptimalBtn.Disable();
374         if ( !(SVX_ZOOM_ENABLE_PAGEWIDTH & nValSet) )
375             aPageWidthBtn.Disable();
376         if ( !(SVX_ZOOM_ENABLE_WHOLEPAGE & nValSet) )
377             aWholePageBtn.Disable();
378         SetFactor( nZoom, nBtnId );
379     }
380     else
381     {
382         const USHORT nZoom = ( (const SfxUInt16Item&)rItem ).GetValue();
383         SetFactor( nZoom );
384     }
385 
386     const SfxPoolItem* pViewLayoutItem = 0;
387     if ( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_VIEWLAYOUT, FALSE, &pViewLayoutItem ) )
388     {
389         const USHORT nColumns = static_cast<const SvxViewLayoutItem*>(pViewLayoutItem)->GetValue();
390         const bool bBookMode  = static_cast<const SvxViewLayoutItem*>(pViewLayoutItem)->IsBookMode();
391 
392         if ( 0 == nColumns )
393         {
394             aAutomaticBtn.Check();
395             aColumnsEdit.SetValue( 2 );
396             aColumnsEdit.Disable();
397             aBookModeChk.Disable();
398         }
399         else if ( 1 == nColumns)
400         {
401             aSingleBtn.Check();
402             aColumnsEdit.SetValue( 2 );
403             aColumnsEdit.Disable();
404             aBookModeChk.Disable();
405         }
406         else
407         {
408             aColumnsBtn.Check();
409             if ( !bBookMode )
410             {
411                 aColumnsEdit.SetValue( nColumns );
412                 if ( 0 != nColumns % 2 )
413                     aBookModeChk.Disable();
414             }
415             else
416             {
417                 aColumnsEdit.SetValue( nColumns );
418                 aBookModeChk.Check();
419             }
420         }
421     }
422     else
423     {
424         // hide view layout related controls:
425         aViewLayoutFl.Disable();
426         aAutomaticBtn.Disable();
427         aSingleBtn.Disable();
428         aColumnsBtn.Disable();
429         aColumnsEdit.Disable();
430         aBookModeChk.Disable();
431     }
432 #endif /* !TEST_LAYOUT */
433 
434     FreeResource();
435 }
436 
437 // -----------------------------------------------------------------------
438 
~SvxZoomDialog()439 SvxZoomDialog::~SvxZoomDialog()
440 {
441     delete pOutSet;
442     pOutSet = 0;
443 }
444 
445 // -----------------------------------------------------------------------
446 
GetRanges()447 USHORT* SvxZoomDialog::GetRanges()
448 {
449     return pRanges;
450 }
451 
452 // -----------------------------------------------------------------------
453 
IMPL_LINK(SvxZoomDialog,UserHdl,RadioButton *,pBtn)454 IMPL_LINK( SvxZoomDialog, UserHdl, RadioButton *, pBtn )
455 {
456 #if TEST_LAYOUT
457     fprintf( stderr, "SvxZoomDialog::UserHdl\n" );
458 #endif /* TEST_LAYOUT */
459     bModified |= TRUE;
460 
461     if ( pBtn == &aUserBtn )
462     {
463         aUserEdit.Enable();
464         aUserEdit.GrabFocus();
465     }
466     else
467         aUserEdit.Disable();
468     return 0;
469 }
470 
471 // -----------------------------------------------------------------------
472 
IMPL_LINK(SvxZoomDialog,SpinHdl,MetricField *,EMPTYARG)473 IMPL_LINK( SvxZoomDialog, SpinHdl, MetricField *, EMPTYARG )
474 {
475     if ( !aUserBtn.IsChecked() )
476         return 0;
477     bModified |= TRUE;
478     return 0;
479 }
480 
481 // -----------------------------------------------------------------------
482 
IMPL_LINK(SvxZoomDialog,ViewLayoutUserHdl,RadioButton *,pBtn)483 IMPL_LINK( SvxZoomDialog, ViewLayoutUserHdl, RadioButton *, pBtn )
484 {
485     bModified |= TRUE;
486 
487     if ( pBtn == &aAutomaticBtn )
488     {
489         aColumnsEdit.Disable();
490         aBookModeChk.Disable();
491     }
492     else if ( pBtn == &aSingleBtn )
493     {
494         aColumnsEdit.Disable();
495         aBookModeChk.Disable();
496     }
497     else if ( pBtn == &aColumnsBtn )
498     {
499         aColumnsEdit.Enable();
500         aColumnsEdit.GrabFocus();
501         if ( 0 == aColumnsEdit.GetValue() % 2 )
502             aBookModeChk.Enable();
503     }
504     else
505     {
506         DBG_ERROR( "Wrong Button" );
507         return 0;
508     }
509 
510     return 0;
511 }
512 
513 // -----------------------------------------------------------------------
514 
IMPL_LINK(SvxZoomDialog,ViewLayoutSpinHdl,MetricField *,pEdt)515 IMPL_LINK( SvxZoomDialog, ViewLayoutSpinHdl, MetricField *, pEdt )
516 {
517     if ( pEdt == &aColumnsEdit && !aColumnsBtn.IsChecked() )
518         return 0;
519 
520     if ( 0 == aColumnsEdit.GetValue() % 2 )
521         aBookModeChk.Enable();
522     else
523     {
524         aBookModeChk.Check( sal_False );
525         aBookModeChk.Disable();
526     }
527 
528     bModified |= TRUE;
529 
530     return 0;
531 }
532 
533 // -----------------------------------------------------------------------
534 
IMPL_LINK(SvxZoomDialog,ViewLayoutCheckHdl,CheckBox *,pChk)535 IMPL_LINK( SvxZoomDialog, ViewLayoutCheckHdl, CheckBox *, pChk )
536 {
537     if ( pChk == &aBookModeChk && !aColumnsBtn.IsChecked() )
538         return 0;
539 
540     bModified |= TRUE;
541 
542     return 0;
543 }
544 
545 // -----------------------------------------------------------------------
546 
IMPL_LINK(SvxZoomDialog,OKHdl,Button *,pBtn)547 IMPL_LINK( SvxZoomDialog, OKHdl, Button *, pBtn )
548 {
549     if ( bModified || &aOKBtn != pBtn )
550     {
551 #if TEST_LAYOUT
552         SvxZoomItem aZoomItem;
553         SvxViewLayoutItem aViewLayoutItem;
554 #else /* !TEST_LAYOUT */
555         SvxZoomItem aZoomItem( SVX_ZOOM_PERCENT, 0, rSet.GetPool()->GetWhich( SID_ATTR_ZOOM ) );
556         SvxViewLayoutItem aViewLayoutItem( 0, false, rSet.GetPool()->GetWhich( SID_ATTR_VIEWLAYOUT ) );
557 #endif /* !TEST_LAYOUT */
558 
559         if ( &aOKBtn == pBtn )
560         {
561             USHORT nFactor = GetFactor();
562 
563             if ( SPECIAL_FACTOR == nFactor )
564             {
565                 if ( aOptimalBtn.IsChecked() )
566                     aZoomItem.SetType( SVX_ZOOM_OPTIMAL );
567                 else if ( aPageWidthBtn.IsChecked() )
568                     aZoomItem.SetType( SVX_ZOOM_PAGEWIDTH );
569                 else if ( aWholePageBtn.IsChecked() )
570                     aZoomItem.SetType( SVX_ZOOM_WHOLEPAGE );
571             }
572             else
573                 aZoomItem.SetValue( nFactor );
574 
575             if ( aAutomaticBtn.IsChecked() )
576             {
577                 aViewLayoutItem.SetValue( 0 );
578                 aViewLayoutItem.SetBookMode( false );
579             }
580             if ( aSingleBtn.IsChecked() )
581             {
582                 aViewLayoutItem.SetValue( 1 );
583                 aViewLayoutItem.SetBookMode( false );
584             }
585             else if ( aColumnsBtn.IsChecked() )
586             {
587                 aViewLayoutItem.SetValue( static_cast<USHORT>(aColumnsEdit.GetValue()) );
588                 aViewLayoutItem.SetBookMode( aBookModeChk.IsChecked() );
589             }
590         }
591         else
592         {
593             DBG_ERROR( "Wrong Button" );
594             return 0;
595         }
596 #if !TEST_LAYOUT
597         pOutSet = new SfxItemSet( rSet );
598         pOutSet->Put( aZoomItem );
599 
600         // don't set attribute in case the whole viewlayout stuff is disabled:
601         if ( aViewLayoutFl.IsEnabled() )
602             pOutSet->Put( aViewLayoutItem );
603 
604         // Wert aus dem UserEdit "uber den Dialog hinaus merken
605         SfxObjectShell* pSh = SfxObjectShell::Current();
606 
607         if ( pSh )
608             pSh->PutItem( SfxUInt16Item( SID_ATTR_ZOOM_USER,
609                                          (UINT16)aUserEdit.GetValue() ) );
610 #endif /* !TEST_LAYOUT */
611         EndDialog( RET_OK );
612     }
613     else
614         EndDialog( RET_CANCEL );
615     return 0;
616 }
617 
618 
619