X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.plugin.core%2Fsrc%2Fnet%2Fmograsim%2Fplugin%2Fmemory%2FMemoryTableContentProvider.java;h=9f2a9e132a9a525d1885088a92c65073146e044b;hb=95e642d1252917f31021ae625c957c65d7215f32;hp=1d553e23a985cd3339fc0b7c63cdc6f563189708;hpb=7959f310ed60567201e37f1dc2eb1dc370763cff;p=Mograsim.git diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/memory/MemoryTableContentProvider.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/memory/MemoryTableContentProvider.java index 1d553e23..9f2a9e13 100644 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/memory/MemoryTableContentProvider.java +++ b/net.mograsim.plugin.core/src/net/mograsim/plugin/memory/MemoryTableContentProvider.java @@ -1,57 +1,79 @@ 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 org.eclipse.swt.widgets.Display; import net.mograsim.machine.MainMemory; +import net.mograsim.machine.MemoryObserver; -public class MemoryTableContentProvider implements IStructuredContentProvider +public class MemoryTableContentProvider implements ILazyContentProvider, MemoryObserver { 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; + if (oldInput != null) + ((MainMemory) oldInput).deregisterObserver(this); + if (memory != null) + memory.registerObserver(this); + setLowerBound(0L); + } + + @Override + public void update(long address) + { + Display.getDefault().asyncExec(() -> updateElement((int) (address - lower))); } }