diff --git a/plugins/android-designer/android-designer.iml b/plugins/android-designer/android-designer.iml
index 65508ce12892..79c2e83dd1e8 100644
--- a/plugins/android-designer/android-designer.iml
+++ b/plugins/android-designer/android-designer.iml
@@ -26,6 +26,7 @@
+
diff --git a/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ExtractStyleDialog.java b/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ExtractStyleDialog.java
index 705f7cf6ef0c..d32f70c54e52 100644
--- a/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ExtractStyleDialog.java
+++ b/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ExtractStyleDialog.java
@@ -100,7 +100,7 @@ public class ExtractStyleDialog extends DialogWrapper {
myRootNode = new CheckedTreeNode(null);
for (XmlAttribute attribute : tag.getAttributes()) {
String name = attribute.getName();
- if (!"style".equalsIgnoreCase(name)) {
+ if (!"style".equalsIgnoreCase(name) && name.startsWith("android:")) {
CheckedTreeNode treeNode = new CheckedTreeNode(attribute);
treeNode.setChecked(!"android:layout_width".equalsIgnoreCase(name) && !"android:layout_height".equalsIgnoreCase(name));
myRootNode.add(treeNode);
diff --git a/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ResourceDialog.java b/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ResourceDialog.java
index 9ec76683bcd1..e9ff9e1096fc 100644
--- a/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ResourceDialog.java
+++ b/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ResourceDialog.java
@@ -20,7 +20,9 @@ import com.android.resources.ResourceType;
import com.intellij.android.designer.model.RadViewComponent;
import com.intellij.android.designer.propertyTable.renderers.ResourceRenderer;
import com.intellij.designer.componentTree.TreeNodeDescriptor;
+import com.intellij.designer.utils.SizedIcon;
import com.intellij.icons.AllIcons;
+import com.intellij.ide.highlighter.XmlFileType;
import com.intellij.ide.util.treeView.AbstractTreeBuilder;
import com.intellij.ide.util.treeView.AbstractTreeStructure;
import com.intellij.ide.util.treeView.NodeDescriptor;
@@ -42,6 +44,7 @@ import com.intellij.ui.speedSearch.SpeedSearchUtil;
import com.intellij.ui.treeStructure.Tree;
import com.intellij.util.ArrayUtil;
import com.intellij.util.ui.tree.TreeUtil;
+import org.intellij.images.fileTypes.ImageFileTypeManager;
import org.jetbrains.android.actions.CreateResourceFileAction;
import org.jetbrains.android.actions.CreateXmlResourceDialog;
import org.jetbrains.android.facet.AndroidFacet;
@@ -65,6 +68,7 @@ import javax.swing.tree.TreeSelectionModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
+import java.io.IOException;
import java.util.*;
import java.util.List;
@@ -75,6 +79,10 @@ public class ResourceDialog extends DialogWrapper implements TreeSelectionListen
private static final String ANDROID = "@android:";
private static final String TYPE_KEY = "ResourceType";
+ private static final String TEXT = "Text";
+ private static final String IMAGE = "Image";
+ private static final String NONE = "None";
+
private static final Icon RESOURCE_ITEM_ICON = AllIcons.Css.Property;
private final Module myModule;
@@ -128,7 +136,7 @@ public class ResourceDialog extends DialogWrapper implements TreeSelectionListen
mySystemPanel = new ResourcePanel(facet, types, true);
myContentPanel = new JBTabbedPane();
- myContentPanel.setPreferredSize(new Dimension(500, 400));
+ myContentPanel.setPreferredSize(new Dimension(600, 500));
myContentPanel.addTab("Project", myProjectPanel.myComponent);
myContentPanel.addTab("System", mySystemPanel.myComponent);
@@ -193,9 +201,16 @@ public class ResourceDialog extends DialogWrapper implements TreeSelectionListen
myNewResourceFileAction.getTemplatePresentation().putClientProperty(TYPE_KEY, resourceGroup.getType());
actionGroup.add(myNewResourceFileAction);
}
- if (myComponent != null && ResourceType.STYLE.equals(resourceGroup.getType()) && myComponent.getTag().getAttributes().length > 0) {
- // TODO: add StyleItem
- //actionGroup.add(myExtractStyleAction);
+ if (myComponent != null && ResourceType.STYLE.equals(resourceGroup.getType())) {
+ boolean enabled = false;
+ for (XmlAttribute attribute : myComponent.getTag().getAttributes()) {
+ if (attribute.getName().startsWith("android:")) {
+ enabled = true;
+ break;
+ }
+ }
+ myExtractStyleAction.getTemplatePresentation().setEnabled(enabled);
+ actionGroup.add(myExtractStyleAction);
}
return actionManager.createActionPopupMenu(ActionPlaces.UNKNOWN, actionGroup);
@@ -350,6 +365,8 @@ public class ResourceDialog extends DialogWrapper implements TreeSelectionListen
String prefix = panel == myProjectPanel ? "@" : ANDROID;
myResultResourceName = prefix + element.getName();
}
+
+ panel.showPreview(element, isProjectPanel);
}
}
@@ -361,7 +378,13 @@ public class ResourceDialog extends DialogWrapper implements TreeSelectionListen
private class ResourcePanel {
public final Tree myTree;
public final AbstractTreeBuilder myTreeBuilder;
- public final JScrollPane myComponent;
+ public final JPanel myComponent;
+
+ private final JPanel myPreviewPanel;
+ private final JTextArea myTextArea;
+ private final JLabel myImageComponent;
+ private final JLabel myNoPreviewComponent;
+
private final ResourceGroup[] myGroups;
public ResourcePanel(AndroidFacet facet, ResourceType[] types, boolean system) {
@@ -420,7 +443,67 @@ public class ResourceDialog extends DialogWrapper implements TreeSelectionListen
});
new TreeSpeedSearch(myTree, TreeSpeedSearch.NODE_DESCRIPTOR_TOSTRING, true);
- myComponent = ScrollPaneFactory.createScrollPane(myTree);
+ myComponent = new JPanel(new BorderLayout(0, 5));
+ myComponent.add(ScrollPaneFactory.createScrollPane(myTree), BorderLayout.CENTER);
+
+ myPreviewPanel = new JPanel(new CardLayout());
+ myComponent.add(myPreviewPanel, BorderLayout.SOUTH);
+
+ myTextArea = new JTextArea(5, 20);
+ myPreviewPanel.add(ScrollPaneFactory.createScrollPane(myTextArea), TEXT);
+
+ myImageComponent = new JLabel();
+ myImageComponent.setHorizontalAlignment(SwingConstants.CENTER);
+ myImageComponent.setVerticalAlignment(SwingConstants.CENTER);
+ myPreviewPanel.add(myImageComponent, IMAGE);
+
+ myNoPreviewComponent = new JLabel("No Preview");
+ myNoPreviewComponent.setHorizontalAlignment(SwingConstants.CENTER);
+ myNoPreviewComponent.setVerticalAlignment(SwingConstants.CENTER);
+ myPreviewPanel.add(myNoPreviewComponent, NONE);
+ }
+
+ public void showPreview(@Nullable ResourceItem element, boolean isProjectPanel) {
+ CardLayout layout = (CardLayout)myPreviewPanel.getLayout();
+
+ if (element == null) {
+ layout.show(myPreviewPanel, NONE);
+ return;
+ }
+
+ try {
+ VirtualFile file = element.getFile();
+ if (file == null) {
+ myTextArea.setText(null); // XXX
+ myTextArea.setEditable(isProjectPanel);
+ layout.show(myPreviewPanel, TEXT);
+ }
+ else if (ImageFileTypeManager.getInstance().isImage(file)) {
+ Icon icon = element.getPreviewIcon();
+ if (icon == null) {
+ icon = new SizedIcon(100, 100, new ImageIcon(file.getPath()));
+ element.setPreviewIcon(icon);
+ }
+ myImageComponent.setIcon(icon);
+ layout.show(myPreviewPanel, IMAGE);
+ }
+ else if (file.getFileType() == XmlFileType.INSTANCE) {
+ String value = element.getPreviewString();
+ if (value == null) {
+ value = new String(file.contentsToByteArray());
+ element.setPreviewString(value);
+ }
+ myTextArea.setText(value);
+ myTextArea.setEditable(isProjectPanel);
+ layout.show(myPreviewPanel, TEXT);
+ }
+ else {
+ layout.show(myPreviewPanel, NONE);
+ }
+ }
+ catch (IOException e) {
+ layout.show(myPreviewPanel, NONE);
+ }
}
private void select(String type, String name) {
@@ -449,7 +532,7 @@ public class ResourceDialog extends DialogWrapper implements TreeSelectionListen
Collection resourceNames = manager.getValueResourceNames(resourceType);
for (String resourceName : resourceNames) {
- myItems.add(new ResourceItem(this, resourceName, RESOURCE_ITEM_ICON));
+ myItems.add(new ResourceItem(this, resourceName, null, RESOURCE_ITEM_ICON));
}
Set fileNames = new HashSet();
@@ -459,7 +542,7 @@ public class ResourceDialog extends DialogWrapper implements TreeSelectionListen
if (!resourceFile.isDirectory()) {
String fileName = AndroidCommonUtils.getResourceName(resourceType, resourceFile.getName());
if (fileNames.add(fileName)) {
- myItems.add(new ResourceItem(this, fileName, resourceFile.getFileType().getIcon()));
+ myItems.add(new ResourceItem(this, fileName, resourceFile, resourceFile.getFileType().getIcon()));
}
}
}
@@ -468,7 +551,7 @@ public class ResourceDialog extends DialogWrapper implements TreeSelectionListen
if (type == ResourceType.ID) {
for (String id : manager.getIds()) {
if (!resourceNames.contains(id)) {
- myItems.add(new ResourceItem(this, id, RESOURCE_ITEM_ICON));
+ myItems.add(new ResourceItem(this, id, null, RESOURCE_ITEM_ICON));
}
}
}
@@ -502,11 +585,15 @@ public class ResourceDialog extends DialogWrapper implements TreeSelectionListen
private static class ResourceItem {
private final ResourceGroup myGroup;
private final String myName;
+ private final VirtualFile myFile;
private final Icon myIcon;
+ private String myPreviewString;
+ private Icon myPreviewIcon;
- public ResourceItem(@NotNull ResourceGroup group, @NotNull String name, Icon icon) {
+ public ResourceItem(@NotNull ResourceGroup group, @NotNull String name, @Nullable VirtualFile file, Icon icon) {
myGroup = group;
myName = name;
+ myFile = file;
myIcon = icon;
}
@@ -518,10 +605,30 @@ public class ResourceDialog extends DialogWrapper implements TreeSelectionListen
return myGroup.getName() + "/" + myName;
}
+ public VirtualFile getFile() {
+ return myFile;
+ }
+
public Icon getIcon() {
return myIcon;
}
+ public String getPreviewString() {
+ return myPreviewString;
+ }
+
+ public void setPreviewString(String previewString) {
+ myPreviewString = previewString;
+ }
+
+ public Icon getPreviewIcon() {
+ return myPreviewIcon;
+ }
+
+ public void setPreviewIcon(Icon previewIcon) {
+ myPreviewIcon = previewIcon;
+ }
+
@Override
public String toString() {
return myName;
diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/utils/SizedIcon.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/utils/SizedIcon.java
new file mode 100644
index 000000000000..c8709ad4e1b9
--- /dev/null
+++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/utils/SizedIcon.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2000-2012 JetBrains s.r.o.
+ *
+ * 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.intellij.designer.utils;
+
+import javax.swing.*;
+import java.awt.*;
+
+/**
+ * @author Alexander Lobas
+ */
+public class SizedIcon implements Icon {
+ private final int myWidth;
+ private final int myHeight;
+ private final Image myImage;
+
+ public SizedIcon(int maxWidth, int maxHeight, ImageIcon icon) {
+ myWidth = Math.min(maxWidth, icon.getIconWidth());
+ myHeight = Math.min(maxHeight, icon.getIconHeight());
+ myImage = icon.getImage();
+ }
+
+ @Override
+ public void paintIcon(Component c, Graphics g, int x, int y) {
+ g.drawImage(myImage, x, y, myWidth, myHeight, null);
+ }
+
+ @Override
+ public int getIconWidth() {
+ return myWidth;
+ }
+
+ @Override
+ public int getIconHeight() {
+ return myHeight;
+ }
+}
\ No newline at end of file