office-gobmx/sd/source/ui/dlg/diactrl.cxx
2001-11-13 15:05:47 +00:00

765 lines
22 KiB
C++

/*************************************************************************
*
* $RCSfile: diactrl.cxx,v $
*
* $Revision: 1.5 $
*
* last change: $Author: ka $ $Date: 2001-11-13 16:05:47 $
*
* 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): _______________________________________
*
*
************************************************************************/
#ifndef _COM_SUN_STAR_PRESENTATION_FADEEFFECT_HPP_
#include <com/sun/star/presentation/FadeEffect.hpp>
#endif
#include <svx/dialogs.hrc>
#include "sdattr.hxx"
#include "strings.hrc"
#define _SD_DIACTRL_CXX
#include "diactrl.hxx"
#include "sdresid.hxx"
#include "app.hrc"
#include "res_bmp.hrc"
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SFXVIEWFRM_HXX
#include <sfx2/viewfrm.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
using namespace ::com::sun::star;
SFX_IMPL_TOOLBOX_CONTROL( SdTbxCtlDiaEffect, DiaEffectItem )
SFX_IMPL_TOOLBOX_CONTROL( SdTbxCtlDiaPages, SfxUInt16Item )
/*************************************************************************
|*
|* Konstruktor fuer DiaEffectControl
|*
\************************************************************************/
DiaEffectControl::DiaEffectControl( Window* pParent, SfxBindings& rBdx, WinBits nStyle ) :
Window ( pParent, nStyle ),
rBindings ( rBdx ),
aFtDescr ( this, 0 ),
aLbEffect ( this, WinBits( WB_BORDER | WB_DROPDOWN ) )
{
// Child-Windows (Controls) setzen
String aStr( SdResId( STR_EFFECT ) );
long nTextHeight = this->GetTextHeight();
Size aSize( this->GetTextWidth( aStr )+6, nTextHeight+2 );
//Size aSize( LogicToPixel( pParent->GetTextSize( aStr ), MAP_APPFONT ) );
aFtDescr.SetPosPixel( Point( 0, 4 ) );
aFtDescr.SetSizePixel( aSize ); //( 40, 14 ) );
aFtDescr.SetText( aStr );
aFtDescr.Show();
String aXStr; aXStr += sal_Unicode('X');
Size aXSize( this->GetTextWidth( aXStr ), nTextHeight );
aLbEffect.SetPosPixel( Point( aSize.Width(), 0 ) );
aLbEffect.SetSizePixel( Size( aXSize.Width() * 21, aXSize.Height() * 10 ) ); // 155/180
aLbEffect.Fill();
aLbEffect.SelectEffect( presentation::FadeEffect_NONE );
aLbEffect.SetHelpId( SID_DIA_EFFECT );
aLbEffect.Show();
Size aDescSize = aFtDescr.GetSizePixel();
Size aAttrSize = aLbEffect.GetSizePixel();
Point aAttrPnt = aLbEffect.GetPosPixel();
SetSizePixel( Size( aAttrPnt.X() + aAttrSize.Width(),
Max( aAttrSize.Height(), aDescSize.Height() ) ) );
//SetSizePixel( Size( 210, 20 ) );
Show();
aLbEffect.SetSelectHdl( LINK( this, DiaEffectControl, SelectDiaEffectHdl ) );
SelectDiaEffectHdl( NULL );
}
//------------------------------------------------------------------------
DiaEffectControl::~DiaEffectControl()
{
}
//------------------------------------------------------------------------
IMPL_LINK( DiaEffectControl, SelectDiaEffectHdl, void *, p )
{
DiaEffectItem aDiaEffectItem( aLbEffect.GetSelectedEffect() );
if( p )
rBindings.GetDispatcher()->Execute( SID_DIA, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aDiaEffectItem, (void*) NULL, 0L );
return( 0L );
}
SFX_IMPL_TOOLBOX_CONTROL( SdTbxCtlDiaSpeed, DiaSpeedItem )
/*************************************************************************
|*
|* Konstruktor fuer DiaSpeedControl
|*
\************************************************************************/
DiaSpeedControl::DiaSpeedControl( Window* pParent, SfxBindings& rBdx, WinBits nStyle ) :
Window ( pParent, nStyle ),
rBindings ( rBdx ),
aLbSpeed ( this, WinBits( WB_BORDER | WB_DROPDOWN ) )
{
String aStrSlow( SdResId( STR_SLOW ) );
String aStrMed( SdResId( STR_MEDIUM ) );
String aStrFast( SdResId( STR_FAST ) );
Size aSize( this->GetTextWidth( aStrSlow ), this->GetTextHeight() );
if( this->GetTextWidth( aStrMed ) > aSize.Width() )
aSize.Width() = this->GetTextWidth( aStrMed );
if( this->GetTextWidth( aStrFast ) > aSize.Width() )
aSize.Width() = this->GetTextWidth( aStrFast );
aSize.Width() += 30; // Wegen DropDown-Button
aSize.Height() *= 5; // Anzahl Eintraege + ListBox (2)
// Child-Windows (Controls) setzen
//aLbSpeed.SetPosPixel( Point( 0, 0 ) );
aLbSpeed.SetSizePixel( aSize ); //( 90, 60 ) );
aLbSpeed.InsertEntry( aStrSlow );
aLbSpeed.InsertEntry( aStrMed );
aLbSpeed.InsertEntry( aStrFast );
aLbSpeed.SelectEntryPos( 0 );
aLbSpeed.SetHelpId( SID_DIA_SPEED );
aLbSpeed.Show();
//SetSizePixel( Size( 95, 20 ) );
SetSizePixel( aLbSpeed.GetSizePixel() );
Show();
aLbSpeed.SetSelectHdl( LINK( this, DiaSpeedControl, SelectDiaSpeedHdl ) );
SelectDiaSpeedHdl( NULL );
}
//------------------------------------------------------------------------
DiaSpeedControl::~DiaSpeedControl()
{
}
//------------------------------------------------------------------------
IMPL_LINK( DiaSpeedControl, SelectDiaSpeedHdl, void *, p )
{
FadeSpeed eFS = (FadeSpeed) aLbSpeed.GetSelectEntryPos();
DiaSpeedItem aDiaSpeedItem( eFS );
if( p )
rBindings.GetDispatcher()->Execute(
SID_DIA, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aDiaSpeedItem, (void*) NULL, 0L );
return( 0L );
}
SFX_IMPL_TOOLBOX_CONTROL( SdTbxCtlDiaAuto, DiaAutoItem )
/*************************************************************************
|*
|* Konstruktor fuer DiaAutoControl
|*
\************************************************************************/
DiaAutoControl::DiaAutoControl( Window* pParent, SfxBindings& rBdx, WinBits nStyle ) :
Window ( pParent, nStyle ),
rBindings ( rBdx ),
aFtDescr ( this, 0 ),
aLbAuto ( this, WinBits( WB_BORDER | WB_DROPDOWN ) )
{
// Child-Windows (Controls) setzen
String aStr( SdResId( STR_CHANGE ) );
Size aSize( this->GetTextWidth( aStr )+6, this->GetTextHeight()+2 );
// Child-Windows (Controls) setzen
aFtDescr.SetPosPixel( Point( 0, 4 ) );
aFtDescr.SetSizePixel( aSize ); //( 55, 14 ) );
aFtDescr.SetText( aStr );
aFtDescr.Show();
// Listbox
String aStrMan( SdResId( STR_MANUEL ) );
String aStrSemi( SdResId( STR_SEMIAUTO ) );
String aStrAuto( SdResId( STR_AUTO ) );
Size aLbSize( this->GetTextWidth( aStrMan ), this->GetTextHeight() );
if( this->GetTextWidth( aStrAuto ) > aSize.Width() )
aLbSize.Width() = this->GetTextWidth( aStrAuto );
aLbSize.Width() += 30; // Wegen DropDown-Button
aLbSize.Height() *= 5; // Anzahl Eintraege + ListBox (2)
aLbAuto.SetPosPixel( Point( aSize.Width(), 0 ) );
aLbAuto.SetSizePixel( aLbSize ); //( 105, 52 ) );
aLbAuto.InsertEntry( aStrMan );
aLbAuto.InsertEntry( aStrSemi );
aLbAuto.InsertEntry( aStrAuto );
aLbAuto.SelectEntryPos( 0 );
aLbAuto.SetHelpId( SID_DIA_AUTO );
aLbAuto.Show();
//SetSizePixel( Size( 175, 20 ) );
Size aDescSize = aFtDescr.GetSizePixel();
Size aAttrSize = aLbAuto.GetSizePixel();
Point aAttrPnt = aLbAuto.GetPosPixel();
SetSizePixel( Size( aAttrPnt.X() + aAttrSize.Width(),
Max( aAttrSize.Height(), aDescSize.Height() ) ) );
Show();
aLbAuto.SetSelectHdl( LINK( this, DiaAutoControl, SelectDiaAutoHdl ) );
SelectDiaAutoHdl( NULL );
}
//------------------------------------------------------------------------
DiaAutoControl::~DiaAutoControl()
{
}
//------------------------------------------------------------------------
IMPL_LINK( DiaAutoControl, SelectDiaAutoHdl, void *, p )
{
PresChange eChange;
const ULONG nPos = aLbAuto.GetSelectEntryPos();
if( !nPos )
eChange = PRESCHANGE_MANUAL;
else if( 1 == nPos )
eChange = PRESCHANGE_SEMIAUTO;
else
eChange = PRESCHANGE_AUTO;
DiaAutoItem aDiaAutoItem( eChange );
/*
if( bAuto )
{
// Time-Control disablen
}
else
{
// Time-Control enablen; ModifyHdl rufen
}
*/
if( p )
rBindings.GetDispatcher()->Execute(
SID_DIA, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aDiaAutoItem, (void*) NULL, 0L );
return( 0L );
}
SFX_IMPL_TOOLBOX_CONTROL( SdTbxCtlDiaTime, DiaTimeItem )
/*************************************************************************
|*
|* Konstruktor fuer DiaTimeControl
|*
\************************************************************************/
DiaTimeControl::DiaTimeControl( Window* pParent, SfxBindings& rBdx, WinBits nStyle ) :
TimeField ( pParent, nStyle ),
rBindings ( rBdx )
{
SetModifyHdl( LINK( this, DiaTimeControl, ModifyDiaTimeHdl ) );
SetGetFocusHdl( LINK( this, DiaTimeControl, GetFocusHdl ) );
UniString aStrTmp( RTL_CONSTASCII_STRINGPARAM( "00:00:00" ), RTL_TEXTENCODING_ASCII_US );
Size aSize( GetTextWidth( aStrTmp ) +30, GetTextHeight() +6 );
SetSizePixel( aSize ); //( 75, 20 ) );
SetFormat( TIMEF_SEC );
SetMin( 0L );
SetMax( Time( 12, 00, 00 ) );
SetDuration( TRUE );
Show();
ModifyDiaTimeHdl( NULL );
}
/*************************************************************************
|*
|* 2. Konstruktor fuer DiaTimeControl
|*
\************************************************************************/
DiaTimeControl::DiaTimeControl( Window* pParent, SfxBindings& rBdx, ResId nRId ) :
TimeField ( pParent, nRId ),
rBindings ( rBdx )
{
SetGetFocusHdl( LINK( this, DiaTimeControl, GetFocusHdl ) );
}
//------------------------------------------------------------------------
DiaTimeControl::~DiaTimeControl()
{
}
//------------------------------------------------------------------------
IMPL_LINK( DiaTimeControl, ModifyDiaTimeHdl, void *, p )
{
Time aTime = GetTime();
ULONG lTime = aTime.GetSec() + aTime.GetMin() * 60 + aTime.GetHour() * 3600;
DiaTimeItem aDiaTimeItem( lTime );
if( p )
rBindings.GetDispatcher()->Execute(
SID_DIA, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aDiaTimeItem, (void*) NULL, 0L );
return( 0L );
}
//------------------------------------------------------------------------
IMPL_LINK_INLINE_START( DiaTimeControl, GetFocusHdl, void *, p )
{
SetSelection( GetText().Len() );
return( 0L );
}
IMPL_LINK_INLINE_END( DiaTimeControl, GetFocusHdl, void *, p )
//------------------------------------------------------------------------
void DiaTimeControl::Down()
{
if( IsEmptyTime() )
{
SetTime( Time( 0, 0, 0 ) );
Reformat();
SetSelection( GetText().Len() );
Modify();
}
else
TimeField::Down();
}
//------------------------------------------------------------------------
void DiaTimeControl::Up()
{
if( IsEmptyTime() )
{
SetTime( Time( 0, 0, 0 ) );
Reformat();
SetSelection( GetText().Len() );
}
TimeField::Up();
}
//========================================================================
// SdPagesField
//========================================================================
SdPagesField::SdPagesField( Window* pParent, SfxBindings& rBdx, WinBits nBits ) :
SvxMetricField ( pParent, rBdx, nBits ),
rBindings ( rBdx )
{
String aStr( SdResId( STR_SLIDE_PLURAL ) );
SetCustomUnitText( aStr );
// Groesse setzen
aStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "XXX" ) );
Size aSize( GetTextWidth( aStr )+20, GetTextHeight()+6 );
SetSizePixel( aSize );
// Parameter des MetricFields setzen
SetUnit( FUNIT_CUSTOM );
SetMin( 1 );
SetFirst( 1 );
SetMax( 15 );
SetLast( 15 );
SetSpinSize( 1 );
SetDecimalDigits( 0 );
Show();
}
// -----------------------------------------------------------------------
SdPagesField::~SdPagesField()
{
}
// -----------------------------------------------------------------------
void SdPagesField::Update( const SfxUInt16Item* pItem )
{
if( pItem )
{
long nValue = (long) pItem->GetValue();
SetValue( nValue );
if( nValue == 1 )
SetCustomUnitText( String( SdResId( STR_SLIDE_SINGULAR ) ) );
else
SetCustomUnitText( String( SdResId( STR_SLIDE_PLURAL ) ) );
}
else
SetText( String() );
}
// -----------------------------------------------------------------------
void SdPagesField::Modify()
{
SfxUInt16Item aItem( SID_PAGES_PER_ROW, (UINT16) GetValue() );
rBindings.GetDispatcher()->Execute(
SID_PAGES_PER_ROW, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD, &aItem, 0L, 0L );
}
/*************************************************************************
|*
|* Klassen fuer DiaAttribute
|*
\************************************************************************/
SdTbxCtlDiaEffect::SdTbxCtlDiaEffect( USHORT nId, ToolBox& rTbx,
SfxBindings& rBindings ) :
SfxToolBoxControl( nId, rTbx, rBindings )
{
}
/*************************************************************************/
void SdTbxCtlDiaEffect::StateChanged( USHORT nSId,
SfxItemState eState, const SfxPoolItem* pState )
{
// FadeEffecListBox vom Window (DiaEffectControl) holen
FadeEffectLB* pFadeEffectLB = (FadeEffectLB*) &( ( (DiaEffectControl*)
GetToolBox().GetItemWindow( SID_DIA_EFFECT ) )->aLbEffect );
if ( pFadeEffectLB )
{
if( pState )
{
pFadeEffectLB->Enable();
if ( IsInvalidItem( pState ) )
{
pFadeEffectLB->SetNoSelection();
}
else
{
presentation::FadeEffect eFE = (presentation::FadeEffect) ( (const DiaEffectItem*) pState )->GetValue();
pFadeEffectLB->SelectEffect( eFE );
}
}
else
{
pFadeEffectLB->Disable();
pFadeEffectLB->SetNoSelection();
}
}
}
/*************************************************************************/
Window* SdTbxCtlDiaEffect::CreateItemWindow( Window *pParent )
{
if( GetId() == SID_DIA_EFFECT )
{
return( new DiaEffectControl( pParent, GetBindings() ) );
}
return( NULL );
}
/*************************************************************************/
/*************************************************************************/
SdTbxCtlDiaSpeed::SdTbxCtlDiaSpeed( USHORT nId, ToolBox& rTbx, SfxBindings& rBindings ) :
SfxToolBoxControl( nId, rTbx, rBindings )
{
}
/*************************************************************************/
void SdTbxCtlDiaSpeed::StateChanged( USHORT nSId,
SfxItemState eState, const SfxPoolItem* pState )
{
// ListBox vom Window (DiaSpeedControl) holen
ListBox* pLB = (ListBox*) &( ( (DiaSpeedControl*)
GetToolBox().GetItemWindow( SID_DIA_SPEED ) )->aLbSpeed );
if ( pLB )
{
if( pState )
{
pLB->Enable();
if ( IsInvalidItem( pState ) )
{
pLB->SetNoSelection();
}
else
{
FadeSpeed eFS = (FadeSpeed) ( (const DiaSpeedItem*) pState )->GetValue();
pLB->SelectEntryPos( eFS );
}
}
else
{
pLB->Disable();
pLB->SetNoSelection();
}
}
}
/*************************************************************************/
Window* SdTbxCtlDiaSpeed::CreateItemWindow( Window *pParent )
{
if( GetId() == SID_DIA_SPEED )
{
return( new DiaSpeedControl( pParent, GetBindings() ) );
}
return( NULL );
}
/*************************************************************************/
/*************************************************************************/
SdTbxCtlDiaAuto::SdTbxCtlDiaAuto( USHORT nId, ToolBox& rTbx, SfxBindings& rBindings ) :
SfxToolBoxControl( nId, rTbx, rBindings )
{
}
/*************************************************************************/
void SdTbxCtlDiaAuto::StateChanged( USHORT nSId,
SfxItemState eState, const SfxPoolItem* pState )
{
// ListBox vom Window (DiaAutoControl) holen
ListBox* pLB = (ListBox*) &( ( (DiaAutoControl*)
GetToolBox().GetItemWindow( SID_DIA_AUTO ) )->aLbAuto );
if ( pLB )
{
if( pState )
{
pLB->Enable();
if ( IsInvalidItem( pState ) )
{
pLB->SetNoSelection();
}
else
{
const PresChange eChange = ( (const DiaAutoItem*) pState )->GetValue();
if( eChange == PRESCHANGE_MANUAL )
pLB->SelectEntryPos( 0 ); // Manuell
else if( eChange == PRESCHANGE_SEMIAUTO )
pLB->SelectEntryPos( 1 ); // Halbautomatisch
else
pLB->SelectEntryPos( 2 ); // Automatisch
}
}
else
{
pLB->Disable();
pLB->SetNoSelection();
}
}
}
/*************************************************************************/
Window* SdTbxCtlDiaAuto::CreateItemWindow( Window *pParent )
{
if( GetId() == SID_DIA_AUTO )
{
return( new DiaAutoControl( pParent, GetBindings() ) );
}
return( NULL );
}
/*************************************************************************/
/*************************************************************************/
SdTbxCtlDiaTime::SdTbxCtlDiaTime( USHORT nId, ToolBox& rTbx, SfxBindings& rBindings ) :
SfxToolBoxControl( nId, rTbx, rBindings )
{
}
/*************************************************************************/
void SdTbxCtlDiaTime::StateChanged( USHORT nSId,
SfxItemState eState, const SfxPoolItem* pState )
{
DiaTimeControl* pDTC = (DiaTimeControl*) GetToolBox().GetItemWindow( SID_DIA_TIME );
if ( pDTC )
{
if( pState )
{
pDTC->Enable();
if ( IsInvalidItem( pState ) )
{
pDTC->SetEmptyTime();
}
else
{
Selection* pSelection = NULL;
if( pDTC->HasChildPathFocus() )
pSelection = new Selection( pDTC->GetSelection() );
ULONG lTime = ( ( const DiaTimeItem* ) pState )->GetValue();
USHORT nHour = (USHORT) ( lTime / 3600 );
USHORT nMin = (USHORT) ( ( lTime % 3600 ) / 60 );
USHORT nSec = (USHORT) ( ( lTime % 3600 ) % 60 );
Time aTime( nHour, nMin, nSec);
pDTC->SetTime( aTime );
if( pSelection )
{
pDTC->SetSelection( *pSelection );
delete pSelection;
}
}
}
else
{
pDTC->Disable();
pDTC->SetEmptyTime();
}
}
}
/*************************************************************************/
Window* SdTbxCtlDiaTime::CreateItemWindow( Window *pParent )
{
if( GetId() == SID_DIA_TIME )
{
return( new DiaTimeControl( pParent, GetBindings(),
WinBits( WB_BORDER | WB_SPIN | WB_REPEAT ) ) );
}
return( NULL );
}
/*************************************************************************
|*
|* SdTbxCtlDiaPages
|*
\************************************************************************/
SdTbxCtlDiaPages::SdTbxCtlDiaPages( USHORT nId, ToolBox& rTbx, SfxBindings& rBind ) :
SfxToolBoxControl( nId, rTbx, rBind ),
rBindings( rBind )
{
}
//========================================================================
SdTbxCtlDiaPages::~SdTbxCtlDiaPages()
{
}
//========================================================================
void SdTbxCtlDiaPages::StateChanged( USHORT nSID,
SfxItemState eState, const SfxPoolItem* pState )
{
SdPagesField* pFld = (SdPagesField*) GetToolBox().GetItemWindow( GetId() );
DBG_ASSERT( pFld, "Window not found" );
if ( eState == SFX_ITEM_DISABLED )
{
pFld->Disable();
pFld->SetText( String() );
}
else
{
pFld->Enable();
if ( eState == SFX_ITEM_AVAILABLE )
{
DBG_ASSERT( pState->ISA(SfxUInt16Item), "falscher ItemType" )
pFld->Update( (const SfxUInt16Item*) pState );
}
else
pFld->Update( NULL );
}
}
//========================================================================
Window* SdTbxCtlDiaPages::CreateItemWindow( Window* pParent )
{
return new SdPagesField( pParent, rBindings );
}