1 package net.mograsim.plugin.tables.mi;
3 import java.io.IOException;
4 import java.io.InputStream;
6 import org.eclipse.core.resources.IFile;
7 import org.eclipse.core.runtime.CoreException;
8 import org.eclipse.core.runtime.IProgressMonitor;
9 import org.eclipse.swt.SWT;
10 import org.eclipse.swt.layout.GridData;
11 import org.eclipse.swt.layout.GridLayout;
12 import org.eclipse.swt.widgets.Button;
13 import org.eclipse.swt.widgets.Composite;
14 import org.eclipse.ui.IEditorInput;
15 import org.eclipse.ui.IEditorSite;
16 import org.eclipse.ui.IFileEditorInput;
17 import org.eclipse.ui.PartInitException;
18 import org.eclipse.ui.part.EditorPart;
20 import net.mograsim.machine.Machine.ActiveMicroInstructionChangedListener;
21 import net.mograsim.machine.Memory.MemoryCellModifiedListener;
22 import net.mograsim.machine.mi.AssignableMicroInstructionMemory.MIMemoryReassignedListener;
23 import net.mograsim.machine.mi.MicroInstructionMemory;
24 import net.mograsim.machine.mi.MicroInstructionMemoryParseException;
25 import net.mograsim.machine.mi.MicroInstructionMemoryParser;
26 import net.mograsim.plugin.nature.MachineContext;
27 import net.mograsim.plugin.nature.MachineContext.ActiveMachineListener;
28 import net.mograsim.plugin.nature.ProjectMachineContext;
29 import net.mograsim.plugin.tables.DisplaySettings;
30 import net.mograsim.plugin.tables.RadixSelector;
32 public class InstructionView extends EditorPart
34 private InstructionTableContentProvider provider;
35 private boolean dirty = false;
36 private MicroInstructionMemory memory;
37 private InstructionTable table;
38 private MachineContext context;
41 private MemoryCellModifiedListener cellModifiedListener = address ->
47 private ActiveMicroInstructionChangedListener instChangeListener = (oldAddress, newAddress) ->
49 highlight((int) (newAddress - memory.getDefinition().getMinimalAddress()));
52 private MIMemoryReassignedListener reassignedListener = newAssignee ->
54 // clear highlighting if the memory is reassigned
55 if (newAssignee != memory)
59 private ActiveMachineListener activeMachineListener = (oldMachine, newMachine) ->
61 // clear highlighting if the active machine changes
62 if (newMachine.isEmpty() || !newMachine.equals(oldMachine))
65 oldMachine.ifPresent(m -> m.getMicroInstructionMemory().deregisterMemoryReassignedListener(reassignedListener));
69 @SuppressWarnings("unused")
71 public void createPartControl(Composite parent)
73 provider = new InstructionTableLazyContentProvider();
74 GridLayout layout = new GridLayout(3, false);
75 parent.setLayout(layout);
77 DisplaySettings displaySettings = new DisplaySettings();
78 new RadixSelector(parent, displaySettings);
80 addActivationButton(parent);
81 table = new InstructionTable(parent, displaySettings, getSite().getWorkbenchWindow().getWorkbench().getThemeManager());
82 table.setContentProvider(provider);
83 table.bindMicroInstructionMemory(memory);
85 GridData viewerData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
86 viewerData.horizontalSpan = 3;
87 table.getTableViewer().getTable().setLayoutData(viewerData);
90 public void highlight(int row)
95 private void addActivationButton(Composite parent)
97 Button activationButton = new Button(parent, SWT.PUSH);
98 activationButton.setText("Set Active");
99 activationButton.addListener(SWT.Selection, e -> context.getActiveMachine().ifPresent(m ->
101 m.getMicroInstructionMemory().registerMemoryReassignedListener(reassignedListener);
102 context.addActiveMachineListener(activeMachineListener);
103 m.getMicroInstructionMemory().bind(memory);
104 m.addActiveMicroInstructionChangedListener(instChangeListener);
108 public void bindMicroInstructionMemory(MicroInstructionMemory memory)
110 if (this.memory != null)
112 this.memory.deregisterCellModifiedListener(cellModifiedListener);
114 this.memory = memory;
117 this.memory.registerCellModifiedListener(cellModifiedListener);
120 table.bindMicroInstructionMemory(memory);
123 private void open(IFile file) throws IOException, MicroInstructionMemoryParseException, CoreException
125 bindMicroInstructionMemory(MicroInstructionMemoryParser.parseMemory(
126 context.getMachineDefinition().orElseThrow(() -> new MicroInstructionMemoryParseException("No MachineDefinition assigned!"))
127 .getMicroInstructionMemoryDefinition(),
128 file.getContents()));
131 private void save(IFile file, IProgressMonitor progressMonitor) throws IOException, CoreException, MicroInstructionMemoryParseException
135 throw new MicroInstructionMemoryParseException(
136 "Failed to write MicroprogrammingMemory to File. No MicroprogrammingMemory assigned.");
138 try (InputStream toWrite = MicroInstructionMemoryParser.write(memory))
140 file.setContents(toWrite, 0, progressMonitor);
145 public void setFocus()
147 table.getTableViewer().getControl().setFocus();
151 public void doSave(IProgressMonitor progressMonitor)
153 IEditorInput input = getEditorInput();
154 if (input instanceof IFileEditorInput)
156 IFileEditorInput pathInput = (IFileEditorInput) input;
159 save(pathInput.getFile(), progressMonitor);
165 progressMonitor.setCanceled(true);
168 progressMonitor.setCanceled(true);
172 public void doSaveAs()
174 // openSaveAsDialog();
177 // private void openSaveAsDialog()
179 // FileDialog d = new FileDialog(table.getTableViewer().getTable().getShell(), SWT.SAVE);
181 // String filename = d.getFileName();
182 // if (!filename.equals(""))
184 // save(d.getFilterPath() + File.separator + filename);
190 public void init(IEditorSite site, IEditorInput input) throws PartInitException
196 if (input instanceof IFileEditorInput)
198 IFileEditorInput fileInput = (IFileEditorInput) input;
199 context = ProjectMachineContext.getMachineContextOf(fileInput.getFile().getProject());
200 context.activateMachine();
201 setPartName(fileInput.getName());
202 open(fileInput.getFile());
207 throw new PartInitException("Failed to read input!", e);
213 public boolean isDirty()
219 public boolean isSaveAsAllowed()
224 private void setDirty(boolean value)
227 firePropertyChange(PROP_DIRTY);
231 public void dispose()
233 memory.deregisterCellModifiedListener(cellModifiedListener);
234 context.getActiveMachine().ifPresent(m ->
236 m.removeActiveMicroInstructionChangedListener(instChangeListener);
237 m.getMicroInstructionMemory().deregisterMemoryReassignedListener(reassignedListener);
239 context.removeActiveMachineListener(activeMachineListener);