X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.plugin.core%2Fsrc%2Fnet%2Fmograsim%2Fplugin%2Feditors%2FMemoryEditor.java;h=c1268fec3572fd8ac77fb1a31e67c6cf90f5d042;hb=e04b2b8dd50985290f91f71dce45b3905b86a96e;hp=2b02852270b3a3e0eff402130d353b400a5ff54f;hpb=59e4f0d9447e3c764c83e7edabfcbf5c3c24a97b;p=Mograsim.git diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/editors/MemoryEditor.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/editors/MemoryEditor.java index 2b028522..c1268fec 100644 --- a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/editors/MemoryEditor.java +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/editors/MemoryEditor.java @@ -1,18 +1,24 @@ package net.mograsim.plugin.editors; -import java.io.ByteArrayInputStream; +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; @@ -22,10 +28,14 @@ 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; +import net.mograsim.machine.Memory.MemoryCellModifiedListener; import net.mograsim.machine.mi.MicroInstructionMemoryParseException; -import net.mograsim.machine.standard.memory.WordAddressableMemory; +import net.mograsim.machine.standard.memory.MainMemoryParser; import net.mograsim.plugin.asm.AsmNumberUtil; import net.mograsim.plugin.nature.MachineContext; import net.mograsim.plugin.nature.ProjectMachineContext; @@ -49,6 +59,20 @@ public class MemoryEditor extends EditorPart private MemoryTableContentProvider provider; private DisplaySettings displaySettings; + private Collection 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; + } + @Override public void createPartControl(Composite parent) { @@ -93,19 +117,21 @@ 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); @@ -121,18 +147,38 @@ public class MemoryEditor extends EditorPart 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); @@ -154,7 +200,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) @@ -178,7 +226,14 @@ public class MemoryEditor extends EditorPart context.activateMachine(); setPartName(fileInput.getName()); - open(fileInput.getFile()); + try + { + open(fileInput.getFile()); + } + catch (Exception e) + { + throw new PartInitException("Failed to read input!", e); + } } else throw new IllegalArgumentException("MemoryEditor can only be used with Files"); @@ -194,20 +249,40 @@ public class MemoryEditor extends EditorPart SafeRunnable.getRunner().run(() -> save(((IFileEditorInput) input).getFile(), monitor)); } - private void save(IFile file, IProgressMonitor monitor) throws CoreException + private void save(IFile file, IProgressMonitor monitor) throws CoreException, IOException { - file.setContents(new ByteArrayInputStream("actual contents will go here".getBytes()), 0, monitor); + if (memory == null) + { + throw new MicroInstructionMemoryParseException("Failed to write MainMemory to File. No MainMemory assigned."); + } + try (InputStream toWrite = MainMemoryParser.write(memory)) + { + file.setContents(toWrite, 0, monitor); + setDirty(false); + } } - private void open(IFile file) + private void open(IFile file) throws IOException, CoreException { - // TODO actually parse the file - memory = new WordAddressableMemory(context.getMachineDefinition() - .orElseThrow(() -> new MicroInstructionMemoryParseException("No MachineDefinition assigned!")).getMainMemoryDefinition()); + MainMemoryDefinition memDef = context.getMachineDefinition() + .orElseThrow(() -> new MicroInstructionMemoryParseException("No MachineDefinition assigned!")).getMainMemoryDefinition(); + memory = MainMemoryParser.parseMemory(memDef, file.getContents()); + memory.registerCellModifiedListener(memListener); if (viewer != null) viewer.setInput(memory); } + private void cellModified(@SuppressWarnings("unused") long address) + { + setDirty(true); + } + + private void setDirty(boolean newDirty) + { + dirty = newDirty; + firePropertyChange(PROP_DIRTY); + } + @Override public void doSaveAs() { @@ -217,8 +292,7 @@ public class MemoryEditor extends EditorPart @Override public boolean isDirty() { - // TODO - return false; + return dirty; } @Override @@ -236,7 +310,9 @@ public class MemoryEditor extends EditorPart @Override public void dispose() { - // TODO Auto-generated method stub + getSite().getWorkbenchWindow().getWorkbench().getThemeManager().removePropertyChangeListener(fontChangeListener); + if (memory != null) + memory.deregisterCellModifiedListener(memListener); super.dispose(); } } \ No newline at end of file