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.swt.widgets.Display;
15 import org.eclipse.ui.IEditorInput;
16 import org.eclipse.ui.IEditorSite;
17 import org.eclipse.ui.IFileEditorInput;
18 import org.eclipse.ui.PartInitException;
19 import org.eclipse.ui.part.EditorPart;
21 import net.mograsim.machine.Memory.MemoryCellModifiedListener;
22 import net.mograsim.machine.mi.MicroInstructionMemory;
23 import net.mograsim.machine.mi.MicroInstructionMemory.ActiveMicroInstructionChangedListener;
24 import net.mograsim.machine.mi.MicroInstructionMemoryParseException;
25 import net.mograsim.machine.mi.MicroInstructionMemoryParser;
26 import net.mograsim.plugin.MachineContext;
27 import net.mograsim.plugin.tables.DisplaySettings;
28 import net.mograsim.plugin.tables.LazyTableViewer;
29 import net.mograsim.plugin.tables.RadixSelector;
31 public class InstructionView extends EditorPart implements MemoryCellModifiedListener, ActiveMicroInstructionChangedListener
33 private InstructionTableContentProvider provider;
34 private int highlighted = 0;
35 private boolean dirty = false;
36 private MicroInstructionMemory memory;
37 private InstructionTable table;
39 @SuppressWarnings("unused")
41 public void createPartControl(Composite parent)
43 provider = new InstructionTableLazyContentProvider();
44 GridLayout layout = new GridLayout(3, false);
45 parent.setLayout(layout);
47 DisplaySettings displaySettings = new DisplaySettings();
48 new RadixSelector(parent, displaySettings);
50 addActivationButton(parent);
52 table = new InstructionTable(parent, displaySettings);
53 table.setContentProvider(provider);
54 table.bindMicroInstructionMemory(memory);
56 GridData viewerData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
57 viewerData.horizontalSpan = 3;
58 table.getTableViewer().getTable().setLayoutData(viewerData);
61 public void highlight(int index)
63 Display.getDefault().asyncExec(() ->
65 LazyTableViewer viewer = table.getTableViewer();
66 viewer.highlightRow(highlighted, false);
68 viewer.highlightRow(index, true);
69 viewer.getTable().showItem(viewer.getTable().getItem(Math.min((int) memory.getDefinition().getMaximalAddress(), index + 2)));
70 viewer.getTable().showItem(viewer.getTable().getItem(index));
74 private void addActivationButton(Composite parent)
76 Button activationButton = new Button(parent, SWT.PUSH);
77 activationButton.setText("Set Active");
78 activationButton.addListener(SWT.Selection,
79 e -> MachineContext.getInstance().getMachine().getMicroInstructionMemory().bind(memory));
82 public void bindMicroInstructionMemory(MicroInstructionMemory memory)
87 this.memory.registerCellModifiedListener(this);
88 this.memory.registerActiveMicroInstructionChangedListener(this);
91 table.bindMicroInstructionMemory(memory);
94 private void open(IFile file)
98 bindMicroInstructionMemory(MicroInstructionMemoryParser.parseMemory(
99 MachineContext.getInstance().getMachine().getDefinition().getMicroInstructionMemoryDefinition(), file.getContents()));
101 catch (IOException | MicroInstructionMemoryParseException | CoreException e)
107 private void save(IFile file, IProgressMonitor progressMonitor)
111 System.err.println("Failed to write MicroprogrammingMemory to File. No MicroprogrammingMemory assigned.");
114 try (InputStream toWrite = MicroInstructionMemoryParser.write(memory))
116 file.setContents(toWrite, 0, progressMonitor);
118 catch (IOException | CoreException e)
125 public void setFocus()
127 table.getTableViewer().getControl().setFocus();
131 public void doSave(IProgressMonitor progressMonitor)
133 IEditorInput input = getEditorInput();
134 if (input instanceof IFileEditorInput)
136 IFileEditorInput pathInput = (IFileEditorInput) input;
137 save(pathInput.getFile(), progressMonitor);
143 public void doSaveAs()
145 // openSaveAsDialog();
148 // private void openSaveAsDialog()
150 // FileDialog d = new FileDialog(table.getTableViewer().getTable().getShell(), SWT.SAVE);
152 // String filename = d.getFileName();
153 // if (!filename.equals(""))
155 // save(d.getFilterPath() + File.separator + filename);
161 public void init(IEditorSite site, IEditorInput input) throws PartInitException
165 if (input instanceof IFileEditorInput)
167 IFileEditorInput fileInput = (IFileEditorInput) input;
168 setPartName(fileInput.getName());
169 open(fileInput.getFile());
175 public boolean isDirty()
181 public boolean isSaveAsAllowed()
187 public void update(long address)
193 private void setDirty(boolean value)
196 firePropertyChange(PROP_DIRTY);
200 public void activeMicroInstructionChanged(long address)
202 highlight((int) (address - memory.getDefinition().getMinimalAddress()));