MemoryEditor's Amount field defaults to 100
[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 (viewer != null)
31                         if (memory != null)
32                         {
33                                 long size = memory.getDefinition().getMaximalAddress() - lower;
34                                 viewer.setItemCount(size > amount ? amount : (int) size);
35                         } else
36                                 viewer.setItemCount(0);
37         }
38
39         public long getLowerBound()
40         {
41                 return lower;
42         }
43
44         public void setAmount(int amount)
45         {
46                 this.amount = Integer.min(amount, limit);
47                 updateItemCount();
48         }
49
50         public int getAmount()
51         {
52                 return amount;
53         }
54
55         @Override
56         public void updateElement(int index)
57         {
58                 if (index < amount)
59                 {
60                         long address = lower + index;
61                         if (address <= memory.getDefinition().getMaximalAddress())
62                                 viewer.replace(new MemoryTableRow(address, memory), index);
63                 }
64         }
65
66         @Override
67         public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
68         {
69                 this.viewer = (TableViewer) viewer;
70                 this.memory = (MainMemory) newInput;
71                 if (oldInput != null)
72                         ((MainMemory) oldInput).deregisterCellModifiedListener(this);
73                 if (memory != null)
74                         memory.registerCellModifiedListener(this);
75                 setLowerBound(0L);
76         }
77
78         @Override
79         public void update(long address)
80         {
81                 // TODO check if viewer.refresh() does what we expect
82                 Display.getDefault().asyncExec(address == -1 ? viewer::refresh : () -> updateElement((int) (address - lower)));
83         }
84 }