Clase wxDataObject
Un wxDataObject representa datos que pueden copiarse desde o hacia el portapapeles, o arrastrarse y soltarse.
Jerarquía:

Lo importante de wxDataObject es que se trata de una pieza de datos 'inteligente', a diferencia de los contenedores de datos 'tontos', como los búferes de memoria o los archivos. Ser 'inteligente' aquí significa que el propio objeto de datos debe saber qué formatos de datos soporta y cómo representarse a sí mismo en cada uno de sus formatos soportados.
Un formato soportado, por cierto, es exactamente el formato en el que los datos pueden ser solicitados a un objeto de datos o desde el que el objeto de datos puede ser establecido. En el caso general, un objeto puede soportar diferentes formatos en 'entrada' y 'salida', es decir, puede ser capaz de renderizarse a sí mismo en un formato dado pero no ser creado a partir de datos en este formato o viceversa. wxDataObject define el tipo de enumeración wxDataObject::Direction que distingue entre ellos.
Véase la documentación de wxDataFormat para más información sobre formatos.
No es sorprendente que ser "inteligente" tenga un precio de complejidad añadida. Esto es razonable para las situaciones en las que realmente se necesita soportar múltiples formatos, pero puede ser molesto si solo se quiere hacer algo simple como cortar y pegar texto.
Para proporcionar una solución para ambos casos, wxWidgets tiene dos clases predefinidas que derivan de wxDataObject: wxDataObjectSimple y wxDataObjectComposite. wxDataObjectSimple es el wxDataObject más simple posible y solo contiene datos en un único formato (como HTML o texto) y wxDataObjectComposite es la forma más sencilla de implementar un wxDataObject que soporte múltiples formatos porque lo consigue simplemente conteniendo varios objetos wxDataObjectSimple.
Así pues, hay varias soluciones cuando se necesite una clase wxDataObject (y se necesite una en cuanto se quiera transferir datos a través del portapapeles o arrastrar y soltar):
- Utilizar una de las clases incorporadas.
- Se Puede utilizar wxTextDataObject, wxBitmapDataObject, wxFileDataObject, wxURLDataObject en los casos más sencillos cuando solo se necesita soportar un formato y los datos son texto, mapa de bits o lista de ficheros.
- Utilizar wxDataObjectSimple
- Derivar de wxDataObjectSimple es la solución más sencilla para datos personalizados - solo soportará un formato y por tanto probablemente no podrá comunicarse con otros programas, pero la transferencia de datos funcionará en el programa (o entre diferentes instancias del mismo).
- Utilizar wxDataObjectComposite
- Esta es una solución simple pero potente que permite soportar cualquier número de formatos (ya sean estándar o personalizados si se combinas con la solución anterior).
- Utilizar directamente wxDataObject
- Esta es la solución para obtener la máxima flexibilidad y eficiencia, pero también es la más difícil de implementar.
Hay que tener en cuenta que la forma más fácil de utilizar arrastrar y soltar y el portapapeles con múltiples formatos es mediante el uso de wxDataObjectComposite, pero no es la más eficiente ya que cada wxDataObjectSimple contendría todos los datos en sus respectivos formatos. Ahora imaginemos que se quiere pegar 200 páginas de texto en un formato propietario, así como Word, RTF, HTML, Unicode y texto plano en el portapapeles e incluso los ordenadores actuales tienen problemas. Para este caso, se tendrá que derivar de wxDataObject directamente y hacer que enumere sus formatos y proporcione los datos en el formato solicitado bajo demanda.
Hay que tener en cuenta que ni los mecanismos de transferencia de datos GTK+ para portapapeles y arrastrar y soltar, ni la transferencia de datos OLE, copian ningún dato hasta que otra aplicación realmente lo solicita. Esto contrasta con la "sensación" ofrecida al usuario de un programa que normalmente pensaría que los datos residen en el portapapeles después de haber pulsado "Copiar" - en realidad solo se declara que están disponibles.
También se pueden derivar las propias clases de objetos de datos de wxclasswxCustomDataObject para tipos definidos por el usuario. El formato de los datos definidos por el usuario se da como un literal de cadena de tipo mime, como "application/word" o "image/png". Estas cadenas se utilizan tal cual en Unix (hasta ahora sólo GTK+) para identificar un formato y se traducen a su equivalente en Windows bajo Win32 (utilizando el OLE IDataObject para el intercambio de datos desde y hacia el portapapeles y para arrastrar y soltar). Hay que tener en cuenta que la traducción de cadenas de formato bajo Windows aún no está terminada.
Cada clase derivada directamente de wxDataObject debe anular e implementar todas sus funciones que son puramente virtuales en la clase base. Los objetos de datos que solo renderizan sus datos o solo los establecen (es decir, trabajan en una sola dirección), deben devolver 0 desde GetFormatCount().
Nota: Esta clase no es actualmente utilizable desde wxPerl; puede utilizar Wx::PlDataObjectSimple en su lugar.
Tipos
enum Direction { Get = 0x01 , Set = 0x02 , Both = 0x03 }
- Get
- Formato soportado por GetDataHere().
- Set
- El formato es compatible con SetData().
- Both
- El formato es compatible tanto con GetDataHere() como con SetData() (no se utiliza actualmente)
Funciones miembro públicas
wxDataObject()
wxDataObject::wxDataObject()
Constructor.
~wxDataObject()
virtual wxDataObject::~wxDataObject()
Destructor.
GetAllFormats()
virtual void wxDataObject::GetAllFormats( wxDataFormat * formats, Direction dir = Get ) const
Copia todos los formatos soportados en la dirección dir dada al array apuntado por formats.
Debe haber suficiente espacio para GetFormatCount(dir) formatos en él.
Nota: En wxPerl este método sólo toma el parámetro dir. En contexto escalar devuelve el primer formato de la lista, en contexto lista devuelve una lista que contiene todos los formatos soportados.
Implementado en wxTextDataObject.
GetDataHere()
virtual bool wxDataObject::GetDataHere( const wxDataFormat & format, void * buf ) const
El método escribirá los datos del formato dado en el buffer buf.
En otras palabras, copia los datos de este objeto en el formato dado al buffer suministrado. Devuelve true en caso de éxito, false en caso de fallo.
Implementado en wxRichTextBufferDataObject.
GetDataSize()
virtual size_t wxDataObject::GetDataSize(const wxDataFormat & format) const
Devuelve el tamaño de los datos del formato dado.
Implementado en wxRichTextBufferDataObject.
GetFormatCount()
virtual size_t wxDataObject::GetFormatCount(Direction dir = Get) const
Devuelve el número de formatos disponibles para representar o establecer los datos.
Implementado en wxTextDataObject.
GetPreferredFormat()
virtual wxDataFormat wxDataObject::GetPreferredFormat(Direction dir = Get) const
Devuelve el formato preferido para representar los datos (si dir es Get, su valor por defecto) o para establecerlo.
Normalmente será el formato nativo del wxDataObject.
Implementado en wxRichTextBufferDataObject.
IsSupported()
bool wxDataObject::IsSupported( const wxDataFormat & format, Direction dir = Get ) const
Devuelve true si se admite este formato.
SetData()
virtual bool wxDataObject::SetData( const wxDataFormat & format, size_t len, const void * buf )
Establece los datos en el formato de la longitud len proporcionada en el buffer buf.
En otras palabras, copia la longitud en bytes de los datos del buffer a este objeto de datos.
Parámetros
- format
- El formato para el que establecer los datos.
- len
- El tamaño de los datos en bytes.
- buf
- Puntero no nulo a los datos.
Valor de retorno
true en caso de éxito, false en caso de fallo.
Reimplementado en wxRichTextBufferDataObject.