blob: 742f8d974d28bae28f8b175a676cd21b29ea23d9 [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.facet.ui;
import com.intellij.facet.*;
import com.intellij.ide.util.frameworkSupport.FrameworkSupportProviderBase;
import com.intellij.ide.util.frameworkSupport.FrameworkVersion;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleType;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.ui.configuration.FacetsProvider;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.List;
/**
* Provides facet-based framework support.
*
* @author nik
*/
public abstract class FacetBasedFrameworkSupportProvider<F extends Facet> extends FrameworkSupportProviderBase {
private static final Logger LOG = Logger.getInstance("#com.intellij.facet.ui.FacetBasedFrameworkSupportProvider");
@NonNls private static final String FACET_SUPPORT_PREFIX = "facet:";
private final FacetType<F, ?> myFacetType;
protected FacetBasedFrameworkSupportProvider(FacetType<F, ?> facetType) {
super(getProviderId(facetType), facetType.getPresentableName());
myFacetType = facetType;
}
/**
* Returns internal ID.
*
* @param facetType Facet type.
* @return ID.
* @see #getPrecedingFrameworkProviderIds()
*/
public static String getProviderId(final FacetType facetType) {
return FACET_SUPPORT_PREFIX + facetType.getStringId();
}
/**
* Returns internal ID.
*
* @param typeId Facet type ID.
* @return ID.
* @see #getPrecedingFrameworkProviderIds()
*/
public static String getProviderId(final FacetTypeId<?> typeId) {
return getProviderId(FacetTypeRegistry.getInstance().findFacetType(typeId));
}
@Override
@Nullable
public String getUnderlyingFrameworkId() {
FacetTypeId<?> typeId = myFacetType.getUnderlyingFacetType();
if (typeId == null) return null;
return getProviderId(FacetTypeRegistry.getInstance().findFacetType(typeId));
}
@Override
public boolean isEnabledForModuleType(@NotNull final ModuleType moduleType) {
return myFacetType.isSuitableModuleType(moduleType);
}
@Override
public boolean isSupportAlreadyAdded(@NotNull final Module module, @NotNull FacetsProvider facetsProvider) {
return !facetsProvider.getFacetsByType(module, myFacetType.getId()).isEmpty();
}
@Override
public Icon getIcon() {
return myFacetType.getIcon();
}
@Override
protected void addSupport(@NotNull final Module module, @NotNull final ModifiableRootModel rootModel, final FrameworkVersion version, final @Nullable Library library) {
FacetManager facetManager = FacetManager.getInstance(module);
ModifiableFacetModel model = facetManager.createModifiableModel();
Facet underlyingFacet = null;
FacetTypeId<?> underlyingFacetType = myFacetType.getUnderlyingFacetType();
if (underlyingFacetType != null) {
underlyingFacet = model.getFacetByType(underlyingFacetType);
LOG.assertTrue(underlyingFacet != null, underlyingFacetType);
}
F facet = facetManager.createFacet(myFacetType, myFacetType.getDefaultFacetName(), underlyingFacet);
setupConfiguration(facet, rootModel, version);
if (library != null) {
onLibraryAdded(facet, library);
}
model.addFacet(facet);
model.commit();
onFacetCreated(facet, rootModel, version);
}
/**
* Called last after facet and library have been setup.
*
* @param facet Created facet.
* @param rootModel Model.
* @param version Framework version.
*/
protected void onFacetCreated(final F facet, final ModifiableRootModel rootModel, final FrameworkVersion version) {
}
protected void onLibraryAdded(final F facet, final @NotNull Library library) {
}
/**
* Tune facet before it is added.
*
* @param facet Facet to be created.
* @param rootModel Model.
* @param version Framework version.
*/
protected abstract void setupConfiguration(final F facet, final ModifiableRootModel rootModel, final FrameworkVersion version);
/**
* Override to e.g. add libraries to artifacts.
*
* @param module Module.
* @param addedLibraries Framework libraries.
*/
public void processAddedLibraries(final Module module, final List<Library> addedLibraries) {
}
}