import java.io.IOException;
import java.io.InputStream;
+import java.util.Optional;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.swt.SWT;
+import org.eclipse.debug.ui.DebugUITools;
+import org.eclipse.debug.ui.contexts.IDebugContextManager;
+import org.eclipse.debug.ui.contexts.IDebugContextService;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.EditorPart;
+import net.mograsim.machine.Machine;
+import net.mograsim.machine.Machine.ActiveMicroInstructionChangedListener;
import net.mograsim.machine.Memory.MemoryCellModifiedListener;
-import net.mograsim.machine.mi.AssignableMicroInstructionMemory.MIMemoryReassignedListener;
import net.mograsim.machine.mi.MicroInstructionMemory;
-import net.mograsim.machine.mi.MicroInstructionMemory.ActiveMicroInstructionChangedListener;
import net.mograsim.machine.mi.MicroInstructionMemoryParseException;
import net.mograsim.machine.mi.MicroInstructionMemoryParser;
+import net.mograsim.plugin.launch.MachineDebugContextListener;
+import net.mograsim.plugin.launch.MachineDebugTarget;
import net.mograsim.plugin.nature.MachineContext;
-import net.mograsim.plugin.nature.MachineContext.ActiveMachineListener;
import net.mograsim.plugin.nature.ProjectMachineContext;
import net.mograsim.plugin.tables.DisplaySettings;
import net.mograsim.plugin.tables.RadixSelector;
private InstructionTable table;
private MachineContext context;
+ private IFile file;
+
// Listeners
private MemoryCellModifiedListener cellModifiedListener = address ->
{
table.refresh();
};
- private ActiveMicroInstructionChangedListener activeInstructionChangedListener = address -> highlight(
- (int) (address - memory.getDefinition().getMinimalAddress()));
-
- private MIMemoryReassignedListener reassignedListener = newAssignee ->
+ private ActiveMicroInstructionChangedListener instChangeListener = (oldAddress, newAddress) ->
{
- // clear highlighting if the memory is reassigned
- if (newAssignee != memory)
- highlight(-1);
+ highlight((int) (newAddress - memory.getDefinition().getMinimalAddress()));
};
- private ActiveMachineListener activeMachineListener = (oldMachine, newMachine) ->
+ private MachineDebugContextListener debugContextListener = new MachineDebugContextListener()
{
- // clear highlighting if the active machine changes
- if (newMachine.isEmpty() || !newMachine.equals(oldMachine))
+ @Override
+ public void machineDebugContextChanged(Optional<MachineDebugTarget> oldTarget, Optional<MachineDebugTarget> newTarget)
{
- highlight(-1);
- oldMachine.ifPresent(m -> m.getMicroInstructionMemory().deregisterMemoryReassignedListener(reassignedListener));
+ instChangeListener.instructionChanged(-1, -1);
+ oldTarget.ifPresent(target -> target.getMachine().removeActiveMicroInstructionChangedListener(instChangeListener));
+
+ newTarget.ifPresent(target ->
+ {
+ if (file.equals(target.getMPMFile()))
+ {
+ Machine m = target.getMachine();
+ target.getMachine().addActiveMicroInstructionChangedListener(instChangeListener);
+ instChangeListener.instructionChanged(-1, m.getActiveMicroInstructionAddress());
+ }
+ });
}
};
DisplaySettings displaySettings = new DisplaySettings();
new RadixSelector(parent, displaySettings);
- addActivationButton(parent);
table = new InstructionTable(parent, displaySettings, getSite().getWorkbenchWindow().getWorkbench().getThemeManager());
table.setContentProvider(provider);
table.bindMicroInstructionMemory(memory);
GridData viewerData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
viewerData.horizontalSpan = 3;
table.getTableViewer().getTable().setLayoutData(viewerData);
+
+ IDebugContextManager debugCManager = DebugUITools.getDebugContextManager();
+ IDebugContextService contextService = debugCManager.getContextService(PlatformUI.getWorkbench().getActiveWorkbenchWindow());
+ contextService.addDebugContextListener(debugContextListener);
+ debugContextListener.debugContextChanged(contextService.getActiveContext());
+ parent.addDisposeListener(e -> contextService.removeDebugContextListener(debugContextListener));
}
public void highlight(int row)
table.highlight(row);
}
- private void addActivationButton(Composite parent)
- {
- Button activationButton = new Button(parent, SWT.PUSH);
- activationButton.setText("Set Active");
- activationButton.addListener(SWT.Selection, e -> context.getActiveMachine().ifPresent(m ->
- {
- m.getMicroInstructionMemory().registerMemoryReassignedListener(reassignedListener);
- context.addActiveMachineListener(activeMachineListener);
- m.getMicroInstructionMemory().bind(memory);
- }));
- }
-
public void bindMicroInstructionMemory(MicroInstructionMemory memory)
{
if (this.memory != null)
{
this.memory.deregisterCellModifiedListener(cellModifiedListener);
- this.memory.deregisterActiveMicroInstructionChangedListener(activeInstructionChangedListener);
}
this.memory = memory;
if (memory != null)
{
this.memory.registerCellModifiedListener(cellModifiedListener);
- this.memory.registerActiveMicroInstructionChangedListener(activeInstructionChangedListener);
}
if (table != null)
table.bindMicroInstructionMemory(memory);
if (input instanceof IFileEditorInput)
{
IFileEditorInput fileInput = (IFileEditorInput) input;
- context = ProjectMachineContext.getMachineContextOf(fileInput.getFile().getProject());
- context.activateMachine();
+ file = fileInput.getFile();
+ context = ProjectMachineContext.getMachineContextOf(file.getProject());
+
setPartName(fileInput.getName());
- open(fileInput.getFile());
- }
+ open(file);
+ } else
+ throw new IllegalArgumentException("Expected IFileEditorInput!");
}
catch (Exception e)
{
throw new PartInitException("Failed to read input!", e);
}
-
}
@Override
@Override
public void dispose()
{
- memory.deregisterActiveMicroInstructionChangedListener(activeInstructionChangedListener);
- memory.deregisterCellModifiedListener(cellModifiedListener);
- context.getActiveMachine().ifPresent(m -> m.getMicroInstructionMemory().deregisterMemoryReassignedListener(reassignedListener));
- context.removeActiveMachineListener(activeMachineListener);
+ if (memory != null)
+ memory.deregisterCellModifiedListener(cellModifiedListener);
super.dispose();
}
+
+ public IFile getFile()
+ {
+ return file;
+ }
}