X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.plugin.core%2Fsrc%2Fnet%2Fmograsim%2Fplugin%2Fnature%2FProjectMachineContext.java;h=cf727af2fc81fd4b211322db05ac50c731b52b0f;hb=15020b7263b6edd100d4b0a5de317e9eaff05c27;hp=0e6185c410045ad5d5fcf0a8c385700de556f02d;hpb=34c9da2d7580f2312da458db619dcf36e6325cef;p=Mograsim.git diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/ProjectMachineContext.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/ProjectMachineContext.java index 0e6185c4..cf727af2 100644 --- a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/ProjectMachineContext.java +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/nature/ProjectMachineContext.java @@ -2,20 +2,27 @@ package net.mograsim.plugin.nature; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.ProjectScope; +import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Adapters; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.ui.preferences.ScopedPreferenceStore; +import net.mograsim.plugin.nature.ProjectContextEvent.ProjectContextEventType; + public class ProjectMachineContext { private static Map projectMachineContexts = Collections.synchronizedMap(new HashMap<>()); + private static final Set listeners = Collections.synchronizedSet(new HashSet<>()); public static final String MOGRASIM_PROJECT_PREFS_NODE = "net.mograsim"; public static final String MACHINE_PROPERTY = "net.mograsim.projectMachineId"; @@ -28,6 +35,7 @@ public class ProjectMachineContext validateMograsimNatureProject(project); mc = new MachineContext(project); projectMachineContexts.put(project, mc); + notifyListeners(new ProjectContextEvent(mc, ProjectContextEventType.NEW)); return mc; } @@ -38,6 +46,11 @@ public class ProjectMachineContext return getMachineContextOf(project); } + public static Map getAllProjectMachineContexts() + { + return Collections.unmodifiableMap(projectMachineContexts); + } + static ScopedPreferenceStore getProjectPrefs(IProject mograsimProject) { return new ScopedPreferenceStore(new ProjectScope(mograsimProject), MOGRASIM_PROJECT_PREFS_NODE); @@ -88,4 +101,38 @@ public class ProjectMachineContext return Optional.of(preferenceStore.getString(MACHINE_PROPERTY)); return Optional.empty(); } + + static void notifyListeners(ProjectContextEvent projectContextEvent) + { + listeners.forEach(l -> l.onProjectContextChange(projectContextEvent)); + } + + public static void addProjectContextListener(ProjectContextListener listener) + { + listeners.add(listener); + } + + public static void removeProjectContextListener(ProjectContextListener listener) + { + listeners.remove(listener); + } + + static + { + ResourcesPlugin.getWorkspace().addResourceChangeListener(ProjectMachineContext::resourceChanged); + } + + private static void resourceChanged(IResourceChangeEvent event) + { + ProjectContextEventType eventType = ProjectContextEventType.ofResourceChangeEvent(event.getType()); + if (eventType == null) + return; + IProject p = event.getResource().getProject(); + if (p == null) + return; + MachineContext mc = projectMachineContexts.get(p); + if (mc == null) + return; + notifyListeners(new ProjectContextEvent(mc, eventType)); + } }