Switched MemoryView Content Provider to allow for a bigger table
authorFabian Stemmler <stemmler@in.tum.de>
Mon, 26 Aug 2019 11:10:53 +0000 (13:10 +0200)
committerFabian Stemmler <stemmler@in.tum.de>
Mon, 26 Aug 2019 11:10:53 +0000 (13:10 +0200)
net.mograsim.plugin.core/src/net/mograsim/plugin/memory/MemoryTableContentProvider.java
net.mograsim.plugin.core/src/net/mograsim/plugin/memory/MemoryView.java

index 1d553e2..3ddb32f 100644 (file)
@@ -1,57 +1,67 @@
 package net.mograsim.plugin.memory;
 
-import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ILazyContentProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
 
 import net.mograsim.machine.MainMemory;
 
-public class MemoryTableContentProvider implements IStructuredContentProvider
+public class MemoryTableContentProvider implements ILazyContentProvider
 {
        private long lower;
-       private int amount;
-       public final static int limit = 128;
+       private TableViewer viewer;
+       private final static int limit = 10_000;
+       private int amount = 0;
+       private MainMemory memory;
 
-       @Override
-       public Object[] getElements(Object arg0)
+       public void setLowerBound(long lower)
        {
-               if (arg0 == null)
-                       return new Object[0];
-               MainMemory memory = (MainMemory) arg0;
-               lower = Long.max(lower, memory.getDefinition().getMinimalAddress());
-               Object[] rows = new Object[amount];
-               for (int i = 0; i < amount; i++)
-                       rows[i] = new MemoryTableRow(lower + i, memory);
-               return rows;
+               if (memory != null)
+                       this.lower = Long.min(memory.getDefinition().getMaximalAddress(), Long.max(memory.getDefinition().getMinimalAddress(), lower));
+               else
+                       this.lower = lower;
+               updateItemCount();
        }
 
-       /**
-        * Sets the bounds for the addresses in memory to be provided to the table.
-        * 
-        * @param lower  lower bound for address (inclusive)
-        * @param amount amount of cells to show; limited to {@link MemoryTableContentProvider#limit}
-        */
-       public void setAddressRange(long lower, int amount)
+       public void updateItemCount()
        {
-               this.lower = lower;
-               this.amount = Integer.min(Integer.max(amount, 0), limit);
+               if (memory != null)
+               {
+                       long size = memory.getDefinition().getMaximalAddress() - lower;
+                       viewer.setItemCount(size > amount ? amount : (int) size);
+               } else
+                       viewer.setItemCount(0);
        }
 
-       public void setLowerBound(long lower)
+       public long getLowerBound()
        {
-               setAddressRange(lower, amount);
+               return lower;
        }
 
        public void setAmount(int amount)
        {
-               setAddressRange(lower, amount);
+               this.amount = Integer.min(amount, limit);
+               updateItemCount();
        }
 
-       public long getLowerBound()
+       public int getAmount()
        {
-               return lower;
+               return amount;
        }
 
-       public int getAmount()
+       @Override
+       public void updateElement(int index)
        {
-               return amount;
+               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;
+               setLowerBound(0L);
        }
 }
index dc03e45..f00f1c9 100644 (file)
@@ -33,7 +33,6 @@ public class MemoryView extends ViewPart
        @Override
        public void createPartControl(Composite parent)
        {
-               // TODO: externalize Strings!
                provider = new MemoryTableContentProvider();
                displaySettings = new DisplaySettings();
                displaySettings.setDataNumberType(NumberType.HEXADECIMAL);
@@ -120,13 +119,14 @@ public class MemoryView extends ViewPart
 
        private void createViewer(Composite parent)
        {
-               viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
+               viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL);
                createColumns();
                Table table = viewer.getTable();
                table.setHeaderVisible(true);
                table.setLinesVisible(true);
+               viewer.setUseHashlookup(true);
                viewer.setContentProvider(provider);
-               setMemoryBinding(new WordAddressableMemory(new DefaultMainMemoryDefinition(8, 8, 8L, 256L)));
+               setMemoryBinding(new WordAddressableMemory(new DefaultMainMemoryDefinition(8, 8, 8L, Long.MAX_VALUE)));
                getSite().setSelectionProvider(viewer);
 
                GridData gd = new GridData();