/**************************************************************************
*                        tdefiledndiconview.h  -  description
*                          -------------------
*  begin                : Wed Nov 1 2000
*  copyright            : (C) 2000 by Björn Sahlström
*  email                : kbjorn@users.sourceforge.net
***************************************************************************/

/***************************************************************************
*                                                                         *
*   This program is free software; you can redistribute it and/or modify  *
*   it under the terms of the GNU General Public License as published by  *
*  the Free Software Foundation; either version 2 of the License, or     *
*  (at your option) any later version.                                   *
*                                                                        *
**************************************************************************/

#ifndef TDEFILEDNDICONVIEW_H
#define TDEFILEDNDICONVIEW_H

#include <tqwidget.h>
#include <tqtimer.h> 
#include <tdefileiconview.h>
#include <kurldrag.h>

/**
 * This is a fileview inherited from @ref KFileIconView.
 * It adds "drag and drop" suitable for a @ref KFileIconView
 * No special setup is needed, just connect to the @ref dropped signals
 * and the view will take care of the rest.
 * @short Drag and drop" aware @ref KFileIconView	
 * @author Björn Sahlström
*/

class KFileDnDIconView : public KFileIconView
{
	Q_OBJECT
  
public:  // Public methods

	KFileDnDIconView( TQWidget *parent = 0, const char *name = 0 );
	virtual ~KFileDnDIconView();
	
	/**
	 * Set if Drag'n drop should be enabled or not, default is enabled.
	 */
	void setDnDEnabled( bool );
	
	/**
	 * @returns wether DnD is enabled or not.
	 */
	bool isDnDEnabled() const
	{
		return m_dndEnabled;
	}
	
	/**
	 * Sets the auto open time, which means the time that will
	 * elapse before a directory is automatically opened after entered by DnD.
	 * Only need to call this if you want to change the predefined time that is 750 ms.
	 * This also calls @ref #useAutoOpenTimer so no need to call this to.
	*/
	void setAutoOpenTime( const int& time );
	
	/**
	 * Set this to true if you want the view to use it's auto open functionallity otherwhise set it to false.
	 * By default this is turned ON.
	 */
	void useAutoOpenTimer( bool on = true );
	
	/**
	 * @returns true if auto open functionallity is turned ON (default), otherwhise false
	 * @see #useAutoOpenTimer
	 * @see #setAutoOpenTime
	 */
	bool isAutoOpening() const
	{
		return m_useAutoOpenTimer;
	}

	virtual void readConfig( TDEConfig*, const TQString& group = TQString() );
	virtual void writeConfig( TDEConfig*, const TQString& group = TQString() );
signals:
	
	/**
	 * Emitted whenever an decodable item is dropped in the view.
	 * Note: The @ref TQDropEvent contains a @ref KURLDrag object.
	 */
	void dropped( TQDropEvent* );
	
protected slots:
	/**
	 * Called when the auto timer times out. Open the current folder.
	 */
	void slotOpenFolder();
	
protected:
	virtual void contentsDragEnterEvent( TQDragEnterEvent *e );
	virtual void contentsDragMoveEvent( TQDragMoveEvent *e );
	virtual void contentsDragLeaveEvent( TQDragLeaveEvent *e );
	virtual void contentsDropEvent( TQDropEvent* e );
	
	/**
	 * Creates a @ref TQDragObject containing all urls of the selected @ref KFileItem of the view,
	 * @returns the @ref TQDragObject
	 */
	virtual TQDragObject* dragObject();
	
	/**
	 *Creates the drag item and starts the drag
	 */
	virtual void startDrag();
	
	/**
	 *@returns true if we can decode the drag and support the action
	 */
	virtual bool acceptDrag( TQDropEvent* event ) const;
	
protected:
	
	TQTimer m_autoOpenTimer;
	int m_autoOpenTime;
	bool m_useAutoOpenTimer;
	TQIconViewItem* m_dropItem;
	bool m_dndEnabled;
};
#endif 
