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