The instruction editor can now display integers in bases 2, 8, 10 and 16
[Mograsim.git] / net.mograsim.plugin.core / src / net / mograsim / plugin / tables / memory / MemoryView.java
1 package net.mograsim.plugin.tables.memory;
2
3 import java.math.BigInteger;
4
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;
18
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;
26
27 public class MemoryView extends ViewPart
28 {
29         private TableViewer viewer;
30         private MemoryTableContentProvider provider;
31         private DisplaySettings displaySettings;
32         private String addressFormat;
33
34         @SuppressWarnings("unused")
35         @Override
36         public void createPartControl(Composite parent)
37         {
38                 provider = new MemoryTableContentProvider();
39                 displaySettings = new DisplaySettings();
40
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 ->
51                 {
52                         try
53                         {
54                                 provider.setLowerBound(AsmNumberUtil.valueOf(fromText.getText()).longValue());
55                                 viewer.refresh();
56                         }
57                         catch (NumberFormatException ex)
58                         {
59                                 // Nothing to do here
60                         }
61                 });
62
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 ->
70                 {
71                         try
72                         {
73                                 provider.setAmount(AsmNumberUtil.valueOf(amountText.getText()).intValue());
74                                 viewer.refresh();
75                         }
76                         catch (NumberFormatException ex)
77                         {
78                                 // Nothing to do here
79                         }
80                 });
81                 new RadixSelector(parent, displaySettings);
82                 createViewer(parent);
83
84                 displaySettings.addObserver(() -> viewer.refresh());
85         }
86
87         private void createViewer(Composite parent)
88         {
89                 viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL);
90                 createColumns();
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);
98
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);
106         }
107
108         private void createColumns()
109         {
110                 String[] titles = { "Address", "Data" };
111                 int[] bounds = { 100, 100 };
112
113                 TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0]);
114                 col.setLabelProvider(new ColumnLabelProvider()
115                 {
116                         @Override
117                         public String getText(Object element)
118                         {
119                                 MemoryTableRow row = (MemoryTableRow) element;
120                                 return String.format(addressFormat, row.address);
121                         }
122                 });
123
124                 col = createTableViewerColumn(titles[1], bounds[1]);
125                 col.setLabelProvider(new NumberColumnLabelProvider(displaySettings)
126                 {
127                         @Override
128                         public BigInteger getAsBigInteger(Object element)
129                         {
130                                 MemoryTableRow row = (MemoryTableRow) element;
131                                 return row.getMemory().getCellAsBigInteger(row.address);
132                         }
133
134                 });
135                 col.setEditingSupport(new MemoryCellEditingSupport(viewer, displaySettings));
136         }
137
138         private TableViewerColumn createTableViewerColumn(String title, int bound)
139         {
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);
146                 return viewerColumn;
147         }
148
149         @Override
150         public void setFocus()
151         {
152                 viewer.getControl().setFocus();
153         }
154
155         public void setMemoryBinding(MainMemory m)
156         {
157                 int hexAddressLength = Long.toUnsignedString(m.getDefinition().getMaximalAddress(), 16).length();
158                 addressFormat = "0x%0" + hexAddressLength + "X";
159                 viewer.setInput(m);
160         }
161 }