1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Eclipse Public License, Version 1.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.eclipse.org/org/documents/epl-v10.php 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.ide.eclipse.adt.internal.editors.layout.gle2; 18 19 import com.android.ide.common.api.Point; 20 21 import org.eclipse.swt.dnd.DragSourceEvent; 22 import org.eclipse.swt.dnd.DragSourceListener; 23 import org.eclipse.swt.events.MouseEvent; 24 import org.eclipse.swt.events.MouseListener; 25 26 /** 27 * A {@link LayoutPoint} is a coordinate in the Android canvas (in other words, 28 * it may differ from the canvas control mouse coordinate because the canvas may 29 * be zoomed and scrolled.) 30 */ 31 public final class LayoutPoint { 32 /** Containing canvas which the point is relative to. */ 33 private final LayoutCanvas mCanvas; 34 35 /** The X coordinate of the canvas coordinate. */ 36 public final int x; 37 38 /** The Y coordinate of the canvas coordinate. */ 39 public final int y; 40 41 /** 42 * Constructs a new {@link LayoutPoint} from the given event. The event 43 * must be from a {@link MouseListener} associated with the 44 * {@link LayoutCanvas} such that the {@link MouseEvent#x} and 45 * {@link MouseEvent#y} fields are relative to the canvas. 46 * 47 * @param canvas The {@link LayoutCanvas} this point is within. 48 * @param event The mouse event to construct the {@link LayoutPoint} 49 * from. 50 * @return A {@link LayoutPoint} which corresponds to the given 51 * {@link MouseEvent}. 52 */ 53 public static LayoutPoint create(LayoutCanvas canvas, MouseEvent event) { 54 // The mouse event coordinates should already be relative to the canvas 55 // widget. 56 assert event.widget == canvas : event.widget; 57 return ControlPoint.create(canvas, event).toLayout(); 58 } 59 60 /** 61 * Constructs a new {@link LayoutPoint} from the given event. The event 62 * must be from a {@link DragSourceListener} associated with the 63 * {@link LayoutCanvas} such that the {@link DragSourceEvent#x} and 64 * {@link DragSourceEvent#y} fields are relative to the canvas. 65 * 66 * @param canvas The {@link LayoutCanvas} this point is within. 67 * @param event The mouse event to construct the {@link LayoutPoint} 68 * from. 69 * @return A {@link LayoutPoint} which corresponds to the given 70 * {@link DragSourceEvent}. 71 */ 72 public static LayoutPoint create(LayoutCanvas canvas, DragSourceEvent event) { 73 // The drag source event coordinates should already be relative to the 74 // canvas widget. 75 return ControlPoint.create(canvas, event).toLayout(); 76 } 77 78 /** 79 * Constructs a new {@link LayoutPoint} from the given x,y coordinates. 80 * 81 * @param canvas The {@link LayoutCanvas} this point is within. 82 * @param x The mouse event x coordinate relative to the canvas 83 * @param y The mouse event x coordinate relative to the canvas 84 * @return A {@link LayoutPoint} which corresponds to the given 85 * layout coordinates. 86 */ 87 public static LayoutPoint create(LayoutCanvas canvas, int x, int y) { 88 return new LayoutPoint(canvas, x, y); 89 } 90 91 /** 92 * Constructs a new {@link LayoutPoint} with the given X and Y coordinates. 93 * 94 * @param canvas The canvas which contains this coordinate 95 * @param x The canvas X coordinate 96 * @param y The canvas Y coordinate 97 */ 98 private LayoutPoint(LayoutCanvas canvas, int x, int y) { 99 mCanvas = canvas; 100 this.x = x; 101 this.y = y; 102 } 103 104 /** 105 * Returns the equivalent {@link ControlPoint} to this 106 * {@link LayoutPoint}. 107 * 108 * @return The equivalent {@link ControlPoint} to this 109 * {@link LayoutPoint} 110 */ 111 public ControlPoint toControl() { 112 int cx = mCanvas.getHorizontalTransform().translate(x); 113 int cy = mCanvas.getVerticalTransform().translate(y); 114 115 return ControlPoint.create(mCanvas, cx, cy); 116 } 117 118 /** 119 * Returns this {@link LayoutPoint} as a {@link Point}, in the same coordinate space. 120 * 121 * @return a new {@link Point} in the same coordinate space 122 */ 123 public Point toPoint() { 124 return new Point(x, y); 125 } 126 127 @Override 128 public String toString() { 129 return "LayoutPoint [x=" + x + ", y=" + y + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 130 } 131 132 @Override 133 public int hashCode() { 134 final int prime = 31; 135 int result = 1; 136 result = prime * result + x; 137 result = prime * result + y; 138 return result; 139 } 140 141 @Override 142 public boolean equals(Object obj) { 143 if (this == obj) 144 return true; 145 if (obj == null) 146 return false; 147 if (getClass() != obj.getClass()) 148 return false; 149 LayoutPoint other = (LayoutPoint) obj; 150 if (x != other.x) 151 return false; 152 if (y != other.y) 153 return false; 154 return true; 155 } 156 } 157