package org.jetbrains.plugins.clojure.config;
import com.intellij.facet.Facet;
import com.intellij.facet.FacetModel;
import com.intellij.facet.FacetType;
import com.intellij.facet.FacetTypeRegistry;
import com.intellij.facet.autodetecting.DetectedFacetPresentation;
import com.intellij.facet.autodetecting.FacetDetector;
import com.intellij.facet.autodetecting.FacetDetectorRegistry;
import com.intellij.openapi.module.JavaModuleType;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleType;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileFilter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.clojure.ClojureBundle;
import org.jetbrains.plugins.clojure.ClojureIcons;
import org.jetbrains.plugins.clojure.file.ClojureFileType;
import javax.swing.*;
import java.util.Collection;
/**
* @author ilyas
*/
public class ClojureFacetType extends FacetType<ClojureFacet, ClojureFacetConfiguration> {
public static final ClojureFacetType INSTANCE = new ClojureFacetType();
private ClojureFacetType() {
super(ClojureFacet.ID, "Clojure", "Clojure");
}
public ClojureFacetConfiguration createDefaultConfiguration() {
return new ClojureFacetConfiguration();
}
public ClojureFacet createFacet(@NotNull Module module,
String name,
@NotNull ClojureFacetConfiguration configuration,
@Nullable Facet underlyingFacet) {
return new ClojureFacet(this, module, name, configuration, underlyingFacet);
}
public Icon getIcon() {
return ClojureIcons.CLOJURE_ICON_16x16;
}
public boolean isSuitableModuleType(ModuleType moduleType) {
return (moduleType instanceof JavaModuleType || "PLUGIN_MODULE".equals(moduleType.getId()));
}
public void registerDetectors(final FacetDetectorRegistry<ClojureFacetConfiguration> registry) {
FacetDetector<VirtualFile, ClojureFacetConfiguration> detector = new ClojureFacetDetector();
final Ref<Boolean> alreadyDetected = new Ref<Boolean>(false);
VirtualFileFilter filter = new VirtualFileFilter() {
public boolean accept(VirtualFile virtualFile) {
if (alreadyDetected.get()) return true;
alreadyDetected.set(true);
if (ClojureFileType.CLOJURE_DEFAULT_EXTENSION.equals(virtualFile.getExtension())) {
registry.customizeDetectedFacetPresentation(new ClojureFacetPresentation());
return true;
}
return false;
}
};
registry.registerUniversalDetector(ClojureFileType.CLOJURE_FILE_TYPE, filter, detector);
}
public static ClojureFacetType getInstance() {
final ClojureFacetType facetType = (ClojureFacetType) FacetTypeRegistry.getInstance().findFacetType(ClojureFacet.ID);
assert facetType != null;
return facetType;
}
private class ClojureFacetDetector extends FacetDetector<VirtualFile, ClojureFacetConfiguration> {
public ClojureFacetDetector() {
super("clojure-detector");
}
public ClojureFacetConfiguration detectFacet(VirtualFile source, Collection<ClojureFacetConfiguration> existentFacetConfigurations) {
if (!existentFacetConfigurations.isEmpty()) {
return existentFacetConfigurations.iterator().next();
}
return createDefaultConfiguration();
}
public void beforeFacetAdded(@NotNull Facet facet, FacetModel facetModel, @NotNull ModifiableRootModel model) {
}
}
private static class ClojureFacetPresentation extends DetectedFacetPresentation {
@Override
public String getAutodetectionPopupText(@NotNull Module module, @NotNull FacetType facetType, @NotNull String facetName, @NotNull VirtualFile[] files) {
return ClojureBundle.message("new.clojure.facet.detected");
}
}
}