Author: yradtsevich
Date: 2010-09-27 10:14:32 -0400 (Mon, 27 Sep 2010)
New Revision: 25232
Added:
trunk/jsf/tests/org.jboss.tools.jsf.vpe.jsf.test/resources/jsfTest/WebContent/pages/JBIDE/7153/
trunk/jsf/tests/org.jboss.tools.jsf.vpe.jsf.test/resources/jsfTest/WebContent/pages/JBIDE/7153/getElementBounds.html
trunk/jsf/tests/org.jboss.tools.jsf.vpe.jsf.test/src/org/jboss/tools/jsf/vpe/jsf/test/jbide/XulRunnerVpeUtilsTest.java
Modified:
trunk/vpe/plugins/org.jboss.tools.vpe.xulrunner/src/org/jboss/tools/vpe/xulrunner/util/XulRunnerVpeUtils.java
Log:
JBIDE-7153
https://jira.jboss.org/browse/JBIDE-7153 :
Odd drop targets during DnD in VPE
- fixed
- JUnits created
Added:
trunk/jsf/tests/org.jboss.tools.jsf.vpe.jsf.test/resources/jsfTest/WebContent/pages/JBIDE/7153/getElementBounds.html
===================================================================
---
trunk/jsf/tests/org.jboss.tools.jsf.vpe.jsf.test/resources/jsfTest/WebContent/pages/JBIDE/7153/getElementBounds.html
(rev 0)
+++
trunk/jsf/tests/org.jboss.tools.jsf.vpe.jsf.test/resources/jsfTest/WebContent/pages/JBIDE/7153/getElementBounds.html 2010-09-27
14:14:32 UTC (rev 25232)
@@ -0,0 +1,35 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head id="head-1">
+<meta http-equiv="Content-Type" content="text/html;
charset=ISO-8859-1">
+<title>Insert title here</title>
+<style type="text/css">
+.classA, .classB {
+ padding: 7px;
+ border-width: 11px;
+ border-style: solid;
+ margin: 13px;
+}
+.classA {
+ background-color: pink;
+ border-color: lightblue;
+ width: 3000px;
+ height: 2000px;
+}
+.classB {
+ background-color: yellow;
+ border-color: orange;
+ width: 150px;
+ height: 100px;
+}
+</style>
+</head>
+<body>
+ <div id="outerDiv" class="classA">
+ <span id="span1">Test Text</span>
+ <div id="innerDiv" class="classB">
+ Text
+ </div>
+ </div>
+</body>
+</html>
\ No newline at end of file
Added:
trunk/jsf/tests/org.jboss.tools.jsf.vpe.jsf.test/src/org/jboss/tools/jsf/vpe/jsf/test/jbide/XulRunnerVpeUtilsTest.java
===================================================================
---
trunk/jsf/tests/org.jboss.tools.jsf.vpe.jsf.test/src/org/jboss/tools/jsf/vpe/jsf/test/jbide/XulRunnerVpeUtilsTest.java
(rev 0)
+++
trunk/jsf/tests/org.jboss.tools.jsf.vpe.jsf.test/src/org/jboss/tools/jsf/vpe/jsf/test/jbide/XulRunnerVpeUtilsTest.java 2010-09-27
14:14:32 UTC (rev 25232)
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2007-2009 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.jsf.vpe.jsf.test.jbide;
+
+import java.text.MessageFormat;
+
+import org.eclipse.swt.graphics.Rectangle;
+import org.jboss.tools.jsf.vpe.jsf.test.JsfAllTests;
+import org.jboss.tools.vpe.editor.VpeController;
+import org.jboss.tools.vpe.ui.test.VpeTest;
+import org.jboss.tools.vpe.xulrunner.util.XulRunnerVpeUtils;
+import org.mozilla.interfaces.nsIDOMElement;
+
+/**
+ * Tests for {@link XulRunnerVpeUtils} class.
+ *
+ * @author Yahor Radtsevich (yradtsevich)
+ * @see <a
href="https://jira.jboss.org/browse/JBIDE-7153">JBIDE-7153&l...
+ */
+public class XulRunnerVpeUtilsTest extends VpeTest {
+ private static final String THE_Y_POSITION_IS_WRONG = "The y position of {0} is
wrong"; //$NON-NLS-1$
+ private static final String THE_X_POSITION_IS_WRONG = "The x position of {0} is
wrong"; //$NON-NLS-1$
+ private static final String THE_HEIGHT_IS_WRONG = "The height of {0} is
wrong"; //$NON-NLS-1$
+ private static final String THE_WIDTH_IS_WRONG = "The width of {0} is wrong";
//$NON-NLS-1$
+ private static final String SPAN1_ID = "span1"; //$NON-NLS-1$
+ private static final String INNER_DIV_ID = "innerDiv"; //$NON-NLS-1$
+ private static final String OUTER_DIV_ID = "outerDiv"; //$NON-NLS-1$
+ private static final int DIV_MARGIN = 13;
+ private static final int DIV_PADDING = 7;
+ private static final int DIV_BORDER_WIDTH = 11;
+ private static final int OUTER_DIV_HEIGHT = 2000;
+ private static final int OUTER_DIV_WIDTH = 3000;
+ private static final String TEST_FILE_PATH
+ = "JBIDE/7153/getElementBounds.html"; //$NON-NLS-1$
+ private VpeController vpeController;
+
+ public XulRunnerVpeUtilsTest(String name) {
+ super(name);
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ vpeController = openInVpe(JsfAllTests.IMPORT_PROJECT_NAME,
+ TEST_FILE_PATH);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+ // JUNIT TESTING METHODS
+ public void testGetElementBounds() {
+ Rectangle outerDivSize = XulRunnerVpeUtils.getElementBounds(
+ getElementById(OUTER_DIV_ID));
+ assertEquals(MessageFormat.format(THE_WIDTH_IS_WRONG, OUTER_DIV_ID),
+ OUTER_DIV_WIDTH + DIV_BORDER_WIDTH * 2 + DIV_PADDING * 2,
+ outerDivSize.width);
+ assertEquals(MessageFormat.format(THE_HEIGHT_IS_WRONG, OUTER_DIV_ID),
+ OUTER_DIV_HEIGHT + DIV_BORDER_WIDTH * 2 + DIV_PADDING * 2,
+ outerDivSize.height);
+
+ Rectangle innerDivSize = XulRunnerVpeUtils.getElementBounds(
+ getElementById(INNER_DIV_ID));
+ assertEquals(MessageFormat.format(THE_WIDTH_IS_WRONG, INNER_DIV_ID),
+ 150 + DIV_BORDER_WIDTH * 2 + DIV_PADDING * 2,
+ innerDivSize.width);
+ assertEquals(MessageFormat.format(THE_HEIGHT_IS_WRONG, INNER_DIV_ID),
+ 100 + DIV_BORDER_WIDTH * 2 + DIV_PADDING * 2,
+ innerDivSize.height);
+
+ Rectangle span1Size = XulRunnerVpeUtils.getElementBounds(
+ getElementById(SPAN1_ID));
+ assertTrue(MessageFormat.format(THE_X_POSITION_IS_WRONG, SPAN1_ID),
+ span1Size.x >= DIV_PADDING + DIV_BORDER_WIDTH + DIV_MARGIN);
+ assertTrue(MessageFormat.format(THE_Y_POSITION_IS_WRONG, SPAN1_ID),
+ span1Size.y >= DIV_PADDING + DIV_BORDER_WIDTH + DIV_MARGIN);
+ assertTrue(MessageFormat.format(THE_HEIGHT_IS_WRONG, SPAN1_ID),
+ span1Size.height > 0);
+ assertTrue(MessageFormat.format(THE_WIDTH_IS_WRONG, SPAN1_ID),
+ span1Size.width > 0);
+
+ }
+
+ public nsIDOMElement getElementById(String id) {
+ return vpeController.getXulRunnerEditor()
+ .getDOMDocument().getElementById(id);
+ }
+}
Modified:
trunk/vpe/plugins/org.jboss.tools.vpe.xulrunner/src/org/jboss/tools/vpe/xulrunner/util/XulRunnerVpeUtils.java
===================================================================
---
trunk/vpe/plugins/org.jboss.tools.vpe.xulrunner/src/org/jboss/tools/vpe/xulrunner/util/XulRunnerVpeUtils.java 2010-09-27
14:04:18 UTC (rev 25231)
+++
trunk/vpe/plugins/org.jboss.tools.vpe.xulrunner/src/org/jboss/tools/vpe/xulrunner/util/XulRunnerVpeUtils.java 2010-09-27
14:14:32 UTC (rev 25232)
@@ -13,10 +13,13 @@
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.xulrunner.BrowserPlugin;
import org.jboss.tools.vpe.xulrunner.editor.XulRunnerConstants;
import org.mozilla.interfaces.nsIDOMCSSStyleDeclaration;
+import org.mozilla.interfaces.nsIDOMClientRect;
+import org.mozilla.interfaces.nsIDOMClientRectList;
import org.mozilla.interfaces.nsIDOMDocument;
import org.mozilla.interfaces.nsIDOMElement;
import org.mozilla.interfaces.nsIDOMElementCSSInlineStyle;
@@ -139,67 +142,73 @@
return element;
}
- private static int findPosX(nsIDOMNSHTMLElement boxObject) {
- int curleft = 0;
+
+ private static Point getDocumentPos(nsIDOMNSHTMLElement boxElement) {
+ int x = 0;
+ int y = 0;
+ nsIDOMNSHTMLElement curBoxElement = boxElement;
+ while (curBoxElement != null) {
+ x += curBoxElement.getOffsetLeft();
+ y += curBoxElement.getOffsetTop();
+ curBoxElement = getOffsetParent(curBoxElement);
+ }
- if (boxObject.getOffsetParent() != null) {
- while (true) {
- curleft += boxObject.getOffsetLeft();
- if ( boxObject.getOffsetParent() == null)
- return curleft;
- boxObject = queryInterface(boxObject.getOffsetParent(), nsIDOMNSHTMLElement.class);
- }
- } else {
- curleft += boxObject.getOffsetLeft();
- }
- return curleft;
+ return new Point(x, y);
}
- private static int findPosY(nsIDOMNSHTMLElement boxObject) {
- int curleft = 0;
-
- if (boxObject.getOffsetParent() != null) {
- while (true) {
- curleft += boxObject.getOffsetTop();
- if ( boxObject.getOffsetParent() == null)
- return curleft;
- boxObject = queryInterface(boxObject.getOffsetParent(), nsIDOMNSHTMLElement.class);
- }
+ private static nsIDOMNSHTMLElement getOffsetParent(
+ nsIDOMNSHTMLElement boxElement) {
+ nsIDOMElement offsetParent = boxElement.getOffsetParent();
+ if (offsetParent != null) {
+ return queryInterface(offsetParent, nsIDOMNSHTMLElement.class);
} else {
- curleft += boxObject.getOffsetTop();
+ return null;
}
- return curleft;
}
+
+ private static Point getClientSize(nsIDOMNSElement element) {
+ int width = 0;
+ int height = 0;
+ nsIDOMClientRectList clientRects = element.getClientRects();
+ if (clientRects.getLength() > 0) {
+ nsIDOMClientRect firstRect = clientRects.item(0);
+ width = (int) firstRect.getWidth();
+ height = (int) firstRect.getHeight();
+ }
+
+ return new Point(width, height);
+ }
/**
* @param domElement
* @return Rectangle
*/
- static public Rectangle getElementBounds(nsIDOMNode domNode) {
+ static public Rectangle getElementBounds(nsIDOMNode node) {
try {
- nsIDOMNSElement htmlElement = queryInterface(domNode, nsIDOMNSElement.class);
- nsIDOMNSHTMLElement domNSHTMLElement = queryInterface(domNode,
nsIDOMNSHTMLElement.class);
- Rectangle rectangle = new Rectangle(findPosX(domNSHTMLElement),
- findPosY(domNSHTMLElement),
- htmlElement.getClientWidth(),
- htmlElement.getClientHeight());
+ nsIDOMNSElement element = queryInterface(node, nsIDOMNSElement.class);
+ nsIDOMNSHTMLElement htmlElement = queryInterface(node, nsIDOMNSHTMLElement.class);
+ Point documentPos = getDocumentPos(htmlElement);
+ Point clientSize = getClientSize(element);
+ Rectangle rectangle = new Rectangle(documentPos.x, documentPos.y,
+ clientSize.x, clientSize.y);
if (BrowserPlugin.PRINT_ELEMENT_BOUNDS) {
System.out.println("getElementBounds(IDOMNode) returns "
+ rectangle);
System.out
.println("nsIDOMNSHTMLElement
getOffsetLeft,getOffsetTop,getOffsetWidth,getOffsetHeight"
- + new Rectangle(domNSHTMLElement.getOffsetLeft(),
- domNSHTMLElement.getOffsetTop(), domNSHTMLElement
- .getOffsetWidth(), domNSHTMLElement
+ + new Rectangle(htmlElement.getOffsetLeft(),
+ htmlElement.getOffsetTop(), htmlElement
+ .getOffsetWidth(), htmlElement
.getOffsetHeight()));
System.out
.println("nsIDOMNSElement
getClientLeft,getClientTop,getClientWidth,getClientHeight"
- + new Rectangle(htmlElement.getClientLeft(),
- htmlElement.getClientTop(), htmlElement
- .getClientWidth(), htmlElement
+ + new Rectangle(element.getClientLeft(),
+ element.getClientTop(), element
+ .getClientWidth(), element
.getClientHeight()));
}
+
return rectangle;
} catch (XPCOMException xpcomException) {