package com.isencia.passerelle.workbench.model.editor.ui.views;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.ViewPart;
import ptolemy.actor.CompositeActor;
import com.isencia.passerelle.actor.FlowUtils;
import com.isencia.passerelle.core.IEventLog;
import com.isencia.passerelle.project.repository.api.RepositoryService;
import com.isencia.passerelle.workbench.model.editor.ui.Activator;
import com.isencia.passerelle.workbench.model.editor.ui.editor.PasserelleModelMultiPageEditor;
public class EventLogView extends ViewPart implements ISelectionListener {
public final static String _DATEFORMAT = "yyyy-MM-dd HH:mm:ss";
public static final String ID = "com.isencia.passerelle.workbench.model.editor.ui.views.EventLogView"; //$NON-NLS-1$
private IWorkbenchPart part;
private TableViewer viewer;
private static final Image INFO = Activator.getImageDescriptor("icons/info.gif").createImage();
private static final Image ERROR = Activator.getImageDescriptor("icons/error.gif").createImage();
private static final Image WARN = Activator.getImageDescriptor("icons/warn.gif").createImage();
// We use icons
public void createPartControl(Composite parent) {
GridLayout layout = new GridLayout(3, false);
parent.setLayout(layout);
Label searchLabel = new Label(parent, SWT.NONE);
searchLabel.setText("Search: ");
final Text searchText = new Text(parent, SWT.BORDER | SWT.SEARCH);
searchText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
searchText.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
updateTableViewer(e.getSource());
}
});
createViewer(parent);
}
private void createViewer(Composite parent) {
viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
createColumns(parent, viewer);
final Table table = viewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
viewer.setContentProvider(new ArrayContentProvider());
// Get the content for the viewer, setInput will call getElements in the
// contentProvider
updateTableViewer();
// Make the selection available to other views
getSite().setSelectionProvider(viewer);
// Set the sorter for the table
// Layout the viewer
GridData gridData = new GridData();
gridData.verticalAlignment = GridData.FILL;
gridData.horizontalSpan = 3;
gridData.grabExcessHorizontalSpace = true;
gridData.grabExcessVerticalSpace = true;
gridData.horizontalAlignment = GridData.FILL;
viewer.getControl().setLayoutData(gridData);
if (getSite() != null)
getSite().getWorkbenchWindow().getSelectionService().addSelectionListener(this);
}
private void updateTableViewer(Object filter) {
if (part instanceof PasserelleModelMultiPageEditor) {
CompositeActor actor = ((PasserelleModelMultiPageEditor) part).getDiagram();
if (actor != null) {
RepositoryService repositoryService = Activator.getDefault().getRepositoryService();
if (repositoryService != null) {
viewer.setInput(repositoryService.getLogs(actor.toplevel().getName(), 100));
}
}
}
}
private void updateTableViewer() {
updateTableViewer(null);
}
public TableViewer getViewer() {
return viewer;
}
// This will create the columns for the table
private void createColumns(final Composite parent, final TableViewer viewer) {
String[] titles = { "", "Message", "Id", "Creation" };
int[] bounds = { 20, 200, 50, 100 };
TableViewerColumn col = createTableViewerColumn(titles[0], bounds[0], 0);
col.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return null;
}
@Override
public Image getImage(Object element) {
IEventLog p = (IEventLog) element;
if ("ERROR".equals(p.getStatus()) || "FATAL".equals(p.getStatus())) {
return ERROR;
} else if ("WARN".equals(p.getStatus())) {
return WARN;
} else {
return INFO;
}
}
});
// First column is for the message
col = createTableViewerColumn(titles[1], bounds[1], 1);
col.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
IEventLog p = (IEventLog) element;
return p.getMessage();
}
});
// Second column is for the last name
col = createTableViewerColumn(titles[2], bounds[2], 2);
col.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
IEventLog p = (IEventLog) element;
if (p.getSessionId() != null && p.getSessionId().contains(FlowUtils.FLOW_SEPARATOR)) {
String parts[] = p.getSessionId().split(FlowUtils.FLOW_SEPARATOR);
if (parts.length > 1) {
return parts[1];
} else {
return parts[0];
}
}
return p.getSessionId();
}
});
// Third column is for creation ts
col = createTableViewerColumn(titles[3], bounds[3], 3);
col.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
IEventLog p = (IEventLog) element;
Date date = p.getDate();
if (date == null) {
return null;
}
SimpleDateFormat formatter = new SimpleDateFormat(_DATEFORMAT);
return formatter.format(date);
}
});
}
private TableViewerColumn createTableViewerColumn(String title, int bound, final int colNumber) {
final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE);
final TableColumn column = viewerColumn.getColumn();
column.setText(title);
column.setWidth(bound);
column.setResizable(true);
column.setMoveable(true);
return viewerColumn;
}
/** * Passing the focus request to the viewer's control. */
public void setFocus() {
viewer.getControl().setFocus();
}
public void selectionChanged(IWorkbenchPart part, ISelection arg1) {
if (part instanceof PasserelleModelMultiPageEditor) {
this.part = part;
updateTableViewer();
// clear();
}
}
public void clear() {
this.part = null;
}
}