Moved logic for extracting DebugTarget from context change to a Listener
[Mograsim.git] / plugins / net.mograsim.plugin.core / src / net / mograsim / plugin / launch / MachineDebugContextListener.java
1 package net.mograsim.plugin.launch;
2
3 import java.util.Optional;
4
5 import org.eclipse.debug.core.ILaunch;
6 import org.eclipse.debug.core.model.IDebugTarget;
7 import org.eclipse.debug.ui.contexts.DebugContextEvent;
8 import org.eclipse.debug.ui.contexts.IDebugContextListener;
9 import org.eclipse.jface.viewers.ISelection;
10 import org.eclipse.jface.viewers.TreeSelection;
11
12 public abstract class MachineDebugContextListener implements IDebugContextListener
13 {
14         private MachineDebugTarget debugTarget;
15
16         @Override
17         public void debugContextChanged(DebugContextEvent e)
18         {
19                 debugContextChanged(e.getContext());
20         }
21
22         public void debugContextChanged(ISelection selection)
23         {
24                 if (selection != null && selection instanceof TreeSelection)
25                 {
26                         TreeSelection treeSelection = (TreeSelection) selection;
27                         Object[] selectedElements = treeSelection.toArray();
28                         for (Object selectedElement : selectedElements)
29                         {
30                                 MachineDebugTarget debugTarget;
31                                 if (selectedElement instanceof MachineDebugTarget)
32                                         debugTarget = (MachineDebugTarget) selectedElement;
33                                 else if (selectedElement instanceof ILaunch)
34                                 {
35                                         ILaunch launch = (ILaunch) selectedElement;
36                                         IDebugTarget genericDebugTarget = launch.getDebugTarget();
37                                         if (genericDebugTarget instanceof MachineDebugTarget)
38                                                 debugTarget = (MachineDebugTarget) genericDebugTarget;
39                                         else
40                                                 continue;
41                                 } else
42                                         continue;
43                                 if (debugTarget.isTerminated())
44                                         continue;
45                                 // we found a selected MachineDebugTarget
46                                 if (this.debugTarget != debugTarget)
47                                 {
48                                         MachineDebugTarget oldTarget = this.debugTarget;
49                                         this.debugTarget = debugTarget;
50                                         machineDebugContextChanged(Optional.ofNullable(oldTarget), Optional.of(debugTarget));
51                                 }
52                                 return;
53                         }
54                         MachineDebugTarget oldTarget = debugTarget;
55                         debugTarget = null;
56                         machineDebugContextChanged(Optional.ofNullable(oldTarget), Optional.empty());
57                 }
58         }
59
60         public abstract void machineDebugContextChanged(Optional<MachineDebugTarget> oldTarget, Optional<MachineDebugTarget> newTarget);
61 }