diff --git a/source/com/intellij/facet/FacetModificationTrackingService.java b/lang-api/src/com/intellij/facet/FacetModificationTrackingService.java similarity index 64% rename from source/com/intellij/facet/FacetModificationTrackingService.java rename to lang-api/src/com/intellij/facet/FacetModificationTrackingService.java index c2e87d6764d3..058994d9bc38 100644 --- a/source/com/intellij/facet/FacetModificationTrackingService.java +++ b/lang-api/src/com/intellij/facet/FacetModificationTrackingService.java @@ -21,6 +21,8 @@ import org.jetbrains.annotations.NotNull; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleServiceManager; import com.intellij.openapi.util.ModificationTracker; +import com.intellij.openapi.util.ModificationTrackerListener; +import com.intellij.openapi.Disposable; /** * @author nik @@ -31,7 +33,16 @@ public abstract class FacetModificationTrackingService { return ModuleServiceManager.getService(module, FacetModificationTrackingService.class); } + public static FacetModificationTrackingService getInstance(@NotNull Facet facet) { + return ModuleServiceManager.getService(facet.getModule(), FacetModificationTrackingService.class); + } + @NotNull public abstract ModificationTracker getFacetModificationTracker(@NotNull Facet facet); + public abstract void incFacetModificationTracker(@NotNull Facet facet); + + public abstract void addModificationTrackerListener(final T facet, final ModificationTrackerListener listener, final Disposable parent); + + public abstract void removeModificationTrackerListener(final Facet facet, final ModificationTrackerListener listener); } diff --git a/platform-api/src/com/intellij/openapi/util/ModificationTrackerListener.java b/platform-api/src/com/intellij/openapi/util/ModificationTrackerListener.java index b7b32765b0d5..ccb431307967 100644 --- a/platform-api/src/com/intellij/openapi/util/ModificationTrackerListener.java +++ b/platform-api/src/com/intellij/openapi/util/ModificationTrackerListener.java @@ -21,6 +21,6 @@ import java.util.EventListener; /** * @author Gregory.Shrago */ -public interface ModificationTrackerListener extends EventListener { - void modificationCountChanged(T modificationTracker); +public interface ModificationTrackerListener extends EventListener { + void modificationCountChanged(T source); } diff --git a/source/com/intellij/facet/impl/FacetModificationTrackingServiceImpl.java b/source/com/intellij/facet/impl/FacetModificationTrackingServiceImpl.java index 64836804183e..7390ee785e1a 100644 --- a/source/com/intellij/facet/impl/FacetModificationTrackingServiceImpl.java +++ b/source/com/intellij/facet/impl/FacetModificationTrackingServiceImpl.java @@ -4,35 +4,58 @@ package com.intellij.facet.impl; -import com.intellij.facet.FacetModificationTrackingService; import com.intellij.facet.Facet; import com.intellij.facet.FacetManager; import com.intellij.facet.FacetManagerAdapter; -import com.intellij.openapi.util.ModificationTracker; +import com.intellij.facet.FacetModificationTrackingService; +import com.intellij.openapi.Disposable; import com.intellij.openapi.module.Module; +import com.intellij.openapi.util.ModificationTracker; +import com.intellij.openapi.util.ModificationTrackerListener; +import com.intellij.openapi.util.Pair; +import com.intellij.util.EventDispatcher; +import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import java.util.Map; -import java.util.HashMap; /** * @author nik */ public class FacetModificationTrackingServiceImpl extends FacetModificationTrackingService { - private Map myModificationsTrackers = new HashMap(); + private Map>> myModificationsTrackers = + new THashMap>>(); public FacetModificationTrackingServiceImpl(final Module module) { module.getMessageBus().connect().subscribe(FacetManager.FACETS_TOPIC, new FacetModificationTrackingListener()); } @NotNull - public ModificationTracker getFacetModificationTracker(@NotNull final Facet facet) { - FacetModificationTracker tracker = myModificationsTrackers.get(facet); - if (tracker == null) { - tracker = new FacetModificationTracker(); - myModificationsTrackers.put(facet, tracker); + public FacetModificationTracker getFacetModificationTracker(@NotNull final Facet facet) { + return getFacetInfo(facet).first; + } + + private Pair> getFacetInfo(final Facet facet) { + Pair> pair = myModificationsTrackers.get(facet); + if (pair == null) { + pair = Pair.create(new FacetModificationTracker(), EventDispatcher.create(ModificationTrackerListener.class)); + myModificationsTrackers.put(facet, pair); } - return tracker; + return pair; + } + + public void incFacetModificationTracker(@NotNull final Facet facet) { + final Pair> pair = getFacetInfo(facet); + pair.first.myModificationCount ++; + pair.second.getMulticaster().modificationCountChanged(facet); + } + + public void addModificationTrackerListener(final T facet, final ModificationTrackerListener listener, final Disposable parent) { + getFacetInfo(facet).second.addListener(listener, parent); + } + + public void removeModificationTrackerListener(final Facet facet, final ModificationTrackerListener listener) { + getFacetInfo(facet).second.removeListener(listener); } private static class FacetModificationTracker implements ModificationTracker { @@ -45,9 +68,10 @@ public class FacetModificationTrackingServiceImpl extends FacetModificationTrack private class FacetModificationTrackingListener extends FacetManagerAdapter { public void facetConfigurationChanged(@NotNull final Facet facet) { - final FacetModificationTracker tracker = myModificationsTrackers.get(facet); - if (tracker != null) { - tracker.myModificationCount++; + final Pair> pair = myModificationsTrackers.get(facet); + if (pair != null) { + pair.first.myModificationCount++; + pair.second.getMulticaster().modificationCountChanged(facet); } }