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;
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);
provider.setLowerBound(AsmNumberUtil.valueOf(fromText.getText()).longValue());
viewer.refresh();
}
- catch (@SuppressWarnings("unused") NumberFormatException ex)
+ catch (NumberFormatException ex)
{
// Nothing to do here
}
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();
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)
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> machine)
+ {
+ if (machine.isPresent())
+ bindMainMemory(machine.get().getMainMemory());
+ }
}