package com.arm.cmsis.pack.refclient.ui;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import com.arm.cmsis.pack.CpDsqEngineFactory;
import com.arm.cmsis.pack.common.CmsisConstants;
import com.arm.cmsis.pack.configuration.IRteConfiguration;
import com.arm.cmsis.pack.dsq.DsqException;
import com.arm.cmsis.pack.dsq.DsqSequence;
import com.arm.cmsis.pack.dsq.IDsqContext;
import com.arm.cmsis.pack.dsq.IDsqEngine;
import com.arm.cmsis.pack.events.IRteEventListener;
import com.arm.cmsis.pack.events.RteEvent;
import com.arm.cmsis.pack.project.CpProjectPlugIn;
import com.arm.cmsis.pack.project.IRteProject;
import com.arm.cmsis.pack.refclient.RefDebugSeqClient;
import com.arm.cmsis.pack.refclient.ui.console.SequenceLogger;
import com.arm.cmsis.pack.ui.CpPlugInUI;
import com.arm.cmsis.pack.ui.tree.AdvisedCellLabelProvider;
import com.arm.cmsis.pack.ui.tree.ColumnAdvisor;
public class SequenceView extends ViewPart implements ISelectionListener, IRteEventListener {
public static final String ID = "com.arm.cmsis.pack.refclient.ui.SequenceView"; //$NON-NLS-1$
private static final int COLBUTTON = 1;
IRteProject selectedProject = null;
IDsqEngine engine = null;
private TableViewer viewer;
SequenceLogger logger;
class RefDsqSequenceContext extends DsqSequence {
public RefDsqSequenceContext(String name) {
super(name);
}
@Override
public Long getPredefinedVariableValue(String name) {
switch (name) {
case IDsqContext.AP:
return 4L;
case IDsqContext.DP:
return 0L;
case IDsqContext.PROTOCOL:
return 0x00010001L;
case IDsqContext.CONNECTION:
return 0L;
case IDsqContext.TRACEOUT:
return 0L;
case IDsqContext.ERRORCONTROL:
return 0L;
default:
return null;
}
}
}
class SequenceViewLabelProvider extends ColumnLabelProvider {
@Override
public Image getImage(Object element) {
return CpPlugInUI.getImage(CpPlugInUI.ICON_COMPONENT);
}
@Override
public String getText(Object element) {
return element instanceof String ? (String)element : "";//$NON-NLS-1$
}
}
class SequenceViewColumnAdvisor extends ColumnAdvisor {
public SequenceViewColumnAdvisor(ColumnViewer columnViewer) {
super(columnViewer);
}
@Override
public CellControlType getCellControlType(Object obj, int columnIndex) {
if (columnIndex == COLBUTTON) {
return CellControlType.BUTTON;
}
return CellControlType.TEXT;
}
@Override
public boolean isEnabled(Object obj, int columnIndex) {
try {
return !engine.isSequenceDisabled((String) obj);
} catch (DsqException e) {
throwException("Error while parsing the debug sequences", e); //$NON-NLS-1$
}
return false;
}
@Override
public Image getImage(Object obj, int columnIndex) {
return CpPlugInUI.getImage(CpPlugInUI.ICON_RUN);
}
@Override
public String getString(Object obj, int columnIndex) {
return "Execute"; //$NON-NLS-1$
}
@Override
protected void handleMouseUp(MouseEvent e) {
if (e.button == 1) {
Point pt = new Point(e.x, e.y);
ViewerCell cell = getViewer().getCell(pt);
if (cell == null) {
return;
}
int colIndex = cell.getColumnIndex();
Object element = cell.getElement();
if (getCellControlType(element, colIndex) != CellControlType.BUTTON ||
!isEnabled(element, colIndex) ||
!isButtonPressed(element, colIndex)) {
return;
}
String seqName = (String) element;
Job job = new Job("Sequence " + seqName) { //$NON-NLS-1$
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
engine.execute(new RefDsqSequenceContext(seqName));
return Status.OK_STATUS;
} catch (DsqException e) {
throwException("Error while executing the debug sequences", e); //$NON-NLS-1$
return Status.CANCEL_STATUS;
}
}
};
job.schedule();
setButtonPressed(null, COLBUTTON, null);
this.control.redraw();
}
}
}
public SequenceView() {
}
@Override
public void createPartControl(Composite parent) {
Table table = new Table(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
table.setHeaderVisible(true);
table.setLinesVisible(true);
viewer = new TableViewer(table);
TableViewerColumn column0 = new TableViewerColumn(viewer, SWT.LEFT);
column0.getColumn().setAlignment(SWT.LEFT);
column0.getColumn().setText("Sequence"); //$NON-NLS-1$
column0.getColumn().setWidth(200);
column0.setLabelProvider(new SequenceViewLabelProvider());
TableViewerColumn column1 = new TableViewerColumn(viewer, SWT.LEFT);
column1.getColumn().setText(CmsisConstants.ACTION_TITLE);
column1.getColumn().setWidth(100);
column1.setLabelProvider(new AdvisedCellLabelProvider(
new SequenceViewColumnAdvisor(viewer), COLBUTTON));
viewer.setContentProvider(ArrayContentProvider.getInstance());
PlatformUI.getWorkbench().getHelpSystem().setHelp(viewer.getControl(), ID);
CpProjectPlugIn.getRteProjectManager().addListener(this);
getSite().getWorkbenchWindow().getSelectionService().addSelectionListener(this);
ISelection sel = getSite().getWorkbenchWindow().getSelectionService().getSelection();
updateView(sel);
}
@Override
public void setFocus() {
viewer.getControl().setFocus();
}
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
updateView(selection);
}
void updateView(ISelection selection) {
IProject p = CpPlugInUI.getProjectFromSelection(selection);
IRteProject rteProject = CpProjectPlugIn.getRteProjectManager().getRteProject(p);
if(rteProject == null || rteProject == selectedProject) {
return;
}
updateViewer(rteProject);
}
IRteConfiguration getRteConfiguration() {
if(selectedProject == null) {
return null;
}
return selectedProject.getRteConfiguration();
}
void updateViewer(IRteProject rteProject) {
selectedProject = rteProject;
IRteConfiguration rteConf = getRteConfiguration();
if(rteConf != null && !viewer.getControl().isDisposed()) {
engine = CpDsqEngineFactory.create(rteConf.getDeviceInfo(), new RefDebugSeqClient(), SequenceLogger.getInstance(selectedProject));
if (engine == null) {
viewer.setInput(null);
MessageDialog.openError(null,
"No Debug Sequence Engine Defined", //$NON-NLS-1$
"There is no Debug Sequence Engine defined in the application"); //$NON-NLS-1$
return;
}
try {
viewer.setInput(engine.getDefaultSequenceNames());
} catch (DsqException e) {
viewer.setInput(null);
throwException("Error while parsing the debug sequences", e); //$NON-NLS-1$
}
}
}
@Override
public void handle(RteEvent event) {
IRteProject rteProject = null;
if(event.getTopic().equals(RteEvent.PROJECT_REMOVED)) {
if(event.getData() != selectedProject) {
return;
}
} else if(event.getTopic().equals(RteEvent.PROJECT_UPDATED)) {
rteProject = (IRteProject)event.getData();
if(rteProject != selectedProject) {
return;
}
}
final IRteProject rteProjectToSet = rteProject;
Display.getDefault().asyncExec(() -> updateViewer(rteProjectToSet));
}
void throwException(String title, DsqException e) {
MessageDialog.openError(null, title, e.getMessage());
}
}