// This file is part of VSTGUI. It is subject to the license terms // in the LICENSE file found in the top-level directory of this // distribution and at http://github.com/steinbergmedia/vstgui/LICENSE #pragma once #include "vstguibase.h" namespace VSTGUI { //----------------------------------------------------------------------------- /// @brief interface for drag&drop and clipboard data //----------------------------------------------------------------------------- class IDataPackage : public AtomicReferenceCounted { public: enum Type { /** File type (UTF-8 C-String) */ kFilePath = 0, /** Text type (UTF-8 C-String) */ kText, /** Binary type */ kBinary, kError = -1 }; virtual uint32_t getCount () const = 0; virtual uint32_t getDataSize (uint32_t index) const = 0; virtual Type getDataType (uint32_t index) const = 0; virtual uint32_t getData (uint32_t index, const void*& buffer, Type& type) const = 0; protected: IDataPackage () {} }; //----------------------------------------------------------------------------- /** IDataPackage iterator * * @ingroup new_in_4_12 */ struct DataPackageIterator { struct Item { IDataPackage::Type type {IDataPackage::Type::kError}; uint32_t dataSize {0}; const void* data {nullptr}; }; DataPackageIterator (IDataPackage* pkg, uint32_t index = 0u) : pkg (pkg), index (index) {} DataPackageIterator& operator++ () { item = {}; index++; return *this; } const Item& operator->() const { gatherItem (); return item; } const Item& operator* () const { gatherItem (); return item; } bool operator!= (const DataPackageIterator& other) const { return other.pkg != pkg || other.index != index; } uint32_t getIndex () const { return index; } private: void gatherItem () const { if (item.data == nullptr && pkg && index < pkg->getCount ()) item.dataSize = pkg->getData (index, item.data, item.type); } IDataPackage* pkg {nullptr}; uint32_t index {0u}; mutable Item item; }; //----------------------------------------------------------------------------- inline DataPackageIterator begin (IDataPackage* pkg) { return DataPackageIterator (pkg); } //----------------------------------------------------------------------------- inline DataPackageIterator end (IDataPackage* pkg) { return DataPackageIterator (pkg, pkg->getCount ()); } } // VSTGUI