package net.mograsim.plugin.editors;
-import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
import java.math.BigInteger;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.EditorPart;
+import org.eclipse.ui.themes.ITheme;
+import org.eclipse.ui.themes.IThemeManager;
import net.mograsim.machine.MainMemory;
+import net.mograsim.machine.MainMemoryDefinition;
+import net.mograsim.machine.Memory.MemoryCellModifiedListener;
import net.mograsim.machine.mi.MicroInstructionMemoryParseException;
-import net.mograsim.machine.standard.memory.WordAddressableMemory;
+import net.mograsim.machine.standard.memory.MainMemoryParser;
import net.mograsim.plugin.asm.AsmNumberUtil;
import net.mograsim.plugin.nature.MachineContext;
import net.mograsim.plugin.nature.ProjectMachineContext;
private MemoryTableContentProvider provider;
private DisplaySettings displaySettings;
+ private boolean dirty;
+
+ private final MemoryCellModifiedListener memListener;
+
+ private final static String font = "net.mograsim.plugin.memory.table_font";
+ private IPropertyChangeListener fontChangeListener;
+
+ public MemoryEditor()
+ {
+ memListener = this::cellModified;
+ }
+
@Override
public void createPartControl(Composite parent)
{
Text amountText = new Text(parent, SWT.BORDER);
amountText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
amountText.addVerifyListener(vl);
- amountText.setText("0");
amountText.addModifyListener(e ->
{
try
{
- provider.setAmount(AsmNumberUtil.valueOf(amountText.getText()).intValue());
- viewer.refresh();
+ if (provider != null)
+ provider.setAmount(AsmNumberUtil.valueOf(amountText.getText()).intValue());
+ if (viewer != null)
+ viewer.refresh();
}
catch (NumberFormatException x)
{
// Nothing to do here
}
});
+ amountText.setText("100");// do this after registering the ModifyListener
new RadixSelector(parent, displaySettings);
addActivationButton(parent);
table.setLinesVisible(true);
viewer.setUseHashlookup(true);
viewer.setContentProvider(provider);
- getSite().setSelectionProvider(viewer);// TODO what does this?
+ getSite().setSelectionProvider(viewer);// TODO what does this do?
viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 7, 1));
+
+ IThemeManager themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager();
+ themeManager.addPropertyChangeListener(fontChangeListener = (e) ->
+ {
+ if (IThemeManager.CHANGE_CURRENT_THEME.equals(e.getProperty()) || font.equals(e.getProperty()))
+ {
+ updateFont(themeManager.getCurrentTheme());
+ viewer.refresh();
+ }
+ });
+ updateFont(themeManager.getCurrentTheme());
+
if (memory != null)
viewer.setInput(memory);
}
+ private void updateFont(ITheme theme)
+ {
+ viewer.getTable().setFont(theme.getFontRegistry().get(font));
+ }
+
private void createColumns()
{
TableViewerColumn addrCol = createTableViewerColumn("Address", 100);
context.activateMachine();
setPartName(fileInput.getName());
- open(fileInput.getFile());
+ try
+ {
+ open(fileInput.getFile());
+ }
+ catch (Exception e)
+ {
+ throw new PartInitException("Failed to read input!", e);
+ }
} else
throw new IllegalArgumentException("MemoryEditor can only be used with Files");
SafeRunnable.getRunner().run(() -> save(((IFileEditorInput) input).getFile(), monitor));
}
- private void save(IFile file, IProgressMonitor monitor) throws CoreException
+ private void save(IFile file, IProgressMonitor monitor) throws CoreException, IOException
{
- file.setContents(new ByteArrayInputStream("actual contents will go here".getBytes()), 0, monitor);
+ if (memory == null)
+ {
+ throw new MicroInstructionMemoryParseException("Failed to write MainMemory to File. No MainMemory assigned.");
+ }
+ try (InputStream toWrite = MainMemoryParser.write(memory))
+ {
+ file.setContents(toWrite, 0, monitor);
+ setDirty(false);
+ }
}
- private void open(IFile file)
+ private void open(IFile file) throws IOException, CoreException
{
- // TODO actually parse the file
- memory = new WordAddressableMemory(context.getMachineDefinition()
- .orElseThrow(() -> new MicroInstructionMemoryParseException("No MachineDefinition assigned!")).getMainMemoryDefinition());
+ MainMemoryDefinition memDef = context.getMachineDefinition()
+ .orElseThrow(() -> new MicroInstructionMemoryParseException("No MachineDefinition assigned!")).getMainMemoryDefinition();
+ memory = MainMemoryParser.parseMemory(memDef, file.getContents());
+ memory.registerCellModifiedListener(memListener);
if (viewer != null)
viewer.setInput(memory);
}
+ private void cellModified(@SuppressWarnings("unused") long address)
+ {
+ setDirty(true);
+ }
+
+ private void setDirty(boolean newDirty)
+ {
+ dirty = newDirty;
+ firePropertyChange(PROP_DIRTY);
+ }
+
@Override
public void doSaveAs()
{
@Override
public boolean isDirty()
{
- // TODO
- return false;
+ return dirty;
}
@Override
@Override
public void dispose()
{
- // TODO Auto-generated method stub
+ getSite().getWorkbenchWindow().getWorkbench().getThemeManager().removePropertyChangeListener(fontChangeListener);
+ if (memory != null)
+ memory.deregisterCellModifiedListener(memListener);
super.dispose();
}
}
\ No newline at end of file