aboutsummaryrefslogtreecommitdiffstats
path: root/eclipse/plugins
diff options
context:
space:
mode:
authorRaphael Moll <ralf@android.com>2010-09-13 17:44:18 -0700
committerAndroid Code Review <code-review@android.com>2010-09-13 17:44:18 -0700
commitb337e03d003c48a3ac98fe89233bc0d7c26317de (patch)
tree430f5b9d54de6248f17e4db023a237a4c784f3f8 /eclipse/plugins
parentf79353920132f81e24f47ebddbbf8ecbabbc3135 (diff)
parent681a754db644b092b1d6203d9cf74b01c9b3a629 (diff)
downloadsdk-b337e03d003c48a3ac98fe89233bc0d7c26317de.zip
sdk-b337e03d003c48a3ac98fe89233bc0d7c26317de.tar.gz
sdk-b337e03d003c48a3ac98fe89233bc0d7c26317de.tar.bz2
Merge "ADT: remove GLE1."
Diffstat (limited to 'eclipse/plugins')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/META-INF/MANIFEST.MF2
-rwxr-xr-xeclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/IGraphicalLayoutEditor.java10
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/LayoutEditor.java96
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle1/GraphicalLayoutEditor.java1458
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle1/PaletteFactory.java95
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle1/UiContentOutlinePage.java618
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle1/UiPropertySheetPage.java141
-rwxr-xr-xeclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java23
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/DropFeedback.java778
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/ElementCreateCommand.java100
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/ElementFigure.java81
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/LayoutFigure.java154
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiDocumentEditPart.java214
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiDocumentTreeEditPart.java39
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiElementEditPart.java347
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiElementTreeEditPart.java76
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiElementTreeEditPartFactory.java49
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiElementsEditPartFactory.java68
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiLayoutEditPart.java120
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiLayoutTreeEditPart.java41
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiViewEditPart.java57
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiViewTreeEditPart.java32
22 files changed, 8 insertions, 4591 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/META-INF/MANIFEST.MF b/eclipse/plugins/com.android.ide.eclipse.adt/META-INF/MANIFEST.MF
index 38ef706..93b0871 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/META-INF/MANIFEST.MF
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/META-INF/MANIFEST.MF
@@ -58,10 +58,8 @@ Export-Package: com.android.ide.eclipse.adt;x-friends:="com.android.ide.eclipse.
com.android.ide.eclipse.adt.internal.editors.layout;x-friends:="com.android.ide.eclipse.tests",
com.android.ide.eclipse.adt.internal.editors.layout.configuration;x-friends:="com.android.ide.eclipse.tests",
com.android.ide.eclipse.adt.internal.editors.layout.descriptors;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.layout.gle1;x-friends:="com.android.ide.eclipse.tests",
com.android.ide.eclipse.adt.internal.editors.layout.gle2;x-friends:="com.android.ide.eclipse.tests",
com.android.ide.eclipse.adt.internal.editors.layout.gre;x-friends:="com.android.ide.eclipse.tests",
- com.android.ide.eclipse.adt.internal.editors.layout.parts;x-friends:="com.android.ide.eclipse.tests",
com.android.ide.eclipse.adt.internal.editors.layout.uimodel;x-friends:="com.android.ide.eclipse.tests",
com.android.ide.eclipse.adt.internal.editors.manifest;x-friends:="com.android.ide.eclipse.tests",
com.android.ide.eclipse.adt.internal.editors.manifest.descriptors;x-friends:="com.android.ide.eclipse.tests",
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/IGraphicalLayoutEditor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/IGraphicalLayoutEditor.java
index 3a8e454..c8fd5c8 100755
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/IGraphicalLayoutEditor.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/IGraphicalLayoutEditor.java
@@ -16,9 +16,7 @@
package com.android.ide.eclipse.adt.internal.editors.layout;
-import com.android.ide.eclipse.adt.internal.editors.layout.parts.ElementCreateCommand;
import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
import org.eclipse.core.resources.IFile;
import org.eclipse.gef.ui.parts.SelectionSynchronizer;
@@ -76,14 +74,6 @@ public interface IGraphicalLayoutEditor extends IEditorPart {
abstract void deactivated();
/**
- * Used by LayoutEditor.UiEditorActions.selectUiNode to select a new UI Node
- * created by {@link ElementCreateCommand#execute()}.
- *
- * @param uiNodeModel The {@link UiElementNode} to select.
- */
- abstract void selectModel(UiElementNode uiNodeModel);
-
- /**
* Returns the selection synchronizer object.
* The synchronizer can be used to sync the selection of 2 or more EditPartViewers.
*/
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/LayoutEditor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/LayoutEditor.java
index 0195105..8560fa8 100644
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/LayoutEditor.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/LayoutEditor.java
@@ -25,15 +25,10 @@ import com.android.ide.eclipse.adt.internal.editors.descriptors.IUnknownDescript
import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.CustomViewDescriptorService;
import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.LayoutDescriptors;
import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle1.GraphicalLayoutEditor;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle1.UiContentOutlinePage;
-import com.android.ide.eclipse.adt.internal.editors.layout.gle1.UiPropertySheetPage;
import com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart;
import com.android.ide.eclipse.adt.internal.editors.layout.gle2.OutlinePage2;
import com.android.ide.eclipse.adt.internal.editors.layout.gle2.PropertySheetPage2;
-import com.android.ide.eclipse.adt.internal.editors.ui.tree.UiActions;
import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
import com.android.ide.eclipse.adt.internal.sdk.Sdk;
import com.android.sdklib.IAndroidTarget;
@@ -43,7 +38,6 @@ import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.gef.ui.parts.TreeViewer;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
@@ -74,18 +68,11 @@ public class LayoutEditor extends AndroidXmlEditor implements IShowEditorInput,
private IGraphicalLayoutEditor mGraphicalEditor;
private int mGraphicalEditorIndex;
- /**
- * Implementation of the {@link IContentOutlinePage} for this editor.
- * @deprecated Used for backward compatibility with GLE1.
- */
- private UiContentOutlinePage mOutlineForGle1;
/** Implementation of the {@link IContentOutlinePage} for this editor */
private IContentOutlinePage mOutline;
/** Custom implementation of {@link IPropertySheetPage} for this editor */
private IPropertySheetPage mPropertyPage;
- private UiEditorActions mUiEditorActions;
-
private final HashMap<String, ElementDescriptor> mUnknownDescriptorMap =
new HashMap<String, ElementDescriptor>();
@@ -182,15 +169,8 @@ public class LayoutEditor extends AndroidXmlEditor implements IShowEditorInput,
// the user, or through a configuration change in the configuration selector.)
if (mGraphicalEditor == null) {
- String useGle1 = System.getenv("USE_GLE1"); //$NON-NLS-1$
-
- if (useGle1 != null && !useGle1.equals("0")) { //$NON-NLS-1$
- // If USE_GLE1 exists and is non-zero, use the old GLE v1
- mGraphicalEditor = new GraphicalLayoutEditor(this);
- } else {
- // Otherwise we now default to the new GLE v2
- mGraphicalEditor = new GraphicalEditorPart(this);
- }
+ // Instantiate GLE v2
+ mGraphicalEditor = new GraphicalEditorPart(this);
mGraphicalEditorIndex = addPage(mGraphicalEditor, getEditorInput());
setPageText(mGraphicalEditorIndex, mGraphicalEditor.getTitle());
@@ -217,19 +197,11 @@ public class LayoutEditor extends AndroidXmlEditor implements IShowEditorInput,
protected void postCreatePages() {
super.postCreatePages();
- // This is called after the createFormPages() and createTextPage() methods have
- // been called. Usually we select the first page (e.g. the GLE here) but right
- // now we're going to temporarily select the last page (the XML text editor) if
- // GLE1 is being used. That's because GLE1 is mostly useless and being deprecated.
- //
- // Note that this sets the default page. Eventually a default page might be
+ // Optional: set the default page. Eventually a default page might be
// restored by selectDefaultPage() later based on the last page used by the user.
- //
- // TODO revert this once GLE2 becomes useful and is the default.
-
- if (mGraphicalEditor instanceof GraphicalLayoutEditor) {
- setActivePage(getPageCount() - 1);
- }
+ // For example, to make the last page the default one (rather than the first page),
+ // un-comment this line:
+ // setActivePage(getPageCount() - 1);
}
/* (non-java doc)
@@ -281,11 +253,6 @@ public class LayoutEditor extends AndroidXmlEditor implements IShowEditorInput,
// re-create or reload the pages with the default page shown as the previous active page.
createAndroidPages();
selectDefaultPage(Integer.toString(currentPage));
-
- // update the GLE1 outline. The GLE2 outline doesn't need this call anymore.
- if (mOutlineForGle1 != null) {
- mOutlineForGle1.reloadModel();
- }
}
/**
@@ -306,11 +273,6 @@ public class LayoutEditor extends AndroidXmlEditor implements IShowEditorInput,
if (mGraphicalEditor != null) {
mGraphicalEditor.onXmlModelChanged();
}
-
- // update the GLE1 outline. The GLE2 outline doesn't need this call anymore.
- if (mOutlineForGle1 != null) {
- mOutlineForGle1.reloadModel();
- }
}
/**
@@ -324,16 +286,7 @@ public class LayoutEditor extends AndroidXmlEditor implements IShowEditorInput,
// gets stuck in the XML outline.
if (IContentOutlinePage.class == adapter && mGraphicalEditor != null) {
- if (mOutline == null && mGraphicalEditor instanceof GraphicalLayoutEditor) {
- // Create the GLE1 outline. We need to keep a specific reference to it in order
- // to call its reloadModel() method. The GLE2 outline no longer relies on this
- // and can be casted to the base interface.
- mOutlineForGle1 = new UiContentOutlinePage(
- (GraphicalLayoutEditor) mGraphicalEditor,
- new TreeViewer());
- mOutline = mOutlineForGle1;
-
- } else if (mOutline == null && mGraphicalEditor instanceof GraphicalEditorPart) {
+ if (mOutline == null && mGraphicalEditor instanceof GraphicalEditorPart) {
mOutline = new OutlinePage2((GraphicalEditorPart) mGraphicalEditor);
}
@@ -341,10 +294,7 @@ public class LayoutEditor extends AndroidXmlEditor implements IShowEditorInput,
}
if (IPropertySheetPage.class == adapter && mGraphicalEditor != null) {
- if (mPropertyPage == null && mGraphicalEditor instanceof GraphicalLayoutEditor) {
- mPropertyPage = new UiPropertySheetPage();
-
- } else if (mPropertyPage == null && mGraphicalEditor instanceof GraphicalEditorPart) {
+ if (mPropertyPage == null && mGraphicalEditor instanceof GraphicalEditorPart) {
mPropertyPage = new PropertySheetPage2();
}
@@ -409,32 +359,6 @@ public class LayoutEditor extends AndroidXmlEditor implements IShowEditorInput,
//EclipseUiHelper.showView(EclipseUiHelper.PROPERTY_SHEET_VIEW_ID, false /* activate */);
}
- public class UiEditorActions extends UiActions {
-
- @Override
- protected UiDocumentNode getRootNode() {
- return mUiRootNode;
- }
-
- // Select the new item
- @Override
- protected void selectUiNode(UiElementNode uiNodeToSelect) {
- mGraphicalEditor.selectModel(uiNodeToSelect);
- }
-
- @Override
- public void commitPendingXmlChanges() {
- // Pass. There is nothing to commit before the XML is changed here.
- }
- }
-
- public UiEditorActions getUiEditorActions() {
- if (mUiEditorActions == null) {
- mUiEditorActions = new UiEditorActions();
- }
- return mUiEditorActions;
- }
-
// ---- Local Methods ----
/**
@@ -570,10 +494,6 @@ public class LayoutEditor extends AndroidXmlEditor implements IShowEditorInput,
mUiRootNode.reloadFromXmlNode(mUiRootNode.getXmlDocument());
}
- if (mOutlineForGle1 != null) {
- mOutlineForGle1.reloadModel();
- }
-
if (mGraphicalEditor != null) {
mGraphicalEditor.onTargetChange();
mGraphicalEditor.reloadPalette();
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle1/GraphicalLayoutEditor.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle1/GraphicalLayoutEditor.java
deleted file mode 100644
index 6dcf4bd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle1/GraphicalLayoutEditor.java
+++ /dev/null
@@ -1,1458 +0,0 @@
-/*
- * Copyright (C) 2008 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.gle1;
-
-import com.android.ide.eclipse.adt.AdtPlugin;
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.layout.ExplodedRenderingHelper;
-import com.android.ide.eclipse.adt.internal.editors.layout.IGraphicalLayoutEditor;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditor;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutReloadMonitor;
-import com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback;
-import com.android.ide.eclipse.adt.internal.editors.layout.UiElementPullParser;
-import com.android.ide.eclipse.adt.internal.editors.layout.WidgetPullParser;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditor.UiEditorActions;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutReloadMonitor.ChangeFlags;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutReloadMonitor.ILayoutReloadListener;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationComposite;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.LayoutCreatorDialog;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationComposite.CustomButton;
-import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationComposite.IConfigListener;
-import com.android.ide.eclipse.adt.internal.editors.layout.descriptors.ViewElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.parts.ElementCreateCommand;
-import com.android.ide.eclipse.adt.internal.editors.layout.parts.UiElementEditPart;
-import com.android.ide.eclipse.adt.internal.editors.layout.parts.UiElementsEditPartFactory;
-import com.android.ide.eclipse.adt.internal.editors.layout.parts.UiElementsEditPartFactory.IOutlineProvider;
-import com.android.ide.eclipse.adt.internal.editors.ui.tree.CopyCutAction;
-import com.android.ide.eclipse.adt.internal.editors.ui.tree.PasteAction;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.resources.configurations.FolderConfiguration;
-import com.android.ide.eclipse.adt.internal.resources.manager.ProjectResources;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceFile;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceFolderType;
-import com.android.ide.eclipse.adt.internal.resources.manager.ResourceManager;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-import com.android.ide.eclipse.adt.internal.sdk.LoadStatus;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData.LayoutBridge;
-import com.android.ide.eclipse.adt.internal.sdk.Sdk.ITargetChangeListener;
-import com.android.ide.eclipse.adt.io.IFileWrapper;
-import com.android.layoutlib.api.ILayoutBridge;
-import com.android.layoutlib.api.ILayoutLog;
-import com.android.layoutlib.api.ILayoutResult;
-import com.android.layoutlib.api.IProjectCallback;
-import com.android.layoutlib.api.IResourceValue;
-import com.android.layoutlib.api.IXmlPullParser;
-import com.android.layoutlib.api.ILayoutResult.ILayoutViewInfo;
-import com.android.sdklib.IAndroidTarget;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.SelectionManager;
-import org.eclipse.gef.dnd.TemplateTransferDragSourceListener;
-import org.eclipse.gef.dnd.TemplateTransferDropTargetListener;
-import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.gef.ui.parts.GraphicalEditorWithPalette;
-import org.eclipse.gef.ui.parts.SelectionSynchronizer;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.PaletteData;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.part.FileEditorInput;
-
-import java.awt.image.BufferedImage;
-import java.awt.image.DataBufferInt;
-import java.awt.image.Raster;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Graphical layout editor, based on GEF.
- * <p/>
- * To understand GEF: http://www.ibm.com/developerworks/opensource/library/os-gef/
- * <p/>
- * To understand Drag'n'drop: http://www.eclipse.org/articles/Article-Workbench-DND/drag_drop.html
- *
- * @since GLE1
- */
-public class GraphicalLayoutEditor extends GraphicalEditorWithPalette
- implements IGraphicalLayoutEditor, IConfigListener, ILayoutReloadListener, IOutlineProvider {
-
-
- /** Reference to the layout editor */
- private final LayoutEditor mLayoutEditor;
-
- /** reference to the file being edited. */
- private IFile mEditedFile;
-
- private Clipboard mClipboard;
- private Composite mParent;
- private ConfigurationComposite mConfigComposite;
-
- private PaletteRoot mPaletteRoot;
-
- private Map<String, Map<String, IResourceValue>> mConfiguredFrameworkRes;
- private Map<String, Map<String, IResourceValue>> mConfiguredProjectRes;
- private ProjectCallback mProjectCallback;
- private ILayoutLog mLogger;
-
- private boolean mUseExplodeMode;
- private boolean mUseOutlineMode;
- private boolean mNeedsXmlReload = false;
- private boolean mNeedsRecompute = false;
-
- /** Listener to update the root node if the target of the file is changed because of a
- * SDK location change or a project target change */
- private ITargetChangeListener mTargetListener = new ITargetChangeListener() {
- public void onProjectTargetChange(IProject changedProject) {
- if (changedProject != null && changedProject.equals(getProject())) {
- updateEditor();
- }
- }
-
- public void onTargetLoaded(IAndroidTarget target) {
- IProject project = getProject();
- if (target != null && target.equals(Sdk.getCurrent().getTarget(project))) {
- updateEditor();
- }
- }
-
- public void onSdkLoaded() {
- Sdk currentSdk = Sdk.getCurrent();
- if (currentSdk != null) {
- IAndroidTarget target = currentSdk.getTarget(mEditedFile.getProject());
- if (target != null) {
- mConfigComposite.onSdkLoaded(target);
- onConfigurationChange();
- }
- }
- }
-
- private void updateEditor() {
- mLayoutEditor.commitPages(false /* onSave */);
-
- // because the target changed we must reset the configured resources.
- mConfiguredFrameworkRes = mConfiguredProjectRes = null;
-
- // make sure we remove the custom view loader, since its parent class loader is the
- // bridge class loader.
- mProjectCallback = null;
-
- // recreate the ui root node always, this will also call onTargetChange
- // on the config composite
- mLayoutEditor.initUiRootNode(true /*force*/);
- }
-
- private IProject getProject() {
- return getLayoutEditor().getProject();
- }
- };
-
- private final Runnable mConditionalRecomputeRunnable = new Runnable() {
- public void run() {
- if (mLayoutEditor.isGraphicalEditorActive()) {
- recomputeLayout();
- } else {
- mNeedsRecompute = true;
- }
- }
- };
-
- private final Runnable mLocaleUpdaterFromUiRunnable = new Runnable() {
- public void run() {
- mConfigComposite.updateLocales();
- }
- };
-
- public GraphicalLayoutEditor(LayoutEditor layoutEditor) {
- mLayoutEditor = layoutEditor;
- setEditDomain(new DefaultEditDomain(this));
- setPartName("Layout");
-
- AdtPlugin.getDefault().addTargetListener(mTargetListener);
- }
-
- // ------------------------------------
- // Methods overridden from base classes
- //------------------------------------
-
- @Override
- public void createPartControl(Composite parent) {
- mParent = parent;
- GridLayout gl;
-
- mClipboard = new Clipboard(parent.getDisplay());
-
- parent.setLayout(gl = new GridLayout(1, false));
- gl.marginHeight = gl.marginWidth = 0;
-
- // create the top part for the configuration control
-
- CustomButton[][] customButtons = new CustomButton[][] {
- new CustomButton[] {
- new CustomButton(
- null, //text
- IconFactory.getInstance().getIcon("explode"),
- "Displays extra margins in the layout.",
- true /*toggle*/,
- false /*defaultValue*/
- ) {
- @Override
- public void onSelected(boolean newState) {
- mUseExplodeMode = newState;
- recomputeLayout();
- }
- },
- new CustomButton(
- null, //text
- IconFactory.getInstance().getIcon("outline"),
- "Shows the outline of all views in the layout.",
- true /*toggle*/,
- false /*defaultValue*/
- ) {
- @Override
- public void onSelected(boolean newState) {
- mUseOutlineMode = newState;
- recomputeLayout();
- }
- }
- }
- };
-
- mConfigComposite = new ConfigurationComposite(this, customButtons, parent, SWT.NONE);
-
- // create a new composite that will contain the standard editor controls.
- Composite editorParent = new Composite(parent, SWT.NONE);
- editorParent.setLayoutData(new GridData(GridData.FILL_BOTH));
- editorParent.setLayout(new FillLayout());
- super.createPartControl(editorParent);
- }
-
- @Override
- public void dispose() {
- if (mTargetListener != null) {
- AdtPlugin.getDefault().removeTargetListener(mTargetListener);
- mTargetListener = null;
- }
-
- LayoutReloadMonitor.getMonitor().removeListener(mEditedFile.getProject(), this);
-
- if (mClipboard != null) {
- mClipboard.dispose();
- mClipboard = null;
- }
-
- super.dispose();
- }
-
- /**
- * Returns the selection synchronizer object.
- * The synchronizer can be used to sync the selection of 2 or more EditPartViewers.
- * <p/>
- * This is changed from protected to public so that the outline can use it.
- *
- * @return the synchronizer
- */
- @Override
- public SelectionSynchronizer getSelectionSynchronizer() {
- return super.getSelectionSynchronizer();
- }
-
- /**
- * Returns the edit domain.
- * <p/>
- * This is changed from protected to public so that the outline can use it.
- *
- * @return the edit domain
- */
- @Override
- public DefaultEditDomain getEditDomain() {
- return super.getEditDomain();
- }
-
- /* (non-Javadoc)
- * Creates the palette root.
- */
- @Override
- protected PaletteRoot getPaletteRoot() {
- mPaletteRoot = PaletteFactory.createPaletteRoot(mPaletteRoot,
- mLayoutEditor.getTargetData());
- return mPaletteRoot;
- }
-
- public Clipboard getClipboard() {
- return mClipboard;
- }
-
- /**
- * Save operation in the Graphical Layout Editor.
- * <p/>
- * In our workflow, the model is owned by the Structured XML Editor.
- * The graphical layout editor just displays it -- thus we don't really
- * save anything here.
- * <p/>
- * This must NOT call the parent editor part. At the contrary, the parent editor
- * part will call this *after* having done the actual save operation.
- * <p/>
- * The only action this editor must do is mark the undo command stack as
- * being no longer dirty.
- */
- @Override
- public void doSave(IProgressMonitor monitor) {
- getCommandStack().markSaveLocation();
- firePropertyChange(PROP_DIRTY);
- }
-
- @Override
- protected void configurePaletteViewer() {
- super.configurePaletteViewer();
-
- // Create a drag source listener on an edit part that is a viewer.
- // What this does is use DND with a TemplateTransfer type which is actually
- // the PaletteTemplateEntry held in the PaletteRoot.
- TemplateTransferDragSourceListener dragSource =
- new TemplateTransferDragSourceListener(getPaletteViewer());
-
- // Create a drag source on the palette viewer.
- // See the drag target associated with the GraphicalViewer in configureGraphicalViewer.
- getPaletteViewer().addDragSourceListener(dragSource);
- }
-
- /* (non-javadoc)
- * Configure the graphical viewer before it receives its contents.
- */
- @Override
- protected void configureGraphicalViewer() {
- super.configureGraphicalViewer();
-
- GraphicalViewer viewer = getGraphicalViewer();
- viewer.setEditPartFactory(new UiElementsEditPartFactory(mParent.getDisplay(), this));
- viewer.setRootEditPart(new ScalableFreeformRootEditPart());
-
- // Disable the following -- we don't drag *from* the GraphicalViewer yet:
- // viewer.addDragSourceListener(new TemplateTransferDragSourceListener(viewer));
-
- viewer.addDropTargetListener(new DropListener(viewer));
- }
-
- class DropListener extends TemplateTransferDropTargetListener {
- public DropListener(EditPartViewer viewer) {
- super(viewer);
- }
-
- // TODO explain
- @Override
- protected CreationFactory getFactory(final Object template) {
- return new CreationFactory() {
- public Object getNewObject() {
- // We don't know the newly created EditPart since "creating" new
- // elements is done by ElementCreateCommand.execute() directly by
- // manipulating the XML elements..
- return null;
- }
-
- public Object getObjectType() {
- return template;
- }
-
- };
- }
- }
-
- /* (non-javadoc)
- * Set the contents of the GraphicalViewer after it has been created.
- */
- @Override
- protected void initializeGraphicalViewer() {
- GraphicalViewer viewer = getGraphicalViewer();
- viewer.setContents(getModel());
-
- IEditorInput input = getEditorInput();
- if (input instanceof FileEditorInput) {
- FileEditorInput fileInput = (FileEditorInput)input;
- mEditedFile = fileInput.getFile();
-
- LayoutReloadMonitor.getMonitor().addListener(mEditedFile.getProject(), this);
- } else {
- // really this shouldn't happen! Log it in case it happens
- mEditedFile = null;
- AdtPlugin.log(IStatus.ERROR, "Input is not of type FileEditorInput: %1$s",
- input.toString());
- }
- }
-
- /* (non-javadoc)
- * Sets the graphicalViewer for this EditorPart.
- * @param viewer the graphical viewer
- */
- @Override
- protected void setGraphicalViewer(GraphicalViewer viewer) {
- super.setGraphicalViewer(viewer);
-
- // TODO: viewer.setKeyHandler()
- viewer.setContextMenu(createContextMenu(viewer));
- }
-
- /**
- * Used by LayoutEditor.UiEditorActions.selectUiNode to select a new UI Node
- * created by {@link ElementCreateCommand#execute()}.
- *
- * @param uiNodeModel The {@link UiElementNode} to select.
- */
- public void selectModel(UiElementNode uiNodeModel) {
- GraphicalViewer viewer = getGraphicalViewer();
-
- // Give focus to the graphical viewer (in case the outline has it)
- viewer.getControl().forceFocus();
-
- Object editPart = viewer.getEditPartRegistry().get(uiNodeModel);
-
- if (editPart instanceof EditPart) {
- viewer.select((EditPart)editPart);
- }
- }
-
-
- //--------------
- // Local methods
- //--------------
-
- public LayoutEditor getLayoutEditor() {
- return mLayoutEditor;
- }
-
- private MenuManager createContextMenu(GraphicalViewer viewer) {
- MenuManager menuManager = new MenuManager();
- menuManager.setRemoveAllWhenShown(true);
- menuManager.addMenuListener(new ActionMenuListener(viewer));
-
- return menuManager;
- }
-
- private class ActionMenuListener implements IMenuListener {
- private final GraphicalViewer mViewer;
-
- public ActionMenuListener(GraphicalViewer viewer) {
- mViewer = viewer;
- }
-
- /**
- * The menu is about to be shown. The menu manager has already been
- * requested to remove any existing menu item. This method gets the
- * tree selection and if it is of the appropriate type it re-creates
- * the necessary actions.
- */
- public void menuAboutToShow(IMenuManager manager) {
- ArrayList<UiElementNode> selected = new ArrayList<UiElementNode>();
-
- // filter selected items and only keep those we can handle
- for (Object obj : mViewer.getSelectedEditParts()) {
- if (obj instanceof UiElementEditPart) {
- UiElementEditPart part = (UiElementEditPart) obj;
- UiElementNode uiNode = part.getUiNode();
- if (uiNode != null) {
- selected.add(uiNode);
- }
- }
- }
-
- if (selected.size() > 0) {
- doCreateMenuAction(manager, mViewer, selected);
- }
- }
- }
-
- private void doCreateMenuAction(IMenuManager manager,
- final GraphicalViewer viewer,
- final ArrayList<UiElementNode> selected) {
- if (selected != null) {
- boolean hasXml = false;
- for (UiElementNode uiNode : selected) {
- if (uiNode.getXmlNode() != null) {
- hasXml = true;
- break;
- }
- }
-
- if (hasXml) {
- manager.add(new CopyCutAction(mLayoutEditor, getClipboard(),
- null, selected, true /* cut */));
- manager.add(new CopyCutAction(mLayoutEditor, getClipboard(),
- null, selected, false /* cut */));
-
- // Can't paste with more than one element selected (the selection is the target)
- if (selected.size() <= 1) {
- // Paste is not valid if it would add a second element on a terminal element
- // which parent is a document -- an XML document can only have one child. This
- // means paste is valid if the current UI node can have children or if the
- // parent is not a document.
- UiElementNode ui_root = selected.get(0).getUiRoot();
- if (ui_root.getDescriptor().hasChildren() ||
- !(ui_root.getUiParent() instanceof UiDocumentNode)) {
- manager.add(new PasteAction(mLayoutEditor, getClipboard(),
- selected.get(0)));
- }
- }
- manager.add(new Separator());
- }
- }
-
- // Append "add" and "remove" actions. They do the same thing as the add/remove
- // buttons on the side.
- IconFactory factory = IconFactory.getInstance();
-
- final UiEditorActions uiActions = mLayoutEditor.getUiEditorActions();
-
- // "Add" makes sense only if there's 0 or 1 item selected since the
- // one selected item becomes the target.
- if (selected == null || selected.size() <= 1) {
- manager.add(new Action("Add...", factory.getImageDescriptor("add")) { //$NON-NLS-2$
- @Override
- public void run() {
- UiElementNode node = selected != null && selected.size() > 0 ? selected.get(0)
- : null;
- uiActions.doAdd(node, viewer.getControl().getShell());
- }
- });
- }
-
- if (selected != null) {
- manager.add(new Action("Remove", factory.getImageDescriptor("delete")) { //$NON-NLS-2$
- @Override
- public void run() {
- uiActions.doRemove(selected, viewer.getControl().getShell());
- }
- });
-
- manager.add(new Separator());
-
- manager.add(new Action("Up", factory.getImageDescriptor("up")) { //$NON-NLS-2$
- @Override
- public void run() {
- uiActions.doUp(selected);
- }
- });
- manager.add(new Action("Down", factory.getImageDescriptor("down")) { //$NON-NLS-2$
- @Override
- public void run() {
- uiActions.doDown(selected);
- }
- });
- }
-
- }
-
- /**
- * Opens and initialize the editor with a new file.
- * @param file the file being edited.
- */
- public void openFile(IFile file) {
- mEditedFile = file;
- mConfigComposite.setFile(mEditedFile);
- }
-
- /**
- * Resets the editor with a replacement file.
- * @param file the replacement file.
- */
- public void replaceFile(IFile file) {
- resetInput();
-
- mEditedFile = file;
- mConfigComposite.replaceFile(mEditedFile);
- }
-
- /**
- * Resets the editor with a replacement file coming from a config change in the config
- * selector.
- * @param file the replacement file.
- */
- public void changeFileOnNewConfig(IFile file) {
- resetInput();
-
- mEditedFile = file;
- mConfigComposite.changeFileOnNewConfig(mEditedFile);
- }
-
- public void onTargetChange() {
- resetInput();
- mConfigComposite.onXmlModelLoaded();
- onConfigurationChange();
- }
-
- public void onSdkChange() {
- Sdk currentSdk = Sdk.getCurrent();
- if (currentSdk != null) {
- IAndroidTarget target = currentSdk.getTarget(mEditedFile.getProject());
- if (target != null) {
- mConfigComposite.onSdkLoaded(target);
- onConfigurationChange();
- }
- }
- }
-
- /**
- * Resets the editor's input and the viewer model.
- */
- private void resetInput() {
- GraphicalViewer viewer = getGraphicalViewer();
- viewer.setContents(getModel());
-
- IEditorInput input = mLayoutEditor.getEditorInput();
- setInput(input);
- }
-
-
- public Rectangle getBounds() {
- return mConfigComposite.getScreenBounds();
- }
-
- /**
- * Renders an Android View described by a {@link ViewElementDescriptor}.
- * <p/>This uses the <code>wrap_content</code> mode for both <code>layout_width</code> and
- * <code>layout_height</code>, and use the class name for the <code>text</code> attribute.
- * @param descriptor the descriptor for the class to render.
- * @return an ImageData containing the rendering or <code>null</code> if rendering failed.
- */
- public ImageData renderWidget(ViewElementDescriptor descriptor) {
- if (mEditedFile == null) {
- return null;
- }
-
- IAndroidTarget target = Sdk.getCurrent().getTarget(mEditedFile.getProject());
- if (target == null) {
- return null;
- }
-
- AndroidTargetData data = Sdk.getCurrent().getTargetData(target);
- if (data == null) {
- return null;
- }
-
- LayoutBridge bridge = data.getLayoutBridge();
-
- if (bridge.bridge != null) { // bridge can never be null.
- ResourceManager resManager = ResourceManager.getInstance();
-
- ProjectCallback projectCallback = null;
- Map<String, Map<String, IResourceValue>> configuredProjectResources = null;
- if (mEditedFile != null) {
- ProjectResources projectRes = resManager.getProjectResources(
- mEditedFile.getProject());
- projectCallback = new ProjectCallback(bridge.classLoader,
- projectRes, mEditedFile.getProject());
-
- // get the configured resources for the project
- // get the resources of the file's project.
- if (mConfiguredProjectRes == null && projectRes != null) {
- // make sure they are loaded
- projectRes.loadAll();
-
- // get the project resource values based on the current config
- mConfiguredProjectRes = projectRes.getConfiguredResources(
- mConfigComposite.getCurrentConfig());
- }
-
- configuredProjectResources = mConfiguredProjectRes;
- } else {
- // we absolutely need a Map of configured project resources.
- configuredProjectResources = new HashMap<String, Map<String, IResourceValue>>();
- }
-
- // get the framework resources
- Map<String, Map<String, IResourceValue>> frameworkResources =
- getConfiguredFrameworkResources();
-
- if (configuredProjectResources != null && frameworkResources != null) {
- // get the selected theme
- String theme = mConfigComposite.getTheme();
- if (theme != null) {
- // Render a single object as described by the ViewElementDescriptor.
- WidgetPullParser parser = new WidgetPullParser(descriptor);
- ILayoutResult result = computeLayout(bridge, parser,
- null /* projectKey */,
- 1 /* width */, 1 /* height */, true /* renderFullSize */,
- 160 /*density*/, 160.f /*xdpi*/, 160.f /*ydpi*/, theme,
- mConfigComposite.isProjectTheme(),
- configuredProjectResources, frameworkResources, projectCallback,
- null /* logger */);
-
- // post rendering clean up
- bridge.cleanUp();
-
- // update the UiElementNode with the layout info.
- if (result.getSuccess() == ILayoutResult.SUCCESS) {
- BufferedImage largeImage = result.getImage();
-
- // we need to resize it to the actual widget size, and convert it into
- // an SWT image object.
- int width = result.getRootView().getRight();
- int height = result.getRootView().getBottom();
- Raster raster = largeImage.getData(new java.awt.Rectangle(width, height));
- int[] imageDataBuffer = ((DataBufferInt)raster.getDataBuffer()).getData();
-
- ImageData imageData = new ImageData(width, height, 32,
- new PaletteData(0x00FF0000, 0x0000FF00, 0x000000FF));
-
- imageData.setPixels(0, 0, imageDataBuffer.length, imageDataBuffer, 0);
-
- return imageData;
- }
- }
- }
- }
- return null;
- }
-
- /**
- * Callback for XML model changed. Only update/recompute the layout if the editor is visible
- */
- public void onXmlModelChanged() {
- if (mLayoutEditor.isGraphicalEditorActive()) {
- doXmlReload(true /* force */);
- recomputeLayout();
- } else {
- mNeedsXmlReload = true;
- }
- }
-
- /**
- * Actually performs the XML reload
- * @see #onXmlModelChanged()
- */
- private void doXmlReload(boolean force) {
- if (force || mNeedsXmlReload) {
- GraphicalViewer viewer = getGraphicalViewer();
-
- // try to preserve the selection before changing the content
- SelectionManager selMan = viewer.getSelectionManager();
- ISelection selection = selMan.getSelection();
-
- try {
- viewer.setContents(getModel());
- } finally {
- selMan.setSelection(selection);
- }
-
- mNeedsXmlReload = false;
- }
- }
-
- public UiDocumentNode getModel() {
- return mLayoutEditor.getUiRootNode();
- }
-
- public void reloadPalette() {
- PaletteFactory.createPaletteRoot(mPaletteRoot, mLayoutEditor.getTargetData());
- }
-
- /**
- * Looks for a file matching the new {@link FolderConfiguration} and attempts to open it.
- * <p/>If there is no match, notify the user.
- */
- public void onConfigurationChange() {
- mConfiguredFrameworkRes = mConfiguredProjectRes = null;
-
- if (mEditedFile == null || mConfigComposite.getEditedConfig() == null) {
- return;
- }
-
- // Before doing the normal process, test for the following case.
- // - the editor is being opened (or reset for a new input)
- // - the file being opened is not the best match for any possible configuration
- // - another random compatible config was chosen in the config composite.
- // The result is that match will not be the file being edited, but because this is not
- // due to a config change, we should not trigger opening the actual best match (also,
- // because the editor is still opening the MatchingStrategy woudln't answer true
- // and the best match file would open in a different editor).
- // So the solution is that if the editor is being created, we just call recomputeLayout
- // without looking for a better matching layout file.
- if (mLayoutEditor.isCreatingPages()) {
- recomputeLayout();
- } else {
- // get the resources of the file's project.
- ProjectResources resources = ResourceManager.getInstance().getProjectResources(
- mEditedFile.getProject());
-
- // from the resources, look for a matching file
- ResourceFile match = null;
- if (resources != null) {
- match = resources.getMatchingFile(mEditedFile.getName(),
- ResourceFolderType.LAYOUT,
- mConfigComposite.getCurrentConfig());
- }
-
- if (match != null) {
- // since this is coming from Eclipse, this is always an instance of IFileWrapper
- IFileWrapper iFileWrapper = (IFileWrapper) match.getFile();
- IFile iFile = iFileWrapper.getIFile();
- if (iFile.equals(mEditedFile) == false) {
- try {
- // tell the editor that the next replacement file is due to a config change.
- mLayoutEditor.setNewFileOnConfigChange(true);
-
- // ask the IDE to open the replacement file.
- IDE.openEditor(getSite().getWorkbenchWindow().getActivePage(), iFile);
-
- // we're done!
- return;
- } catch (PartInitException e) {
- // FIXME: do something!
- }
- }
-
- // at this point, we have not opened a new file.
-
- // Store the state in the current file
- mConfigComposite.storeState();
-
- // Even though the layout doesn't change, the config changed, and referenced
- // resources need to be updated.
- recomputeLayout();
- } else {
- // display the error.
- FolderConfiguration currentConfig = mConfigComposite.getCurrentConfig();
- String message = String.format(
- "No resources match the configuration\n \n\t%1$s\n \nChange the configuration or create:\n \n\tres/%2$s/%3$s\n \nYou can also click the 'Create' button above.",
- currentConfig.toDisplayString(),
- currentConfig.getFolderName(ResourceFolderType.LAYOUT),
- mEditedFile.getName());
- showErrorInEditor(message);
- }
- }
- }
-
- public void onThemeChange() {
- // Store the state in the current file
- mConfigComposite.storeState();
-
- recomputeLayout();
- }
-
- public void onCreate() {
- LayoutCreatorDialog dialog = new LayoutCreatorDialog(mParent.getShell(),
- mEditedFile.getName(), mConfigComposite.getCurrentConfig());
- if (dialog.open() == Dialog.OK) {
- final FolderConfiguration config = new FolderConfiguration();
- dialog.getConfiguration(config);
-
- createAlternateLayout(config);
- }
- }
-
- /**
- * Recomputes the layout with the help of layoutlib.
- */
- public void recomputeLayout() {
- doXmlReload(false /* force */);
- try {
- // check that the resource exists. If the file is opened but the project is closed
- // or deleted for some reason (changed from outside of eclipse), then this will
- // return false;
- if (mEditedFile.exists() == false) {
- String message = String.format("Resource '%1$s' does not exist.",
- mEditedFile.getFullPath().toString());
-
- showErrorInEditor(message);
-
- return;
- }
-
- IProject iProject = mEditedFile.getProject();
-
- if (mEditedFile.isSynchronized(IResource.DEPTH_ZERO) == false) {
- String message = String.format("%1$s is out of sync. Please refresh.",
- mEditedFile.getName());
-
- showErrorInEditor(message);
-
- // also print it in the error console.
- AdtPlugin.printErrorToConsole(iProject.getName(), message);
- return;
- }
-
- Sdk currentSdk = Sdk.getCurrent();
- if (currentSdk != null) {
- IAndroidTarget target = currentSdk.getTarget(mEditedFile.getProject());
- if (target == null) {
- showErrorInEditor("The project target is not set.");
- return;
- }
-
- AndroidTargetData data = currentSdk.getTargetData(target);
- if (data == null) {
- // It can happen that the workspace refreshes while the target is loading its
- // data, which could trigger a redraw of the opened layout if some resources
- // changed while Eclipse is closed.
- // In this case data could be null, but this is not an error.
- // We can just silently return, as all the opened editors are automatically
- // refreshed once the SDK finishes loading.
- LoadStatus targetLoadStatus = currentSdk.checkAndLoadTargetData(target, null);
- switch (targetLoadStatus) {
- case LOADING:
- showErrorInEditor(String.format(
- "The project target (%1$s) is still loading.\n%2$s will refresh automatically once the process is finished.",
- target.getName(), mEditedFile.getName()));
- break;
- case FAILED: // known failure
- case LOADED: // success but data isn't loaded?!?!
- showErrorInEditor(String.format(
- "The project target (%s) was not properly loaded.",
- target.getName()));
- break;
- }
- return;
- }
-
- // check there is actually a model (maybe the file is empty).
- UiDocumentNode model = getModel();
-
- if (model.getUiChildren().size() == 0) {
- showErrorInEditor("No Xml content. Go to the Outline view and add nodes.");
- return;
- }
-
- LayoutBridge bridge = data.getLayoutBridge();
-
- if (bridge.bridge != null) { // bridge can never be null.
- ResourceManager resManager = ResourceManager.getInstance();
-
- ProjectResources projectRes = resManager.getProjectResources(iProject);
- if (projectRes == null) {
- return;
- }
-
- // get the resources of the file's project.
- Map<String, Map<String, IResourceValue>> configuredProjectRes =
- getConfiguredProjectResources();
-
- // get the framework resources
- Map<String, Map<String, IResourceValue>> frameworkResources =
- getConfiguredFrameworkResources();
-
- if (configuredProjectRes != null && frameworkResources != null) {
- if (mProjectCallback == null) {
- mProjectCallback = new ProjectCallback(
- bridge.classLoader, projectRes, iProject);
- }
-
- if (mLogger == null) {
- mLogger = new ILayoutLog() {
- public void error(String message) {
- AdtPlugin.printErrorToConsole(mEditedFile.getName(), message);
- }
-
- public void error(Throwable error) {
- String message = error.getMessage();
- if (message == null) {
- message = error.getClass().getName();
- }
-
- PrintStream ps = new PrintStream(AdtPlugin.getErrorStream());
- error.printStackTrace(ps);
- }
-
- public void warning(String message) {
- AdtPlugin.printToConsole(mEditedFile.getName(), message);
- }
- };
- }
-
- // get the selected theme
- String theme = mConfigComposite.getTheme();
- if (theme != null) {
- // Compute the layout
- Rectangle rect = getBounds();
-
- int width = rect.width;
- int height = rect.height;
- if (mUseExplodeMode) {
- // compute how many padding in x and y will bump the screen size
- List<UiElementNode> children = getModel().getUiChildren();
- if (children.size() == 1) {
- ExplodedRenderingHelper helper = new ExplodedRenderingHelper(
- children.get(0).getXmlNode(), iProject);
-
- // there are 2 paddings for each view
- // left and right, or top and bottom.
- int paddingValue = ExplodedRenderingHelper.PADDING_VALUE * 2;
-
- width += helper.getWidthPadding() * paddingValue;
- height += helper.getHeightPadding() * paddingValue;
- }
- }
-
- int density = mConfigComposite.getDensity().getDpiValue();
- float xdpi = mConfigComposite.getXDpi();
- float ydpi = mConfigComposite.getYDpi();
- boolean isProjectTheme = mConfigComposite.isProjectTheme();
-
- UiElementPullParser parser = new UiElementPullParser(getModel(),
- mUseExplodeMode, density, xdpi, iProject);
-
- ILayoutResult result = computeLayout(bridge, parser,
- iProject /* projectKey */,
- width, height, false /*renderFullSize*/,
- density, xdpi, ydpi,
- theme, isProjectTheme,
- configuredProjectRes, frameworkResources, mProjectCallback,
- mLogger);
-
- // post-rendering clean up
- bridge.cleanUp();
-
- // update the UiElementNode with the layout info.
- if (result.getSuccess() == ILayoutResult.SUCCESS) {
- model.setEditData(result.getImage());
-
- updateNodeWithBounds(result.getRootView());
- } else {
- String message = result.getErrorMessage();
-
- // Reset the edit data for all the nodes.
- resetNodeBounds(model);
-
- if (message != null) {
- // set the error in the top element.
- model.setEditData(message);
- }
- }
-
- model.refreshUi();
- }
- }
- } else {
- // SDK is loaded but not the layout library!
- String message = null;
- // check whether the bridge managed to load, or not
- if (bridge.status == LoadStatus.LOADING) {
- message = String.format(
- "Eclipse is loading framework information and the Layout library from the SDK folder.\n%1$s will refresh automatically once the process is finished.",
- mEditedFile.getName());
- } else {
- message = String.format("Eclipse failed to load the framework information and the Layout library!");
- }
- showErrorInEditor(message);
- }
- } else {
- String message = String.format(
- "Eclipse is loading the SDK.\n%1$s will refresh automatically once the process is finished.",
- mEditedFile.getName());
-
- showErrorInEditor(message);
- }
- } finally {
- // no matter the result, we are done doing the recompute based on the latest
- // resource/code change.
- mNeedsRecompute = false;
- }
- }
-
- private void showErrorInEditor(String message) {
- // get the model to display the error directly in the editor
- UiDocumentNode model = getModel();
-
- // Reset the edit data for all the nodes.
- resetNodeBounds(model);
-
- if (message != null) {
- // set the error in the top element.
- model.setEditData(message);
- }
-
- model.refreshUi();
- }
-
- private void resetNodeBounds(UiElementNode node) {
- node.setEditData(null);
-
- List<UiElementNode> children = node.getUiChildren();
- for (UiElementNode child : children) {
- resetNodeBounds(child);
- }
- }
-
- private void updateNodeWithBounds(ILayoutViewInfo r) {
- if (r != null) {
- // update the node itself, as the viewKey is the XML node in this implementation.
- Object viewKey = r.getViewKey();
- if (viewKey instanceof UiElementNode) {
- Rectangle bounds = new Rectangle(r.getLeft(), r.getTop(),
- r.getRight()-r.getLeft(), r.getBottom() - r.getTop());
-
- ((UiElementNode)viewKey).setEditData(bounds);
- }
-
- // and then its children.
- ILayoutViewInfo[] children = r.getChildren();
- if (children != null) {
- for (ILayoutViewInfo child : children) {
- updateNodeWithBounds(child);
- }
- }
- }
- }
-
- /*
- * Called when the file changes triggered a redraw of the layout
- */
- public void reloadLayout(ChangeFlags flags, boolean libraryChanged) {
- boolean recompute = false;
-
- if (flags.rClass) {
- recompute = true;
- ProjectResources projectRes = getProjectResources();
- if (projectRes != null) {
- projectRes.resetDynamicIds();
- }
- }
-
- if (flags.localeList) {
- // the locale list *potentially* changed so we update the locale list in the
- // config composite.
- // However there's no recompute, as it could not be needed (for instance a new layout)
- // If a resource that's not a layout changed this will trigger a recompute anyway.
- mParent.getDisplay().asyncExec(mLocaleUpdaterFromUiRunnable);
- }
-
- if (flags.resources || (libraryChanged && flags.layout)) {
- recompute = true;
-
- // TODO: differentiate between single and multi resource file changed, and whether the resource change affects the cache.
-
- // force a reparse in case a value XML file changed.
- mConfiguredProjectRes = null;
-
- // clear the cache in the bridge in case a bitmap/9-patch changed.
- IAndroidTarget target = Sdk.getCurrent().getTarget(mEditedFile.getProject());
- if (target != null) {
-
- AndroidTargetData data = Sdk.getCurrent().getTargetData(target);
- if (data != null) {
- LayoutBridge bridge = data.getLayoutBridge();
-
- if (bridge.bridge != null) {
- bridge.bridge.clearCaches(mEditedFile.getProject());
- }
- }
- }
-
- }
-
- if (flags.code) {
- // only recompute if the custom view loader was used to load some code.
- if (mProjectCallback != null && mProjectCallback.isUsed()) {
- mProjectCallback = null;
- recompute = true;
- }
- }
-
- if (recompute) {
- mParent.getDisplay().asyncExec(mConditionalRecomputeRunnable);
- }
- }
-
- /**
- * Responds to a page change that made the Graphical editor page the activated page.
- */
- public void activated() {
- if (mNeedsRecompute || mNeedsXmlReload) {
- recomputeLayout();
- }
- }
-
- /**
- * Responds to a page change that made the Graphical editor page the deactivated page
- */
- public void deactivated() {
- // nothing to be done here for now.
- }
-
- public Map<String, Map<String, IResourceValue>> getConfiguredFrameworkResources() {
- if (mConfiguredFrameworkRes == null) {
- ProjectResources frameworkRes = getFrameworkResources();
-
- if (frameworkRes == null) {
- AdtPlugin.log(IStatus.ERROR, "Failed to get ProjectResource for the framework");
- } else {
- // get the framework resource values based on the current config
- mConfiguredFrameworkRes = frameworkRes.getConfiguredResources(
- mConfigComposite.getCurrentConfig());
- }
- }
-
- return mConfiguredFrameworkRes;
- }
-
- public Map<String, Map<String, IResourceValue>> getConfiguredProjectResources() {
- if (mConfiguredProjectRes == null) {
- ProjectResources project = getProjectResources();
-
- // make sure they are loaded
- project.loadAll();
-
- // get the project resource values based on the current config
- mConfiguredProjectRes = project.getConfiguredResources(
- mConfigComposite.getCurrentConfig());
- }
-
- return mConfiguredProjectRes;
- }
-
- /**
- * Returns a {@link ProjectResources} for the framework resources.
- * @return the framework resources or null if not found.
- */
- public ProjectResources getFrameworkResources() {
- if (mEditedFile != null) {
- Sdk currentSdk = Sdk.getCurrent();
- if (currentSdk != null) {
- IAndroidTarget target = currentSdk.getTarget(mEditedFile.getProject());
-
- if (target != null) {
- AndroidTargetData data = currentSdk.getTargetData(target);
-
- if (data != null) {
- return data.getFrameworkResources();
- }
- }
- }
- }
-
- return null;
- }
-
- public ProjectResources getProjectResources() {
- if (mEditedFile != null) {
- ResourceManager manager = ResourceManager.getInstance();
- return manager.getProjectResources(mEditedFile.getProject());
- }
-
- return null;
- }
-
- /**
- * Creates a new layout file from the specified {@link FolderConfiguration}.
- */
- private void createAlternateLayout(final FolderConfiguration config) {
- new Job("Create Alternate Resource") {
- @Override
- protected IStatus run(IProgressMonitor monitor) {
- // get the folder name
- String folderName = config.getFolderName(ResourceFolderType.LAYOUT);
- try {
-
- // look to see if it exists.
- // get the res folder
- IFolder res = (IFolder)mEditedFile.getParent().getParent();
- String path = res.getLocation().toOSString();
-
- File newLayoutFolder = new File(path + File.separator + folderName);
- if (newLayoutFolder.isFile()) {
- // this should not happen since aapt would have complained
- // before, but if one disable the automatic build, this could
- // happen.
- String message = String.format("File 'res/%1$s' is in the way!",
- folderName);
-
- AdtPlugin.displayError("Layout Creation", message);
-
- return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID, message);
- } else if (newLayoutFolder.exists() == false) {
- // create it.
- newLayoutFolder.mkdir();
- }
-
- // now create the file
- File newLayoutFile = new File(newLayoutFolder.getAbsolutePath() +
- File.separator + mEditedFile.getName());
-
- newLayoutFile.createNewFile();
-
- InputStream input = mEditedFile.getContents();
-
- FileOutputStream fos = new FileOutputStream(newLayoutFile);
-
- byte[] data = new byte[512];
- int count;
- while ((count = input.read(data)) != -1) {
- fos.write(data, 0, count);
- }
-
- input.close();
- fos.close();
-
- // refreshes the res folder to show up the new
- // layout folder (if needed) and the file.
- // We use a progress monitor to catch the end of the refresh
- // to trigger the edit of the new file.
- res.refreshLocal(IResource.DEPTH_INFINITE, new IProgressMonitor() {
- public void done() {
- mParent.getDisplay().asyncExec(new Runnable() {
- public void run() {
- onConfigurationChange();
- }
- });
- }
-
- public void beginTask(String name, int totalWork) {
- // pass
- }
-
- public void internalWorked(double work) {
- // pass
- }
-
- public boolean isCanceled() {
- // pass
- return false;
- }
-
- public void setCanceled(boolean value) {
- // pass
- }
-
- public void setTaskName(String name) {
- // pass
- }
-
- public void subTask(String name) {
- // pass
- }
-
- public void worked(int work) {
- // pass
- }
- });
- } catch (IOException e2) {
- String message = String.format(
- "Failed to create File 'res/%1$s/%2$s' : %3$s",
- folderName, mEditedFile.getName(), e2.getMessage());
-
- AdtPlugin.displayError("Layout Creation", message);
-
- return new Status(IStatus.ERROR, AdtPlugin.PLUGIN_ID,
- message, e2);
- } catch (CoreException e2) {
- String message = String.format(
- "Failed to create File 'res/%1$s/%2$s' : %3$s",
- folderName, mEditedFile.getName(), e2.getMessage());
-
- AdtPlugin.displayError("Layout Creation", message);
-
- return e2.getStatus();
- }
-
- return Status.OK_STATUS;
-
- }
- }.schedule();
- }
-
- /**
- * Computes a layout by calling the correct computeLayout method of ILayoutBridge based on
- * the implementation API level.
- */
- @SuppressWarnings("deprecation")
- private static ILayoutResult computeLayout(LayoutBridge bridge,
- IXmlPullParser layoutDescription, Object projectKey,
- int screenWidth, int screenHeight, boolean renderFullSize,
- int density, float xdpi, float ydpi,
- String themeName, boolean isProjectTheme,
- Map<String, Map<String, IResourceValue>> projectResources,
- Map<String, Map<String, IResourceValue>> frameworkResources,
- IProjectCallback projectCallback, ILayoutLog logger) {
-
- if (bridge.apiLevel >= ILayoutBridge.API_CURRENT) {
- // newest API with support for "render full height"
- // TODO: link boolean to UI.
- return bridge.bridge.computeLayout(layoutDescription,
- projectKey, screenWidth, screenHeight, renderFullSize,
- density, xdpi, ydpi,
- themeName, isProjectTheme,
- projectResources, frameworkResources, projectCallback,
- logger);
- } else if (bridge.apiLevel == 3) {
- // newer api with density support.
- return bridge.bridge.computeLayout(layoutDescription,
- projectKey, screenWidth, screenHeight, density, xdpi, ydpi,
- themeName, isProjectTheme,
- projectResources, frameworkResources, projectCallback,
- logger);
- } else if (bridge.apiLevel == 2) {
- // api with boolean for separation of project/framework theme
- return bridge.bridge.computeLayout(layoutDescription,
- projectKey, screenWidth, screenHeight, themeName, isProjectTheme,
- projectResources, frameworkResources, projectCallback,
- logger);
- } else {
- // oldest api with no density/dpi, and project theme boolean mixed
- // into the theme name.
-
- // change the string if it's a custom theme to make sure we can
- // differentiate them
- if (isProjectTheme) {
- themeName = "*" + themeName; //$NON-NLS-1$
- }
-
- return bridge.bridge.computeLayout(layoutDescription,
- projectKey, screenWidth, screenHeight, themeName,
- projectResources, frameworkResources, projectCallback,
- logger);
- }
- }
-
- public boolean hasOutline() {
- return mUseOutlineMode;
- }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle1/PaletteFactory.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle1/PaletteFactory.java
deleted file mode 100644
index 363466b..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle1/PaletteFactory.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2008 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.gle1;
-
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.sdk.AndroidTargetData;
-
-import org.eclipse.gef.palette.PaletteDrawer;
-import org.eclipse.gef.palette.PaletteGroup;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.palette.PaletteTemplateEntry;
-
-import java.util.List;
-
-/**
- * Factory that creates the palette for the {@link GraphicalLayoutEditor}.
- *
- * @since GLE1
- */
-public class PaletteFactory {
-
- /** Static factory, nothing to instantiate here. */
- private PaletteFactory() {
- }
-
- public static PaletteRoot createPaletteRoot(PaletteRoot currentPalette,
- AndroidTargetData targetData) {
-
- if (currentPalette == null) {
- currentPalette = new PaletteRoot();
- }
-
- for (int n = currentPalette.getChildren().size() - 1; n >= 0; n--) {
- currentPalette.getChildren().remove(n);
- }
-
- if (targetData != null) {
- addTools(currentPalette);
- addViews(currentPalette, "Layouts",
- targetData.getLayoutDescriptors().getLayoutDescriptors());
- addViews(currentPalette, "Views",
- targetData.getLayoutDescriptors().getViewDescriptors());
- }
-
- return currentPalette;
- }
-
- private static void addTools(PaletteRoot paletteRoot) {
- PaletteGroup group = new PaletteGroup("Tools");
-
- // Default tools: selection.
- // Do not use the MarqueeToolEntry since we don't support multiple selection.
- /* -- Do not put the selection tool. It's the unique tool so it looks useless.
- Leave this piece of code here in case we want it back later.
- PanningSelectionToolEntry entry = new PanningSelectionToolEntry();
- group.add(entry);
- paletteRoot.setDefaultEntry(entry);
- */
-
- paletteRoot.add(group);
- }
-
- private static void addViews(PaletteRoot paletteRoot, String groupName,
- List<ElementDescriptor> descriptors) {
- PaletteDrawer group = new PaletteDrawer(groupName);
-
- for (ElementDescriptor desc : descriptors) {
- PaletteTemplateEntry entry = new PaletteTemplateEntry(
- desc.getUiName(), // label
- desc.getTooltip(), // short description
- desc, // template
- desc.getImageDescriptor(), // small icon
- desc.getImageDescriptor() // large icon
- );
-
- group.add(entry);
- }
-
- paletteRoot.add(group);
- }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle1/UiContentOutlinePage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle1/UiContentOutlinePage.java
deleted file mode 100644
index 86ff180..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle1/UiContentOutlinePage.java
+++ /dev/null
@@ -1,618 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
- *
- * 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.gle1;
-
-import com.android.ide.eclipse.adt.internal.editors.IconFactory;
-import com.android.ide.eclipse.adt.internal.editors.layout.IGraphicalLayoutEditor;
-import com.android.ide.eclipse.adt.internal.editors.layout.parts.UiDocumentTreeEditPart;
-import com.android.ide.eclipse.adt.internal.editors.layout.parts.UiElementTreeEditPart;
-import com.android.ide.eclipse.adt.internal.editors.layout.parts.UiElementTreeEditPartFactory;
-import com.android.ide.eclipse.adt.internal.editors.layout.parts.UiLayoutTreeEditPart;
-import com.android.ide.eclipse.adt.internal.editors.layout.parts.UiViewTreeEditPart;
-import com.android.ide.eclipse.adt.internal.editors.ui.tree.CopyCutAction;
-import com.android.ide.eclipse.adt.internal.editors.ui.tree.PasteAction;
-import com.android.ide.eclipse.adt.internal.editors.ui.tree.UiActions;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.ide.eclipse.adt.internal.ui.EclipseUiHelper;
-
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.ui.parts.ContentOutlinePage;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreePath;
-import org.eclipse.jface.viewers.TreeSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.IActionBars;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Implementation of the {@link ContentOutlinePage} to display {@link UiElementNode}.
- *
- * @since GLE1
- */
-public class UiContentOutlinePage extends ContentOutlinePage {
-
- private GraphicalLayoutEditor mEditor;
-
- private Action mAddAction;
- private Action mDeleteAction;
- private Action mUpAction;
- private Action mDownAction;
-
- private UiOutlineActions mUiActions = new UiOutlineActions();
-
- public UiContentOutlinePage(GraphicalLayoutEditor editor, final EditPartViewer viewer) {
- super(viewer);
- mEditor = editor;
- IconFactory factory = IconFactory.getInstance();
-
- mAddAction = new Action("Add...") {
- @Override
- public void run() {
- List<UiElementNode> nodes = getModelSelections();
- UiElementNode node = nodes != null && nodes.size() > 0 ? nodes.get(0) : null;
-
- mUiActions.doAdd(node, viewer.getControl().getShell());
- }
- };
- mAddAction.setToolTipText("Adds a new element.");
- mAddAction.setImageDescriptor(factory.getImageDescriptor("add")); //$NON-NLS-1$
-
- mDeleteAction = new Action("Remove...") {
- @Override
- public void run() {
- List<UiElementNode> nodes = getModelSelections();
-
- mUiActions.doRemove(nodes, viewer.getControl().getShell());
- }
- };
- mDeleteAction.setToolTipText("Removes an existing selected element.");
- mDeleteAction.setImageDescriptor(factory.getImageDescriptor("delete")); //$NON-NLS-1$
-
- mUpAction = new Action("Up") {
- @Override
- public void run() {
- List<UiElementNode> nodes = getModelSelections();
-
- mUiActions.doUp(nodes);
- }
- };
- mUpAction.setToolTipText("Moves the selected element up");
- mUpAction.setImageDescriptor(factory.getImageDescriptor("up")); //$NON-NLS-1$
-
- mDownAction = new Action("Down") {
- @Override
- public void run() {
- List<UiElementNode> nodes = getModelSelections();
-
- mUiActions.doDown(nodes);
- }
- };
- mDownAction.setToolTipText("Moves the selected element down");
- mDownAction.setImageDescriptor(factory.getImageDescriptor("down")); //$NON-NLS-1$
-
- // all actions disabled by default.
- mAddAction.setEnabled(false);
- mDeleteAction.setEnabled(false);
- mUpAction.setEnabled(false);
- mDownAction.setEnabled(false);
-
- addSelectionChangedListener(new ISelectionChangedListener() {
- public void selectionChanged(SelectionChangedEvent event) {
- ISelection selection = event.getSelection();
-
- // the selection is never empty. The least it'll contain is the
- // UiDocumentTreeEditPart object.
- if (selection instanceof StructuredSelection) {
- StructuredSelection structSel = (StructuredSelection)selection;
-
- if (structSel.size() == 1 &&
- structSel.getFirstElement() instanceof UiDocumentTreeEditPart) {
- mDeleteAction.setEnabled(false);
- mUpAction.setEnabled(false);
- mDownAction.setEnabled(false);
- } else {
- mDeleteAction.setEnabled(true);
- mUpAction.setEnabled(true);
- mDownAction.setEnabled(true);
- }
-
- // the "add" button is always enabled, in order to be able to set the
- // initial root node
- mAddAction.setEnabled(true);
- }
- }
- });
- }
-
-
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.IPage#createControl(org.eclipse.swt.widgets.Composite)
- */
- @Override
- public void createControl(Composite parent) {
- // create outline viewer page
- getViewer().createControl(parent);
-
- // configure outline viewer
- getViewer().setEditPartFactory(new UiElementTreeEditPartFactory());
-
- setupOutline();
- setupContextMenu();
- setupTooltip();
- setupDoubleClick();
- }
-
- /*
- * (non-Javadoc)
- * @see org.eclipse.ui.part.Page#setActionBars(org.eclipse.ui.IActionBars)
- *
- * Called automatically after createControl
- */
- @Override
- public void setActionBars(IActionBars actionBars) {
- IToolBarManager toolBarManager = actionBars.getToolBarManager();
- toolBarManager.add(mAddAction);
- toolBarManager.add(mDeleteAction);
- toolBarManager.add(new Separator());
- toolBarManager.add(mUpAction);
- toolBarManager.add(mDownAction);
-
- IMenuManager menuManager = actionBars.getMenuManager();
- menuManager.add(mAddAction);
- menuManager.add(mDeleteAction);
- menuManager.add(new Separator());
- menuManager.add(mUpAction);
- menuManager.add(mDownAction);
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.IPage#dispose()
- */
- @Override
- public void dispose() {
- breakConnectionWithEditor();
-
- // dispose
- super.dispose();
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.ui.part.IPage#getControl()
- */
- @Override
- public Control getControl() {
- return getViewer().getControl();
- }
-
- void setNewEditor(GraphicalLayoutEditor editor) {
- mEditor = editor;
- setupOutline();
- }
-
- void breakConnectionWithEditor() {
- // unhook outline viewer
- mEditor.getSelectionSynchronizer().removeViewer(getViewer());
- }
-
- private void setupOutline() {
-
- getViewer().setEditDomain(mEditor.getEditDomain());
-
- // hook outline viewer
- mEditor.getSelectionSynchronizer().addViewer(getViewer());
-
- // initialize outline viewer with model
- getViewer().setContents(mEditor.getModel());
- }
-
- private void setupContextMenu() {
- MenuManager menuManager = new MenuManager();
- menuManager.setRemoveAllWhenShown(true);
- menuManager.addMenuListener(new IMenuListener() {
- /**
- * The menu is about to be shown. The menu manager has already been
- * requested to remove any existing menu item. This method gets the
- * tree selection and if it is of the appropriate type it re-creates
- * the necessary actions.
- */
- public void menuAboutToShow(IMenuManager manager) {
- List<UiElementNode> selected = getModelSelections();
-
- if (selected != null) {
- doCreateMenuAction(manager, selected);
- return;
- }
- doCreateMenuAction(manager, null /* ui_node */);
- }
- });
- Control control = getControl();
- Menu contextMenu = menuManager.createContextMenu(control);
- control.setMenu(contextMenu);
- }
-
- /**
- * Adds the menu actions to the context menu when the given UI node is selected in
- * the tree view.
- *
- * @param manager The context menu manager
- * @param selected The UI node selected in the tree. Can be null, in which case the root
- * is to be modified.
- */
- private void doCreateMenuAction(IMenuManager manager, List<UiElementNode> selected) {
-
- if (selected != null) {
- boolean hasXml = false;
- for (UiElementNode uiNode : selected) {
- if (uiNode.getXmlNode() != null) {
- hasXml = true;
- break;
- }
- }
-
- if (hasXml) {
- manager.add(new CopyCutAction(mEditor.getLayoutEditor(), mEditor.getClipboard(),
- null, selected, true /* cut */));
- manager.add(new CopyCutAction(mEditor.getLayoutEditor(), mEditor.getClipboard(),
- null, selected, false /* cut */));
-
- // Can't paste with more than one element selected (the selection is the target)
- if (selected.size() <= 1) {
- // Paste is not valid if it would add a second element on a terminal element
- // which parent is a document -- an XML document can only have one child. This
- // means paste is valid if the current UI node can have children or if the parent
- // is not a document.
- UiElementNode ui_root = selected.get(0).getUiRoot();
- if (ui_root.getDescriptor().hasChildren() ||
- !(ui_root.getUiParent() instanceof UiDocumentNode)) {
- manager.add(new PasteAction(mEditor.getLayoutEditor(),
- mEditor.getClipboard(),
- selected.get(0)));
- }
- }
- manager.add(new Separator());
- }
- }
-
- // Append "add" and "remove" actions. They do the same thing as the add/remove
- // buttons on the side.
- //
- // "Add" makes sense only if there's 0 or 1 item selected since the
- // one selected item becomes the target.
- if (selected == null || selected.size() <= 1) {
- manager.add(mAddAction);
- }
-
- if (selected != null) {
- manager.add(mDeleteAction);
- manager.add(new Separator());
-
- manager.add(mUpAction);
- manager.add(mDownAction);
- }
-
- if (selected != null && selected.size() == 1) {
- manager.add(new Separator());
-
- Action propertiesAction = new Action("Properties") {
- @Override
- public void run() {
- EclipseUiHelper.showView(EclipseUiHelper.PROPERTY_SHEET_VIEW_ID,
- true /* activate */);
- }
- };
- propertiesAction.setToolTipText("Displays properties of the selected element.");
- manager.add(propertiesAction);
- }
- }
-
- /**
- * Updates the outline view with the model of the {@link IGraphicalLayoutEditor}.
- * <p/>
- * This attemps to preserve the selection, if any.
- */
- public void reloadModel() {
- // Attemps to preserve the UiNode selection, if any
- List<UiElementNode> uiNodes = null;
- try {
- // get current selection using the model rather than the edit part as
- // reloading the content may change the actual edit part.
- uiNodes = getModelSelections();
-
- // perform the update
- getViewer().setContents(mEditor.getModel());
-
- } finally {
- // restore selection
- if (uiNodes != null) {
- setModelSelection(uiNodes.get(0));
- }
- }
- }
-
- /**
- * Returns the currently selected element, if any, in the viewer.
- * This returns the viewer's elements (i.e. an {@link UiElementTreeEditPart})
- * and not the underlying model node.
- * <p/>
- * When there is no actual selection, this might still return the root node,
- * which is of type {@link UiDocumentTreeEditPart}.
- */
- @SuppressWarnings("unchecked")
- private List<UiElementTreeEditPart> getViewerSelections() {
- ISelection selection = getSelection();
- if (selection instanceof StructuredSelection) {
- StructuredSelection structuredSelection = (StructuredSelection)selection;
-
- if (structuredSelection.size() > 0) {
- ArrayList<UiElementTreeEditPart> selected = new ArrayList<UiElementTreeEditPart>();
-
- for (Iterator it = structuredSelection.iterator(); it.hasNext(); ) {
- Object selectedObj = it.next();
-
- if (selectedObj instanceof UiElementTreeEditPart) {
- selected.add((UiElementTreeEditPart) selectedObj);
- }
- }
-
- return selected.size() > 0 ? selected : null;
- }
- }
-
- return null;
- }
-
- /**
- * Returns the currently selected model element, which is either an
- * {@link UiViewTreeEditPart} or an {@link UiLayoutTreeEditPart}.
- * <p/>
- * Returns null if there is no selection or if the implicit root is "selected"
- * (which actually represents the lack of a real element selection.)
- */
- private List<UiElementNode> getModelSelections() {
-
- List<UiElementTreeEditPart> parts = getViewerSelections();
-
- if (parts != null) {
- ArrayList<UiElementNode> selected = new ArrayList<UiElementNode>();
-
- for (UiElementTreeEditPart part : parts) {
- if (part instanceof UiViewTreeEditPart || part instanceof UiLayoutTreeEditPart) {
- selected.add((UiElementNode) part.getModel());
- }
- }
-
- return selected.size() > 0 ? selected : null;
- }
-
- return null;
- }
-
- /**
- * Selects the corresponding edit part in the tree viewer.
- */
- private void setViewerSelection(UiElementTreeEditPart selectedPart) {
- if (selectedPart != null && !(selectedPart instanceof UiDocumentTreeEditPart)) {
- LinkedList<UiElementTreeEditPart> segments = new LinkedList<UiElementTreeEditPart>();
- for (UiElementTreeEditPart part = selectedPart;
- !(part instanceof UiDocumentTreeEditPart);
- part = (UiElementTreeEditPart) part.getParent()) {
- segments.add(0, part);
- }
- setSelection(new TreeSelection(new TreePath(segments.toArray())));
- }
- }
-
- /**
- * Selects the corresponding model element in the tree viewer.
- */
- private void setModelSelection(UiElementNode uiNodeToSelect) {
- if (uiNodeToSelect != null) {
-
- // find an edit part that has the requested model element
- UiElementTreeEditPart part = findPartForModel(
- (UiElementTreeEditPart) getViewer().getContents(),
- uiNodeToSelect);
-
- // if we found a part, select it and reveal it
- if (part != null) {
- setViewerSelection(part);
- getViewer().reveal(part);
- }
- }
- }
-
- /**
- * Utility method that tries to find an edit part that matches a given model UI node.
- *
- * @param rootPart The root of the viewer edit parts
- * @param uiNode The UI node model to find
- * @return The part that matches the model or null if it's not in the sub tree.
- */
- private UiElementTreeEditPart findPartForModel(UiElementTreeEditPart rootPart,
- UiElementNode uiNode) {
- if (rootPart.getModel() == uiNode) {
- return rootPart;
- }
-
- for (Object part : rootPart.getChildren()) {
- if (part instanceof UiElementTreeEditPart) {
- UiElementTreeEditPart found = findPartForModel(
- (UiElementTreeEditPart) part, uiNode);
- if (found != null) {
- return found;
- }
- }
- }
-
- return null;
- }
-
- /**
- * Sets up a custom tooltip when hovering over tree items.
- * <p/>
- * The tooltip will display the element's javadoc, if any, or the item's getText otherwise.
- */
- private void setupTooltip() {
- final Tree tree = (Tree) getControl();
-
- /*
- * Reference:
- * http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet125.java?view=markup
- */
-
- final Listener listener = new Listener() {
- Shell tip = null;
- Label label = null;
-
- public void handleEvent(Event event) {
- switch(event.type) {
- case SWT.Dispose:
- case SWT.KeyDown:
- case SWT.MouseExit:
- case SWT.MouseDown:
- case SWT.MouseMove:
- if (tip != null) {
- tip.dispose();
- tip = null;
- label = null;
- }
- break;
- case SWT.MouseHover:
- if (tip != null) {
- tip.dispose();
- tip = null;
- label = null;
- }
-
- String tooltip = null;
-
- TreeItem item = tree.getItem(new Point(event.x, event.y));
- if (item != null) {
- Object data = item.getData();
- if (data instanceof UiElementTreeEditPart) {
- Object model = ((UiElementTreeEditPart) data).getModel();
- if (model instanceof UiElementNode) {
- tooltip = ((UiElementNode) model).getDescriptor().getTooltip();
- }
- }
-
- if (tooltip == null) {
- tooltip = item.getText();
- } else {
- tooltip = item.getText() + ":\r" + tooltip;
- }
-
- if (tooltip != null) {
- Shell shell = tree.getShell();
- Display display = tree.getDisplay();
-
- tip = new Shell(shell, SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL);
- tip.setBackground(display .getSystemColor(SWT.COLOR_INFO_BACKGROUND));
- FillLayout layout = new FillLayout();
- layout.marginWidth = 2;
- tip.setLayout(layout);
- label = new Label(tip, SWT.NONE);
- label.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
- label.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
- label.setData("_TABLEITEM", item);
- label.setText(tooltip);
- label.addListener(SWT.MouseExit, this);
- label.addListener(SWT.MouseDown, this);
- Point size = tip.computeSize(SWT.DEFAULT, SWT.DEFAULT);
- Rectangle rect = item.getBounds(0);
- Point pt = tree.toDisplay(rect.x, rect.y);
- tip.setBounds(pt.x, pt.y, size.x, size.y);
- tip.setVisible(true);
- }
- }
- }
- }
- };
-
- tree.addListener(SWT.Dispose, listener);
- tree.addListener(SWT.KeyDown, listener);
- tree.addListener(SWT.MouseMove, listener);
- tree.addListener(SWT.MouseHover, listener);
- }
-
- /**
- * Sets up double-click action on the tree.
- * <p/>
- * By default, double-click (a.k.a. "default selection") on a valid list item will
- * show the property view.
- */
- private void setupDoubleClick() {
- final Tree tree = (Tree) getControl();
-
- tree.addListener(SWT.DefaultSelection, new Listener() {
- public void handleEvent(Event event) {
- EclipseUiHelper.showView(EclipseUiHelper.PROPERTY_SHEET_VIEW_ID,
- true /* activate */);
- }
- });
- }
-
- // ---------------
-
- private class UiOutlineActions extends UiActions {
-
- @Override
- protected UiDocumentNode getRootNode() {
- return mEditor.getModel(); // this is LayoutEditor.getUiRootNode()
- }
-
- // Select the new item
- @Override
- protected void selectUiNode(UiElementNode uiNodeToSelect) {
- setModelSelection(uiNodeToSelect);
- }
-
- @Override
- public void commitPendingXmlChanges() {
- // Pass. There is nothing to commit before the XML is changed here.
- }
-
- }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle1/UiPropertySheetPage.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle1/UiPropertySheetPage.java
deleted file mode 100644
index e619344..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle1/UiPropertySheetPage.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright (C) 2008 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.gle1;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.views.properties.PropertySheetEntry;
-import org.eclipse.ui.views.properties.PropertySheetPage;
-
-/**
- * A customized property sheet page for the graphical layout editor.
- * <p/>
- * Currently it just provides a custom tooltip to display attributes javadocs.
- *
- * @since GLE1
- */
-public class UiPropertySheetPage extends PropertySheetPage {
-
-
- public UiPropertySheetPage() {
- super();
- }
-
- @Override
- public void createControl(Composite parent) {
- super.createControl(parent);
-
- setupTooltip();
- }
-
- /**
- * Sets up a custom tooltip when hovering over tree items.
- * <p/>
- * The tooltip will display the element's javadoc, if any, or the item's getText otherwise.
- */
- private void setupTooltip() {
- final Tree tree = (Tree) getControl();
-
- /*
- * Reference:
- * http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet125.java?view=markup
- */
-
- final Listener listener = new Listener() {
- Shell tip = null;
- Label label = null;
-
- public void handleEvent(Event event) {
- switch(event.type) {
- case SWT.Dispose:
- case SWT.KeyDown:
- case SWT.MouseExit:
- case SWT.MouseDown:
- case SWT.MouseMove:
- if (tip != null) {
- tip.dispose();
- tip = null;
- label = null;
- }
- break;
- case SWT.MouseHover:
- if (tip != null) {
- tip.dispose();
- tip = null;
- label = null;
- }
-
- String tooltip = null;
-
- TreeItem item = tree.getItem(new Point(event.x, event.y));
- if (item != null) {
- Object data = item.getData();
- if (data instanceof PropertySheetEntry) {
- tooltip = ((PropertySheetEntry) data).getDescription();
- }
-
- if (tooltip == null) {
- tooltip = item.getText();
- } else {
- tooltip = item.getText() + ":\r" + tooltip;
- }
-
- if (tooltip != null) {
- Shell shell = tree.getShell();
- Display display = tree.getDisplay();
-
- tip = new Shell(shell, SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL);
- tip.setBackground(display .getSystemColor(SWT.COLOR_INFO_BACKGROUND));
- FillLayout layout = new FillLayout();
- layout.marginWidth = 2;
- tip.setLayout(layout);
- label = new Label(tip, SWT.NONE);
- label.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
- label.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
- label.setData("_TABLEITEM", item);
- label.setText(tooltip);
- label.addListener(SWT.MouseExit, this);
- label.addListener(SWT.MouseDown, this);
- Point size = tip.computeSize(SWT.DEFAULT, SWT.DEFAULT);
- Rectangle rect = item.getBounds(0);
- Point pt = tree.toDisplay(rect.x, rect.y);
- tip.setBounds(pt.x, pt.y, size.x, size.y);
- tip.setVisible(true);
- }
- }
- }
- }
- };
-
- tree.addListener(SWT.Dispose, listener);
- tree.addListener(SWT.KeyDown, listener);
- tree.addListener(SWT.MouseMove, listener);
- tree.addListener(SWT.MouseHover, listener);
-
- }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java
index 27b7c20..21d8272 100755
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java
@@ -31,7 +31,6 @@ import com.android.ide.eclipse.adt.internal.editors.layout.configuration.LayoutC
import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationComposite.CustomButton;
import com.android.ide.eclipse.adt.internal.editors.layout.configuration.ConfigurationComposite.IConfigListener;
import com.android.ide.eclipse.adt.internal.editors.layout.gre.RulesEngine;
-import com.android.ide.eclipse.adt.internal.editors.layout.parts.ElementCreateCommand;
import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
import com.android.ide.eclipse.adt.internal.resources.configurations.FolderConfiguration;
@@ -1288,28 +1287,6 @@ public class GraphicalEditorPart extends EditorPart
}
}
- /**
- * Used by LayoutEditor.UiEditorActions.selectUiNode to select a new UI Node
- * created by {@link ElementCreateCommand#execute()}.
- *
- * @param uiNodeModel The {@link UiElementNode} to select.
- */
- public void selectModel(UiElementNode uiNodeModel) {
-
- // TODO this method was useful for GLE1. We may not need it anymore now.
-
-// GraphicalViewer viewer = getGraphicalViewer();
-//
-// // Give focus to the graphical viewer (in case the outline has it)
-// viewer.getControl().forceFocus();
-//
-// Object editPart = viewer.getEditPartRegistry().get(uiNodeModel);
-//
-// if (editPart instanceof EditPart) {
-// viewer.select((EditPart)editPart);
-// }
- }
-
private class ReloadListener implements ILayoutReloadListener {
/*
* Called when the file changes triggered a redraw of the layout
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/DropFeedback.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/DropFeedback.java
deleted file mode 100644
index ec928dd..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/DropFeedback.java
+++ /dev/null
@@ -1,778 +0,0 @@
-/*
- * Copyright (C) 2008 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.parts;
-
-import com.android.ide.eclipse.adt.internal.editors.descriptors.DescriptorsUtils;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutConstants;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditor.UiEditorActions;
-import com.android.ide.eclipse.adt.internal.editors.layout.parts.UiLayoutEditPart.HighlightInfo;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.sdklib.SdkConstants;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-import java.util.HashMap;
-import java.util.Map.Entry;
-
-/**
- * Utility methods used when dealing with dropping EditPart on the GLE.
- * <p/>
- * This class uses some temporary static storage to avoid excessive allocations during
- * drop operations. It is expected to only be invoked from the main UI thread with no
- * concurrent access.
- *
- * @since GLE1
- */
-class DropFeedback {
-
- private static final int TOP = 0;
- private static final int LEFT = 1;
- private static final int BOTTOM = 2;
- private static final int RIGHT = 3;
- private static final int MAX_DIR = RIGHT;
-
- private static final int sOppositeDirection[] = { BOTTOM, RIGHT, TOP, LEFT };
-
- private static final UiElementEditPart sTempClosests[] = new UiElementEditPart[4];
- private static final int sTempMinDists[] = new int[4];
-
-
- /**
- * Target information computed from a drop on a RelativeLayout.
- * We need only one instance of this and it is sRelativeInfo.
- */
- private static class RelativeInfo {
- /** The two target parts 0 and 1. They can be null, meaning a border is used.
- * The direction from part 0 to 1 is always to-the-right or to-the-bottom. */
- final UiElementEditPart targetParts[] = new UiElementEditPart[2];
- /** Direction from the anchor part to the drop point. */
- int direction;
- /** The index of the "anchor" part, i.e. the closest one selected by the drop.
- * This can be either 0 or 1. The corresponding part can be null. */
- int anchorIndex;
- }
-
- /** The single RelativeInfo used to compute results from a drop on a RelativeLayout */
- private static final RelativeInfo sRelativeInfo = new RelativeInfo();
- /** A temporary array of 2 {@link UiElementEditPart} to avoid allocations. */
- private static final UiElementEditPart sTempTwoParts[] = new UiElementEditPart[2];
-
-
- private DropFeedback() {
- }
-
-
- //----- Package methods called by users of this helper class -----
-
-
- /**
- * This method is used by {@link ElementCreateCommand#execute()} when a new item
- * needs to be "dropped" in the current XML document. It creates the new item using
- * the given descriptor as a child of the given parent part.
- *
- * @param parentPart The parent part.
- * @param descriptor The descriptor for the new XML element.
- * @param where The drop location (in parent coordinates)
- * @param actions The helper that actually modifies the XML model.
- */
- static void addElementToXml(UiElementEditPart parentPart,
- ElementDescriptor descriptor, Point where,
- UiEditorActions actions) {
-
- String layoutXmlName = getXmlLocalName(parentPart);
- RelativeInfo info = null;
- UiElementEditPart sibling = null;
-
- // TODO consider merge like a vertical layout
- // TODO consider TableLayout like a linear
- if (LayoutConstants.LINEAR_LAYOUT.equals(layoutXmlName)) {
- sibling = findLinearTarget(parentPart, where)[1];
-
- } else if (LayoutConstants.RELATIVE_LAYOUT.equals(layoutXmlName)) {
- info = findRelativeTarget(parentPart, where, sRelativeInfo);
- if (info != null) {
- sibling = info.targetParts[info.anchorIndex];
- sibling = getNextUiSibling(sibling);
- }
- }
-
- if (actions != null) {
- UiElementNode uiSibling = sibling != null ? sibling.getUiNode() : null;
- UiElementNode uiParent = parentPart.getUiNode();
- UiElementNode uiNode = actions.addElement(uiParent, uiSibling, descriptor,
- false /*updateLayout*/);
-
- if (LayoutConstants.ABSOLUTE_LAYOUT.equals(layoutXmlName)) {
- adjustAbsoluteAttributes(uiNode, where);
- } else if (LayoutConstants.RELATIVE_LAYOUT.equals(layoutXmlName)) {
- adustRelativeAttributes(uiNode, info);
- }
- }
- }
-
- /**
- * This method is used by {@link UiLayoutEditPart#showDropTarget(Point)} to compute
- * highlight information when a drop target is moved over a valid drop area.
- * <p/>
- * Since there are no "out" parameters in Java, all the information is returned
- * via the {@link HighlightInfo} structure passed as parameter.
- *
- * @param parentPart The parent part, always a layout.
- * @param highlightInfo A structure where result is stored to perform highlight.
- * @param where The target drop point, in parent's coordinates
- * @return The {@link HighlightInfo} structured passed as a parameter, for convenience.
- */
- static HighlightInfo computeDropFeedback(UiLayoutEditPart parentPart,
- HighlightInfo highlightInfo,
- Point where) {
- String layoutType = getXmlLocalName(parentPart);
-
- if (LayoutConstants.ABSOLUTE_LAYOUT.equals(layoutType)) {
- highlightInfo.anchorPoint = where;
-
- } else if (LayoutConstants.LINEAR_LAYOUT.equals(layoutType)) {
- boolean isVertical = isVertical(parentPart);
-
- highlightInfo.childParts = findLinearTarget(parentPart, where);
- computeLinearLine(parentPart, isVertical, highlightInfo);
-
- } else if (LayoutConstants.RELATIVE_LAYOUT.equals(layoutType)) {
-
- RelativeInfo info = findRelativeTarget(parentPart, where, sRelativeInfo);
- if (info != null) {
- highlightInfo.childParts = sRelativeInfo.targetParts;
- computeRelativeLine(parentPart, info, highlightInfo);
- }
- }
-
- return highlightInfo;
- }
-
-
- //----- Misc utilities -----
-
- /**
- * Returns the next UI sibling of this part, i.e. the element which is just after in
- * the UI/XML order in the same parent. Returns null if there's no such part.
- * <p/>
- * Note: by "UI sibling" here we mean the sibling in the UiNode hierarchy. By design the
- * UiNode model has the <em>exact</em> same order as the XML model. This has nothing to do
- * with the "user interface" order that you see on the rendered Android layouts (e.g. for
- * LinearLayout they are the same but for AbsoluteLayout or RelativeLayout the UI/XML model
- * order can be vastly different from the user interface order.)
- */
- private static UiElementEditPart getNextUiSibling(UiElementEditPart part) {
- if (part != null) {
- UiElementNode uiNode = part.getUiNode();
- if (uiNode != null) {
- uiNode = uiNode.getUiNextSibling();
- }
- if (uiNode != null) {
- for (Object childPart : part.getParent().getChildren()) {
- if (childPart instanceof UiElementEditPart &&
- ((UiElementEditPart) childPart).getUiNode() == uiNode) {
- return (UiElementEditPart) childPart;
- }
- }
- }
- }
- return null;
- }
-
- /**
- * Returns the XML local name of the ui node associated with this edit part or null.
- */
- private static String getXmlLocalName(UiElementEditPart editPart) {
- UiElementNode uiNode = editPart.getUiNode();
- if (uiNode != null) {
- ElementDescriptor desc = uiNode.getDescriptor();
- if (desc != null) {
- return desc.getXmlLocalName();
- }
- }
- return null;
- }
-
- /**
- * Adjusts the attributes of a new node dropped in an AbsoluteLayout.
- *
- * @param uiNode The new node being dropped.
- * @param where The drop location (in parent coordinates)
- */
- private static void adjustAbsoluteAttributes(final UiElementNode uiNode, final Point where) {
- if (where == null) {
- return;
- }
- uiNode.getEditor().wrapEditXmlModel(new Runnable() {
- public void run() {
- uiNode.setAttributeValue(
- LayoutConstants.ATTR_LAYOUT_X,
- SdkConstants.NS_RESOURCES,
- String.format(LayoutConstants.VALUE_N_DIP, where.x),
- false /* override */);
- uiNode.setAttributeValue(
- LayoutConstants.ATTR_LAYOUT_Y,
- SdkConstants.NS_RESOURCES,
- String.format(LayoutConstants.VALUE_N_DIP, where.y),
- false /* override */);
-
- uiNode.commitDirtyAttributesToXml();
- }
- });
- }
-
- /**
- * Adjusts the attributes of a new node dropped in a RelativeLayout:
- * <ul>
- * <li> anchor part: the one the user selected (or the closest) and to which the new one
- * will "attach". The anchor part can be null, either because the layout is currently
- * empty or the user is attaching to an existing empty border.
- * <li> direction: the direction from the anchor part to the drop point. That's also the
- * direction from the anchor part to the new part.
- * <li> the new node; it is created either after the anchor for right or top directions
- * or before the anchor for left or bottom directions. This means the new part can
- * reference the id of the anchor part.
- * </ul>
- *
- * Several cases:
- * <ul>
- * <li> set: layout_above/below/toLeftOf/toRightOf to point to the anchor.
- * <li> copy: layout_centerHorizontal for top/bottom directions
- * <li> copy: layout_centerVertical for left/right directions.
- * <li> copy: layout_above/below/toLeftOf/toRightOf for the orthogonal direction
- * (i.e. top/bottom or left/right.)
- * </ul>
- *
- * @param uiNode The new node being dropped.
- * @param info The context computed by {@link #findRelativeTarget(UiElementEditPart, Point, RelativeInfo)}.
- */
- private static void adustRelativeAttributes(final UiElementNode uiNode, RelativeInfo info) {
- if (uiNode == null || info == null) {
- return;
- }
-
- final UiElementEditPart anchorPart = info.targetParts[info.anchorIndex]; // can be null
- final int direction = info.direction;
-
- uiNode.getEditor().wrapEditXmlModel(new Runnable() {
- public void run() {
- HashMap<String, String> map = new HashMap<String, String>();
-
- UiElementNode anchorUiNode = anchorPart != null ? anchorPart.getUiNode() : null;
- String anchorId = anchorUiNode != null
- ? anchorUiNode.getAttributeValue(LayoutConstants.ATTR_ID)
- : null;
-
- if (anchorId == null) {
- anchorId = DescriptorsUtils.getFreeWidgetId(anchorUiNode);
- anchorUiNode.setAttributeValue(
- LayoutConstants.ATTR_ID,
- SdkConstants.NS_RESOURCES,
- anchorId,
- true /*override*/);
- }
-
- if (anchorId != null) {
- switch(direction) {
- case TOP:
- map.put(LayoutConstants.ATTR_LAYOUT_ABOVE, anchorId);
- break;
- case BOTTOM:
- map.put(LayoutConstants.ATTR_LAYOUT_BELOW, anchorId);
- break;
- case LEFT:
- map.put(LayoutConstants.ATTR_LAYOUT_TO_LEFT_OF, anchorId);
- break;
- case RIGHT:
- map.put(LayoutConstants.ATTR_LAYOUT_TO_RIGHT_OF, anchorId);
- break;
- }
-
- switch(direction) {
- case TOP:
- case BOTTOM:
- map.put(LayoutConstants.ATTR_LAYOUT_CENTER_HORIZONTAL,
- anchorUiNode.getAttributeValue(
- LayoutConstants.ATTR_LAYOUT_CENTER_HORIZONTAL));
-
- map.put(LayoutConstants.ATTR_LAYOUT_TO_LEFT_OF,
- anchorUiNode.getAttributeValue(
- LayoutConstants.ATTR_LAYOUT_TO_LEFT_OF));
- map.put(LayoutConstants.ATTR_LAYOUT_TO_RIGHT_OF,
- anchorUiNode.getAttributeValue(
- LayoutConstants.ATTR_LAYOUT_TO_RIGHT_OF));
- break;
- case LEFT:
- case RIGHT:
- map.put(LayoutConstants.ATTR_LAYOUT_CENTER_VERTICAL,
- anchorUiNode.getAttributeValue(
- LayoutConstants.ATTR_LAYOUT_CENTER_VERTICAL));
- map.put(LayoutConstants.ATTR_LAYOUT_ALIGN_BASELINE,
- anchorUiNode.getAttributeValue(
- LayoutConstants.ATTR_LAYOUT_ALIGN_BASELINE));
-
- map.put(LayoutConstants.ATTR_LAYOUT_ABOVE,
- anchorUiNode.getAttributeValue(LayoutConstants.ATTR_LAYOUT_ABOVE));
- map.put(LayoutConstants.ATTR_LAYOUT_BELOW,
- anchorUiNode.getAttributeValue(LayoutConstants.ATTR_LAYOUT_BELOW));
- break;
- }
- } else {
- // We don't have an anchor node. Assume we're targeting a border and align
- // to the parent.
- switch(direction) {
- case TOP:
- map.put(LayoutConstants.ATTR_LAYOUT_ALIGN_PARENT_TOP,
- LayoutConstants.VALUE_TRUE);
- break;
- case BOTTOM:
- map.put(LayoutConstants.ATTR_LAYOUT_ALIGN_PARENT_BOTTOM,
- LayoutConstants.VALUE_TRUE);
- break;
- case LEFT:
- map.put(LayoutConstants.ATTR_LAYOUT_ALIGN_PARENT_LEFT,
- LayoutConstants.VALUE_TRUE);
- break;
- case RIGHT:
- map.put(LayoutConstants.ATTR_LAYOUT_ALIGN_PARENT_RIGHT,
- LayoutConstants.VALUE_TRUE);
- break;
- }
- }
-
- for (Entry<String, String> entry : map.entrySet()) {
- uiNode.setAttributeValue(
- entry.getKey(),
- SdkConstants.NS_RESOURCES,
- entry.getValue(),
- true /* override */);
- }
- uiNode.commitDirtyAttributesToXml();
- }
- });
- }
-
-
- //----- LinearLayout --------
-
- /**
- * For a given parent edit part that MUST represent a LinearLayout, finds the
- * element before which the location points.
- * <p/>
- * This computes the edit part that corresponds to what will be the "next sibling" of the new
- * element.
- * <p/>
- * It returns null if it can't be determined, in which case the element will be added at the
- * end of the parent child list.
- *
- * @return The edit parts that correspond to what will be the "prev" and "next sibling" of the
- * new element. The previous sibling can be null if adding before the first element.
- * The next sibling can be null if adding after the last element.
- */
- private static UiElementEditPart[] findLinearTarget(UiElementEditPart parent, Point point) {
- // default orientation is horizontal
- boolean isVertical = isVertical(parent);
-
- int target = isVertical ? point.y : point.x;
-
- UiElementEditPart prev = null;
- UiElementEditPart next = null;
-
- for (Object child : parent.getChildren()) {
- if (child instanceof UiElementEditPart) {
- UiElementEditPart childPart = (UiElementEditPart) child;
- Point p = childPart.getBounds().getCenter();
- int middle = isVertical ? p.y : p.x;
- if (target < middle) {
- next = childPart;
- break;
- }
- prev = childPart;
- }
- }
-
- sTempTwoParts[0] = prev;
- sTempTwoParts[1] = next;
- return sTempTwoParts;
- }
-
- /**
- * Computes the highlight line between two parts.
- * <p/>
- * The two parts are listed in HighlightInfo.childParts[2]. Any of the parts
- * can be null.
- * The result is stored in HighlightInfo.
- * <p/>
- * Caller must clear the HighlightInfo as appropriate before this call.
- *
- * @param parentPart The parent part, always a layout.
- * @param isVertical True for vertical parts, thus computing an horizontal line.
- * @param highlightInfo The in-out highlight info.
- */
- private static void computeLinearLine(UiLayoutEditPart parentPart,
- boolean isVertical, HighlightInfo highlightInfo) {
- Rectangle r = parentPart.getBounds();
-
- if (isVertical) {
- Point p = null;
- UiElementEditPart part = highlightInfo.childParts[0];
- if (part != null) {
- p = part.getBounds().getBottom();
- } else {
- part = highlightInfo.childParts[1];
- if (part != null) {
- p = part.getBounds().getTop();
- }
- }
- if (p != null) {
- // horizontal line with middle anchor point
- highlightInfo.tempPoints[0].setLocation(0, p.y);
- highlightInfo.tempPoints[1].setLocation(r.width, p.y);
- highlightInfo.linePoints = highlightInfo.tempPoints;
- highlightInfo.anchorPoint = p.setLocation(r.width / 2, p.y);
- }
- } else {
- Point p = null;
- UiElementEditPart part = highlightInfo.childParts[0];
- if (part != null) {
- p = part.getBounds().getRight();
- } else {
- part = highlightInfo.childParts[1];
- if (part != null) {
- p = part.getBounds().getLeft();
- }
- }
- if (p != null) {
- // vertical line with middle anchor point
- highlightInfo.tempPoints[0].setLocation(p.x, 0);
- highlightInfo.tempPoints[1].setLocation(p.x, r.height);
- highlightInfo.linePoints = highlightInfo.tempPoints;
- highlightInfo.anchorPoint = p.setLocation(p.x, r.height / 2);
- }
- }
- }
-
- /**
- * Returns true if the linear layout is marked as vertical.
- *
- * @param parent The a layout part that must be a LinearLayout
- * @return True if the linear layout has a vertical orientation attribute.
- */
- private static boolean isVertical(UiElementEditPart parent) {
- String orientation = parent.getStringAttr("orientation"); //$NON-NLS-1$
- boolean isVertical = "vertical".equals(orientation) || //$NON-NLS-1$
- "1".equals(orientation); //$NON-NLS-1$
- return isVertical;
- }
-
-
- //----- RelativeLayout --------
-
- /**
- * Finds the "target" relative layout item for the drop operation & feedback.
- * <p/>
- * If the drop point is exactly on a current item, simply returns the side the drop will occur
- * compared to the center of that element. For the actual XML, we'll need to insert *after*
- * that element to make sure that referenced are defined in the right order.
- * In that case the result contains two elements, the second one always being on the right or
- * bottom side of the first one. When insert in XML, we want to insert right before that
- * second element or at the end of the child list if the second element is null.
- * <p/>
- * If the drop point is not exactly on a current element, find the closest in each
- * direction and align with the two closest of these.
- *
- * @return null if we fail to find anything (such as there are currently no items to compare
- * with); otherwise fills the {@link RelativeInfo} and return it.
- */
- private static RelativeInfo findRelativeTarget(UiElementEditPart parent,
- Point point,
- RelativeInfo outInfo) {
-
- for (int i = 0; i < 4; i++) {
- sTempMinDists[i] = Integer.MAX_VALUE;
- sTempClosests[i] = null;
- }
-
-
- for (Object child : parent.getChildren()) {
- if (child instanceof UiElementEditPart) {
- UiElementEditPart childPart = (UiElementEditPart) child;
- Rectangle r = childPart.getBounds();
- if (r.contains(point)) {
-
- float rx = ((float)(point.x - r.x) / (float)r.width ) - 0.5f;
- float ry = ((float)(point.y - r.y) / (float)r.height) - 0.5f;
-
- /* TOP
- * \ /
- * \ /
- * L X R
- * / \
- * / \
- * BOT
- */
-
- int index = 0;
- if (Math.abs(rx) >= Math.abs(ry)) {
- if (rx < 0) {
- outInfo.direction = LEFT;
- index = 1;
- } else {
- outInfo.direction = RIGHT;
- }
- } else {
- if (ry < 0) {
- outInfo.direction = TOP;
- index = 1;
- } else {
- outInfo.direction = BOTTOM;
- }
- }
-
- outInfo.anchorIndex = index;
- outInfo.targetParts[index] = childPart;
- outInfo.targetParts[1 - index] = findClosestPart(childPart,
- outInfo.direction);
-
- return outInfo;
- }
-
- computeClosest(point, childPart, sTempClosests, sTempMinDists, TOP);
- computeClosest(point, childPart, sTempClosests, sTempMinDists, LEFT);
- computeClosest(point, childPart, sTempClosests, sTempMinDists, BOTTOM);
- computeClosest(point, childPart, sTempClosests, sTempMinDists, RIGHT);
- }
- }
-
- UiElementEditPart closest = null;
- int minDist = Integer.MAX_VALUE;
- int minDir = -1;
-
- for (int i = 0; i <= MAX_DIR; i++) {
- if (sTempClosests[i] != null && sTempMinDists[i] < minDist) {
- closest = sTempClosests[i];
- minDist = sTempMinDists[i];
- minDir = i;
- }
- }
-
- if (closest != null) {
- int index = 0;
- switch(minDir) {
- case TOP:
- case LEFT:
- index = 0;
- break;
- case BOTTOM:
- case RIGHT:
- index = 1;
- break;
- }
- outInfo.anchorIndex = index;
- outInfo.targetParts[index] = closest;
- outInfo.targetParts[1 - index] = findClosestPart(closest, sOppositeDirection[minDir]);
- outInfo.direction = sOppositeDirection[minDir];
- return outInfo;
- }
-
- return null;
- }
-
- /**
- * Computes the highlight line for a drop on a RelativeLayout.
- * <p/>
- * The line is always placed on the side of the anchor part indicated by the
- * direction. The direction always point from the anchor part to the drop point.
- * <p/>
- * If there's no anchor part, use the other one with a reversed direction.
- * <p/>
- * On output, this updates the {@link HighlightInfo}.
- */
- private static void computeRelativeLine(UiLayoutEditPart parentPart,
- RelativeInfo relInfo,
- HighlightInfo highlightInfo) {
-
- UiElementEditPart[] parts = relInfo.targetParts;
- int dir = relInfo.direction;
- int index = relInfo.anchorIndex;
- UiElementEditPart part = parts[index];
-
- if (part == null) {
- dir = sOppositeDirection[dir];
- part = parts[1 - index];
- }
- if (part == null) {
- // give up if both parts are null
- return;
- }
-
- Rectangle r = part.getBounds();
- Point p = null;
- switch(dir) {
- case TOP:
- p = r.getTop();
- break;
- case BOTTOM:
- p = r.getBottom();
- break;
- case LEFT:
- p = r.getLeft();
- break;
- case RIGHT:
- p = r.getRight();
- break;
- }
-
- highlightInfo.anchorPoint = p;
-
- r = parentPart.getBounds();
- switch(dir) {
- case TOP:
- case BOTTOM:
- // horizontal line with middle anchor point
- highlightInfo.tempPoints[0].setLocation(0, p.y);
- highlightInfo.tempPoints[1].setLocation(r.width, p.y);
- highlightInfo.linePoints = highlightInfo.tempPoints;
- highlightInfo.anchorPoint = p;
- break;
- case LEFT:
- case RIGHT:
- // vertical line with middle anchor point
- highlightInfo.tempPoints[0].setLocation(p.x, 0);
- highlightInfo.tempPoints[1].setLocation(p.x, r.height);
- highlightInfo.linePoints = highlightInfo.tempPoints;
- highlightInfo.anchorPoint = p;
- break;
- }
- }
-
- /**
- * Given a certain reference point (drop point), computes the distance to the given
- * part in the given direction. For example if direction is top, only accepts parts which
- * bottom is above the reference point, computes their distance and then updates the
- * current minimal distances and current closest parts arrays accordingly.
- */
- private static void computeClosest(Point refPoint,
- UiElementEditPart compareToPart,
- UiElementEditPart[] currClosests,
- int[] currMinDists,
- int direction) {
- Rectangle r = compareToPart.getBounds();
-
- Point p = null;
- boolean usable = false;
-
- switch(direction) {
- case TOP:
- p = r.getBottom();
- usable = p.y <= refPoint.y;
- break;
- case BOTTOM:
- p = r.getTop();
- usable = p.y >= refPoint.y;
- break;
- case LEFT:
- p = r.getRight();
- usable = p.x <= refPoint.x;
- break;
- case RIGHT:
- p = r.getLeft();
- usable = p.x >= refPoint.x;
- break;
- }
-
- if (usable) {
- int d = p.getDistance2(refPoint);
- if (d < currMinDists[direction]) {
- currMinDists[direction] = d;
- currClosests[direction] = compareToPart;
- }
- }
- }
-
- /**
- * Given a reference parts, finds the closest part in the parent in the given direction.
- * For example if direction is top, finds the closest sibling part which is above the
- * reference part and non-overlapping (they can touch.)
- */
- private static UiElementEditPart findClosestPart(UiElementEditPart referencePart,
- int direction) {
- if (referencePart == null || referencePart.getParent() == null) {
- return null;
- }
-
- Rectangle r = referencePart.getBounds();
- Point ref = null;
- switch(direction) {
- case TOP:
- ref = r.getTop();
- break;
- case BOTTOM:
- ref = r.getBottom();
- break;
- case LEFT:
- ref = r.getLeft();
- break;
- case RIGHT:
- ref = r.getRight();
- break;
- }
-
- int minDist = Integer.MAX_VALUE;
- UiElementEditPart closestPart = null;
-
- for (Object childPart : referencePart.getParent().getChildren()) {
- if (childPart != referencePart && childPart instanceof UiElementEditPart) {
- r = ((UiElementEditPart) childPart).getBounds();
- Point p = null;
- boolean usable = false;
-
- switch(direction) {
- case TOP:
- p = r.getBottom();
- usable = p.y <= ref.y;
- break;
- case BOTTOM:
- p = r.getTop();
- usable = p.y >= ref.y;
- break;
- case LEFT:
- p = r.getRight();
- usable = p.x <= ref.x;
- break;
- case RIGHT:
- p = r.getLeft();
- usable = p.x >= ref.x;
- break;
- }
-
- if (usable) {
- int d = p.getDistance2(ref);
- if (d < minDist) {
- minDist = d;
- closestPart = (UiElementEditPart) childPart;
- }
- }
- }
- }
-
- return closestPart;
- }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/ElementCreateCommand.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/ElementCreateCommand.java
deleted file mode 100644
index 128dfd7..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/ElementCreateCommand.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2008 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.parts;
-
-import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor;
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditor;
-import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditor.UiEditorActions;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.commands.Command;
-
-/**
- * A command that knows how to instantiate a new element based on a given {@link ElementDescriptor},
- * the parent {@link UiElementEditPart} and an optional target location.
- *
- * @since GLE1
- */
-public class ElementCreateCommand extends Command {
-
- /** Descriptor of the new element to create */
- private final ElementDescriptor mDescriptor;
- /** The edit part that hosts the new edit part */
- private final UiElementEditPart mParentPart;
- /** The drop location in parent coordinates */
- private final Point mTargetPoint;
-
- /**
- * Creates a new {@link ElementCreateCommand}.
- *
- * @param descriptor Descriptor of the new element to create
- * @param targetPart The edit part that hosts the new edit part
- * @param targetPoint The drop location in parent coordinates
- */
- public ElementCreateCommand(ElementDescriptor descriptor,
- UiElementEditPart targetPart, Point targetPoint) {
- mDescriptor = descriptor;
- mParentPart = targetPart;
- mTargetPoint = targetPoint;
- }
-
- // --- Methods inherited from Command ---
-
- @Override
- public boolean canExecute() {
- return mDescriptor != null &&
- mParentPart != null &&
- mParentPart.getUiNode() != null &&
- mParentPart.getUiNode().getEditor() instanceof LayoutEditor;
- }
-
- @Override
- public void execute() {
- super.execute();
- UiElementNode uiParent = mParentPart.getUiNode();
- if (uiParent != null) {
- final AndroidXmlEditor editor = uiParent.getEditor();
- if (editor instanceof LayoutEditor) {
- ((LayoutEditor) editor).wrapUndoEditXmlModel(
- String.format("Create %1$s", mDescriptor.getXmlLocalName()),
- new Runnable() {
- public void run() {
- UiEditorActions actions = ((LayoutEditor) editor).getUiEditorActions();
- if (actions != null) {
- DropFeedback.addElementToXml(mParentPart, mDescriptor, mTargetPoint,
- actions);
- }
- }
- });
- }
- }
- }
-
- @Override
- public void redo() {
- throw new UnsupportedOperationException("redo not supported by this command"); //$NON-NLS-1$
- }
-
- @Override
- public void undo() {
- throw new UnsupportedOperationException("undo not supported by this command"); //$NON-NLS-1$
- }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/ElementFigure.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/ElementFigure.java
deleted file mode 100644
index f3dc1ac..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/ElementFigure.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2008 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.parts;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.parts.UiElementsEditPartFactory.IOutlineProvider;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.swt.SWT;
-
-
-/**
- * The figure used to draw basic elements.
- * <p/>
- * The figure is totally empty and transparent except for the selection border.
- *
- * @since GLE1
- */
-class ElementFigure extends Figure {
-
- private boolean mIsSelected;
- private Rectangle mInnerBounds;
- private final IOutlineProvider mProvider;
-
- public ElementFigure(IOutlineProvider provider) {
- mProvider = provider;
- setOpaque(false);
- }
-
- public void setSelected(boolean isSelected) {
- if (isSelected != mIsSelected) {
- mIsSelected = isSelected;
- repaint();
- }
- }
-
- @Override
- public void setBounds(Rectangle rect) {
- super.setBounds(rect);
-
- mInnerBounds = getBounds().getCopy();
- if (mInnerBounds.width > 0) {
- mInnerBounds.width--;
- }
- if (mInnerBounds.height > 0) {
- mInnerBounds.height--;
- }
- }
-
- public Rectangle getInnerBounds() {
- return mInnerBounds;
- }
-
- @Override
- protected void paintBorder(Graphics graphics) {
- super.paintBorder(graphics);
-
- if (mIsSelected || (mProvider != null && mProvider.hasOutline())) {
- graphics.setLineWidth(1);
- graphics.setLineStyle(SWT.LINE_SOLID);
- graphics.setForegroundColor(mIsSelected ? ColorConstants.red : ColorConstants.white);
- graphics.drawRectangle(getInnerBounds());
- }
- }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/LayoutFigure.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/LayoutFigure.java
deleted file mode 100644
index a4e3573..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/LayoutFigure.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2008 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.parts;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.parts.UiElementsEditPartFactory.IOutlineProvider;
-import com.android.ide.eclipse.adt.internal.editors.layout.parts.UiLayoutEditPart.HighlightInfo;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.swt.SWT;
-
-/**
- * The figure used to draw the feedback on a layout.
- * <p/>
- * By default the figure is transparent and empty.
- * The base {@link ElementFigure} knows how to draw the selection border.
- * This figure knows how to draw the drop feedback.
- *
- * @since GLE1
- */
-class LayoutFigure extends ElementFigure {
-
- private HighlightInfo mHighlightInfo;
-
- public LayoutFigure(IOutlineProvider provider) {
- super(provider);
- }
-
- public void setHighlighInfo(HighlightInfo highlightInfo) {
- mHighlightInfo = highlightInfo;
- repaint();
- }
-
- /**
- * Paints the "border" for this figure.
- * <p/>
- * The parent {@link Figure#paint(Graphics)} calls {@link #paintFigure(Graphics)} then
- * {@link #paintClientArea(Graphics)} then {@link #paintBorder(Graphics)}. Here we thus
- * draw the actual highlight border but also the highlight anchor lines and points so that
- * we can make sure they are all drawn on top of the border.
- * <p/>
- * Note: This method doesn't really need to restore its graphic state. The parent
- * Figure will do it for us.
- * <p/>
- *
- * @param graphics The Graphics object used for painting
- */
- @Override
- protected void paintBorder(Graphics graphics) {
- super.paintBorder(graphics);
-
- if (mHighlightInfo == null) {
- return;
- }
-
- // Draw the border. We want other highlighting to be drawn on top of the border.
- if (mHighlightInfo.drawDropBorder) {
- graphics.setLineWidth(3);
- graphics.setLineStyle(SWT.LINE_SOLID);
- graphics.setForegroundColor(ColorConstants.green);
- graphics.drawRectangle(getInnerBounds().getCopy().shrink(1, 1));
- }
-
- Rectangle bounds = getBounds();
- int bx = bounds.x;
- int by = bounds.y;
- int w = bounds.width;
- int h = bounds.height;
-
- // Draw frames of target child parts, if any
- if (mHighlightInfo.childParts != null) {
- graphics.setLineWidth(2);
- graphics.setLineStyle(SWT.LINE_DOT);
- graphics.setForegroundColor(ColorConstants.lightBlue);
- for (UiElementEditPart part : mHighlightInfo.childParts) {
- if (part != null) {
- graphics.drawRectangle(part.getBounds().getCopy().translate(bx, by));
- }
- }
- }
-
- // Draw the target line, if any
- if (mHighlightInfo.linePoints != null) {
- int x1 = mHighlightInfo.linePoints[0].x;
- int y1 = mHighlightInfo.linePoints[0].y;
- int x2 = mHighlightInfo.linePoints[1].x;
- int y2 = mHighlightInfo.linePoints[1].y;
-
- // if the line is right to the edge, draw it one pixel more inside so that the
- // full 2-pixel width be visible.
- if (x1 <= 0) x1++;
- if (x2 <= 0) x2++;
- if (y1 <= 0) y1++;
- if (y2 <= 0) y2++;
-
- if (x1 >= w - 1) x1--;
- if (x2 >= w - 1) x2--;
- if (y1 >= h - 1) y1--;
- if (y2 >= h - 1) y2--;
-
- x1 += bx;
- x2 += bx;
- y1 += by;
- y2 += by;
-
- graphics.setLineWidth(2);
- graphics.setLineStyle(SWT.LINE_DASH);
- graphics.setLineCap(SWT.CAP_ROUND);
- graphics.setForegroundColor(ColorConstants.orange);
- graphics.drawLine(x1, y1, x2, y2);
- }
-
- // Draw the anchor point, if any
- if (mHighlightInfo.anchorPoint != null) {
- int x = mHighlightInfo.anchorPoint.x;
- int y = mHighlightInfo.anchorPoint.y;
-
- // If the point is right on the edge, draw it one pixel inside so that it
- // matches the highlight line. It makes it slightly more visible that way.
- if (x <= 0) x++;
- if (y <= 0) y++;
- if (x >= w - 1) x--;
- if (y >= h - 1) y--;
- x += bx;
- y += by;
-
- graphics.setLineWidth(2);
- graphics.setLineStyle(SWT.LINE_SOLID);
- graphics.setLineCap(SWT.CAP_ROUND);
- graphics.setForegroundColor(ColorConstants.orange);
- graphics.drawLine(x-5, y-5, x+5, y+5);
- graphics.drawLine(x-5, y+5, x+5, y-5);
- // 7 * cos(45) == 5 so we use 8 for the circle radius (it looks slightly better than 7)
- graphics.setLineWidth(1);
- graphics.drawOval(x-8, y-8, 16, 16);
- }
- }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiDocumentEditPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiDocumentEditPart.java
deleted file mode 100644
index 9f6557c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiDocumentEditPart.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright (C) 2008 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.parts;
-
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.draw2d.AbstractBackground;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FreeformLayer;
-import org.eclipse.draw2d.FreeformLayout;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.editpolicies.RootComponentEditPolicy;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.PaletteData;
-import org.eclipse.swt.widgets.Display;
-
-import java.awt.image.BufferedImage;
-import java.awt.image.DataBufferInt;
-
-/**
- * Graphical edit part for the root document.
- * <p/>
- * It acts as a simple container.
- *
- * @since GLE1
- */
-public class UiDocumentEditPart extends UiElementEditPart {
-
- private Display mDisplay;
- private FreeformLayer mLayer;
- private ImageBackground mImage;
- private Label mChild = null;
-
- final static class ImageBackground extends AbstractBackground {
-
- private BufferedImage mBufferedImage;
- private Image mImage;
-
- ImageBackground() {
- }
-
- ImageBackground(BufferedImage image, Display display) {
- setImage(image, display);
- }
-
- @Override
- public void paintBackground(IFigure figure, Graphics graphics, Insets insets) {
- if (mImage != null) {
- Rectangle rect = getPaintRectangle(figure, insets);
- graphics.drawImage(mImage, rect.x, rect.y);
- }
- }
-
- void setImage(BufferedImage image, Display display) {
- if (image != null) {
- int[] data = ((DataBufferInt)image.getData().getDataBuffer()).getData();
-
- ImageData imageData = new ImageData(image.getWidth(), image.getHeight(), 32,
- new PaletteData(0x00FF0000, 0x0000FF00, 0x000000FF));
-
- imageData.setPixels(0, 0, data.length, data, 0);
-
- mImage = new Image(display, imageData);
- } else {
- mImage = null;
- }
- }
-
- BufferedImage getBufferedImage() {
- return mBufferedImage;
- }
- }
-
- public UiDocumentEditPart(UiDocumentNode uiDocumentNode, Display display) {
- super(uiDocumentNode);
- mDisplay = display;
- }
-
- @Override
- protected IFigure createFigure() {
- mLayer = new FreeformLayer();
- mLayer.setLayoutManager(new FreeformLayout());
-
- mLayer.setOpaque(true);
- mLayer.setBackgroundColor(ColorConstants.lightGray);
-
- return mLayer;
- }
-
- @Override
- protected void refreshVisuals() {
- UiElementNode model = (UiElementNode)getModel();
-
- Object editData = model.getEditData();
- if (editData instanceof BufferedImage) {
- BufferedImage image = (BufferedImage)editData;
-
- if (mImage == null || image != mImage.getBufferedImage()) {
- mImage = new ImageBackground(image, mDisplay);
- }
-
- mLayer.setBorder(mImage);
-
- if (mChild != null && mChild.getParent() == mLayer) {
- mLayer.remove(mChild);
- }
- } else if (editData instanceof String) {
- mLayer.setBorder(null);
- if (mChild == null) {
- mChild = new Label();
- }
- mChild.setText((String)editData);
-
- if (mChild != null && mChild.getParent() != mLayer) {
- mLayer.add(mChild);
- }
- Rectangle bounds = mChild.getTextBounds();
- bounds.x = bounds.y = 0;
- mLayer.setConstraint(mChild, bounds);
- }
-
- // refresh the children as well
- refreshChildrenVisuals();
- }
-
- @Override
- protected void hideSelection() {
- // no selection at this level.
- }
-
- @Override
- protected void showSelection() {
- // no selection at this level.
- }
-
- @Override
- protected void createEditPolicies() {
- super.createEditPolicies();
-
- // This policy indicates this a root component that cannot be removed
- installEditPolicy(EditPolicy.COMPONENT_ROLE, new RootComponentEditPolicy());
-
- installLayoutEditPolicy(this);
- }
-
- /**
- * Returns the EditPart that should be used as the target for the specified Request.
- * For instance this is called during drag'n'drop with a CreateRequest.
- * <p/>
- * For the root document, we want the first child edit part to the be the target
- * since an XML document can have only one root element.
- *
- * {@inheritDoc}
- */
- @Override
- public EditPart getTargetEditPart(Request request) {
- if (request != null && request.getType() == RequestConstants.REQ_CREATE) {
- // We refuse the drop if it's not in the bounds of the document.
- if (request instanceof DropRequest) {
- Point where = ((DropRequest) request).getLocation().getCopy();
- UiElementNode uiNode = getUiNode();
- if (uiNode instanceof UiDocumentNode) {
- // Take the bounds of the background image as the valid drop zone
- Object editData = uiNode.getEditData();
- if (editData instanceof BufferedImage) {
- BufferedImage image = (BufferedImage)editData;
- int w = image.getWidth();
- int h = image.getHeight();
- if (where.x > w || where.y > h) {
- return null;
- }
- }
-
- }
- }
-
- // For the root document, we want the first child edit part to the be the target
- // since an XML document can have only one root element.
- if (getChildren().size() > 0) {
- Object o = getChildren().get(0);
- if (o instanceof EditPart) {
- return ((EditPart) o).getTargetEditPart(request);
- }
- }
- }
- return super.getTargetEditPart(request);
- }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiDocumentTreeEditPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiDocumentTreeEditPart.java
deleted file mode 100644
index b78c519..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiDocumentTreeEditPart.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2008 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.parts;
-
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-
-import java.util.List;
-
-/**
- * Implementation of {@link UiElementTreeEditPart} for the document root.
- *
- * @since GLE1
- */
-public class UiDocumentTreeEditPart extends UiElementTreeEditPart {
-
- public UiDocumentTreeEditPart(UiDocumentNode model) {
- super(model);
- }
-
- @SuppressWarnings("unchecked")
- @Override
- protected List getModelChildren() {
- return getUiNode().getUiChildren();
- }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiElementEditPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiElementEditPart.java
deleted file mode 100644
index 75c7b6d..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiElementEditPart.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
- * Copyright (C) 2008 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.parts;
-
-import com.android.ide.eclipse.adt.internal.editors.descriptors.ElementDescriptor;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.IUiUpdateListener;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-import com.android.sdklib.SdkConstants;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
-import org.eclipse.gef.editpolicies.LayoutEditPolicy;
-import org.eclipse.gef.editpolicies.SelectionEditPolicy;
-import org.eclipse.gef.requests.CreateRequest;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.gef.tools.SelectEditPartTracker;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-import java.util.List;
-
-/**
- * An {@link EditPart} for a {@link UiElementNode}.
- *
- * @since GLE1
- */
-public abstract class UiElementEditPart extends AbstractGraphicalEditPart
- implements IUiUpdateListener {
-
- public UiElementEditPart(UiElementNode uiElementNode) {
- setModel(uiElementNode);
- }
-
- //-------------------------
- // Derived classes must define these
-
- abstract protected void hideSelection();
- abstract protected void showSelection();
-
- //-------------------------
- // Base class overrides
-
- @Override
- public DragTracker getDragTracker(Request request) {
- return new SelectEditPartTracker(this);
- }
-
- @Override
- protected void createEditPolicies() {
- /*
- * This is no longer needed, as a selection edit policy is set by the parent layout.
- * Leave this code commented out right now, I'll want to play with this later.
- *
- installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE,
- new NonResizableSelectionEditPolicy(this));
- */
- }
-
- /* (non-javadoc)
- * Returns a List containing the children model objects.
- * Must not return null, instead use the super which returns an empty list.
- */
- @SuppressWarnings("unchecked")
- @Override
- protected List getModelChildren() {
- return getUiNode().getUiChildren();
- }
-
- @Override
- public void activate() {
- super.activate();
- getUiNode().addUpdateListener(this);
- }
-
- @Override
- public void deactivate() {
- super.deactivate();
- getUiNode().removeUpdateListener(this);
- }
-
- @Override
- protected void refreshVisuals() {
- if (getFigure().getParent() != null) {
- ((GraphicalEditPart) getParent()).setLayoutConstraint(this, getFigure(), getBounds());
- }
-
- // update the visuals of the children as well
- refreshChildrenVisuals();
- }
-
- protected void refreshChildrenVisuals() {
- if (children != null) {
- for (Object child : children) {
- if (child instanceof UiElementEditPart) {
- UiElementEditPart childPart = (UiElementEditPart)child;
- childPart.refreshVisuals();
- }
- }
- }
- }
-
- //-------------------------
- // IUiUpdateListener implementation
-
- public void uiElementNodeUpdated(UiElementNode ui_node, UiUpdateState state) {
- // TODO: optimize by refreshing only when needed
- switch(state) {
- case ATTR_UPDATED:
- refreshVisuals();
- break;
- case CHILDREN_CHANGED:
- refreshChildren();
-
- // new children list, need to update the layout
- refreshVisuals();
- break;
- case CREATED:
- refreshVisuals();
- break;
- case DELETED:
- // pass
- break;
- }
- }
-
- //-------------------------
- // Local methods
-
- /** @return The object model casted to an {@link UiElementNode} */
- public final UiElementNode getUiNode() {
- return (UiElementNode) getModel();
- }
-
- protected final ElementDescriptor getDescriptor() {
- return getUiNode().getDescriptor();
- }
-
- protected final UiElementEditPart getEditPartParent() {
- EditPart parent = getParent();
- if (parent instanceof UiElementEditPart) {
- return (UiElementEditPart)parent;
- }
- return null;
- }
-
- /**
- * Returns a given XML attribute.
- * @param attrName The local name of the attribute.
- * @return the attribute as a {@link String}, if it exists, or <code>null</code>
- */
- protected final String getStringAttr(String attrName) {
- UiElementNode uiNode = getUiNode();
- if (uiNode.getXmlNode() != null) {
- Node xmlNode = uiNode.getXmlNode();
- if (xmlNode != null) {
- NamedNodeMap nodeAttributes = xmlNode.getAttributes();
- if (nodeAttributes != null) {
- Node attr = nodeAttributes.getNamedItemNS(
- SdkConstants.NS_RESOURCES, attrName);
- if (attr != null) {
- return attr.getNodeValue();
- }
- }
- }
- }
- return null;
- }
-
- protected final Rectangle getBounds() {
- UiElementNode model = (UiElementNode)getModel();
-
- Object editData = model.getEditData();
-
- if (editData != null) {
- // assert with fully qualified class name to prevent import changes to another
- // Rectangle class.
- assert (editData instanceof org.eclipse.draw2d.geometry.Rectangle);
-
- return (Rectangle)editData;
- }
-
- // return a dummy rect
- return new Rectangle(0, 0, 0, 0);
- }
-
- /**
- * Returns the EditPart that should be used as the target for the specified Request.
- * <p/>
- * For instance this is called during drag'n'drop with a CreateRequest.
- * <p/>
- * Reject being a target for elements which descriptor does not allow children.
- *
- * {@inheritDoc}
- */
- @Override
- public EditPart getTargetEditPart(Request request) {
- if (request != null && request.getType() == RequestConstants.REQ_CREATE) {
- // Reject being a target for elements which descriptor does not allow children.
- if (!getUiNode().getDescriptor().hasChildren()) {
- return null;
- }
- }
- return super.getTargetEditPart(request);
- }
-
- /**
- * Used by derived classes {@link UiDocumentEditPart} and {@link UiLayoutEditPart}
- * to accept drag'n'drop of new items from the palette.
- *
- * @param layoutEditPart The layout edit part where this policy is installed. It can
- * be either a {@link UiDocumentEditPart} or a {@link UiLayoutEditPart}.
- */
- protected void installLayoutEditPolicy(final UiElementEditPart layoutEditPart) {
- // This policy indicates how elements can be constrained by the layout.
- // TODO Right now we use the XY layout policy since our constraints are
- // handled by the android rendering engine rather than GEF. Tweak as
- // appropriate.
- installEditPolicy(EditPolicy.LAYOUT_ROLE, new LayoutEditPolicy() {
-
- /**
- * We don't allow layout children to be resized yet.
- * <p/>
- * Typical choices would be:
- * <ul>
- * <li> ResizableEditPolicy, to allow for selection, move and resize.
- * <li> NonResizableEditPolicy, to allow for selection, move but not resize.
- * <li> SelectionEditPolicy to allow for only selection.
- * </ul>
- * <p/>
- * TODO: make this depend on the part layout. For an AbsoluteLayout we should
- * probably use a NonResizableEditPolicy and SelectionEditPolicy for the rest.
- * Whether to use ResizableEditPolicy or NonResizableEditPolicy should depend
- * on the child in an AbsoluteLayout.
- */
- @Override
- protected EditPolicy createChildEditPolicy(EditPart child) {
- if (child instanceof UiElementEditPart) {
- return new NonResizableSelectionEditPolicy((UiElementEditPart) child);
- }
- return null;
- }
-
- @Override
- protected Command getCreateCommand(CreateRequest request) {
- // We store the ElementDescriptor in the request.factory.type
- Object newType = request.getNewObjectType();
- if (newType instanceof ElementDescriptor) {
- Point where = request.getLocation().getCopy();
- Point origin = getLayoutContainer().getClientArea().getLocation();
- where.translate(origin.getNegated());
-
- // The host is the EditPart where this policy is installed,
- // e.g. this UiElementEditPart.
- EditPart host = getHost();
- if (host instanceof UiElementEditPart) {
-
- return new ElementCreateCommand((ElementDescriptor) newType,
- (UiElementEditPart) host,
- where);
- }
- }
-
- return null;
- }
-
- @Override
- protected Command getMoveChildrenCommand(Request request) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public void showLayoutTargetFeedback(Request request) {
- super.showLayoutTargetFeedback(request);
-
- // for debugging
- // System.out.println("target: " + request.toString() + " -- " + layoutEditPart.getUiNode().getBreadcrumbTrailDescription(false));
-
- if (layoutEditPart instanceof UiLayoutEditPart &&
- request instanceof DropRequest) {
- Point where = ((DropRequest) request).getLocation().getCopy();
- Point origin = getLayoutContainer().getClientArea().getLocation();
- where.translate(origin.getNegated());
-
- ((UiLayoutEditPart) layoutEditPart).showDropTarget(where);
- }
- }
-
- @Override
- protected void eraseLayoutTargetFeedback(Request request) {
- super.eraseLayoutTargetFeedback(request);
- if (layoutEditPart instanceof UiLayoutEditPart) {
- ((UiLayoutEditPart) layoutEditPart).hideDropTarget();
- }
- }
-
- @Override
- protected IFigure createSizeOnDropFeedback(CreateRequest createRequest) {
- // TODO understand if this is useful for us or remove
- return super.createSizeOnDropFeedback(createRequest);
- }
-
- });
- }
-
- protected static class NonResizableSelectionEditPolicy extends SelectionEditPolicy {
-
- private final UiElementEditPart mEditPart;
-
- public NonResizableSelectionEditPolicy(UiElementEditPart editPart) {
- mEditPart = editPart;
- }
-
- @Override
- protected void hideSelection() {
- mEditPart.hideSelection();
- }
-
- @Override
- protected void showSelection() {
- mEditPart.showSelection();
- }
- }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiElementTreeEditPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiElementTreeEditPart.java
deleted file mode 100644
index 81737f8..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiElementTreeEditPart.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2008 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.parts;
-
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.gef.editparts.AbstractTreeEditPart;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-
-/**
- * Base {@link AbstractTreeEditPart} to represent {@link UiElementNode} objects in the
- * {@link IContentOutlinePage} linked to the layout editor.
- *
- * @since GLE1
- */
-public class UiElementTreeEditPart extends AbstractTreeEditPart {
-
- public UiElementTreeEditPart(UiElementNode uiElementNode) {
- setModel(uiElementNode);
- }
-
- @Override
- protected void createEditPolicies() {
- // TODO Auto-generated method stub
- super.createEditPolicies();
- }
-
- @Override
- protected Image getImage() {
- return getUiNode().getDescriptor().getIcon();
- }
-
- @Override
- protected String getText() {
- return getUiNode().getShortDescription();
- }
-
- @Override
- public void activate() {
- if (!isActive()) {
- super.activate();
- // TODO
- }
- }
-
- @Override
- public void deactivate() {
- if (isActive()) {
- super.deactivate();
- // TODO
- }
- }
-
- /**
- * Returns the casted model object represented by this {@link AbstractTreeEditPart}.
- */
- protected UiElementNode getUiNode() {
- return (UiElementNode)getModel();
- }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiElementTreeEditPartFactory.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiElementTreeEditPartFactory.java
deleted file mode 100644
index c10298c..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiElementTreeEditPartFactory.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2008 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.parts;
-
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.gef.editparts.AbstractTreeEditPart;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-
-/**
- * {@link EditPartFactory} to create {@link AbstractTreeEditPart} for {@link UiElementNode} objects.
- * These objects are used in the {@link IContentOutlinePage} linked to the layout editor.
- *
- * @since GLE1
- */
-public class UiElementTreeEditPartFactory implements EditPartFactory {
-
- public EditPart createEditPart(EditPart context, Object model) {
- if (model instanceof UiDocumentNode) {
- return new UiDocumentTreeEditPart((UiDocumentNode) model);
- } else if (model instanceof UiElementNode) {
- UiElementNode node = (UiElementNode) model;
- if (node.getDescriptor().hasChildren()) {
- return new UiLayoutTreeEditPart(node);
- } else {
- return new UiViewTreeEditPart(node);
- }
- }
- return null;
- }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiElementsEditPartFactory.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiElementsEditPartFactory.java
deleted file mode 100644
index 31a1e2e..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiElementsEditPartFactory.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2008 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.parts;
-
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiDocumentNode;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * A factory that returns the appropriate {@link EditPart} for a given model object.
- * <p/>
- * The only model objects we use are {@link UiElementNode} objects and they are
- * edited using {@link UiElementEditPart}.
- *
- * @since GLE1
- */
-public class UiElementsEditPartFactory implements EditPartFactory {
-
- private Display mDisplay;
- private boolean mShowOutline = false;
- private IOutlineProvider mProvider;
-
- public interface IOutlineProvider {
- boolean hasOutline();
- }
-
- public UiElementsEditPartFactory(Display display, IOutlineProvider provider) {
- mDisplay = display;
- mProvider = provider;
- }
-
- public EditPart createEditPart(EditPart context, Object model) {
- if (model instanceof UiDocumentNode) {
- return new UiDocumentEditPart((UiDocumentNode) model, mDisplay);
- } else if (model instanceof UiElementNode) {
- UiElementNode node = (UiElementNode) model;
-
- if (node.getDescriptor().hasChildren()) {
- return new UiLayoutEditPart(node, mProvider);
- }
-
- return new UiViewEditPart(node);
- }
- return null;
- }
-
- public void setShowOutline(boolean showOutline) {
- mShowOutline = showOutline;
- }
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiLayoutEditPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiLayoutEditPart.java
deleted file mode 100644
index d0495e2..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiLayoutEditPart.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright (C) 2008 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.parts;
-
-import com.android.ide.eclipse.adt.internal.editors.layout.parts.UiElementsEditPartFactory.IOutlineProvider;
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.XYLayout;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.ContainerEditPolicy;
-import org.eclipse.gef.requests.CreateRequest;
-
-/**
- * Graphical edit part for an {@link UiElementNode} that represents a ViewLayout.
- * <p/>
- * It acts as a simple container.
- *
- * @since GLE1
- */
-public final class UiLayoutEditPart extends UiElementEditPart {
-
- static class HighlightInfo {
- public boolean drawDropBorder;
- public UiElementEditPart[] childParts;
- public Point anchorPoint;
- public Point linePoints[];
-
- public final Point tempPoints[] = new Point[] { new Point(), new Point() };
-
- public void clear() {
- drawDropBorder = false;
- childParts = null;
- anchorPoint = null;
- linePoints = null;
- }
- }
-
- private final HighlightInfo mHighlightInfo = new HighlightInfo();
- private final IOutlineProvider mProvider;
-
- public UiLayoutEditPart(UiElementNode uiElementNode, IOutlineProvider provider) {
- super(uiElementNode);
- mProvider = provider;
- }
-
- @Override
- protected void createEditPolicies() {
- super.createEditPolicies();
-
- installEditPolicy(EditPolicy.CONTAINER_ROLE, new ContainerEditPolicy() {
- @Override
- protected Command getCreateCommand(CreateRequest request) {
- return null;
- }
- });
-
- installLayoutEditPolicy(this);
- }
-
- @Override
- protected IFigure createFigure() {
- IFigure f = new LayoutFigure(mProvider);
- f.setLayoutManager(new XYLayout());
- return f;
- }
-
- @Override
- protected void showSelection() {
- IFigure f = getFigure();
- if (f instanceof ElementFigure) {
- ((ElementFigure) f).setSelected(true);
- }
- }
-
- @Override
- protected void hideSelection() {
- IFigure f = getFigure();
- if (f instanceof ElementFigure) {
- ((ElementFigure) f).setSelected(false);
- }
- }
-
- public void showDropTarget(Point where) {
- if (where != null) {
- mHighlightInfo.clear();
- mHighlightInfo.drawDropBorder = true;
- DropFeedback.computeDropFeedback(this, mHighlightInfo, where);
-
- IFigure f = getFigure();
- if (f instanceof LayoutFigure) {
- ((LayoutFigure) f).setHighlighInfo(mHighlightInfo);
- }
- }
- }
-
- public void hideDropTarget() {
- mHighlightInfo.clear();
- IFigure f = getFigure();
- if (f instanceof LayoutFigure) {
- ((LayoutFigure) f).setHighlighInfo(mHighlightInfo);
- }
- }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiLayoutTreeEditPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiLayoutTreeEditPart.java
deleted file mode 100644
index 5e78b46..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiLayoutTreeEditPart.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2008 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.parts;
-
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import java.util.List;
-
-/**
- * Implementation of {@link UiElementTreeEditPart} for layout objects.
- *
- * @since GLE1
- */
-public class UiLayoutTreeEditPart extends UiElementTreeEditPart {
-
- public UiLayoutTreeEditPart(UiElementNode node) {
- super(node);
- }
-
- @SuppressWarnings("unchecked")
- @Override
- protected List getModelChildren() {
- return getUiNode().getUiChildren();
- }
-
-
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiViewEditPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiViewEditPart.java
deleted file mode 100644
index f90bd67..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiViewEditPart.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2008 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.parts;
-
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.XYLayout;
-
-/**
- * Graphical edit part for an {@link UiElementNode} that represents a View.
- *
- * @since GLE1
- */
-public class UiViewEditPart extends UiElementEditPart {
-
- public UiViewEditPart(UiElementNode uiElementNode) {
- super(uiElementNode);
- }
-
- @Override
- protected IFigure createFigure() {
- IFigure f = new ElementFigure(null);
- f.setLayoutManager(new XYLayout());
- return f;
- }
-
- @Override
- protected void showSelection() {
- IFigure f = getFigure();
- if (f instanceof ElementFigure) {
- ((ElementFigure) f).setSelected(true);
- }
- }
-
- @Override
- protected void hideSelection() {
- IFigure f = getFigure();
- if (f instanceof ElementFigure) {
- ((ElementFigure) f).setSelected(false);
- }
- }
-}
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiViewTreeEditPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiViewTreeEditPart.java
deleted file mode 100644
index 22cc952..0000000
--- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/parts/UiViewTreeEditPart.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008 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.parts;
-
-import com.android.ide.eclipse.adt.internal.editors.uimodel.UiElementNode;
-
-/**
- * Implementation of {@link UiElementTreeEditPart} for view objects.
- *
- * @since GLE1
- */
-public class UiViewTreeEditPart extends UiElementTreeEditPart {
-
- public UiViewTreeEditPart(UiElementNode node) {
- super(node);
- }
-
-}