blob: d970c320f5b3ee26fb794b99feba20616e135fde [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.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
#undef SC_DLLIMPLEMENTATION
//------------------------------------------------------------------
#include "scitems.hxx"
#include "tptable.hxx"
#include "global.hxx"
#include "attrib.hxx"
#include "scresid.hxx"
#include "sc.hrc"
#include "pagedlg.hrc"
// =======================================================================
void EmptyNumericField::Modify()
{
if( GetText().Len() )
NumericField::Modify();
else
SetEmptyFieldValue();
}
void EmptyNumericField::SetValue( sal_Int64 nValue )
{
if( nValue == 0 )
SetEmptyFieldValue();
else
NumericField::SetValue( nValue );
}
sal_Int64 EmptyNumericField::GetValue() const
{
return IsEmptyFieldValue() ? 0 : NumericField::GetValue();
}
// =======================================================================
// STATIC DATA -----------------------------------------------------------
static sal_uInt16 pPageTableRanges[] =
{
ATTR_PAGE_NOTES, ATTR_PAGE_FIRSTPAGENO,
0
};
sal_Bool lcl_PutVObjModeItem( sal_uInt16 nWhich,
SfxItemSet& rCoreSet,
const SfxItemSet& rOldSet,
const CheckBox& rBtn );
sal_Bool lcl_PutScaleItem( sal_uInt16 nWhich,
SfxItemSet& rCoreSet,
const SfxItemSet& rOldSet,
const ListBox& rListBox,
sal_uInt16 nLBEntry,
const SpinField& rEd,
sal_uInt16 nValue );
sal_Bool lcl_PutScaleItem2( sal_uInt16 nWhich,
SfxItemSet& rCoreSet,
const SfxItemSet& rOldSet,
const ListBox& rListBox,
sal_uInt16 nLBEntry,
const NumericField& rEd1,
const NumericField& rEd2 );
sal_Bool lcl_PutBoolItem( sal_uInt16 nWhich,
SfxItemSet& rCoreSet,
const SfxItemSet& rOldSet,
sal_Bool bIsChecked,
sal_Bool bSavedValue );
//------------------------------------------------------------------------
#define PAGENO_HDL LINK(this,ScTablePage,PageNoHdl)
#define PAGEDIR_HDL LINK(this,ScTablePage,PageDirHdl)
#define SCALE_HDL LINK(this,ScTablePage,ScaleHdl)
#define WAS_DEFAULT(w,s) (SFX_ITEM_DEFAULT==(s).GetItemState((w),sal_True))
#define GET_BOOL(sid,set) ((const SfxBoolItem&)((set).Get(GetWhich((sid))))).GetValue()
#define GET_USHORT(sid,set) (sal_uInt16)((const SfxUInt16Item&)((set).Get(GetWhich((sid))))).GetValue()
#define GET_SHOW(sid,set) ( ScVObjMode( ((const ScViewObjectModeItem&)((set).Get(GetWhich((sid))))).GetValue() ) \
== VOBJ_MODE_SHOW )
//========================================================================
ScTablePage::ScTablePage( Window* pParent, const SfxItemSet& rCoreAttrs ) :
SfxTabPage( pParent, ScResId( RID_SCPAGE_TABLE ), rCoreAttrs ),
aFlPageDir ( this, ScResId( FL_PAGEDIR ) ),
aBtnTopDown ( this, ScResId( BTN_TOPDOWN ) ),
aBtnLeftRight ( this, ScResId( BTN_LEFTRIGHT ) ),
aBmpPageDir ( this, ScResId( BMP_PAGEDIR ) ),
aImgLeftRight ( ScResId( IMG_LEFTRIGHT ) ),
aImgTopDown ( ScResId( IMG_TOPDOWN ) ),
aImgLeftRightHC ( ScResId( IMG_LEFTRIGHT_H ) ),
aImgTopDownHC ( ScResId( IMG_TOPDOWN_H ) ),
aBtnPageNo ( this, ScResId( BTN_PAGENO ) ),
aEdPageNo ( this, ScResId( ED_PAGENO ) ),
aFlPrint ( this, ScResId( FL_PRINT ) ),
aBtnHeaders ( this, ScResId( BTN_HEADER ) ),
aBtnGrid ( this, ScResId( BTN_GRID ) ),
aBtnNotes ( this, ScResId( BTN_NOTES ) ),
aBtnObjects ( this, ScResId( BTN_OBJECTS ) ),
aBtnCharts ( this, ScResId( BTN_CHARTS ) ),
aBtnDrawings ( this, ScResId( BTN_DRAWINGS ) ),
aBtnFormulas ( this, ScResId( BTN_FORMULAS ) ),
aBtnNullVals ( this, ScResId( BTN_NULLVALS ) ),
aFlScale ( this, ScResId( FL_SCALE ) ),
aFtScaleMode ( this, ScResId( FT_SCALEMODE ) ),
aLbScaleMode ( this, ScResId( LB_SCALEMODE ) ),
aFtScaleAll ( this, ScResId( FT_SCALEFACTOR ) ),
aEdScaleAll ( this, ScResId( ED_SCALEALL ) ),
aFtScalePageWidth ( this, ScResId( FT_SCALEPAGEWIDTH ) ),
aEdScalePageWidth ( this, ScResId( ED_SCALEPAGEWIDTH ) ),
aFtScalePageHeight ( this, ScResId( FT_SCALEPAGEHEIGHT ) ),
aEdScalePageHeight ( this, ScResId( ED_SCALEPAGEHEIGHT ) ),
aFtScalePageNum ( this, ScResId( FT_SCALEPAGENUM ) ),
aEdScalePageNum ( this, ScResId( ED_SCALEPAGENUM ) )
{
SetExchangeSupport();
aBtnPageNo.SetClickHdl( PAGENO_HDL );
aBtnTopDown.SetClickHdl( PAGEDIR_HDL );
aBtnLeftRight.SetClickHdl( PAGEDIR_HDL );
aLbScaleMode.SetSelectHdl( SCALE_HDL );
Size aBmpSize = Image( ScResId( IMG_LEFTRIGHT ) ).GetSizePixel();
aBmpPageDir.SetOutputSizePixel( aBmpSize );
FreeResource();
aEdPageNo.SetAccessibleName(aBtnPageNo.GetText());
aEdPageNo.SetAccessibleRelationLabeledBy(&aBtnPageNo);
}
// -----------------------------------------------------------------------
void ScTablePage::ShowImage()
{
bool bHC = GetSettings().GetStyleSettings().GetHighContrastMode();
bool bLeftRight = aBtnLeftRight.IsChecked();
aBmpPageDir.SetImage( bHC ?
(bLeftRight ? aImgLeftRightHC : aImgTopDownHC) :
(bLeftRight ? aImgLeftRight : aImgTopDown) );
}
// -----------------------------------------------------------------------
ScTablePage::~ScTablePage()
{
}
//------------------------------------------------------------------------
sal_uInt16* ScTablePage::GetRanges()
{
return pPageTableRanges;
}
// -----------------------------------------------------------------------
SfxTabPage* ScTablePage::Create( Window* pParent, const SfxItemSet& rCoreSet )
{
return ( new ScTablePage( pParent, rCoreSet ) );
}
// -----------------------------------------------------------------------
void ScTablePage::Reset( const SfxItemSet& rCoreSet )
{
sal_Bool bTopDown = GET_BOOL( SID_SCATTR_PAGE_TOPDOWN, rCoreSet );
sal_uInt16 nWhich = 0;
//-----------
// sal_Bool-Flags
//-----------
aBtnNotes .Check( GET_BOOL(SID_SCATTR_PAGE_NOTES,rCoreSet) );
aBtnGrid .Check( GET_BOOL(SID_SCATTR_PAGE_GRID,rCoreSet) );
aBtnHeaders .Check( GET_BOOL(SID_SCATTR_PAGE_HEADERS,rCoreSet) );
aBtnFormulas .Check( GET_BOOL(SID_SCATTR_PAGE_FORMULAS,rCoreSet) );
aBtnNullVals .Check( GET_BOOL(SID_SCATTR_PAGE_NULLVALS,rCoreSet) );
aBtnTopDown .Check( bTopDown );
aBtnLeftRight .Check( !bTopDown );
//------------------
// Erste Druckseite:
//------------------
sal_uInt16 nPage = GET_USHORT(SID_SCATTR_PAGE_FIRSTPAGENO,rCoreSet);
aBtnPageNo.Check( nPage != 0 );
aEdPageNo.SetValue( (nPage != 0) ? nPage : 1 );
PageNoHdl( NULL );
//-------------------
// Objektdarstellung:
//-------------------
aBtnCharts .Check( GET_SHOW( SID_SCATTR_PAGE_CHARTS, rCoreSet ) );
aBtnObjects .Check( GET_SHOW( SID_SCATTR_PAGE_OBJECTS, rCoreSet ) );
aBtnDrawings .Check( GET_SHOW( SID_SCATTR_PAGE_DRAWINGS, rCoreSet ) );
//------------
// Skalierung:
//------------
nWhich = GetWhich(SID_SCATTR_PAGE_SCALE);
if ( rCoreSet.GetItemState( nWhich, sal_True ) >= SFX_ITEM_AVAILABLE )
{
sal_uInt16 nScale = ((const SfxUInt16Item&)rCoreSet.Get(nWhich)).GetValue();
if( nScale > 0 )
aLbScaleMode.SelectEntryPos( SC_TPTABLE_SCALE_PERCENT );
aEdScaleAll.SetValue( (nScale > 0) ? nScale : 100 );
}
nWhich = GetWhich(SID_SCATTR_PAGE_SCALETO);
if ( rCoreSet.GetItemState( nWhich, sal_True ) >= SFX_ITEM_AVAILABLE )
{
const ScPageScaleToItem& rItem = static_cast< const ScPageScaleToItem& >( rCoreSet.Get( nWhich ) );
sal_uInt16 nWidth = rItem.GetWidth();
sal_uInt16 nHeight = rItem.GetHeight();
/* width==0 and height==0 is invalid state, used as "not selected".
Dialog shows width=height=1 then. */
bool bValid = nWidth || nHeight;
if( bValid )
aLbScaleMode.SelectEntryPos( SC_TPTABLE_SCALE_TO );
aEdScalePageWidth.SetValue( bValid ? nWidth : 1 );
aEdScalePageHeight.SetValue( bValid ? nHeight : 1 );
}
nWhich = GetWhich(SID_SCATTR_PAGE_SCALETOPAGES);
if ( rCoreSet.GetItemState( nWhich, sal_True ) >= SFX_ITEM_AVAILABLE )
{
sal_uInt16 nPages = ((const SfxUInt16Item&)rCoreSet.Get(nWhich)).GetValue();
if( nPages > 0 )
aLbScaleMode.SelectEntryPos( SC_TPTABLE_SCALE_TO_PAGES );
aEdScalePageNum.SetValue( (nPages > 0) ? nPages : 1 );
}
if( aLbScaleMode.GetSelectEntryCount() == 0 )
{
// fall back to 100%
DBG_ERRORFILE( "ScTablePage::Reset - missing scaling item" );
aLbScaleMode.SelectEntryPos( SC_TPTABLE_SCALE_PERCENT );
aEdScaleAll.SetValue( 100 );
}
PageDirHdl( NULL );
ScaleHdl( NULL );
// merken fuer FillItemSet
aBtnFormulas .SaveValue();
aBtnNullVals .SaveValue();
aBtnNotes .SaveValue();
aBtnGrid .SaveValue();
aBtnHeaders .SaveValue();
aBtnTopDown .SaveValue();
aBtnLeftRight .SaveValue();
aLbScaleMode .SaveValue();
aBtnCharts .SaveValue();
aBtnObjects .SaveValue();
aBtnDrawings .SaveValue();
aBtnPageNo .SaveValue();
aEdPageNo .SaveValue();
aEdScaleAll .SaveValue();
aEdScalePageWidth.SaveValue();
aEdScalePageHeight.SaveValue();
aEdScalePageNum .SaveValue();
}
// -----------------------------------------------------------------------
sal_Bool ScTablePage::FillItemSet( SfxItemSet& rCoreSet )
{
const SfxItemSet& rOldSet = GetItemSet();
sal_uInt16 nWhichPageNo = GetWhich(SID_SCATTR_PAGE_FIRSTPAGENO);
sal_Bool bDataChanged = sal_False;
//-----------
// sal_Bool-Flags
//-----------
bDataChanged |= lcl_PutBoolItem( GetWhich(SID_SCATTR_PAGE_NOTES),
rCoreSet, rOldSet,
aBtnNotes.IsChecked(),
aBtnNotes.GetSavedValue() != STATE_NOCHECK );
bDataChanged |= lcl_PutBoolItem( GetWhich(SID_SCATTR_PAGE_GRID),
rCoreSet, rOldSet,
aBtnGrid.IsChecked(),
aBtnGrid.GetSavedValue() != STATE_NOCHECK );
bDataChanged |= lcl_PutBoolItem( GetWhich(SID_SCATTR_PAGE_HEADERS),
rCoreSet, rOldSet,
aBtnHeaders.IsChecked(),
aBtnHeaders.GetSavedValue() != STATE_NOCHECK );
bDataChanged |= lcl_PutBoolItem( GetWhich(SID_SCATTR_PAGE_TOPDOWN),
rCoreSet, rOldSet,
aBtnTopDown.IsChecked(),
aBtnTopDown.GetSavedValue() );
bDataChanged |= lcl_PutBoolItem( GetWhich(SID_SCATTR_PAGE_FORMULAS),
rCoreSet, rOldSet,
aBtnFormulas.IsChecked(),
aBtnFormulas.GetSavedValue() != STATE_NOCHECK );
bDataChanged |= lcl_PutBoolItem( GetWhich(SID_SCATTR_PAGE_NULLVALS),
rCoreSet, rOldSet,
aBtnNullVals.IsChecked(),
aBtnNullVals.GetSavedValue() != STATE_NOCHECK );
//------------------
// Erste Druckseite:
//------------------
sal_Bool bUseValue = aBtnPageNo.IsChecked();
if ( WAS_DEFAULT(nWhichPageNo,rOldSet)
&& ( (!bUseValue && bUseValue == aBtnPageNo.GetSavedValue())
|| ( bUseValue && bUseValue == aBtnPageNo.GetSavedValue()
&& aEdPageNo.GetText() == aEdPageNo.GetSavedValue() ) ) )
{
rCoreSet.ClearItem( nWhichPageNo );
}
else
{
sal_uInt16 nPage = (sal_uInt16)( aBtnPageNo.IsChecked()
? aEdPageNo.GetValue()
: 0 );
rCoreSet.Put( SfxUInt16Item( nWhichPageNo, nPage ) );
bDataChanged = sal_True;
}
//-------------------
// Objektdarstellung:
//-------------------
bDataChanged |= lcl_PutVObjModeItem( GetWhich(SID_SCATTR_PAGE_CHARTS),
rCoreSet, rOldSet, aBtnCharts );
bDataChanged |= lcl_PutVObjModeItem( GetWhich(SID_SCATTR_PAGE_OBJECTS),
rCoreSet, rOldSet, aBtnObjects );
bDataChanged |= lcl_PutVObjModeItem( GetWhich(SID_SCATTR_PAGE_DRAWINGS),
rCoreSet, rOldSet, aBtnDrawings );
//------------
// Skalierung:
//------------
if( !aEdScalePageWidth.GetValue() && !aEdScalePageHeight.GetValue() )
{
aLbScaleMode.SelectEntryPos( SC_TPTABLE_SCALE_PERCENT );
aEdScaleAll.SetValue( 100 );
}
bDataChanged |= lcl_PutScaleItem( GetWhich(SID_SCATTR_PAGE_SCALE),
rCoreSet, rOldSet,
aLbScaleMode, SC_TPTABLE_SCALE_PERCENT,
aEdScaleAll, (sal_uInt16)aEdScaleAll.GetValue() );
bDataChanged |= lcl_PutScaleItem2( GetWhich(SID_SCATTR_PAGE_SCALETO),
rCoreSet, rOldSet,
aLbScaleMode, SC_TPTABLE_SCALE_TO,
aEdScalePageWidth, aEdScalePageHeight );
bDataChanged |= lcl_PutScaleItem( GetWhich(SID_SCATTR_PAGE_SCALETOPAGES),
rCoreSet, rOldSet,
aLbScaleMode, SC_TPTABLE_SCALE_TO_PAGES,
aEdScalePageNum, (sal_uInt16)aEdScalePageNum.GetValue() );
return bDataChanged;
}
//------------------------------------------------------------------------
int ScTablePage::DeactivatePage( SfxItemSet* pSetP )
{
if ( pSetP )
FillItemSet( *pSetP );
return LEAVE_PAGE;
}
//------------------------------------------------------------------------
void ScTablePage::DataChanged( const DataChangedEvent& rDCEvt )
{
if( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
ShowImage();
SfxTabPage::DataChanged( rDCEvt );
}
//------------------------------------------------------------------------
// Handler:
//------------------------------------------------------------------------
IMPL_LINK( ScTablePage, PageDirHdl, RadioButton*, EMPTYARG )
{
ShowImage();
return 0;
}
//------------------------------------------------------------------------
IMPL_LINK( ScTablePage, PageNoHdl, CheckBox*, pBtn )
{
if ( aBtnPageNo.IsChecked() )
{
aEdPageNo.Enable();
if ( pBtn )
aEdPageNo.GrabFocus();
}
else
aEdPageNo.Disable();
return 0;
}
//------------------------------------------------------------------------
IMPL_LINK( ScTablePage, ScaleHdl, ListBox*, EMPTYARG )
{
// controls for "Reduce/enlarge"
bool bPercent = (aLbScaleMode.GetSelectEntryPos() == SC_TPTABLE_SCALE_PERCENT);
aFtScaleAll.Show( bPercent );
aEdScaleAll.Show( bPercent );
// controls for "Scale to width/height"
bool bScaleTo = (aLbScaleMode.GetSelectEntryPos() == SC_TPTABLE_SCALE_TO);
aFtScalePageWidth.Show( bScaleTo );
aEdScalePageWidth.Show( bScaleTo );
aFtScalePageHeight.Show( bScaleTo );
aEdScalePageHeight.Show( bScaleTo );
// controls for "Scale to pages"
bool bScalePages = (aLbScaleMode.GetSelectEntryPos() == SC_TPTABLE_SCALE_TO_PAGES);
aFtScalePageNum.Show( bScalePages );
aEdScalePageNum.Show( bScalePages );
return 0;
}
//========================================================================
// Hilfsfunktionen fuer FillItemSet:
//========================================================================
sal_Bool lcl_PutBoolItem( sal_uInt16 nWhich,
SfxItemSet& rCoreSet,
const SfxItemSet& rOldSet,
sal_Bool bIsChecked,
sal_Bool bSavedValue )
{
sal_Bool bDataChanged = ( bSavedValue == bIsChecked
&& WAS_DEFAULT(nWhich,rOldSet) );
if ( bDataChanged )
rCoreSet.ClearItem(nWhich);
else
rCoreSet.Put( SfxBoolItem( nWhich, bIsChecked ) );
return bDataChanged;
}
//------------------------------------------------------------------------
sal_Bool lcl_PutVObjModeItem( sal_uInt16 nWhich,
SfxItemSet& rCoreSet,
const SfxItemSet& rOldSet,
const CheckBox& rBtn )
{
sal_Bool bIsChecked = rBtn.IsChecked();
sal_Bool bDataChanged = ( rBtn.GetSavedValue() == bIsChecked
&& WAS_DEFAULT(nWhich,rOldSet) );
if ( bDataChanged )
rCoreSet.ClearItem( nWhich );
else
rCoreSet.Put( ScViewObjectModeItem( nWhich, bIsChecked
? VOBJ_MODE_SHOW
: VOBJ_MODE_HIDE ) );
return bDataChanged;
}
//------------------------------------------------------------------------
sal_Bool lcl_PutScaleItem( sal_uInt16 nWhich,
SfxItemSet& rCoreSet,
const SfxItemSet& rOldSet,
const ListBox& rListBox,
sal_uInt16 nLBEntry,
const SpinField& rEd,
sal_uInt16 nValue )
{
sal_Bool bIsSel = (rListBox.GetSelectEntryPos() == nLBEntry);
sal_Bool bDataChanged = (rListBox.GetSavedValue() != nLBEntry) ||
(rEd.GetSavedValue() != rEd.GetText()) ||
!WAS_DEFAULT( nWhich, rOldSet );
if( bDataChanged )
rCoreSet.Put( SfxUInt16Item( nWhich, bIsSel ? nValue : 0 ) );
else
rCoreSet.ClearItem( nWhich );
return bDataChanged;
}
sal_Bool lcl_PutScaleItem2( sal_uInt16 nWhich,
SfxItemSet& rCoreSet,
const SfxItemSet& rOldSet,
const ListBox& rListBox,
sal_uInt16 nLBEntry,
const NumericField& rEd1,
const NumericField& rEd2 )
{
sal_uInt16 nValue1 = (sal_uInt16)rEd1.GetValue();
sal_uInt16 nValue2 = (sal_uInt16)rEd2.GetValue();
sal_Bool bIsSel = (rListBox.GetSelectEntryPos() == nLBEntry);
sal_Bool bDataChanged = (rListBox.GetSavedValue() != nLBEntry) ||
(rEd1.GetSavedValue() != rEd1.GetText()) ||
(rEd2.GetSavedValue() != rEd2.GetText()) ||
!WAS_DEFAULT( nWhich, rOldSet );
if( bDataChanged )
{
ScPageScaleToItem aItem;
if( bIsSel )
aItem.Set( nValue1, nValue2 );
rCoreSet.Put( aItem );
}
else
rCoreSet.ClearItem( nWhich );
return bDataChanged;
}