blob: 366aa836149c49ab446d0f1225b2e3d4aa752a0a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2007 Boeing.
* 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:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.osee.ote.ui.define.views;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import org.eclipse.jface.action.Action;
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.viewers.StructuredViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.osee.framework.help.ui.OseeHelpContext;
import org.eclipse.osee.framework.logging.OseeLog;
import org.eclipse.osee.framework.ui.plugin.PluginUiImage;
import org.eclipse.osee.framework.ui.plugin.util.HelpUtil;
import org.eclipse.osee.framework.ui.skynet.widgets.GenericViewPart;
import org.eclipse.osee.framework.ui.swt.Displays;
import org.eclipse.osee.framework.ui.swt.ImageManager;
import org.eclipse.osee.ote.ui.define.OteDefineImage;
import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
import org.eclipse.osee.ote.ui.define.viewers.IDataChangedListener;
import org.eclipse.osee.ote.ui.define.viewers.TestRunXViewer;
import org.eclipse.osee.ote.ui.define.viewers.data.ArtifactItem;
import org.eclipse.osee.ote.ui.define.viewers.data.BranchItem;
import org.eclipse.osee.ote.ui.define.viewers.data.ScriptItem;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.IHandlerService;
/**
* @author Roberto E. Escobar
*/
public class TestRunView extends GenericViewPart implements IDataChangedListener {
public static final String VIEW_ID = TestRunView.class.getName();
private static final String BEGIN_MESSAGE =
"To begin, drag and drop a test run artifact from artifact explorer or from an artifact search result window. Alternatively, you can drag and drop a test outfile onto this view.";
private Action expandAction, collapseAction, refreshAction;
private static TestRunXViewer viewer = null;
@SuppressWarnings("unused")
private IHandlerService handlerService;
private ShowOnlyLatestRuns latestRunFilter;
private boolean isFilterOn;
// private static final String FLAT_KEY = "flat";
@Override
public void createPartControl(Composite parent) {
parent.setLayout(new GridLayout());
PlatformUI.getWorkbench().getService(IHandlerService.class);
handlerService = (IHandlerService) getSite().getService(IHandlerService.class);
viewer = new TestRunXViewer(parent);
Tree tree = viewer.getTree();
GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
gridData.minimumHeight = 350;
tree.setLayoutData(gridData);
tree.setHeaderVisible(true);
tree.setLinesVisible(true);
tree.setFont(parent.getFont());
parent.layout();
createActions();
createMenus();
createToolbar();
latestRunFilter = new ShowOnlyLatestRuns();
isFilterOn = false;
viewer.registerListener(this);
viewer.getTree().addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent event) {
if (event.stateMask == SWT.CTRL && (event.keyCode == 'A' || event.keyCode == 'a')) {
Object object = event.getSource();
if (object instanceof Tree) {
Tree tree = (Tree) object;
tree.selectAll();
}
}
}
});
onDataChanged();
HelpUtil.setHelp(parent, OseeHelpContext.TEST_RUN_VIEW);
HelpUtil.setHelp(viewer.getTree(), OseeHelpContext.TEST_RUN_VIEW);
setFocusWidget(viewer.getControl());
}
protected void createActions() {
expandAction = new Action("Expand All") {
@Override
public void run() {
viewer.getTree().setRedraw(false);
viewer.expandAll();
viewer.getTree().setRedraw(true);
}
};
expandAction.setImageDescriptor(ImageManager.getImageDescriptor(OteDefineImage.EXPAND_STATE));
expandAction.setToolTipText("Expand All");
collapseAction = new Action("Collapse All") {
@Override
public void run() {
viewer.getTree().setRedraw(false);
viewer.collapseAll();
viewer.getTree().setRedraw(true);
}
};
collapseAction.setImageDescriptor(ImageManager.getImageDescriptor(OteDefineImage.COLLAPSE_STATE));
collapseAction.setToolTipText("Collapse All");
refreshAction = new Action("Refresh") {
@Override
public void run() {
Displays.ensureInDisplayThread(new Runnable() {
@Override
public void run() {
viewer.refresh();
};
});
}
};
refreshAction.setToolTipText("Refresh Table");
refreshAction.setImageDescriptor(ImageManager.getImageDescriptor(PluginUiImage.REFRESH));
}
private void createMenus() {
MenuManager menuManager = new MenuManager();
getSite().registerContextMenu(VIEW_ID, menuManager, viewer);
menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
menuManager.setParent(getViewSite().getActionBars().getMenuManager());
fillMenu(menuManager);
getSite().setSelectionProvider(viewer);
}
private void fillMenu(IMenuManager menuManager) {
menuManager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
private void createToolbar() {
IToolBarManager toolbarManager = getViewSite().getActionBars().getToolBarManager();
toolbarManager.add(refreshAction);
toolbarManager.add(expandAction);
toolbarManager.add(collapseAction);
}
public void setDescription(final String message) {
Displays.ensureInDisplayThread(new Runnable() {
@Override
public void run() {
setContentDescription(message);
}
});
}
@Override
public void onDataChanged() {
String message = BEGIN_MESSAGE;
Object object = viewer.getInput();
if (object != null && object instanceof Collection<?>) {
if (!((Collection<?>) object).isEmpty()) {
message = "";
}
}
setDescription(message);
}
public static StructuredViewer getViewer() {
return viewer;
}
public void presentGroupedByBranch() {
BranchItem.setGroupModeEnabled(true);
viewer.refresh();
}
public void presentGroupedByScript() {
BranchItem.setGroupModeEnabled(false);
viewer.refresh();
}
public void presentWithShortNames() {
ScriptItem.setFullDescriptionModeEnabled(false);
ArtifactItem.setFullDescriptionModeEnabled(false);
viewer.refresh();
}
public void presentWithLongNames() {
ScriptItem.setFullDescriptionModeEnabled(true);
ArtifactItem.setFullDescriptionModeEnabled(true);
viewer.refresh();
}
public void toggleFilter() {
latestRunFilter.clear();
if (isFilterOn != true) {
isFilterOn = true;
viewer.addFilter(latestRunFilter);
} else {
isFilterOn = false;
viewer.removeFilter(latestRunFilter);
}
viewer.refresh();
}
private final class ShowOnlyLatestRuns extends ViewerFilter {
private final Map<String, ArtifactItem> latestMap = new HashMap<>();
@Override
public Object[] filter(Viewer viewer, Object parent, Object[] elements) {
return super.filter(viewer, parent, elements);
}
@Override
public boolean select(Viewer viewer, Object parentElement, Object element) {
boolean toReturn = false;
if (element instanceof ArtifactItem) {
ArtifactItem item1 = (ArtifactItem) element;
String name = item1.getOperator().getDescriptiveName();
ArtifactItem item2 = latestMap.get(name);
if (item2 == null) {
latestMap.put(name, item1);
toReturn = true;
} else {
try {
Date date1 = item1.getOperator().getEndDate();
Date date2 = item2.getOperator().getEndDate();
if (date1.after(date2) || date1.equals(date2)) {
latestMap.put(name, item1);
toReturn = true;
}
} catch (Exception ex) {
OseeLog.log(OteUiDefinePlugin.class, Level.WARNING, "Error comparing run dates.", ex);
}
}
} else {
toReturn = true;
}
return toReturn;
}
public void clear() {
latestMap.clear();
}
}
}