Author: yradtsevich
Date: 2008-12-15 14:13:10 -0500 (Mon, 15 Dec 2008)
New Revision: 12602
Added:
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/dnd/ScrollingSupport.java
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/mozilla/MozillaDomEventListener.java
Log:
CODING IN PROGRESS - issue JBIDE-3029: DND doesn't work correctly for components.
Description: If I can't see all page, I can't drag and drop an element from, for
example, bottom to top or vice versa.
https://jira.jboss.org/jira/browse/JBIDE-3029
Scrolling during DND -- initial implementation.
Added:
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/dnd/ScrollingSupport.java
===================================================================
---
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/dnd/ScrollingSupport.java
(rev 0)
+++
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/dnd/ScrollingSupport.java 2008-12-15
19:13:10 UTC (rev 12602)
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2007-2008 Red Hat, Inc.
+ * Distributed under license by Red Hat, Inc. All rights reserved.
+ * This program is made available under the terms of the
+ * Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at
http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributor:
+ * Red Hat, Inc. - initial API and implementation
+ ******************************************************************************/
+package org.jboss.tools.vpe.dnd;
+
+import org.eclipse.swt.graphics.Rectangle;
+import org.jboss.tools.vpe.xulrunner.editor.XulRunnerEditor;
+import org.mozilla.interfaces.nsIDOMMouseEvent;
+import org.mozilla.interfaces.nsIEmbeddingSiteWindow;
+import org.mozilla.interfaces.nsIWebBrowser;
+
+/**
+ * @author yradtsevich
+ *
+ */
+public class ScrollingSupport {
+ private static final int SCROLLING_STEP = 10;
+ private static final int SCROLLING_BORDERS = 20;
+
+ // XXX: the value of SCROLLBAR_HEIGHT and SCROLLBAR_WIDTH
+ // should be set according to environment settings
+ private static final int SCROLLBAR_HEIGHT = 16;
+ private static final int SCROLLBAR_WIDTH = 16;
+
+ private final XulRunnerEditor xulRunnerEditor;
+ public ScrollingSupport(XulRunnerEditor xulRunnerEditor) {
+ this.xulRunnerEditor = xulRunnerEditor;
+ }
+
+ public void scroll(nsIDOMMouseEvent mouseEvent) {
+ final nsIWebBrowser webBrowser = xulRunnerEditor.getWebBrowser();
+
+ Rectangle rect = getWindowBounds();
+
+ final int mouseX = mouseEvent.getClientX();
+ final int mouseY = mouseEvent.getClientY();
+ int scrollX = 0;
+ int scrollY = 0;
+ if (rect.x + SCROLLING_BORDERS > mouseX) {
+ scrollX-= SCROLLING_STEP;
+ }
+ if (rect.y + SCROLLING_BORDERS > mouseY) {
+ scrollY-= SCROLLING_STEP;
+ }
+ if (rect.x + rect.width - SCROLLING_BORDERS - SCROLLBAR_WIDTH < mouseX) {
+ scrollX+= SCROLLING_STEP;
+ }
+ if (rect.y + rect.height - SCROLLING_BORDERS - SCROLLBAR_HEIGHT < mouseY) {
+ scrollY+= SCROLLING_STEP;
+ }
+
+ if (scrollX != 0 || scrollY != 0) {
+ webBrowser.getContentDOMWindow().scrollBy(scrollX, scrollY);
+ }
+ }
+
+ public Rectangle getWindowBounds() {
+ nsIEmbeddingSiteWindow window = (nsIEmbeddingSiteWindow)
+ xulRunnerEditor
+ .getWebBrowser()
+ .getContainerWindow()
+ .queryInterface(nsIEmbeddingSiteWindow.NS_IEMBEDDINGSITEWINDOW_IID);
+
+ int[] xArray = new int[1]; // Left hand corner of the outer area
+ int[] yArray = new int[1]; // Top corner of the outer area
+ int[] widthArray = new int[1]; // Width of the inner or outer area
+ int[] heightArray = new int[1]; // Height of the inner or outer area
+
+ window.getDimensions(nsIEmbeddingSiteWindow.DIM_FLAGS_SIZE_INNER,
+ xArray, yArray, widthArray, heightArray);
+
+ return new Rectangle(xArray[0], yArray[0], widthArray[0], heightArray[0]);
+ }
+}
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 2008-12-15
18:36:08 UTC (rev 12601)
+++
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/dnd/VpeDnD.java 2008-12-15
19:13:10 UTC (rev 12602)
@@ -13,11 +13,11 @@
import org.jboss.tools.vpe.editor.VpeController;
import org.jboss.tools.vpe.editor.VpeVisualCaretInfo;
-import org.jboss.tools.vpe.editor.VpeVisualInnerDropInfo;
import org.jboss.tools.vpe.editor.mozilla.EditorDomEventListener;
import org.jboss.tools.vpe.editor.mozilla.MozillaDropInfo;
import org.jboss.tools.vpe.editor.selection.VpeSelectionController;
import org.jboss.tools.vpe.xulrunner.XPCOM;
+import org.jboss.tools.vpe.xulrunner.editor.XulRunnerEditor;
import org.mozilla.interfaces.nsIComponentManager;
import org.mozilla.interfaces.nsIDOMEvent;
import org.mozilla.interfaces.nsIDOMEventTarget;
@@ -146,15 +146,24 @@
* @param event
*/
public void dragOver(nsIDOMEvent event, EditorDomEventListener editorDomEventListener)
{
+ final nsIDOMMouseEvent mouseEvent =
+ (nsIDOMMouseEvent) event.queryInterface(nsIDOMMouseEvent.NS_IDOMMOUSEEVENT_IID);
+ final XulRunnerEditor editor = ((VpeController)
editorDomEventListener).getXulRunnerEditor();
+ new ScrollingSupport(editor).scroll(mouseEvent);
+ refreshCanDrop(event, editorDomEventListener);
+ }
+
+ private void refreshCanDrop(nsIDOMEvent event,
+ EditorDomEventListener editorDomEventListener) {
boolean canDrop = true;
-
+
nsIDOMMouseEvent mouseEvent = (nsIDOMMouseEvent)
event.queryInterface(nsIDOMMouseEvent.NS_IDOMMOUSEEVENT_IID);
//in this condition early was check for xulelement
if (editorDomEventListener != null) {
if
(getDragService().getCurrentSession().isDataFlavorSupported(VpeController.MODEL_FLAVOR))
{
-
+
MozillaDropInfo info;
-
+
if(getDragService().getCurrentSession().getSourceNode()==null){
//external drag
info = editorDomEventListener.canExternalDrop(mouseEvent,
VpeController.MODEL_FLAVOR, ""); //$NON-NLS-1$
@@ -192,13 +201,10 @@
event.preventDefault();
}
-
-
//sets possability to drop current element here
getDragService().getCurrentSession().setCanDrop(canDrop);
mouseEvent.preventDefault();
mouseEvent.stopPropagation();
-
}
/**
* Drop Event handler
Modified:
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/mozilla/MozillaDomEventListener.java
===================================================================
---
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/mozilla/MozillaDomEventListener.java 2008-12-15
18:36:08 UTC (rev 12601)
+++
trunk/vpe/plugins/org.jboss.tools.vpe/src/org/jboss/tools/vpe/editor/mozilla/MozillaDomEventListener.java 2008-12-15
19:13:10 UTC (rev 12602)
@@ -122,69 +122,54 @@
*/
public void handleEvent(nsIDOMEvent domEvent) {
- if(getEditorDomEventListener()==null){
-
- return;
- } else if(MOUSEMOVEEVENTTYPE.equals(domEvent.getType())) {
-
+ if(getEditorDomEventListener() != null) {
+ final String eventType = domEvent.getType();
+ if(MOUSEMOVEEVENTTYPE.equals(eventType)) {
nsIDOMMouseEvent mouseEvent;
mouseEvent = (nsIDOMMouseEvent)
domEvent.queryInterface(nsIDOMMouseEvent.NS_IDOMMOUSEEVENT_IID);
getEditorDomEventListener().mouseMove(mouseEvent);
- } else if(MOUSEDOWNEVENTTYPE.equals(domEvent.getType())) {
-
+ } else if(MOUSEDOWNEVENTTYPE.equals(eventType)) {
nsIDOMMouseEvent mouseEvent;
mouseEvent = (nsIDOMMouseEvent)
domEvent.queryInterface(nsIDOMMouseEvent.NS_IDOMMOUSEEVENT_IID);
getEditorDomEventListener().mouseDown(mouseEvent);
-
- } else if(MOUSEUPEVENTTYPE.equals(domEvent.getType())) {
-
+ } else if(MOUSEUPEVENTTYPE.equals(eventType)) {
nsIDOMMouseEvent mouseEvent;
mouseEvent = (nsIDOMMouseEvent)
domEvent.queryInterface(nsIDOMMouseEvent.NS_IDOMMOUSEEVENT_IID);
getEditorDomEventListener().mouseUp(mouseEvent);
- } else if(CLICKEVENTTYPE.equals(domEvent.getType())) {
-
+ } else if(CLICKEVENTTYPE.equals(eventType)) {
nsIDOMMouseEvent mouseEvent;
mouseEvent = (nsIDOMMouseEvent)
domEvent.queryInterface(nsIDOMMouseEvent.NS_IDOMMOUSEEVENT_IID);
getEditorDomEventListener().mouseClick(mouseEvent);
- } else if(DBLCLICK.equals(domEvent.getType())) {
-
+ } else if(DBLCLICK.equals(eventType)) {
nsIDOMMouseEvent mouseEvent;
mouseEvent = (nsIDOMMouseEvent)
domEvent.queryInterface(nsIDOMMouseEvent.NS_IDOMMOUSEEVENT_IID);
getEditorDomEventListener().mouseDblClick(mouseEvent);
- } else if(KEYPRESS.equals(domEvent.getType())) {
-
+ } else if(KEYPRESS.equals(eventType)) {
nsIDOMKeyEvent keyEvent = (nsIDOMKeyEvent)
domEvent.queryInterface(nsIDOMKeyEvent.NS_IDOMKEYEVENT_IID);
getEditorDomEventListener().keyPress(keyEvent);
- } else if(CONTEXTMENUEVENTTYPE.equals(domEvent.getType())) {
-
+ } else if(CONTEXTMENUEVENTTYPE.equals(eventType)) {
//first param are null 0, because this not used in event handler
getEditorDomEventListener().onShowContextMenu(0, domEvent, (nsIDOMNode)
domEvent.getTarget().queryInterface(nsIDOMNode.NS_IDOMNODE_IID));
- } else if(DRAGGESTUREEVENT.equals(domEvent.getType())) {
-
+ } else if(DRAGGESTUREEVENT.equals(eventType)) {
if(getEditorDomEventListener()!=null) {
-
getEditorDomEventListener().dragGesture(domEvent);
}
- } else if(DRAGDROPEVENT.equals(domEvent.getType())) {
- // calls when drop event occure
-
+ } else if(DRAGDROPEVENT.equals(eventType)) {
+ // calls when drop event occure
getEditorDomEventListener().dragDrop(domEvent);
domEvent.stopPropagation();
domEvent.preventDefault();
- } else if(DRAGENTEREVENT.equals(domEvent.getType())) {
+ } else if(DRAGENTEREVENT.equals(eventType)) {
//just ignore this event
- } else if(DRAGEXITEVENT.equals(domEvent.getType())) {
+ } else if(DRAGEXITEVENT.equals(eventType)) {
//just ignore this event
- } else if(DRAGOVEREVENT.equals(domEvent.getType())) {
-
- getEditorDomEventListener().dragOver(domEvent);
- }
- if(getEditorDomEventListener()!=null) {
- getEditorDomEventListener().onRefresh();
+ } else if(DRAGOVEREVENT.equals(eventType)) {
+ getEditorDomEventListener().dragOver(domEvent);
}
-
+ getEditorDomEventListener().onRefresh();
+ }
}
-
+
/* (non-Javadoc)
* @see
org.mozilla.interfaces.nsISelectionListener#notifySelectionChanged(org.mozilla.interfaces.nsIDOMDocument,
org.mozilla.interfaces.nsISelection, short)
*/
@@ -193,5 +178,4 @@
editorDomEventListener.notifySelectionChanged(domDocument, selection, reason);
}
}
-
}