blob: 82e508890dc6156d0190637c4c15d2299dc46ecf [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#if !TEST_LAYOUT
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_svx.hxx"
#endif /* !TEST_LAYOUT */
#ifdef SVX_DLLIMPLEMENTATION
#undef SVX_DLLIMPLEMENTATION
#endif
// include ---------------------------------------------------------------
#if TEST_LAYOUT
#include <cstdio>
#endif /* TEST_LAYOUT */
#include <tools/shl.hxx>
#include <svtools/itemset.hxx>
#include <svtools/itempool.hxx>
#include <sfx2/objsh.hxx>
#include <vcl/msgbox.hxx>
#define _SVX_ZOOM_CXX
#include <svx/dialogs.hrc>
#if !TEST_LAYOUT
#include "zoom.hrc"
#endif /* !TEST_LAYOUT */
#include "zoom.hxx"
#if TEST_LAYOUT
#define SVX_ZOOM_OPTIMAL "Zoom optimal"
#define SVX_ZOOM_PAGEWIDTH "Zoom page width"
#define SVX_ZOOM_WHOLEPAGE "Zoom whole page"
struct SvxZoomItem
{
void SetType( char const* s )
{
fputs( s, stderr );
}
void SetValue( int n )
{
fprintf( stderr, "Zoom factor: %d\n", int( n ) );
}
};
#define SfxPoolItem LAYOUT_SfxPoolItem
class LAYOUT_SfxPoolItem
{
};
struct SvxViewLayoutItem : public LAYOUT_SfxPoolItem
{
bool IsBookMode()
{
return false;
}
USHORT GetValue()
{
return 0;
}
void SetValue( int n )
{
fprintf( stderr, "Zoom factor: %d\n", int( n ) );
}
void SetBookMode( bool )
{
}
#if 0 // needed for real SfxPoolItem
int operator==( const SfxPoolItem& ) const
{
return 0;
}
SfxPoolItem* Clone( SfxItemPool* ) const
{
return 0;
}
#endif
};
#else /* !TEST_LAYOUT */
#include <svx/zoomitem.hxx>
#include <svx/viewlayoutitem.hxx>
#include <svx/dialmgr.hxx>
#endif /* !TEST_LAYOUT */
#include "zoom_def.hxx"
#include <layout/layout-pre.hxx>
#if ENABLE_LAYOUT
#undef SVX_RES
#define SVX_RES(x) #x
#undef SfxModalDialog
#define SfxModalDialog( parent, id ) Dialog( parent, "zoom.xml", id )
#endif /* ENABLE_LAYOUT */
// static ----------------------------------------------------------------
static USHORT pRanges[] =
{
SID_ATTR_ZOOM,
SID_ATTR_ZOOM,
0
};
#define SPECIAL_FACTOR ((USHORT)0xFFFF)
// class SvxZoomDialog ---------------------------------------------------
USHORT SvxZoomDialog::GetFactor() const
{
if ( a100Btn.IsChecked() )
return 100;
if ( aUserBtn.IsChecked() )
return (USHORT)aUserEdit.GetValue();
else
return SPECIAL_FACTOR;
}
// -----------------------------------------------------------------------
void SvxZoomDialog::SetFactor( USHORT nNewFactor, USHORT nBtnId )
{
#if TEST_LAYOUT
printf ("\t\t set factor %d\n", (int)nNewFactor);
#endif /* !TEST_LAYOUT */
aUserEdit.Disable();
if ( !nBtnId )
{
if ( nNewFactor == 100 )
{
a100Btn.Check();
a100Btn.GrabFocus();
}
else
{
aUserBtn.Check();
aUserEdit.Enable();
aUserEdit.SetValue( (long)nNewFactor );
aUserEdit.GrabFocus();
}
}
else
{
aUserEdit.SetValue( (long)nNewFactor );
if ( ZOOMBTN_OPTIMAL == nBtnId )
{
aOptimalBtn.Check();
aOptimalBtn.GrabFocus();
}
else if ( ZOOMBTN_PAGEWIDTH == nBtnId )
{
aPageWidthBtn.Check();
aPageWidthBtn.GrabFocus();
}
else if ( ZOOMBTN_WHOLEPAGE == nBtnId )
{
aWholePageBtn.Check();
aWholePageBtn.GrabFocus();
}
}
}
// -----------------------------------------------------------------------
void SvxZoomDialog::SetButtonText( USHORT nBtnId, const String& rNewTxt )
{
switch ( nBtnId )
{
case ZOOMBTN_OPTIMAL: // Optimal-Button
aOptimalBtn.SetText( rNewTxt );
break;
case ZOOMBTN_PAGEWIDTH: // Seitenbreite-Button
aPageWidthBtn.SetText( rNewTxt );
break;
case ZOOMBTN_WHOLEPAGE: // Ganze Seite-Button
aWholePageBtn.SetText( rNewTxt );
break;
default:
DBG_ERROR( "wrong button number" );
}
}
// -----------------------------------------------------------------------
void SvxZoomDialog::HideButton( USHORT nBtnId )
{
switch ( nBtnId )
{
case ZOOMBTN_OPTIMAL: // Optimal-Button
aOptimalBtn.Hide();
break;
case ZOOMBTN_PAGEWIDTH: // Seitenbreite-Button
aPageWidthBtn.Hide();
break;
case ZOOMBTN_WHOLEPAGE: // Ganze Seite-Button
aWholePageBtn.Hide();
break;
default:
DBG_ERROR( "Falsche Button-Nummer!!!" );
}
}
// -----------------------------------------------------------------------
void SvxZoomDialog::SetLimits( USHORT nMin, USHORT nMax )
{
DBG_ASSERT( nMin < nMax, "invalid limits" );
aUserEdit.SetMin( nMin );
aUserEdit.SetFirst( nMin );
aUserEdit.SetMax( nMax );
aUserEdit.SetLast( nMax );
}
// -----------------------------------------------------------------------
void SvxZoomDialog::SetSpinSize( USHORT nNewSpin )
{
aUserEdit.SetSpinSize( nNewSpin );
}
// -----------------------------------------------------------------------
#if TEST_LAYOUT
SvxZoomDialog::SvxZoomDialog( Window* pParent ) :
#else /* !TEST_LAYOUT */
SvxZoomDialog::SvxZoomDialog( Window* pParent, const SfxItemSet& rCoreSet ) :
#endif /* !TEST_LAYOUT */
SfxModalDialog( pParent, SVX_RES( RID_SVXDLG_ZOOM ) ),
aZoomFl ( this, SVX_RES( FL_ZOOM ) ),
aOptimalBtn ( this, SVX_RES( BTN_OPTIMAL ) ),
aWholePageBtn ( this, SVX_RES( BTN_WHOLE_PAGE ) ),
aPageWidthBtn ( this, SVX_RES( BTN_PAGE_WIDTH ) ),
a100Btn ( this, SVX_RES( BTN_100 ) ),
aUserBtn ( this, SVX_RES( BTN_USER ) ),
aUserEdit ( this, SVX_RES( ED_USER ) ),
aViewLayoutFl ( this, SVX_RES( FL_VIEWLAYOUT ) ),
aAutomaticBtn ( this, SVX_RES( BTN_AUTOMATIC ) ),
aSingleBtn ( this, SVX_RES( BTN_SINGLE ) ),
aColumnsBtn ( this, SVX_RES( BTN_COLUMNS ) ),
aColumnsEdit ( this, SVX_RES( ED_COLUMNS ) ),
aBookModeChk ( this, SVX_RES( CHK_BOOK ) ),
aBottomFl ( this, SVX_RES( FL_BOTTOM ) ),
aOKBtn ( this, SVX_RES( BTN_ZOOM_OK ) ),
aCancelBtn ( this, SVX_RES( BTN_ZOOM_CANCEL ) ),
aHelpBtn ( this, SVX_RES( BTN_ZOOM_HELP ) ),
#if !TEST_LAYOUT
rSet ( rCoreSet ),
#endif /* !TEST_LAYOUT */
pOutSet ( NULL ),
bModified ( FALSE )
{
#if ENABLE_LAYOUT
SetHelpId (SID_ATTR_ZOOM);
#endif /* ENABLE_LAYOUT */
Link aLink = LINK( this, SvxZoomDialog, UserHdl );
a100Btn.SetClickHdl( aLink );
aOptimalBtn.SetClickHdl( aLink );
aPageWidthBtn.SetClickHdl( aLink );
aWholePageBtn.SetClickHdl( aLink );
aUserBtn.SetClickHdl( aLink );
Link aViewLayoutLink = LINK( this, SvxZoomDialog, ViewLayoutUserHdl );
aAutomaticBtn.SetClickHdl( aViewLayoutLink );
aSingleBtn.SetClickHdl( aViewLayoutLink );
aColumnsBtn.SetClickHdl( aViewLayoutLink );
Link aViewLayoutSpinLink = LINK( this, SvxZoomDialog, ViewLayoutSpinHdl );
aColumnsEdit.SetModifyHdl( aViewLayoutSpinLink );
Link aViewLayoutCheckLink = LINK( this, SvxZoomDialog, ViewLayoutCheckHdl );
aBookModeChk.SetClickHdl( aViewLayoutCheckLink );
aOKBtn.SetClickHdl( LINK( this, SvxZoomDialog, OKHdl ) );
aUserEdit.SetModifyHdl( LINK( this, SvxZoomDialog, SpinHdl ) );
// Default-Werte
USHORT nValue = 100;
USHORT nMin = 10;
USHORT nMax = 1000;
#if !TEST_LAYOUT
// ggf. erst den alten Wert besorgen
const SfxUInt16Item* pOldUserItem = 0;
SfxObjectShell* pSh = SfxObjectShell::Current();
if ( pSh )
pOldUserItem = (const SfxUInt16Item*)pSh->GetItem( SID_ATTR_ZOOM_USER );
if ( pOldUserItem )
nValue = pOldUserItem->GetValue();
// UserEdit initialisieren
if ( nMin > nValue )
nMin = nValue;
if ( nMax < nValue )
nMax = nValue;
#endif /* !TEST_LAYOUT */
aUserEdit.SetMin( nMin );
aUserEdit.SetFirst( nMin );
aUserEdit.SetMax( nMax );
aUserEdit.SetLast( nMax );
aUserEdit.SetValue( nValue );
#if TEST_LAYOUT
USHORT nZoom = 100;
SetFactor( nZoom );
#else /* !TEST_LAYOUT */
const SfxPoolItem& rItem = rSet.Get( rSet.GetPool()->GetWhich( SID_ATTR_ZOOM ) );
if ( rItem.ISA(SvxZoomItem) )
{
const SvxZoomItem& rZoomItem = (const SvxZoomItem&)rItem;
const USHORT nZoom = rZoomItem.GetValue();
const SvxZoomType eType = rZoomItem.GetType();
const USHORT nValSet = rZoomItem.GetValueSet();
USHORT nBtnId = 0;
switch ( eType )
{
case SVX_ZOOM_OPTIMAL:
nBtnId = ZOOMBTN_OPTIMAL;
break;
case SVX_ZOOM_PAGEWIDTH:
nBtnId = ZOOMBTN_PAGEWIDTH;
break;
case SVX_ZOOM_WHOLEPAGE:
nBtnId = ZOOMBTN_WHOLEPAGE;
break;
case SVX_ZOOM_PERCENT:
break;
case SVX_ZOOM_PAGEWIDTH_NOBORDER:
break;
}
if ( !(SVX_ZOOM_ENABLE_100 & nValSet) )
a100Btn.Disable();
if ( !(SVX_ZOOM_ENABLE_OPTIMAL & nValSet) )
aOptimalBtn.Disable();
if ( !(SVX_ZOOM_ENABLE_PAGEWIDTH & nValSet) )
aPageWidthBtn.Disable();
if ( !(SVX_ZOOM_ENABLE_WHOLEPAGE & nValSet) )
aWholePageBtn.Disable();
SetFactor( nZoom, nBtnId );
}
else
{
const USHORT nZoom = ( (const SfxUInt16Item&)rItem ).GetValue();
SetFactor( nZoom );
}
const SfxPoolItem* pViewLayoutItem = 0;
if ( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_VIEWLAYOUT, FALSE, &pViewLayoutItem ) )
{
const USHORT nColumns = static_cast<const SvxViewLayoutItem*>(pViewLayoutItem)->GetValue();
const bool bBookMode = static_cast<const SvxViewLayoutItem*>(pViewLayoutItem)->IsBookMode();
if ( 0 == nColumns )
{
aAutomaticBtn.Check();
aColumnsEdit.SetValue( 2 );
aColumnsEdit.Disable();
aBookModeChk.Disable();
}
else if ( 1 == nColumns)
{
aSingleBtn.Check();
aColumnsEdit.SetValue( 2 );
aColumnsEdit.Disable();
aBookModeChk.Disable();
}
else
{
aColumnsBtn.Check();
if ( !bBookMode )
{
aColumnsEdit.SetValue( nColumns );
if ( 0 != nColumns % 2 )
aBookModeChk.Disable();
}
else
{
aColumnsEdit.SetValue( nColumns );
aBookModeChk.Check();
}
}
}
else
{
// hide view layout related controls:
aViewLayoutFl.Disable();
aAutomaticBtn.Disable();
aSingleBtn.Disable();
aColumnsBtn.Disable();
aColumnsEdit.Disable();
aBookModeChk.Disable();
}
#endif /* !TEST_LAYOUT */
FreeResource();
}
// -----------------------------------------------------------------------
SvxZoomDialog::~SvxZoomDialog()
{
delete pOutSet;
pOutSet = 0;
}
// -----------------------------------------------------------------------
USHORT* SvxZoomDialog::GetRanges()
{
return pRanges;
}
// -----------------------------------------------------------------------
IMPL_LINK( SvxZoomDialog, UserHdl, RadioButton *, pBtn )
{
#if TEST_LAYOUT
fprintf( stderr, "SvxZoomDialog::UserHdl\n" );
#endif /* TEST_LAYOUT */
bModified |= TRUE;
if ( pBtn == &aUserBtn )
{
aUserEdit.Enable();
aUserEdit.GrabFocus();
}
else
aUserEdit.Disable();
return 0;
}
// -----------------------------------------------------------------------
IMPL_LINK( SvxZoomDialog, SpinHdl, MetricField *, EMPTYARG )
{
if ( !aUserBtn.IsChecked() )
return 0;
bModified |= TRUE;
return 0;
}
// -----------------------------------------------------------------------
IMPL_LINK( SvxZoomDialog, ViewLayoutUserHdl, RadioButton *, pBtn )
{
bModified |= TRUE;
if ( pBtn == &aAutomaticBtn )
{
aColumnsEdit.Disable();
aBookModeChk.Disable();
}
else if ( pBtn == &aSingleBtn )
{
aColumnsEdit.Disable();
aBookModeChk.Disable();
}
else if ( pBtn == &aColumnsBtn )
{
aColumnsEdit.Enable();
aColumnsEdit.GrabFocus();
if ( 0 == aColumnsEdit.GetValue() % 2 )
aBookModeChk.Enable();
}
else
{
DBG_ERROR( "Wrong Button" );
return 0;
}
return 0;
}
// -----------------------------------------------------------------------
IMPL_LINK( SvxZoomDialog, ViewLayoutSpinHdl, MetricField *, pEdt )
{
if ( pEdt == &aColumnsEdit && !aColumnsBtn.IsChecked() )
return 0;
if ( 0 == aColumnsEdit.GetValue() % 2 )
aBookModeChk.Enable();
else
{
aBookModeChk.Check( sal_False );
aBookModeChk.Disable();
}
bModified |= TRUE;
return 0;
}
// -----------------------------------------------------------------------
IMPL_LINK( SvxZoomDialog, ViewLayoutCheckHdl, CheckBox *, pChk )
{
if ( pChk == &aBookModeChk && !aColumnsBtn.IsChecked() )
return 0;
bModified |= TRUE;
return 0;
}
// -----------------------------------------------------------------------
IMPL_LINK( SvxZoomDialog, OKHdl, Button *, pBtn )
{
if ( bModified || &aOKBtn != pBtn )
{
#if TEST_LAYOUT
SvxZoomItem aZoomItem;
SvxViewLayoutItem aViewLayoutItem;
#else /* !TEST_LAYOUT */
SvxZoomItem aZoomItem( SVX_ZOOM_PERCENT, 0, rSet.GetPool()->GetWhich( SID_ATTR_ZOOM ) );
SvxViewLayoutItem aViewLayoutItem( 0, false, rSet.GetPool()->GetWhich( SID_ATTR_VIEWLAYOUT ) );
#endif /* !TEST_LAYOUT */
if ( &aOKBtn == pBtn )
{
USHORT nFactor = GetFactor();
if ( SPECIAL_FACTOR == nFactor )
{
if ( aOptimalBtn.IsChecked() )
aZoomItem.SetType( SVX_ZOOM_OPTIMAL );
else if ( aPageWidthBtn.IsChecked() )
aZoomItem.SetType( SVX_ZOOM_PAGEWIDTH );
else if ( aWholePageBtn.IsChecked() )
aZoomItem.SetType( SVX_ZOOM_WHOLEPAGE );
}
else
aZoomItem.SetValue( nFactor );
if ( aAutomaticBtn.IsChecked() )
{
aViewLayoutItem.SetValue( 0 );
aViewLayoutItem.SetBookMode( false );
}
if ( aSingleBtn.IsChecked() )
{
aViewLayoutItem.SetValue( 1 );
aViewLayoutItem.SetBookMode( false );
}
else if ( aColumnsBtn.IsChecked() )
{
aViewLayoutItem.SetValue( static_cast<USHORT>(aColumnsEdit.GetValue()) );
aViewLayoutItem.SetBookMode( aBookModeChk.IsChecked() );
}
}
else
{
DBG_ERROR( "Wrong Button" );
return 0;
}
#if !TEST_LAYOUT
pOutSet = new SfxItemSet( rSet );
pOutSet->Put( aZoomItem );
// don't set attribute in case the whole viewlayout stuff is disabled:
if ( aViewLayoutFl.IsEnabled() )
pOutSet->Put( aViewLayoutItem );
// Wert aus dem UserEdit "uber den Dialog hinaus merken
SfxObjectShell* pSh = SfxObjectShell::Current();
if ( pSh )
pSh->PutItem( SfxUInt16Item( SID_ATTR_ZOOM_USER,
(UINT16)aUserEdit.GetValue() ) );
#endif /* !TEST_LAYOUT */
EndDialog( RET_OK );
}
else
EndDialog( RET_CANCEL );
return 0;
}