package com.intellij.lang.javascript.flex.actions.newfile;
import com.intellij.ide.util.PlatformPackageUtil;
import com.intellij.lang.LanguageNamesValidation;
import com.intellij.lang.javascript.JSBundle;
import com.intellij.lang.javascript.JavaScriptSupportLoader;
import com.intellij.lang.javascript.flex.FlexBundle;
import com.intellij.lang.javascript.psi.ecmal4.JSClass;
import com.intellij.lang.javascript.psi.impl.PublicInheritorFilter;
import com.intellij.lang.javascript.refactoring.ui.JSReferenceEditor;
import com.intellij.lang.javascript.refactoring.util.JSRefactoringUtil;
import com.intellij.lang.refactoring.NamesValidator;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiFile;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.util.ThreeState;
import javax.swing.*;
public class CreateFlexSkinDialog extends DialogWrapper {
private static final String SKINNABLE_COMPONENT_CLASS = "spark.components.supportClasses.SkinnableComponent";
private static final String DESTINATION_PACKAGE_RECENT_KEY = "CreateFlexSkinDialog.DESTINATION_PACKAGE_RECENT_KEY";
private static final String HOST_COMPONENT_RECENT_KEY = "CreateFlexSkinDialog.HOST_COMPONENT_RECENT_KEY";
private JPanel myMainPanel;
private JSReferenceEditor myPackageCombo;
private JSReferenceEditor myHostComponentCombo;
private final Module myModule;
private final String myPackageNameInitial;
private final PsiFile myContextFile;
private final String myHostComponentInitial;
private PsiDirectory myTargetDirectory;
protected CreateFlexSkinDialog(final Module module,
final String skinName,
final String packageName,
final String hostComponent,
PsiFile contextFile) {
super(module.getProject());
myModule = module;
myPackageNameInitial = packageName;
myContextFile = contextFile;
myHostComponentInitial = hostComponent;
setTitle(FlexBundle.message("create.skin", skinName));
init();
}
protected JComponent createCenterPanel() {
return myMainPanel;
}
public JComponent getPreferredFocusedComponent() {
return myPackageCombo.getChildComponent();
}
public String getPackageName() {
return myPackageCombo.getText().trim();
}
public String getHostComponent() {
return myHostComponentCombo.getText().trim();
}
protected void doOKAction() {
final NamesValidator namesValidator = LanguageNamesValidation.INSTANCE.forLanguage(JavaScriptSupportLoader.JAVASCRIPT.getLanguage());
final String packageName = getPackageName();
for (final String s : StringUtil.split(packageName, ".")) {
if (!namesValidator.isIdentifier(s, null)) {
setErrorText(JSBundle.message("invalid.package", packageName), myPackageCombo);
return;
}
}
myHostComponentCombo.updateRecents();
myPackageCombo.updateRecents();
myTargetDirectory = JSRefactoringUtil.chooseOrCreateDirectoryForClass(myModule.getProject(), myModule, getPackageScope(), packageName,
null, myContextFile.getParent(), ThreeState.UNSURE);
if (myTargetDirectory != null) {
super.doOKAction();
}
}
private GlobalSearchScope getPackageScope() {
return PlatformPackageUtil.adjustScope(myContextFile.getParent(), GlobalSearchScope.moduleWithDependenciesScope(myModule), false, true);
}
private void createUIComponents() {
myPackageCombo = JSReferenceEditor.forPackageName(myPackageNameInitial, myModule.getProject(), DESTINATION_PACKAGE_RECENT_KEY,
getPackageScope(), RefactoringBundle.message("choose.destination.package"));
myHostComponentCombo = createHostComponentCombo(myHostComponentInitial, myModule);
}
public static GlobalSearchScope getHostComponentScope(Module module) {
return GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(module);
}
public static JSReferenceEditor createHostComponentCombo(String text, Module module) {
final GlobalSearchScope scope = getHostComponentScope(module);
Condition<JSClass> filter = new PublicInheritorFilter(module.getProject(), SKINNABLE_COMPONENT_CLASS, scope, true);
return JSReferenceEditor.forClassName(text, module.getProject(), HOST_COMPONENT_RECENT_KEY, scope, null, filter,
FlexBundle.message("choose.host.component"));
}
public PsiDirectory getTargetDirectory() {
return myTargetDirectory;
}
}