diff --git a/plugins/android-designer/src/com/intellij/android/designer/model/RadCustomViewComponent.java b/plugins/android-designer/src/com/intellij/android/designer/model/RadCustomViewComponent.java index 8c5ddb5ec3fe..e1f0a6e4a45e 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/model/RadCustomViewComponent.java +++ b/plugins/android-designer/src/com/intellij/android/designer/model/RadCustomViewComponent.java @@ -25,7 +25,6 @@ import com.intellij.designer.model.MetaModel; import com.intellij.designer.model.RadComponent; import com.intellij.designer.propertyTable.Property; import com.intellij.designer.propertyTable.PropertyTable; -import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiClass; import com.intellij.psi.xml.XmlTag; @@ -71,7 +70,7 @@ public class RadCustomViewComponent extends RadViewComponent implements IConfigu new ChooseClassDialog(moduleProvider.getModule(), "Views", false, "android.view.View"); dialog.show(); - if (dialog.getExitCode() == DialogWrapper.OK_EXIT_CODE) { + if (dialog.isOK()) { return dialog.getClassName(); } diff --git a/plugins/android-designer/src/com/intellij/android/designer/model/RadFragment.java b/plugins/android-designer/src/com/intellij/android/designer/model/RadFragment.java index aa5b172006ae..78fcf85129f9 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/model/RadFragment.java +++ b/plugins/android-designer/src/com/intellij/android/designer/model/RadFragment.java @@ -24,7 +24,6 @@ import com.intellij.designer.ModuleProvider; import com.intellij.designer.model.RadComponent; import com.intellij.designer.propertyTable.Property; import com.intellij.designer.propertyTable.editors.TextEditor; -import com.intellij.openapi.ui.DialogWrapper; import org.jetbrains.android.dom.attrs.AttributeFormat; import org.jetbrains.annotations.Nullable; @@ -86,7 +85,7 @@ public class RadFragment extends RadViewComponent implements IConfigurableCompon new ChooseClassDialog(moduleProvider.getModule(), "Fragments", true, "android.app.Fragment", "android.support.v4.app.Fragment"); dialog.show(); - if (dialog.getExitCode() == DialogWrapper.OK_EXIT_CODE) { + if (dialog.isOK()) { return dialog.getClassName(); } diff --git a/plugins/android-designer/src/com/intellij/android/designer/model/RadIncludeLayout.java b/plugins/android-designer/src/com/intellij/android/designer/model/RadIncludeLayout.java index 8dfc12729da3..25c18d6113c4 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/model/RadIncludeLayout.java +++ b/plugins/android-designer/src/com/intellij/android/designer/model/RadIncludeLayout.java @@ -41,7 +41,7 @@ public class RadIncludeLayout extends RadViewComponent implements IConfigurableC public void configure(RadComponent rootComponent) throws Exception { ModuleProvider moduleProvider = rootComponent.getClientProperty(ModelParser.MODULE_KEY); - ResourceDialog dialog = new ResourceDialog(moduleProvider.getModule(), IncludeLayoutProperty.TYPES, null); + ResourceDialog dialog = new ResourceDialog(moduleProvider.getModule(), IncludeLayoutProperty.TYPES, null, null); dialog.show(); if (dialog.getExitCode() == DialogWrapper.OK_EXIT_CODE) { diff --git a/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ChooseClassDialog.java b/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ChooseClassDialog.java index 23b901043cb0..67df90be0adf 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ChooseClassDialog.java +++ b/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ChooseClassDialog.java @@ -80,7 +80,7 @@ public class ChooseClassDialog extends DialogWrapper implements ListSelectionLis }; setTitle(title); - getOKAction().setEnabled(false); + setOKActionEnabled(false); init(); } @@ -119,7 +119,7 @@ public class ChooseClassDialog extends DialogWrapper implements ListSelectionLis @Override public void valueChanged(ListSelectionEvent e) { PsiClass psiClass = (PsiClass)myList.getSelectedValue(); - getOKAction().setEnabled(psiClass != null); + setOKActionEnabled(psiClass != null); myResultClassName = psiClass == null ? null : psiClass.getQualifiedName(); } } 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 new file mode 100644 index 000000000000..705f7cf6ef0c --- /dev/null +++ b/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ExtractStyleDialog.java @@ -0,0 +1,240 @@ +/* + * 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.android.designer.propertyTable.editors; + +import com.android.resources.ResourceType; +import com.intellij.openapi.actionSystem.ActionToolbarPosition; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.openapi.ui.ValidationInfo; +import com.intellij.psi.xml.XmlAttribute; +import com.intellij.psi.xml.XmlTag; +import com.intellij.ui.*; +import com.intellij.uiDesigner.core.GridConstraints; +import com.intellij.uiDesigner.core.GridLayoutManager; +import com.intellij.util.PlatformIcons; +import com.intellij.util.containers.Convertor; +import com.intellij.util.ui.tree.TreeUtil; +import org.jetbrains.android.actions.CreateXmlResourceDialog; +import org.jetbrains.android.util.AndroidResourceUtil; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.tree.TreePath; +import javax.swing.tree.TreeSelectionModel; +import java.awt.*; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Alexander Lobas + */ +public class ExtractStyleDialog extends DialogWrapper { + private final Module myModule; + private final String myFileName; + private final List myDirNames; + + private final JPanel myPanel; + private final JTextField myNameText; + private final CheckboxTree myTree; + + private final CheckedTreeNode myRootNode; + + public ExtractStyleDialog(Module module, String fileName, List dirNames, XmlTag tag) { + super(module.getProject()); + myModule = module; + myFileName = fileName; + myDirNames = dirNames; + + myPanel = new JPanel(new GridLayoutManager(3, 2)); + + JLabel nameLabel = new JLabel("Style name:"); + nameLabel.setDisplayedMnemonic('n'); + myPanel.add(nameLabel, + new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, 0, 0, null, null, null)); + + myNameText = new JTextField(); + myPanel.add(myNameText, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, + GridConstraints.SIZEPOLICY_CAN_GROW, 0, null, null, null)); + + nameLabel.setLabelFor(myNameText); + + myNameText.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + checkFinish(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + checkFinish(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + checkFinish(); + } + }); + + JLabel attributesLabel = new JLabel("Attributes:"); + attributesLabel.setDisplayedMnemonic('A'); + myPanel.add(attributesLabel, + new GridConstraints(1, 0, 1, 2, GridConstraints.ANCHOR_WEST, GridConstraints.FILL_NONE, 0, 0, null, null, null)); + + myRootNode = new CheckedTreeNode(null); + for (XmlAttribute attribute : tag.getAttributes()) { + String name = attribute.getName(); + if (!"style".equalsIgnoreCase(name)) { + CheckedTreeNode treeNode = new CheckedTreeNode(attribute); + treeNode.setChecked(!"android:layout_width".equalsIgnoreCase(name) && !"android:layout_height".equalsIgnoreCase(name)); + myRootNode.add(treeNode); + } + } + + CheckboxTree.CheckboxTreeCellRenderer renderer = new CheckboxTree.CheckboxTreeCellRenderer() { + @Override + public void customizeRenderer(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { + if (value instanceof CheckedTreeNode) { + XmlAttribute attribute = (XmlAttribute)((CheckedTreeNode)value).getUserObject(); + if (attribute != null) { + getTextRenderer().append(attribute.getLocalName()); + getTextRenderer().append(" [" + attribute.getValue() + "]", SimpleTextAttributes.GRAY_ITALIC_ATTRIBUTES); + } + } + } + }; + myTree = new CheckboxTree(renderer, myRootNode) { + @Override + protected void onNodeStateChanged(CheckedTreeNode node) { + checkFinish(); + } + + protected void installSpeedSearch() { + new TreeSpeedSearch(this, new Convertor() { + public String convert(TreePath path) { + Object object = path.getLastPathComponent(); + if (object instanceof CheckedTreeNode) { + XmlAttribute attribute = (XmlAttribute)((CheckedTreeNode)object).getUserObject(); + if (attribute != null) { + return attribute.getLocalName(); + } + } + return ""; + } + }); + } + }; + myTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); + myTree.setRootVisible(false); + myTree.setShowsRootHandles(false); + TreeUtil.expandAll(myTree); + + attributesLabel.setLabelFor(myTree); + + ToolbarDecorator decorator = ToolbarDecorator.createDecorator(myTree); + decorator.setToolbarPosition(ActionToolbarPosition.RIGHT); + decorator.setEditAction(null); + decorator.disableUpDownActions(); + + AnActionButton selectAll = new AnActionButton("Select All", null, PlatformIcons.SELECT_ALL_ICON) { + @Override + public void actionPerformed(AnActionEvent e) { + setChecked(true); + } + }; + decorator.addExtraAction(selectAll); + + AnActionButton unselectAll = new AnActionButton("Unselect All", null, PlatformIcons.UNSELECT_ALL_ICON) { + @Override + public void actionPerformed(AnActionEvent e) { + setChecked(false); + } + }; + decorator.addExtraAction(unselectAll); + + + myPanel.add(decorator.createPanel(), + new GridConstraints(2, 0, 1, 2, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, + GridConstraints.SIZEPOLICY_CAN_GROW, 0, null, null, null)); + + myPanel.setPreferredSize(new Dimension(400, -1)); + + setTitle("Extract Style"); + checkFinish(); + init(); + } + + private void checkFinish() { + if (AndroidResourceUtil.isCorrectAndroidResourceName(myNameText.getText().trim())) { + int count = myRootNode.getChildCount(); + for (int i = 0; i < count; i++) { + CheckedTreeNode treeNode = (CheckedTreeNode)myRootNode.getChildAt(i); + if (treeNode.isChecked()) { + setOKActionEnabled(true); + return; + } + } + } + setOKActionEnabled(false); + } + + private void setChecked(boolean value) { + int count = myRootNode.getChildCount(); + for (int i = 0; i < count; i++) { + ((CheckedTreeNode)myRootNode.getChildAt(i)).setChecked(value); + } + myTree.repaint(); + checkFinish(); + } + + @Override + protected JComponent createCenterPanel() { + return myPanel; + } + + @Override + public JComponent getPreferredFocusedComponent() { + return myNameText; + } + + @Override + protected ValidationInfo doValidate() { + return CreateXmlResourceDialog.checkIfResourceAlreadyExists(myModule, getStyleName(), ResourceType.STYLE, myDirNames, myFileName); + } + + @NotNull + public String getStyleName() { + return myNameText.getText(); + } + + @NotNull + public List getStyledAttributes() { + List attributes = new ArrayList(); + + int count = myRootNode.getChildCount(); + for (int i = 0; i < count; i++) { + CheckedTreeNode treeNode = (CheckedTreeNode)myRootNode.getChildAt(i); + if (treeNode.isChecked()) { + attributes.add((XmlAttribute)treeNode.getUserObject()); + } + } + + return attributes; + } +} \ No newline at end of file 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 e2803d2928b4..9ec76683bcd1 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 @@ -15,7 +15,9 @@ */ package com.intellij.android.designer.propertyTable.editors; +import com.android.resources.ResourceFolderType; 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.icons.AllIcons; @@ -23,19 +25,30 @@ import com.intellij.ide.util.treeView.AbstractTreeBuilder; import com.intellij.ide.util.treeView.AbstractTreeStructure; import com.intellij.ide.util.treeView.NodeDescriptor; import com.intellij.ide.util.treeView.NodeRenderer; +import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.xml.XmlAttribute; import com.intellij.ui.*; import com.intellij.ui.components.JBTabbedPane; 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.jetbrains.android.actions.CreateResourceFileAction; +import org.jetbrains.android.actions.CreateXmlResourceDialog; import org.jetbrains.android.facet.AndroidFacet; +import org.jetbrains.android.facet.AndroidRootUtil; import org.jetbrains.android.resourceManagers.ResourceManager; import org.jetbrains.android.util.AndroidCommonUtils; +import org.jetbrains.android.util.AndroidResourceUtil; import org.jetbrains.android.util.AndroidUtils; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; @@ -60,23 +73,53 @@ import java.util.List; */ public class ResourceDialog extends DialogWrapper implements TreeSelectionListener { private static final String ANDROID = "@android:"; + private static final String TYPE_KEY = "ResourceType"; private static final Icon RESOURCE_ITEM_ICON = AllIcons.Css.Property; + private final Module myModule; + private final RadViewComponent myComponent; + private final JBTabbedPane myContentPanel; private final ResourcePanel myProjectPanel; private final ResourcePanel mySystemPanel; private ColorPicker myColorPicker; - private final Action myNewResourceAction = new AbstractAction("New Resource...") { + + private final Action myNewResourceAction = new AbstractAction("New Resource", AllIcons.General.ComboArrowDown) { @Override public void actionPerformed(ActionEvent e) { - // TODO: Auto-generated method stub + JComponent component = (JComponent)e.getSource(); + ActionPopupMenu popupMenu = createNewResourcePopupMenu(); + popupMenu.getComponent().show(component, 0, component.getHeight()); } }; + private final AnAction myNewResourceValueAction = new AnAction() { + @Override + public void actionPerformed(AnActionEvent e) { + ResourceType type = (ResourceType)getTemplatePresentation().getClientProperty(TYPE_KEY); + createNewResourceValue(type); + } + }; + private final AnAction myNewResourceFileAction = new AnAction() { + @Override + public void actionPerformed(AnActionEvent e) { + ResourceType type = (ResourceType)getTemplatePresentation().getClientProperty(TYPE_KEY); + createNewResourceFile(type); + } + }; + private final AnAction myExtractStyleAction = new AnAction("Extract Style...") { + @Override + public void actionPerformed(AnActionEvent e) { + extractStyle(); + } + }; + private String myResultResourceName; - public ResourceDialog(Module module, ResourceType[] types, String value) { + public ResourceDialog(Module module, ResourceType[] types, String value, RadViewComponent component) { super(module.getProject()); + myModule = module; + myComponent = component; setTitle("Resources"); @@ -123,13 +166,126 @@ public class ResourceDialog extends DialogWrapper implements TreeSelectionListen myContentPanel.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { - myNewResourceAction.setEnabled(myContentPanel.getSelectedComponent() == myProjectPanel.myComponent); valueChanged(null); } }); - init(); valueChanged(null); + init(); + } + + private ActionPopupMenu createNewResourcePopupMenu() { + ActionManager actionManager = ActionManager.getInstance(); + DefaultActionGroup actionGroup = new DefaultActionGroup(); + + ResourceGroup resourceGroup = getSelectedElement(myProjectPanel.myTreeBuilder, ResourceGroup.class); + if (resourceGroup == null) { + resourceGroup = getSelectedElement(myProjectPanel.myTreeBuilder, ResourceItem.class).getGroup(); + } + + if (AndroidResourceUtil.VALUE_RESOURCE_TYPES.contains(resourceGroup.getType())) { + myNewResourceValueAction.getTemplatePresentation().setText("New " + resourceGroup + " Value..."); + myNewResourceValueAction.getTemplatePresentation().putClientProperty(TYPE_KEY, resourceGroup.getType()); + actionGroup.add(myNewResourceValueAction); + } + if (AndroidResourceUtil.XML_FILE_RESOURCE_TYPES.contains(resourceGroup.getType())) { + myNewResourceFileAction.getTemplatePresentation().setText("New " + resourceGroup + " File..."); + 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); + } + + return actionManager.createActionPopupMenu(ActionPlaces.UNKNOWN, actionGroup); + } + + private void createNewResourceValue(ResourceType resourceType) { + CreateXmlResourceDialog dialog = new CreateXmlResourceDialog(myModule, resourceType, null, null, true); + dialog.setTitle("New " + StringUtil.capitalize(resourceType.getDisplayName()) + " Value Resource"); + dialog.show(); + + if (!dialog.isOK()) { + return; + } + + Module moduleToPlaceResource = dialog.getModule(); + if (moduleToPlaceResource == null) { + return; + } + + String fileName = dialog.getFileName(); + List dirNames = dialog.getDirNames(); + String resValue = dialog.getValue(); + String resName = dialog.getResourceName(); + if (!AndroidResourceUtil.createValueResource(moduleToPlaceResource, resName, resourceType, fileName, dirNames, resValue)) { + return; + } + + PsiDocumentManager.getInstance(myModule.getProject()).commitAllDocuments(); + + myResultResourceName = "@" + resourceType.getName() + "/" + resName; + close(OK_EXIT_CODE); + } + + private void createNewResourceFile(ResourceType resourceType) { + AndroidFacet facet = AndroidFacet.getInstance(myModule); + PsiElement[] elements = CreateResourceFileAction.createFileResource(facet, resourceType, null, true); + + if (elements.length == 1) { + String name = ((PsiFile)elements[0]).getName(); + int index = name.lastIndexOf('.'); + if (index != -1) { + name = name.substring(0, index); + } + myResultResourceName = "@" + resourceType.getName() + "/" + name; + close(OK_EXIT_CODE); + } + } + + private void extractStyle() { + String fileName = AndroidResourceUtil.getDefaultResourceFileName(ResourceType.STYLE); + + VirtualFile[] dirs = {AndroidRootUtil.getResourceDir(AndroidFacet.getInstance(myModule))}; + List subDirs = AndroidResourceUtil.getResourceSubdirs(ResourceFolderType.VALUES.getName(), dirs); + List dirNames = new ArrayList(); + for (VirtualFile dir : subDirs) { + dirNames.add(dir.getName()); + } + + ExtractStyleDialog dialog = new ExtractStyleDialog(myModule, fileName, dirNames, myComponent.getTag()); + dialog.show(); + + if (!dialog.isOK()) { + return; + } + + final List attributes = dialog.getStyledAttributes(); + + StringBuilder value = new StringBuilder(); + for (XmlAttribute attribute : attributes) { + value.append("").append(attribute.getValue()).append("\n"); + } + + String resName = dialog.getStyleName(); + if (!AndroidResourceUtil.createValueResource(myModule, resName, ResourceType.STYLE, fileName, dirNames, value.toString())) { + return; + } + + PsiDocumentManager.getInstance(myModule.getProject()).commitAllDocuments(); + + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + for (XmlAttribute attribute : attributes) { + attribute.delete(); + } + } + }); + + myResultResourceName = "@style/" + resName; + close(OK_EXIT_CODE); } @Override @@ -144,7 +300,7 @@ public class ResourceDialog extends DialogWrapper implements TreeSelectionListen @Override protected Action[] createLeftSideActions() { - return super.createLeftSideActions();//new Action[]{myNewResourceAction}; + return new Action[]{myNewResourceAction}; } @Override @@ -164,26 +320,35 @@ public class ResourceDialog extends DialogWrapper implements TreeSelectionListen super.doOKAction(); } + @Nullable + private static T getSelectedElement(AbstractTreeBuilder treeBuilder, Class elementClass) { + Set elements = treeBuilder.getSelectedElements(elementClass); + return elements.isEmpty() ? null : elements.iterator().next(); + } + @Override public void valueChanged(@Nullable TreeSelectionEvent e) { Component selectedComponent = myContentPanel.getSelectedComponent(); if (selectedComponent == myColorPicker) { Color color = myColorPicker.getColor(); - getOKAction().setEnabled(color != null); + setOKActionEnabled(color != null); + myNewResourceAction.setEnabled(false); myResultResourceName = color == null ? null : "#" + toHex(color.getRed()) + toHex(color.getGreen()) + toHex(color.getBlue()); } else { - ResourcePanel panel = selectedComponent == myProjectPanel.myComponent ? myProjectPanel : mySystemPanel; - Set elements = panel.myTreeBuilder.getSelectedElements(ResourceItem.class); - getOKAction().setEnabled(!elements.isEmpty()); + boolean isProjectPanel = selectedComponent == myProjectPanel.myComponent; + ResourcePanel panel = isProjectPanel ? myProjectPanel : mySystemPanel; + ResourceItem element = getSelectedElement(panel.myTreeBuilder, ResourceItem.class); + setOKActionEnabled(element != null); + myNewResourceAction.setEnabled(isProjectPanel && !panel.myTreeBuilder.getSelectedElements().isEmpty()); - if (elements.isEmpty()) { + if (element == null) { myResultResourceName = null; } else { String prefix = panel == myProjectPanel ? "@" : ANDROID; - myResultResourceName = prefix + elements.iterator().next().getName(); + myResultResourceName = prefix + element.getName(); } } } @@ -316,6 +481,10 @@ public class ResourceDialog extends DialogWrapper implements TreeSelectionListen }); } + public ResourceType getType() { + return myType; + } + public String getName() { return myType.getName(); } diff --git a/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ResourceEditor.java b/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ResourceEditor.java index 0f08b55dad2b..575519304e52 100644 --- a/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ResourceEditor.java +++ b/plugins/android-designer/src/com/intellij/android/designer/propertyTable/editors/ResourceEditor.java @@ -17,6 +17,7 @@ package com.intellij.android.designer.propertyTable.editors; import com.android.resources.ResourceType; import com.intellij.android.designer.model.ModelParser; +import com.intellij.android.designer.model.RadViewComponent; import com.intellij.designer.ModuleProvider; import com.intellij.designer.model.RadComponent; import com.intellij.designer.propertyTable.InplaceContext; @@ -26,7 +27,6 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.ComponentWithBrowseButton; -import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.ComboboxWithBrowseButton; @@ -50,6 +50,7 @@ public class ResourceEditor extends PropertyEditor { private final ResourceType[] myTypes; private ComponentWithBrowseButton myEditor; protected RadComponent myRootComponent; + private RadComponent myComponent; private JCheckBox myCheckBox; private final Border myCheckBoxBorder = new JTextField().getBorder(); private boolean myIgnoreCheckBoxValue; @@ -207,6 +208,7 @@ public class ResourceEditor extends PropertyEditor { Object object, @Nullable InplaceContext inplaceContext) { myRootComponent = rootComponent; + myComponent = component; String value = (String)object; JTextField text = getComboText(); @@ -270,10 +272,10 @@ public class ResourceEditor extends PropertyEditor { protected void showDialog() { ModuleProvider moduleProvider = myRootComponent.getClientProperty(ModelParser.MODULE_KEY); - ResourceDialog dialog = new ResourceDialog(moduleProvider.getModule(), myTypes, (String)getValue()); + ResourceDialog dialog = new ResourceDialog(moduleProvider.getModule(), myTypes, (String)getValue(), (RadViewComponent)myComponent); dialog.show(); - if (dialog.getExitCode() == DialogWrapper.OK_EXIT_CODE) { + if (dialog.isOK()) { setValue(dialog.getResourceName()); } else if (myBooleanResourceValue != null) { diff --git a/plugins/android/src/org/jetbrains/android/actions/CreateResourceFileAction.java b/plugins/android/src/org/jetbrains/android/actions/CreateResourceFileAction.java index 13ca21a45c5d..b6c2a0650fb0 100644 --- a/plugins/android/src/org/jetbrains/android/actions/CreateResourceFileAction.java +++ b/plugins/android/src/org/jetbrains/android/actions/CreateResourceFileAction.java @@ -94,7 +94,7 @@ public class CreateResourceFileAction extends CreateElementActionBase { @NotNull public static PsiElement[] createFileResource(@NotNull AndroidFacet facet, @NotNull final ResourceType resType, - @NotNull String resName, + @Nullable String resName, boolean chooseResName) { final CreateResourceFileAction action = getInstance(); diff --git a/plugins/android/src/org/jetbrains/android/actions/CreateXmlResourceDialog.java b/plugins/android/src/org/jetbrains/android/actions/CreateXmlResourceDialog.java index c40f66ff5189..de177fd26377 100644 --- a/plugins/android/src/org/jetbrains/android/actions/CreateXmlResourceDialog.java +++ b/plugins/android/src/org/jetbrains/android/actions/CreateXmlResourceDialog.java @@ -344,7 +344,7 @@ public class CreateXmlResourceDialog extends DialogWrapper { } @Nullable - private static ValidationInfo checkIfResourceAlreadyExists(@NotNull Module selectedModule, + public static ValidationInfo checkIfResourceAlreadyExists(@NotNull Module selectedModule, @NotNull String resourceName, @NotNull ResourceType resourceType, @NotNull List dirNames,