ActiveInstructionChangedListener moved to Machine and updated
[Mograsim.git] / plugins / net.mograsim.plugin.core / src / net / mograsim / plugin / tables / mi / ActiveInstructionPreviewContentProvider.java
1 package net.mograsim.plugin.tables.mi;
2
3 import org.eclipse.jface.viewers.TableViewer;
4 import org.eclipse.jface.viewers.Viewer;
5
6 import net.mograsim.machine.Machine;
7 import net.mograsim.machine.Machine.ActiveMicroInstructionChangedListener;
8 import net.mograsim.machine.mi.MicroInstructionMemory;
9 import net.mograsim.plugin.util.SingleSWTRequest;
10
11 public class ActiveInstructionPreviewContentProvider implements InstructionTableContentProvider
12 {
13         private TableViewer viewer;
14         private MicroInstructionMemory memory;
15         private InstructionTableRow activeRow;
16         private Machine machine;
17         private SingleSWTRequest requester = new SingleSWTRequest();
18
19         private ActiveMicroInstructionChangedListener instChanged = (oldAddress, newAddress) ->
20         {
21                 activeRow = new InstructionTableRow(Long.max(0, newAddress), memory);
22                 requester.request(() -> updateElement(0));
23         };
24
25         public ActiveInstructionPreviewContentProvider(TableViewer viewer)
26         {
27                 this.viewer = viewer;
28                 viewer.setItemCount(1);
29         }
30
31         @Override
32         public void update(long address)
33         {
34                 // Nothing to do here
35         }
36
37         @Override
38         public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
39         {
40                 memory = (MicroInstructionMemory) newInput;
41         }
42
43         public void setMachine(Machine newMachine)
44         {
45                 if (machine != null)
46                         machine.removeActiveMicroInstructionChangedListener(instChanged);
47
48                 machine = newMachine;
49                 if (machine != null)
50                 {
51                         instChanged.instructionChanged(-1, 0);
52                         machine.addActiveMicroInstructionChangedListener(instChanged);
53                 }
54         }
55
56         @Override
57         public void updateElement(int index)
58         {
59                 viewer.replace(activeRow, index);
60         }
61 }