Moved TODOs from getting_started.md to the source code
[Mograsim.git] / plugins / net.mograsim.plugin.core / src / net / mograsim / plugin / editors / MemoryEditor.java
index 507adae..cddc880 100644 (file)
@@ -3,17 +3,21 @@ package net.mograsim.plugin.editors;
 import java.io.IOException;
 import java.io.InputStream;
 import java.math.BigInteger;
+import java.util.Collection;
+import java.util.HashSet;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.util.IPropertyChangeListener;
 import org.eclipse.jface.util.SafeRunnable;
 import org.eclipse.jface.viewers.TableViewerColumn;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Table;
 import org.eclipse.swt.widgets.TableColumn;
@@ -23,6 +27,8 @@ import org.eclipse.ui.IEditorSite;
 import org.eclipse.ui.IFileEditorInput;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.part.EditorPart;
+import org.eclipse.ui.themes.ITheme;
+import org.eclipse.ui.themes.IThemeManager;
 
 import net.mograsim.machine.MainMemory;
 import net.mograsim.machine.MainMemoryDefinition;
@@ -52,10 +58,15 @@ public class MemoryEditor extends EditorPart
        private MemoryTableContentProvider provider;
        private DisplaySettings displaySettings;
 
+       private Collection<Control> fontDependent = new HashSet<>();
+
        private boolean dirty;
 
        private final MemoryCellModifiedListener memListener;
 
+       private final static String font = "net.mograsim.plugin.memory.table_font";
+       private IPropertyChangeListener fontChangeListener;
+
        public MemoryEditor()
        {
                memListener = this::cellModified;
@@ -105,46 +116,59 @@ public class MemoryEditor extends EditorPart
                Text amountText = new Text(parent, SWT.BORDER);
                amountText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
                amountText.addVerifyListener(vl);
-               amountText.setText("0");
                amountText.addModifyListener(e ->
                {
                        try
                        {
-                               provider.setAmount(AsmNumberUtil.valueOf(amountText.getText()).intValue());
-                               viewer.refresh();
+                               if (provider != null)
+                                       provider.setAmount(AsmNumberUtil.valueOf(amountText.getText()).intValue());
+                               if (viewer != null)
+                                       viewer.refresh();
                        }
                        catch (NumberFormatException x)
                        {
                                // Nothing to do here
                        }
                });
+               amountText.setText("100");// do this after registering the ModifyListener
                new RadixSelector(parent, displaySettings);
-
-               addActivationButton(parent);
-       }
-
-       private void addActivationButton(Composite parent)
-       {
-               Button activationButton = new Button(parent, SWT.PUSH);
-               activationButton.setText("Set Active");
-               activationButton.addListener(SWT.Selection, e -> context.getActiveMachine().ifPresent(m -> m.getMainMemory().bind(memory)));
        }
 
        private void createViewer(Composite parent)
        {
                viewer = new LazyTableViewer(parent, SWT.FULL_SELECTION | SWT.BORDER | SWT.VIRTUAL);
+               fontDependent.add(viewer.getTable());
                createColumns();
                Table table = viewer.getTable();
                table.setHeaderVisible(true);
                table.setLinesVisible(true);
                viewer.setUseHashlookup(true);
                viewer.setContentProvider(provider);
-               getSite().setSelectionProvider(viewer);// TODO what does this?
+               getSite().setSelectionProvider(viewer);// TODO what does this do?
                viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 7, 1));
+
+               IThemeManager themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager();
+               themeManager.addPropertyChangeListener(fontChangeListener = (e) ->
+               {
+                       if (IThemeManager.CHANGE_CURRENT_THEME.equals(e.getProperty()) || font.equals(e.getProperty()))
+                       {
+                               updateFont(themeManager.getCurrentTheme());
+                               viewer.refresh();
+                       }
+               });
+               updateFont(themeManager.getCurrentTheme());
+
                if (memory != null)
                        viewer.setInput(memory);
        }
 
+       private void updateFont(ITheme theme)
+       {
+               Font newFont = theme.getFontRegistry().get(font);
+               // TODO: This is a quick fix! Still have to figure out why the CellEditors do not get the appropriate Font on their own
+               fontDependent.forEach(c -> c.setFont(newFont));
+       }
+
        private void createColumns()
        {
                TableViewerColumn addrCol = createTableViewerColumn("Address", 100);
@@ -166,7 +190,9 @@ public class MemoryEditor extends EditorPart
                                return ((MemoryTableRow) element).getMemory().getDefinition().getCellWidth();
                        }
                });
-               dataCol.setEditingSupport(new MemoryCellEditingSupport(viewer, displaySettings));
+               MemoryCellEditingSupport eSup;
+               dataCol.setEditingSupport(eSup = new MemoryCellEditingSupport(viewer, displaySettings));
+               fontDependent.add(eSup.getCellEditorControl());
        }
 
        private TableViewerColumn createTableViewerColumn(String title, int width)
@@ -187,7 +213,6 @@ public class MemoryEditor extends EditorPart
                {
                        IFileEditorInput fileInput = (IFileEditorInput) input;
                        context = ProjectMachineContext.getMachineContextOf(fileInput.getFile().getProject());
-                       context.activateMachine();
 
                        setPartName(fileInput.getName());
                        try
@@ -274,6 +299,7 @@ public class MemoryEditor extends EditorPart
        @Override
        public void dispose()
        {
+               getSite().getWorkbenchWindow().getWorkbench().getThemeManager().removePropertyChangeListener(fontChangeListener);
                if (memory != null)
                        memory.deregisterCellModifiedListener(memListener);
                super.dispose();