1 package net.mograsim.plugin.tables.mi;
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.util.Optional;
7 import org.eclipse.core.resources.IFile;
8 import org.eclipse.core.resources.IProject;
9 import org.eclipse.core.resources.ResourcesPlugin;
10 import org.eclipse.core.runtime.CoreException;
11 import org.eclipse.core.runtime.IProgressMonitor;
12 import org.eclipse.debug.ui.DebugUITools;
13 import org.eclipse.debug.ui.contexts.IDebugContextManager;
14 import org.eclipse.debug.ui.contexts.IDebugContextService;
15 import org.eclipse.swt.layout.GridData;
16 import org.eclipse.swt.layout.GridLayout;
17 import org.eclipse.swt.widgets.Composite;
18 import org.eclipse.ui.IEditorInput;
19 import org.eclipse.ui.IEditorSite;
20 import org.eclipse.ui.IFileEditorInput;
21 import org.eclipse.ui.PartInitException;
22 import org.eclipse.ui.PlatformUI;
23 import org.eclipse.ui.part.EditorPart;
25 import net.mograsim.machine.Machine;
26 import net.mograsim.machine.Machine.ActiveMicroInstructionChangedListener;
27 import net.mograsim.machine.Memory.MemoryCellModifiedListener;
28 import net.mograsim.machine.mi.MicroInstructionMemory;
29 import net.mograsim.machine.mi.MicroInstructionMemoryParseException;
30 import net.mograsim.machine.mi.MicroInstructionMemoryParser;
31 import net.mograsim.plugin.launch.MachineDebugContextListener;
32 import net.mograsim.plugin.launch.MachineDebugTarget;
33 import net.mograsim.plugin.launch.MachineLaunchConfigType.MachineLaunchParams;
34 import net.mograsim.plugin.nature.MachineContext;
35 import net.mograsim.plugin.nature.ProjectMachineContext;
36 import net.mograsim.plugin.tables.DisplaySettings;
37 import net.mograsim.plugin.tables.RadixSelector;
39 public class InstructionView extends EditorPart
41 private InstructionTableContentProvider provider;
42 private boolean dirty = false;
43 private MicroInstructionMemory memory;
44 private InstructionTable table;
45 private MachineContext context;
50 private MemoryCellModifiedListener cellModifiedListener = address ->
56 private ActiveMicroInstructionChangedListener instChangeListener = (oldAddress, newAddress) ->
58 highlight((int) (newAddress - memory.getDefinition().getMinimalAddress()));
61 private MachineDebugContextListener debugContextListener = new MachineDebugContextListener()
64 public void machineDebugContextChanged(Optional<MachineDebugTarget> oldTarget, Optional<MachineDebugTarget> newTarget)
66 instChangeListener.instructionChanged(-1, -1);
67 oldTarget.ifPresent(target -> target.getMachine().removeActiveMicroInstructionChangedListener(instChangeListener));
69 newTarget.ifPresent(target ->
71 MachineLaunchParams params = target.getLaunchParams();
72 IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(params.getProjectPath());
74 if (file.equals(project.getFile(params.getMpmPath())))
76 Machine m = target.getMachine();
77 target.getMachine().addActiveMicroInstructionChangedListener(instChangeListener);
78 instChangeListener.instructionChanged(-1, m.getActiveMicroInstructionAddress());
84 @SuppressWarnings("unused")
86 public void createPartControl(Composite parent)
88 provider = new InstructionTableLazyContentProvider();
89 GridLayout layout = new GridLayout(3, false);
90 parent.setLayout(layout);
92 DisplaySettings displaySettings = new DisplaySettings();
93 new RadixSelector(parent, displaySettings);
95 table = new InstructionTable(parent, displaySettings, getSite().getWorkbenchWindow().getWorkbench().getThemeManager());
96 table.setContentProvider(provider);
97 table.bindMicroInstructionMemory(memory);
99 GridData viewerData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
100 viewerData.horizontalSpan = 3;
101 table.getTableViewer().getTable().setLayoutData(viewerData);
103 IDebugContextManager debugCManager = DebugUITools.getDebugContextManager();
104 IDebugContextService contextService = debugCManager.getContextService(PlatformUI.getWorkbench().getActiveWorkbenchWindow());
105 contextService.addDebugContextListener(debugContextListener);
106 debugContextListener.debugContextChanged(contextService.getActiveContext());
107 parent.addDisposeListener(e -> contextService.removeDebugContextListener(debugContextListener));
110 public void highlight(int row)
112 table.highlight(row);
115 public void bindMicroInstructionMemory(MicroInstructionMemory memory)
117 if (this.memory != null)
119 this.memory.deregisterCellModifiedListener(cellModifiedListener);
121 this.memory = memory;
124 this.memory.registerCellModifiedListener(cellModifiedListener);
127 table.bindMicroInstructionMemory(memory);
130 private void open(IFile file) throws IOException, MicroInstructionMemoryParseException, CoreException
132 bindMicroInstructionMemory(MicroInstructionMemoryParser.parseMemory(
133 context.getMachineDefinition().orElseThrow(() -> new MicroInstructionMemoryParseException("No MachineDefinition assigned!"))
134 .getMicroInstructionMemoryDefinition(),
135 file.getContents()));
138 private void save(IFile file, IProgressMonitor progressMonitor) throws IOException, CoreException, MicroInstructionMemoryParseException
142 throw new MicroInstructionMemoryParseException(
143 "Failed to write MicroprogrammingMemory to File. No MicroprogrammingMemory assigned.");
145 try (InputStream toWrite = MicroInstructionMemoryParser.write(memory))
147 file.setContents(toWrite, 0, progressMonitor);
152 public void setFocus()
154 table.getTableViewer().getControl().setFocus();
158 public void doSave(IProgressMonitor progressMonitor)
160 IEditorInput input = getEditorInput();
161 if (input instanceof IFileEditorInput)
163 IFileEditorInput pathInput = (IFileEditorInput) input;
166 save(pathInput.getFile(), progressMonitor);
172 progressMonitor.setCanceled(true);
175 progressMonitor.setCanceled(true);
179 public void doSaveAs()
181 // openSaveAsDialog();
184 // private void openSaveAsDialog()
186 // FileDialog d = new FileDialog(table.getTableViewer().getTable().getShell(), SWT.SAVE);
188 // String filename = d.getFileName();
189 // if (!filename.equals(""))
191 // save(d.getFilterPath() + File.separator + filename);
197 public void init(IEditorSite site, IEditorInput input) throws PartInitException
203 if (input instanceof IFileEditorInput)
205 IFileEditorInput fileInput = (IFileEditorInput) input;
206 file = fileInput.getFile();
207 context = ProjectMachineContext.getMachineContextOf(file.getProject());
209 setPartName(fileInput.getName());
212 throw new IllegalArgumentException("Expected IFileEditorInput!");
216 throw new PartInitException("Failed to read input!", e);
221 public boolean isDirty()
227 public boolean isSaveAsAllowed()
232 private void setDirty(boolean value)
235 firePropertyChange(PROP_DIRTY);
239 public void dispose()
241 memory.deregisterCellModifiedListener(cellModifiedListener);