Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef TDRAGDROP_INCLUDED
Toshihiro Shimizu 890ddd
#define TDRAGDROP_INCLUDED
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//#include "tw/tw.h"
Toshihiro Shimizu 890ddd
// #include "tdata.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tgeometry.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef DVAPI
Toshihiro Shimizu 890ddd
#undef DVVAR
Toshihiro Shimizu 890ddd
#ifdef TWIN_EXPORTS
Toshihiro Shimizu 890ddd
#define DVAPI DV_EXPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_EXPORT_VAR
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#define DVAPI DV_IMPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_IMPORT_VAR
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TDataObject;
Toshihiro Shimizu 890ddd
class TData;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//////////////////
Toshihiro Shimizu 890ddd
// Exceptions
Toshihiro Shimizu 890ddd
//////////////////
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TOutOfMemory
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
class DVAPI TInitFailed
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
class DVAPI TDragDropExpt
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//////////////////
Toshihiro Shimizu 890ddd
//TDropSource/////
Toshihiro Shimizu 890ddd
//////////////////
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TDropSource
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#if defined(__GNUC__)
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	class Imp;
Toshihiro Shimizu 890ddd
#if defined(__GNUC__)
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	Imp *m_imp;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	// not implemented
Toshihiro Shimizu 890ddd
	TDropSource(const TDropSource &);
Toshihiro Shimizu 890ddd
	TDropSource &operator=(const TDropSource &);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	enum DropEffect {
Toshihiro Shimizu 890ddd
		None = 0,
Toshihiro Shimizu 890ddd
		Copy,
Toshihiro Shimizu 890ddd
		Move,
Toshihiro Shimizu 890ddd
		Link,
Toshihiro Shimizu 890ddd
		CopyScroll,
Toshihiro Shimizu 890ddd
		MoveScroll,
Toshihiro Shimizu 890ddd
		LinkScroll
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDropSource();
Toshihiro Shimizu 890ddd
	virtual ~TDropSource();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool isValid() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	DropEffect doDragDrop(const TDataObject &data);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// viene chiamata durante il drag su un target passando come
Toshihiro Shimizu 890ddd
	// argomento il valore ritornato dalla onOver() del target
Toshihiro Shimizu 890ddd
	//virtual CursorToUse setCursor(DropEffect dropEffect);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	virtual void setCursor(DropEffect dropEffect);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//////////////////
Toshihiro Shimizu 890ddd
//TDropTarget/////
Toshihiro Shimizu 890ddd
//////////////////
Toshihiro Shimizu 890ddd
//! \brief Ascoltatore degli eventi per il Drag&Drop
Toshihiro Shimizu 890ddd
class DVAPI TDragDropListener
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	class Event
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
	public:
Toshihiro Shimizu 890ddd
		const TData *const m_data;
Toshihiro Shimizu 890ddd
		TPoint m_pos;
Toshihiro Shimizu 890ddd
		unsigned int m_buttonMask;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		Event(TData *data) : m_data(data), m_buttonMask(0){};
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDragDropListener(){};
Toshihiro Shimizu 890ddd
	virtual ~TDragDropListener(){};
Toshihiro Shimizu 890ddd
	//! Funzione per il drop di un file - ingresso nel pannello
Toshihiro Shimizu 890ddd
	virtual TDropSource::DropEffect onEnter(const Event &event) = 0;
Toshihiro Shimizu 890ddd
	//! Funzione per il drop di un file - interno al pannello
Toshihiro Shimizu 890ddd
	virtual TDropSource::DropEffect onOver(const Event &event) = 0;
Toshihiro Shimizu 890ddd
	//! Funzione per il drop di un file - rilascio del file
Toshihiro Shimizu 890ddd
	virtual TDropSource::DropEffect onDrop(const Event &event) = 0;
Toshihiro Shimizu 890ddd
	//! Funzione per il drop di un file - uscita dal pannello
Toshihiro Shimizu 890ddd
	virtual void onLeave() = 0;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//////////////////
Toshihiro Shimizu 890ddd
//TDataObject/////
Toshihiro Shimizu 890ddd
//////////////////
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TDataObject
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	class Imp;
Toshihiro Shimizu 890ddd
	Imp *m_imp;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// not implemented
Toshihiro Shimizu 890ddd
	TDataObject(const TDataObject &);
Toshihiro Shimizu 890ddd
	TDataObject &operator=(const TDataObject &);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	enum DataType {
Toshihiro Shimizu 890ddd
		Text,
Toshihiro Shimizu 890ddd
		File,
Toshihiro Shimizu 890ddd
		Bitmap
Toshihiro Shimizu 890ddd
	};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDataObject();
Toshihiro Shimizu 890ddd
	~TDataObject();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//Costruttore per Text
Toshihiro Shimizu 890ddd
	TDataObject(const std::string &str);
Toshihiro Shimizu 890ddd
	TDataObject(const std::wstring &str);
Toshihiro Shimizu 890ddd
	//Costruttore per File
Toshihiro Shimizu 890ddd
	TDataObject(const std::vector<std::string> &vStr);</std::string>
Toshihiro Shimizu 890ddd
	TDataObject(const std::vector<std::wstring> &vStr);</std::wstring>
Toshihiro Shimizu 890ddd
	//Costruttore per dt_bitmap o eventualmente un tipo proprietario
Toshihiro Shimizu 890ddd
	TDataObject(DataType dataType, const unsigned char *data, const unsigned int dataLen);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool getDataTypes(std::vector<datatype> &dataType) const;</datatype>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool getData(string &str) const;
Toshihiro Shimizu 890ddd
	bool getData(std::vector<string> &vStr) const;</string>
Toshihiro Shimizu 890ddd
	bool getData(DataType dataType, unsigned char *&data, unsigned int *dataLen) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//friend class TDropSource::Imp;
Toshihiro Shimizu 890ddd
	//friend class TDropTarget::Imp;
Toshihiro Shimizu 890ddd
	friend class TEnumFormatEtc;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// void DVAPI uffa(TWidget *w);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// Gestione (discutibilissima) del drag&drop "interno" con tipi speciali
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// nel dropSource:
Toshihiro Shimizu 890ddd
//   MyType *data = ...
Toshihiro Shimizu 890ddd
//   TDNDDataHolder<mytype> holder(data);</mytype>
Toshihiro Shimizu 890ddd
//   holder.doDragDrop();
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// nel target
Toshihiro Shimizu 890ddd
//   if(MyType *data = TDNDDataHolder<mytype>::getCurrentValue())</mytype>
Toshihiro Shimizu 890ddd
//     {
Toshihiro Shimizu 890ddd
//     }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI TDNDGenericDataHolder
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
protected:
Toshihiro Shimizu 890ddd
	TDNDGenericDataHolder() {}
Toshihiro Shimizu 890ddd
	static TDNDGenericDataHolder *m_holder;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	virtual ~TDNDGenericDataHolder() {}
Toshihiro Shimizu 890ddd
	static bool isDraggingCustomData() { return m_holder != 0; }
Toshihiro Shimizu 890ddd
	TDropSource::DropEffect doDragDrop();
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
class TDNDDataHolder : public TDNDGenericDataHolder
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	T *m_value;
Toshihiro Shimizu 890ddd
	string m_name;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TDNDDataHolder(T *value, string name = "") : m_value(value), m_name(name) { m_holder = this; }
Toshihiro Shimizu 890ddd
	~TDNDDataHolder() { m_holder = 0; }
Toshihiro Shimizu 890ddd
	T *getValue() const { return m_value; }
Toshihiro Shimizu 890ddd
	string getName() const { return m_name; }
Toshihiro Shimizu 890ddd
	static T *getCurrentValue()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TDNDDataHolder<t> *holder = dynamic_cast<tdnddataholder<t> *>(m_holder);</tdnddataholder<t></t>
Toshihiro Shimizu 890ddd
		return holder ? holder->getValue() : 0;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif