EA-37024, EA-37013

This commit is contained in:
Alexander Lobas
2012-07-30 18:56:59 +04:00
parent c0ed41fda4
commit 846a0da114
6 changed files with 75 additions and 6 deletions
@@ -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
@@ -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<RadComponent> create() throws Exception {
myClassLoader = ProjectClassLoader.create(myTarget, myModule);
List<RadComponent> components = new ArrayList<RadComponent>();
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"));
@@ -46,7 +46,7 @@ public class RadViewComponent extends RadVisualComponent {
private List<Property> myProperties;
public XmlTag getTag() {
if (myTag.getParent() == null || !myTag.isValid()) {
if (myTag != null && (myTag.getParent() == null || !myTag.isValid())) {
return EmptyXmlTag.INSTANCE;
}
return myTag;
@@ -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) {
@@ -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() {
@@ -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);