| /* |
| * 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) { |
| } |
| } |