blob: f826c408470a9ced01d0f8c9133e5fc8c654064d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 The Regents of the University of California.
* This material was produced under U.S. Government contract W-7405-ENG-36
* for Los Alamos National Laboratory, which is operated by the University
* of California for the U.S. Department of Energy. The U.S. Government has
* rights to use, reproduce, and distribute this software. NEITHER THE
* GOVERNMENT NOR THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR
* ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified
* to produce derivative works, such modified software should be clearly marked,
* so as not to confuse it with the version available from LANL.
*
* Additionally, 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
*
* LA-CC 04-115
*******************************************************************************/
package org.eclipse.ptp.ui.views;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
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.EnumeratedAttribute;
import org.eclipse.ptp.core.attributes.IAttribute;
import org.eclipse.ptp.core.attributes.IAttributeDefinition;
import org.eclipse.ptp.core.elements.IPMachine;
import org.eclipse.ptp.core.elements.IPNode;
import org.eclipse.ptp.core.elements.IPProcess;
import org.eclipse.ptp.core.elements.IPUniverse;
import org.eclipse.ptp.core.elements.IResourceManager;
import org.eclipse.ptp.core.elements.attributes.MachineAttributes;
import org.eclipse.ptp.core.elements.events.IChangedMachineEvent;
import org.eclipse.ptp.core.elements.events.IChangedNodeEvent;
import org.eclipse.ptp.core.elements.events.IChangedProcessEvent;
import org.eclipse.ptp.core.elements.events.IChangedQueueEvent;
import org.eclipse.ptp.core.elements.events.INewMachineEvent;
import org.eclipse.ptp.core.elements.events.INewNodeEvent;
import org.eclipse.ptp.core.elements.events.INewProcessEvent;
import org.eclipse.ptp.core.elements.events.INewQueueEvent;
import org.eclipse.ptp.core.elements.events.IRemoveMachineEvent;
import org.eclipse.ptp.core.elements.events.IRemoveNodeEvent;
import org.eclipse.ptp.core.elements.events.IRemoveProcessEvent;
import org.eclipse.ptp.core.elements.events.IRemoveQueueEvent;
import org.eclipse.ptp.core.elements.listeners.IMachineChildListener;
import org.eclipse.ptp.core.elements.listeners.INodeChildListener;
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.ui.IManager;
import org.eclipse.ptp.ui.IPTPUIConstants;
import org.eclipse.ptp.ui.PTPUIPlugin;
import org.eclipse.ptp.ui.UIUtils;
import org.eclipse.ptp.ui.actions.ParallelAction;
import org.eclipse.ptp.ui.managers.AbstractUIManager;
import org.eclipse.ptp.ui.managers.MachineManager;
import org.eclipse.ptp.ui.model.IElement;
import org.eclipse.ptp.ui.model.IElementHandler;
import org.eclipse.ptp.ui.model.IElementSet;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
/**
* @author Greg Watson
*
* Based on original work by Clement Chu
*
*/
public class ParallelMachinesView extends AbstractParallelSetView implements ISelectionProvider {
private final class MachineChildListener implements IMachineChildListener {
/* (non-Javadoc)
* @see org.eclipse.ptp.core.elements.listeners.IMachineNodeListener#handleEvent(org.eclipse.ptp.core.elements.events.IMachineChangedNodeEvent)
*/
public void handleEvent(final IChangedNodeEvent e) {
refresh(true);
}
/* (non-Javadoc)
* @see org.eclipse.ptp.core.elements.listeners.IMachineNodeListener#handleEvent(org.eclipse.ptp.core.elements.events.IMachineNewNodeEvent)
*/
public void handleEvent(final INewNodeEvent e) {
final boolean isCurrent = e.getSource().equals(getCurrentMachine());
UIUtils.safeRunAsyncInUIThread(new SafeRunnable() {
public void run() {
for (IPNode node : e.getNodes()) {
if (isCurrent) {
/*
* Add node child listener so that we get notified when new processes
* are added to the node and can update the node icons.
*/
node.addChildListener(nodeListener);
}
getMachineManager().addNode(node);
}
if (isCurrent) {
updateMachineSet();
repaint(true);
}
}
});
}
/* (non-Javadoc)
* @see org.eclipse.ptp.core.elements.listeners.IMachineNodeListener#handleEvent(org.eclipse.ptp.core.elements.events.IMachineRemoveNodeEvent)
*/
public void handleEvent(final IRemoveNodeEvent e) {
final boolean isCurrent = e.getSource().equals(getCurrentMachine());
UIUtils.safeRunAsyncInUIThread(new SafeRunnable() {
public void run() {
for (IPNode node : e.getNodes()) {
if (isCurrent) {
/*
* Remove node child listener when node is removed (if ever)
*/
node.removeChildListener(nodeListener);
}
getMachineManager().removeNode(node);
}
if (isCurrent) {
updateMachineSet();
repaint(true);
nodeAttrTableViewer.refresh();
processTableViewer.refresh();
}
}
});
}
}
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)
*/
public void handleEvent(IRemoveResourceManagerEvent e) {
/*
* Removed resource manager child listener when resource manager is removed.
*/
e.getResourceManager().removeChildListener(resourceManagerListener);
}
}
private final class NodeChildListener implements INodeChildListener {
/* (non-Javadoc)
* @see org.eclipse.ptp.core.elements.listeners.INodeChildListener#handleEvent(org.eclipse.ptp.core.elements.events.IChangedProcessEvent)
*/
public void handleEvent(final IChangedProcessEvent e) {
/*
* Update views if any node's processes status changes
*/
if (e.getSource() instanceof IPNode) {
if ((IPNode) e.getSource() == getRegisteredNode()) {
UIUtils.safeRunAsyncInUIThread(new SafeRunnable() {
public void run() {
processTableViewer.refresh();
}
});
}
refresh(false);
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.core.elements.listeners.INodeProcessListener#handleEvent(org.eclipse.ptp.core.elements.events.INodeNewProcessEvent)
*/
public void handleEvent(final INewProcessEvent e) {
/*
* Update node icons when a process is added to a node.
*/
if (e.getSource() instanceof IPNode) {
if ((IPNode) e.getSource() == getRegisteredNode()) {
UIUtils.safeRunAsyncInUIThread(new SafeRunnable() {
public void run() {
processTableViewer.refresh();
}
});
refresh(false);
}
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.core.elements.listeners.INodeChildListener#handleEvent(org.eclipse.ptp.core.elements.events.IRemoveProcessEvent)
*/
public void handleEvent(final IRemoveProcessEvent e) {
/*
* Update node icons when a process is removed from a node.
*/
if (e.getSource() instanceof IPNode) {
UIUtils.safeRunAsyncInUIThread(new SafeRunnable() {
public void run() {
IPNode node = (IPNode)e.getSource();
if (node == getRegisteredNode()) {
processTableViewer.refresh();
}
}
});
refresh(false);
}
}
}
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) {
UIUtils.safeRunAsyncInUIThread(new SafeRunnable() {
public void run() {
if (!elementViewComposite.isDisposed()) {
machineTableViewer.refresh(true);
}
}
});
}
/* (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(final INewMachineEvent e) {
for (IPMachine machine : e.getMachines()) {
/*
* Add us as a child listener so we get notified of node events
*/
machine.addChildListener(machineListener);
/*
* Update views when a new machine is added
*/
changeMachineRefresh(machine);
}
}
/* (non-Javadoc)
* @see org.eclipse.ptp.core.elements.listeners.IResourceManagerChildListener#handleEvent(org.eclipse.ptp.core.elements.events.INewQueueEvent)
*/
public void handleEvent(INewQueueEvent e) {
// Can safely ignore
}
/* (non-Javadoc)
* @see org.eclipse.ptp.core.elements.listeners.IResourceManagerMachineListener#handleEvent(org.eclipse.ptp.core.elements.events.IResourceManagerRemoveMachineEvent)
*/
public void handleEvent(final IRemoveMachineEvent e) {
/*
* Update views when a machine is removed.
*/
UIUtils.safeRunAsyncInUIThread(new SafeRunnable() {
public void run() {
for (IPMachine machine : e.getMachines()) {
/*
* Remove child listener
*/
machine.removeChildListener(machineListener);
/*
* remove from machine manager
*/
getMachineManager().removeMachine(machine);
}
changeMachineRefresh(null);
}
});
}
/* (non-Javadoc)
* @see org.eclipse.ptp.core.elements.listeners.IResourceManagerChildListener#handleEvent(org.eclipse.ptp.core.elements.events.IResourceManagerRemoveQueueEvent)
*/
public void handleEvent(IRemoveQueueEvent e) {
// Can safely ignore
}
}
// view flag
public static final String BOTH_VIEW = "0";
public static final String MACHINE_VIEW = "1";
public static final String INFO_VIEW = "2";
private ListenerList listeners = new ListenerList();
private final IModelManagerChildListener modelManagerListener = new MMChildListener();
private final IResourceManagerChildListener resourceManagerListener = new RMChildListener();
private final IMachineChildListener machineListener = new MachineChildListener();
private final INodeChildListener nodeListener = new NodeChildListener();
private ISelection selection = null;
// selected element
protected String cur_selected_element_id = IManager.EMPTY_ID;
protected Menu jobPopupMenu = null;
protected SashForm upperSashForm = null;
protected SashForm sashForm = null;
protected TableViewer machineTableViewer = null;
protected TableViewer processTableViewer = null;
protected TableViewer nodeAttrTableViewer = null;
protected Composite elementViewComposite = null;
protected Composite infoComposite = null;
protected ParallelAction terminateAllAction = null;
protected String current_view = BOTH_VIEW;
public ParallelMachinesView() {
this(PTPUIPlugin.getDefault().getMachineManager());
}
public ParallelMachinesView(IManager manager) {
super(manager);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
*/
public void addSelectionChangedListener(ISelectionChangedListener listener) {
listeners.add(listener);
}
/**
* Change machine
* @param id Machine ID
*/
public void changeMachine(final String id) {
IPMachine machine = ((MachineManager)manager).findMachineById(id);
changeMachineRefresh(machine);
}
public void changeMachineRefresh(final IPMachine machine) {
UIUtils.safeRunAsyncInUIThread(new SafeRunnable() {
public void run() {
if (!elementViewComposite.isDisposed()) {
changeMachine(machine);
machineTableViewer.refresh(true);
machineTableViewer.setSelection(machine == null ? new StructuredSelection() : new StructuredSelection(machine), true);
nodeAttrTableViewer.refresh();
processTableViewer.refresh();
}
}
});
}
/** Change view
* @param view_flag
*/
public void changeView(String view_flag) {
current_view = view_flag;
if (current_view.equals(ParallelMachinesView.MACHINE_VIEW)) {
machineTableViewer.getTable().setVisible(true);
elementViewComposite.setVisible(false);
infoComposite.setVisible(false);
sashForm.setWeights(new int[] { 1, 0 });
} else if (current_view.equals(ParallelMachinesView.INFO_VIEW)) {
machineTableViewer.getTable().setVisible(false);
elementViewComposite.setVisible(true);
infoComposite.setVisible(true);
sashForm.setWeights(new int[] { 0, 1 });
} else {
machineTableViewer.getTable().setVisible(true);
elementViewComposite.setVisible(true);
infoComposite.setVisible(true);
//sashForm.setWeights(new int[] { 3, 1 });
}
}
public void dispose() {
elementViewComposite.dispose();
super.dispose();
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.AbstractParallelElementView#doubleClick(org.eclipse.ptp.ui.model.IElement)
*/
public void doubleClick(IElement element) {
boolean isElementRegistered = element.isRegistered();
/*
* Unregister any registered elements
*/
unregister();
/*
* Register the new element only if we're not trying
* to register the same one.
*/
if (!isElementRegistered) {
/*
* Now register the new element
*/
getCurrentElementHandler().addToRegister(new IElement[] { element });
}
/*
* Refresh the attribute and process panes.
*/
nodeAttrTableViewer.refresh();
processTableViewer.refresh();
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.AbstractParallelElementView#getCurrentID()
*/
public String getCurrentID() {
IPMachine machine = getMachineManager().getCurrentMachine();
if (machine != null) {
return machine.getID();
}
return IManager.EMPTY_ID;
}
/**
* Get selected machine
* @return selected machine
*/
public synchronized IPMachine getCurrentMachine() {
return getMachineManager().getCurrentMachine();
}
/**
* Get current view flag
* @return flag of view
*/
public String getCurrentView() {
return current_view;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.AbstractParallelElementView#getImage(int, int)
*/
public Image getImage(int index1, int index2) {
return ParallelImages.nodeImages[index1][index2];
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.IContentProvider#getRulerIndex(java.lang.Object, int)
*/
public String getRulerIndex(Object obj, int index) {
if (obj instanceof IElement) {
Object nodeObj = convertElementObject((IElement)obj);
if (nodeObj instanceof IPNode) {
return ((IPNode)nodeObj).getNodeNumber();
}
}
return super.getRulerIndex(obj, index);
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.AbstractParallelElementView#getSelection()
*/
public ISelection getSelection() {
if (selection == null) {
return StructuredSelection.EMPTY;
}
return selection;
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.AbstractParallelElementView#getToolTipText(java.lang.Object)
*/
public String[] getToolTipText(Object obj) {
IElementHandler setManager = getCurrentElementHandler();
if (obj == null || !(obj instanceof IPNode) || setManager == null || cur_element_set == null)
return IToolTipProvider.NO_TOOLTIP;
IPNode node = (IPNode)obj;
StringBuffer buffer = new StringBuffer();
buffer.append(node.getName());
IElementSet[] sets = setManager.getSetsWithElement(node.getID());
if (sets.length > 1)
buffer.append("\n Set: ");
for (int i = 1; i < sets.length; i++) {
buffer.append(sets[i].getID());
if (i < sets.length - 1)
buffer.append(",");
}
// buffer.append("\nStatus: " + getMachineManager().getNodeStatusText(node));
return new String[] { buffer.toString() };
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
*/
public void removeSelectionChangedListener(ISelectionChangedListener listener) {
listeners.remove(listener);
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.AbstractParallelElementView#updateView(java.lang.Object)
*/
public void repaint(boolean all) {
if (all) {
if (!machineTableViewer.getTable().isDisposed()) {
machineTableViewer.refresh(true);
}
}
update();
//updateLowerRegions();
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
public void selectionChanged(SelectionChangedEvent event) {
// Selection change could come from either the machineTableViewer of the elementViewComposite
selection = event.getSelection();
setSelection(selection);
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.AbstractParallelElementView#setFocus()
*/
public void setFocus() {
super.setFocus();
IPMachine machine = getCurrentMachine();
if (machine == null) {
changeMachine((String)null);
}
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
*/
public void setSelection(ISelection selection) {
final SelectionChangedEvent e = new SelectionChangedEvent(this, selection);
Object[] array = listeners.getListeners();
for (int i = 0; i < array.length; i++) {
final ISelectionChangedListener l = (ISelectionChangedListener) array[i];
SafeRunnable.run(new SafeRunnable() {
public void run() {
l.selectionChanged(e);
}
});
}
}
/**
* Unregister all registered elements
*/
public void unregister() {
IElementHandler elementHandler = getCurrentElementHandler();
elementHandler.removeFromRegister(elementHandler.getRegistered());
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.AbstractParallelSetView#updateAction()
*/
public void updateAction() {
super.updateAction();
}
/**
* Update machine set
*
*/
public void updateMachineSet() {
IElementHandler setManager = getCurrentElementHandler();
selectSet(setManager == null ? null : setManager.getSetRoot());
}
/**
* @return
*/
private MachineManager getMachineManager() {
return ((MachineManager) manager);
}
private IPNode getRegisteredNode() {
cur_selected_element_id = "";
IElementHandler elementHandler = getCurrentElementHandler();
if (elementHandler == null || cur_element_set == null || elementHandler.totalRegistered() == 0)
return null;
String firstRegisteredElementID = elementHandler.getRegistered()[0].getID();
if (!cur_element_set.contains(firstRegisteredElementID))
return null;
cur_selected_element_id = firstRegisteredElementID;
return getMachineManager().findNode(cur_selected_element_id);
}
/**
* Change machine
* @param machine
*/
protected void changeMachine(final IPMachine machine) {
selectMachine(machine);
update();
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.AbstractParallelElementView#convertElementObject(org.eclipse.ptp.ui.model.IElement)
*/
protected Object convertElementObject(IElement element) {
if (element == null)
return null;
return getMachineManager().findNode(element.getID());
}
/**
* Create lower text region layout
* @param parent
* @return
*/
protected Composite createLowerRegions(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(2, true);
layout.verticalSpacing = 0;
layout.horizontalSpacing = 0;
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
/* inner bottom composite - this one uses a grid layout */
Group nodeGroup = new Group(composite, SWT.BORDER);
nodeGroup.setLayout(new FillLayout());
GridData gdtext = new GridData(GridData.FILL_BOTH);
gdtext.grabExcessVerticalSpace = true;
gdtext.grabExcessHorizontalSpace = true;
gdtext.horizontalAlignment = GridData.FILL;
gdtext.verticalAlignment = GridData.FILL;
nodeGroup.setLayoutData(gdtext);
nodeGroup.setText("Node Attributes");
Group procGroup = new Group(composite, SWT.BORDER);
procGroup.setLayout(new FillLayout());
GridData gdlist = new GridData(GridData.FILL_BOTH);
gdlist.grabExcessVerticalSpace = true;
gdlist.grabExcessHorizontalSpace = true;
gdlist.horizontalAlignment = GridData.FILL;
gdlist.verticalAlignment = GridData.FILL;
procGroup.setLayoutData(gdlist);
procGroup.setText("Process Info");
nodeAttrTableViewer = new TableViewer(nodeGroup, SWT.FULL_SELECTION | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
Table nodeAttrTable = nodeAttrTableViewer.getTable();
TableColumn col = new TableColumn(nodeAttrTable, SWT.LEFT);
col.setText("Attribute");
col.setWidth(80);
col.setResizable(true);
col = new TableColumn(nodeAttrTable, SWT.LEFT);
col.setText("Value");
col.setWidth(200);
col.setResizable(false);
nodeAttrTable.setHeaderVisible(true);
nodeAttrTable.setLinesVisible(true);
nodeAttrTable.addControlListener(new ControlListener() {
public void controlMoved(ControlEvent e) {}
public void controlResized(ControlEvent e) {
Table table = (Table)e.getSource();
int width = table.getClientArea().width;
switch (table.getColumnCount()) {
case 1:
table.getColumn(0).setWidth(width);
break;
case 2:
TableColumn col0 = table.getColumn(0);
TableColumn col1 = table.getColumn(1);
if (col0.getWidth() + col1.getWidth() < width) {
col1.setWidth(width - col0.getWidth());
}
}
}
});
nodeAttrTableViewer.setLabelProvider(new ITableLabelProvider() {
public void addListener(ILabelProviderListener listener) {}
public void dispose() {}
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
public String getColumnText(Object element, int columnIndex) {
if (element instanceof IAttribute) {
IAttribute<?,?,?> attr = (IAttribute<?,?,?>) element;
switch (columnIndex) {
case 0:
return attr.getDefinition().getName();
case 1:
return attr.getValueAsString();
default:
return "unknown " + columnIndex;
}
}
return "";
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {}
});
nodeAttrTableViewer.setContentProvider(new IStructuredContentProvider() {
public void dispose() {}
public Object[] getElements(Object inputElement) {
if (inputElement instanceof AbstractUIManager) {
IPNode node = getRegisteredNode();
if (node != null) {
return node.getDisplayAttributes();
}
}
return new Object[0];
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
});
nodeAttrTableViewer.setSorter(new ViewerSorter() {
public int compare(Viewer viewer, Object a1, Object a2) {
final IAttribute<?,?,?> attr1 = (IAttribute<?,?,?>)a1;
final IAttribute<?,?,?> attr2 = (IAttribute<?,?,?>)a2;
final IAttributeDefinition<?, ?, ?> def1 = attr1.getDefinition();
final IAttributeDefinition<?, ?, ?> def2 = attr2.getDefinition();
return def1.compareTo(def2);
}
});
nodeAttrTableViewer.setInput(manager);
processTableViewer = new TableViewer(procGroup, SWT.FULL_SELECTION | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
Table processTable = processTableViewer.getTable();
new TableColumn(processTable, SWT.LEFT).setWidth(300);
processTable.setLinesVisible(true);
processTable.addControlListener(new ControlListener() {
public void controlMoved(ControlEvent e) {}
public void controlResized(ControlEvent e) {
Table table = (Table)e.getSource();
int width = table.getClientArea().width;
switch (table.getColumnCount()) {
case 1:
table.getColumn(0).setWidth(width);
break;
case 2:
TableColumn col0 = table.getColumn(0);
TableColumn col1 = table.getColumn(1);
if (col0.getWidth() + col1.getWidth() < width) {
col1.setWidth(width - col0.getWidth());
}
}
}
});
processTableViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
IStructuredSelection sel = (IStructuredSelection)event.getSelection();
openProcessViewer((IPProcess)sel.getFirstElement());
}
});
processTableViewer.setLabelProvider(new LabelProvider() {
@SuppressWarnings("unchecked")
public Image getImage(Object element) {
if (element instanceof IPProcess) {
IPProcess process = (IPProcess) element;
return ParallelImages.procImages[process.getState().ordinal()][0];
}
return null;
}
public String getText(Object element) {
if (element instanceof IPProcess) {
IPProcess process = (IPProcess) element;
return process.getJob().getName() + ":" + process.getName();
}
return "";
}
});
processTableViewer.setContentProvider(new IStructuredContentProvider() {
public void dispose() {}
public Object[] getElements(Object inputElement) {
if (inputElement instanceof AbstractUIManager) {
IPNode node = getRegisteredNode();
if (node != null) {
return node.getProcesses();
}
}
return new Object[0];
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
});
processTableViewer.setSorter(new ViewerSorter() {
public int compare(Viewer viewer, Object p1, Object p2) {
IPProcess proc1 = (IPProcess)p1;
IPProcess proc2 = (IPProcess)p2;
String name1 = proc1.getJob().getName() + ":" + proc1.getName();
String name2 = proc2.getJob().getName() + ":" + proc2.getName();
return name1.compareTo(name2);
}
});
processTableViewer.setInput(manager);
return composite;
}
/**
* Create context menu
*/
protected void createMachineContextMenu() {
MenuManager menuMgr = new MenuManager("#machinepopupmenu");
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
manager.add(new Separator(IPTPUIConstants.IUIACTIONGROUP));
manager.add(new Separator(IPTPUIConstants.IUIEMPTYGROUP));
fillMachineContextMenu(manager);
}
});
Menu menu = menuMgr.createContextMenu(machineTableViewer.getTable());
machineTableViewer.getTable().setMenu(menu);
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.AbstractParallelSetView#createToolBarActions(org.eclipse.jface.action.IToolBarManager)
*/
protected void createToolBarActions(IToolBarManager toolBarMgr) {
super.buildInToolBarActions(toolBarMgr);
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.AbstractParallelElementView#createView(org.eclipse.swt.widgets.Composite)
*/
protected void createView(Composite parent) {
parent.setLayout(new FillLayout(SWT.VERTICAL));
parent.setLayoutData(new GridData(GridData.FILL_BOTH));
sashForm = new SashForm(parent, SWT.VERTICAL);
sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
upperSashForm = new SashForm(sashForm, SWT.HORIZONTAL);
upperSashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
machineTableViewer = new TableViewer(upperSashForm, SWT.SINGLE | SWT.BORDER);
machineTableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
machineTableViewer.setLabelProvider(new LabelProvider() {
public Image getImage(Object element) {
if (element instanceof IPMachine) {
IPMachine machine = (IPMachine) element;
EnumeratedAttribute<MachineAttributes.State> attr =
machine.getAttribute(MachineAttributes.getStateAttributeDefinition());
if (attr != null) {
return ParallelImages.machineImages[attr.getValueIndex()];
}
}
return null;
}
public String getText(Object element) {
if (element instanceof IPMachine) {
return ((IPMachine) element).getName();
}
return "";
}
});
machineTableViewer.setContentProvider(new IStructuredContentProvider() {
public void dispose() {}
public Object[] getElements(Object inputElement) {
if (inputElement instanceof AbstractUIManager)
return ((MachineManager) inputElement).getMachines();
return new Object[0];
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
});
machineTableViewer.setSorter(new ViewerSorter() {
public int compare(Viewer viewer, Object j1, Object j2) {
return ((IPMachine)j1).getName().compareTo(((IPMachine)j2).getName());
}
});
machineTableViewer.setInput(manager);
machineTableViewer.getTable().addMouseListener(new MouseAdapter() {
public void mouseDown(MouseEvent e) {
ISelection selection = machineTableViewer.getSelection();
TableItem item = machineTableViewer.getTable().getItem(new Point(e.x, e.y));
if (item == null && !selection.isEmpty()) {
machineTableViewer.getTable().deselectAll();
changeMachineRefresh((IPMachine) null);
}
else if (item != null) {
IPMachine machine = (IPMachine)item.getData();
if (machine == null) {
changeMachineRefresh((IPMachine) null);
}
else if (selection.isEmpty()) {
changeMachineRefresh(machine);
}
else {
String cur_id = getCurrentID();
if (cur_id == null || !cur_id.equals(machine.getID())) {
changeMachineRefresh(machine);
}
}
}
}
});
createMachineContextMenu();
elementViewComposite = createElementView(upperSashForm);
// ----------------------------------------------------------------------
// Enable property sheet updates when table items are selected.
// Note for this to work each item in the table must either implement
// IPropertySource, or support IPropertySource.class as an adapter type
// in its AdapterFactory.
// ----------------------------------------------------------------------
machineTableViewer.addSelectionChangedListener(this);
getSite().setSelectionProvider(this);
infoComposite = createLowerRegions(sashForm);
changeView(current_view);
/*
* Wait until the view has been created before registering for events
*/
IModelManager mm = PTPCorePlugin.getDefault().getModelManager();
synchronized (mm) {
/*
* 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);
}
mm.addListener(modelManagerListener);
}
}
/**
* Fill the context menu
* @param menuManager
*/
protected void fillMachineContextMenu(IMenuManager menuManager) {
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.AbstractParallelElementView#initialElement()
*/
protected void initialElement() {
IPUniverse universe = PTPCorePlugin.getDefault().getUniverse();
/*
* Add us as a child listener to any existing machines
*/
for (IResourceManager rm : universe.getResourceManagers()) {
for (IPMachine machine : rm.getMachines()) {
machine.addChildListener(machineListener);
}
}
/*
* Select initial machine
*/
changeMachineRefresh((IPMachine) manager.initial(universe));
}
/* (non-Javadoc)
* @see org.eclipse.ptp.ui.views.AbstractParallelElementView#initialView()
*/
protected void initialView() {
initialElement();
update();
}
/**
* Change machine
* @param machine
*/
protected void selectMachine(IPMachine machine) {
IPMachine old = getMachineManager().getCurrentMachine();
if (old != null) {
for (IPNode node : old.getNodes()) {
node.removeChildListener(nodeListener);
}
}
getMachineManager().setMachine(machine);
if (machine != null) {
for (IPNode node : machine.getNodes()) {
node.addChildListener(nodeListener);
}
}
updateMachineSet();
}
}