Author: yradtsevich
Date: 2010-05-20 10:16:34 -0400 (Thu, 20 May 2010)
New Revision: 22209
Modified:
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/dnd/VpeDnD.java
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeController.java
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/mozilla/MozillaEventAdapter.java
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/mozilla/listener/MozillaDndListener.java
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/util/VisualDomUtil.java
Log:
https://jira.jboss.org/browse/JBIDE-6288 : VPE DnD: element under cursor is not
highlighted on Linux
Modified: trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/dnd/VpeDnD.java
===================================================================
---
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/dnd/VpeDnD.java 2010-05-20
14:15:14 UTC (rev 22208)
+++
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/dnd/VpeDnD.java 2010-05-20
14:16:34 UTC (rev 22209)
@@ -38,6 +38,7 @@
import org.jboss.tools.vpe.editor.mapping.VpeNodeMapping;
import org.jboss.tools.vpe.editor.mozilla.MozillaEditor;
import org.jboss.tools.vpe.editor.mozilla.listener.MozillaDndListener;
+import org.jboss.tools.vpe.editor.util.VisualDomUtil;
import org.jboss.tools.vpe.editor.util.VpeDndUtil;
import org.jboss.tools.vpe.xulrunner.XPCOM;
import org.jboss.tools.vpe.xulrunner.editor.XulRunnerEditor;
@@ -102,7 +103,7 @@
draggablePattern = new DraggablePattern(mozillaEditor);
}
- public void dragGesture(nsIDOMEvent domEvent) {
+ public void dragStart(nsIDOMEvent domEvent) {
nsIDOMElement selectedElement = vpeController.getXulRunnerEditor()
.getLastSelectedElement();
// start drag sessionvpe-element
@@ -110,8 +111,6 @@
Point pageCoords = getPageCoords(domEvent);
draggablePattern.startSession(pageCoords.x, pageCoords.y);
startDragSession(selectedElement);
-
- draggablePattern.closeSession();
domEvent.stopPropagation();
domEvent.preventDefault();
}
@@ -159,16 +158,35 @@
disposeDropableArea();
vpeController.onRefresh();
}
-
+
public void dragExit(nsIDOMEvent domEvent) {
-// disposeDropableArea();
- nsIDOMNode visualNode = (nsIDOMNode) domEvent.getTarget()
- .queryInterface(nsIDOMNode.NS_IDOMNODE_IID);
- if (visualNode.getNodeType()==nsIDOMNode.DOCUMENT_NODE) {
- disposeDropableArea();
+ nsIDOMNode eventTargetNode = (nsIDOMNode) domEvent.getTarget()
+ .queryInterface(nsIDOMNode.NS_IDOMNODE_IID);
+
+ if (dropableArea != null) {
+ nsIDOMNode dropTargetNode = dropableArea.getNode();
+
+ boolean targetNodeIsTemporary = false;
+ if (eventTargetNode.getNodeType() == nsIDOMNode.ELEMENT_NODE) {
+ nsIDOMElement eventTargetElement = (nsIDOMElement)
+ eventTargetNode.queryInterface(nsIDOMElement.NS_IDOMELEMENT_IID);
+ targetNodeIsTemporary = DndUtil.isTemporaryDndElement(eventTargetElement);
+ }
+ boolean eventTargetIsAscedantOfDropTarget = VisualDomUtil.isAscendant(eventTargetNode,
dropTargetNode);
+
+ // ignore events which are fired by the reason
+ // of drawing the dropable area
+ if (targetNodeIsTemporary || eventTargetIsAscedantOfDropTarget) {
+ disposeDropableArea();
+ }
}
}
+ public void dragEnd(nsIDOMEvent domEvent) {
+ disposeDropableArea();
+ draggablePattern.closeSession();
+ }
+
public void selectionChanged() {
nsIDOMElement selectedElement = vpeController.getXulRunnerEditor()
.getLastSelectedElement();
@@ -247,16 +265,15 @@
if (originalVisualNode == null) {
return;
}
-
- if (dropableArea == null) {
- dropableArea = new DropableArea(document);
- }
+
Node originalSourceNode = vpeController.getDomMapping()
.getNearSourceNode(originalVisualNode);
- if (originalSourceNode.getNodeType() == Node.TEXT_NODE) {
+
+ if (originalSourceNode != null
+ && originalSourceNode.getNodeType() == Node.TEXT_NODE) {
originalSourceNode = originalSourceNode.getParentNode();
}
-
+
final Node highlightedNode;
final EnumSet<DropTarget> dropTargets;
if (dropResolver.canDrop(originalSourceNode)) {
@@ -271,14 +288,14 @@
dropTargets = EnumSet.of(DropTarget.BEGIN, DropTarget.END);
}
} else {
- Node sourceNode;
+ Node sourceNode = null;
Node sourceNodeParent = originalSourceNode;
boolean nodeFound = false;
- do {
+ while (sourceNodeParent != null && !nodeFound) {
sourceNode = sourceNodeParent;
sourceNodeParent = sourceNode.getParentNode();
nodeFound = dropResolver.canDrop(sourceNodeParent);
- } while (sourceNodeParent != null && !nodeFound);
+ }
if (nodeFound) {
highlightedNode = sourceNode;
@@ -289,13 +306,21 @@
}
}
- dropableArea.setDropTargets(dropTargets);
- dropableArea.setNode(
- vpeController.getDomMapping().getNearVisualNode(highlightedNode));
- Point mouseCoords = getPageCoords(event);
- dropableArea.setHighlightedDropTarget(mouseCoords.x, mouseCoords.y);
- dropableArea.setVisible(true);
- dropableArea.redraw();
+ if (highlightedNode != null) {
+ if (dropableArea == null) {
+ dropableArea = new DropableArea(document);
+ }
+
+ dropableArea.setDropTargets(dropTargets);
+ dropableArea.setNode(
+ vpeController.getDomMapping().getNearVisualNode(highlightedNode));
+ Point mouseCoords = getPageCoords(event);
+ dropableArea.setHighlightedDropTarget(mouseCoords.x, mouseCoords.y);
+ dropableArea.setVisible(true);
+ dropableArea.redraw();
+ } else {
+ disposeDropableArea();
+ }
}
private Point getClientCoords(nsIDOMEvent event) {
@@ -457,11 +482,12 @@
if (sourceDropInfo.canDrop()) {
VpeDnDHelper dropper = new VpeDnDHelper();
dropper.setDndData(false, true);
+ Node node = sourceInnerDragInfo.getNode();
dropper.drop(vpeController.getPageContext(),
sourceInnerDragInfo, sourceDropInfo);
// select dropped node, JBIDE-6239
- setSelectedNode(sourceInnerDragInfo.getNode());
+ setSelectedNode(node);
if (sourceInnerDragInfo != null) {
sourceInnerDragInfo = null;
@@ -537,6 +563,7 @@
}
}
+ @SuppressWarnings("restriction")
private Point getSourceSelectionRange(Node sourceInitNode, int sourceInitOffset) {
int offset=0;
int position=0;
Modified:
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeController.java
===================================================================
---
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeController.java 2010-05-20
14:15:14 UTC (rev 22208)
+++
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeController.java 2010-05-20
14:16:34 UTC (rev 22209)
@@ -128,7 +128,6 @@
import org.jboss.tools.vpe.resref.core.TaglibReferenceList;
import org.jboss.tools.vpe.selbar.SelectionBar;
import org.jboss.tools.vpe.xulrunner.editor.XulRunnerEditor;
-import org.jboss.tools.vpe.xulrunner.editor.XulRunnerVpeUtils;
import org.mozilla.interfaces.nsIDOMDocument;
import org.mozilla.interfaces.nsIDOMElement;
import org.mozilla.interfaces.nsIDOMEvent;
@@ -1202,7 +1201,7 @@
// so we start it's manually
// mareshkau
if (vpeDnD.isDragIconClicked(mouseEvent)) {
- vpeDnD.dragGesture(mouseEvent);
+ vpeDnD.dragStart(mouseEvent);
} else {
selectionManager.setSelection(mouseEvent);
}
Modified:
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/mozilla/MozillaEventAdapter.java
===================================================================
---
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/mozilla/MozillaEventAdapter.java 2010-05-20
14:15:14 UTC (rev 22208)
+++
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/mozilla/MozillaEventAdapter.java 2010-05-20
14:16:34 UTC (rev 22209)
@@ -54,11 +54,13 @@
private static final String KEYPRESS="keypress"; //$NON-NLS-1$
private static final String DBLCLICK="dblclick"; //$NON-NLS-1$
private static final String CONTEXTMENUEVENTTYPE="contextmenu"; //$NON-NLS-1$
- private static final String DRAGGESTUREEVENT = "draggesture"; //$NON-NLS-1$
+// private static final String DRAGGESTUREEVENT = "draggesture"; //$NON-NLS-1$
+ private static final String DRAGSTART = "dragstart"; //$NON-NLS-1$
private static final String DRAGOVEREVENT = "dragover"; //$NON-NLS-1$
private static final String DRAGDROPEVENT = "dragdrop"; //$NON-NLS-1$
private static final String DRAGENTEREVENT = "dragenter"; //$NON-NLS-1$
private static final String DRAGEXITEVENT = "dragexit"; //$NON-NLS-1$
+ private static final String DRAGEND = "dragend"; //$NON-NLS-1$
private EventListenerList listeners = new EventListenerList();
private nsIDOMEventTarget window;
@@ -107,8 +109,9 @@
if (document != null) {
document.addEventListener(MozillaEventAdapter.DRAGDROPEVENT, this, false);
document.addEventListener(MozillaEventAdapter.DRAGENTEREVENT, this, false);
+ document.addEventListener(MozillaEventAdapter.DRAGEND,this, false);
document.addEventListener(MozillaEventAdapter.DRAGEXITEVENT,this, false);
- document.addEventListener(MozillaEventAdapter.DRAGGESTUREEVENT, this, false);
+ document.addEventListener(MozillaEventAdapter.DRAGSTART, this, false);
document.addEventListener(MozillaEventAdapter.DRAGOVEREVENT, this, false);
document.addEventListener(MozillaEventAdapter.KEYPRESS, this, false);
@@ -136,8 +139,9 @@
if (document != null) {
document.removeEventListener(MozillaEventAdapter.DRAGDROPEVENT, this, false);
document.removeEventListener(MozillaEventAdapter.DRAGENTEREVENT, this, false);
+ document.removeEventListener(MozillaEventAdapter.DRAGEND, this, false);
document.removeEventListener(MozillaEventAdapter.DRAGEXITEVENT, this, false);
- document.removeEventListener(MozillaEventAdapter.DRAGGESTUREEVENT, this, false);
+ document.removeEventListener(MozillaEventAdapter.DRAGSTART, this, false);
document.removeEventListener(MozillaEventAdapter.DRAGOVEREVENT, this, false);
document.removeEventListener(MozillaEventAdapter.KEYPRESS, this, false);
@@ -286,7 +290,7 @@
MozillaContextMenuListener.class)) {
listener.onShowContextMenu(0, domEvent, node);
}
- } else if(DRAGGESTUREEVENT.equals(eventType)) {
+ } else if(DRAGSTART.equals(eventType)) {
// fix of JBIDE-4998: since drag events now are implemented by
// handling CLICKEVENTTYPE, there is no need to handle them here
//for (DndDomEventListener listener : dndListeners) {
@@ -302,6 +306,11 @@
domEvent.preventDefault();
} else if(DRAGENTEREVENT.equals(eventType)) {
//just ignore this event
+ } else if(DRAGEND.equals(eventType)) {
+ for (MozillaDndListener listener : listeners.getListeners(
+ MozillaDndListener.class)) {
+ listener.dragEnd(domEvent);
+ }
} else if(DRAGEXITEVENT.equals(eventType)) {
for (MozillaDndListener listener : listeners.getListeners(
MozillaDndListener.class)) {
Modified:
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/mozilla/listener/MozillaDndListener.java
===================================================================
---
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/mozilla/listener/MozillaDndListener.java 2010-05-20
14:15:14 UTC (rev 22208)
+++
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/mozilla/listener/MozillaDndListener.java 2010-05-20
14:16:34 UTC (rev 22209)
@@ -26,7 +26,7 @@
* Drag gesture event handler
* @param event xulrunner drag event
*/
- void dragGesture(nsIDOMEvent event);
+ void dragStart(nsIDOMEvent event);
/**
* Calls when drop event occurs
@@ -35,9 +35,9 @@
void dragDrop(nsIDOMEvent domEvent);
// these methods are never used
// void dragEnter(nsIDOMEvent event);
-// void dragExit(nsIDOMEvent event);
// void drop(nsIDOMEvent event);
// void onPasteOrDrop(nsIDOMMouseEvent mouseEvent, String flavor, String data);
void dragExit(nsIDOMEvent domEvent);
+ void dragEnd(nsIDOMEvent domEvent);
}
Modified:
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/util/VisualDomUtil.java
===================================================================
---
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/util/VisualDomUtil.java 2010-05-20
14:15:14 UTC (rev 22208)
+++
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/util/VisualDomUtil.java 2010-05-20
14:16:34 UTC (rev 22209)
@@ -535,5 +535,23 @@
}
return facetChildren;
}
+
+ /**
+ * Returns {@code true} if and only if {@code potentialAscendant}
+ * is an ascendant of {@code potentialDescendant}.
+ *
+ * @param potentialAscendant must not be {@code null}
+ * @param potentialDescendant may be {@code null}
+ */
+ public static boolean isAscendant(nsIDOMNode potentialAscendant,
+ nsIDOMNode potentialDescendant) {
+ while (potentialDescendant != null) {
+ potentialDescendant = potentialDescendant.getParentNode();
+ if (potentialAscendant.equals(potentialDescendant)) {
+ return true;
+ }
+ }
+ return false;
+ }
}