• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 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.ResizePolicy;
20 import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditor;
21 import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeProxy;
22 import com.android.ide.eclipse.adt.internal.editors.layout.gre.ViewMetadataRepository;
23 import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;
24 
25 import org.eclipse.swt.graphics.Rectangle;
26 import org.w3c.dom.Node;
27 
28 import java.util.ArrayList;
29 import java.util.List;
30 
31 /**
32  * Represents one selection in {@link LayoutCanvas}.
33  */
34 class SelectionItem {
35 
36     /** The associated {@link LayoutCanvas} */
37     private LayoutCanvas mCanvas;
38 
39     /** Current selected view info. Can be null. */
40     private final CanvasViewInfo mCanvasViewInfo;
41 
42     /** Current selection border rectangle. Null when mCanvasViewInfo is null . */
43     private final Rectangle mRect;
44 
45     /** The node proxy for drawing the selection. Null when mCanvasViewInfo is null. */
46     private final NodeProxy mNodeProxy;
47 
48     /** The resize policy for this selection item */
49     private ResizePolicy mResizePolicy;
50 
51     /** The selection handles for this item */
52     private SelectionHandles mHandles;
53 
54     /**
55      * Creates a new {@link SelectionItem} object.
56      * @param canvas the associated canvas
57      * @param canvasViewInfo The view info being selected. Must not be null.
58      */
SelectionItem(LayoutCanvas canvas, CanvasViewInfo canvasViewInfo)59     public SelectionItem(LayoutCanvas canvas, CanvasViewInfo canvasViewInfo) {
60         assert canvasViewInfo != null;
61 
62         mCanvas = canvas;
63         mCanvasViewInfo = canvasViewInfo;
64 
65         if (canvasViewInfo == null) {
66             mRect = null;
67             mNodeProxy = null;
68         } else {
69             Rectangle r = canvasViewInfo.getSelectionRect();
70             mRect = new Rectangle(r.x, r.y, r.width, r.height);
71             mNodeProxy = mCanvas.getNodeFactory().create(canvasViewInfo);
72         }
73     }
74 
75     /**
76      * Returns true when this selection item represents the root, the top level
77      * layout element in the editor.
78      *
79      * @return True if and only if this element is at the root of the hierarchy
80      */
isRoot()81     public boolean isRoot() {
82         return mCanvasViewInfo.isRoot();
83     }
84 
85     /**
86      * Returns true if this item represents a widget that should not be manipulated by the
87      * user.
88      *
89      * @return True if this widget should not be manipulated directly by the user
90      */
isHidden()91     public boolean isHidden() {
92         return mCanvasViewInfo.isHidden();
93     }
94 
95     /**
96      * Returns the selected view info. Cannot be null.
97      *
98      * @return the selected view info. Cannot be null.
99      */
getViewInfo()100     public CanvasViewInfo getViewInfo() {
101         return mCanvasViewInfo;
102     }
103 
104     /**
105      * Returns the selection border rectangle. Cannot be null.
106      *
107      * @return the selection border rectangle, never null
108      */
getRect()109     public Rectangle getRect() {
110         return mRect;
111     }
112 
113     /** Returns the node associated with this selection (may be null) */
getNode()114     NodeProxy getNode() {
115         return mNodeProxy;
116     }
117 
118     /** Returns the canvas associated with this selection (never null) */
getCanvas()119     LayoutCanvas getCanvas() {
120         return mCanvas;
121     }
122 
123     //----
124 
125     /**
126      * Gets the XML text from the given selection for a text transfer.
127      * The returned string can be empty but not null.
128      */
getAsText(LayoutCanvas canvas, List<SelectionItem> selection)129     static String getAsText(LayoutCanvas canvas, List<SelectionItem> selection) {
130         StringBuilder sb = new StringBuilder();
131 
132         LayoutEditor layoutEditor = canvas.getLayoutEditor();
133         for (SelectionItem cs : selection) {
134             CanvasViewInfo vi = cs.getViewInfo();
135             UiViewElementNode key = vi.getUiViewNode();
136             Node node = key.getXmlNode();
137             String t = layoutEditor.getXmlText(node);
138             if (t != null) {
139                 if (sb.length() > 0) {
140                     sb.append('\n');
141                 }
142                 sb.append(t);
143             }
144         }
145 
146         return sb.toString();
147     }
148 
149     /**
150      * Returns elements representing the given selection of canvas items.
151      *
152      * @param items Items to wrap in elements
153      * @return An array of wrapper elements. Never null.
154      */
getAsElements(List<SelectionItem> items)155     static SimpleElement[] getAsElements(List<SelectionItem> items) {
156         ArrayList<SimpleElement> elements = new ArrayList<SimpleElement>();
157 
158         for (SelectionItem cs : items) {
159             CanvasViewInfo vi = cs.getViewInfo();
160 
161             SimpleElement e = vi.toSimpleElement();
162             elements.add(e);
163         }
164 
165         return elements.toArray(new SimpleElement[elements.size()]);
166     }
167 
168     /**
169      * Returns true if this selection item is a layout
170      *
171      * @return true if this selection item is a layout
172      */
isLayout()173     public boolean isLayout() {
174         UiViewElementNode node = mCanvasViewInfo.getUiViewNode();
175         if (node != null) {
176             return node.getDescriptor().hasChildren();
177         } else {
178             return false;
179         }
180     }
181 
182     /**
183      * Returns the {@link SelectionHandles} for this {@link SelectionItem}. Never null.
184      *
185      * @return the {@link SelectionHandles} for this {@link SelectionItem}, never null
186      */
getSelectionHandles()187     public SelectionHandles getSelectionHandles() {
188         if (mHandles == null) {
189             mHandles = new SelectionHandles(this);
190         }
191 
192         return mHandles;
193     }
194 
195     /**
196      * Returns the {@link ResizePolicy} for this item
197      *
198      * @return the {@link ResizePolicy} for this item, never null
199      */
getResizePolicy()200     public ResizePolicy getResizePolicy() {
201         if (mResizePolicy == null && mNodeProxy != null) {
202             mResizePolicy = ViewMetadataRepository.get().getResizePolicy(mNodeProxy.getFqcn());
203         }
204 
205         return mResizePolicy;
206     }
207 }
208