package com.intellij.lang.javascript.uml.actions;
import com.intellij.diagram.DiagramBuilder;
import com.intellij.lang.javascript.JSBundle;
import com.intellij.lang.javascript.JavaScriptSupportLoader;
import com.intellij.lang.javascript.flex.ECMAScriptImportOptimizer;
import com.intellij.lang.javascript.flex.ImportUtils;
import com.intellij.lang.javascript.formatter.JSCodeStyleSettings;
import com.intellij.lang.javascript.psi.JSVarStatement;
import com.intellij.lang.javascript.psi.ecmal4.JSAttributeList;
import com.intellij.lang.javascript.psi.ecmal4.JSClass;
import com.intellij.lang.javascript.psi.impl.JSChangeUtil;
import com.intellij.lang.javascript.refactoring.JSVisibilityUtil;
import com.intellij.lang.javascript.refactoring.util.JSRefactoringUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.PlatformIcons;
/**
* @author Konstantin Bulenkov
* @author Kirill Safonov
*/
public class FlexCreateFieldFromDiagramAction extends NewJSMemberActionBase {
public FlexCreateFieldFromDiagramAction() {
super(JSBundle.message("new.field.action.text"), JSBundle.message("new.field.action.description"), PlatformIcons.FIELD_ICON);
}
@Override
public boolean isEnabledOn(Object o) {
return super.isEnabledOn(o) && !((JSClass)o).isInterface();
}
public Runnable prepare(final Object element, DiagramBuilder builder) {
final JSClass clazz = ((JSClass)element);
if (!JSRefactoringUtil.checkReadOnlyStatus(clazz, null, getTemplatePresentation().getText())) return null;
final JSCreateFieldDialog d = new JSCreateFieldDialog(clazz);
if (!d.showAndGet()) {
return null;
}
return () -> {
if (d.getFieldType().contains(".")) {
ImportUtils.doImport(clazz, d.getFieldType(), false);
}
StringBuilder var = new StringBuilder(JSVisibilityUtil.getVisibilityKeyword(JSAttributeList.AccessType.valueOf(d.getVisibility())));
var.append(" ");
if (d.isStatic()) {
var.append("static ");
}
var.append(d.isConstant() ? "const " : "var ");
var.append(d.getFieldName()).append(":").append(d.getFieldType());
if (StringUtil.isNotEmpty(d.getInitializer())) {
var.append("=").append(d.getInitializer());
}
var.append(JSCodeStyleSettings.getSemicolon(clazz.getContainingFile()));
JSVarStatement varStatement = (JSVarStatement)JSChangeUtil.createStatementFromText(clazz.getProject(), var.toString(),
JavaScriptSupportLoader.ECMA_SCRIPT_L4).getPsi();
JSRefactoringUtil.addMemberToTargetClass(clazz, varStatement);
new ECMAScriptImportOptimizer().processFile(clazz.getContainingFile()).run();
};
}
@Override
public String getActionName() {
return JSBundle.message("new.field.action.description");
}
}