Added Memory View to the plugin
[Mograsim.git] / net.mograsim.plugin.core / src / net / mograsim / plugin / memory / MemoryView.java
1 package net.mograsim.plugin.memory;
2
3 import org.eclipse.jface.viewers.ColumnLabelProvider;
4 import org.eclipse.jface.viewers.TableViewer;
5 import org.eclipse.jface.viewers.TableViewerColumn;
6 import org.eclipse.swt.SWT;
7 import org.eclipse.swt.events.SelectionEvent;
8 import org.eclipse.swt.events.SelectionListener;
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.Combo;
13 import org.eclipse.swt.widgets.Composite;
14 import org.eclipse.swt.widgets.Label;
15 import org.eclipse.swt.widgets.Table;
16 import org.eclipse.swt.widgets.TableColumn;
17 import org.eclipse.swt.widgets.Text;
18 import org.eclipse.ui.part.ViewPart;
19
20 import net.mograsim.machine.DefaultMainMemoryDefinition;
21 import net.mograsim.machine.MainMemory;
22 import net.mograsim.machine.standard.memory.WordAddressableMemory;
23 import net.mograsim.plugin.asm.AsmNumberUtil;
24 import net.mograsim.plugin.asm.AsmNumberUtil.NumberType;
25
26 public class MemoryView extends ViewPart
27 {
28         private TableViewer viewer;
29         private MemoryTableContentProvider provider;
30         private DisplaySettings displaySettings;
31         private String addressFormat;
32
33         @Override
34         public void createPartControl(Composite parent)
35         {
36                 // TODO: externalize Strings!
37                 provider = new MemoryTableContentProvider();
38                 displaySettings = new DisplaySettings();
39                 displaySettings.setDataNumberType(NumberType.HEXADECIMAL);
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 (@SuppressWarnings("unused") NumberFormatException ex)
58                         {
59                                 // Nothing to do here
60                         }
61 //                      fromText.setText(AsmNumberUtil.toString(BigInteger.valueOf(provider.getLowerBound()), NumberType.HEXADECIMAL));
62                 });
63
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 ->
71                 {
72                         try
73                         {
74                                 provider.setAmount(AsmNumberUtil.valueOf(amountText.getText()).intValue());
75                                 viewer.refresh();
76                         }
77                         catch (@SuppressWarnings("unused") NumberFormatException ex)
78                         {
79                                 // Nothing to do here
80                         }
81 //                      amountText.setText(Integer.toString(provider.getAmount()));
82                 });
83
84                 setupRadixSelector(parent);
85
86                 createViewer(parent);
87         }
88
89         private void setupRadixSelector(Composite parent)
90         {
91                 Label radixLabel = new Label(parent, SWT.NONE);
92                 radixLabel.setText("Radix: ");
93                 Combo selectRadix = new Combo(parent, SWT.READ_ONLY);
94
95                 String entries[] = new String[] { "Binary", "Octal", "Decimal", "Hexadecimal" };
96                 NumberType corTypes[] = new NumberType[] { NumberType.BINARY, NumberType.OCTAL, NumberType.DECIMAL, NumberType.HEXADECIMAL };
97                 selectRadix.setItems(entries);
98                 selectRadix.addSelectionListener(new SelectionListener()
99                 {
100                         @Override
101                         public void widgetSelected(SelectionEvent e)
102                         {
103                                 int index = selectRadix.getSelectionIndex();
104                                 if (index == -1)
105                                         displaySettings.setDataNumberType(NumberType.HEXADECIMAL);
106                                 else
107                                 {
108                                         displaySettings.setDataNumberType(corTypes[index]);
109                                 }
110                                 viewer.refresh();
111                         }
112
113                         @Override
114                         public void widgetDefaultSelected(SelectionEvent e)
115                         {
116                                 widgetSelected(e);
117                         }
118                 });
119         }
120
121         private void createViewer(Composite parent)
122         {
123                 viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
124                 createColumns();
125                 Table table = viewer.getTable();
126                 table.setHeaderVisible(true);
127                 table.setLinesVisible(true);
128                 viewer.setContentProvider(provider);
129                 setMemoryBinding(new WordAddressableMemory(new DefaultMainMemoryDefinition(8, 8, 8L, 256L)));
130                 getSite().setSelectionProvider(viewer);
131
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);
139         }
140
141         private void createColumns()
142         {
143                 String[] titles = { "Address", "Data" };
144                 int[] bounds = { 100, 100 };
145
146                 TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0]);
147                 col.setLabelProvider(new ColumnLabelProvider()
148                 {
149                         @Override
150                         public String getText(Object element)
151                         {
152                                 MemoryTableRow row = (MemoryTableRow) element;
153                                 return String.format(addressFormat, row.address);// TODO: make the string length dependent on memory address length
154                         }
155                 });
156
157                 col = createTableViewerColumn(titles[1], bounds[1]);
158                 col.setLabelProvider(new ColumnLabelProvider()
159                 {
160                         @Override
161                         public String getText(Object element)
162                         {
163                                 MemoryTableRow row = (MemoryTableRow) element;
164                                 return AsmNumberUtil.toString(row.getMemory().getCellAsBigInteger(row.address), displaySettings.getDataNumberType());
165                         }
166                 });
167                 col.setEditingSupport(new MemoryCellEditingSupport(viewer, displaySettings));
168         }
169
170         private TableViewerColumn createTableViewerColumn(String title, int bound)
171         {
172                 TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE);
173                 TableColumn column = viewerColumn.getColumn();
174                 column.setText(title);
175                 column.setWidth(bound);
176                 column.setResizable(true);
177                 column.setMoveable(false);
178                 return viewerColumn;
179         }
180
181         @Override
182         public void setFocus()
183         {
184                 viewer.getControl().setFocus();
185         }
186
187         public void setMemoryBinding(MainMemory m)
188         {
189                 int hexAddressLength = Long.toUnsignedString(m.getDefinition().getMaximalAddress(), 16).length();
190                 addressFormat = "0x%0" + hexAddressLength + "X";
191                 viewer.setInput(m);
192         }
193
194         public static class DisplaySettings
195         {
196                 private AsmNumberUtil.NumberType dataNumberType;
197
198                 public AsmNumberUtil.NumberType getDataNumberType()
199                 {
200                         return dataNumberType;
201                 }
202
203                 public void setDataNumberType(AsmNumberUtil.NumberType dataNumberType)
204                 {
205                         this.dataNumberType = dataNumberType;
206                 }
207         }
208 }