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.SelectionEvent;
10 import org.eclipse.swt.events.SelectionListener;
11 import org.eclipse.swt.events.VerifyListener;
12 import org.eclipse.swt.layout.GridData;
13 import org.eclipse.swt.layout.GridLayout;
14 import org.eclipse.swt.widgets.Combo;
15 import org.eclipse.swt.widgets.Composite;
16 import org.eclipse.swt.widgets.Label;
17 import org.eclipse.swt.widgets.Table;
18 import org.eclipse.swt.widgets.TableColumn;
19 import org.eclipse.swt.widgets.Text;
20 import org.eclipse.ui.part.ViewPart;
22 import net.mograsim.machine.MainMemory;
23 import net.mograsim.machine.MainMemoryDefinition;
24 import net.mograsim.machine.standard.memory.WordAddressableMemory;
25 import net.mograsim.plugin.asm.AsmNumberUtil;
26 import net.mograsim.plugin.asm.AsmNumberUtil.NumberType;
27 import net.mograsim.plugin.tables.NumberColumnLabelProvider;
29 public class MemoryView extends ViewPart
31 private TableViewer viewer;
32 private MemoryTableContentProvider provider;
33 private DisplaySettings displaySettings;
34 private String addressFormat;
37 public void createPartControl(Composite parent)
39 provider = new MemoryTableContentProvider();
40 displaySettings = new DisplaySettings(NumberType.HEXADECIMAL);
42 GridLayout layout = new GridLayout(6, false);
43 parent.setLayout(layout);
44 Label fromLabel = new Label(parent, SWT.NONE);
45 fromLabel.setText("Address: ");
46 Text fromText = new Text(parent, SWT.BORDER | SWT.SEARCH);
47 fromText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL));
48 VerifyListener vl = new NumberVerifyListener();
49 fromText.addVerifyListener(vl);
50 fromText.setText("0");
51 fromText.addModifyListener(e ->
55 provider.setLowerBound(AsmNumberUtil.valueOf(fromText.getText()).longValue());
58 catch (@SuppressWarnings("unused") NumberFormatException ex)
64 Label amountLabel = new Label(parent, SWT.NONE);
65 amountLabel.setText("Number of cells: ");
66 Text amountText = new Text(parent, SWT.BORDER | SWT.SEARCH);
67 amountText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL));
68 amountText.addVerifyListener(vl);
69 amountText.setText("0");
70 amountText.addModifyListener(e ->
74 provider.setAmount(AsmNumberUtil.valueOf(amountText.getText()).intValue());
77 catch (@SuppressWarnings("unused") NumberFormatException ex)
83 setupRadixSelector(parent);
88 private void setupRadixSelector(Composite parent)
90 Label radixLabel = new Label(parent, SWT.NONE);
91 radixLabel.setText("Radix: ");
92 Combo selectRadix = new Combo(parent, SWT.READ_ONLY);
94 String entries[] = new String[] { "Binary", "Octal", "Decimal", "Hexadecimal" };
95 NumberType corTypes[] = new NumberType[] { NumberType.BINARY, NumberType.OCTAL, NumberType.DECIMAL, NumberType.HEXADECIMAL };
96 selectRadix.setItems(entries);
97 selectRadix.addSelectionListener(new SelectionListener()
100 public void widgetSelected(SelectionEvent e)
102 int index = selectRadix.getSelectionIndex();
104 displaySettings.setDataNumberType(NumberType.HEXADECIMAL);
107 displaySettings.setDataNumberType(corTypes[index]);
113 public void widgetDefaultSelected(SelectionEvent e)
120 private void createViewer(Composite parent)
122 viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL);
124 Table table = viewer.getTable();
125 table.setHeaderVisible(true);
126 table.setLinesVisible(true);
127 viewer.setUseHashlookup(true);
128 viewer.setContentProvider(provider);
129 setMemoryBinding(new WordAddressableMemory(MainMemoryDefinition.create(8, 8, 8L, Long.MAX_VALUE)));
130 getSite().setSelectionProvider(viewer);
132 GridData gd = new GridData();
133 gd.verticalAlignment = GridData.FILL;
134 gd.horizontalSpan = 6;
135 gd.grabExcessHorizontalSpace = true;
136 gd.grabExcessVerticalSpace = true;
137 gd.horizontalAlignment = GridData.FILL;
138 viewer.getControl().setLayoutData(gd);
141 private void createColumns()
143 String[] titles = { "Address", "Data" };
144 int[] bounds = { 100, 100 };
146 TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0]);
147 col.setLabelProvider(new ColumnLabelProvider()
150 public String getText(Object element)
152 MemoryTableRow row = (MemoryTableRow) element;
153 return String.format(addressFormat, row.address);
157 col = createTableViewerColumn(titles[1], bounds[1]);
158 col.setLabelProvider(new NumberColumnLabelProvider(displaySettings)
161 public BigInteger getAsBigInteger(Object element)
163 MemoryTableRow row = (MemoryTableRow) element;
164 return row.getMemory().getCellAsBigInteger(row.address);
168 col.setEditingSupport(new MemoryCellEditingSupport(viewer, displaySettings));
171 private TableViewerColumn createTableViewerColumn(String title, int bound)
173 TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE);
174 TableColumn column = viewerColumn.getColumn();
175 column.setText(title);
176 column.setWidth(bound);
177 column.setResizable(true);
178 column.setMoveable(false);
183 public void setFocus()
185 viewer.getControl().setFocus();
188 public void setMemoryBinding(MainMemory m)
190 int hexAddressLength = Long.toUnsignedString(m.getDefinition().getMaximalAddress(), 16).length();
191 addressFormat = "0x%0" + hexAddressLength + "X";