diff options
Diffstat (limited to 'cui/source/tabpages/tpshadow.cxx')
-rw-r--r-- | cui/source/tabpages/tpshadow.cxx | 613 |
1 files changed, 613 insertions, 0 deletions
diff --git a/cui/source/tabpages/tpshadow.cxx b/cui/source/tabpages/tpshadow.cxx new file mode 100644 index 000000000000..48d6d627230d --- /dev/null +++ b/cui/source/tabpages/tpshadow.cxx @@ -0,0 +1,613 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: tpshadow.cxx,v $ + * $Revision: 1.20 $ + * + * 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_cui.hxx" + +// include --------------------------------------------------------------- +#include <tools/shl.hxx> +#include <sfx2/app.hxx> +#include <sfx2/module.hxx> +#include <svx/dialogs.hrc> + +#define _SVX_TPSHADOW_CXX + +#include "svx/xattr.hxx" +#include <svx/xpool.hxx> +#include <cuires.hrc> +#include "tabarea.hrc" +#include <svx/svdattr.hxx> +#include "svx/drawitem.hxx" +#include "cuitabarea.hxx" +#include <dialmgr.hxx> +#include "svx/dlgutil.hxx" +#include <cuitabline.hxx> + +#include <svx/xlineit0.hxx> +#include <sfx2/request.hxx> //add CHINA001 + +#define DLGWIN this->GetParent()->GetParent() + +// static ---------------------------------------------------------------- + +static USHORT pShadowRanges[] = +{ + SDRATTR_SHADOWCOLOR, + SDRATTR_SHADOWTRANSPARENCE, + SID_ATTR_FILL_SHADOW, + SID_ATTR_FILL_SHADOW, + 0 +}; + +/************************************************************************* +|* +|* Dialog zum Aendern des Schattens +|* +\************************************************************************/ + +SvxShadowTabPage::SvxShadowTabPage( Window* pParent, const SfxItemSet& rInAttrs ) : + + SvxTabPage ( pParent, CUI_RES( RID_SVXPAGE_SHADOW ), rInAttrs ), + + aFlProp ( this, CUI_RES( FL_PROP ) ), + aTsbShowShadow ( this, CUI_RES( TSB_SHOW_SHADOW ) ), + aFtPosition ( this, CUI_RES( FT_POSITION ) ), + aCtlPosition ( this, CUI_RES( CTL_POSITION ) ), + aFtDistance ( this, CUI_RES( FT_DISTANCE ) ), + aMtrDistance ( this, CUI_RES( MTR_FLD_DISTANCE ) ), + aFtShadowColor ( this, CUI_RES( FT_SHADOW_COLOR ) ), + aLbShadowColor ( this, CUI_RES( LB_SHADOW_COLOR ) ), + aFtTransparent ( this, CUI_RES( FT_TRANSPARENT ) ), + aMtrTransparent ( this, CUI_RES( MTR_SHADOW_TRANSPARENT ) ), + aCtlXRectPreview ( this, CUI_RES( CTL_COLOR_PREVIEW ) ), + rOutAttrs ( rInAttrs ), + pColorTab( NULL ), + bDisable ( FALSE ), + pXPool ( (XOutdevItemPool*) rInAttrs.GetPool() ), + aXFillAttr ( pXPool ), + rXFSet ( aXFillAttr.GetItemSet() ) +{ + FreeResource(); + + // diese Page braucht ExchangeSupport + SetExchangeSupport(); + + // Metrik einstellen + FieldUnit eFUnit = GetModuleFieldUnit( &rInAttrs ); + + switch ( eFUnit ) + { + case FUNIT_M: + case FUNIT_KM: + eFUnit = FUNIT_MM; + break; + default: ;//prevent warning + } + SetFieldUnit( aMtrDistance, eFUnit ); + + // PoolUnit ermitteln + SfxItemPool* pPool = rOutAttrs.GetPool(); + DBG_ASSERT( pPool, "Wo ist der Pool?" ); + ePoolUnit = pPool->GetMetric( SDRATTR_SHADOWXDIST ); + + // Setzen des Output-Devices + XFillStyle eXFS = XFILL_SOLID; + if( rOutAttrs.GetItemState( XATTR_FILLSTYLE ) != SFX_ITEM_DONTCARE ) + { + eXFS = (XFillStyle) ( ( ( const XFillStyleItem& ) rOutAttrs. + Get( GetWhich( XATTR_FILLSTYLE ) ) ).GetValue() ); + switch( eXFS ) + { + //case XFILL_NONE: --> NICHTS + + case XFILL_SOLID: + if( SFX_ITEM_DONTCARE != rOutAttrs.GetItemState( XATTR_FILLCOLOR ) ) + { + XFillColorItem aColorItem( ( const XFillColorItem& ) + rOutAttrs.Get( XATTR_FILLCOLOR ) ); + rXFSet.Put( aColorItem ); + } + break; + + case XFILL_GRADIENT: + if( SFX_ITEM_DONTCARE != rOutAttrs.GetItemState( XATTR_FILLGRADIENT ) ) + { + XFillGradientItem aGradientItem( ( ( const XFillGradientItem& ) + rOutAttrs.Get( XATTR_FILLGRADIENT ) ) ); + rXFSet.Put( aGradientItem ); + } + break; + + case XFILL_HATCH: + if( SFX_ITEM_DONTCARE != rOutAttrs.GetItemState( XATTR_FILLHATCH ) ) + { + XFillHatchItem aHatchItem( ( ( const XFillHatchItem& ) + rOutAttrs.Get( XATTR_FILLHATCH ) ) ); + rXFSet.Put( aHatchItem ); + } + break; + + case XFILL_BITMAP: + { + if( SFX_ITEM_DONTCARE != rOutAttrs.GetItemState( XATTR_FILLBITMAP ) ) + { + XFillBitmapItem aBitmapItem( ( const XFillBitmapItem& ) + rOutAttrs.Get( XATTR_FILLBITMAP ) ); + rXFSet.Put( aBitmapItem ); + } + } + break; + case XFILL_NONE : break; + } + } + else + { + rXFSet.Put( XFillColorItem( String(), COL_LIGHTRED ) ); + } + + if(XFILL_NONE == eXFS) + { + // #i96350# + // fallback to solid fillmode when no fill mode is provided to have + // a reasonable shadow preview. The used color will be a set one or + // the default (currently blue8) + eXFS = XFILL_SOLID; + } + + rXFSet.Put( XFillStyleItem( eXFS ) ); + aCtlXRectPreview.SetRectangleAttributes(aXFillAttr.GetItemSet()); + //aCtlXRectPreview.SetFillAttr( aXFillAttr ); + + aTsbShowShadow.SetClickHdl( LINK( this, SvxShadowTabPage, ClickShadowHdl_Impl ) ); + Link aLink = LINK( this, SvxShadowTabPage, ModifyShadowHdl_Impl ); + aLbShadowColor.SetSelectHdl( aLink ); + aMtrTransparent.SetModifyHdl( aLink ); + aMtrDistance.SetModifyHdl( aLink ); + +} + +// ----------------------------------------------------------------------- + +void SvxShadowTabPage::Construct() +{ + // Farbtabelle fuellen + aLbShadowColor.Fill( pColorTab ); + + if( bDisable ) + { + aTsbShowShadow.Disable(); + aFtPosition.Disable(); + aCtlPosition.Disable(); + aFtDistance.Disable(); + aMtrDistance.Disable(); + aFtShadowColor.Disable(); + aLbShadowColor.Disable(); + aFtTransparent.Disable(); + aMtrTransparent.Disable(); + } +} + +// ----------------------------------------------------------------------- + +void SvxShadowTabPage::ActivatePage( const SfxItemSet& rSet ) +{ + USHORT nPos; + USHORT nCount; + //add CHINA001 Begin + SFX_ITEMSET_ARG (&rSet,pPageTypeItem,SfxUInt16Item,SID_PAGE_TYPE,sal_False); + if (pPageTypeItem) + SetPageType(pPageTypeItem->GetValue()); + //add CHINA001 end + if( nDlgType == 0 ) //CHINA001 // Flaechen-Dialogif( *pDlgType == 0 ) // Flaechen-Dialog + { + if( pColorTab ) + { + // ColorTable + if( *pnColorTableState & CT_CHANGED || + *pnColorTableState & CT_MODIFIED ) + { + if( *pnColorTableState & CT_CHANGED ) + { + SvxAreaTabDialog* pArea = dynamic_cast< SvxAreaTabDialog* >( DLGWIN ); + if( pArea ) + { + pColorTab = pArea->GetNewColorTable(); + } + else + { + SvxLineTabDialog* pLine = dynamic_cast< SvxLineTabDialog* >( DLGWIN ); + if( pLine ) + pColorTab = pLine->GetNewColorTable(); + } + } + + // aLbShadowColor + nPos = aLbShadowColor.GetSelectEntryPos(); + aLbShadowColor.Clear(); + aLbShadowColor.Fill( pColorTab ); + nCount = aLbShadowColor.GetEntryCount(); + if( nCount == 0 ) + ; // Dieser Fall sollte nicht auftreten + else if( nCount <= nPos ) + aLbShadowColor.SelectEntryPos( 0 ); + else + aLbShadowColor.SelectEntryPos( nPos ); + + ModifyShadowHdl_Impl( this ); + } + nPageType = PT_SHADOW;//CHINA001 *pPageType = PT_SHADOW; + } + } +} + +// ----------------------------------------------------------------------- + +int SvxShadowTabPage::DeactivatePage( SfxItemSet* _pSet ) +{ + if( _pSet ) + FillItemSet( *_pSet ); + + return( LEAVE_PAGE ); +} + +// ----------------------------------------------------------------------- + +BOOL SvxShadowTabPage::FillItemSet( SfxItemSet& rAttrs ) +{ + const SfxPoolItem* pOld = NULL; + BOOL bModified = FALSE; + + if( !bDisable ) + { + // Schatten + TriState eState = aTsbShowShadow.GetState(); + if( eState != aTsbShowShadow.GetSavedValue() ) + { + SdrShadowItem aItem( sal::static_int_cast< BOOL >( eState ) ); + pOld = GetOldItem( rAttrs, SDRATTR_SHADOW ); + if ( !pOld || !( *(const SdrShadowItem*)pOld == aItem ) ) + { + rAttrs.Put( aItem ); + bModified = TRUE; + } + } + + // Schatten-Entfernung + // Etwas umstaendliche Abfrage, ob etwas geaendert wurde, + // da Items nicht direkt auf Controls abbildbar sind + INT32 nX = 0L, nY = 0L; + INT32 nXY = GetCoreValue( aMtrDistance, ePoolUnit ); + + switch( aCtlPosition.GetActualRP() ) + { + case RP_LT: nX = nY = -nXY; break; + case RP_MT: nY = -nXY; break; + case RP_RT: nX = nXY; nY = -nXY; break; + case RP_LM: nX = -nXY; break; + case RP_RM: nX = nXY; break; + case RP_LB: nX = -nXY; nY = nXY; break; + case RP_MB: nY = nXY; break; + case RP_RB: nX = nY = nXY; break; + case RP_MM: break; + } + + // Wenn die Werte des Schattenabstanden==SFX_ITEM_DONTCARE und der angezeigte + // String im entspr. MetricField=="", dann w�rde der Vergleich zw. alten und + // neuen Distance-Werte ein falsches Ergebnis liefern, da in so einem Fall die + // neuen Distance-Werte den Default-Werten des MetricField entspr�chen !!!! + if ( !aMtrDistance.IsEmptyFieldValue() || + rOutAttrs.GetItemState( SDRATTR_SHADOWXDIST ) != SFX_ITEM_DONTCARE || + rOutAttrs.GetItemState( SDRATTR_SHADOWYDIST ) != SFX_ITEM_DONTCARE ) + { + INT32 nOldX = 9876543; // Unmoeglicher Wert, entspr. DontCare + INT32 nOldY = 9876543; + if( rOutAttrs.GetItemState( SDRATTR_SHADOWXDIST ) != SFX_ITEM_DONTCARE && + rOutAttrs.GetItemState( SDRATTR_SHADOWYDIST ) != SFX_ITEM_DONTCARE ) + { + nOldX = ( ( const SdrShadowXDistItem& ) rOutAttrs. + Get( SDRATTR_SHADOWXDIST ) ).GetValue(); + nOldY = ( ( const SdrShadowYDistItem& ) rOutAttrs. + Get( SDRATTR_SHADOWYDIST ) ).GetValue(); + } + SdrShadowXDistItem aXItem( nX ); + pOld = GetOldItem( rAttrs, SDRATTR_SHADOWXDIST ); + if ( nX != nOldX && + ( !pOld || !( *(const SdrShadowXDistItem*)pOld == aXItem ) ) ) + { + rAttrs.Put( aXItem ); + bModified = TRUE; + } + SdrShadowYDistItem aYItem( nY ); + pOld = GetOldItem( rAttrs, SDRATTR_SHADOWYDIST ); + if ( nY != nOldY && + ( !pOld || !( *(const SdrShadowYDistItem*)pOld == aYItem ) ) ) + { + rAttrs.Put( aYItem ); + bModified = TRUE; + } + } + + // ShadowColor + USHORT nPos = aLbShadowColor.GetSelectEntryPos(); + if( nPos != LISTBOX_ENTRY_NOTFOUND && + nPos != aLbShadowColor.GetSavedValue() ) + { + SdrShadowColorItem aItem( aLbShadowColor.GetSelectEntry(), + aLbShadowColor.GetSelectEntryColor() ); + pOld = GetOldItem( rAttrs, SDRATTR_SHADOWCOLOR ); + if ( !pOld || !( *(const SdrShadowColorItem*)pOld == aItem ) ) + { + rAttrs.Put( aItem ); + bModified = TRUE; + } + } + + // Transparenz + UINT16 nVal = (UINT16)aMtrTransparent.GetValue(); + if( nVal != (UINT16)aMtrTransparent.GetSavedValue().ToInt32() ) + { + SdrShadowTransparenceItem aItem( nVal ); + pOld = GetOldItem( rAttrs, SDRATTR_SHADOWTRANSPARENCE ); + if ( !pOld || !( *(const SdrShadowTransparenceItem*)pOld == aItem ) ) + { + rAttrs.Put( aItem ); + bModified = TRUE; + } + } + } + //add CHINA001 begin + rAttrs.Put (CntUInt16Item(SID_PAGE_TYPE,nPageType)); + //add CHINA001 end + return( bModified ); +} + +// ----------------------------------------------------------------------- + +void SvxShadowTabPage::Reset( const SfxItemSet& rAttrs ) +{ + if( !bDisable ) + { + // Alle Objekte koennen einen Schatten besitzen + // z.Z. gibt es nur 8 m�gliche Positionen den Schatten zu setzen + + // Ist Schatten gesetzt? + if( rAttrs.GetItemState( SDRATTR_SHADOW ) != SFX_ITEM_DONTCARE ) + { + aTsbShowShadow.EnableTriState( FALSE ); + + if( ( ( const SdrShadowItem& ) rAttrs.Get( SDRATTR_SHADOW ) ).GetValue() ) + aTsbShowShadow.SetState( STATE_CHECK ); + else + { + aTsbShowShadow.SetState( STATE_NOCHECK ); + } + } + else + aTsbShowShadow.SetState( STATE_DONTKNOW ); + + // Entfernung (nur 8 moegliche Positionen), deshalb + // wird nur ein Item ausgewertet + + if( rAttrs.GetItemState( SDRATTR_SHADOWXDIST ) != SFX_ITEM_DONTCARE && + rAttrs.GetItemState( SDRATTR_SHADOWYDIST ) != SFX_ITEM_DONTCARE ) + { + INT32 nX = ( ( const SdrShadowXDistItem& ) rAttrs.Get( SDRATTR_SHADOWXDIST ) ).GetValue(); + INT32 nY = ( ( const SdrShadowYDistItem& ) rAttrs.Get( SDRATTR_SHADOWYDIST ) ).GetValue(); + + if( nX != 0 ) + SetMetricValue( aMtrDistance, nX < 0L ? -nX : nX, ePoolUnit ); + else + SetMetricValue( aMtrDistance, nY < 0L ? -nY : nY, ePoolUnit ); + + // Setzen des Schatten-Controls + if ( nX < 0L && nY < 0L ) aCtlPosition.SetActualRP( RP_LT ); + else if( nX == 0L && nY < 0L ) aCtlPosition.SetActualRP( RP_MT ); + else if( nX > 0L && nY < 0L ) aCtlPosition.SetActualRP( RP_RT ); + else if( nX < 0L && nY == 0L ) aCtlPosition.SetActualRP( RP_LM ); + // Mittelpunkt gibt es nicht mehr + else if( nX == 0L && nY == 0L ) aCtlPosition.SetActualRP( RP_RB ); + else if( nX > 0L && nY == 0L ) aCtlPosition.SetActualRP( RP_RM ); + else if( nX < 0L && nY > 0L ) aCtlPosition.SetActualRP( RP_LB ); + else if( nX == 0L && nY > 0L ) aCtlPosition.SetActualRP( RP_MB ); + else if( nX > 0L && nY > 0L ) aCtlPosition.SetActualRP( RP_RB ); + } + else + { + // determine default-distance + SfxItemPool* pPool = rOutAttrs.GetPool(); + SdrShadowXDistItem* pXDistItem = (SdrShadowXDistItem*)&pPool->GetDefaultItem (SDRATTR_SHADOWXDIST); + SdrShadowYDistItem* pYDistItem = (SdrShadowYDistItem*)&pPool->GetDefaultItem (SDRATTR_SHADOWYDIST); + if (pXDistItem && pYDistItem) + { + INT32 nX = pXDistItem->GetValue(); + INT32 nY = pYDistItem->GetValue(); + if( nX != 0 ) + SetMetricValue( aMtrDistance, nX < 0L ? -nX : nX, ePoolUnit ); + else + SetMetricValue( aMtrDistance, nY < 0L ? -nY : nY, ePoolUnit ); + } + + // Tristate, z.B. mehrer Objekte wurden markiert, wovon einige einen Schatten besitzen, einige nicht. + // Der anzuzeigende Text des MetricFields wird auf "" gesetzt und dient in der Methode FillItemSet + // als Erkennungszeichen daf�r, das der Distance-Wert NICHT ver�ndert wurde !!!! + aMtrDistance.SetText( String() ); + aCtlPosition.SetActualRP( RP_MM ); + } + + // SchattenFarbe: + if( rAttrs.GetItemState( SDRATTR_SHADOWCOLOR ) != SFX_ITEM_DONTCARE ) + { + aLbShadowColor.SelectEntry( ( ( const SdrShadowColorItem& ) rAttrs.Get( SDRATTR_SHADOWCOLOR ) ).GetColorValue() ); + } + else + aLbShadowColor.SetNoSelection(); + + // Transparenz + if( rAttrs.GetItemState( SDRATTR_SHADOWTRANSPARENCE ) != SFX_ITEM_DONTCARE ) + { + USHORT nTransp = ( ( const SdrShadowTransparenceItem& ) rAttrs.Get( SDRATTR_SHADOWTRANSPARENCE ) ).GetValue(); + aMtrTransparent.SetValue( nTransp ); + } + else + aMtrTransparent.SetText( String() ); + + // Werte sichern + //aCtlPosition + aMtrDistance.SaveValue(); + aLbShadowColor.SaveValue(); + aTsbShowShadow.SaveValue(); + + // #66832# This field was not saved, but used to determine changes. + // Why? Seems to be the error. + // It IS the error. + aMtrTransparent.SaveValue(); + + ClickShadowHdl_Impl( NULL ); + ModifyShadowHdl_Impl( NULL ); + } +} + +// ----------------------------------------------------------------------- + +SfxTabPage* SvxShadowTabPage::Create( Window* pWindow, + const SfxItemSet& rAttrs ) +{ + return( new SvxShadowTabPage( pWindow, rAttrs ) ); +} + +//------------------------------------------------------------------------ + +USHORT* SvxShadowTabPage::GetRanges() +{ + return( pShadowRanges ); +} + +//------------------------------------------------------------------------ + +IMPL_LINK( SvxShadowTabPage, ClickShadowHdl_Impl, void *, EMPTYARG ) +{ + if( aTsbShowShadow.GetState() == STATE_NOCHECK ) + { + aFtPosition.Disable(); + aCtlPosition.Disable(); + aFtDistance.Disable(); + aMtrDistance.Disable(); + aFtShadowColor.Disable(); + aLbShadowColor.Disable(); + aFtTransparent.Disable(); + aMtrTransparent.Disable(); + } + else + { + aFtPosition.Enable(); + aCtlPosition.Enable(); + aFtDistance.Enable(); + aMtrDistance.Enable(); + aFtShadowColor.Enable(); + aLbShadowColor.Enable(); + aFtTransparent.Enable(); + aMtrTransparent.Enable(); + } + aCtlPosition.Invalidate(); + + ModifyShadowHdl_Impl( NULL ); + + return( 0L ); +} + +//------------------------------------------------------------------------ + +IMPL_LINK( SvxShadowTabPage, ModifyShadowHdl_Impl, void *, EMPTYARG ) +{ + if( aTsbShowShadow.GetState() == STATE_CHECK ) + rXFSet.Put( XFillStyleItem( XFILL_SOLID ) ); + else + rXFSet.Put( XFillStyleItem( XFILL_NONE ) ); + + USHORT nPos = aLbShadowColor.GetSelectEntryPos(); + if( nPos != LISTBOX_ENTRY_NOTFOUND ) + { + rXFSet.Put( XFillColorItem( String(), + aLbShadowColor.GetSelectEntryColor() ) ); + } + UINT16 nVal = (UINT16)aMtrTransparent.GetValue(); + XFillTransparenceItem aItem( nVal ); + rXFSet.Put( XFillTransparenceItem( aItem ) ); + + // Schatten-Entfernung + INT32 nX = 0L, nY = 0L; + INT32 nXY = GetCoreValue( aMtrDistance, ePoolUnit ); + switch( aCtlPosition.GetActualRP() ) + { + case RP_LT: nX = nY = -nXY; break; + case RP_MT: nY = -nXY; break; + case RP_RT: nX = nXY; nY = -nXY; break; + case RP_LM: nX = -nXY; break; + case RP_RM: nX = nXY; break; + case RP_LB: nX = -nXY; nY = nXY; break; + case RP_MB: nY = nXY; break; + case RP_RB: nX = nY = nXY; break; + case RP_MM: break; + } + + aCtlXRectPreview.SetShadowPosition(Point(nX, nY)); + + aCtlXRectPreview.SetShadowAttributes(aXFillAttr.GetItemSet()); + //aCtlXRectPreview.SetFillAttr( aXFillAttr ); + aCtlXRectPreview.Invalidate(); + + return( 0L ); +} + +//------------------------------------------------------------------------ + +void SvxShadowTabPage::PointChanged( Window* pWindow, RECT_POINT eRcPt ) +{ + eRP = eRcPt; + + // Schatten neu zeichnen + ModifyShadowHdl_Impl( pWindow ); +} + +void SvxShadowTabPage::PageCreated (SfxAllItemSet aSet) //add CHINA001 +{ + SFX_ITEMSET_ARG (&aSet,pColorTabItem,SvxColorTableItem,SID_COLOR_TABLE,sal_False); + SFX_ITEMSET_ARG (&aSet,pPageTypeItem,SfxUInt16Item,SID_PAGE_TYPE,sal_False); + SFX_ITEMSET_ARG (&aSet,pDlgTypeItem,SfxUInt16Item,SID_DLG_TYPE,sal_False); + + + if (pColorTabItem) + SetColorTable(pColorTabItem->GetColorTable()); + if (pPageTypeItem) + SetPageType(pPageTypeItem->GetValue()); + if (pDlgTypeItem) + SetDlgType(pDlgTypeItem->GetValue()); + Construct(); +} |