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

Чтобы запустить операцию "тащи и бросай", виджет-источник должен запаковать данные, которые будут перетаскиваться, и затем инициализировать операцию "тащи и бросай". Обычно это делается в одной из ответных реакций Pt_CB_OUTBOUND виджета.

 Ответные реакци Pt_CB_OUTBOUND вызываются только в случае, когда у виджета в его флагах Pt_ARG_FLAGS установлен флаг Pt_SELECTABLE.

Выполните следующие шаги:

  1. Если данные не принадлежат к одному из определённых системой типов транспортных данных, создайте для них член транспортного реестра (transport registry entry). Более подробно см. в разделе "Регистрация новых транспортных типов" ниже.

  2. Создайте структуру транспортного управления (типа PtTransportCtrl_t) для использования операцией "тащи и бросай", вызвав функцию PtCreateTransportCtrl(). Структура транспортного управления освобождается автоматически после исполнения операции "тащи и бросай".

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

  • Для каждого фрагмента данных, пакуемых поточно, вызовите функцию PtTransportType().

  • Для каждого фрагмента данных, передаваемых по запросу, вызовите функцию PtTransportRequestable().

Структура PtTransportCtrl_t имеет список запрашиваемых данных, который автоматически отсылается, если адресат их запрашивает. Виджет-источник может добавить данные в эту очередь, вызвав функцию PtAddResponseType().

Если виджет-источник в этот момент не желает паковать данные, доступные по запросу, это должно обеспечиваться ответной реакцией при вызове PtTransportRequestable().

  1. Когда все данные запакованы, вызовите функцию PtInitDnd(), чтобы инициализировать операцию "тащи и бросай".

          1. Пример

Вот пример ответной реакции, инициализирующей операцию "тащи и бросай" для виджета типа PtLabel. Вы можете использовать эту ответную реакцию для ответной реакции Pt_CB_OUTBOUND виджетов типа PtLabel (виджетов-надписей).

 Убедитесь, что во флагах Pt_ARG_FLAGS виджета установлен флаг Pt_SELECTABLE.

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

  • Текст надписи, если он имеется, пакуется как потоковые данные.

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

  • Альтернативный текст, используемый при отсутствии образа. Эта строка также представляет собой данные, доступные по запросу, но мы предусматриваем ответную реакцию для упаковки этих данных, если адресат их запросит.

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

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

#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"

#define TEXT_GROUP 0

#define IMAGE_GROUP 1

PtTransportReqDataCB_t request_callback;

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

char *widget_text = NULL;

char *label_type;

PhImage_t * image = NULL;

PtRequestables_t *req;

PtTransportCtrl_t *tctrl = PtCreateTransportCtrl();

int ret;

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

widget = widget, apinfo = apinfo;

cbinfo = cbinfo;

/* Получает тип надписи, так что мы можем определить, какие данные паковать */

PtGetResource( widget, Pt_ARG_LABEL_TYPE, &label_type, 0);

if ((*label_type = = Pt_Z_STRING) || (*label_type = = Pt_TEXT_IMAGE)) {

/* Получает текст виджета и пакует его в поток */

PtGetResource( widget, Pt_ARG_TEXT_STRING, &widget_text, 0);

PtTransportType( tctrl, "text", "plain", TEXT_GROUP, Ph_TRANSPORT_INLINE, "string",

widget_text, 0, 0);

}

/* Если это образ, добавляем его как данные, доступные по запросу.

Готовим запрашиваемые данные (позволяя автоматический запрос)

*/

if ((*label_type = = Pt_IMAGE) || (*label_type = = Pt_TEXT_IMAGE)) {

PtGetResource( widget, Pt_ARG_LABEL_IMAGE, &image, 0);

if (image) {

req = PtTransportRequestable ( tctrl, "image", "an image", IMAGE_GROUP,

Ph_TRANSPORT_INLINE, "PhImage", NULL, NULL );

PtAddResponseType( tctrl, req, "image", "an image", Ph_TRANSPORT_INLINE, "PhImage",

image, 0, 0);

}

}

/* Добавляем доступную по запросу строку, которая будет

предоставлена по ответной реакции

*/

PtTransportRequestable( tctrl, "text", "image description", IMAGE_GROUP,

Ph_TRANSPORT_INLINE, "string",

(PtTransportReqDataCB_t *) &request_callback, "This was requested");

/* Инициализируем операцию "тащи и бросай" */

ret = PtInitDnd( tctrl, widget, cbinfo->event, NULL, 0);

return( Pt_CONTINUE );

} // функции start_dnd()

int unsigned request_callback( int unsigned type, PtReqResponseHdr_t *req_hdr,

PtRequestables_t *req) {

if (type = = Pt_DND_REQUEST_DATA) {

/* Ответить на запрос строкой из req->rq_callback_data,

последнего аргумента в PtTransportRequestable()

*/

PtAddResponseType( req->ctrl, req, "text", "request", Ph_TRANSPORT_INLINE, "string",

req->rq_callback_data, 0, 0);

return Pt_CONTINUE;

}

/* Отвергнуть запрос */

return Pt_END;

} // функции request_callback()

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