/*
   Copyright (C) 2003-2005 George Staikos <staikos@kde.org>
   Copyright (C) 2005 Isaac Clerencia <isaac@warp.es>

   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.

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

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

#ifndef ALLYOURBASE_H
#define ALLYOURBASE_H

#include <kiconview.h>
#include <tdelistview.h>
#include <tdewallet.h>
#include <kiconloader.h>
#include <kicontheme.h>

#define TDEWALLETENTRYMAGIC ((TQ_UINT32) 0x6B776C65)
#define TDEWALLETFOLDERMAGIC ((TQ_UINT32) 0x6B776C66)

enum TDEWalletListItemClasses {
	TDEWalletFolderItemClass = 1000,
	TDEWalletContainerItemClass,
	TDEWalletEntryItemClass,
	TDEWalletUnknownClass = 2000
};

class TDEWalletEntryItem : public TDEListViewItem {
	public:
		TDEWalletEntryItem(TDEWallet::Wallet *w, TQListViewItem* parent, const TQString& ename);
		virtual ~TDEWalletEntryItem();

		const TQString& oldName() { return _oldName; }
		TQString currentName() { return text(0); }

		void clearOldName() { _oldName = text(0); }
		virtual int rtti() const;

	public:
		TDEWallet::Wallet *_wallet;

	private:
		TQString _oldName;
};

class TDEWalletContainerItem : public TDEListViewItem {
	public:
		TDEWalletContainerItem(TQListViewItem* parent, const TQString& name,
		    TDEWallet::Wallet::EntryType type);
		virtual ~TDEWalletContainerItem();

	public:
		virtual int rtti() const;
		TDEWallet::Wallet::EntryType type();
		bool contains(const TQString& itemKey);
		TQListViewItem* getItem(const TQString& itemKey);

	private:
		TDEWallet::Wallet::EntryType _type;
};

class TDEWalletFolderItem : public TDEListViewItem {
	public:
		TDEWalletFolderItem(TDEWallet::Wallet *w, TQListView* parent, 
			const TQString& name, int entries);
		virtual ~TDEWalletFolderItem();

		virtual bool acceptDrop(const TQMimeSource *mime) const;
		virtual int rtti() const;

		TQString name() const;
		void refresh();
		TDEWalletContainerItem* getContainer(TDEWallet::Wallet::EntryType type);
		TQPixmap getFolderIcon(TDEIcon::Group group);
		bool contains(const TQString& itemKey);
		TQListViewItem* getItem(const TQString& itemKey);

	public:
		TDEWallet::Wallet *_wallet;

	private:
		TQString _name;
		int _entries;
};

class TDEWalletEntryList : public TDEListView {
	TQ_OBJECT
  
	public:
		TDEWalletEntryList(TQWidget *parent, const char *name = 0L);
		virtual ~TDEWalletEntryList();

		bool existsFolder(const TQString& name);
		TDEWalletFolderItem* getFolder(const TQString& name);
		void contentsDropEvent(TQDropEvent *e);
		void contentsDragEnterEvent(TQDragEnterEvent *e);
		void setWallet(TDEWallet::Wallet *w);

	protected:
		void itemDropped(TQDropEvent *e, TQListViewItem *item);
		virtual TQDragObject *dragObject();
		virtual bool acceptDrag (TQDropEvent* event) const;

	private:
		static TDEWalletFolderItem *getItemFolder(TQListViewItem *item);
	
	public:
		TDEWallet::Wallet *_wallet;
};

class TDEWalletItem : public TQIconViewItem {
	public:
		TDEWalletItem(TQIconView *parent, const TQString& walletName);
		virtual ~TDEWalletItem();

		virtual bool acceptDrop(const TQMimeSource *mime) const;

	protected:
		virtual void dropped(TQDropEvent *e, const TQValueList<TQIconDragItem>& lst); 
};


class TDEWalletIconView : public TDEIconView {
	TQ_OBJECT
  
	public:
		TDEWalletIconView(TQWidget *parent, const char *name = 0L);
		virtual ~TDEWalletIconView();

	protected slots:
		virtual void slotDropped(TQDropEvent *e, const TQValueList<TQIconDragItem>& lst);

	protected:
		virtual TQDragObject *dragObject();
		virtual void contentsMousePressEvent(TQMouseEvent *e);
		TQPoint _mousePos;
};


inline TQDataStream& operator<<(TQDataStream& str, const TDEWalletEntryItem& w) {
	TQString name = w.text(0);
	str << name;
	TDEWallet::Wallet::EntryType et = w._wallet->entryType(name);
	str << long(et);
	TQByteArray a;
	w._wallet->readEntry(name, a);
	str << a;
	return str;
}

inline TQDataStream& operator<<(TQDataStream& str, const TDEWalletFolderItem& w) {
	TQString oldFolder = w._wallet->currentFolder();
	str << w.name();
	w._wallet->setFolder(w.name());
	TQStringList entries = w._wallet->entryList();
	for (TQStringList::Iterator it = entries.begin(); it != entries.end(); ++it) {
		str << *it;
		TDEWallet::Wallet::EntryType et = w._wallet->entryType(*it);
		str << long(et);
		TQByteArray a;
		w._wallet->readEntry(*it, a);
		str << a;
	}
	w._wallet->setFolder(oldFolder);
	return str;
}

#endif
