blob: 44270fe9ade8473dc9baae1f0e566271710e7ac6 [file] [log] [blame]
/*
* Copyright 2000-2009 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.uiDesigner.palette;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.wm.WindowManager;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.search.ProjectScope;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.uiDesigner.UIDesignerBundle;
import com.intellij.uiDesigner.compiler.Utils;
import com.intellij.uiDesigner.core.GridConstraints;
import com.intellij.uiDesigner.lw.StringDescriptor;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.util.HashMap;
/**
* @author yole
*/
public class AddComponentAction extends AnAction {
public void actionPerformed(AnActionEvent e) {
Project project = e.getData(CommonDataKeys.PROJECT);
if (project == null) return;
GroupItem groupItem = e.getData(GroupItem.DATA_KEY);
PsiFile psiFile = e.getData(CommonDataKeys.PSI_FILE);
PsiElement elementToAdd = (psiFile != null) ? findElementToAdd(psiFile) : null;
String className = "";
if (elementToAdd instanceof PsiClass) {
className = ((PsiClass) elementToAdd).getQualifiedName();
assert className != null;
}
else if (elementToAdd instanceof PsiFile) {
try {
className = Utils.getBoundClassName(elementToAdd.getText());
}
catch (Exception e1) {
className = "";
}
}
// Show dialog
final ComponentItem itemToBeAdded = new ComponentItem(
project,
className,
null,
null,
new GridConstraints(),
new HashMap<String, StringDescriptor>(),
true/*all user defined components are removable*/,
false,
false
);
Window parentWindow = WindowManager.getInstance().suggestParentWindow(project);
final ComponentItemDialog dialog = new ComponentItemDialog(project, parentWindow, itemToBeAdded, false);
dialog.setTitle(UIDesignerBundle.message("title.add.component"));
dialog.showGroupChooser(groupItem);
dialog.show();
if(!dialog.isOK()){
return;
}
groupItem = dialog.getSelectedGroup();
// If the itemToBeAdded is already in palette do nothing
if(groupItem.containsItemClass(itemToBeAdded.getClassName())){
return;
}
assignDefaultIcon(project, itemToBeAdded);
// add to the group
final Palette palette = Palette.getInstance(project);
palette.addItem(groupItem, itemToBeAdded);
palette.fireGroupsChanged();
}
private static void assignDefaultIcon(final Project project, final ComponentItem itemToBeAdded) {
Palette palette = Palette.getInstance(project);
if (itemToBeAdded.getIconPath() == null || itemToBeAdded.getIconPath().length() == 0) {
PsiClass aClass =
JavaPsiFacade.getInstance(project).findClass(itemToBeAdded.getClassName().replace('$', '.'), ProjectScope.getAllScope(project));
while(aClass != null) {
final ComponentItem item = palette.getItem(aClass.getQualifiedName());
if (item != null) {
String iconPath = item.getIconPath();
if (iconPath != null && iconPath.length() > 0) {
itemToBeAdded.setIconPath(iconPath);
return;
}
}
aClass = aClass.getSuperClass();
}
}
}
@Override public void update(AnActionEvent e) {
Project project = e.getData(CommonDataKeys.PROJECT);
if (e.getData(GroupItem.DATA_KEY) != null ||
e.getData(ComponentItem.DATA_KEY) != null) {
e.getPresentation().setVisible(true);
GroupItem groupItem = e.getData(GroupItem.DATA_KEY);
e.getPresentation().setEnabled(project != null && (groupItem == null || !groupItem.isReadOnly()));
}
else {
PsiFile psiFile = e.getData(CommonDataKeys.PSI_FILE);
e.getPresentation().setVisible(psiFile != null && findElementToAdd(psiFile) != null);
}
}
@Nullable
private static PsiElement findElementToAdd(final PsiFile psiFile) {
if (psiFile.getFileType().equals(StdFileTypes.GUI_DESIGNER_FORM)) {
return psiFile;
}
else if (psiFile.getFileType().equals(StdFileTypes.JAVA)) {
final PsiClass psiClass = PsiTreeUtil.getChildOfType(psiFile, PsiClass.class);
Project project = psiFile.getProject();
final PsiClass componentClass =
JavaPsiFacade.getInstance(project).findClass(JComponent.class.getName(), ProjectScope.getAllScope(project));
if (psiClass != null && componentClass != null && psiClass.isInheritor(componentClass, true) && psiClass.getQualifiedName() != null) {
return psiClass;
}
}
return null;
}
}