1 package net.mograsim.plugin.tables.mi;
3 import java.io.BufferedReader;
5 import java.io.FileReader;
6 import java.io.IOException;
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.swt.widgets.FileDialog;
16 import org.eclipse.ui.IEditorInput;
17 import org.eclipse.ui.IEditorSite;
18 import org.eclipse.ui.IPathEditorInput;
19 import org.eclipse.ui.PartInitException;
20 import org.eclipse.ui.part.EditorPart;
22 import net.mograsim.machine.Memory.MemoryCellModifiedListener;
23 import net.mograsim.machine.mi.MicroInstructionMemory;
24 import net.mograsim.machine.mi.MicroInstructionMemory.ActiveMicroInstructionChangedListener;
25 import net.mograsim.machine.mi.MicroInstructionMemoryParseException;
26 import net.mograsim.machine.mi.MicroInstructionMemoryParser;
27 import net.mograsim.plugin.MachineContext;
28 import net.mograsim.plugin.tables.DisplaySettings;
29 import net.mograsim.plugin.tables.LazyTableViewer;
30 import net.mograsim.plugin.tables.RadixSelector;
32 public class InstructionView extends EditorPart implements MemoryCellModifiedListener, ActiveMicroInstructionChangedListener
34 private InstructionTableContentProvider provider;
35 private int highlighted = 0;
36 private boolean dirty = false;
37 private String machineName;
38 private MicroInstructionMemory memory;
39 private InstructionTable table;
41 @SuppressWarnings("unused")
43 public void createPartControl(Composite parent)
45 provider = new InstructionTableLazyContentProvider();
46 GridLayout layout = new GridLayout(3, false);
47 parent.setLayout(layout);
49 DisplaySettings displaySettings = new DisplaySettings();
50 new RadixSelector(parent, displaySettings);
52 addActivationButton(parent);
54 table = new InstructionTable(parent, displaySettings);
55 table.setContentProvider(provider);
56 table.bindMicroInstructionMemory(memory);
58 GridData viewerData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
59 viewerData.horizontalSpan = 3;
60 table.getTableViewer().getTable().setLayoutData(viewerData);
63 public void highlight(int index)
65 Display.getDefault().asyncExec(() ->
67 LazyTableViewer viewer = table.getTableViewer();
68 viewer.highlightRow(highlighted, false);
70 viewer.highlightRow(index, true);
71 viewer.getTable().setTopIndex(index);
75 private void addActivationButton(Composite parent)
77 Button activationButton = new Button(parent, SWT.PUSH);
78 activationButton.setText("Set Active");
79 activationButton.addListener(SWT.Selection,
80 e -> MachineContext.getInstance().getMachine().getMicroInstructionMemory().bind(memory));
83 public void bindMicroInstructionMemory(MicroInstructionMemory memory)
86 this.memory.registerCellModifiedListener(this);
87 this.memory.registerActiveMicroInstructionChangedListener(this);
89 table.bindMicroInstructionMemory(memory);
92 private void open(String file)
94 try (BufferedReader bf = new BufferedReader(new FileReader(file)))
96 machineName = bf.readLine();
97 bindMicroInstructionMemory(MicroInstructionMemoryParser.parseMemory(machineName, bf));
99 catch (IOException | MicroInstructionMemoryParseException e)
105 private void save(String file)
109 System.err.println("Failed to write MicroprogrammingMemory to File. No MicroprogrammingMemory assigned.");
114 MicroInstructionMemoryParser.write(memory, machineName, file);
116 catch (IOException e)
123 public void setFocus()
125 table.getTableViewer().getControl().setFocus();
129 public void doSave(IProgressMonitor progressMonitor)
131 IEditorInput input = getEditorInput();
132 if (input instanceof IPathEditorInput)
134 IPathEditorInput pathInput = (IPathEditorInput) input;
135 save(pathInput.getPath().toOSString());
141 public void doSaveAs()
146 private void openSaveAsDialog()
148 FileDialog d = new FileDialog(table.getTableViewer().getTable().getShell(), SWT.SAVE);
150 String filename = d.getFileName();
151 if (!filename.equals(""))
153 save(d.getFilterPath() + File.separator + filename);
159 public void init(IEditorSite site, IEditorInput input) throws PartInitException
163 if (input instanceof IPathEditorInput)
165 IPathEditorInput pathInput = (IPathEditorInput) input;
166 setPartName(pathInput.getName());
167 open(pathInput.getPath().toOSString());
172 public boolean isDirty()
178 public boolean isSaveAsAllowed()
184 public void update(long address)
190 private void setDirty(boolean value)
193 firePropertyChange(PROP_DIRTY);
197 public void activeMicroInstructionChanged(long address)
199 highlight((int) (address - memory.getDefinition().getMinimalAddress()));