diff options
Diffstat (limited to 'sc/source/ui/pagedlg/tptable.cxx')
-rw-r--r-- | sc/source/ui/pagedlg/tptable.cxx | 570 |
1 files changed, 570 insertions, 0 deletions
diff --git a/sc/source/ui/pagedlg/tptable.cxx b/sc/source/ui/pagedlg/tptable.cxx new file mode 100644 index 000000000000..a2b732464e12 --- /dev/null +++ b/sc/source/ui/pagedlg/tptable.cxx @@ -0,0 +1,570 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 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 USHORT pPageTableRanges[] = +{ + ATTR_PAGE_NOTES, ATTR_PAGE_FIRSTPAGENO, + 0 +}; + +BOOL lcl_PutVObjModeItem( USHORT nWhich, + SfxItemSet& rCoreSet, + const SfxItemSet& rOldSet, + const CheckBox& rBtn ); + +BOOL lcl_PutScaleItem( USHORT nWhich, + SfxItemSet& rCoreSet, + const SfxItemSet& rOldSet, + const ListBox& rListBox, + USHORT nLBEntry, + const SpinField& rEd, + UINT16 nValue ); + +BOOL lcl_PutScaleItem2( USHORT nWhich, + SfxItemSet& rCoreSet, + const SfxItemSet& rOldSet, + const ListBox& rListBox, + USHORT nLBEntry, + const NumericField& rEd1, + const NumericField& rEd2 ); + +BOOL lcl_PutBoolItem( USHORT nWhich, + SfxItemSet& rCoreSet, + const SfxItemSet& rOldSet, + BOOL bIsChecked, + 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),TRUE)) +#define GET_BOOL(sid,set) ((const SfxBoolItem&)((set).Get(GetWhich((sid))))).GetValue() +#define GET_USHORT(sid,set) (USHORT)((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(); +} + +// ----------------------------------------------------------------------- + +void ScTablePage::ShowImage() +{ + bool bHC = GetSettings().GetStyleSettings().GetHighContrastMode(); + bool bLeftRight = aBtnLeftRight.IsChecked(); + aBmpPageDir.SetImage( bHC ? + (bLeftRight ? aImgLeftRightHC : aImgTopDownHC) : + (bLeftRight ? aImgLeftRight : aImgTopDown) ); +} + +// ----------------------------------------------------------------------- + +ScTablePage::~ScTablePage() +{ +} + +//------------------------------------------------------------------------ + +USHORT* ScTablePage::GetRanges() +{ + return pPageTableRanges; +} + +// ----------------------------------------------------------------------- + +SfxTabPage* ScTablePage::Create( Window* pParent, const SfxItemSet& rCoreSet ) +{ + return ( new ScTablePage( pParent, rCoreSet ) ); +} + +// ----------------------------------------------------------------------- + +void ScTablePage::Reset( const SfxItemSet& rCoreSet ) +{ + BOOL bTopDown = GET_BOOL( SID_SCATTR_PAGE_TOPDOWN, rCoreSet ); + USHORT nWhich = 0; + + //----------- + // 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: + //------------------ + USHORT 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, TRUE ) >= SFX_ITEM_AVAILABLE ) + { + USHORT 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, TRUE ) >= SFX_ITEM_AVAILABLE ) + { + const ScPageScaleToItem& rItem = static_cast< const ScPageScaleToItem& >( rCoreSet.Get( nWhich ) ); + USHORT nWidth = rItem.GetWidth(); + USHORT 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, TRUE ) >= SFX_ITEM_AVAILABLE ) + { + USHORT 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(); +} + +// ----------------------------------------------------------------------- + +BOOL ScTablePage::FillItemSet( SfxItemSet& rCoreSet ) +{ + const SfxItemSet& rOldSet = GetItemSet(); + USHORT nWhichPageNo = GetWhich(SID_SCATTR_PAGE_FIRSTPAGENO); + BOOL bDataChanged = FALSE; + + //----------- + // 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: + //------------------ + 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 + { + UINT16 nPage = (UINT16)( aBtnPageNo.IsChecked() + ? aEdPageNo.GetValue() + : 0 ); + + rCoreSet.Put( SfxUInt16Item( nWhichPageNo, nPage ) ); + bDataChanged = 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, (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, (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: +//======================================================================== + +BOOL lcl_PutBoolItem( USHORT nWhich, + SfxItemSet& rCoreSet, + const SfxItemSet& rOldSet, + BOOL bIsChecked, + BOOL bSavedValue ) +{ + BOOL bDataChanged = ( bSavedValue == bIsChecked + && WAS_DEFAULT(nWhich,rOldSet) ); + + if ( bDataChanged ) + rCoreSet.ClearItem(nWhich); + else + rCoreSet.Put( SfxBoolItem( nWhich, bIsChecked ) ); + + return bDataChanged; +} + +//------------------------------------------------------------------------ + +BOOL lcl_PutVObjModeItem( USHORT nWhich, + SfxItemSet& rCoreSet, + const SfxItemSet& rOldSet, + const CheckBox& rBtn ) +{ + BOOL bIsChecked = rBtn.IsChecked(); + 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; +} + +//------------------------------------------------------------------------ + +BOOL lcl_PutScaleItem( USHORT nWhich, + SfxItemSet& rCoreSet, + const SfxItemSet& rOldSet, + const ListBox& rListBox, + USHORT nLBEntry, + const SpinField& rEd, + UINT16 nValue ) +{ + BOOL bIsSel = (rListBox.GetSelectEntryPos() == nLBEntry); + 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; +} + + +BOOL lcl_PutScaleItem2( USHORT nWhich, + SfxItemSet& rCoreSet, + const SfxItemSet& rOldSet, + const ListBox& rListBox, + USHORT nLBEntry, + const NumericField& rEd1, + const NumericField& rEd2 ) +{ + UINT16 nValue1 = (UINT16)rEd1.GetValue(); + UINT16 nValue2 = (UINT16)rEd2.GetValue(); + BOOL bIsSel = (rListBox.GetSelectEntryPos() == nLBEntry); + 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; +} + + + |