|
|
@@ -113,12 +113,16 @@ public: |
|
|
|
{
|
|
|
|
Component* const over = dynamic_cast <Component*> (currentlyOver);
|
|
|
|
|
|
|
|
// (note: use a local copy of the dragDesc member in case the callback runs
|
|
|
|
// a modal loop and deletes this object before the method completes)
|
|
|
|
const String dragDescLocal (dragDesc);
|
|
|
|
|
|
|
|
if (over != 0
|
|
|
|
&& over->isValidComponent()
|
|
|
|
&& source->isValidComponent()
|
|
|
|
&& currentlyOver->isInterestedInDragSource (dragDesc, source))
|
|
|
|
&& currentlyOver->isInterestedInDragSource (dragDescLocal, source))
|
|
|
|
{
|
|
|
|
currentlyOver->itemDragExit (dragDesc, source);
|
|
|
|
currentlyOver->itemDragExit (dragDescLocal, source);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
@@ -159,11 +163,15 @@ public: |
|
|
|
hit = hit->getComponentAt (rx, ry);
|
|
|
|
}
|
|
|
|
|
|
|
|
// (note: use a local copy of the dragDesc member in case the callback runs
|
|
|
|
// a modal loop and deletes this object before the method completes)
|
|
|
|
const String dragDescLocal (dragDesc);
|
|
|
|
|
|
|
|
while (hit != 0)
|
|
|
|
{
|
|
|
|
DragAndDropTarget* const ddt = dynamic_cast <DragAndDropTarget*> (hit);
|
|
|
|
|
|
|
|
if (ddt != 0 && ddt->isInterestedInDragSource (dragDesc, source))
|
|
|
|
if (ddt != 0 && ddt->isInterestedInDragSource (dragDescLocal, source))
|
|
|
|
{
|
|
|
|
relX = screenX;
|
|
|
|
relY = screenY;
|
|
|
@@ -225,7 +233,13 @@ public: |
|
|
|
getParentComponent()->removeChildComponent (this);
|
|
|
|
|
|
|
|
if (dropAccepted && ddt != 0)
|
|
|
|
ddt->itemDropped (dragDesc, source, relX, relY);
|
|
|
|
{
|
|
|
|
// (note: use a local copy of the dragDesc member in case the callback runs
|
|
|
|
// a modal loop and deletes this object before the method completes)
|
|
|
|
const String dragDescLocal (dragDesc);
|
|
|
|
|
|
|
|
ddt->itemDropped (dragDescLocal, source, relX, relY);
|
|
|
|
}
|
|
|
|
|
|
|
|
// careful - this object could now be deleted..
|
|
|
|
}
|
|
|
@@ -233,6 +247,10 @@ public: |
|
|
|
|
|
|
|
void updateLocation (const bool canDoExternalDrag, int x, int y)
|
|
|
|
{
|
|
|
|
// (note: use a local copy of the dragDesc member in case the callback runs
|
|
|
|
// a modal loop and deletes this object before it returns)
|
|
|
|
const String dragDescLocal (dragDesc);
|
|
|
|
|
|
|
|
int newX = x - xOff;
|
|
|
|
int newY = y - yOff;
|
|
|
|
|
|
|
@@ -255,21 +273,21 @@ public: |
|
|
|
if (over != 0
|
|
|
|
&& over->isValidComponent()
|
|
|
|
&& ! (sourceWatcher->hasBeenDeleted())
|
|
|
|
&& currentlyOver->isInterestedInDragSource (dragDesc, source))
|
|
|
|
&& currentlyOver->isInterestedInDragSource (dragDescLocal, source))
|
|
|
|
{
|
|
|
|
currentlyOver->itemDragExit (dragDesc, source);
|
|
|
|
currentlyOver->itemDragExit (dragDescLocal, source);
|
|
|
|
}
|
|
|
|
|
|
|
|
currentlyOver = ddt;
|
|
|
|
|
|
|
|
if (currentlyOver != 0
|
|
|
|
&& currentlyOver->isInterestedInDragSource (dragDesc, source))
|
|
|
|
currentlyOver->itemDragEnter (dragDesc, source, relX, relY);
|
|
|
|
&& currentlyOver->isInterestedInDragSource (dragDescLocal, source))
|
|
|
|
currentlyOver->itemDragEnter (dragDescLocal, source, relX, relY);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (currentlyOver != 0
|
|
|
|
&& currentlyOver->isInterestedInDragSource (dragDesc, source))
|
|
|
|
currentlyOver->itemDragMove (dragDesc, source, relX, relY);
|
|
|
|
&& currentlyOver->isInterestedInDragSource (dragDescLocal, source))
|
|
|
|
currentlyOver->itemDragMove (dragDescLocal, source, relX, relY);
|
|
|
|
|
|
|
|
if (currentlyOver == 0
|
|
|
|
&& canDoExternalDrag
|
|
|
@@ -281,7 +299,7 @@ public: |
|
|
|
StringArray files;
|
|
|
|
bool canMoveFiles = false;
|
|
|
|
|
|
|
|
if (owner->shouldDropFilesWhenDraggedExternally (dragDesc, source, files, canMoveFiles)
|
|
|
|
if (owner->shouldDropFilesWhenDraggedExternally (dragDescLocal, source, files, canMoveFiles)
|
|
|
|
&& files.size() > 0)
|
|
|
|
{
|
|
|
|
ComponentDeletionWatcher cdw (this);
|
|
|
|