1429ae88878cf781753d8261d350ad89fe5864169Tor Norbye/* 2429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * Copyright (C) 2011 The Android Open Source Project 3429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * 4429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * Licensed under the Eclipse Public License, Version 1.0 (the "License"); 5429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * you may not use this file except in compliance with the License. 6429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * You may obtain a copy of the License at 7429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * 8429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * http://www.eclipse.org/org/documents/epl-v10.php 9429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * 10429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * Unless required by applicable law or agreed to in writing, software 11429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * distributed under the License is distributed on an "AS IS" BASIS, 12429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * See the License for the specific language governing permissions and 14429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * limitations under the License. 15429ae88878cf781753d8261d350ad89fe5864169Tor Norbye */ 16429ae88878cf781753d8261d350ad89fe5864169Tor Norbye 17429ae88878cf781753d8261d350ad89fe5864169Tor Norbyepackage com.android.ide.eclipse.adt.internal.editors.layout.gle2; 18429ae88878cf781753d8261d350ad89fe5864169Tor Norbye 190595b4123048f53179b5c2c65cf88968ac488ad3Tor Norbyeimport com.android.ide.common.api.Margins; 20429ae88878cf781753d8261d350ad89fe5864169Tor Norbyeimport com.android.ide.common.api.Rect; 21429ae88878cf781753d8261d350ad89fe5864169Tor Norbyeimport com.android.ide.common.api.ResizePolicy; 22429ae88878cf781753d8261d350ad89fe5864169Tor Norbyeimport com.android.ide.eclipse.adt.internal.editors.layout.gle2.SelectionHandle.Position; 23429ae88878cf781753d8261d350ad89fe5864169Tor Norbyeimport com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeProxy; 24429ae88878cf781753d8261d350ad89fe5864169Tor Norbye 25429ae88878cf781753d8261d350ad89fe5864169Tor Norbyeimport java.util.ArrayList; 26429ae88878cf781753d8261d350ad89fe5864169Tor Norbyeimport java.util.Collections; 27429ae88878cf781753d8261d350ad89fe5864169Tor Norbyeimport java.util.Iterator; 28429ae88878cf781753d8261d350ad89fe5864169Tor Norbyeimport java.util.List; 29429ae88878cf781753d8261d350ad89fe5864169Tor Norbye 30429ae88878cf781753d8261d350ad89fe5864169Tor Norbye/** 31429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * The {@link SelectionHandles} of a {@link SelectionItem} are the set of 32429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * {@link SelectionHandle} objects (possibly empty, for non-resizable objects) the user 33429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * can manipulate to resize a widget. 34429ae88878cf781753d8261d350ad89fe5864169Tor Norbye */ 35429ae88878cf781753d8261d350ad89fe5864169Tor Norbyepublic class SelectionHandles implements Iterable<SelectionHandle> { 36429ae88878cf781753d8261d350ad89fe5864169Tor Norbye private final SelectionItem mItem; 37429ae88878cf781753d8261d350ad89fe5864169Tor Norbye private List<SelectionHandle> mHandles; 38429ae88878cf781753d8261d350ad89fe5864169Tor Norbye 39429ae88878cf781753d8261d350ad89fe5864169Tor Norbye /** 40429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * Constructs a new {@link SelectionHandles} object for the given {link 41429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * {@link SelectionItem} 42429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * @param item the item to create {@link SelectionHandles} for 43429ae88878cf781753d8261d350ad89fe5864169Tor Norbye */ 44429ae88878cf781753d8261d350ad89fe5864169Tor Norbye public SelectionHandles(SelectionItem item) { 45429ae88878cf781753d8261d350ad89fe5864169Tor Norbye mItem = item; 46429ae88878cf781753d8261d350ad89fe5864169Tor Norbye 470595b4123048f53179b5c2c65cf88968ac488ad3Tor Norbye createHandles(item.getCanvas()); 48429ae88878cf781753d8261d350ad89fe5864169Tor Norbye } 49429ae88878cf781753d8261d350ad89fe5864169Tor Norbye 50429ae88878cf781753d8261d350ad89fe5864169Tor Norbye /** 51429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * Find a specific {@link SelectionHandle} from this set of {@link SelectionHandles}, 52429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * which is within the given distance (in layout coordinates) from the center of the 53429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * {@link SelectionHandle}. 54429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * 55429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * @param point the mouse position (in layout coordinates) to test 56429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * @param distance the maximum distance from the handle center to accept 57429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * @return a {@link SelectionHandle} under the point, or null if not found 58429ae88878cf781753d8261d350ad89fe5864169Tor Norbye */ 59429ae88878cf781753d8261d350ad89fe5864169Tor Norbye public SelectionHandle findHandle(LayoutPoint point, int distance) { 60429ae88878cf781753d8261d350ad89fe5864169Tor Norbye for (SelectionHandle handle : mHandles) { 61429ae88878cf781753d8261d350ad89fe5864169Tor Norbye if (handle.contains(point, distance)) { 62429ae88878cf781753d8261d350ad89fe5864169Tor Norbye return handle; 63429ae88878cf781753d8261d350ad89fe5864169Tor Norbye } 64429ae88878cf781753d8261d350ad89fe5864169Tor Norbye } 65429ae88878cf781753d8261d350ad89fe5864169Tor Norbye 66429ae88878cf781753d8261d350ad89fe5864169Tor Norbye return null; 67429ae88878cf781753d8261d350ad89fe5864169Tor Norbye } 68429ae88878cf781753d8261d350ad89fe5864169Tor Norbye 69429ae88878cf781753d8261d350ad89fe5864169Tor Norbye /** 70429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * Create the {@link SelectionHandle} objects for the selection item, according to its 71429ae88878cf781753d8261d350ad89fe5864169Tor Norbye * {@link ResizePolicy}. 72429ae88878cf781753d8261d350ad89fe5864169Tor Norbye */ 730595b4123048f53179b5c2c65cf88968ac488ad3Tor Norbye private void createHandles(LayoutCanvas canvas) { 74429ae88878cf781753d8261d350ad89fe5864169Tor Norbye NodeProxy selectedNode = mItem.getNode(); 75429ae88878cf781753d8261d350ad89fe5864169Tor Norbye Rect r = selectedNode.getBounds(); 76429ae88878cf781753d8261d350ad89fe5864169Tor Norbye if (!r.isValid()) { 77429ae88878cf781753d8261d350ad89fe5864169Tor Norbye mHandles = Collections.emptyList(); 78429ae88878cf781753d8261d350ad89fe5864169Tor Norbye return; 79429ae88878cf781753d8261d350ad89fe5864169Tor Norbye } 80429ae88878cf781753d8261d350ad89fe5864169Tor Norbye 81429ae88878cf781753d8261d350ad89fe5864169Tor Norbye ResizePolicy resizability = mItem.getResizePolicy(); 82429ae88878cf781753d8261d350ad89fe5864169Tor Norbye if (resizability.isResizable()) { 83429ae88878cf781753d8261d350ad89fe5864169Tor Norbye mHandles = new ArrayList<SelectionHandle>(8); 84429ae88878cf781753d8261d350ad89fe5864169Tor Norbye boolean left = resizability.leftAllowed(); 85429ae88878cf781753d8261d350ad89fe5864169Tor Norbye boolean right = resizability.rightAllowed(); 86429ae88878cf781753d8261d350ad89fe5864169Tor Norbye boolean top = resizability.topAllowed(); 87429ae88878cf781753d8261d350ad89fe5864169Tor Norbye boolean bottom = resizability.bottomAllowed(); 88429ae88878cf781753d8261d350ad89fe5864169Tor Norbye int x1 = r.x; 89429ae88878cf781753d8261d350ad89fe5864169Tor Norbye int y1 = r.y; 90429ae88878cf781753d8261d350ad89fe5864169Tor Norbye int w = r.w; 91429ae88878cf781753d8261d350ad89fe5864169Tor Norbye int h = r.h; 92429ae88878cf781753d8261d350ad89fe5864169Tor Norbye int x2 = x1 + w; 93429ae88878cf781753d8261d350ad89fe5864169Tor Norbye int y2 = y1 + h; 940595b4123048f53179b5c2c65cf88968ac488ad3Tor Norbye 950595b4123048f53179b5c2c65cf88968ac488ad3Tor Norbye Margins insets = canvas.getInsets(mItem.getNode().getFqcn()); 960595b4123048f53179b5c2c65cf88968ac488ad3Tor Norbye if (insets != null) { 970595b4123048f53179b5c2c65cf88968ac488ad3Tor Norbye x1 += insets.left; 980595b4123048f53179b5c2c65cf88968ac488ad3Tor Norbye x2 -= insets.right; 990595b4123048f53179b5c2c65cf88968ac488ad3Tor Norbye y1 += insets.top; 1000595b4123048f53179b5c2c65cf88968ac488ad3Tor Norbye y2 -= insets.bottom; 1010595b4123048f53179b5c2c65cf88968ac488ad3Tor Norbye } 1020595b4123048f53179b5c2c65cf88968ac488ad3Tor Norbye 103429ae88878cf781753d8261d350ad89fe5864169Tor Norbye int mx = (x1 + x2) / 2; 104429ae88878cf781753d8261d350ad89fe5864169Tor Norbye int my = (y1 + y2) / 2; 105429ae88878cf781753d8261d350ad89fe5864169Tor Norbye 106429ae88878cf781753d8261d350ad89fe5864169Tor Norbye if (left) { 107429ae88878cf781753d8261d350ad89fe5864169Tor Norbye mHandles.add(new SelectionHandle(x1, my, Position.LEFT_MIDDLE)); 108429ae88878cf781753d8261d350ad89fe5864169Tor Norbye if (top) { 109429ae88878cf781753d8261d350ad89fe5864169Tor Norbye mHandles.add(new SelectionHandle(x1, y1, Position.TOP_LEFT)); 110429ae88878cf781753d8261d350ad89fe5864169Tor Norbye } 111429ae88878cf781753d8261d350ad89fe5864169Tor Norbye if (bottom) { 112429ae88878cf781753d8261d350ad89fe5864169Tor Norbye mHandles.add(new SelectionHandle(x1, y2, Position.BOTTOM_LEFT)); 113429ae88878cf781753d8261d350ad89fe5864169Tor Norbye } 114429ae88878cf781753d8261d350ad89fe5864169Tor Norbye } 115429ae88878cf781753d8261d350ad89fe5864169Tor Norbye if (right) { 116429ae88878cf781753d8261d350ad89fe5864169Tor Norbye mHandles.add(new SelectionHandle(x2, my, Position.RIGHT_MIDDLE)); 117429ae88878cf781753d8261d350ad89fe5864169Tor Norbye if (top) { 118429ae88878cf781753d8261d350ad89fe5864169Tor Norbye mHandles.add(new SelectionHandle(x2, y1, Position.TOP_RIGHT)); 119429ae88878cf781753d8261d350ad89fe5864169Tor Norbye } 120429ae88878cf781753d8261d350ad89fe5864169Tor Norbye if (bottom) { 121429ae88878cf781753d8261d350ad89fe5864169Tor Norbye mHandles.add(new SelectionHandle(x2, y2, Position.BOTTOM_RIGHT)); 122429ae88878cf781753d8261d350ad89fe5864169Tor Norbye } 123429ae88878cf781753d8261d350ad89fe5864169Tor Norbye } 124429ae88878cf781753d8261d350ad89fe5864169Tor Norbye if (top) { 125429ae88878cf781753d8261d350ad89fe5864169Tor Norbye mHandles.add(new SelectionHandle(mx, y1, Position.TOP_MIDDLE)); 126429ae88878cf781753d8261d350ad89fe5864169Tor Norbye } 127429ae88878cf781753d8261d350ad89fe5864169Tor Norbye if (bottom) { 128429ae88878cf781753d8261d350ad89fe5864169Tor Norbye mHandles.add(new SelectionHandle(mx, y2, Position.BOTTOM_MIDDLE)); 129429ae88878cf781753d8261d350ad89fe5864169Tor Norbye } 130429ae88878cf781753d8261d350ad89fe5864169Tor Norbye } else { 131429ae88878cf781753d8261d350ad89fe5864169Tor Norbye mHandles = Collections.emptyList(); 132429ae88878cf781753d8261d350ad89fe5864169Tor Norbye } 133429ae88878cf781753d8261d350ad89fe5864169Tor Norbye } 134429ae88878cf781753d8261d350ad89fe5864169Tor Norbye 135429ae88878cf781753d8261d350ad89fe5864169Tor Norbye // Implements Iterable<SelectionHandle> 136ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye @Override 137429ae88878cf781753d8261d350ad89fe5864169Tor Norbye public Iterator<SelectionHandle> iterator() { 138429ae88878cf781753d8261d350ad89fe5864169Tor Norbye return mHandles.iterator(); 139429ae88878cf781753d8261d350ad89fe5864169Tor Norbye } 140429ae88878cf781753d8261d350ad89fe5864169Tor Norbye} 141