Numbers in MemoryView and mpm editor now have leading zeros
[Mograsim.git] / plugins / 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 import java.util.Optional;
5
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;
17
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;
30
31 public class MemoryView extends ViewPart implements ContextObserver
32 {
33         private LazyTableViewer viewer;
34         private MemoryTableContentProvider provider;
35         private DisplaySettings displaySettings;
36
37         @Override
38         public void createPartControl(Composite parent)
39         {
40                 provider = new MemoryTableContentProvider();
41                 displaySettings = new DisplaySettings();
42
43                 GridLayout layout = new GridLayout(6, false);
44                 parent.setLayout(layout);
45
46                 createHeader(parent);
47                 createViewer(parent);
48
49                 displaySettings.addObserver(() -> viewer.refresh());
50
51                 setupContextBinding();
52         }
53
54         @SuppressWarnings("unused")
55         private void createHeader(Composite parent)
56         {
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 ->
65                 {
66                         try
67                         {
68                                 provider.setLowerBound(AsmNumberUtil.valueOf(fromText.getText()).longValue());
69                                 viewer.refresh();
70                         }
71                         catch (NumberFormatException ex)
72                         {
73                                 // Nothing to do here
74                         }
75                 });
76
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 ->
84                 {
85                         try
86                         {
87                                 provider.setAmount(AsmNumberUtil.valueOf(amountText.getText()).intValue());
88                                 viewer.refresh();
89                         }
90                         catch (NumberFormatException ex)
91                         {
92                                 // Nothing to do here
93                         }
94                 });
95                 new RadixSelector(parent, displaySettings);
96         }
97
98         private void createViewer(Composite parent)
99         {
100                 viewer = new LazyTableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL);
101                 createColumns();
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);
109
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);
117         }
118
119         private void createColumns()
120         {
121                 String[] titles = { "Address", "Data" };
122                 int[] bounds = { 100, 100 };
123
124                 TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0]);
125                 col.setLabelProvider(new AddressLabelProvider());
126
127                 col = createTableViewerColumn(titles[1], bounds[1]);
128                 col.setLabelProvider(new NumberColumnLabelProvider(displaySettings)
129                 {
130                         @Override
131                         public BigInteger getAsBigInteger(Object element)
132                         {
133                                 MemoryTableRow row = (MemoryTableRow) element;
134                                 return row.getMemory().getCellAsBigInteger(row.address);
135                         }
136
137                         @Override
138                         public int getBitLength(Object element)
139                         {
140                                 return ((MemoryTableRow) element).getMemory().getDefinition().getCellWidth();
141                         }
142
143                 });
144                 col.setEditingSupport(new MemoryCellEditingSupport(viewer, displaySettings));
145         }
146
147         private TableViewerColumn createTableViewerColumn(String title, int bound)
148         {
149                 TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE);
150                 TableColumn column = viewerColumn.getColumn();
151                 column.setText(title);
152                 column.setWidth(bound);
153                 column.setResizable(true);
154                 column.setMoveable(false);
155                 return viewerColumn;
156         }
157
158         @Override
159         public void setFocus()
160         {
161                 viewer.getControl().setFocus();
162         }
163
164         private void bindMainMemory(MainMemory m)
165         {
166                 viewer.setInput(m);
167         }
168
169         private void setupContextBinding()
170         {
171                 MachineContext.getInstance().registerObserver(this);
172                 setMachine(Optional.ofNullable(MachineContext.getInstance().getMachine()));
173         }
174
175         @Override
176         public void setMachine(Optional<Machine> machine)
177         {
178                 if (machine.isPresent())
179                         bindMainMemory(machine.get().getMainMemory());
180         }
181 }