summaryrefslogtreecommitdiff
path: root/designer
diff options
context:
space:
mode:
authorJens Ole Lauridsen <jlauridsen@google.com>2015-07-23 12:26:49 -0700
committerJens Ole Lauridsen <jlauridsen@google.com>2015-07-29 15:06:28 -0700
commit5d1efe374bc26a9f4adc167101a7bf312524238b (patch)
tree9878f03f4d5a7bfdc2601369e0c6ef595922576b /designer
parentd04101586cae1b4c10bb8900481837d896006b73 (diff)
downloadidea-5d1efe374bc26a9f4adc167101a7bf312524238b.tar.gz
Nele: Add dependency checks for palette.
The components on the palette that belong to a library that is not included in the current module will no longer be able to be dragged onto the designer. If the user clicks on the component on the palette, a dialog prompts the user if the library should be added to the module. Changes to the known list of missing libraries for the palette is detected from project save operations. Change-Id: I2b1a1093b9214c5c359192fb854e81f1bc28485d
Diffstat (limited to 'designer')
-rw-r--r--designer/src/com/android/tools/idea/uibuilder/palette/IconPreviewFactory.java3
-rw-r--r--designer/src/com/android/tools/idea/uibuilder/palette/NlPaletteItem.java19
-rw-r--r--designer/src/com/android/tools/idea/uibuilder/palette/NlPaletteModel.java20
-rw-r--r--designer/src/com/android/tools/idea/uibuilder/palette/NlPalettePanel.java191
-rw-r--r--designer/src/com/android/tools/idea/uibuilder/palette/palette.xml6
-rw-r--r--designer/testSrc/com/android/tools/idea/uibuilder/palette/NlPaletteModelTest.java8
6 files changed, 191 insertions, 56 deletions
diff --git a/designer/src/com/android/tools/idea/uibuilder/palette/IconPreviewFactory.java b/designer/src/com/android/tools/idea/uibuilder/palette/IconPreviewFactory.java
index b54b5dd503a..a32d6a9247d 100644
--- a/designer/src/com/android/tools/idea/uibuilder/palette/IconPreviewFactory.java
+++ b/designer/src/com/android/tools/idea/uibuilder/palette/IconPreviewFactory.java
@@ -117,6 +117,9 @@ public class IconPreviewFactory {
}
NlModel model = screenView.getModel();
NlComponent component = model.createComponent(screenView, tag, null, null, InsertType.CREATE_PREVIEW);
+ if (component == null) {
+ return null;
+ }
// Some components require a parent to render correctly.
xml = String.format(LINEAR_LAYOUT, component.getTag().getText());
diff --git a/designer/src/com/android/tools/idea/uibuilder/palette/NlPaletteItem.java b/designer/src/com/android/tools/idea/uibuilder/palette/NlPaletteItem.java
index cb279b0346c..7356627ba2e 100644
--- a/designer/src/com/android/tools/idea/uibuilder/palette/NlPaletteItem.java
+++ b/designer/src/com/android/tools/idea/uibuilder/palette/NlPaletteItem.java
@@ -17,9 +17,12 @@ package com.android.tools.idea.uibuilder.palette;
import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
+import com.google.common.base.Splitter;
import com.intellij.openapi.util.IconLoader;
import javax.swing.*;
+import java.util.Collections;
+import java.util.List;
public class NlPaletteItem {
private final String myTitle;
@@ -27,17 +30,19 @@ public class NlPaletteItem {
private final String myIconPath;
private final String myRepresentation;
private final String myId;
+ private final List<String> myLibraries;
private String myStructureTitle;
private String myFormat;
private Icon myIcon;
public NlPaletteItem(@NonNull String title, @NonNull String iconPath, @NonNull String tooltip, @NonNull String representation,
- @NonNull String id, @NonNull String structureTitle, @Nullable String format) {
+ @NonNull String id, @NonNull String libraries, @NonNull String structureTitle, @Nullable String format) {
myTitle = title;
myIconPath = iconPath;
myTooltip = tooltip;
myRepresentation = representation;
myId = id;
+ myLibraries = fromCommaSeparatedList(libraries);
myStructureTitle = structureTitle;
myFormat = format;
}
@@ -76,6 +81,11 @@ public class NlPaletteItem {
}
@NonNull
+ public List<String> getLibraries() {
+ return myLibraries;
+ }
+
+ @NonNull
public String getStructureTitle() {
return myStructureTitle;
}
@@ -85,4 +95,11 @@ public class NlPaletteItem {
return myFormat;
}
+ @NonNull
+ private static List<String> fromCommaSeparatedList(@NonNull String libraries) {
+ if (libraries.isEmpty()) {
+ return Collections.emptyList();
+ }
+ return Splitter.on(",").splitToList(libraries);
+ }
}
diff --git a/designer/src/com/android/tools/idea/uibuilder/palette/NlPaletteModel.java b/designer/src/com/android/tools/idea/uibuilder/palette/NlPaletteModel.java
index 22cff312a4b..aa2a33eb231 100644
--- a/designer/src/com/android/tools/idea/uibuilder/palette/NlPaletteModel.java
+++ b/designer/src/com/android/tools/idea/uibuilder/palette/NlPaletteModel.java
@@ -18,16 +18,14 @@ package com.android.tools.idea.uibuilder.palette;
import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
import com.android.annotations.VisibleForTesting;
+import com.google.common.base.Joiner;
import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.util.containers.HashMap;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
public class NlPaletteModel {
private static final Logger LOG = Logger.getInstance(NlPaletteModel.class);
@@ -45,9 +43,11 @@ public class NlPaletteModel {
private static final String ATTR_TITLE = "title";
private static final String ATTR_TOOLTIP = "tooltip";
private static final String ATTR_ICON = "icon";
+ private static final String ATTR_LIBRARY = "library";
private final List<NlPaletteGroup> myGroups;
private final Map<String, NlPaletteItem> myTag2Item;
+ private final Set<String> myLibrariesUsed;
private static NlPaletteModel ourInstance;
@NonNull
@@ -64,6 +64,11 @@ public class NlPaletteModel {
return myGroups;
}
+ @NonNull
+ public Set<String> getLibrariesUsed() {
+ return myLibrariesUsed;
+ }
+
@Nullable
public NlPaletteItem getItemByTagName(@NonNull String tagName) {
return myTag2Item.get(tagName);
@@ -73,6 +78,7 @@ public class NlPaletteModel {
NlPaletteModel() {
myGroups = new ArrayList<NlPaletteGroup>();
myTag2Item = new HashMap<String, NlPaletteItem>();
+ myLibrariesUsed = new HashSet<String>();
}
private void loadPalette() {
@@ -144,6 +150,7 @@ public class NlPaletteModel {
continue;
}
group.add(item);
+ myLibrariesUsed.addAll(item.getLibraries());
for (Element subItemElement : itemElement.getChildren(ELEM_ITEM)) {
NlPaletteItem subItem = loadItem(tag, subItemElement, null, item);
if (subItem == null) {
@@ -163,6 +170,9 @@ public class NlPaletteModel {
String tooltip = getAttributeValue(itemElement, ATTR_TOOLTIP, base != null ? base.getTooltip() : "");
String iconPath = getAttributeValue(itemElement, ATTR_ICON, base != null ? base.getIconPath() : "");
String id = getAttributeValue(itemElement, ATTR_ID, base != null ? base.getId() : "");
+ String libraries = base != null
+ ? Joiner.on(",").join(base.getLibraries())
+ : getAttributeValue(modelElement, ATTR_LIBRARY, "");
String creation = base != null
? getElementValue(itemElement, ELEM_CREATION, base.getRepresentation())
: getElementValue(modelElement, ELEM_CREATION, "");
@@ -178,7 +188,7 @@ public class NlPaletteModel {
if (id.isEmpty()) {
id = tagName;
}
- return new NlPaletteItem(title, iconPath, tooltip, creation, id, structureTitle, format);
+ return new NlPaletteItem(title, iconPath, tooltip, creation, id, libraries, structureTitle, format);
}
@NonNull
diff --git a/designer/src/com/android/tools/idea/uibuilder/palette/NlPalettePanel.java b/designer/src/com/android/tools/idea/uibuilder/palette/NlPalettePanel.java
index 2bf05f1930d..2fb5778ab9a 100644
--- a/designer/src/com/android/tools/idea/uibuilder/palette/NlPalettePanel.java
+++ b/designer/src/com/android/tools/idea/uibuilder/palette/NlPalettePanel.java
@@ -21,6 +21,7 @@ import com.android.ide.common.rendering.api.ResourceValue;
import com.android.ide.common.resources.ResourceResolver;
import com.android.tools.idea.configurations.Configuration;
import com.android.tools.idea.configurations.ConfigurationListener;
+import com.android.tools.idea.dependencies.DependencyManager;
import com.android.tools.idea.rendering.ImageUtils;
import com.android.tools.idea.rendering.ResourceHelper;
import com.android.tools.idea.uibuilder.editor.NlPreviewForm;
@@ -42,11 +43,16 @@ import com.intellij.ide.dnd.DnDSource;
import com.intellij.ide.dnd.aware.DnDAwareTree;
import com.intellij.ide.ui.LafManager;
import com.intellij.ide.ui.LafManagerListener;
+import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.actionSystem.impl.ActionManagerImpl;
import com.intellij.openapi.actionSystem.impl.MenuItemPresentationFactory;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.ide.CopyPasteManager;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.project.ex.ProjectEx;
+import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.wm.impl.content.ToolWindowContentUi;
import com.intellij.ui.ColoredTreeCellRenderer;
@@ -56,15 +62,22 @@ import com.intellij.ui.TreeSpeedSearch;
import com.intellij.util.IJSwingUtilities;
import com.intellij.util.ui.UIUtil;
import com.intellij.util.ui.tree.TreeUtil;
+import icons.AndroidIcons;
import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.tree.*;
import java.awt.*;
import java.awt.event.InputEvent;
+import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
import static javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER;
import static javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
@@ -72,11 +85,14 @@ import static javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
public class NlPalettePanel extends JPanel implements LightToolWindowContent, ConfigurationListener, LafManagerListener, DataProvider {
private static final Insets INSETS = new Insets(0, 6, 0, 6);
private static final double PREVIEW_SCALE = 0.5;
+ private static final int ICON_SPACER = 4;
- @NonNull private final DnDAwareTree myTree;
+ @NonNull private final JTree myTree;
@NonNull private final NlPaletteModel myModel;
@NonNull private final IconPreviewFactory myIconFactory;
@NonNull private final DesignerEditorPanelFacade myDesigner;
+ @NonNull private final Set<String> myMissingLibraries;
+ @NonNull private final Disposable myDisposable;
@NonNull private Mode myMode;
@Nullable private ScalableDesignSurface myDesignSurface;
@Nullable private BufferedImage myLastDragImage;
@@ -86,6 +102,8 @@ public class NlPalettePanel extends JPanel implements LightToolWindowContent, Co
myModel = NlPaletteModel.get();
myTree = new DnDAwareTree();
myIconFactory = IconPreviewFactory.get();
+ myMissingLibraries = new HashSet<String>();
+ myDisposable = Disposer.newDisposable();
myMode = Mode.ICON_AND_TEXT;
initTree();
JScrollPane pane = ScrollPaneFactory.createScrollPane(myTree, VERTICAL_SCROLLBAR_AS_NEEDED, HORIZONTAL_SCROLLBAR_NEVER);
@@ -128,6 +146,7 @@ public class NlPalettePanel extends JPanel implements LightToolWindowContent, Co
configuration.addListener(this);
}
}
+ checkForNewMissingDependencies();
setMode(myMode);
}
@@ -135,7 +154,8 @@ public class NlPalettePanel extends JPanel implements LightToolWindowContent, Co
LafManager manager = LafManager.getInstance();
if (doUpdate) {
manager.addLafManagerListener(this);
- } else {
+ }
+ else {
manager.removeLafManagerListener(this);
}
}
@@ -159,7 +179,8 @@ public class NlPalettePanel extends JPanel implements LightToolWindowContent, Co
if (resolver == null || myMode != Mode.PREVIEW) {
foreground = UIUtil.getTreeForeground();
background = UIUtil.getTreeBackground();
- } else {
+ }
+ else {
ResourceValue windowBackground = resolver.findItemInTheme("colorBackground", true);
background = ResourceHelper.resolveColor(resolver, windowBackground, configuration.getModule().getProject());
if (background == null) {
@@ -175,7 +196,8 @@ public class NlPalettePanel extends JPanel implements LightToolWindowContent, Co
if (Math.abs(ImageUtils.getBrightness(background.getRGB()) - ImageUtils.getBrightness(foreground.getRGB())) < 64) {
if (ImageUtils.getBrightness(background.getRGB()) < 128) {
foreground = JBColor.WHITE;
- } else {
+ }
+ else {
foreground = JBColor.BLACK;
}
}
@@ -235,9 +257,8 @@ public class NlPalettePanel extends JPanel implements LightToolWindowContent, Co
group.add(new TogglePaletteModeAction(this, Mode.ICON_AND_TEXT));
group.add(new TogglePaletteModeAction(this, Mode.PREVIEW));
- ActionPopupMenu popupMenu =
- ((ActionManagerImpl)ActionManager.getInstance())
- .createActionPopupMenu(ToolWindowContentUi.POPUP_PLACE, group, new MenuItemPresentationFactory(true));
+ ActionPopupMenu popupMenu = ((ActionManagerImpl)ActionManager.getInstance())
+ .createActionPopupMenu(ToolWindowContentUi.POPUP_PLACE, group, new MenuItemPresentationFactory(true));
popupMenu.getComponent().show(component, x, y);
}
@@ -259,7 +280,8 @@ public class NlPalettePanel extends JPanel implements LightToolWindowContent, Co
}
});
}
- } else {
+ }
+ else {
setColors();
invalidateUI();
}
@@ -287,8 +309,9 @@ public class NlPalettePanel extends JPanel implements LightToolWindowContent, Co
expandAll(myTree, rootNode);
myTree.setSelectionRow(0);
new PaletteSpeedSearch(myTree);
- enableDnD(myTree);
+ enableDnD();
updateColorsAfterColorThemeChange(true);
+ enableClickToLoadMissingDependency();
}
@@ -303,7 +326,7 @@ public class NlPalettePanel extends JPanel implements LightToolWindowContent, Co
}
private void createCellRenderer(@NonNull JTree tree) {
- tree.setCellRenderer(new ColoredTreeCellRenderer() {
+ ColoredTreeCellRenderer renderer = new ColoredTreeCellRenderer() {
@Override
public void customizeCellRenderer(@NonNull JTree tree,
Object value,
@@ -316,13 +339,30 @@ public class NlPalettePanel extends JPanel implements LightToolWindowContent, Co
Object content = node.getUserObject();
if (content instanceof NlPaletteItem) {
NlPaletteItem item = (NlPaletteItem)content;
- Image image = null;
- if (myMode == Mode.PREVIEW && myDesignSurface != null && myDesignSurface.getConfiguration() != null) {
+ BufferedImage image = null;
+ if (!needsLibraryLoad(item) && myMode == Mode.PREVIEW && myDesignSurface != null && myDesignSurface.getConfiguration() != null) {
image = myIconFactory.getImage(item, myDesignSurface.getConfiguration(), PREVIEW_SCALE);
}
if (image != null) {
setIcon(new ImageIcon(image));
- } else {
+ }
+ else if (needsLibraryLoad(item)) {
+ Icon icon = item.getIcon();
+ if (icon == null) {
+ icon = AndroidIcons.Views.View;
+ }
+ Icon download = AllIcons.Actions.Download;
+ image = UIUtil
+ .createImage(download.getIconWidth() + icon.getIconWidth() + ICON_SPACER, icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
+ Graphics2D g2 = (Graphics2D)image.getGraphics();
+ icon.paintIcon(myTree, g2, 0, 0);
+ download.paintIcon(myTree, g2, icon.getIconWidth() + ICON_SPACER, 0);
+ g2.dispose();
+
+ append(item.getTitle());
+ setIcon(new ImageIcon(image));
+ }
+ else {
append(item.getTitle());
setIcon(item.getIcon());
}
@@ -333,7 +373,13 @@ public class NlPalettePanel extends JPanel implements LightToolWindowContent, Co
setIcon(AllIcons.Nodes.Folder);
}
}
- });
+ };
+ renderer.setBorder(BorderFactory.createEmptyBorder(1, 1, 0, 0));
+ tree.setCellRenderer(renderer);
+ }
+
+ private boolean needsLibraryLoad(@NonNull NlPaletteItem item) {
+ return !Collections.disjoint(myMissingLibraries, item.getLibraries());
}
private static void addData(@NonNull NlPaletteModel model, @NonNull DefaultMutableTreeNode rootNode) {
@@ -347,9 +393,68 @@ public class NlPalettePanel extends JPanel implements LightToolWindowContent, Co
}
}
- private void enableDnD(@NonNull DnDAwareTree tree) {
+ private void enableDnD() {
final DnDManager dndManager = DnDManager.getInstance();
- dndManager.registerSource(new PaletteDnDSource(tree), tree);
+ dndManager.registerSource(new PaletteDnDSource(), myTree);
+ }
+
+ private void enableClickToLoadMissingDependency() {
+ myTree.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mousePressed(MouseEvent event) {
+ NlPaletteItem item = getItemForPath(myTree.getPathForLocation(event.getX(), event.getY()));
+ if (item != null && needsLibraryLoad(item)) {
+ Module module = getModule();
+ DependencyManager manager = module != null ? DependencyManager.getDependencyManager(module.getProject()) : null;
+ if (manager != null) { // todo: remove when DependencyManager has been implemented for other BUILD cases.
+ manager.ensureLibraryIsIncluded(module, item.getLibraries(), null);
+ }
+ }
+ }
+ });
+ ApplicationManager.getApplication().getMessageBus().connect(myDisposable)
+ .subscribe(ProjectEx.ProjectSaved.TOPIC, new ProjectEx.ProjectSaved() {
+ @Override
+ public void saved(@NotNull final Project project) {
+ Module module = getModule();
+ if (module != null && module.getProject().equals(project)) {
+ if (checkForNewMissingDependencies()) {
+ invalidateUI();
+ }
+ }
+ }
+ });
+ }
+
+ private boolean checkForNewMissingDependencies() {
+ Module module = getModule();
+ DependencyManager manager = module != null ? DependencyManager.getDependencyManager(module.getProject()) : null;
+ List<String> missing = Collections.emptyList();
+ if (manager != null) {
+ missing = manager.findMissingDependencies(module, myModel.getLibrariesUsed());
+ }
+ if (missing.size() == myMissingLibraries.size() && myMissingLibraries.containsAll(missing)) {
+ return false;
+ }
+ myMissingLibraries.clear();
+ myMissingLibraries.addAll(missing);
+ return true;
+ }
+
+ @Nullable
+ private Module getModule() {
+ Configuration configuration = myDesignSurface != null ? myDesignSurface.getConfiguration() : null;
+ return configuration != null ? configuration.getModule() : null;
+ }
+
+ @Nullable
+ private static NlPaletteItem getItemForPath(@Nullable TreePath path) {
+ if (path == null) {
+ return null;
+ }
+ DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
+ Object content = node.getUserObject();
+ return content instanceof NlPaletteItem ? (NlPaletteItem)content : null;
}
@Override
@@ -361,30 +466,22 @@ public class NlPalettePanel extends JPanel implements LightToolWindowContent, Co
}
}
updateColorsAfterColorThemeChange(false);
+ Disposer.dispose(myDisposable);
}
private class PaletteDnDSource implements DnDSource {
- private final DnDAwareTree myTree;
-
- private PaletteDnDSource(@NonNull DnDAwareTree tree) {
- myTree = tree;
- }
@Override
public boolean canStartDragging(DnDAction action, Point dragOrigin) {
- TreePath path = myTree.getClosestPathForLocation(dragOrigin.x, dragOrigin.y);
- DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
- Object content = node.getUserObject();
- return content instanceof NlPaletteItem;
+ NlPaletteItem item = getItemForPath(myTree.getPathForLocation(dragOrigin.x, dragOrigin.y));
+ return item != null && !needsLibraryLoad(item);
}
@Override
public DnDDragStartBean startDragging(DnDAction action, Point dragOrigin) {
TreePath path = myTree.getClosestPathForLocation(dragOrigin.x, dragOrigin.y);
- DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
- Object content = node.getUserObject();
- assert content instanceof NlPaletteItem;
- NlPaletteItem item = (NlPaletteItem)content;
+ NlPaletteItem item = getItemForPath(path);
+ assert item != null;
Dimension size = null;
if (myDesignSurface != null) {
ScreenView screenView = myDesignSurface.getCurrentScreenView();
@@ -425,7 +522,18 @@ public class NlPalettePanel extends JPanel implements LightToolWindowContent, Co
myLastDragImage = null;
}
if (image == null) {
- image = (BufferedImage)DnDAwareTree.getDragImage(myTree, path, dragOrigin).getFirst();
+ int row = myTree.getRowForPath(path);
+ Component comp =
+ myTree.getCellRenderer().getTreeCellRendererComponent(myTree, path.getLastPathComponent(), false, true, true, row, false);
+ comp.setForeground(myTree.getForeground());
+ comp.setBackground(myTree.getBackground());
+ comp.setFont(myTree.getFont());
+ comp.setSize(comp.getPreferredSize());
+ image = UIUtil.createImage(comp.getWidth(), comp.getHeight(), BufferedImage.TYPE_INT_ARGB);
+ Graphics2D g2 = (Graphics2D)image.getGraphics();
+ g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f));
+ comp.paint(g2);
+ g2.dispose();
}
return Pair.<Image, Point>pair(image, new Point(-image.getWidth() / 2, -image.getHeight() / 2));
}
@@ -447,17 +555,12 @@ public class NlPalettePanel extends JPanel implements LightToolWindowContent, Co
@Override
protected boolean isMatchingElement(Object element, String pattern) {
- if (element == null || pattern == null) {
+ if (pattern == null) {
return false;
}
TreePath path = (TreePath)element;
- DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
- Object content = node.getUserObject();
- if (!(content instanceof NlPaletteItem)) {
- return false;
- }
- NlPaletteItem item = (NlPaletteItem)content;
- return compare(item.getTitle(), pattern);
+ NlPaletteItem item = getItemForPath(path);
+ return item != null && compare(item.getTitle(), pattern);
}
}
@@ -466,14 +569,10 @@ public class NlPalettePanel extends JPanel implements LightToolWindowContent, Co
@Override
public void performCopy(@NonNull DataContext dataContext) {
TreePath path = myTree.getSelectionPath();
- if (path != null) {
- DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getLastPathComponent();
- Object content = node.getUserObject();
- if (content instanceof NlPaletteItem) {
- NlPaletteItem item = (NlPaletteItem)content;
- DnDTransferComponent component = new DnDTransferComponent(item.getId(), item.getRepresentation(), 0, 0);
- CopyPasteManager.getInstance().setContents(new ItemTransferable(new DnDTransferItem(component)));
- }
+ NlPaletteItem item = getItemForPath(path);
+ if (item != null && !needsLibraryLoad(item)) {
+ DnDTransferComponent component = new DnDTransferComponent(item.getId(), item.getRepresentation(), 0, 0);
+ CopyPasteManager.getInstance().setContents(new ItemTransferable(new DnDTransferItem(component)));
}
}
diff --git a/designer/src/com/android/tools/idea/uibuilder/palette/palette.xml b/designer/src/com/android/tools/idea/uibuilder/palette/palette.xml
index 6015b9b064c..88d7a245358 100644
--- a/designer/src/com/android/tools/idea/uibuilder/palette/palette.xml
+++ b/designer/src/com/android/tools/idea/uibuilder/palette/palette.xml
@@ -138,6 +138,7 @@
<meta model="com.intellij.android.designer.model.RadViewComponent"
class="android.support.v7.widget.Toolbar"
+ library="appcompat-v7"
tag="android.support.v7.widget.Toolbar">
<palette title="Toolbar" icon="AndroidIcons.Views.Button"
@@ -1386,6 +1387,7 @@
<meta model="com.intellij.android.designer.model.RadViewComponent"
class="android.support.design.widget.FloatingActionButton"
+ library="design"
tag="android.support.design.widget.FloatingActionButton">
<palette title="Floating Action Button" icon="AndroidIcons.Views.ToggleButton"/>
@@ -1465,6 +1467,7 @@
<meta model="com.intellij.android.designer.model.RadViewContainer"
class="android.support.design.widget.CoordinatorLayout"
+ library="design"
tag="android.support.design.widget.CoordinatorLayout">
<palette title="CoordinatorLayout" icon="AndroidIcons.Views.AbsoluteLayout"
@@ -1485,6 +1488,7 @@
<meta model="com.intellij.android.designer.model.RadViewContainer"
class="android.support.design.widget.CollapsingToolbarLayout"
+ library="design"
tag="android.support.design.widget.CollapsingToolbarLayout">
<palette title="CollapsingToolbarLayout" icon="AndroidIcons.Views.VerticalLinearLayout"
@@ -1503,6 +1507,7 @@
<meta model="com.intellij.android.designer.model.RadViewContainer"
class="android.support.design.widget.AppBarLayout"
+ library="design"
tag="android.support.design.widget.AppBarLayout">
<palette title="AppBarLayout" icon="AndroidIcons.Views.FrameLayout"
@@ -1620,6 +1625,7 @@
layout="com.intellij.android.designer.model.layout.grid.RadGridLayout"
class="android.support.v7.widget.GridLayout"
tag="android.support.v7.widget.GridLayout"
+ library="gridlayout-v7"
fill="both">
<properties inplace="rowCount columnCount orientation "
diff --git a/designer/testSrc/com/android/tools/idea/uibuilder/palette/NlPaletteModelTest.java b/designer/testSrc/com/android/tools/idea/uibuilder/palette/NlPaletteModelTest.java
index ab2aaebd0cf..3e0df69cb2e 100644
--- a/designer/testSrc/com/android/tools/idea/uibuilder/palette/NlPaletteModelTest.java
+++ b/designer/testSrc/com/android/tools/idea/uibuilder/palette/NlPaletteModelTest.java
@@ -130,9 +130,9 @@ public class NlPaletteModelTest extends TestCase {
private static final List<NlPaletteGroup> GROUP_WITH_ITEM_OVERRIDES = Collections.singletonList(
makeGroup("Layouts",
- new NlPaletteItem("FrameLayout", "AndroidIcons.Views.FrameLayout", "A Layout for a single item.", FRAME_LAYOUT_CREATION, "FrameLayoutId", "FrameLayout", null),
- new NlPaletteItem("LinearLayout (Horizontal)", "AndroidIcons.Views.LinearLayout", "A Layout for a single row.", HORIZONTAL_LINEAR_LAYOUT_CREATION, "HorizontalLayout", "LinearLayout", " (%orientation%)"),
- new NlPaletteItem("LinearLayout (Vertical)", "AndroidIcons.Views.VerticalLinearLayout", "A Layout for a single column.", VERTICAL_LINEAR_LAYOUT_CREATION, "VerticalLayout", "LinearLayout", " (%orientation%)"))
+ new NlPaletteItem("FrameLayout", "AndroidIcons.Views.FrameLayout", "A Layout for a single item.", FRAME_LAYOUT_CREATION, "FrameLayoutId", "", "FrameLayout", null),
+ new NlPaletteItem("LinearLayout (Horizontal)", "AndroidIcons.Views.LinearLayout", "A Layout for a single row.", HORIZONTAL_LINEAR_LAYOUT_CREATION, "HorizontalLayout", "", "LinearLayout", " (%orientation%)"),
+ new NlPaletteItem("LinearLayout (Vertical)", "AndroidIcons.Views.VerticalLinearLayout", "A Layout for a single column.", VERTICAL_LINEAR_LAYOUT_CREATION, "VerticalLayout", "", "LinearLayout", " (%orientation%)"))
);
public void testSingleGroupWithItemOverrides() throws Exception {
@@ -218,7 +218,7 @@ public class NlPaletteModelTest extends TestCase {
"</meta-model>";
private static final List<NlPaletteGroup> GROUP_WITH_MISSING_DATA = Collections.singletonList(
- makeGroup("Layouts", new NlPaletteItem("ConstraintLayout", "", "", CONSTRAINT_LAYOUT_CREATION, "ConstraintLayout", "ConstraintLayout", null))
+ makeGroup("Layouts", new NlPaletteItem("ConstraintLayout", "", "", CONSTRAINT_LAYOUT_CREATION, "ConstraintLayout", "", "ConstraintLayout", null))
);
public void testGroupWithMissingData() throws Exception {