Added listener and event structure to ProjectMachineContexts
[Mograsim.git] / plugins / net.mograsim.plugin.core / src / net / mograsim / plugin / nature / MachineContext.java
index b434ec9..2e02e31 100644 (file)
@@ -1,8 +1,10 @@
 package net.mograsim.plugin.nature;
 
 import java.io.IOException;
+import java.util.HashSet;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.jface.util.PropertyChangeEvent;
@@ -11,6 +13,7 @@ import org.eclipse.ui.preferences.ScopedPreferenceStore;
 import net.mograsim.machine.Machine;
 import net.mograsim.machine.MachineDefinition;
 import net.mograsim.machine.MachineRegistry;
+import net.mograsim.plugin.nature.ProjectContextEvent.ProjectContextEventType;
 
 public class MachineContext
 {
@@ -20,6 +23,8 @@ public class MachineContext
        Optional<MachineDefinition> machineDefinition;
        Optional<Machine> activeMachine;
 
+       private final Set<ActiveMachineListener> observers = new HashSet<>();
+
        public MachineContext(IProject owner)
        {
                this.owner = Objects.requireNonNull(owner);
@@ -87,6 +92,7 @@ public class MachineContext
        public final void setActiveMachine(Machine machine)
        {
                activeMachine = Optional.ofNullable(machine);
+               notifyObservers();
        }
 
        public final Optional<String> getMachineId()
@@ -107,6 +113,8 @@ public class MachineContext
        final void updateDefinition()
        {
                machineDefinition = machineId.map(MachineRegistry::getMachine);
+               machineDefinition.ifPresent(md -> setActiveMachine(md.createNew()));
+               ProjectMachineContext.notifyListeners(new ProjectContextEvent(this, ProjectContextEventType.MACHINE_DEFINITION_CHANGE));
        }
 
        private void preferenceListener(PropertyChangeEvent changeEvent)
@@ -117,4 +125,26 @@ public class MachineContext
                        updateDefinition();
                }
        }
+
+       public void registerObserver(ActiveMachineListener ob)
+       {
+               observers.add(ob);
+               ob.setMachine(activeMachine);
+       }
+
+       public void deregisterObserver(ActiveMachineListener ob)
+       {
+               observers.remove(ob);
+       }
+
+       private void notifyObservers()
+       {
+               observers.forEach(ob -> ob.setMachine(activeMachine));
+       }
+
+       @FunctionalInterface
+       public static interface ActiveMachineListener
+       {
+               void setMachine(Optional<Machine> machine);
+       }
 }
\ No newline at end of file