Fixed #17 (Mem editors stop one address too early)
[Mograsim.git] / plugins / net.mograsim.plugin.core / src / net / mograsim / plugin / tables / memory / MemoryTableContentProvider.java
index 95d1835..2197125 100644 (file)
@@ -5,34 +5,36 @@ import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.widgets.Display;
 
-import net.mograsim.machine.MainMemory;
-import net.mograsim.machine.MemoryObserver;
+import net.mograsim.machine.BitVectorMemory;
+import net.mograsim.machine.BitVectorMemoryDefinition;
+import net.mograsim.machine.Memory.MemoryCellModifiedListener;
 
-public class MemoryTableContentProvider implements ILazyContentProvider, MemoryObserver
+public class MemoryTableContentProvider implements ILazyContentProvider, MemoryCellModifiedListener
 {
-       private long lower;
+       private long lower, upper;
        private TableViewer viewer;
-       private final static int limit = 10_000;
-       private int amount = 0;
-       private MainMemory memory;
+       public final static int MAX_VISIBLE_ROWS = 1_000;
+       private BitVectorMemory memory;
 
-       public void setLowerBound(long lower)
+       public void setBounds(long lower, long upper)
        {
                if (memory != null)
-                       this.lower = Long.min(memory.getDefinition().getMaximalAddress(), Long.max(memory.getDefinition().getMinimalAddress(), lower));
-               else
+               {
+                       BitVectorMemoryDefinition definition = memory.getDefinition();
+                       this.lower = Long.min(definition.getMaximalAddress(), Long.max(definition.getMinimalAddress(), lower));
+                       this.upper = Long.max(this.lower, Long.min(definition.getMaximalAddress(), upper));
+               } else
+               {
                        this.lower = lower;
+                       this.upper = Long.max(this.lower, upper);
+               }
                updateItemCount();
        }
 
        public void updateItemCount()
        {
-               if (memory != null)
-               {
-                       long size = memory.getDefinition().getMaximalAddress() - lower;
-                       viewer.setItemCount(size > amount ? amount : (int) size);
-               } else
-                       viewer.setItemCount(0);
+               if (viewer != null)
+                       viewer.setItemCount(getAmount());
        }
 
        public long getLowerBound()
@@ -40,35 +42,37 @@ public class MemoryTableContentProvider implements ILazyContentProvider, MemoryO
                return lower;
        }
 
-       public void setAmount(int amount)
+       public long getUpperBound()
        {
-               this.amount = Integer.min(amount, limit);
-               updateItemCount();
+               return upper;
        }
 
        public int getAmount()
        {
-               return amount;
+               return (int) (upper - lower + 1);
        }
 
        @Override
        public void updateElement(int index)
        {
-               long address = lower + index;
-               if (address <= memory.getDefinition().getMaximalAddress())
-                       viewer.replace(new MemoryTableRow(address, memory), index);
+               if (index < getAmount())
+               {
+                       long address = lower + index;
+                       if (address <= memory.getDefinition().getMaximalAddress())
+                               viewer.replace(new MemoryTableRow(address, memory), index);
+               }
        }
 
        @Override
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
        {
                this.viewer = (TableViewer) viewer;
-               this.memory = (MainMemory) newInput;
+               this.memory = (BitVectorMemory) newInput;
                if (oldInput != null)
-                       ((MainMemory) oldInput).deregisterObserver(this);
+                       ((BitVectorMemory) oldInput).deregisterCellModifiedListener(this);
                if (memory != null)
-                       memory.registerObserver(this);
-               setLowerBound(0L);
+                       memory.registerCellModifiedListener(this);
+               setBounds(0, MAX_VISIBLE_ROWS);
        }
 
        @Override