summaryrefslogtreecommitdiff
path: root/sc/source/ui/pagedlg/tptable.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/ui/pagedlg/tptable.cxx')
-rw-r--r--sc/source/ui/pagedlg/tptable.cxx570
1 files changed, 0 insertions, 570 deletions
diff --git a/sc/source/ui/pagedlg/tptable.cxx b/sc/source/ui/pagedlg/tptable.cxx
deleted file mode 100644
index 5928506b2..000000000
--- a/sc/source/ui/pagedlg/tptable.cxx
+++ /dev/null
@@ -1,570 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * 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 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 ) ),
- 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 bLeftRight = aBtnLeftRight.IsChecked();
- aBmpPageDir.SetImage( (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%
- OSL_FAIL( "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 = 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;
-}
-
-
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */