Fixed MemoryTableContentProvider#update throwing an exception
[Mograsim.git] / plugins / net.mograsim.plugin.core / src / net / mograsim / plugin / tables / memory / MemoryTableContentProvider.java
1 package net.mograsim.plugin.tables.memory;
2
3 import org.eclipse.jface.viewers.ILazyContentProvider;
4 import org.eclipse.jface.viewers.TableViewer;
5 import org.eclipse.jface.viewers.Viewer;
6 import org.eclipse.swt.widgets.Display;
7
8 import net.mograsim.machine.MainMemory;
9 import net.mograsim.machine.Memory.MemoryCellModifiedListener;
10
11 public class MemoryTableContentProvider implements ILazyContentProvider, MemoryCellModifiedListener
12 {
13         private long lower;
14         private TableViewer viewer;
15         private final static int limit = 10_000;
16         private int amount = 0;
17         private MainMemory memory;
18
19         public void setLowerBound(long lower)
20         {
21                 if (memory != null)
22                         this.lower = Long.min(memory.getDefinition().getMaximalAddress(), Long.max(memory.getDefinition().getMinimalAddress(), lower));
23                 else
24                         this.lower = lower;
25                 updateItemCount();
26         }
27
28         public void updateItemCount()
29         {
30                 if (memory != null)
31                 {
32                         long size = memory.getDefinition().getMaximalAddress() - lower;
33                         viewer.setItemCount(size > amount ? amount : (int) size);
34                 } else
35                         viewer.setItemCount(0);
36         }
37
38         public long getLowerBound()
39         {
40                 return lower;
41         }
42
43         public void setAmount(int amount)
44         {
45                 this.amount = Integer.min(amount, limit);
46                 updateItemCount();
47         }
48
49         public int getAmount()
50         {
51                 return amount;
52         }
53
54         @Override
55         public void updateElement(int index)
56         {
57                 if (index < amount)
58                 {
59                         long address = lower + index;
60                         if (address <= memory.getDefinition().getMaximalAddress())
61                                 viewer.replace(new MemoryTableRow(address, memory), index);
62                 }
63         }
64
65         @Override
66         public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
67         {
68                 this.viewer = (TableViewer) viewer;
69                 this.memory = (MainMemory) newInput;
70                 if (oldInput != null)
71                         ((MainMemory) oldInput).deregisterCellModifiedListener(this);
72                 if (memory != null)
73                         memory.registerCellModifiedListener(this);
74                 setLowerBound(0L);
75         }
76
77         @Override
78         public void update(long address)
79         {
80                 // TODO check if viewer.refresh() does what we expect
81                 Display.getDefault().asyncExec(address == -1 ? viewer::refresh : () -> updateElement((int) (address - lower)));
82         }
83 }