xref: /trunk/main/sd/source/ui/dlg/tpoption.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sd.hxx"
30 
31 #ifdef SD_DLLIMPLEMENTATION
32 #undef SD_DLLIMPLEMENTATION
33 #endif
34 
35 
36 #include <com/sun/star/document/PrinterIndependentLayout.hpp>
37 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
38 #include <com/sun/star/frame/XDesktop.hpp>
39 #include <com/sun/star/lang/XComponent.hpp>
40 #include <com/sun/star/container/XEnumerationAccess.hpp>
41 #include <comphelper/processfactory.hxx>
42 #include <com/sun/star/uno/Exception.hpp>
43 #include <sfx2/module.hxx>
44 #include <sfx2/app.hxx>
45 #include <svx/svxids.hrc>
46 #include <svx/dialogs.hrc>
47 #include <svx/strarray.hxx>
48 #include <svx/dlgutil.hxx>
49 #include <vcl/msgbox.hxx>
50 
51 #include "sdattr.hxx"
52 #include "sdresid.hxx"
53 #include "optsitem.hxx"
54 #include "tpoption.hrc"
55 #include "tpoption.hxx"
56 #include "strings.hrc"
57 #include "app.hrc"
58 #include <svl/intitem.hxx>
59 #include <sfx2/request.hxx>
60 #define DLGWIN this->GetParent()->GetParent()
61 
62 using namespace ::com::sun::star;
63 using namespace ::com::sun::star::uno;
64 
65 /*************************************************************************
66 |*
67 |*  TabPage zum Einstellen der Fang-Optionen
68 |*
69 \************************************************************************/
70 
71 SdTpOptionsSnap::SdTpOptionsSnap( Window* pParent, const SfxItemSet& rInAttrs  ) :
72         SvxGridTabPage(pParent, rInAttrs)
73 {
74     aGrpSnap.Show();
75     aCbxSnapHelplines.Show();
76     aCbxSnapBorder.Show();
77     aCbxSnapFrame.Show();
78     aCbxSnapPoints.Show();
79     aFtSnapArea.Show();
80     aMtrFldSnapArea.Show();
81     aGrpOrtho.Show();
82     aCbxOrtho.Show();
83     aCbxBigOrtho.Show();
84     aCbxRotate.Show();
85     aMtrFldAngle.Show();
86     aFtBezAngle.Show();
87     aMtrFldBezAngle.Show();
88     aSeparatorFL.Show();
89 }
90 
91 // -----------------------------------------------------------------------
92 
93 SdTpOptionsSnap::~SdTpOptionsSnap()
94 {
95 }
96 
97 // -----------------------------------------------------------------------
98 
99 sal_Bool SdTpOptionsSnap::FillItemSet( SfxItemSet& rAttrs )
100 {
101     SvxGridTabPage::FillItemSet(rAttrs);
102     SdOptionsSnapItem* pOptsItem = NULL;
103 //    if(SFX_ITEM_SET != rAttrs.GetItemState( ATTR_OPTIONS_SNAP, sal_False, (const SfxPoolItem**)&pOptsItem ))
104 //        pExampleSet->GetItemState( ATTR_OPTIONS_SNAP, sal_False, (const SfxPoolItem**)&pOptsItem );
105 
106     SdOptionsSnapItem aOptsItem( ATTR_OPTIONS_SNAP );
107 
108     aOptsItem.GetOptionsSnap().SetSnapHelplines( aCbxSnapHelplines.IsChecked() );
109     aOptsItem.GetOptionsSnap().SetSnapBorder( aCbxSnapBorder.IsChecked() );
110     aOptsItem.GetOptionsSnap().SetSnapFrame( aCbxSnapFrame.IsChecked() );
111     aOptsItem.GetOptionsSnap().SetSnapPoints( aCbxSnapPoints.IsChecked() );
112     aOptsItem.GetOptionsSnap().SetOrtho( aCbxOrtho.IsChecked() );
113     aOptsItem.GetOptionsSnap().SetBigOrtho( aCbxBigOrtho.IsChecked() );
114     aOptsItem.GetOptionsSnap().SetRotate( aCbxRotate.IsChecked() );
115     aOptsItem.GetOptionsSnap().SetSnapArea( (sal_Int16) aMtrFldSnapArea.GetValue() );
116     aOptsItem.GetOptionsSnap().SetAngle( (sal_Int16) aMtrFldAngle.GetValue() );
117     aOptsItem.GetOptionsSnap().SetEliminatePolyPointLimitAngle( (sal_Int16) aMtrFldBezAngle.GetValue() );
118 
119     if( pOptsItem == NULL || !(aOptsItem == *pOptsItem) )
120         rAttrs.Put( aOptsItem );
121 
122     // Evtl. vorhandenes GridItem wird geholt, um nicht versehentlich
123     // irgendwelche Standardwerte einzustellen
124     return( sal_True );
125 }
126 
127 // -----------------------------------------------------------------------
128 
129 void SdTpOptionsSnap::Reset( const SfxItemSet& rAttrs )
130 {
131     SvxGridTabPage::Reset(rAttrs);
132 
133     SdOptionsSnapItem aOptsItem( (const SdOptionsSnapItem&) rAttrs.
134                         Get( ATTR_OPTIONS_SNAP ) );
135 
136     aCbxSnapHelplines.Check( aOptsItem.GetOptionsSnap().IsSnapHelplines() );
137     aCbxSnapBorder.Check( aOptsItem.GetOptionsSnap().IsSnapBorder() );
138     aCbxSnapFrame.Check( aOptsItem.GetOptionsSnap().IsSnapFrame() );
139     aCbxSnapPoints.Check( aOptsItem.GetOptionsSnap().IsSnapPoints() );
140     aCbxOrtho.Check( aOptsItem.GetOptionsSnap().IsOrtho() );
141     aCbxBigOrtho.Check( aOptsItem.GetOptionsSnap().IsBigOrtho() );
142     aCbxRotate.Check( aOptsItem.GetOptionsSnap().IsRotate() );
143     aMtrFldSnapArea.SetValue( aOptsItem.GetOptionsSnap().GetSnapArea() );
144     aMtrFldAngle.SetValue( aOptsItem.GetOptionsSnap().GetAngle() );
145     aMtrFldBezAngle.SetValue( aOptsItem.GetOptionsSnap().GetEliminatePolyPointLimitAngle() );
146 
147     aCbxRotate.GetClickHdl().Call(0);
148 }
149 
150 // -----------------------------------------------------------------------
151 
152 SfxTabPage* SdTpOptionsSnap::Create( Window* pWindow,
153                 const SfxItemSet& rAttrs )
154 {
155     return( new SdTpOptionsSnap( pWindow, rAttrs ) );
156 }
157 
158 /*************************************************************************
159 |*
160 |*  TabPage zum Einstellen der Inhalte-Optionen
161 |*
162 \************************************************************************/
163 
164 SdTpOptionsContents::SdTpOptionsContents( Window* pParent, const SfxItemSet& rInAttrs  ) :
165         SfxTabPage          ( pParent, SdResId( TP_OPTIONS_CONTENTS ), rInAttrs ),
166         aGrpDisplay         ( this, SdResId( GRP_DISPLAY ) ),
167         aCbxRuler           ( this, SdResId( CBX_RULER ) ),
168         aCbxDragStripes     ( this, SdResId( CBX_HELPLINES ) ),
169         aCbxHandlesBezier   ( this, SdResId( CBX_HANDLES_BEZIER ) ),
170         aCbxMoveOutline     ( this, SdResId( CBX_MOVE_OUTLINE ) )
171 {
172     FreeResource();
173 }
174 
175 // -----------------------------------------------------------------------
176 
177 SdTpOptionsContents::~SdTpOptionsContents()
178 {
179 }
180 
181 // -----------------------------------------------------------------------
182 
183 sal_Bool SdTpOptionsContents::FillItemSet( SfxItemSet& rAttrs )
184 {
185     sal_Bool bModified = sal_False;
186 
187     if( aCbxRuler.GetSavedValue()           != aCbxRuler.IsChecked() ||
188         aCbxMoveOutline.GetSavedValue()     != aCbxMoveOutline.IsChecked() ||
189         aCbxDragStripes.GetSavedValue()     != aCbxDragStripes.IsChecked() ||
190         //aCbxHelplines.GetSavedValue()     != aCbxHelplines.IsChecked() ||
191         aCbxHandlesBezier.GetSavedValue()   != aCbxHandlesBezier.IsChecked() )
192     {
193         SdOptionsLayoutItem aOptsItem( ATTR_OPTIONS_LAYOUT );
194 
195         aOptsItem.GetOptionsLayout().SetRulerVisible( aCbxRuler.IsChecked() );
196         aOptsItem.GetOptionsLayout().SetMoveOutline( aCbxMoveOutline.IsChecked() );
197         aOptsItem.GetOptionsLayout().SetDragStripes( aCbxDragStripes.IsChecked() );
198         aOptsItem.GetOptionsLayout().SetHandlesBezier( aCbxHandlesBezier.IsChecked() );
199         //aOptsItem.GetOptionsLayout().SetHelplines( aCbxHelplines.IsChecked() );
200 
201         rAttrs.Put( aOptsItem );
202         bModified = sal_True;
203     }
204     return( bModified );
205 }
206 
207 // -----------------------------------------------------------------------
208 
209 void SdTpOptionsContents::Reset( const SfxItemSet& rAttrs )
210 {
211     SdOptionsContentsItem aOptsItem( (const SdOptionsContentsItem&) rAttrs.
212                         Get( ATTR_OPTIONS_CONTENTS ) );
213 
214     SdOptionsLayoutItem aLayoutItem( (const SdOptionsLayoutItem&) rAttrs.
215                         Get( ATTR_OPTIONS_LAYOUT ) );
216 
217     aCbxRuler.Check( aLayoutItem.GetOptionsLayout().IsRulerVisible() );
218     aCbxMoveOutline.Check( aLayoutItem.GetOptionsLayout().IsMoveOutline() );
219     aCbxDragStripes.Check( aLayoutItem.GetOptionsLayout().IsDragStripes() );
220     aCbxHandlesBezier.Check( aLayoutItem.GetOptionsLayout().IsHandlesBezier() );
221     //aCbxHelplines.Check( aLayoutItem.GetOptionsLayout().IsHelplines() );
222 
223     aCbxRuler.SaveValue();
224     aCbxMoveOutline.SaveValue();
225     aCbxDragStripes.SaveValue();
226     aCbxHandlesBezier.SaveValue();
227     //aCbxHelplines.SaveValue();
228 }
229 
230 // -----------------------------------------------------------------------
231 
232 SfxTabPage* SdTpOptionsContents::Create( Window* pWindow,
233                 const SfxItemSet& rAttrs )
234 {
235     return( new SdTpOptionsContents( pWindow, rAttrs ) );
236 }
237 
238 /*************************************************************************
239 |*
240 |*  TabPage zum Einstellen der Sonstige-Optionen
241 |*
242 \************************************************************************/
243 #define TABLE_COUNT 12
244 #define TOKEN (sal_Unicode(':'))
245 
246 SdTpOptionsMisc::SdTpOptionsMisc( Window* pParent, const SfxItemSet& rInAttrs  ) :
247         SfxTabPage          ( pParent, SdResId( TP_OPTIONS_MISC ), rInAttrs ),
248     aGrpText                    ( this, SdResId( GRP_TEXT ) ),
249     aCbxQuickEdit               ( this, SdResId( CBX_QUICKEDIT ) ),
250     aCbxPickThrough             ( this, SdResId( CBX_PICKTHROUGH ) ),
251 
252     // Template & Layout laufen z.Z. synchron!
253     aGrpProgramStart            ( this, SdResId( GRP_PROGRAMSTART ) ),
254     aCbxStartWithTemplate       ( this, SdResId( CBX_START_WITH_TEMPLATE ) ),
255 
256     aGrpSettings                ( this, SdResId( GRP_SETTINGS ) ),
257     aCbxMasterPageCache         ( this, SdResId( CBX_MASTERPAGE_CACHE ) ),
258     aCbxCopy                    ( this, SdResId( CBX_COPY ) ),
259     aCbxMarkedHitMovesAlways    ( this, SdResId( CBX_MARKED_HIT_MOVES_ALWAYS ) ),
260     aCbxCrookNoContortion       ( this, SdResId( CBX_CROOK_NO_CONTORTION ) ),
261 
262     aTxtMetric                  ( this, SdResId( FT_METRIC ) ),
263     aLbMetric                   ( this, SdResId( LB_METRIC ) ),
264     aTxtTabstop                 ( this, SdResId( FT_TABSTOP ) ),
265     aMtrFldTabstop              ( this, SdResId( MTR_FLD_TABSTOP ) ),
266 
267     aCbxStartWithActualPage     ( this, SdResId( CBX_START_WITH_ACTUAL_PAGE ) ),
268     aGrpStartWithActualPage     ( this, SdResId( GRP_START_WITH_ACTUAL_PAGE ) ),
269     aTxtCompatibility           ( this, SdResId( FT_COMPATIBILITY ) ),
270     aCbxUsePrinterMetrics       ( this, SdResId( CB_USE_PRINTER_METRICS ) ),
271     aCbxCompatibility           ( this, SdResId( CB_MERGE_PARA_DIST ) ),
272     aGrpScale                   ( this, SdResId( GRP_SCALE ) ),
273     aFtScale                    ( this, SdResId( FT_SCALE ) ),
274     aCbScale                    ( this, SdResId( CB_SCALE ) ),
275     aFtOriginal                 ( this, SdResId( FT_ORIGINAL ) ),
276     aFtEquivalent               ( this, SdResId( FT_EQUIVALENT ) ),
277     aFtPageWidth                ( this, SdResId( FT_PAGEWIDTH ) ),
278     aFiInfo1                    ( this, SdResId( FI_INFO_1 ) ),
279     aMtrFldOriginalWidth        ( this, SdResId( MTR_FLD_ORIGINAL_WIDTH ) ),
280     aFtPageHeight               ( this, SdResId( FT_PAGEHEIGHT ) ),
281     aFiInfo2                    ( this, SdResId( FI_INFO_2 ) ),
282     aMtrFldOriginalHeight       ( this, SdResId( MTR_FLD_ORIGINAL_HEIGHT ) ),
283     aMtrFldInfo1                ( this, WinBits( WB_HIDE ) ),
284     aMtrFldInfo2                ( this, WinBits( WB_HIDE ) )
285 {
286     FreeResource();
287     SetExchangeSupport();
288 
289     // Metrik einstellen
290     FieldUnit eFUnit;
291 
292     sal_uInt16 nWhich = GetWhich( SID_ATTR_METRIC );
293     if ( rInAttrs.GetItemState( nWhich ) >= SFX_ITEM_AVAILABLE )
294     {
295         const SfxUInt16Item& rItem = (SfxUInt16Item&)rInAttrs.Get( nWhich );
296         eFUnit = (FieldUnit)rItem.GetValue();
297     }
298     else
299         eFUnit = SfxModule::GetCurrentFieldUnit();
300 
301     SetFieldUnit( aMtrFldTabstop, eFUnit );
302 
303     // ListBox mit Metriken f"ullen
304     SvxStringArray aMetricArr( RID_SVXSTR_FIELDUNIT_TABLE );
305     sal_uInt16 i;
306 
307     for ( i = 0; i < aMetricArr.Count(); ++i )
308     {
309         String sMetric = aMetricArr.GetStringByPos( i );
310         long nFieldUnit = aMetricArr.GetValue( i );
311         sal_uInt16 nPos = aLbMetric.InsertEntry( sMetric );
312         aLbMetric.SetEntryData( nPos, (void*)nFieldUnit );
313     }
314     aLbMetric.SetSelectHdl( LINK( this, SdTpOptionsMisc, SelectMetricHdl_Impl ) );
315 
316     SetFieldUnit( aMtrFldOriginalWidth, eFUnit );
317     SetFieldUnit( aMtrFldOriginalHeight, eFUnit );
318     aMtrFldOriginalWidth.SetLast( 999999999 );
319     aMtrFldOriginalWidth.SetMax( 999999999 );
320     aMtrFldOriginalHeight.SetLast( 999999999 );
321     aMtrFldOriginalHeight.SetMax( 999999999 );
322 
323     // Temporaere Fields fuer Info-Texte (fuer Formatierung/Berechnung)
324     aMtrFldInfo1.SetUnit( eFUnit );
325     aMtrFldInfo1.SetMax( 999999999 );
326     aMtrFldInfo1.SetDecimalDigits( 2 );
327     aMtrFldInfo2.SetUnit( eFUnit );
328     aMtrFldInfo2.SetMax( 999999999 );
329     aMtrFldInfo2.SetDecimalDigits( 2 );
330 
331     // PoolUnit ermitteln
332     SfxItemPool* pPool = rInAttrs.GetPool();
333     DBG_ASSERT( pPool, "Wo ist der Pool?" );
334     ePoolUnit = pPool->GetMetric( SID_ATTR_FILL_HATCH );
335 
336     // Fuellen der CB
337     sal_uInt16 aTable[ TABLE_COUNT ] =
338         { 1, 2, 4, 5, 8, 10, 16, 20, 30, 40, 50, 100 };
339 
340     for( i = 0; i < TABLE_COUNT; i++ )
341         aCbScale.InsertEntry( GetScale( 1, aTable[i] ) );
342     for( i = 1; i < TABLE_COUNT; i++ )
343         aCbScale.InsertEntry( GetScale(  aTable[i], 1 ) );
344 }
345 
346 // -----------------------------------------------------------------------
347 
348 SdTpOptionsMisc::~SdTpOptionsMisc()
349 {
350 }
351 // -----------------------------------------------------------------------
352 void SdTpOptionsMisc::ActivatePage( const SfxItemSet& rSet )
353 {
354     // Hier muss noch einmal SaveValue gerufen werden, da sonst u.U.
355     // der Wert in anderen TabPages keine Wirkung hat
356     aLbMetric.SaveValue();
357     // Metrik ggfs. aendern (da TabPage im Dialog liegt,
358     // wo die Metrik eingestellt werden kann
359     const SfxPoolItem* pAttr = NULL;
360     if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_METRIC , sal_False,
361                                     (const SfxPoolItem**)&pAttr ))
362     {
363         const SfxUInt16Item* pItem = (SfxUInt16Item*) pAttr;
364 
365         FieldUnit eFUnit = (FieldUnit)(long)pItem->GetValue();
366 
367         if( eFUnit != aMtrFldOriginalWidth.GetUnit() )
368         {
369             // Metriken einstellen
370             sal_Int64 nVal = aMtrFldOriginalWidth.Denormalize( aMtrFldOriginalWidth.GetValue( FUNIT_TWIP ) );
371             SetFieldUnit( aMtrFldOriginalWidth, eFUnit, sal_True );
372             aMtrFldOriginalWidth.SetValue( aMtrFldOriginalWidth.Normalize( nVal ), FUNIT_TWIP );
373 
374             nVal = aMtrFldOriginalHeight.Denormalize( aMtrFldOriginalHeight.GetValue( FUNIT_TWIP ) );
375             SetFieldUnit( aMtrFldOriginalHeight, eFUnit, sal_True );
376             aMtrFldOriginalHeight.SetValue( aMtrFldOriginalHeight.Normalize( nVal ), FUNIT_TWIP );
377 
378 
379             if( nWidth != 0 && nHeight != 0 )
380             {
381                 aMtrFldInfo1.SetUnit( eFUnit );
382                 aMtrFldInfo2.SetUnit( eFUnit );
383 
384                 SetMetricValue( aMtrFldInfo1, nWidth, ePoolUnit );
385                 aInfo1 = aMtrFldInfo1.GetText();
386                 aFiInfo1.SetText( aInfo1 );
387 
388                 SetMetricValue( aMtrFldInfo2, nHeight, ePoolUnit );
389                 aInfo2 = aMtrFldInfo2.GetText();
390                 aFiInfo2.SetText( aInfo2 );
391             }
392         }
393     }
394 }
395 
396 // -----------------------------------------------------------------------
397 
398 int SdTpOptionsMisc::DeactivatePage( SfxItemSet* pActiveSet )
399 {
400     // Parsercheck
401     sal_Int32 nX, nY;
402     if( SetScale( aCbScale.GetText(), nX, nY ) )
403     {
404         if( pActiveSet )
405             FillItemSet( *pActiveSet );
406         return( LEAVE_PAGE );
407     }
408     WarningBox aWarnBox( GetParent(), WB_YES_NO, String( SdResId( STR_WARN_SCALE_FAIL ) ) );
409     short nReturn = aWarnBox.Execute();
410 
411     if( nReturn == RET_YES )
412         return( KEEP_PAGE );
413 
414     if( pActiveSet )
415         FillItemSet( *pActiveSet );
416 
417     return( LEAVE_PAGE );
418 }
419 
420 // -----------------------------------------------------------------------
421 
422 sal_Bool SdTpOptionsMisc::FillItemSet( SfxItemSet& rAttrs )
423 {
424     sal_Bool bModified = sal_False;
425 
426     if( aCbxStartWithTemplate.GetSavedValue()   != aCbxStartWithTemplate.IsChecked() ||
427         aCbxMarkedHitMovesAlways.GetSavedValue()!= aCbxMarkedHitMovesAlways.IsChecked() ||
428         aCbxCrookNoContortion.GetSavedValue()   != aCbxCrookNoContortion.IsChecked() ||
429         aCbxQuickEdit.GetSavedValue()           != aCbxQuickEdit.IsChecked() ||
430         aCbxPickThrough.GetSavedValue()         != aCbxPickThrough.IsChecked() ||
431         aCbxMasterPageCache.GetSavedValue()     != aCbxMasterPageCache.IsChecked() ||
432         aCbxCopy.GetSavedValue()                != aCbxCopy.IsChecked() ||
433         aCbxStartWithActualPage.GetSavedValue() != aCbxStartWithActualPage.IsChecked() ||
434         aCbxCompatibility.GetSavedValue()       != aCbxCompatibility.IsChecked() ||
435         aCbxUsePrinterMetrics.GetSavedValue()   != aCbxUsePrinterMetrics.IsChecked() )
436     {
437         SdOptionsMiscItem aOptsItem( ATTR_OPTIONS_MISC );
438 
439         aOptsItem.GetOptionsMisc().SetStartWithTemplate( aCbxStartWithTemplate.IsChecked() );
440         aOptsItem.GetOptionsMisc().SetMarkedHitMovesAlways( aCbxMarkedHitMovesAlways.IsChecked() );
441         aOptsItem.GetOptionsMisc().SetCrookNoContortion( aCbxCrookNoContortion.IsChecked() );
442         aOptsItem.GetOptionsMisc().SetQuickEdit( aCbxQuickEdit.IsChecked() );
443         aOptsItem.GetOptionsMisc().SetPickThrough( aCbxPickThrough.IsChecked() );
444         aOptsItem.GetOptionsMisc().SetMasterPagePaintCaching( aCbxMasterPageCache.IsChecked() );
445         aOptsItem.GetOptionsMisc().SetDragWithCopy( aCbxCopy.IsChecked() );
446         aOptsItem.GetOptionsMisc().SetStartWithActualPage( aCbxStartWithActualPage.IsChecked() );
447         aOptsItem.GetOptionsMisc().SetSummationOfParagraphs( aCbxCompatibility.IsChecked() );
448         aOptsItem.GetOptionsMisc().SetPrinterIndependentLayout (
449             aCbxUsePrinterMetrics.IsChecked()
450             ? ::com::sun::star::document::PrinterIndependentLayout::DISABLED
451             : ::com::sun::star::document::PrinterIndependentLayout::ENABLED);
452         rAttrs.Put( aOptsItem );
453 
454         bModified = sal_True;
455     }
456 
457     // Metrik
458     const sal_uInt16 nMPos = aLbMetric.GetSelectEntryPos();
459     if ( nMPos != aLbMetric.GetSavedValue() )
460     {
461         sal_uInt16 nFieldUnit = (sal_uInt16)(long)aLbMetric.GetEntryData( nMPos );
462         rAttrs.Put( SfxUInt16Item( GetWhich( SID_ATTR_METRIC ),
463                                      (sal_uInt16)nFieldUnit ) );
464         bModified |= sal_True;
465     }
466 
467     // Tabulatorabstand
468     if( aMtrFldTabstop.GetText() != aMtrFldTabstop.GetSavedValue() )
469     {
470         sal_uInt16 nWh = GetWhich( SID_ATTR_DEFTABSTOP );
471         SfxMapUnit eUnit = rAttrs.GetPool()->GetMetric( nWh );
472         SfxUInt16Item aDef( nWh,(sal_uInt16)GetCoreValue( aMtrFldTabstop, eUnit ) );
473         rAttrs.Put( aDef );
474         bModified |= sal_True;
475     }
476 
477     sal_Int32 nX, nY;
478     if( SetScale( aCbScale.GetText(), nX, nY ) )
479     {
480         rAttrs.Put( SfxInt32Item( ATTR_OPTIONS_SCALE_X, nX ) );
481         rAttrs.Put( SfxInt32Item( ATTR_OPTIONS_SCALE_Y, nY ) );
482 
483         bModified = sal_True;
484     }
485 
486     return( bModified );
487 }
488 
489 // -----------------------------------------------------------------------
490 
491 void SdTpOptionsMisc::Reset( const SfxItemSet& rAttrs )
492 {
493     SdOptionsMiscItem aOptsItem( (const SdOptionsMiscItem&) rAttrs.
494                         Get( ATTR_OPTIONS_MISC ) );
495 
496     aCbxStartWithTemplate.Check( aOptsItem.GetOptionsMisc().IsStartWithTemplate() );
497     aCbxMarkedHitMovesAlways.Check( aOptsItem.GetOptionsMisc().IsMarkedHitMovesAlways() );
498     aCbxCrookNoContortion.Check( aOptsItem.GetOptionsMisc().IsCrookNoContortion() );
499     aCbxQuickEdit.Check( aOptsItem.GetOptionsMisc().IsQuickEdit() );
500     aCbxPickThrough.Check( aOptsItem.GetOptionsMisc().IsPickThrough() );
501     aCbxMasterPageCache.Check( aOptsItem.GetOptionsMisc().IsMasterPagePaintCaching() );
502     aCbxCopy.Check( aOptsItem.GetOptionsMisc().IsDragWithCopy() );
503     aCbxStartWithActualPage.Check( aOptsItem.GetOptionsMisc().IsStartWithActualPage() );
504     aCbxCompatibility.Check( aOptsItem.GetOptionsMisc().IsSummationOfParagraphs() );
505     aCbxUsePrinterMetrics.Check( aOptsItem.GetOptionsMisc().GetPrinterIndependentLayout()==1 );
506     aCbxStartWithTemplate.SaveValue();
507     aCbxMarkedHitMovesAlways.SaveValue();
508     aCbxCrookNoContortion.SaveValue();
509     aCbxQuickEdit.SaveValue();
510     aCbxPickThrough.SaveValue();
511 
512     aCbxMasterPageCache.SaveValue();
513     aCbxCopy.SaveValue();
514     aCbxStartWithActualPage.SaveValue();
515     aCbxCompatibility.SaveValue();
516     aCbxUsePrinterMetrics.SaveValue();
517 
518     // Metrik
519     sal_uInt16 nWhich = GetWhich( SID_ATTR_METRIC );
520     aLbMetric.SetNoSelection();
521 
522     if ( rAttrs.GetItemState( nWhich ) >= SFX_ITEM_AVAILABLE )
523     {
524         const SfxUInt16Item& rItem = (SfxUInt16Item&)rAttrs.Get( nWhich );
525         long nFieldUnit = (long)rItem.GetValue();
526 
527         for ( sal_uInt16 i = 0; i < aLbMetric.GetEntryCount(); ++i )
528         {
529             if ( (long)aLbMetric.GetEntryData( i ) == nFieldUnit )
530             {
531                 aLbMetric.SelectEntryPos( i );
532                 break;
533             }
534         }
535     }
536 
537     // Tabulatorabstand
538     nWhich = GetWhich( SID_ATTR_DEFTABSTOP );
539     if( rAttrs.GetItemState( nWhich ) >= SFX_ITEM_AVAILABLE )
540     {
541         SfxMapUnit eUnit = rAttrs.GetPool()->GetMetric( nWhich );
542         const SfxUInt16Item& rItem = (SfxUInt16Item&)rAttrs.Get( nWhich );
543         SetMetricValue( aMtrFldTabstop, rItem.GetValue(), eUnit );
544     }
545     aLbMetric.SaveValue();
546     aMtrFldTabstop.SaveValue();
547     //Scale
548     sal_Int32 nX = ( (const SfxInt32Item&) rAttrs.
549                  Get( ATTR_OPTIONS_SCALE_X ) ).GetValue();
550     sal_Int32 nY = ( (const SfxInt32Item&) rAttrs.
551                  Get( ATTR_OPTIONS_SCALE_Y ) ).GetValue();
552     nWidth = ( (const SfxUInt32Item&) rAttrs.
553                     Get( ATTR_OPTIONS_SCALE_WIDTH ) ).GetValue();
554     nHeight = ( (const SfxUInt32Item&) rAttrs.
555                     Get( ATTR_OPTIONS_SCALE_HEIGHT ) ).GetValue();
556 
557     aCbScale.SetText( GetScale( nX, nY ) );
558 
559     // #92067# broken feature disabled for 6.0
560     aFtOriginal.Hide();
561     aFtEquivalent.Hide();
562     aMtrFldOriginalWidth.Hide();
563     aMtrFldOriginalWidth.SetText( aInfo1 ); // leer
564     aMtrFldOriginalHeight.Hide();
565     aMtrFldOriginalHeight.SetText( aInfo2 ); //leer
566     aFtPageWidth.Hide();
567     aFtPageHeight.Hide();
568     aFiInfo1.Hide();
569     aFiInfo2.Hide();
570 
571     UpdateCompatibilityControls ();
572 }
573 
574 // -----------------------------------------------------------------------
575 
576 SfxTabPage* SdTpOptionsMisc::Create( Window* pWindow,
577                 const SfxItemSet& rAttrs )
578 {
579     return( new SdTpOptionsMisc( pWindow, rAttrs ) );
580 }
581 //------------------------------------------------------------------------
582 
583 IMPL_LINK( SdTpOptionsMisc, SelectMetricHdl_Impl, ListBox *, EMPTYARG )
584 {
585     sal_uInt16 nPos = aLbMetric.GetSelectEntryPos();
586 
587     if( nPos != LISTBOX_ENTRY_NOTFOUND )
588     {
589         FieldUnit eUnit = (FieldUnit)(long)aLbMetric.GetEntryData( nPos );
590         sal_Int64 nVal =
591             aMtrFldTabstop.Denormalize( aMtrFldTabstop.GetValue( FUNIT_TWIP ) );
592         SetFieldUnit( aMtrFldTabstop, eUnit );
593         aMtrFldTabstop.SetValue( aMtrFldTabstop.Normalize( nVal ), FUNIT_TWIP );
594     }
595     return 0;
596 }
597 
598 
599 namespace {
600 void lcl_MoveWin( Window& rWin, long nYDiff)
601 {
602     Point aPos(rWin.GetPosPixel());
603     aPos.Y() += nYDiff;
604     rWin.SetPosPixel (aPos);
605 }
606 
607 void lcl_MoveWin( Window& rWin, long nXdiff, long nYdiff)
608 {
609     Point aPos(rWin.GetPosPixel());
610     aPos.X() += nXdiff;
611     aPos.Y() += nYdiff;
612     rWin.SetPosPixel(aPos);
613 }
614 }
615 
616 void SdTpOptionsMisc::SetImpressMode (void)
617 {
618     long nDialogWidth = GetSizePixel().Width();
619     long nLineHeight = aCbxPickThrough.GetPosPixel().Y()
620         - aCbxQuickEdit.GetPosPixel().Y();
621 
622     // Put both "Text objects" check boxes side by side.
623     lcl_MoveWin (aCbxPickThrough,
624         nDialogWidth/2 - aCbxPickThrough.GetPosPixel().X(),
625         -nLineHeight);
626 
627     // Move the other controls up one line.
628     lcl_MoveWin (aGrpProgramStart, -nLineHeight);
629     lcl_MoveWin (aCbxStartWithTemplate, -nLineHeight);
630     lcl_MoveWin (aGrpSettings, -nLineHeight);
631     lcl_MoveWin (aCbxMasterPageCache, -nLineHeight);
632     lcl_MoveWin (aCbxCopy, -nLineHeight);
633     lcl_MoveWin (aCbxMarkedHitMovesAlways, -nLineHeight);
634     lcl_MoveWin (aCbxCrookNoContortion, -nLineHeight);
635     lcl_MoveWin (aTxtMetric, -nLineHeight);
636     lcl_MoveWin (aLbMetric, -nLineHeight);
637     lcl_MoveWin (aTxtTabstop, -nLineHeight);
638     lcl_MoveWin (aMtrFldTabstop, -nLineHeight);
639     lcl_MoveWin (aGrpStartWithActualPage, -nLineHeight);
640     lcl_MoveWin (aCbxStartWithActualPage, -nLineHeight);
641     lcl_MoveWin (aTxtCompatibility, -nLineHeight);
642 
643     // Move the printer-independent-metrics check box up two lines to change
644     // places with spacing-between-paragraphs check box.
645     lcl_MoveWin (aCbxUsePrinterMetrics, -2*nLineHeight);
646 }
647 
648 void    SdTpOptionsMisc::SetDrawMode()
649 {
650     aCbxStartWithTemplate.Hide();
651     aGrpProgramStart.Hide();
652     aCbxStartWithActualPage.Hide();
653     aCbxCompatibility.Hide();
654     aGrpStartWithActualPage.Hide();
655     aCbxCrookNoContortion.Show();
656 
657     aGrpScale.Show();
658     aFtScale.Show();
659     aCbScale.Show();
660 
661     aFtOriginal.Show();
662     aFtEquivalent.Show();
663 
664     aFtPageWidth.Show();
665     aFiInfo1.Show();
666     aMtrFldOriginalWidth.Show();
667 
668     aFtPageHeight.Show();
669     aFiInfo2.Show();
670     aMtrFldOriginalHeight.Show();
671 
672     long nDiff = aGrpSettings.GetPosPixel().Y() - aGrpProgramStart.GetPosPixel().Y();
673     lcl_MoveWin( aGrpSettings, -nDiff );
674     lcl_MoveWin( aCbxMasterPageCache, -nDiff );
675     lcl_MoveWin( aCbxCopy, -nDiff );
676     lcl_MoveWin( aCbxMarkedHitMovesAlways, -nDiff );
677     lcl_MoveWin( aCbxCrookNoContortion, -nDiff );
678     nDiff -= aCbxCrookNoContortion.GetPosPixel().Y() - aCbxMarkedHitMovesAlways.GetPosPixel().Y();
679     lcl_MoveWin( aTxtMetric, -nDiff );
680     lcl_MoveWin( aLbMetric, -nDiff );
681     lcl_MoveWin( aTxtTabstop, -nDiff );
682     lcl_MoveWin( aMtrFldTabstop, -nDiff );
683 
684     // Move the scale controls so that they are visually centered betwen the
685     // group controls above and below.
686     lcl_MoveWin (aFtScale, -17);
687     lcl_MoveWin (aCbScale, -17);
688 
689     // Move the printer-independent-metrics check box in the place that the
690     // spacing-between-paragraphs check box normally is in.
691     aCbxUsePrinterMetrics.SetPosPixel (aCbxCompatibility.GetPosPixel());
692 }
693 // -----------------------------------------------------------------------
694 
695 IMPL_LINK( SdTpOptionsMisc, ModifyScaleHdl, void *, EMPTYARG )
696 {
697     // Originalgroesse berechnen
698     sal_Int32 nX, nY;
699     if( SetScale( aCbScale.GetText(), nX, nY ) )
700     {
701         sal_Int32 nW = nWidth * nY / nX;
702         sal_Int32 nH = nHeight * nY / nX;
703 
704         SetMetricValue( aMtrFldOriginalWidth, nW, ePoolUnit );
705         SetMetricValue( aMtrFldOriginalHeight, nH, ePoolUnit );
706     }
707 
708     return( 0L );
709 }
710 
711 // -----------------------------------------------------------------------
712 
713 IMPL_LINK( SdTpOptionsMisc, ModifyOriginalScaleHdl, void *, EMPTYARG )
714 {
715     // Berechnen des Massstabs
716     long nOrgW = static_cast<long>(aMtrFldOriginalWidth.GetValue());
717     long nOrgH = static_cast<long>(aMtrFldOriginalHeight.GetValue());
718 
719     if( nOrgW == 0 || nOrgH == 0 )
720         return( 0L );
721 
722     Fraction aFract1( nOrgW, static_cast<long>(aMtrFldInfo1.GetValue()) );
723     Fraction aFract2( nOrgH, static_cast<long>(aMtrFldInfo2.GetValue()) );
724     Fraction aFract( aFract1 > aFract2 ? aFract1 : aFract2 );
725 
726     long nValue;
727     if( aFract < Fraction( 1, 1 ) )
728     {
729         // Fraction umdrehen
730         aFract1 = aFract;
731         aFract = Fraction( aFract1.GetDenominator(), aFract1.GetNumerator() );
732         nValue = aFract;
733 
734         // #92067# Swap nominator and denominator
735         aCbScale.SetText( GetScale( nValue, 1 ) );
736     }
737     else
738     {
739         double fValue = aFract;
740         nValue = aFract;
741         if( fValue > (double)nValue )
742             nValue++;
743 
744         // #92067# Swap nominator and denominator
745         aCbScale.SetText( GetScale( 1, nValue ) );
746     }
747     return( 0L );
748 }
749 
750 // -----------------------------------------------------------------------
751 
752 String SdTpOptionsMisc::GetScale( sal_Int32 nX, sal_Int32 nY )
753 {
754     String aScale( UniString::CreateFromInt32( nX ) );
755     aScale.Append( TOKEN );
756     aScale.Append( UniString::CreateFromInt32( nY ) );
757 
758     return( aScale );
759 }
760 
761 // -----------------------------------------------------------------------
762 
763 sal_Bool SdTpOptionsMisc::SetScale( const String& aScale, sal_Int32& rX, sal_Int32& rY )
764 {
765     if( aScale.GetTokenCount( TOKEN ) != 2 )
766         return( sal_False );
767 
768     ByteString aTmp( aScale.GetToken( 0, TOKEN ), RTL_TEXTENCODING_ASCII_US );
769     if( !aTmp.IsNumericAscii() )
770         return( sal_False );
771 
772     rX = (long) aTmp.ToInt32();
773     if( rX == 0 )
774         return( sal_False );
775 
776     aTmp = ByteString( aScale.GetToken( 1, TOKEN ), RTL_TEXTENCODING_ASCII_US );
777     if( !aTmp.IsNumericAscii() )
778         return( sal_False );
779 
780     rY = (long) aTmp.ToInt32();
781     if( rY == 0 )
782         return( sal_False );
783 
784     return( sal_True );
785 }
786 
787 
788 
789 
790 void SdTpOptionsMisc::UpdateCompatibilityControls (void)
791 {
792     // Disable the compatibility controls by default.  Enable them only when
793     // there is at least one open document.
794     sal_Bool bIsEnabled = sal_False;
795 
796     try
797     {
798         // Get a component enumeration from the desktop and search it for documents.
799         Reference<lang::XMultiServiceFactory> xFactory (
800             ::comphelper::getProcessServiceFactory ());
801         do
802         {
803             if ( ! xFactory.is())
804                 break;
805 
806             Reference<frame::XDesktop> xDesktop (xFactory->createInstance (
807                 ::rtl::OUString::createFromAscii("com.sun.star.frame.Desktop")), UNO_QUERY);
808             if ( ! xDesktop.is())
809                 break;
810 
811             Reference<container::XEnumerationAccess> xComponents (
812                 xDesktop->getComponents(), UNO_QUERY);
813             if ( ! xComponents.is())
814                 break;
815 
816             Reference<container::XEnumeration> xEnumeration (
817                 xComponents->createEnumeration());
818             if ( ! xEnumeration.is())
819                 break;
820 
821             while (xEnumeration->hasMoreElements())
822             {
823                 Reference<frame::XModel> xModel (xEnumeration->nextElement(), UNO_QUERY);
824                 if (xModel.is())
825                 {
826                     // There is at leas one model/document: Enable the compatibility controls.
827                     bIsEnabled = sal_True;
828                     break;
829                 }
830             }
831 
832         }
833         while (false); // One 'loop'.
834     }
835     catch (uno::Exception e)
836     {
837         // When there is an exception then simply use the default value of
838         // bIsEnabled and disable the controls.
839     }
840 
841     aTxtCompatibility.Enable (bIsEnabled);
842     aCbxCompatibility.Enable(bIsEnabled);
843     aCbxUsePrinterMetrics.Enable (bIsEnabled);
844 }
845 
846 void SdTpOptionsMisc::PageCreated (SfxAllItemSet aSet)
847 {
848     SFX_ITEMSET_ARG (&aSet,pFlagItem,SfxUInt32Item,SID_SDMODE_FLAG,sal_False);
849     if (pFlagItem)
850     {
851         sal_uInt32 nFlags=pFlagItem->GetValue();
852         if ( ( nFlags & SD_DRAW_MODE ) == SD_DRAW_MODE )
853             SetDrawMode();
854         if ( ( nFlags & SD_IMPRESS_MODE ) == SD_IMPRESS_MODE )
855             SetImpressMode();
856     }
857 }
858 
859