Fixed a bug in Am2900; created dlatch8/80; relayouted some components
[Mograsim.git] / net.mograsim.plugin.core / src / net / mograsim / plugin / tables / memory / MemoryView.java
index 98983a6..0936880 100644 (file)
@@ -1,17 +1,13 @@
 package net.mograsim.plugin.tables.memory;
 
 import java.math.BigInteger;
+import java.util.Optional;
 
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.TableViewerColumn;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.events.VerifyListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Table;
@@ -19,28 +15,45 @@ import org.eclipse.swt.widgets.TableColumn;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.ui.part.ViewPart;
 
+import net.mograsim.machine.Machine;
 import net.mograsim.machine.MainMemory;
 import net.mograsim.machine.MainMemoryDefinition;
 import net.mograsim.machine.standard.memory.WordAddressableMemory;
+import net.mograsim.plugin.MachineContext;
+import net.mograsim.plugin.MachineContext.ContextObserver;
 import net.mograsim.plugin.asm.AsmNumberUtil;
-import net.mograsim.plugin.asm.AsmNumberUtil.NumberType;
+import net.mograsim.plugin.tables.AddressLabelProvider;
+import net.mograsim.plugin.tables.DisplaySettings;
+import net.mograsim.plugin.tables.LazyTableViewer;
 import net.mograsim.plugin.tables.NumberColumnLabelProvider;
+import net.mograsim.plugin.tables.RadixSelector;
 
-public class MemoryView extends ViewPart
+public class MemoryView extends ViewPart implements ContextObserver
 {
-       private TableViewer viewer;
+       private LazyTableViewer viewer;
        private MemoryTableContentProvider provider;
        private DisplaySettings displaySettings;
-       private String addressFormat;
 
        @Override
        public void createPartControl(Composite parent)
        {
                provider = new MemoryTableContentProvider();
-               displaySettings = new DisplaySettings(NumberType.HEXADECIMAL);
+               displaySettings = new DisplaySettings();
 
                GridLayout layout = new GridLayout(6, false);
                parent.setLayout(layout);
+
+               createHeader(parent);
+               createViewer(parent);
+
+               displaySettings.addObserver(() -> viewer.refresh());
+
+               setupContextBinding();
+       }
+
+       @SuppressWarnings("unused")
+       private void createHeader(Composite parent)
+       {
                Label fromLabel = new Label(parent, SWT.NONE);
                fromLabel.setText("Address: ");
                Text fromText = new Text(parent, SWT.BORDER | SWT.SEARCH);
@@ -55,7 +68,7 @@ public class MemoryView extends ViewPart
                                provider.setLowerBound(AsmNumberUtil.valueOf(fromText.getText()).longValue());
                                viewer.refresh();
                        }
-                       catch (@SuppressWarnings("unused") NumberFormatException ex)
+                       catch (NumberFormatException ex)
                        {
                                // Nothing to do here
                        }
@@ -74,59 +87,24 @@ public class MemoryView extends ViewPart
                                provider.setAmount(AsmNumberUtil.valueOf(amountText.getText()).intValue());
                                viewer.refresh();
                        }
-                       catch (@SuppressWarnings("unused") NumberFormatException ex)
+                       catch (NumberFormatException ex)
                        {
                                // Nothing to do here
                        }
                });
-
-               setupRadixSelector(parent);
-
-               createViewer(parent);
-       }
-
-       private void setupRadixSelector(Composite parent)
-       {
-               Label radixLabel = new Label(parent, SWT.NONE);
-               radixLabel.setText("Radix: ");
-               Combo selectRadix = new Combo(parent, SWT.READ_ONLY);
-
-               String entries[] = new String[] { "Binary", "Octal", "Decimal", "Hexadecimal" };
-               NumberType corTypes[] = new NumberType[] { NumberType.BINARY, NumberType.OCTAL, NumberType.DECIMAL, NumberType.HEXADECIMAL };
-               selectRadix.setItems(entries);
-               selectRadix.addSelectionListener(new SelectionListener()
-               {
-                       @Override
-                       public void widgetSelected(SelectionEvent e)
-                       {
-                               int index = selectRadix.getSelectionIndex();
-                               if (index == -1)
-                                       displaySettings.setDataNumberType(NumberType.HEXADECIMAL);
-                               else
-                               {
-                                       displaySettings.setDataNumberType(corTypes[index]);
-                               }
-                               viewer.refresh();
-                       }
-
-                       @Override
-                       public void widgetDefaultSelected(SelectionEvent e)
-                       {
-                               widgetSelected(e);
-                       }
-               });
+               new RadixSelector(parent, displaySettings);
        }
 
        private void createViewer(Composite parent)
        {
-               viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL);
+               viewer = new LazyTableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL);
                createColumns();
                Table table = viewer.getTable();
                table.setHeaderVisible(true);
                table.setLinesVisible(true);
                viewer.setUseHashlookup(true);
                viewer.setContentProvider(provider);
-               setMemoryBinding(new WordAddressableMemory(MainMemoryDefinition.create(8, 8, 8L, Long.MAX_VALUE)));
+               bindMainMemory(new WordAddressableMemory(MainMemoryDefinition.create(8, 8, 8L, Long.MAX_VALUE)));
                getSite().setSelectionProvider(viewer);
 
                GridData gd = new GridData();
@@ -144,15 +122,7 @@ public class MemoryView extends ViewPart
                int[] bounds = { 100, 100 };
 
                TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0]);
-               col.setLabelProvider(new ColumnLabelProvider()
-               {
-                       @Override
-                       public String getText(Object element)
-                       {
-                               MemoryTableRow row = (MemoryTableRow) element;
-                               return String.format(addressFormat, row.address);
-                       }
-               });
+               col.setLabelProvider(new AddressLabelProvider());
 
                col = createTableViewerColumn(titles[1], bounds[1]);
                col.setLabelProvider(new NumberColumnLabelProvider(displaySettings)
@@ -185,10 +155,21 @@ public class MemoryView extends ViewPart
                viewer.getControl().setFocus();
        }
 
-       public void setMemoryBinding(MainMemory m)
+       private void bindMainMemory(MainMemory m)
        {
-               int hexAddressLength = Long.toUnsignedString(m.getDefinition().getMaximalAddress(), 16).length();
-               addressFormat = "0x%0" + hexAddressLength + "X";
                viewer.setInput(m);
        }
+
+       private void setupContextBinding()
+       {
+               MachineContext.getInstance().registerObserver(this);
+               setMachine(Optional.ofNullable(MachineContext.getInstance().getMachine()));
+       }
+
+       @Override
+       public void setMachine(Optional<Machine> machine)
+       {
+               if (machine.isPresent())
+                       bindMainMemory(machine.get().getMainMemory());
+       }
 }