/* This file is part of the KDE project
   Copyright (C) 2001, 2002, 2003 The Karbon Developers

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

   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
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public License
   along with this library; see the file COPYING.LIB.  If not, write to
   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
*/

#ifndef __VDOCUMENTDOCKER_H__
#define __VDOCUMENTDOCKER_H__

#include <tqlistview.h>
#include <tqptrdict.h>

class TQHButtonGroup;
class TQPoint;
class TQLabel;
class TQPixmap;
class TQCheckBox;

class VDocument;
class VLayer;
class KarbonView;

/*************************************************************************
 *  Document Tab                                                         *
 *************************************************************************/

class VDocumentPreview : public TQWidget
{
	Q_OBJECT
  

	public:
		VDocumentPreview( KarbonView* view, TQWidget* parent = 0 );
		~VDocumentPreview();

		void reset();

	protected:
		void paintEvent( TQPaintEvent* e );
		virtual bool eventFilter( TQObject* object, TQEvent* event );

	private:
		VDocument	*m_document;
		KarbonView	*m_view;
		KoPoint		m_firstPoint;
		KoPoint		m_lastPoint;
		bool		m_dragging;
		TQPixmap		*m_docpixmap;
}; // VDocumentPreview

class VDocumentTab : public TQWidget
{
	Q_OBJECT
  

	public:
		VDocumentTab( KarbonView* view, TQWidget* parent );
		~VDocumentTab();

	public slots:
		void updateDocumentInfo();
		void slotCommandAdded( VCommand* command );
		void slotZoomChanged( double );
		void slotViewportChanged();
		void slotCommandExecuted();

	private:
		VDocumentPreview*	m_documentPreview;
		TQLabel*				m_height;
		TQLabel*				m_width;
		TQLabel*				m_layers;
		TQLabel*				m_format;

		KarbonView*			m_view;
}; // VDocumentTab

/*************************************************************************
 *  Layers Tab                                                           *
 *************************************************************************/

class VLayerListViewItem : public TQCheckListItem
{
public:
	VLayerListViewItem( TQListView* parent, VLayer* layer, VDocument *doc, TQPtrDict<VLayerListViewItem> *map );
	virtual ~VLayerListViewItem();

	VLayer* layer() { return m_layer; }
	int pos();
	void update();
	virtual TQString key( int column, bool ascending ) const;
	virtual int compare( TQListViewItem *i, int col, bool ascending ) const;
	void setKey( uint key ) { m_key = key; }

protected:
	virtual void stateChange( bool on );

private:
	VLayer		*m_layer;
	VDocument	*m_document;
	uint		 m_key;
	TQPtrDict<VLayerListViewItem> *m_map;
}; // VLayerListViewItem

class VObjectListViewItem : public TQListViewItem
{
public:
	VObjectListViewItem( TQListViewItem* parent, VObject* object, VDocument *doc, uint key, TQPtrDict<VObjectListViewItem> *map );
	virtual ~VObjectListViewItem();

	VObject* object() { return m_object; }
	void update();
	virtual TQString key( int column, bool ascending ) const;
	virtual int compare( TQListViewItem *i, int col, bool ascending ) const;
	void setKey( uint key ) { m_key = key; }
private:
	VObject		*m_object;
	VDocument	*m_document;
	uint		 m_key;
	TQPtrDict<VObjectListViewItem> *m_map;
};

class VLayersTab : public TQWidget
{
Q_OBJECT
  

public:
	VLayersTab( KarbonView* view, TQWidget* parent = 0 );
	~VLayersTab();

public slots:
	void updatePreviews();
	void updateLayers();

	void itemClicked( TQListViewItem* item, const TQPoint&, int col );
	void selectionChangedFromList();
	void selectionChangedFromTool();
	void renameItem( TQListViewItem* item, const TQPoint&, int col );
	void addLayer();
	void raiseItem();
	void lowerItem();
	void deleteItem();
	void slotCommandExecuted( VCommand* command );

private slots:
	void slotButtonClicked( int ID );
	void removeDeletedObjectsFromList();
	void updateChildItems( TQListViewItem *item );
	void toggleState( VObject *obj, int col );

protected:
	VLayerListViewItem* listItem( int pos );
	void updateObjects( VObject *object, TQListViewItem *item );
	void resetSelection();
	void selectActiveLayer();

private:
	TQListView						*m_layersListView;
	TQHButtonGroup					*m_buttonGroup;
	KarbonView						*m_view;
	VDocument						*m_document;
	TQPtrDict<VLayerListViewItem>	m_layers;
	TQPtrDict<VObjectListViewItem>	m_objects;
}; // VLayersTab

/*************************************************************************
 *  History Tab                                                          *
 *************************************************************************/

class VHistoryItem;
 
class VHistoryGroupItem : public TQListViewItem
{
	public:
		VHistoryGroupItem( VHistoryItem* item, TQListView* parent, TQListViewItem* after );
		~VHistoryGroupItem();

		void paintCell( TQPainter* p, const TQColorGroup& cg, int column, int width, int align );
		void paintFocus( TQPainter*, const TQColorGroup&, const TQRect& );

		virtual TQString key( int, bool ) const { return m_key; }
		virtual int rtti() const { return 1001; }

	private:
		TQString	m_key;
}; // VHistoryGroupItem
 
class VHistoryItem : public TQListViewItem
{
	public:
		VHistoryItem( VCommand* command, TQListView* parent, TQListViewItem* after );
		VHistoryItem( VCommand* command, VHistoryGroupItem* parent, TQListViewItem* after );
		~VHistoryItem();

		VCommand* command() { return m_command; }

		void paintCell( TQPainter* p, const TQColorGroup& cg, int column, int width, int align );
		void paintFocus( TQPainter*, const TQColorGroup&, const TQRect& );

		virtual TQString key( int, bool ) const { return m_key; }
		virtual int rtti() const { return 1002; }

	private:
		void init();

		TQString     m_key;
		VCommand*   m_command;
}; // VHistoryItem

class VHistoryTab : public TQWidget
{
	Q_OBJECT
  

	public:
		VHistoryTab( KarbonPart* part, TQWidget* parent );
		~VHistoryTab();

		bool groupingEnabled();

	public slots:
		void historyCleared();
		void commandExecuted( VCommand* command );
		void slotCommandAdded( VCommand* command );
		void removeFirstCommand();
		void removeLastCommand();

		void commandClicked( int button, TQListViewItem* item, const TQPoint& point, int col );
		void groupingChanged( int );

	signals:
		void undoCommand( VCommand* command );
		void redoCommand( VCommand* command );
		void undoCommandsTo( VCommand* command );
		void redoCommandsTo( VCommand* command );

	private:
		TQListView*      m_history;
		TQListViewItem*  m_lastCommand;
		TQCheckBox*      m_groupCommands;
		long            m_lastCommandIndex;

		KarbonPart*     m_part;
}; // VHistoryTab

#endif

