| /* |
| * 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.impl.pointers; |
| |
| import com.intellij.facet.*; |
| import com.intellij.facet.pointers.FacetPointer; |
| import com.intellij.facet.pointers.FacetPointersManager; |
| import com.intellij.openapi.Disposable; |
| import com.intellij.openapi.module.ModifiableModuleModel; |
| import com.intellij.openapi.module.Module; |
| import com.intellij.openapi.module.ModuleManager; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.openapi.roots.ui.configuration.FacetsProvider; |
| import com.intellij.openapi.roots.ui.configuration.ModulesProvider; |
| import com.intellij.openapi.util.Disposer; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| /** |
| * @author nik |
| */ |
| public class FacetPointerImpl<F extends Facet> implements FacetPointer<F> { |
| private final FacetPointersManagerImpl myManager; |
| private String myModuleName; |
| private String myFacetTypeId; |
| private String myFacetName; |
| private F myFacet; |
| |
| public FacetPointerImpl(FacetPointersManagerImpl manager, String id) { |
| myManager = manager; |
| final int i = id.indexOf('/'); |
| myModuleName = id.substring(0, i); |
| |
| final int j = id.lastIndexOf('/'); |
| myFacetTypeId = id.substring(i + 1, j); |
| myFacetName = id.substring(j+1); |
| } |
| |
| public FacetPointerImpl(FacetPointersManagerImpl manager, final @NotNull F facet) { |
| myManager = manager; |
| myFacet = facet; |
| updateInfo(myFacet); |
| registerDisposable(); |
| } |
| |
| public void refresh() { |
| findAndSetFacet(); |
| |
| if (myFacet != null) { |
| updateInfo(myFacet); |
| } |
| } |
| |
| private void findAndSetFacet() { |
| if (myFacet == null) { |
| myFacet = findFacet(); |
| if (myFacet != null) { |
| registerDisposable(); |
| } |
| } |
| } |
| |
| private void registerDisposable() { |
| Disposer.register(myFacet, new Disposable() { |
| @Override |
| public void dispose() { |
| myManager.dispose(FacetPointerImpl.this); |
| myFacet = null; |
| } |
| }); |
| } |
| |
| private void updateInfo(final @NotNull F facet) { |
| myModuleName = facet.getModule().getName(); |
| myFacetTypeId = facet.getType().getStringId(); |
| myFacetName = facet.getName(); |
| } |
| |
| @Override |
| @NotNull |
| public Project getProject() { |
| return myManager.getProject(); |
| } |
| |
| @Override |
| public F getFacet() { |
| findAndSetFacet(); |
| return myFacet; |
| } |
| |
| @Nullable |
| private F findFacet() { |
| final Module module = ModuleManager.getInstance(myManager.getProject()).findModuleByName(myModuleName); |
| if (module == null) return null; |
| |
| final FacetType<F, ?> type = getFacetType(); |
| if (type == null) return null; |
| |
| return FacetManager.getInstance(module).findFacet(type.getId(), myFacetName); |
| } |
| |
| @Override |
| @Nullable |
| public F findFacet(@NotNull ModulesProvider modulesProvider, @NotNull FacetsProvider facetsProvider) { |
| final Module module = modulesProvider.getModule(myModuleName); |
| if (module == null) return null; |
| final FacetType<F, ?> type = getFacetType(); |
| if (type == null) return null; |
| return facetsProvider.findFacet(module, type.getId(), myFacetName); |
| } |
| |
| @Override |
| @NotNull |
| public String getModuleName() { |
| return myModuleName; |
| } |
| |
| @Override |
| @NotNull |
| public String getFacetName() { |
| return myFacetName; |
| } |
| |
| @Override |
| @NotNull |
| public String getId() { |
| return FacetPointersManager.constructId(myModuleName, myFacetTypeId, myFacetName); |
| } |
| |
| @Override |
| @NotNull |
| public String getFacetTypeId() { |
| return myFacetTypeId; |
| } |
| |
| @Override |
| @NotNull |
| public String getModuleName(@Nullable ModifiableModuleModel moduleModel) { |
| if (moduleModel != null && myFacet != null) { |
| final String newName = moduleModel.getNewName(myFacet.getModule()); |
| if (newName != null) { |
| return newName; |
| } |
| } |
| return myModuleName; |
| } |
| |
| @Override |
| @NotNull |
| public String getFacetName(@NotNull ModulesProvider modulesProvider, @NotNull FacetsProvider facetsProvider) { |
| if (myFacet != null) { |
| return modulesProvider.getFacetModel(myFacet.getModule()).getFacetName(myFacet); |
| } |
| return myFacetName; |
| } |
| |
| @Override |
| @Nullable |
| public FacetType<F, ?> getFacetType() { |
| //noinspection unchecked |
| return FacetTypeRegistry.getInstance().findFacetType(myFacetTypeId); |
| } |
| } |