1 package net.mograsim.plugin.tables.memory;
3 import java.math.BigInteger;
4 import java.util.Optional;
6 import org.eclipse.jface.viewers.TableViewerColumn;
7 import org.eclipse.swt.SWT;
8 import org.eclipse.swt.events.VerifyListener;
9 import org.eclipse.swt.layout.GridData;
10 import org.eclipse.swt.layout.GridLayout;
11 import org.eclipse.swt.widgets.Composite;
12 import org.eclipse.swt.widgets.Label;
13 import org.eclipse.swt.widgets.Table;
14 import org.eclipse.swt.widgets.TableColumn;
15 import org.eclipse.swt.widgets.Text;
16 import org.eclipse.ui.part.ViewPart;
18 import net.mograsim.machine.Machine;
19 import net.mograsim.machine.MainMemory;
20 import net.mograsim.machine.MainMemoryDefinition;
21 import net.mograsim.machine.standard.memory.WordAddressableMemory;
22 import net.mograsim.plugin.MachineContext;
23 import net.mograsim.plugin.MachineContext.ContextObserver;
24 import net.mograsim.plugin.asm.AsmNumberUtil;
25 import net.mograsim.plugin.tables.AddressLabelProvider;
26 import net.mograsim.plugin.tables.DisplaySettings;
27 import net.mograsim.plugin.tables.LazyTableViewer;
28 import net.mograsim.plugin.tables.NumberColumnLabelProvider;
29 import net.mograsim.plugin.tables.RadixSelector;
31 public class MemoryView extends ViewPart implements ContextObserver
33 private LazyTableViewer viewer;
34 private MemoryTableContentProvider provider;
35 private DisplaySettings displaySettings;
38 public void createPartControl(Composite parent)
40 provider = new MemoryTableContentProvider();
41 displaySettings = new DisplaySettings();
43 GridLayout layout = new GridLayout(6, false);
44 parent.setLayout(layout);
49 displaySettings.addObserver(() -> viewer.refresh());
51 setupContextBinding();
54 @SuppressWarnings("unused")
55 private void createHeader(Composite parent)
57 Label fromLabel = new Label(parent, SWT.NONE);
58 fromLabel.setText("Address: ");
59 Text fromText = new Text(parent, SWT.BORDER | SWT.SEARCH);
60 fromText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL));
61 VerifyListener vl = new NumberVerifyListener();
62 fromText.addVerifyListener(vl);
63 fromText.setText("0");
64 fromText.addModifyListener(e ->
68 provider.setLowerBound(AsmNumberUtil.valueOf(fromText.getText()).longValue());
71 catch (NumberFormatException ex)
77 Label amountLabel = new Label(parent, SWT.NONE);
78 amountLabel.setText("Number of cells: ");
79 Text amountText = new Text(parent, SWT.BORDER | SWT.SEARCH);
80 amountText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL));
81 amountText.addVerifyListener(vl);
82 amountText.setText("0");
83 amountText.addModifyListener(e ->
87 provider.setAmount(AsmNumberUtil.valueOf(amountText.getText()).intValue());
90 catch (NumberFormatException ex)
95 new RadixSelector(parent, displaySettings);
98 private void createViewer(Composite parent)
100 viewer = new LazyTableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL);
102 Table table = viewer.getTable();
103 table.setHeaderVisible(true);
104 table.setLinesVisible(true);
105 viewer.setUseHashlookup(true);
106 viewer.setContentProvider(provider);
107 bindMainMemory(new WordAddressableMemory(MainMemoryDefinition.create(8, 8, 8L, Long.MAX_VALUE)));
108 getSite().setSelectionProvider(viewer);
110 GridData gd = new GridData();
111 gd.verticalAlignment = GridData.FILL;
112 gd.horizontalSpan = 6;
113 gd.grabExcessHorizontalSpace = true;
114 gd.grabExcessVerticalSpace = true;
115 gd.horizontalAlignment = GridData.FILL;
116 viewer.getControl().setLayoutData(gd);
119 private void createColumns()
121 String[] titles = { "Address", "Data" };
122 int[] bounds = { 100, 100 };
124 TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0]);
125 col.setLabelProvider(new AddressLabelProvider());
127 col = createTableViewerColumn(titles[1], bounds[1]);
128 col.setLabelProvider(new NumberColumnLabelProvider(displaySettings)
131 public BigInteger getAsBigInteger(Object element)
133 MemoryTableRow row = (MemoryTableRow) element;
134 return row.getMemory().getCellAsBigInteger(row.address);
138 col.setEditingSupport(new MemoryCellEditingSupport(viewer, displaySettings));
141 private TableViewerColumn createTableViewerColumn(String title, int bound)
143 TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE);
144 TableColumn column = viewerColumn.getColumn();
145 column.setText(title);
146 column.setWidth(bound);
147 column.setResizable(true);
148 column.setMoveable(false);
153 public void setFocus()
155 viewer.getControl().setFocus();
158 private void bindMainMemory(MainMemory m)
163 private void setupContextBinding()
165 MachineContext.getInstance().registerObserver(this);
169 public void setMachine(Optional<Machine> machine)
171 if (machine.isPresent())
172 bindMainMemory(machine.get().getMainMemory());