Author: yradtsevich
Date: 2010-09-22 10:16:37 -0400 (Wed, 22 Sep 2010)
New Revision: 25094
Modified:
trunk/vpe/plugins/org.jboss.tools.vpe.xulrunner/src/org/jboss/tools/vpe/xulrunner/editor/XulRunnerEditor.java
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/dnd/DraggablePattern.java
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/dnd/DraggableTextSelection.java
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
Log:
JBIDE-6229
https://jira.jboss.org/browse/JBIDE-6229:
Implement DnD support for selected text in VPE
Modified:
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/dnd/DraggablePattern.java
===================================================================
---
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/dnd/DraggablePattern.java 2010-09-22
14:00:33 UTC (rev 25093)
+++
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/dnd/DraggablePattern.java 2010-09-22
14:16:37 UTC (rev 25094)
@@ -13,12 +13,9 @@
import static org.jboss.tools.vpe.xulrunner.util.XPCOM.queryInterface;
import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
import org.jboss.tools.vpe.editor.mozilla.MozillaEditor;
import org.jboss.tools.vpe.editor.util.HTML;
import org.jboss.tools.vpe.editor.util.VpeStyleUtil;
-import org.jboss.tools.vpe.xulrunner.util.XulRunnerVpeUtils;
-import org.mozilla.interfaces.nsIDOMCSSStyleDeclaration;
import org.mozilla.interfaces.nsIDOMElement;
import org.mozilla.interfaces.nsIDOMMouseEvent;
import org.mozilla.interfaces.nsIDOMNode;
@@ -29,7 +26,7 @@
* @author Yahor Radtsevich (yradtsevich)
*/
public class DraggablePattern {
- private static final int ICON_HEIGHT = 20;
+ public static final int ICON_HEIGHT = 20;
private static final String DRAG_ICON_ID = "dragIcon"; //$NON-NLS-1$
private static final String DRAG_ICON_FILE = "dragIcon.gif"; //$NON-NLS-1$
Modified:
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/dnd/DraggableTextSelection.java
===================================================================
---
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/dnd/DraggableTextSelection.java 2010-09-22
14:00:33 UTC (rev 25093)
+++
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/dnd/DraggableTextSelection.java 2010-09-22
14:16:37 UTC (rev 25094)
@@ -11,9 +11,7 @@
package org.jboss.tools.vpe.dnd;
import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
import org.jboss.tools.vpe.editor.util.VisualDomUtil;
-import org.jboss.tools.vpe.xulrunner.util.XulRunnerVpeUtils;
import org.mozilla.interfaces.nsIDOMDocument;
import org.mozilla.interfaces.nsIDOMElement;
import org.mozilla.interfaces.nsIDOMNode;
@@ -27,16 +25,18 @@
private final nsIDOMText selectionContainer;
private final int startOffset;
private final int endOffset;
+ private Point position;
/**
* NOTE: selectionContainer must contain really selected text. It will
* not work if real selection range do not math offsets.
*/
- public DraggableTextSelection(nsIDOMText selectionContainer,
+ public DraggableTextSelection(nsIDOMText selectionContainer, Point position,
int startOffset, int endOffset) {
this.selectionContainer = selectionContainer;
this.startOffset = startOffset;
this.endOffset = endOffset;
+ this.position = position;
}
@@ -62,7 +62,6 @@
* @see org.jboss.tools.vpe.dnd.IDraggableFragment#getPosition()
*/
public Point getPosition() {
- Rectangle bounds = XulRunnerVpeUtils.getTextSelectionBounds(selectionContainer);
- return new Point(bounds.x, bounds.y);
+ return position;
}
}
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-09-22
14:00:33 UTC (rev 25093)
+++
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/dnd/VpeDnD.java 2010-09-22
14:16:37 UTC (rev 25094)
@@ -69,6 +69,7 @@
import org.mozilla.interfaces.nsITransferable;
import org.mozilla.xpcom.Mozilla;
import org.w3c.dom.Document;
+import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
@@ -122,9 +123,26 @@
public void dragStart(nsIDOMEvent domEvent) {
nsIDOMElement selectedElement = getSelectedElement();
+ Point pageCoords = getPageCoords(domEvent);
+
+ /* for selected text the drag icon is shown
+ * when a drag action begins. */
+ if (vpeController.getXulRunnerEditor().isTextSelected()) {
+ nsISelection selection = vpeController.getXulRunnerEditor().getSelection();
+ nsIDOMRange range = selection.getRangeAt(0);
+ nsIDOMText textContainer = queryInterface(
+ range.getStartContainer(), nsIDOMText.class);
+
+ draggablePattern.showDragIcon(new DraggableTextSelection(
+ textContainer,
+ new Point(pageCoords.x - DraggablePattern.ICON_HEIGHT / 2,
+ pageCoords.y + DraggablePattern.ICON_HEIGHT / 2),
+ range.getStartOffset(), range.getEndOffset()));
+ }
+
// start drag sessionvpe-element
- if (isTextSelected(getVisualSelection()) || isDraggable(selectedElement)) {
- Point pageCoords = getPageCoords(domEvent);
+ if (vpeController.getXulRunnerEditor().isTextSelected()
+ || isDraggable(selectedElement)) {
draggablePattern.startSession(pageCoords.x, pageCoords.y);
startDragSession(selectedElement);
domEvent.stopPropagation();
@@ -135,8 +153,8 @@
private nsIDOMElement getSelectedElement() {
return vpeController.getXulRunnerEditor().getLastSelectedElement();
}
-
- /**
+
+ /**Draggable Text
* Called when drag over event occurs
* @param event
*/
@@ -148,8 +166,10 @@
final DropResolver dropResolver;
if (isInnerDragSession()) {
- if (isTextSelected(getVisualSelection())) {
- dropResolver =
getDropResolverForNode(getSourceNode(getVisualSelection().getFocusNode()));
+ if (vpeController.getXulRunnerEditor().isTextSelected()) {
+ dropResolver = getDropResolverForNode(getSourceNode(
+ vpeController.getXulRunnerEditor()
+ .getSelection().getFocusNode()));
} else {
dropResolver = getDropResolverForInternalDrop();
}
@@ -217,54 +237,16 @@
}
private void refreshDraggablePattern() {
- nsISelection selection = getVisualSelection();
- if (isTextSelected(selection)) {
- nsIDOMRange range = selection.getRangeAt(0);
- nsIDOMText textContainer = queryInterface(
- range.getStartContainer(), nsIDOMText.class);
-
- draggablePattern.showDragIcon(new DraggableTextSelection(
- textContainer, range.getStartOffset(), range.getEndOffset()));
- } else {
- nsIDOMElement selectedElement = getSelectedElement();
+ nsIDOMElement selectedElement = getSelectedElement();
- if (isDraggable(selectedElement)) {
- draggablePattern.showDragIcon(new DraggableElement(selectedElement));
- } else {
- draggablePattern.hideDragIcon();
- }
+ if (!vpeController.getXulRunnerEditor().isTextSelected() &&
+ isDraggable(selectedElement)) {
+ draggablePattern.showDragIcon(new DraggableElement(selectedElement));
+ } else {
+ draggablePattern.hideDragIcon();
}
}
- private nsISelection getVisualSelection() {
- return vpeController.getXulRunnerEditor().getWebBrowser()
- .getContentDOMWindow().getSelection();
- }
-
- private boolean isTextSelected(nsISelection selection) {
- if (selection.getRangeCount() == 0) {
- // nothing selected
- return false;
- }
-
- nsIDOMRange range = selection.getRangeAt(0);
- nsIDOMNode container = range.getStartContainer();
- if (!container.equals(range.getEndContainer())) {
- // more than one node selected
- return false;
- }
- if (container.getNodeType() != nsIDOMNode.TEXT_NODE) {
- // not text node is selected
- return false;
- }
- if (range.getStartOffset() == range.getEndOffset()) {
- // no text selected
- return false;
- }
-
- return true;
- }
-
public boolean isDragIconClicked(nsIDOMMouseEvent mouseEvent) {
return draggablePattern.isDragIconClicked(mouseEvent);
}
@@ -463,7 +445,19 @@
nsISupportsArray transArray = (nsISupportsArray) getComponentManager()
.createInstanceByContractID(XPCOM.NS_SUPPORTSARRAY_CONTRACTID, null,
nsISupportsArray.NS_ISUPPORTSARRAY_IID);
- transArray.appendElement(createTransferable(getSourceNode(element)));
+
+ Node node = getSourceNode(element);
+ String text;
+ if (node instanceof Element && node instanceof NodeContainer) {
+ text = ((NodeContainer)node).getSource();
+ } else {
+ StyledText textWidget = vpeController.getSourceEditor()
+ .getTextViewer().getTextWidget();
+ text = textWidget.getSelectionText();
+ }
+ String xPath = XSLTXPathHelper.calculateXPathToNode(node);
+ transArray.appendElement(createTransferable(text, xPath));
+
getDragService().invokeDragSession(element, transArray, null,
nsIDragService.DRAGDROP_ACTION_MOVE
| nsIDragService.DRAGDROP_ACTION_COPY
@@ -475,20 +469,17 @@
*
* @return transferable object
*/
- private nsITransferable createTransferable(Node node) {
+ private nsITransferable createTransferable(String text, String xPath) {
nsITransferable iTransferable = (nsITransferable) getComponentManager()
.createInstanceByContractID(XPCOM.NS_TRANSFERABLE_CONTRACTID, null,
nsITransferable.NS_ITRANSFERABLE_IID);
-
- String nodeSource = ((NodeContainer)node).getSource();
- nsISupportsString nodeSourceData = createNsISupportsString(nodeSource);
- int nodeSourceDataLength = nodeSource.length() * 2;
+
+ nsISupportsString nodeSourceData = createNsISupportsString(text);
+ int nodeSourceDataLength = text.length() * 2;
iTransferable.setTransferData(ModelTransfer.MODEL, nodeSourceData,
nodeSourceDataLength);
iTransferable.setTransferData("text/html", nodeSourceData,
nodeSourceDataLength); //$NON-NLS-1$
iTransferable.setTransferData("text/unicode", nodeSourceData,
nodeSourceDataLength); //$NON-NLS-1$
-
- String xPath = XSLTXPathHelper.calculateXPathToNode(node);
nsISupportsString xPathData = createNsISupportsString(xPath);
iTransferable.setTransferData(DndUtil.VPE_XPATH_FLAVOR, xPathData, xPath.length() *
2);
@@ -574,7 +565,7 @@
System.out.print("<<<<<< innerDrop"); //$NON-NLS-1$
}
- if (isTextSelected(getVisualSelection())) {
+ if (vpeController.getXulRunnerEditor().isTextSelected()) {
// it is inner Drag&Drop of text
StyledText textWidget = vpeController.getSourceEditor()
.getTextViewer().getTextWidget();
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-09-22
14:00:33 UTC (rev 25093)
+++
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/VpeController.java 2010-09-22
14:16:37 UTC (rev 25094)
@@ -128,6 +128,7 @@
import org.jboss.tools.vpe.resref.core.RelativeFolderReferenceList;
import org.jboss.tools.vpe.resref.core.TaglibReferenceList;
import org.jboss.tools.vpe.xulrunner.editor.XulRunnerEditor;
+import static org.jboss.tools.vpe.xulrunner.util.XPCOM.queryInterface;
import org.mozilla.interfaces.nsIDOMDocument;
import org.mozilla.interfaces.nsIDOMElement;
import org.mozilla.interfaces.nsIDOMEvent;
@@ -135,6 +136,7 @@
import org.mozilla.interfaces.nsIDOMMouseEvent;
import org.mozilla.interfaces.nsIDOMMutationEvent;
import org.mozilla.interfaces.nsIDOMNode;
+import org.mozilla.interfaces.nsIDOMRange;
import org.mozilla.interfaces.nsISelection;
import org.mozilla.interfaces.nsISelectionListener;
import org.w3c.dom.Attr;
@@ -1202,8 +1204,6 @@
// mareshkau
if (vpeDnD.isDragIconClicked(mouseEvent)) {
vpeDnD.dragStart(mouseEvent);
- } else {
- selectionManager.setSelection(mouseEvent);
}
}
} finally {
@@ -1231,6 +1231,13 @@
return;
}
try {
+ // if text is selected, then there is no need to select any element
+ if (!xulRunnerEditor.isTextSelected() ||
+ !xulRunnerEditor.getSelection().containsNode(
+ queryInterface(mouseEvent.getTarget(), nsIDOMNode.class), true)) {
+ selectionManager.setSelection(mouseEvent);
+ };
+
nsIDOMNode visualNode = VisualDomUtil.getTargetNode(mouseEvent);
if (visualNode != null) {
if (VpeDebug.PRINT_VISUAL_MOUSE_EVENT) {
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-09-22
14:00:33 UTC (rev 25093)
+++
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/mozilla/MozillaEventAdapter.java 2010-09-22
14:16:37 UTC (rev 25094)
@@ -282,11 +282,10 @@
listener.onShowContextMenu(0, domEvent, node);
}
} 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) {
- // listener.dragGesture(domEvent);
- //}
+ for (MozillaDndListener listener : listeners.getListeners(
+ MozillaDndListener.class)) {
+ listener.dragStart(domEvent);
+ }
} else if(DRAGDROPEVENT.equals(eventType)) {
// calls when drop event occure
for (MozillaDndListener listener : listeners.getListeners(
Modified:
trunk/vpe/plugins/org.jboss.tools.vpe.xulrunner/src/org/jboss/tools/vpe/xulrunner/editor/XulRunnerEditor.java
===================================================================
---
trunk/vpe/plugins/org.jboss.tools.vpe.xulrunner/src/org/jboss/tools/vpe/xulrunner/editor/XulRunnerEditor.java 2010-09-22
14:00:33 UTC (rev 25093)
+++
trunk/vpe/plugins/org.jboss.tools.vpe.xulrunner/src/org/jboss/tools/vpe/xulrunner/editor/XulRunnerEditor.java 2010-09-22
14:16:37 UTC (rev 25094)
@@ -350,8 +350,37 @@
nsISelection selection = domWindow.getSelection();
return selection;
}
-
+
/**
+ * Returns {@code true} if and only if the text selection exists and
+ * it is containing in single #text node.
+ */
+ public boolean isTextSelected() {
+ nsISelection selection = getSelection();
+ if (selection.getRangeCount() == 0) {
+ // nothing selected
+ return false;
+ }
+
+ nsIDOMRange range = selection.getRangeAt(0);
+ nsIDOMNode container = range.getStartContainer();
+ if (!container.equals(range.getEndContainer())) {
+ // more than one node selected
+ return false;
+ }
+ if (container.getNodeType() != nsIDOMNode.TEXT_NODE) {
+ // not text node is selected
+ return false;
+ }
+ if (range.getStartOffset() == range.getEndOffset()) {
+ // no text selected
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
* Function created to restore functionality of MozillaBrowser
*
* @return