InDesign SDK:从Flex面板拖放

时间:2012-01-16 10:47:19

标签: flex sdk drag-and-drop adobe-indesign

我在InDesign中有一个Flex面板,我从中拖动一个URL。如果我在文本编辑器或Web浏览器上删除此URL,则可以正常工作。但是当我试图将它放在我的InDesign文档上时,它会更难一点。

我已经实现了CDragDropTargetFlavorHelper的子类。该下载在Windows上完美运行。但是在mac上,我在方法CanAcceptTypes:

中遇到了问题
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()在Windows上回答kTrue,在Mac上回答kFalse。我试图探索dataIter的内容,但是对dataIter-> First()的调用返回nil。我尝试了一个控制器 - > GetItemCount(),它返回1.但是如果我尝试一个控制器 - > GetDragItem(1),我会得到一个nil指针。我印象中没有项目。虽然,正如我所说,掉落适用于另一个应用程序,而不是InDesign。

这是内化问题吗?或者是其他东西 ?它让我干。

提前致谢

-------------------------- EDIT -------------------- --------------- 我解决了这个问题,但发现了另一个问题。 flex面板发送的味道已经改变,因此它是一种文本味道而不是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是零。控制器中没有项目。但是,DataObjectIterator中的CouldAcceptTypes方法中有一些项目。那么,我的物品在哪里?

我尝试使用自定义CDataExchangeHandlerFor,但无法真正理解它的用途。它无论如何都没有用。

有人有想法吗?

此致 雷米

1 个答案:

答案 0 :(得分:0)

问题是GetDragItem的参数。 PC上是1。这在Mac上是一个奇怪的值(类似于719853)。我找到的唯一一个脏解决方案是从在CouldAcceptTypes方法中的dataIter中检索的对象中执行memcpy,并在ProcessDragDropCommand方法中使用它。