Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
76
Добавлен:
02.04.2015
Размер:
8.79 Mб
Скачать
      1. Получение событий "тащи и бросай"

Чтобы виджет был в состоянии получать события "тащи и бросай", прикрепите к нему ответную реакцию Pt_CB_DND (см. описание PtWidget в "Справочнике виджетов Photon'а").

 Чтобы у виджета вызывались его ответные реакции Pt_CB_DND, в его флагах Pt_ARG_FLAGS не требуется устанавливать флаг Pt_SELECTABLE.

Всякий раз, когда каким-либо образом виджет вовлекается в событие "тащи и бросай", вызывается его ответная реакция Pt_CB_DND. В ответной реакции cbinfo–>reason_subtype указывает тип произошедшего действия "тащи и бросай".

В нижеследующем разделе описаны события операции "Тащи и бросай", интересующие виджет-источник и виджет-адресат. Конечно, если виджет может быть и источником, и адресатом в (отдельных) операциях "тащи и бросай", его ответные реакции Pt_CB_DND должны иметь оба набора событий. Более подробно информация о событиях дана в описании типа PhEvent_t "Справочника библиотечных функций Photon'а".

          1. Виджет-источник

Виджет-источник операции "тащи и бросай" может получать события, описывающие состояние операции. Если Вам не нужны эти события, установите флаг Pt_DND_SILENT в аргументе flags функции PtInitDnd().

 Не устанавливайте флаг Pt_DND_SILENT, если Вы включаете доступные по запросу данные в структуру управления.

Подтипами события операции "тащи и бросай", представляющими интерес для источника операции, являются:

Ph_EV_DND_INIT

Операция успешно запущена

Ph_EV_DND_CANCEL

Операция была отменена (например, если сбрасывание произошло не над зоной, где возможен сброс, или адресат прервал операцию до получения сброса, или до того, как завершил выборку запрашиваемых данных).

Если операция отменена таким образом, библиотека автоматически очищает структуры данных.

Ph_EV_DND_COMPLETE

Событие операции "тащи и бросай" поставлено адресатом в очередь (адресат пока что его не рассматривает).

Ph_EV_DND_DELIVERED

Адресат удалил событие операции "тащи и бросай" из очереди.

          1. Виджет-адресат

Подтипами события "тащи и бросай", представляющими интерес для адресата операции, являются:

Ph_EV_DND_ENTER

Кто-то перетащил некие данные в область виджета, но ещё не сбросил их. Этот подтип события (reason_subtype) является первоначальной причиной вызова ответной реакции операции "тащи и бросай". В этот момент приложение принимает решение, примет ли оно сброшенные данные. Оно должно построить некий массив структур типа PtDndFetch_t и передать его функции PtDndSelect(). Это массив описывает допустимые типы, описания и транспортные методы для данных, участвующих в операциях "тащи и бросай", доступные для виджета. Функция PtDndSelect() возвращает число выбранных элементов из массива. Если событие содержит данные или ссылки на данные, в допустимом формате, выбираются и эти фрагменты событий. Если никакие данные не допустимы, этот виджет никакими другими событиями текущей операции "тащи и бросай" не модифицируется.

Ph_EV_DND_MOTION

Указатель перемещается внутри зоны выиджета. Этот тип событий генерируется только в случае, когда для фрагмента выбранных данных в члене select_flags структуры PtDndFetch_t установлен бит Pt_DND_SELECT_MOTION.

Ph_EV_DND_DROP

Пользователь сбросил данные. Для этого подтипа события ответная реакция получает из события выбранные данные. Это может включать в себя какую-то автоматическую, неблокируемую связь с источником данных – чтобы не допустить какую-либо связь с источником, задайте Ph_TRANSPORT_INLINE в качестве единственно допустимого транспортного протокола.

Если сброс данных выполнен успешно, память, использовавшаяся транспортным механизмом, автоматически освобождается.

Ph_EV_DND_LEAVE

Указатель вышел за пределы зоны виджета, но пользователь не сбросил данные.

Вот пример, работающий с ответной реакцией, приведённой выше для виджета PtLabel. Эта ответная реакция допускает в качестве данных операции "тащи и бросай" следующие типы:

  • текст

  • образ

  • альтернативная строка, если в данных отсутствует образ (в элементе PtDndFetch_t установлен Pt_DND_SELECT_DUP_DATA).

Виджет-источник пакует образ и альтернативную строку как данные, доступные по запросу, но адресат не предпринимает ничего, чтобы их затребовать; механизм транспортировки делает это автоматически.

/* Стандартные хеадеры */

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

/* Инструментальные хеадеры */

#include <Ph.h>

#include <Pt.h>

#include <Ap.h>

/* Локальные хеадеры */

#include "abimport.h"

#include "proto.h"

static PtDndFetch_t stuff_i_want[] = {

{"text", "plain", Ph_TRANSPORT_INLINE, },

{"image", NULL, Ph_TRANSPORT_INLINE, },

{"text", "image description", Ph_TRANSPORT_INLINE, Pt_DND_SELECT_DUP_DATA, },

};

enum {

PLAIN_TEXT = 0,

IMAGE,

IMAGE_TEXT,

};

int dnd_callback( PtWidget_t *widget, ApInfo_t *apinfo, PtCallbackInfo_t *cbinfo ) {

PtDndCallbackInfo_t *dndcb = cbinfo->cbdata;

int deep_free = 1, num_matches;

/* предотвращает предупреждения (варнинги) об отсутствии ссылок */

widget = widget, apinfo = apinfo;

cbinfo = cbinfo;

switch (cbinfo->reason_subtype) {

case Ph_EV_DND_ENTER:

num_matches = PtDndSelect (widget, stuff_i_want, ARRAY_SIZE( stuff_i_want ),

NULL, NULL, cbinfo );

break;

case Ph_EV_DND_DROP:

switch (dndcb->fetch_index) {

case PLAIN_TEXT:

PtSetResource (widget, Pt_ARG_TEXT_STRING, dndcb->data, strlen(dndcb->data));

break;

case IMAGE:

PtSetResource (widget, Pt_ARG_LABEL_IMAGE, dndcb->data, 0);

free (dndcb->data);

deep_free = 0;

break;

case IMAGE_TEXT:

printf ("Образ отсутствует; альтернативный текст: %s\n", (char *)dndcb->data);

break;

}

if (deep_free) {

PhFreeTransportType (dndcb->data, dndcb->trans_hdr->packing_type);

}

break;

} // switch по подтипу вызвавшего события

return( Pt_CONTINUE );

}

Соседние файлы в папке Литература_1