office-gobmx/cui/source/dialogs/zoom.cxx
Stephan Bergmann ea733ab5b6 Turn SfxItemState into a C++11 scoped enumeration
...to gain further confidence in the claim "that none of the existing
code tries to uses combinations of these enum values"
(d92602c5b1 "more fixes for SfxItemState")

Change-Id: I987922d945e8738e38adfde83b869adf3ff35b13
Reviewed-on: https://gerrit.libreoffice.org/11384
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Tested-by: Stephan Bergmann <sbergman@redhat.com>
2014-09-12 06:08:32 +00:00

452 lines
12 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
#include <svl/itemset.hxx>
#include <svl/itempool.hxx>
#include <sfx2/objsh.hxx>
#include <vcl/layout.hxx>
#include <vcl/msgbox.hxx>
#include <cuires.hrc>
#include "zoom.hxx"
#include <sfx2/zoomitem.hxx>
#include <svx/viewlayoutitem.hxx>
#include <dialmgr.hxx>
#include <svx/zoom_def.hxx>
// static ----------------------------------------------------------------
#define SPECIAL_FACTOR ((sal_uInt16)0xFFFF)
// class SvxZoomDialog ---------------------------------------------------
sal_uInt16 SvxZoomDialog::GetFactor() const
{
if ( m_p100Btn->IsChecked() )
return 100;
if ( m_pUserBtn->IsChecked() )
return (sal_uInt16)m_pUserEdit->GetValue();
else
return SPECIAL_FACTOR;
}
void SvxZoomDialog::SetFactor( sal_uInt16 nNewFactor, sal_uInt16 nBtnId )
{
m_pUserEdit->Disable();
if ( !nBtnId )
{
if ( nNewFactor == 100 )
{
m_p100Btn->Check();
m_p100Btn->GrabFocus();
}
else
{
m_pUserBtn->Check();
m_pUserEdit->Enable();
m_pUserEdit->SetValue( (long)nNewFactor );
m_pUserEdit->GrabFocus();
}
}
else
{
m_pUserEdit->SetValue( (long)nNewFactor );
if ( ZOOMBTN_OPTIMAL == nBtnId )
{
m_pOptimalBtn->Check();
m_pOptimalBtn->GrabFocus();
}
else if ( ZOOMBTN_PAGEWIDTH == nBtnId )
{
m_pPageWidthBtn->Check();
m_pPageWidthBtn->GrabFocus();
}
else if ( ZOOMBTN_WHOLEPAGE == nBtnId )
{
m_pWholePageBtn->Check();
m_pWholePageBtn->GrabFocus();
}
}
}
void SvxZoomDialog::HideButton( sal_uInt16 nBtnId )
{
switch ( nBtnId )
{
case ZOOMBTN_OPTIMAL:
m_pOptimalBtn->Hide();
break;
case ZOOMBTN_PAGEWIDTH:
m_pPageWidthBtn->Hide();
break;
case ZOOMBTN_WHOLEPAGE:
m_pWholePageBtn->Hide();
break;
default:
OSL_FAIL( "Falsche Button-Nummer!!!" );
}
}
void SvxZoomDialog::SetLimits( sal_uInt16 nMin, sal_uInt16 nMax )
{
DBG_ASSERT( nMin < nMax, "invalid limits" );
m_pUserEdit->SetMin( nMin );
m_pUserEdit->SetFirst( nMin );
m_pUserEdit->SetMax( nMax );
m_pUserEdit->SetLast( nMax );
}
SvxZoomDialog::SvxZoomDialog( Window* pParent, const SfxItemSet& rCoreSet )
: SfxModalDialog(pParent, "ZoomDialog", "cui/ui/zoomdialog.ui")
, rSet(rCoreSet)
, pOutSet(NULL)
, bModified(false)
{
get(m_pOptimalBtn, "optimal");
get(m_pWholePageBtn, "fitwandh");
get(m_pPageWidthBtn, "fitw");
get(m_p100Btn, "100pc");
get(m_pUserBtn, "variable");
get(m_pUserEdit, "zoomsb");
get(m_pViewFrame, "viewframe");
get(m_pAutomaticBtn, "automatic");
get(m_pSingleBtn, "singlepage");
get(m_pColumnsBtn, "columns");
get(m_pColumnsEdit, "columnssb");
get(m_pBookModeChk, "bookmode");
get(m_pOKBtn, "ok");
Link aLink = LINK( this, SvxZoomDialog, UserHdl );
m_p100Btn->SetClickHdl( aLink );
m_pOptimalBtn->SetClickHdl( aLink );
m_pPageWidthBtn->SetClickHdl( aLink );
m_pWholePageBtn->SetClickHdl( aLink );
m_pUserBtn->SetClickHdl( aLink );
Link aViewLayoutLink = LINK( this, SvxZoomDialog, ViewLayoutUserHdl );
m_pAutomaticBtn->SetClickHdl( aViewLayoutLink );
m_pSingleBtn->SetClickHdl( aViewLayoutLink );
m_pColumnsBtn->SetClickHdl( aViewLayoutLink );
Link aViewLayoutSpinLink = LINK( this, SvxZoomDialog, ViewLayoutSpinHdl );
m_pColumnsEdit->SetModifyHdl( aViewLayoutSpinLink );
Link aViewLayoutCheckLink = LINK( this, SvxZoomDialog, ViewLayoutCheckHdl );
m_pBookModeChk->SetClickHdl( aViewLayoutCheckLink );
m_pOKBtn->SetClickHdl( LINK( this, SvxZoomDialog, OKHdl ) );
m_pUserEdit->SetModifyHdl( LINK( this, SvxZoomDialog, SpinHdl ) );
// default values
sal_uInt16 nValue = 100;
sal_uInt16 nMin = 10;
sal_uInt16 nMax = 1000;
// maybe get the old value first
const SfxUInt16Item* pOldUserItem = 0;
SfxObjectShell* pSh = SfxObjectShell::Current();
if ( pSh )
pOldUserItem = (const SfxUInt16Item*)pSh->GetItem( SID_ATTR_ZOOM_USER );
if ( pOldUserItem )
nValue = pOldUserItem->GetValue();
// initialize UserEdit
if ( nMin > nValue )
nMin = nValue;
if ( nMax < nValue )
nMax = nValue;
m_pUserEdit->SetMin( nMin );
m_pUserEdit->SetFirst( nMin );
m_pUserEdit->SetMax( nMax );
m_pUserEdit->SetLast( nMax );
m_pUserEdit->SetValue( nValue );
m_pUserEdit->SetAccessibleName(m_pUserBtn->GetText());
m_pColumnsEdit->SetAccessibleName(m_pColumnsBtn->GetText());
m_pColumnsEdit->SetAccessibleRelationMemberOf(m_pColumnsBtn);
m_pBookModeChk->SetAccessibleRelationMemberOf(m_pColumnsBtn);
const SfxPoolItem& rItem = rSet.Get( rSet.GetPool()->GetWhich( SID_ATTR_ZOOM ) );
if ( rItem.ISA(SvxZoomItem) )
{
const SvxZoomItem& rZoomItem = (const SvxZoomItem&)rItem;
const sal_uInt16 nZoom = rZoomItem.GetValue();
const SvxZoomType eType = rZoomItem.GetType();
const sal_uInt16 nValSet = rZoomItem.GetValueSet();
sal_uInt16 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) )
m_p100Btn->Disable();
if ( !(SVX_ZOOM_ENABLE_OPTIMAL & nValSet) )
m_pOptimalBtn->Disable();
if ( !(SVX_ZOOM_ENABLE_PAGEWIDTH & nValSet) )
m_pPageWidthBtn->Disable();
if ( !(SVX_ZOOM_ENABLE_WHOLEPAGE & nValSet) )
m_pWholePageBtn->Disable();
SetFactor( nZoom, nBtnId );
}
else
{
const sal_uInt16 nZoom = ( (const SfxUInt16Item&)rItem ).GetValue();
SetFactor( nZoom );
}
const SfxPoolItem* pViewLayoutItem = 0;
if ( SfxItemState::SET == rSet.GetItemState( SID_ATTR_VIEWLAYOUT, false, &pViewLayoutItem ) )
{
const sal_uInt16 nColumns = static_cast<const SvxViewLayoutItem*>(pViewLayoutItem)->GetValue();
const bool bBookMode = static_cast<const SvxViewLayoutItem*>(pViewLayoutItem)->IsBookMode();
if ( 0 == nColumns )
{
m_pAutomaticBtn->Check();
m_pColumnsEdit->SetValue( 2 );
m_pColumnsEdit->Disable();
m_pBookModeChk->Disable();
}
else if ( 1 == nColumns)
{
m_pSingleBtn->Check();
m_pColumnsEdit->SetValue( 2 );
m_pColumnsEdit->Disable();
m_pBookModeChk->Disable();
}
else
{
m_pColumnsBtn->Check();
if ( !bBookMode )
{
m_pColumnsEdit->SetValue( nColumns );
if ( 0 != nColumns % 2 )
m_pBookModeChk->Disable();
}
else
{
m_pColumnsEdit->SetValue( nColumns );
m_pBookModeChk->Check();
}
}
}
else
{
// hide view layout related controls:
m_pViewFrame->Disable();
}
}
SvxZoomDialog::~SvxZoomDialog()
{
delete pOutSet;
pOutSet = 0;
}
IMPL_LINK( SvxZoomDialog, UserHdl, RadioButton *, pBtn )
{
bModified = true;
if (pBtn == m_pUserBtn)
{
m_pUserEdit->Enable();
m_pUserEdit->GrabFocus();
}
else
m_pUserEdit->Disable();
return 0;
}
IMPL_LINK_NOARG(SvxZoomDialog, SpinHdl)
{
if ( !m_pUserBtn->IsChecked() )
return 0;
bModified = true;
return 0;
}
IMPL_LINK( SvxZoomDialog, ViewLayoutUserHdl, RadioButton *, pBtn )
{
bModified = true;
if (pBtn == m_pAutomaticBtn)
{
m_pColumnsEdit->Disable();
m_pBookModeChk->Disable();
}
else if (pBtn == m_pSingleBtn)
{
m_pColumnsEdit->Disable();
m_pBookModeChk->Disable();
}
else if (pBtn == m_pColumnsBtn)
{
m_pColumnsEdit->Enable();
m_pColumnsEdit->GrabFocus();
if ( 0 == m_pColumnsEdit->GetValue() % 2 )
m_pBookModeChk->Enable();
}
else
{
OSL_FAIL( "Wrong Button" );
return 0;
}
return 0;
}
IMPL_LINK( SvxZoomDialog, ViewLayoutSpinHdl, NumericField *, pEdt )
{
if ( pEdt == m_pColumnsEdit && !m_pColumnsBtn->IsChecked() )
return 0;
if ( 0 == m_pColumnsEdit->GetValue() % 2 )
m_pBookModeChk->Enable();
else
{
m_pBookModeChk->Check( false );
m_pBookModeChk->Disable();
}
bModified = true;
return 0;
}
IMPL_LINK( SvxZoomDialog, ViewLayoutCheckHdl, CheckBox *, pChk )
{
if (pChk == m_pBookModeChk && !m_pColumnsBtn->IsChecked())
return 0;
bModified = true;
return 0;
}
IMPL_LINK( SvxZoomDialog, OKHdl, Button *, pBtn )
{
if ( bModified || m_pOKBtn != pBtn )
{
SvxZoomItem aZoomItem( SVX_ZOOM_PERCENT, 0, rSet.GetPool()->GetWhich( SID_ATTR_ZOOM ) );
SvxViewLayoutItem aViewLayoutItem( 0, false, rSet.GetPool()->GetWhich( SID_ATTR_VIEWLAYOUT ) );
if ( m_pOKBtn == pBtn )
{
sal_uInt16 nFactor = GetFactor();
if ( SPECIAL_FACTOR == nFactor )
{
if ( m_pOptimalBtn->IsChecked() )
aZoomItem.SetType( SVX_ZOOM_OPTIMAL );
else if ( m_pPageWidthBtn->IsChecked() )
aZoomItem.SetType( SVX_ZOOM_PAGEWIDTH );
else if ( m_pWholePageBtn->IsChecked() )
aZoomItem.SetType( SVX_ZOOM_WHOLEPAGE );
}
else
aZoomItem.SetValue( nFactor );
if ( m_pAutomaticBtn->IsChecked() )
{
aViewLayoutItem.SetValue( 0 );
aViewLayoutItem.SetBookMode( false );
}
if ( m_pSingleBtn->IsChecked() )
{
aViewLayoutItem.SetValue( 1 );
aViewLayoutItem.SetBookMode( false );
}
else if ( m_pColumnsBtn->IsChecked() )
{
aViewLayoutItem.SetValue( static_cast<sal_uInt16>(m_pColumnsEdit->GetValue()) );
aViewLayoutItem.SetBookMode( m_pBookModeChk->IsChecked() );
}
}
else
{
OSL_FAIL( "Wrong Button" );
return 0;
}
pOutSet = new SfxItemSet( rSet );
pOutSet->Put( aZoomItem );
// don't set attribute in case the whole viewlayout stuff is disabled:
if (m_pViewFrame->IsEnabled())
pOutSet->Put(aViewLayoutItem);
// memorize value from the UserEdit beyond the dialog
SfxObjectShell* pSh = SfxObjectShell::Current();
if ( pSh )
pSh->PutItem( SfxUInt16Item( SID_ATTR_ZOOM_USER,
(sal_uInt16)m_pUserEdit->GetValue() ) );
EndDialog( RET_OK );
}
else
EndDialog( RET_CANCEL );
return 0;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */