package com.intellij.lang.javascript.flex.actions.newfile;
import com.intellij.javascript.flex.mxml.MxmlJSClass;
import com.intellij.javascript.flex.mxml.schema.CodeContext;
import com.intellij.javascript.flex.mxml.schema.CodeContextHolder;
import com.intellij.javascript.flex.mxml.schema.FlexSchemaHandler;
import com.intellij.lang.javascript.JavaScriptSupportLoader;
import com.intellij.lang.javascript.flex.FlexBundle;
import com.intellij.lang.javascript.flex.projectStructure.model.FlexBuildConfigurationManager;
import com.intellij.lang.javascript.validation.fixes.CreateClassOrInterfaceFix;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NonNls;
import java.util.Collection;
public class NewFlexComponentAction extends NewActionScriptClassAction {
@NonNls private static final String FLEX3_COMPONENT_TEMPLATE_NAME = "Flex 3 Component";
@NonNls private static final String FLEX4_COMPONENT_TEMPLATE_NAME = "Flex 4 Component";
private static final String[] FLEX_CLASSIFIER_TEMPLATES =
new String[]{FLEX3_COMPONENT_TEMPLATE_NAME, FLEX4_COMPONENT_TEMPLATE_NAME};
public static boolean isClassifierTemplate(String templateName) {
return ArrayUtil.contains(templateName, FLEX_CLASSIFIER_TEMPLATES);
}
@Override
protected boolean isAvailableIn(final Module module) {
return super.isAvailableIn(module) && !FlexBuildConfigurationManager.getInstance(module).getActiveConfiguration().isPureAs();
}
@Override
protected CreateClassOrInterfaceFix createAction(final PsiDirectory dir) {
return new CreateFlexComponentFix(dir);
}
@Override
protected String getCommandName() {
return FlexBundle.message("new.flex.component.command.name");
}
public static void setParentComponent(final MxmlJSClass clazz, final String newParentQname) {
Pair<String, String> prefixAndNamespace = getPrefixAndNamespace(clazz.getParent(), newParentQname);
clazz.setBaseComponent(newParentQname, prefixAndNamespace.first, prefixAndNamespace.second);
}
public static Pair<String, String> getPrefixAndNamespace(XmlTag tag, String qName) {
Module module = ModuleUtilCore.findModuleForPsiElement(tag);
boolean isFlex4Template = ArrayUtil.contains(JavaScriptSupportLoader.MXML_URI3, tag.knownNamespaces());
CodeContextHolder holder = CodeContextHolder.getInstance(module.getProject());
// ensure namespace is loaded into code context (including all the namespaces from all the libraries)
CodeContext.getContext(MxmlJSClass.MXML_URI4, module);
Collection<String> namespaces = holder.getNamespaces(module);
String[] illegalNamespaces =
isFlex4Template ? new String[]{JavaScriptSupportLoader.MXML_URI} : MxmlJSClass.FLEX_4_NAMESPACES;
for (String namespace : namespaces) {
if (ArrayUtil.contains(namespace, illegalNamespaces) || CodeContext.isPackageBackedNamespace(namespace)) {
continue;
}
CodeContext codeContext =
CodeContext.isStdNamespace(namespace) ? holder.getStandardContext(namespace, module) : holder.getCodeContext(namespace, module);
if (codeContext == null) {
continue;
}
if (codeContext.getElementDescriptor(StringUtil.getShortName(qName), qName) != null) {
return Pair.create(FlexSchemaHandler.getDefaultPrefix(namespace), namespace);
}
}
String packageName = StringUtil.getPackageName(qName);
String namespace = StringUtil.isEmpty(packageName) ? "*" : packageName + ".*";
return Pair.create(FlexSchemaHandler.getDefaultPrefix(namespace), namespace);
}
}