X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=plugins%2Fnet.mograsim.plugin.core%2Fsrc%2Fnet%2Fmograsim%2Fplugin%2Ftables%2Fmi%2FInstructionView.java;h=214bd8ce1bae257b89db149b047619db96c365a2;hb=648fc6e69e09fe4467cb6bac47934be1a7dcf0d6;hp=b21c848d662d8ab3773bdea29dac37d5ec4dd227;hpb=76c2b3eab6cec47490bb75713356152deb5d07ed;p=Mograsim.git diff --git a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java index b21c848d..214bd8ce 100644 --- a/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java +++ b/plugins/net.mograsim.plugin.core/src/net/mograsim/plugin/tables/mi/InstructionView.java @@ -1,42 +1,79 @@ package net.mograsim.plugin.tables.mi; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; import java.io.IOException; +import java.io.InputStream; +import java.util.Optional; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.swt.SWT; +import org.eclipse.debug.ui.DebugUITools; +import org.eclipse.debug.ui.contexts.IDebugContextManager; +import org.eclipse.debug.ui.contexts.IDebugContextService; 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.Display; -import org.eclipse.swt.widgets.FileDialog; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; -import org.eclipse.ui.IPathEditorInput; +import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.EditorPart; +import net.mograsim.machine.Machine; +import net.mograsim.machine.Machine.ActiveMicroInstructionChangedListener; import net.mograsim.machine.Memory.MemoryCellModifiedListener; import net.mograsim.machine.mi.MicroInstructionMemory; -import net.mograsim.machine.mi.MicroInstructionMemory.ActiveMicroInstructionChangedListener; import net.mograsim.machine.mi.MicroInstructionMemoryParseException; import net.mograsim.machine.mi.MicroInstructionMemoryParser; -import net.mograsim.plugin.MachineContext; +import net.mograsim.plugin.launch.MachineDebugContextListener; +import net.mograsim.plugin.launch.MachineDebugTarget; +import net.mograsim.plugin.nature.MachineContext; +import net.mograsim.plugin.nature.ProjectMachineContext; import net.mograsim.plugin.tables.DisplaySettings; -import net.mograsim.plugin.tables.LazyTableViewer; import net.mograsim.plugin.tables.RadixSelector; -public class InstructionView extends EditorPart implements MemoryCellModifiedListener, ActiveMicroInstructionChangedListener +public class InstructionView extends EditorPart { private InstructionTableContentProvider provider; - private int highlighted = 0; private boolean dirty = false; - private String machineName; private MicroInstructionMemory memory; private InstructionTable table; + private MachineContext context; + + private IFile file; + + // Listeners + private MemoryCellModifiedListener cellModifiedListener = address -> + { + setDirty(true); + table.refresh(); + }; + + private ActiveMicroInstructionChangedListener instChangeListener = (oldAddress, newAddress) -> + { + highlight((int) (newAddress - memory.getDefinition().getMinimalAddress())); + }; + + private MachineDebugContextListener debugContextListener = new MachineDebugContextListener() + { + @Override + public void machineDebugContextChanged(Optional oldTarget, Optional newTarget) + { + instChangeListener.instructionChanged(-1, -1); + oldTarget.ifPresent(target -> target.getMachine().removeActiveMicroInstructionChangedListener(instChangeListener)); + + newTarget.ifPresent(target -> + { + if (file.equals(target.getMPMFile())) + { + Machine m = target.getMachine(); + target.getMachine().addActiveMicroInstructionChangedListener(instChangeListener); + instChangeListener.instructionChanged(-1, m.getActiveMicroInstructionAddress()); + } + }); + } + }; @SuppressWarnings("unused") @Override @@ -49,73 +86,59 @@ public class InstructionView extends EditorPart implements MemoryCellModifiedLis DisplaySettings displaySettings = new DisplaySettings(); new RadixSelector(parent, displaySettings); - addActivationButton(parent); - - table = new InstructionTable(parent, displaySettings); + table = new InstructionTable(parent, displaySettings, getSite().getWorkbenchWindow().getWorkbench().getThemeManager()); table.setContentProvider(provider); table.bindMicroInstructionMemory(memory); GridData viewerData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH); viewerData.horizontalSpan = 3; table.getTableViewer().getTable().setLayoutData(viewerData); - } - public void highlight(int index) - { - Display.getDefault().asyncExec(() -> - { - LazyTableViewer viewer = table.getTableViewer(); - viewer.highlightRow(highlighted, false); - highlighted = index; - viewer.highlightRow(index, true); - viewer.getTable().setTopIndex(index); - }); + IDebugContextManager debugCManager = DebugUITools.getDebugContextManager(); + IDebugContextService contextService = debugCManager.getContextService(PlatformUI.getWorkbench().getActiveWorkbenchWindow()); + contextService.addDebugContextListener(debugContextListener); + debugContextListener.debugContextChanged(contextService.getActiveContext()); + parent.addDisposeListener(e -> contextService.removeDebugContextListener(debugContextListener)); } - private void addActivationButton(Composite parent) + public void highlight(int row) { - Button activationButton = new Button(parent, SWT.PUSH); - activationButton.setText("Set Active"); - activationButton.addListener(SWT.Selection, - e -> MachineContext.getInstance().getMachine().getMicroInstructionMemory().bind(memory)); + table.highlight(row); } public void bindMicroInstructionMemory(MicroInstructionMemory memory) { + if (this.memory != null) + { + this.memory.deregisterCellModifiedListener(cellModifiedListener); + } this.memory = memory; - this.memory.registerCellModifiedListener(this); - this.memory.registerActiveMicroInstructionChangedListener(this); + if (memory != null) + { + this.memory.registerCellModifiedListener(cellModifiedListener); + } if (table != null) table.bindMicroInstructionMemory(memory); } - private void open(String file) + private void open(IFile file) throws IOException, MicroInstructionMemoryParseException, CoreException { - try (BufferedReader bf = new BufferedReader(new FileReader(file))) - { - machineName = bf.readLine(); - bindMicroInstructionMemory(MicroInstructionMemoryParser.parseMemory(machineName, bf)); - } - catch (IOException | MicroInstructionMemoryParseException e) - { - e.printStackTrace(); - } + bindMicroInstructionMemory(MicroInstructionMemoryParser.parseMemory( + context.getMachineDefinition().orElseThrow(() -> new MicroInstructionMemoryParseException("No MachineDefinition assigned!")) + .getMicroInstructionMemoryDefinition(), + file.getContents())); } - private void save(String file) + private void save(IFile file, IProgressMonitor progressMonitor) throws IOException, CoreException, MicroInstructionMemoryParseException { if (memory == null) { - System.err.println("Failed to write MicroprogrammingMemory to File. No MicroprogrammingMemory assigned."); - return; - } - try - { - MicroInstructionMemoryParser.write(memory, machineName, file); + throw new MicroInstructionMemoryParseException( + "Failed to write MicroprogrammingMemory to File. No MicroprogrammingMemory assigned."); } - catch (IOException e) + try (InputStream toWrite = MicroInstructionMemoryParser.write(memory)) { - e.printStackTrace(); + file.setContents(toWrite, 0, progressMonitor); } } @@ -129,42 +152,62 @@ public class InstructionView extends EditorPart implements MemoryCellModifiedLis public void doSave(IProgressMonitor progressMonitor) { IEditorInput input = getEditorInput(); - if (input instanceof IPathEditorInput) + if (input instanceof IFileEditorInput) { - IPathEditorInput pathInput = (IPathEditorInput) input; - save(pathInput.getPath().toOSString()); - setDirty(false); - } + IFileEditorInput pathInput = (IFileEditorInput) input; + try + { + save(pathInput.getFile(), progressMonitor); + setDirty(false); + } + catch (Exception e) + { + e.printStackTrace(); + progressMonitor.setCanceled(true); + } + } else + progressMonitor.setCanceled(true); } @Override public void doSaveAs() { - openSaveAsDialog(); +// openSaveAsDialog(); } - private void openSaveAsDialog() - { - FileDialog d = new FileDialog(table.getTableViewer().getTable().getShell(), SWT.SAVE); - d.open(); - String filename = d.getFileName(); - if (!filename.equals("")) - { - save(d.getFilterPath() + File.separator + filename); - setDirty(false); - } - } +// private void openSaveAsDialog() +// { +// FileDialog d = new FileDialog(table.getTableViewer().getTable().getShell(), SWT.SAVE); +// d.open(); +// String filename = d.getFileName(); +// if (!filename.equals("")) +// { +// save(d.getFilterPath() + File.separator + filename); +// setDirty(false); +// } +// } @Override public void init(IEditorSite site, IEditorInput input) throws PartInitException { setSite(site); setInput(input); - if (input instanceof IPathEditorInput) + try { - IPathEditorInput pathInput = (IPathEditorInput) input; - setPartName(pathInput.getName()); - open(pathInput.getPath().toOSString()); + if (input instanceof IFileEditorInput) + { + IFileEditorInput fileInput = (IFileEditorInput) input; + file = fileInput.getFile(); + context = ProjectMachineContext.getMachineContextOf(file.getProject()); + + setPartName(fileInput.getName()); + open(file); + } else + throw new IllegalArgumentException("Expected IFileEditorInput!"); + } + catch (Exception e) + { + throw new PartInitException("Failed to read input!", e); } } @@ -177,14 +220,7 @@ public class InstructionView extends EditorPart implements MemoryCellModifiedLis @Override public boolean isSaveAsAllowed() { - return true; - } - - @Override - public void update(long address) - { - setDirty(true); - table.refresh(); + return false; } private void setDirty(boolean value) @@ -194,8 +230,15 @@ public class InstructionView extends EditorPart implements MemoryCellModifiedLis } @Override - public void activeMicroInstructionChanged(long address) + public void dispose() + { + if (memory != null) + memory.deregisterCellModifiedListener(cellModifiedListener); + super.dispose(); + } + + public IFile getFile() { - highlight((int) (address - memory.getDefinition().getMinimalAddress())); + return file; } }