InDesign SDK: перетаскивание с панели Flex - PullRequest
0 голосов
/ 16 января 2012

У меня есть панель Flex в InDesign, из которой я перетаскиваю URL. Если я добавлю этот URL-адрес в текстовый редактор или веб-браузер, он будет работать. Но когда я пытаюсь добавить его в свой документ InDesign, это становится немного сложнее.

Я реализовал подкласс CDragDropTargetFlavorHelper. Капля отлично работает на Windows. Но на Mac у меня есть проблемы в методе CouldAcceptTypes:

DragDrop::TargetResponse AutocatDNDCustomFlavorHelper::CouldAcceptTypes(const  DragDropTarget* target, DataObjectIterator* dataIter, const IDragDropSource* fromSource,  const IDragDropController* controller) const
{
    if (0 != dataIter && 0 != target)
    {

        DataExchangeResponse response = dataIter->FlavorExistsWithPriorityInAllObjects(kURLDExternalFlavor);
        if (response.CanDo())
        {
            ...
        }
    }
}

Проблема в том, что response.canDo () отвечает kTrue в Windows, но kFalse в Mac. Я пытался изучить содержимое dataIter, но вызов dataIter-> First () возвращает ноль. Я пытался контроллер-> GetItemCount (), который возвращает 1. Но если я пытаюсь контроллер-> GetDragItem (1), я получаю нулевой указатель. У меня есть впечатление, что нет пункта. Тем не менее, как я уже сказал, падение работает на другом приложении, кроме InDesign.

Это проблема интернализации? Или что-то другое ? Это позволило мне высохнуть.

Заранее спасибо

-------------------------- РЕДАКТИРОВАТЬ -------------------- --------------- Я решил эту проблему, но обнаружил другую. Аромат, отправленный гибкой панелью, был изменен, так что теперь это текстовый, а не URL-адрес. Мой метод canAcceptType теперь работает:

DragDrop::TargetResponse AutocatDNDCustomFlavorHelper::CouldAcceptTypes(const DragDropTarget* target, DataObjectIterator* dataIter, const IDragDropSource* fromSource, const IDragDropController* controller) const
{
    if (0 != dataIter && 0 != target)
    {
        // Check for URL Flavor in the drag
        DataExchangeResponse response = dataIter->FlavorExistsWithPriorityInAllObjects(kTEXTExternalFlavor);
        if (response.CanDo())
            {
                return DragDrop::TargetResponse(response, DragDrop::kDropWillCopy);
            }
    }
    return DragDrop::kWontAcceptTargetResponse;
}

Проблема теперь в методе ProcessDragDropCommand. Вот код:

ErrorCode AutocatDNDCustomFlavorHelper::ProcessDragDropCommand(IDragDropTarget* target, IDragDropController* controller, DragDrop::eCommandType action)
{
    // retrieve drop data
    IPMDataObject* dragDataObject = controller->GetDragItem(1);
    uint32 dataSize = dragDataObject->GetSizeOfFlavorData(kTEXTExternalFlavor) ;
    ...
}

Проблема в том, что получаемый IMPDataObject равен нулю. Там нет элемента в контроллере. Однако в методе CouldAcceptTypes, в DataObjectIterator, были элементы. Итак, где мои вещи?

Я пытался использовать пользовательский CDataExchangeHandlerFor, но не мог понять, для чего его использование. Это все равно не сработало.

У кого-нибудь есть идеи?

С уважением, Рэй

1 Ответ

0 голосов
/ 27 января 2012

Проблема в аргументе GetDragItem.Это 1 на ПК.Это странное значение для Mac (что-то вроде 719853).Единственное грязное решение, которое я нашел, - это создание memcpy из объекта, извлеченного из dataIter в методе CouldAcceptTypes, и использование его в методе ProcessDragDropCommand.

...