Files
libreoffice/svx/source/dialog/textanim.cxx

797 lines
23 KiB
C++

/*************************************************************************
*
* $RCSfile: textanim.cxx,v $
*
* $Revision: 1.8 $
*
* last change: $Author: aw $ $Date: 2001-10-09 15:27:55 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library 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 for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (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.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
// include ---------------------------------------------------------------
#ifndef _SFXAPP_HXX
#include <sfx2/app.hxx>
#endif
#ifndef _SFXMODULE_HXX
#include <sfx2/module.hxx>
#endif
#ifndef _SHL_HXX //autogen
#include <tools/shl.hxx>
#endif
#pragma hdrstop
#include "dialogs.hrc"
#ifndef _SVX_TEXTANIM_CXX
#define _SVX_TEXTANIM_CXX
#endif
#include "textanim.hxx"
#include "textanim.hrc"
#include "textattr.hxx"
#include "dialmgr.hxx"
#include "dlgutil.hxx"
static USHORT pRanges[] =
{
SDRATTR_TEXT_ANIKIND,
SDRATTR_TEXT_ANIAMOUNT,
0
};
/*************************************************************************
|*
|* Konstruktor des Tab-Dialogs: Fuegt die Seiten zum Dialog hinzu
|*
\************************************************************************/
__EXPORT SvxTextTabDialog::SvxTextTabDialog( Window* pParent,
const SfxItemSet* pAttr,
const SdrView* pSdrView ) :
SfxTabDialog ( pParent, ResId( RID_SVXDLG_TEXT, DIALOG_MGR() ), pAttr ),
rOutAttrs ( *pAttr ),
pView ( pSdrView )
{
FreeResource();
AddTabPage( RID_SVXPAGE_TEXTATTR, SvxTextAttrPage::Create, 0);
AddTabPage( RID_SVXPAGE_TEXTANIMATION, SvxTextAnimationPage::Create, 0);
}
/*************************************************************************
|*
|* PageCreated()
|*
\************************************************************************/
void __EXPORT SvxTextTabDialog::PageCreated( USHORT nId, SfxTabPage &rPage )
{
switch( nId )
{
case RID_SVXPAGE_TEXTATTR:
{
( (SvxTextAttrPage&) rPage ).SetView( pView );
( (SvxTextAttrPage&) rPage ).Construct();
}
break;
case RID_SVXPAGE_TEXTANIMATION:
break;
default:
break;
}
}
/*************************************************************************
|*
|* Page
|*
\************************************************************************/
SvxTextAnimationPage::SvxTextAnimationPage( Window* pWindow, const SfxItemSet& rInAttrs ) :
SfxTabPage ( pWindow, ResId( RID_SVXPAGE_TEXTANIMATION, DIALOG_MGR() ),
rInAttrs ),
aFlEffect ( this, ResId(FL_EFFECT)),
aFtEffects ( this, ResId(FT_EFFECTS)),
aLbEffect ( this, ResId( LB_EFFECT ) ),
//aCtlEffect ( this, ResId( CTL_EFFECT ) ),
aFtDirection ( this, ResId(FT_DIRECTION) ),
aBtnUp ( this, ResId( BTN_UP ) ),
aBtnLeft ( this, ResId( BTN_LEFT ) ),
aBtnRight ( this, ResId( BTN_RIGHT ) ),
aBtnDown ( this, ResId( BTN_DOWN ) ),
aFlProperties ( this, ResId(FL_PROPERTIES)),
aTsbStartInside ( this, ResId( TSB_START_INSIDE ) ),
aTsbStopInside ( this, ResId( TSB_STOP_INSIDE ) ),
aFtCount ( this, ResId(FT_COUNT)),
aTsbEndless ( this, ResId( TSB_ENDLESS ) ),
aNumFldCount ( this, ResId( NUM_FLD_COUNT ) ),
aFtAmount ( this, ResId(FT_AMOUNT)),
aTsbPixel ( this, ResId( TSB_PIXEL ) ),
aMtrFldAmount ( this, ResId( MTR_FLD_AMOUNT ) ),
aFtDelay ( this, ResId(FT_DELAY)),
aTsbAuto ( this, ResId( TSB_AUTO ) ),
aMtrFldDelay ( this, ResId( MTR_FLD_DELAY ) ),
rOutAttrs ( rInAttrs ),
eAniKind ( SDRTEXTANI_NONE )
{
FreeResource();
eFUnit = GetModuleFieldUnit( &rInAttrs );
SfxItemPool* pPool = rOutAttrs.GetPool();
DBG_ASSERT( pPool, "Wo ist der Pool" );
eUnit = pPool->GetMetric( SDRATTR_TEXT_LEFTDIST );
Construct();
aLbEffect.SetSelectHdl(
LINK( this, SvxTextAnimationPage, SelectEffectHdl_Impl ) );
aTsbEndless.SetClickHdl(
LINK( this, SvxTextAnimationPage, ClickEndlessHdl_Impl ) );
aTsbAuto.SetClickHdl(
LINK( this, SvxTextAnimationPage, ClickAutoHdl_Impl ) );
aTsbPixel.SetClickHdl(
LINK( this, SvxTextAnimationPage, ClickPixelHdl_Impl ) );
Link aLink( LINK( this, SvxTextAnimationPage, ClickDirectionHdl_Impl ) );
aBtnUp.SetClickHdl( aLink );
aBtnLeft.SetClickHdl( aLink );
aBtnRight.SetClickHdl( aLink );
aBtnDown.SetClickHdl( aLink );
}
/*************************************************************************
|*
|* Dtor
|*
\************************************************************************/
SvxTextAnimationPage::~SvxTextAnimationPage()
{
}
/*************************************************************************
|*
|* Liest uebergebenen Item-Set
|*
\************************************************************************/
void __EXPORT SvxTextAnimationPage::Reset( const SfxItemSet& rAttrs )
{
const SfxItemPool* pPool = rAttrs.GetPool();
// Animationstyp
const SfxPoolItem* pItem = GetItem( rAttrs, SDRATTR_TEXT_ANIKIND );
if( !pItem )
pItem = &pPool->GetDefaultItem( SDRATTR_TEXT_ANIKIND );
if( pItem )
{
eAniKind = ( ( const SdrTextAniKindItem* )pItem )->GetValue();
aLbEffect.SelectEntryPos( eAniKind );
}
else
aLbEffect.SetNoSelection();
aLbEffect.SaveValue();
// Animationsrichtung
pItem = GetItem( rAttrs, SDRATTR_TEXT_ANIDIRECTION );
if( !pItem )
pItem = &pPool->GetDefaultItem( SDRATTR_TEXT_ANIDIRECTION );
if( pItem )
{
SdrTextAniDirection eValue = ( ( const SdrTextAniDirectionItem* )pItem )->GetValue();
SelectDirection( eValue );
}
else
{
aBtnUp.Check( FALSE );
aBtnLeft.Check( FALSE );
aBtnRight.Check( FALSE );
aBtnDown.Check( FALSE );
}
aBtnUp.SaveValue();
aBtnLeft.SaveValue();
aBtnRight.SaveValue();
aBtnDown.SaveValue();
// Start inside
pItem = GetItem( rAttrs, SDRATTR_TEXT_ANISTARTINSIDE );
if( !pItem )
pItem = &pPool->GetDefaultItem( SDRATTR_TEXT_ANISTARTINSIDE );
if( pItem )
{
aTsbStartInside.EnableTriState( FALSE );
BOOL bValue = ( ( const SdrTextAniStartInsideItem* )pItem )->GetValue();
if( bValue )
aTsbStartInside.SetState( STATE_CHECK );
else
aTsbStartInside.SetState( STATE_NOCHECK );
}
else
aTsbStartInside.SetState( STATE_DONTKNOW );
aTsbStartInside.SaveValue();
// Stop inside
pItem = GetItem( rAttrs, SDRATTR_TEXT_ANISTOPINSIDE );
if( !pItem )
pItem = &pPool->GetDefaultItem( SDRATTR_TEXT_ANISTOPINSIDE );
if( pItem )
{
aTsbStopInside.EnableTriState( FALSE );
BOOL bValue = ( ( const SdrTextAniStopInsideItem* )pItem )->GetValue();
if( bValue )
aTsbStopInside.SetState( STATE_CHECK );
else
aTsbStopInside.SetState( STATE_NOCHECK );
}
else
aTsbStopInside.SetState( STATE_DONTKNOW );
aTsbStopInside.SaveValue();
// Anzahl
pItem = GetItem( rAttrs, SDRATTR_TEXT_ANICOUNT );
if( !pItem )
pItem = &pPool->GetDefaultItem( SDRATTR_TEXT_ANICOUNT );
if( pItem )
{
aTsbEndless.EnableTriState( FALSE );
long nValue = (long) ( ( const SdrTextAniCountItem* )pItem )->GetValue();
aNumFldCount.SetValue( nValue );
if( nValue == 0 )
{
if( eAniKind == SDRTEXTANI_SLIDE )
{
aTsbEndless.SetState( STATE_NOCHECK );
aTsbEndless.Enable( FALSE );
}
else
{
aTsbEndless.SetState( STATE_CHECK );
aNumFldCount.SetEmptyFieldValue();
}
}
else
aTsbEndless.SetState( STATE_NOCHECK );
}
else
{
aNumFldCount.SetEmptyFieldValue();
aTsbEndless.SetState( STATE_DONTKNOW );
}
aTsbEndless.SaveValue();
aNumFldCount.SaveValue();
// Verzoegerung
pItem = GetItem( rAttrs, SDRATTR_TEXT_ANIDELAY );
if( !pItem )
pItem = &pPool->GetDefaultItem( SDRATTR_TEXT_ANIDELAY );
if( pItem )
{
aTsbAuto.EnableTriState( FALSE );
long nValue = (long) ( ( const SdrTextAniDelayItem* )pItem )->GetValue();
aMtrFldDelay.SetValue( nValue );
if( nValue == 0 )
{
aTsbAuto.SetState( STATE_CHECK );
aMtrFldDelay.SetEmptyFieldValue();
}
else
aTsbAuto.SetState( STATE_NOCHECK );
}
else
{
aMtrFldDelay.SetEmptyFieldValue();
aTsbAuto.SetState( STATE_DONTKNOW );
}
aTsbAuto.SaveValue();
aMtrFldDelay.SaveValue();
// Schrittweite
pItem = GetItem( rAttrs, SDRATTR_TEXT_ANIAMOUNT );
if( !pItem )
pItem = &pPool->GetDefaultItem( SDRATTR_TEXT_ANIAMOUNT );
if( pItem )
{
aTsbPixel.EnableTriState( FALSE );
long nValue = (long) ( ( const SdrTextAniAmountItem* )pItem )->GetValue();
if( nValue <= 0 )
{
aTsbPixel.SetState( STATE_CHECK );
nValue = -nValue;
if( nValue == 0 )
nValue++;
aMtrFldAmount.SetUnit( FUNIT_CUSTOM );
aMtrFldAmount.SetDecimalDigits( 0 );
aMtrFldAmount.SetSpinSize( 1 );
aMtrFldAmount.SetMin( 1 );
aMtrFldAmount.SetFirst( 1 );
aMtrFldAmount.SetMax( 100 );
aMtrFldAmount.SetLast( 100 );
aMtrFldAmount.SetValue( nValue );
}
else
{
aTsbPixel.SetState( STATE_NOCHECK );
aMtrFldAmount.SetUnit( eFUnit );
aMtrFldAmount.SetDecimalDigits( 2 );
aMtrFldAmount.SetSpinSize( 10 );
aMtrFldAmount.SetMin( 1 );
aMtrFldAmount.SetFirst( 1 );
aMtrFldAmount.SetMax( 10000 );
aMtrFldAmount.SetLast( 10000 );
SetMetricValue( aMtrFldAmount, nValue, eUnit );
}
}
else
{
aMtrFldAmount.Disable();
aMtrFldAmount.SetEmptyFieldValue();
aTsbPixel.SetState( STATE_DONTKNOW );
}
aTsbPixel.SaveValue();
aMtrFldAmount.SaveValue();
SelectEffectHdl_Impl( NULL );
ClickEndlessHdl_Impl( NULL );
ClickAutoHdl_Impl( NULL );
//ClickPixelHdl_Impl( NULL );
}
/*************************************************************************
|*
|* Fuellt uebergebenen Item-Set mit Dialogbox-Attributen
|*
\************************************************************************/
BOOL SvxTextAnimationPage::FillItemSet( SfxItemSet& rAttrs)
{
BOOL bModified = FALSE;
USHORT nPos;
TriState eState;
// Animationstyp
nPos = aLbEffect.GetSelectEntryPos();
if( nPos != LISTBOX_ENTRY_NOTFOUND &&
nPos != aLbEffect.GetSavedValue() )
{
rAttrs.Put( SdrTextAniKindItem( (SdrTextAniKind) nPos ) );
bModified = TRUE;
}
// Animationsrichtung
if( aBtnUp.GetSavedValue() != aBtnUp.IsChecked() ||
aBtnLeft.GetSavedValue() != aBtnLeft.IsChecked() ||
aBtnRight.GetSavedValue() != aBtnRight.IsChecked() ||
aBtnDown.GetSavedValue() != aBtnDown.IsChecked() )
{
SdrTextAniDirection eValue = (SdrTextAniDirection) GetSelectedDirection();
rAttrs.Put( SdrTextAniDirectionItem( eValue ) );
bModified = TRUE;
}
// Start inside
eState = aTsbStartInside.GetState();
if( eState != aTsbStartInside.GetSavedValue() )
{
rAttrs.Put( SdrTextAniStartInsideItem( (BOOL) STATE_CHECK == eState ) );
bModified = TRUE;
}
// Stop inside
eState = aTsbStopInside.GetState();
if( eState != aTsbStopInside.GetSavedValue() )
{
rAttrs.Put( SdrTextAniStopInsideItem( (BOOL) STATE_CHECK == eState ) );
bModified = TRUE;
}
// Anzahl
eState = aTsbEndless.GetState();
String aStr = aNumFldCount.GetText();
if( eState != aTsbEndless.GetSavedValue() ||
aStr != aNumFldCount.GetSavedValue() )
{
long nValue = 0;
if( eState == STATE_CHECK /*#89844#*/ && aTsbEndless.IsEnabled())
bModified = TRUE;
else
{
if( aStr != aNumFldCount.GetSavedValue() )
{
nValue = aNumFldCount.GetValue();
bModified = TRUE;
}
}
if( bModified )
rAttrs.Put( SdrTextAniCountItem( (UINT16) nValue ) );
}
// Verzoegerung
eState = aTsbAuto.GetState();
aStr = aMtrFldDelay.GetText();
if( eState != aTsbAuto.GetSavedValue() ||
aStr != aMtrFldDelay.GetSavedValue() )
{
long nValue = 0;
if( eState == STATE_CHECK )
bModified = TRUE;
else
{
if( aStr != aMtrFldDelay.GetSavedValue() )
{
nValue = aMtrFldDelay.GetValue();
bModified = TRUE;
}
}
if( bModified )
rAttrs.Put( SdrTextAniDelayItem( (UINT16) nValue ) );
}
// Schrittweite
eState = aTsbPixel.GetState();
aStr = aMtrFldAmount.GetText();
if( eState != aTsbPixel.GetSavedValue() ||
aStr != aMtrFldAmount.GetSavedValue() )
{
long nValue = 0;
if( eState == STATE_CHECK )
{
nValue = aMtrFldAmount.GetValue();
nValue = -nValue;
}
else
{
nValue = GetCoreValue( aMtrFldAmount, eUnit );
}
rAttrs.Put( SdrTextAniAmountItem( (INT16) nValue ) );
bModified = TRUE;
}
return( bModified );
}
/*************************************************************************
|*
|*
|*
\************************************************************************/
void SvxTextAnimationPage::Construct()
{
}
/*************************************************************************
|*
|*
|*
\************************************************************************/
USHORT* SvxTextAnimationPage::GetRanges()
{
return( pRanges );
}
/*************************************************************************
|*
|* Erzeugt die Seite
|*
\************************************************************************/
SfxTabPage* SvxTextAnimationPage::Create( Window* pWindow,
const SfxItemSet& rAttrs )
{
return( new SvxTextAnimationPage( pWindow, rAttrs ) );
}
/*************************************************************************
|*
|*
|*
\************************************************************************/
IMPL_LINK( SvxTextAnimationPage, SelectEffectHdl_Impl, void *, EMPTYARG )
{
USHORT nPos = aLbEffect.GetSelectEntryPos();
if( nPos != LISTBOX_ENTRY_NOTFOUND )
{
eAniKind = (SdrTextAniKind) nPos;
switch( eAniKind )
{
case SDRTEXTANI_NONE:
{
aFtDirection.Disable();
aBtnUp.Disable();
aBtnLeft.Disable();
aBtnRight.Disable();
aBtnDown.Disable();
aTsbStartInside.Disable();
aTsbStopInside.Disable();
aTsbEndless.Disable();
aNumFldCount.Disable();
aFtCount.Disable();
aTsbAuto.Disable();
aMtrFldDelay.Disable();
aFtDelay.Disable();
aTsbPixel.Disable();
aMtrFldAmount.Disable();
aFtAmount.Disable();
}
break;
case SDRTEXTANI_BLINK:
case SDRTEXTANI_SCROLL:
case SDRTEXTANI_ALTERNATE:
case SDRTEXTANI_SLIDE:
{
if( eAniKind == SDRTEXTANI_SLIDE )
{
aTsbStartInside.Disable();
aTsbStopInside.Disable();
aTsbEndless.Disable();
aNumFldCount.Enable();
aNumFldCount.SetValue( aNumFldCount.GetValue() );
}
else
{
aTsbStartInside.Enable();
aTsbStopInside.Enable();
aTsbEndless.Enable();
ClickEndlessHdl_Impl( NULL );
}
aFtCount.Enable();
aTsbAuto.Enable();
aFtDelay.Enable();
ClickAutoHdl_Impl( NULL );
if( eAniKind == SDRTEXTANI_BLINK )
{
aFtDirection.Disable();
aBtnUp.Disable();
aBtnLeft.Disable();
aBtnRight.Disable();
aBtnDown.Disable();
aTsbPixel.Disable();
aMtrFldAmount.Disable();
aFtAmount.Disable();
}
else
{
aFtDirection.Enable();
aBtnUp.Enable();
aBtnLeft.Enable();
aBtnRight.Enable();
aBtnDown.Enable();
aTsbPixel.Enable();
aMtrFldAmount.Enable();
aFtAmount.Enable();
}
}
break;
}
}
return( 0L );
}
/*************************************************************************
|*
|*
|*
\************************************************************************/
IMPL_LINK( SvxTextAnimationPage, ClickEndlessHdl_Impl, void *, EMPTYARG )
{
if( eAniKind != SDRTEXTANI_SLIDE )
{
TriState eState = aTsbEndless.GetState();
if( eState != STATE_NOCHECK )
{
aNumFldCount.Disable();
aNumFldCount.SetEmptyFieldValue();
}
else
{
aNumFldCount.Enable();
aNumFldCount.SetValue( aNumFldCount.GetValue() );
}
}
return( 0L );
}
/*************************************************************************
|*
|*
|*
\************************************************************************/
IMPL_LINK( SvxTextAnimationPage, ClickAutoHdl_Impl, void *, EMPTYARG )
{
TriState eState = aTsbAuto.GetState();
if( eState != STATE_NOCHECK )
{
aMtrFldDelay.Disable();
aMtrFldDelay.SetEmptyFieldValue();
}
else
{
aMtrFldDelay.Enable();
aMtrFldDelay.SetValue( aMtrFldDelay.GetValue() );
}
return( 0L );
}
/*************************************************************************
|*
|*
|*
\************************************************************************/
IMPL_LINK( SvxTextAnimationPage, ClickPixelHdl_Impl, void *, EMPTYARG )
{
TriState eState = aTsbPixel.GetState();
if( eState == STATE_CHECK )
{
long nValue = aMtrFldAmount.GetValue() / 10;
aMtrFldAmount.Enable();
aMtrFldAmount.SetUnit( FUNIT_CUSTOM );
//SetFieldUnit( aMtrFldAmount, FUNIT_CUSTOM );
aMtrFldAmount.SetDecimalDigits( 0 );
aMtrFldAmount.SetSpinSize( 1 );
aMtrFldAmount.SetMin( 1 );
aMtrFldAmount.SetFirst( 1 );
aMtrFldAmount.SetMax( 100 );
aMtrFldAmount.SetLast( 100 );
aMtrFldAmount.SetValue( nValue );
}
else if( eState == STATE_NOCHECK )
{
long nValue = aMtrFldAmount.GetValue() * 10;
aMtrFldAmount.Enable();
aMtrFldAmount.SetUnit( eFUnit );
//SetFieldUnit( aMtrFldAmount, eFUnit );
aMtrFldAmount.SetDecimalDigits( 2 );
aMtrFldAmount.SetSpinSize( 10 );
aMtrFldAmount.SetMin( 1 );
aMtrFldAmount.SetFirst( 1 );
aMtrFldAmount.SetMax( 10000 );
aMtrFldAmount.SetLast( 10000 );
aMtrFldAmount.SetValue( nValue );
}
return( 0L );
}
/*************************************************************************
|*
|*
|*
\************************************************************************/
IMPL_LINK( SvxTextAnimationPage, ClickDirectionHdl_Impl, ImageButton *, pBtn )
{
aBtnUp.Check( pBtn == &aBtnUp );
aBtnLeft.Check( pBtn == &aBtnLeft );
aBtnRight.Check( pBtn == &aBtnRight );
aBtnDown.Check( pBtn == &aBtnDown );
return( 0L );
}
/*************************************************************************
|*
|*
|*
\************************************************************************/
void SvxTextAnimationPage::SelectDirection( USHORT nValue )
{
aBtnUp.Check( nValue == SDRTEXTANI_UP );
aBtnLeft.Check( nValue == SDRTEXTANI_LEFT );
aBtnRight.Check( nValue == SDRTEXTANI_RIGHT );
aBtnDown.Check( nValue == SDRTEXTANI_DOWN );
}
/*************************************************************************
|*
|*
|*
\************************************************************************/
USHORT SvxTextAnimationPage::GetSelectedDirection()
{
USHORT nValue = 0;
if( aBtnUp.IsChecked() )
nValue = SDRTEXTANI_UP;
else if( aBtnLeft.IsChecked() )
nValue = SDRTEXTANI_LEFT;
else if( aBtnRight.IsChecked() )
nValue = SDRTEXTANI_RIGHT;
else if( aBtnDown.IsChecked() )
nValue = SDRTEXTANI_DOWN;
return( nValue );
}