| /* |
| * Copyright (C) 2009 The Android Open Source Project |
| * |
| * Licensed under the Eclipse Public License, Version 1.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.eclipse.org/org/documents/epl-v10.php |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.ide.eclipse.adt.internal.editors.layout.gle2; |
| |
| import com.android.annotations.NonNull; |
| import com.android.annotations.Nullable; |
| import com.android.ide.common.api.ResizePolicy; |
| import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate; |
| import com.android.ide.eclipse.adt.internal.editors.layout.gre.NodeProxy; |
| import com.android.ide.eclipse.adt.internal.editors.layout.gre.ViewMetadataRepository; |
| import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode; |
| |
| import org.eclipse.swt.graphics.Rectangle; |
| import org.w3c.dom.Node; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| /** |
| * Represents one selection in {@link LayoutCanvas}. |
| */ |
| class SelectionItem { |
| |
| /** The associated {@link LayoutCanvas} */ |
| private LayoutCanvas mCanvas; |
| |
| /** Current selected view info. Can be null. */ |
| private final CanvasViewInfo mCanvasViewInfo; |
| |
| /** Current selection border rectangle. Null when mCanvasViewInfo is null . */ |
| private final Rectangle mRect; |
| |
| /** The node proxy for drawing the selection. Null when mCanvasViewInfo is null. */ |
| private final NodeProxy mNodeProxy; |
| |
| /** The resize policy for this selection item */ |
| private ResizePolicy mResizePolicy; |
| |
| /** The selection handles for this item */ |
| private SelectionHandles mHandles; |
| |
| /** |
| * Creates a new {@link SelectionItem} object. |
| * @param canvas the associated canvas |
| * @param canvasViewInfo The view info being selected. Must not be null. |
| */ |
| public SelectionItem(LayoutCanvas canvas, CanvasViewInfo canvasViewInfo) { |
| assert canvasViewInfo != null; |
| |
| mCanvas = canvas; |
| mCanvasViewInfo = canvasViewInfo; |
| |
| if (canvasViewInfo == null) { |
| mRect = null; |
| mNodeProxy = null; |
| } else { |
| Rectangle r = canvasViewInfo.getSelectionRect(); |
| mRect = new Rectangle(r.x, r.y, r.width, r.height); |
| mNodeProxy = mCanvas.getNodeFactory().create(canvasViewInfo); |
| } |
| } |
| |
| /** |
| * Returns true when this selection item represents the root, the top level |
| * layout element in the editor. |
| * |
| * @return True if and only if this element is at the root of the hierarchy |
| */ |
| public boolean isRoot() { |
| return mCanvasViewInfo.isRoot(); |
| } |
| |
| /** |
| * Returns true if this item represents a widget that should not be manipulated by the |
| * user. |
| * |
| * @return True if this widget should not be manipulated directly by the user |
| */ |
| public boolean isHidden() { |
| return mCanvasViewInfo.isHidden(); |
| } |
| |
| /** |
| * Returns the selected view info. Cannot be null. |
| * |
| * @return the selected view info. Cannot be null. |
| */ |
| @NonNull |
| public CanvasViewInfo getViewInfo() { |
| return mCanvasViewInfo; |
| } |
| |
| /** |
| * Returns the selected node. |
| * |
| * @return the selected node, or null |
| */ |
| @Nullable |
| public UiViewElementNode getUiNode() { |
| return mCanvasViewInfo.getUiViewNode(); |
| } |
| |
| /** |
| * Returns the selection border rectangle. Cannot be null. |
| * |
| * @return the selection border rectangle, never null |
| */ |
| public Rectangle getRect() { |
| return mRect; |
| } |
| |
| /** Returns the node associated with this selection (may be null) */ |
| @Nullable |
| NodeProxy getNode() { |
| return mNodeProxy; |
| } |
| |
| /** Returns the canvas associated with this selection (never null) */ |
| @NonNull |
| LayoutCanvas getCanvas() { |
| return mCanvas; |
| } |
| |
| //---- |
| |
| /** |
| * Gets the XML text from the given selection for a text transfer. |
| * The returned string can be empty but not null. |
| */ |
| @NonNull |
| static String getAsText(LayoutCanvas canvas, List<SelectionItem> selection) { |
| StringBuilder sb = new StringBuilder(); |
| |
| LayoutEditorDelegate layoutEditorDelegate = canvas.getEditorDelegate(); |
| for (SelectionItem cs : selection) { |
| CanvasViewInfo vi = cs.getViewInfo(); |
| UiViewElementNode key = vi.getUiViewNode(); |
| Node node = key.getXmlNode(); |
| String t = layoutEditorDelegate.getEditor().getXmlText(node); |
| if (t != null) { |
| if (sb.length() > 0) { |
| sb.append('\n'); |
| } |
| sb.append(t); |
| } |
| } |
| |
| return sb.toString(); |
| } |
| |
| /** |
| * Returns elements representing the given selection of canvas items. |
| * |
| * @param items Items to wrap in elements |
| * @return An array of wrapper elements. Never null. |
| */ |
| @NonNull |
| static SimpleElement[] getAsElements(@NonNull List<SelectionItem> items) { |
| return getAsElements(items, null); |
| } |
| |
| /** |
| * Returns elements representing the given selection of canvas items. |
| * |
| * @param items Items to wrap in elements |
| * @param primary The primary selected item which should be listed first |
| * @return An array of wrapper elements. Never null. |
| */ |
| @NonNull |
| static SimpleElement[] getAsElements( |
| @NonNull List<SelectionItem> items, |
| @Nullable SelectionItem primary) { |
| List<SimpleElement> elements = new ArrayList<SimpleElement>(); |
| |
| if (primary != null) { |
| CanvasViewInfo vi = primary.getViewInfo(); |
| SimpleElement e = vi.toSimpleElement(); |
| e.setSelectionItem(primary); |
| elements.add(e); |
| } |
| |
| for (SelectionItem cs : items) { |
| if (cs == primary) { |
| // Already handled |
| continue; |
| } |
| |
| CanvasViewInfo vi = cs.getViewInfo(); |
| SimpleElement e = vi.toSimpleElement(); |
| e.setSelectionItem(cs); |
| elements.add(e); |
| } |
| |
| return elements.toArray(new SimpleElement[elements.size()]); |
| } |
| |
| /** |
| * Returns true if this selection item is a layout |
| * |
| * @return true if this selection item is a layout |
| */ |
| public boolean isLayout() { |
| UiViewElementNode node = mCanvasViewInfo.getUiViewNode(); |
| if (node != null) { |
| return node.getDescriptor().hasChildren(); |
| } else { |
| return false; |
| } |
| } |
| |
| /** |
| * Returns the {@link SelectionHandles} for this {@link SelectionItem}. Never null. |
| * |
| * @return the {@link SelectionHandles} for this {@link SelectionItem}, never null |
| */ |
| @NonNull |
| public SelectionHandles getSelectionHandles() { |
| if (mHandles == null) { |
| mHandles = new SelectionHandles(this); |
| } |
| |
| return mHandles; |
| } |
| |
| /** |
| * Returns the {@link ResizePolicy} for this item |
| * |
| * @return the {@link ResizePolicy} for this item, never null |
| */ |
| @NonNull |
| public ResizePolicy getResizePolicy() { |
| if (mResizePolicy == null && mNodeProxy != null) { |
| mResizePolicy = ViewMetadataRepository.get().getResizePolicy(mNodeProxy.getFqcn()); |
| } |
| |
| return mResizePolicy; |
| } |
| } |