diff --git a/plugins/android-designer/src/com/intellij/android/designer/designSurface/AndroidDesignerEditorPanel.java b/plugins/android-designer/src/com/intellij/android/designer/designSurface/AndroidDesignerEditorPanel.java index 9bbc0ac8d7be..4df167a3cd20 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/designSurface/AndroidDesignerEditorPanel.java +++ b/plugins/android-designer/src/com/intellij/android/designer/designSurface/AndroidDesignerEditorPanel.java @@ -37,6 +37,7 @@ import com.intellij.designer.model.WrapInProvider; import com.intellij.designer.palette.DefaultPaletteItem; import com.intellij.designer.palette.PaletteGroup; import com.intellij.designer.palette.PaletteItem; +import com.intellij.designer.palette.PaletteToolWindowManager; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.IdeActions; @@ -270,6 +271,7 @@ public final class AndroidDesignerEditorPanel extends DesignerEditorPanel { float xdpi = deviceConfiguration.getDevice().getXDpi(); float ydpi = deviceConfiguration.getDevice().getYDpi(); + final boolean updatePalette = !Comparing.equal(myProfileAction.getProfileManager().getSelectedTarget(), myLastTarget); myLastTarget = manager.getSelectedTarget(); ThemeData theme = manager.getSelectedTheme(); @@ -308,6 +310,9 @@ public final class AndroidDesignerEditorPanel extends DesignerEditorPanel { if (!isProjectClosed()) { hideProgress(); runnable.consume(session); + if (updatePalette) { + updatePalette(myLastTarget); + } } } catch (Throwable e) { @@ -579,7 +584,38 @@ public final class AndroidDesignerEditorPanel extends DesignerEditorPanel { @Override public ComponentPasteFactory createPasteFactory(String xmlComponents) { - return new AndroidPasteFactory(getProject(), xmlComponents); + return new AndroidPasteFactory(getModule(), myLastTarget, xmlComponents); + } + + private void updatePalette(IAndroidTarget target) { + try { + ClassLoader classLoader = ProjectClassLoader.create(target, getModule()); + + for (PaletteGroup group : getPaletteGroups()) { + for (PaletteItem item : group.getItems()) { + if (item.getVersion() != null) { + DefaultPaletteItem paletteItem = (DefaultPaletteItem)item; + try { + String className = paletteItem.getMetaModel().getTarget(); + classLoader.loadClass(className); + paletteItem.setEnabled(true); + } + catch (Throwable e) { + paletteItem.setEnabled(false); + } + } + } + } + + PaletteItem item = getActivePaletteItem(); + if (item != null && !item.isEnabled()) { + activatePaletteItem(null); + } + + PaletteToolWindowManager.getInstance(getProject()).refresh(); + } + catch (Throwable e) { + } } @Override diff --git a/plugins/android-designer/src/com/intellij/android/designer/designSurface/AndroidPasteFactory.java b/plugins/android-designer/src/com/intellij/android/designer/designSurface/AndroidPasteFactory.java index 6d92b103e08e..28e257218ade 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/designSurface/AndroidPasteFactory.java +++ b/plugins/android-designer/src/com/intellij/android/designer/designSurface/AndroidPasteFactory.java @@ -15,6 +15,7 @@ */ package com.intellij.android.designer.designSurface; +import com.android.sdklib.IAndroidTarget; import com.intellij.android.designer.model.ModelParser; import com.intellij.android.designer.model.RadViewComponent; import com.intellij.android.designer.model.ViewsMetaManager; @@ -22,10 +23,11 @@ import com.intellij.designer.designSurface.tools.ComponentPasteFactory; import com.intellij.designer.model.MetaManager; import com.intellij.designer.model.MetaModel; import com.intellij.designer.model.RadComponent; -import com.intellij.openapi.project.Project; +import com.intellij.openapi.module.Module; import org.jdom.Document; import org.jdom.Element; import org.jdom.input.SAXBuilder; +import org.jetbrains.android.uipreview.ProjectClassLoader; import org.jetbrains.annotations.NotNull; import java.io.StringReader; @@ -38,17 +40,24 @@ import java.util.List; public class AndroidPasteFactory implements ComponentPasteFactory { public static final String KEY = "PASTE_DATA"; + private final Module myModule; + private final IAndroidTarget myTarget; private final MetaManager myMetaManager; private final String myXmlComponents; + private ClassLoader myClassLoader; - public AndroidPasteFactory(Project project, String xmlComponents) { - myMetaManager = ViewsMetaManager.getInstance(project); + public AndroidPasteFactory(Module module, IAndroidTarget target, String xmlComponents) { + myModule = module; + myTarget = target; + myMetaManager = ViewsMetaManager.getInstance(module.getProject()); myXmlComponents = xmlComponents; } @NotNull @Override public List create() throws Exception { + myClassLoader = ProjectClassLoader.create(myTarget, myModule); + List components = new ArrayList(); Document document = new SAXBuilder().build(new StringReader(myXmlComponents), "UTF-8"); @@ -62,6 +71,11 @@ public class AndroidPasteFactory implements ComponentPasteFactory { private RadComponent createComponent(Element element) throws Exception { MetaModel metaModel = myMetaManager.getModelByTag(element.getAttributeValue("tag")); + String target = metaModel.getTarget(); + if (target != null) { + myClassLoader.loadClass(target); + } + RadViewComponent component = ModelParser.createComponent(null, metaModel); component.setClientProperty(KEY, element.getChild("properties")); diff --git a/plugins/android-designer/src/com/intellij/android/designer/model/RadViewComponent.java b/plugins/android-designer/src/com/intellij/android/designer/model/RadViewComponent.java index 4e683afabd22..a8ef88b71866 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/model/RadViewComponent.java +++ b/plugins/android-designer/src/com/intellij/android/designer/model/RadViewComponent.java @@ -46,7 +46,7 @@ public class RadViewComponent extends RadVisualComponent { private List myProperties; public XmlTag getTag() { - if (myTag.getParent() == null || !myTag.isValid()) { + if (myTag != null && (myTag.getParent() == null || !myTag.isValid())) { return EmptyXmlTag.INSTANCE; } return myTag; diff --git a/plugins/android/src/org/jetbrains/android/uipreview/ProjectClassLoader.java b/plugins/android/src/org/jetbrains/android/uipreview/ProjectClassLoader.java index 9e4391d91e55..7a853889a766 100644 --- a/plugins/android/src/org/jetbrains/android/uipreview/ProjectClassLoader.java +++ b/plugins/android/src/org/jetbrains/android/uipreview/ProjectClassLoader.java @@ -1,5 +1,6 @@ package org.jetbrains.android.uipreview; +import com.android.sdklib.IAndroidTarget; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.roots.CompilerModuleExtension; @@ -7,6 +8,8 @@ import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.HashSet; import org.jetbrains.android.facet.AndroidRootUtil; +import org.jetbrains.android.sdk.AndroidPlatform; +import org.jetbrains.android.sdk.AndroidTargetData; import org.jetbrains.annotations.Nullable; import java.io.File; @@ -35,6 +38,13 @@ public final class ProjectClassLoader extends ClassLoader { myModule = module; } + public static ClassLoader create(IAndroidTarget target, Module module) throws Exception { + AndroidPlatform androidPlatform = AndroidPlatform.getInstance(module); + AndroidTargetData targetData = androidPlatform.getSdkData().getTargetData(target); + RenderServiceFactory factory = targetData.getRenderServiceFactory(module.getProject()); + return new ProjectClassLoader(factory.getLibrary().getClassLoader(), module); + } + @Override protected Class findClass(String name) throws ClassNotFoundException { if (mInsideJarClassLoader) { diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/palette/DefaultPaletteItem.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/palette/DefaultPaletteItem.java index cd57fd977e85..5262ee8726ad 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/palette/DefaultPaletteItem.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/palette/DefaultPaletteItem.java @@ -29,6 +29,7 @@ public class DefaultPaletteItem implements PaletteItem { private Icon myIcon; private final String myTooltip; private final String myVersion; + private boolean myEnabled = true; protected MetaModel myMetaModel; @@ -64,7 +65,11 @@ public class DefaultPaletteItem implements PaletteItem { @Override public boolean isEnabled() { - return true;//myVersion == null; + return myEnabled; + } + + public void setEnabled(boolean enabled) { + myEnabled = enabled; } public MetaModel getMetaModel() { diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/palette/PaletteToolWindowManager.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/palette/PaletteToolWindowManager.java index 965cdf8c7318..42bbe6e0fd34 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/palette/PaletteToolWindowManager.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/palette/PaletteToolWindowManager.java @@ -45,6 +45,10 @@ public class PaletteToolWindowManager extends AbstractToolWindowManager { myToolWindowPanel.clearActiveItem(); } + public void refresh() { + myToolWindowPanel.repaint(); + } + @Override protected void initToolWindow() { myToolWindow = ToolWindowManager.getInstance(myProject).registerToolWindow("Palette\t", false, ToolWindowAnchor.RIGHT, myProject, true);