blob: b901268ac719f4e302c13355773497f3b1a2f63b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - Initial API and implementation
*******************************************************************************/
package org.eclipse.ptp.ui.views;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.ptp.core.IModelManager;
import org.eclipse.ptp.core.PTPCorePlugin;
import org.eclipse.ptp.core.attributes.IAttribute;
import org.eclipse.ptp.core.attributes.IAttributeDefinition;
import org.eclipse.ptp.core.elements.IPJob;
import org.eclipse.ptp.core.elements.IPQueue;
import org.eclipse.ptp.core.elements.IPUniverse;
import org.eclipse.ptp.core.elements.IResourceManager;
import org.eclipse.ptp.core.elements.attributes.ElementAttributes;
import org.eclipse.ptp.core.elements.attributes.JobAttributes;
import org.eclipse.ptp.core.elements.events.IChangedJobEvent;
import org.eclipse.ptp.core.elements.events.IChangedMachineEvent;
import org.eclipse.ptp.core.elements.events.IChangedQueueEvent;
import org.eclipse.ptp.core.elements.events.INewJobEvent;
import org.eclipse.ptp.core.elements.events.INewMachineEvent;
import org.eclipse.ptp.core.elements.events.INewQueueEvent;
import org.eclipse.ptp.core.elements.events.IRemoveJobEvent;
import org.eclipse.ptp.core.elements.events.IRemoveMachineEvent;
import org.eclipse.ptp.core.elements.events.IRemoveQueueEvent;
import org.eclipse.ptp.core.elements.listeners.IQueueChildListener;
import org.eclipse.ptp.core.elements.listeners.IResourceManagerChildListener;
import org.eclipse.ptp.core.events.IChangedResourceManagerEvent;
import org.eclipse.ptp.core.events.INewResourceManagerEvent;
import org.eclipse.ptp.core.events.IRemoveResourceManagerEvent;
import org.eclipse.ptp.core.listeners.IModelManagerChildListener;
import org.eclipse.ptp.internal.ui.ParallelImages;
import org.eclipse.ptp.internal.ui.actions.TerminateJobFromListAction;
import org.eclipse.ptp.ui.IPTPUIConstants;
import org.eclipse.ptp.ui.PTPUIPlugin;
import org.eclipse.ptp.utils.ui.PixelConverter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.ViewPart;
public class JobsListView extends ViewPart {
private final class MMChildListener implements IModelManagerChildListener {
/* (non-Javadoc)
* @see org.eclipse.ptp.core.listeners.IModelManagerChildListener#handleEvent(org.eclipse.ptp.core.events.IChangedResourceManagerEvent)
*/
public void handleEvent(IChangedResourceManagerEvent e) {
// Don't need to do anything
}
/* (non-Javadoc)
* @see org.eclipse.ptp.core.listeners.IModelManagerChildListener#handleEvent(org.eclipse.ptp.core.events.INewResourceManagerEvent)
*/
public void handleEvent(INewResourceManagerEvent e) {
/*
* Add resource manager child listener so we get notified when new
* machines are added to the model.
*/
final IResourceManager rm = e.getResourceManager();
rm.addChildListener(resourceManagerListener);
}
/* (non-Javadoc)
* @see org.eclipse.ptp.core.listeners.IModelManagerChildListener#handleEvent(org.eclipse.ptp.core.events.IRemoveResourceManagerEvent)
*/
// Update the button here.
public void handleEvent(IRemoveResourceManagerEvent e) {
/*
* Removed resource manager child listener when resource manager is removed.
*/
e.getResourceManager().removeChildListener(resourceManagerListener);
}
}
private final class QueueChildListener implements IQueueChildListener {
/* (non-Javadoc)
* @see org.eclipse.ptp.core.elements.listeners.IQueueChildListener#handleEvent(org.eclipse.ptp.core.elements.events.IChangedJobEvent)
*/
public void handleEvent(IChangedJobEvent e) {
for (IPJob job : e.getJobs()) {
refresh(job);
}
// Refresh the terminate job button
PTPUIPlugin.getDisplay().syncExec(new Runnable() {
public void run() {
terminateAllAction.updateTerminateJobState();
}
});
}
/* (non-Javadoc)
* @see org.eclipse.ptp.core.elements.listeners.IQueueChildListener#handleEvent(org.eclipse.ptp.core.elements.events.INewJobEvent)
*/
public void handleEvent(final INewJobEvent e) {
PTPUIPlugin.getDisplay().syncExec(new Runnable() {
public void run() {
updateColumns(e.getJobs().iterator().next());
}
});
refresh(null);
}
/* (non-Javadoc)
* @see org.eclipse.ptp.core.elements.listeners.IQueueChildListener#handleEvent(org.eclipse.ptp.core.elements.events.IRemoveJobEvent)
*/
public void handleEvent(IRemoveJobEvent e) {
refresh(null);
}
}
private final class RMChildListener implements IResourceManagerChildListener {
/* (non-Javadoc)
* @see org.eclipse.ptp.core.elements.listeners.IResourceManagerMachineListener#handleEvent(org.eclipse.ptp.core.elements.events.IResourceManagerChangedMachineEvent)
*/
public void handleEvent(IChangedMachineEvent e) {
// Don't need to do anything
}
/* (non-Javadoc)
* @see org.eclipse.ptp.core.elements.listeners.IResourceManagerChildListener#handleEvent(org.eclipse.ptp.core.elements.events.IResourceManagerChangedQueueEvent)
*/
public void handleEvent(IChangedQueueEvent e) {
// Can safely ignore
}
/* (non-Javadoc)
* @see org.eclipse.ptp.core.elements.listeners.IResourceManagerMachineListener#handleEvent(org.eclipse.ptp.core.elements.events.IResourceManagerNewMachineEvent)
*/
public void handleEvent(INewMachineEvent e) {
}
/* (non-Javadoc)
* @see org.eclipse.ptp.core.elements.listeners.IResourceManagerChildListener#handleEvent(org.eclipse.ptp.core.elements.events.INewQueueEvent)
*/
public void handleEvent(INewQueueEvent e) {
for (IPQueue queue : e.getQueues()) {
queue.addChildListener(queueChildListener);
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.core.elements.listeners.IResourceManagerMachineListener#handleEvent(org.eclipse.ptp.core.elements.events.IResourceManagerRemoveMachineEvent)
*/
public void handleEvent(IRemoveMachineEvent e) {
}
/* (non-Javadoc)
* @see org.eclipse.ptp.core.elements.listeners.IResourceManagerChildListener#handleEvent(org.eclipse.ptp.core.elements.events.IResourceManagerRemoveQueueEvent)
*/
public void handleEvent(IRemoveQueueEvent e) {
for (IPQueue queue : e.getQueues()) {
queue.removeChildListener(queueChildListener);
}
}
}
private static final String TAG_COLUMN_WIDTHS = "columnWidths"; //$NON-NLS-1$
private TableViewer viewer;
private IMemento memento;
private TerminateJobFromListAction terminateAllAction;
/*
* Model listeners
*/
private final IModelManagerChildListener modelManagerListener = new MMChildListener();
private final IResourceManagerChildListener resourceManagerListener = new RMChildListener();
private final IQueueChildListener queueChildListener = new QueueChildListener();
private final Set<IAttributeDefinition<?,?,?>> colDefs = Collections.synchronizedSet(new HashSet<IAttributeDefinition<?,?,?>>());
public TableViewer getViewer() {
return viewer;
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createPartControl(Composite parent) {
parent.setLayout(new FillLayout());
viewer = new TableViewer(parent, SWT.H_SCROLL
| SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION);
viewer.getTable().setLinesVisible(true);
viewer.getTable().setHeaderVisible(true);
viewer.setUseHashlookup(true);
createColumns(viewer);
viewer.setContentProvider(new IStructuredContentProvider() {
public void dispose() {
}
public Object[] getElements(Object inputElement) {
if (inputElement instanceof IPUniverse) {
IPUniverse universe = ((IPUniverse)inputElement);
List<IPJob> jobList = new ArrayList<IPJob>();
for (IResourceManager rm : universe.getResourceManagers()) {
for (IPQueue queue : rm.getQueues()) {
for (IPJob job : queue.getJobs()) {
jobList.add(job);
}
}
}
return jobList.toArray(new IPJob[jobList.size()]);
}
return new Object[0];
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
});
viewer.setSorter(new ViewerSorter() {
public int compare(Viewer viewer, Object j1, Object j2) {
return ((IPJob)j1).getName().compareTo(((IPJob)j2).getName());
}
});
getSite().setSelectionProvider(viewer);
// Use view toolbar
IToolBarManager toolBarMgr = getViewSite().getActionBars().getToolBarManager();
terminateAllAction = new TerminateJobFromListAction(this);
toolBarMgr.add(new Separator(IPTPUIConstants.IUIACTIONGROUP));
toolBarMgr.appendToGroup(IPTPUIConstants.IUIACTIONGROUP, terminateAllAction);
/*terminateAllAction = new TerminateJobAction(viewer);
toolBarMgr.appendToGroup(IPTPUIConstants.IUIACTIONGROUP, terminateAllAction);*/
IModelManager mm = PTPCorePlugin.getDefault().getModelManager();
viewer.setInput(mm.getUniverse());
/*
* Add us to any existing RM's. I guess it's possible we could
* miss a RM if a new event arrives while we're doing this, but is
* it a problem?
*/
for (IResourceManager rm : mm.getUniverse().getResourceManagers()) {
rm.addChildListener(resourceManagerListener);
for (IPQueue queue : rm.getQueues()) {
queue.addChildListener(queueChildListener);
}
}
mm.addListener(modelManagerListener);
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.ViewPart#init(org.eclipse.ui.IViewSite, org.eclipse.ui.IMemento)
*/
@Override
public void init(IViewSite site, IMemento memento) throws PartInitException {
super.init(site, memento);
this.memento = memento;
}
/**
* @param job
*/
private void refresh(final IPJob job) {
PTPUIPlugin.getDisplay().asyncExec(new Runnable() {
public void run() {
if (!viewer.getTable().isDisposed()) {
if (job != null) {
updateColumns(job);
viewer.refresh(job);
} else {
viewer.refresh();
}
}
}
});
}
/* (non-Javadoc)
* @see org.eclipse.ui.part.WorkbenchPart#setFocus()
*/
@Override
public void setFocus() {
}
/**
* @param tableViewer
* @param fontMetrics
* @param attrDef
*/
private void addColumn(final IAttributeDefinition<?, ?, ?> attrDef) {
TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
column.setLabelProvider(new ColumnLabelProvider(){
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getImage(java.lang.Object)
*/
@Override
public Image getImage(Object element) {
if (element instanceof IPJob) {
if (attrDef.equals(JobAttributes.getStateAttributeDefinition())) {
IPJob job = (IPJob)element;
return ParallelImages.jobImages[job.getState().ordinal()][job.isDebug() ? 1 : 0];
}
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element) {
if (element instanceof IPJob) {
IPJob job = (IPJob) element;
if (!attrDef.equals(JobAttributes.getStateAttributeDefinition())) {
IAttribute<?,?,?> attr = job.getAttribute(attrDef.getId());
if (attr != null) {
return attr.getValueAsString();
}
}
}
return null;
}
});
column.getColumn().setData(attrDef);
column.getColumn().setResizable(true);
column.getColumn().setMoveable(true);
// this will need to sort by the col
//column.getColumn().addSelectionListener(getHeaderListener());
String name = attrDef.getName();
column.getColumn().setText(name);
PixelConverter converter = new PixelConverter(viewer.getControl());
int width = Math.max(converter.convertWidthInCharsToPixels(name.length()+2),
converter.convertWidthInCharsToPixels(5));
column.getColumn().setWidth(width);
colDefs.add(attrDef);
}
/**
* @param tableViewer
* @param job
*/
private void addColumns(TableViewer tableViewer, IPJob job) {
addColumn(JobAttributes.getStateAttributeDefinition());
addColumn(ElementAttributes.getNameAttributeDefinition());
if (job != null) {
for (IAttribute<?,?,?> attr : job.getAttributes()) {
IAttributeDefinition<?,?,?> attrDef = attr.getDefinition();
if (!colDefs.contains(attrDef) && attrDef.getDisplay()) {
addColumn(attrDef);
}
}
}
}
/**
* @param tableViewer
*/
private void createColumns(TableViewer tableViewer) {
addColumns(tableViewer, null);
}
/**
* @param job
*/
private void updateColumns(IPJob job) {
for (IAttribute<?,?,?> attr : job.getAttributes()) {
IAttributeDefinition<?,?,?> attrDef = attr.getDefinition();
if (!colDefs.contains(attrDef) && attrDef.getDisplay()) {
addColumn(attrDef);
}
}
viewer.getTable().layout(true);
}
}