import org.eclipse.swt.widgets.Display;
import net.mograsim.machine.MainMemory;
-import net.mograsim.machine.MemoryObserver;
+import net.mograsim.machine.MainMemoryDefinition;
+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;
+ public final static int MAX_VISIBLE_ROWS = 1_000;
private MainMemory 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
+ {
+ MainMemoryDefinition 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()
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);
}
@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
this.viewer = (TableViewer) viewer;
this.memory = (MainMemory) newInput;
if (oldInput != null)
- ((MainMemory) oldInput).deregisterObserver(this);
+ ((MainMemory) oldInput).deregisterCellModifiedListener(this);
if (memory != null)
- memory.registerObserver(this);
- setLowerBound(0L);
+ memory.registerCellModifiedListener(this);
+ setBounds(0, MAX_VISIBLE_ROWS);
}
@Override