void checkForExternalDrag (DragAndDropTarget::SourceDetails& details, const Point<int>& screenPos) { if (! hasCheckedForExternalDrag) { if (Desktop::getInstance().findComponentAt (screenPos) == nullptr) { hasCheckedForExternalDrag = true; StringArray files; bool canMoveFiles = false; if (owner.shouldDropFilesWhenDraggedExternally (details, files, canMoveFiles) && files.size() > 0) { WeakReference<Component> thisWeakRef (this); setVisible (false); isDoingExternalDrag = true; if (ModifierKeys::getCurrentModifiersRealtime().isAnyMouseButtonDown()) DragAndDropContainer::performExternalDragDropOfFiles (files, canMoveFiles); delete thisWeakRef.get(); return; } } } }
/** * Retrieve a requires file that might be loaded for this * instance. * * @param name The name used for the requires file. * * @return The loaded requires file, or OREF_NULL if this instance * has not used the file yet. */ PackageClass *InterpreterInstance::getRequiresFile(RexxActivity *activity, RexxString *name) { WeakReference *ref = (WeakReference *)requiresFiles->get(name); if (ref != OREF_NULL) { PackageClass *resolved = (PackageClass *)ref->get(); if (resolved != OREF_NULL) { // get the guard lock on this...this will ensure that // the initializer is run before we grab this from the cache GuardLock lock(activity, resolved, ThePackageClass); return resolved; } // this was garbage collected, remove it from the table requiresFiles->remove(name); } return OREF_NULL; }
/** * Check for a package already in the requires cache. * * @param name The name of the target. * * @return The PackageClass instance, if any. */ RoutineClass *PackageManager::checkRequiresCache(RexxString *name, ProtectedObject &result) { // first check this using the specified name. Since we need to perform checks in the // macro space, it's possible this will be loaded under the simple name. We'll need to check // table again using the fully resolved name afterward. WeakReference *requiresRef = (WeakReference *)loadedRequires->get(name); if (requiresRef != OREF_NULL) { RoutineClass *resolved = (RoutineClass *)requiresRef->get(); if (resolved != OREF_NULL) { result = resolved; return resolved; } // this was garbage collected, remove it from the table loadedRequires->remove(name); } return OREF_NULL; }
DragAndDropTarget* getCurrentlyOver() { return dynamic_cast <DragAndDropTarget*> (currentlyOverComp.get()); }
void updateLocation (const bool canDoExternalDrag, const Point<int>& screenPos) { // (note: use a local copy of this in case a callback runs a modal loop and deletes // this object before it returns) DragAndDropTarget::SourceDetails details (sourceDetails); Point<int> newPos (screenPos + imageOffset); if (getParentComponent() != nullptr) newPos = getParentComponent()->getLocalPoint (nullptr, newPos); //if (newX != getX() || newY != getY()) { setTopLeftPosition (newPos.getX(), newPos.getY()); Point<int> relPos; DragAndDropTarget* const newTarget = findTarget (screenPos, relPos); Component* newTargetComp = dynamic_cast <Component*> (newTarget); drawImage = (newTarget == nullptr) || newTarget->shouldDrawDragImageWhenOver(); if (newTargetComp != currentlyOverComp) { DragAndDropTarget* const lastTarget = getCurrentlyOver(); if (lastTarget != nullptr && details.sourceComponent != nullptr && lastTarget->isInterestedInDragSource (details)) lastTarget->itemDragExit (details); currentlyOverComp = newTargetComp; if (newTarget != nullptr) { details.localPosition = relPos; if (newTarget->isInterestedInDragSource (details)) newTarget->itemDragEnter (details); } } { DragAndDropTarget* const target = getCurrentlyOver(); if (target != nullptr) { details.localPosition = relPos; if (target->isInterestedInDragSource (details)) target->itemDragMove (details); } } if (getCurrentlyOver() == nullptr && canDoExternalDrag && ! hasCheckedForExternalDrag) { if (Desktop::getInstance().findComponentAt (screenPos) == nullptr) { hasCheckedForExternalDrag = true; StringArray files; bool canMoveFiles = false; if (owner->shouldDropFilesWhenDraggedExternally (details, files, canMoveFiles) && files.size() > 0) { WeakReference<Component> thisWeakRef (this); setVisible (false); if (ModifierKeys::getCurrentModifiersRealtime().isAnyMouseButtonDown()) DragAndDropContainer::performExternalDragDropOfFiles (files, canMoveFiles); delete thisWeakRef.get(); return; } } } } }