1 package net.mograsim.plugin.tables.memory;
3 import java.math.BigInteger;
5 import org.eclipse.jface.viewers.ColumnLabelProvider;
6 import org.eclipse.jface.viewers.TableViewer;
7 import org.eclipse.jface.viewers.TableViewerColumn;
8 import org.eclipse.swt.SWT;
9 import org.eclipse.swt.events.VerifyListener;
10 import org.eclipse.swt.layout.GridData;
11 import org.eclipse.swt.layout.GridLayout;
12 import org.eclipse.swt.widgets.Composite;
13 import org.eclipse.swt.widgets.Label;
14 import org.eclipse.swt.widgets.Table;
15 import org.eclipse.swt.widgets.TableColumn;
16 import org.eclipse.swt.widgets.Text;
17 import org.eclipse.ui.part.ViewPart;
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.asm.AsmNumberUtil;
23 import net.mograsim.plugin.tables.DisplaySettings;
24 import net.mograsim.plugin.tables.NumberColumnLabelProvider;
25 import net.mograsim.plugin.tables.RadixSelector;
27 public class MemoryView extends ViewPart
29 private TableViewer viewer;
30 private MemoryTableContentProvider provider;
31 private DisplaySettings displaySettings;
32 private String addressFormat;
34 @SuppressWarnings("unused")
36 public void createPartControl(Composite parent)
38 provider = new MemoryTableContentProvider();
39 displaySettings = new DisplaySettings();
41 GridLayout layout = new GridLayout(6, false);
42 parent.setLayout(layout);
43 Label fromLabel = new Label(parent, SWT.NONE);
44 fromLabel.setText("Address: ");
45 Text fromText = new Text(parent, SWT.BORDER | SWT.SEARCH);
46 fromText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL));
47 VerifyListener vl = new NumberVerifyListener();
48 fromText.addVerifyListener(vl);
49 fromText.setText("0");
50 fromText.addModifyListener(e ->
54 provider.setLowerBound(AsmNumberUtil.valueOf(fromText.getText()).longValue());
57 catch (NumberFormatException ex)
63 Label amountLabel = new Label(parent, SWT.NONE);
64 amountLabel.setText("Number of cells: ");
65 Text amountText = new Text(parent, SWT.BORDER | SWT.SEARCH);
66 amountText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL));
67 amountText.addVerifyListener(vl);
68 amountText.setText("0");
69 amountText.addModifyListener(e ->
73 provider.setAmount(AsmNumberUtil.valueOf(amountText.getText()).intValue());
76 catch (NumberFormatException ex)
81 new RadixSelector(parent, displaySettings);
84 displaySettings.addObserver(() -> viewer.refresh());
87 private void createViewer(Composite parent)
89 viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL);
91 Table table = viewer.getTable();
92 table.setHeaderVisible(true);
93 table.setLinesVisible(true);
94 viewer.setUseHashlookup(true);
95 viewer.setContentProvider(provider);
96 setMemoryBinding(new WordAddressableMemory(MainMemoryDefinition.create(8, 8, 8L, Long.MAX_VALUE)));
97 getSite().setSelectionProvider(viewer);
99 GridData gd = new GridData();
100 gd.verticalAlignment = GridData.FILL;
101 gd.horizontalSpan = 6;
102 gd.grabExcessHorizontalSpace = true;
103 gd.grabExcessVerticalSpace = true;
104 gd.horizontalAlignment = GridData.FILL;
105 viewer.getControl().setLayoutData(gd);
108 private void createColumns()
110 String[] titles = { "Address", "Data" };
111 int[] bounds = { 100, 100 };
113 TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0]);
114 col.setLabelProvider(new ColumnLabelProvider()
117 public String getText(Object element)
119 MemoryTableRow row = (MemoryTableRow) element;
120 return String.format(addressFormat, row.address);
124 col = createTableViewerColumn(titles[1], bounds[1]);
125 col.setLabelProvider(new NumberColumnLabelProvider(displaySettings)
128 public BigInteger getAsBigInteger(Object element)
130 MemoryTableRow row = (MemoryTableRow) element;
131 return row.getMemory().getCellAsBigInteger(row.address);
135 col.setEditingSupport(new MemoryCellEditingSupport(viewer, displaySettings));
138 private TableViewerColumn createTableViewerColumn(String title, int bound)
140 TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE);
141 TableColumn column = viewerColumn.getColumn();
142 column.setText(title);
143 column.setWidth(bound);
144 column.setResizable(true);
145 column.setMoveable(false);
150 public void setFocus()
152 viewer.getControl().setFocus();
155 public void setMemoryBinding(MainMemory m)
157 int hexAddressLength = Long.toUnsignedString(m.getDefinition().getMaximalAddress(), 16).length();
158 addressFormat = "0x%0" + hexAddressLength + "X";