X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.plugin.core%2Fsrc%2Fnet%2Fmograsim%2Fplugin%2Ftables%2Fmemory%2FMemoryView.java;h=09368807e2d086b140ce65fff8d750e63b81d44d;hb=8bed58cd47f4e53a0a83e066d38864aa6875502f;hp=98983a66897cf037abcbd225696843f975544e8f;hpb=a89919ed17e728953766d9d617e7db86fcf315ee;p=Mograsim.git diff --git a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java index 98983a66..09368807 100644 --- a/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java +++ b/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/memory/MemoryView.java @@ -1,17 +1,13 @@ package net.mograsim.plugin.tables.memory; import java.math.BigInteger; +import java.util.Optional; -import org.eclipse.jface.viewers.ColumnLabelProvider; -import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.events.VerifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; @@ -19,28 +15,45 @@ import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.part.ViewPart; +import net.mograsim.machine.Machine; import net.mograsim.machine.MainMemory; import net.mograsim.machine.MainMemoryDefinition; import net.mograsim.machine.standard.memory.WordAddressableMemory; +import net.mograsim.plugin.MachineContext; +import net.mograsim.plugin.MachineContext.ContextObserver; import net.mograsim.plugin.asm.AsmNumberUtil; -import net.mograsim.plugin.asm.AsmNumberUtil.NumberType; +import net.mograsim.plugin.tables.AddressLabelProvider; +import net.mograsim.plugin.tables.DisplaySettings; +import net.mograsim.plugin.tables.LazyTableViewer; import net.mograsim.plugin.tables.NumberColumnLabelProvider; +import net.mograsim.plugin.tables.RadixSelector; -public class MemoryView extends ViewPart +public class MemoryView extends ViewPart implements ContextObserver { - private TableViewer viewer; + private LazyTableViewer viewer; private MemoryTableContentProvider provider; private DisplaySettings displaySettings; - private String addressFormat; @Override public void createPartControl(Composite parent) { provider = new MemoryTableContentProvider(); - displaySettings = new DisplaySettings(NumberType.HEXADECIMAL); + displaySettings = new DisplaySettings(); GridLayout layout = new GridLayout(6, false); parent.setLayout(layout); + + createHeader(parent); + createViewer(parent); + + displaySettings.addObserver(() -> viewer.refresh()); + + setupContextBinding(); + } + + @SuppressWarnings("unused") + private void createHeader(Composite parent) + { Label fromLabel = new Label(parent, SWT.NONE); fromLabel.setText("Address: "); Text fromText = new Text(parent, SWT.BORDER | SWT.SEARCH); @@ -55,7 +68,7 @@ public class MemoryView extends ViewPart provider.setLowerBound(AsmNumberUtil.valueOf(fromText.getText()).longValue()); viewer.refresh(); } - catch (@SuppressWarnings("unused") NumberFormatException ex) + catch (NumberFormatException ex) { // Nothing to do here } @@ -74,59 +87,24 @@ public class MemoryView extends ViewPart provider.setAmount(AsmNumberUtil.valueOf(amountText.getText()).intValue()); viewer.refresh(); } - catch (@SuppressWarnings("unused") NumberFormatException ex) + catch (NumberFormatException ex) { // Nothing to do here } }); - - setupRadixSelector(parent); - - createViewer(parent); - } - - private void setupRadixSelector(Composite parent) - { - Label radixLabel = new Label(parent, SWT.NONE); - radixLabel.setText("Radix: "); - Combo selectRadix = new Combo(parent, SWT.READ_ONLY); - - String entries[] = new String[] { "Binary", "Octal", "Decimal", "Hexadecimal" }; - NumberType corTypes[] = new NumberType[] { NumberType.BINARY, NumberType.OCTAL, NumberType.DECIMAL, NumberType.HEXADECIMAL }; - selectRadix.setItems(entries); - selectRadix.addSelectionListener(new SelectionListener() - { - @Override - public void widgetSelected(SelectionEvent e) - { - int index = selectRadix.getSelectionIndex(); - if (index == -1) - displaySettings.setDataNumberType(NumberType.HEXADECIMAL); - else - { - displaySettings.setDataNumberType(corTypes[index]); - } - viewer.refresh(); - } - - @Override - public void widgetDefaultSelected(SelectionEvent e) - { - widgetSelected(e); - } - }); + new RadixSelector(parent, displaySettings); } private void createViewer(Composite parent) { - viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL); + viewer = new LazyTableViewer(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(MainMemoryDefinition.create(8, 8, 8L, Long.MAX_VALUE))); + bindMainMemory(new WordAddressableMemory(MainMemoryDefinition.create(8, 8, 8L, Long.MAX_VALUE))); getSite().setSelectionProvider(viewer); GridData gd = new GridData(); @@ -144,15 +122,7 @@ public class MemoryView extends ViewPart int[] bounds = { 100, 100 }; TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0]); - col.setLabelProvider(new ColumnLabelProvider() - { - @Override - public String getText(Object element) - { - MemoryTableRow row = (MemoryTableRow) element; - return String.format(addressFormat, row.address); - } - }); + col.setLabelProvider(new AddressLabelProvider()); col = createTableViewerColumn(titles[1], bounds[1]); col.setLabelProvider(new NumberColumnLabelProvider(displaySettings) @@ -185,10 +155,21 @@ public class MemoryView extends ViewPart viewer.getControl().setFocus(); } - public void setMemoryBinding(MainMemory m) + private void bindMainMemory(MainMemory m) { - int hexAddressLength = Long.toUnsignedString(m.getDefinition().getMaximalAddress(), 16).length(); - addressFormat = "0x%0" + hexAddressLength + "X"; viewer.setInput(m); } + + private void setupContextBinding() + { + MachineContext.getInstance().registerObserver(this); + setMachine(Optional.ofNullable(MachineContext.getInstance().getMachine())); + } + + @Override + public void setMachine(Optional machine) + { + if (machine.isPresent()) + bindMainMemory(machine.get().getMainMemory()); + } }