/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



#ifndef _SD_CUSTOMANIMATIONPANE_HXX
#define _SD_CUSTOMANIMATIONPANE_HXX

#include <com/sun/star/drawing/XDrawView.hpp>
#include <com/sun/star/frame/XModel.hpp>
#include <vcl/dialog.hxx>
#include "CustomAnimationPreset.hxx"
#include "CustomAnimationList.hxx"
#include "CustomAnimationCreateDialog.hxx"

#include "motionpathtag.hxx"
#include "misc/scopelock.hxx"

#include <vector>

class PushButton;
class FixedLine;
class FixedText;
class ListBox;
class ComboBox;
class CheckBox;
class SdDrawDocument;

namespace com { namespace sun { namespace star { namespace animations {
	class XAnimationNode;
} } } }

namespace sd { namespace tools {
class EventMultiplexerEvent;
} }

namespace sd {

class PropertyControl;
class STLPropertySet;
class ViewShellBase;

typedef std::vector< rtl::Reference< MotionPathTag > > MotionPathTagVector;

// --------------------------------------------------------------------

class CustomAnimationPane : public Control, public ICustomAnimationListController
{
	friend class MotionPathTag;
public:
	CustomAnimationPane( ::Window* pParent, ViewShellBase& rBase, const Size& rMinSize );
	virtual ~CustomAnimationPane();

	// callbacks
	void onSelectionChanged();
	void onChangeCurrentPage();
	void onChange( bool bCreate );
	void onRemove();
	void onChangeStart();
	void onChangeStart( sal_Int16 nNodeType );
	void onChangeProperty();
	void onChangeSpeed();

	// methods
	void preview( const ::com::sun::star::uno::Reference< ::com::sun::star::animations::XAnimationNode >& xAnimationNode );
	void remove( CustomAnimationEffectPtr& pEffect );

	// Control
	virtual void Resize();
	virtual void StateChanged( StateChangedType nStateChange );
	virtual void KeyInput( const KeyEvent& rKEvt );

	// ICustomAnimationListController
	virtual void onSelect();
	virtual void onDoubleClick();
	virtual void onContextMenu( sal_uInt16 nSelectedPopupEntry );

    // Window
    virtual void DataChanged (const DataChangedEvent& rEvent);
    
	void addUndo();

	void updatePathFromMotionPathTag( const rtl::Reference< MotionPathTag >& xTag );

private:
	void addListener();
	void removeListener();
	void updateLayout();
	void updateControls();
	void updateMotionPathTags();
	void markShapesFromSelectedEffects();

	void showOptions( sal_uInt16 nPage = 0 );
	void moveSelection( bool bUp );
	void onPreview( bool bForcePreview );

	void createPath( PathKind eKind, std::vector< ::com::sun::star::uno::Any >& rTargets, double fDuration );

	STLPropertySet* createSelectionSet();
	void changeSelection( STLPropertySet* pResultSet, STLPropertySet* pOldSet );

	::com::sun::star::uno::Any getProperty1Value( sal_Int32 nType, CustomAnimationEffectPtr pEffect );
	bool setProperty1Value( sal_Int32 nType, CustomAnimationEffectPtr pEffect, const ::com::sun::star::uno::Any& rValue );
    void UpdateLook (void);

	DECL_LINK( implControlHdl, Control* );
	DECL_LINK( implPropertyHdl, Control* );
    DECL_LINK(EventMultiplexerListener, tools::EventMultiplexerEvent*);
    DECL_LINK(lateInitCallback, Timer*);

private:
	ViewShellBase& mrBase;

	const CustomAnimationPresets* mpCustomAnimationPresets;

	FixedLine*	mpFLModify;
	PushButton*	mpPBAddEffect;
	PushButton* mpPBChangeEffect;
	PushButton*	mpPBRemoveEffect;
	FixedLine*	mpFLEffect;
	FixedText*	mpFTStart;
	ListBox*	mpLBStart;
	FixedText*	mpFTProperty;
	PropertyControl*	mpLBProperty;
	PushButton*	mpPBPropertyMore;
	FixedText*	mpFTSpeed;
	ComboBox*	mpCBSpeed;
	CustomAnimationList*	mpCustomAnimationList;
	FixedText*	mpFTChangeOrder;
	PushButton*	mpPBMoveUp;
	PushButton* mpPBMoveDown;
	FixedLine*	mpFLSeperator1;
	PushButton*	mpPBPlay;
	PushButton* mpPBSlideShow;
	FixedLine*	mpFLSeperator2;
	CheckBox*	mpCBAutoPreview;

	String		maStrModify;
	String		maStrProperty;

	sal_Int32	mnPropertyType;

	Size		maMinSize;

	EffectSequence maListSelection;
	::com::sun::star::uno::Any maViewSelection;

	MainSequencePtr	mpMainSequence;

	::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage > mxCurrentPage;
	::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawView > mxView;
	::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel > mxModel;

    /** The mpCustomAnimationPresets is initialized either on demand or
        after a short time after the construction of a new object of this
        class.  This timer is responsible for the later.
    */
    Timer maLateInitTimer;

    /** This method initializes the mpCustomAnimationPresets on demand and
        returns a reference to the list.
    */
    const CustomAnimationPresets& getPresets (void);

	MotionPathTagVector maMotionPathTags;

	ScopeLock maSelectionLock;
};

}

#endif // _SD_CUSTOMANIMATIONPANE_HXX
