blob: 4fba947d92570e4cb2073411f5cec868be7da290 [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.viewers;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.nebula.widgets.xviewer.XViewer;
import org.eclipse.nebula.widgets.xviewer.core.model.XViewerColumn;
import org.eclipse.osee.framework.core.enums.CoreArtifactTypes;
import org.eclipse.osee.framework.core.exception.ArtifactDoesNotExist;
import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
import org.eclipse.osee.framework.logging.OseeLevel;
import org.eclipse.osee.framework.logging.OseeLog;
import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
import org.eclipse.osee.framework.skynet.core.artifact.ArtifactTypeManager;
import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactPromptChange;
import org.eclipse.osee.framework.ui.swt.ImageManager;
import org.eclipse.osee.ote.define.AUTOGEN.OteAttributeTypes;
import org.eclipse.osee.ote.ui.define.OteDefineImage;
import org.eclipse.osee.ote.ui.define.OteUiDefinePlugin;
import org.eclipse.osee.ote.ui.define.jobs.CommitTestRunJob;
import org.eclipse.osee.ote.ui.define.utilities.CommitConfiguration;
import org.eclipse.osee.ote.ui.define.viewers.actions.AbstractActionHandler;
import org.eclipse.osee.ote.ui.define.viewers.actions.LaunchReportsAction;
import org.eclipse.osee.ote.ui.define.viewers.actions.OpenAssociatedOutfile;
import org.eclipse.osee.ote.ui.define.viewers.actions.OpenAssociatedScript;
import org.eclipse.osee.ote.ui.define.viewers.actions.OpenInArtifactEditor;
import org.eclipse.osee.ote.ui.define.viewers.data.ArtifactItem;
import org.eclipse.osee.ote.ui.define.viewers.data.DataItemContentProvider;
import org.eclipse.osee.ote.ui.define.viewers.data.DataItemLabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
/**
* @author Roberto E. Escobar
*/
public class TestRunXViewer extends XViewer {
private static final ImageDescriptor COMMIT_IMAGE = ImageManager.getImageDescriptor(OteDefineImage.COMMIT);
private static final ImageDescriptor REMOVE_IMAGE = ImageManager.getImageDescriptor(OteDefineImage.REMOVE);
private static final ImageDescriptor REMOVE_ALL_IMAGE = ImageManager.getImageDescriptor(OteDefineImage.REMOVE_ALL);
private XViewerDataManager dataManager;
private final List<AbstractActionHandler> actionList = new ArrayList<>();
private Action editDisposition;
public TestRunXViewer(Composite parent) {
super(parent, //SWT.VIRTUAL |
SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI, new TestRunXViewerFactory());
setSorter(null);
setContentProvider(new DataItemContentProvider());
setLabelProvider(new DataItemLabelProvider(this));
setUseHashlookup(true);
setupActions();
getMenuManager().addMenuListener(new IMenuListener() {
@Override
public void menuAboutToShow(IMenuManager manager) {
customActions();
}
});
}
private void customActions() {
MenuManager manager = getMenuManager();
manager.insertBefore(XViewer.MENU_GROUP_PRE, editDisposition);
manager.insertBefore(XViewer.MENU_GROUP_PRE, new Separator());
manager.add(new Separator());
for (int index = 0; index < actionList.size(); index++) {
Action action = actionList.get(index);
if (index + 1 >= actionList.size() || index + 2 >= actionList.size() || index == 3) {
manager.add(new Separator());
}
manager.add(action);
}
}
@Override
protected void createSupportWidgets(Composite parent) {
super.createSupportWidgets(parent);
this.dataManager = new XViewerDataManager(this);
new DragDropHandler(dataManager);
}
public void registerListener(IDataChangedListener listener) {
dataManager.registerListener(listener);
}
public void deRegisterListener(IDataChangedListener listener) {
dataManager.deRegisterListener(listener);
}
private void setupActions() {
try {
editDisposition = new Action("Edit Disposition", IAction.AS_PUSH_BUTTON) {
@Override
public void run() {
try {
handleChangeDisposition();
} catch (Exception ex) {
OseeLog.log(OteUiDefinePlugin.class, OseeLevel.SEVERE_POPUP, ex);
}
}
};
actionList.add(new OpenInArtifactEditor(this, "Open as Artifact"));
actionList.add(new OpenAssociatedOutfile(this, "Open Outfile"));
actionList.add(new OpenAssociatedScript(this, "Open Script"));
actionList.add(new RemoveAction("Remove", REMOVE_IMAGE));
actionList.add(new RemoveAllAction("Remove All", REMOVE_ALL_IMAGE));
actionList.add(new LaunchReportsAction(this, "Reports..."));
actionList.add(new CommitAction("Commit Test Runs...", COMMIT_IMAGE));
} catch (Exception ex) {
OseeLog.log(OteUiDefinePlugin.class, OseeLevel.SEVERE_POPUP, ex);
}
}
@Override
public void refresh() {
super.refresh();
try {
if (getTree() == null || getTree().isDisposed() || actionList == null) {
return;
}
for (AbstractActionHandler action : actionList) {
action.updateState();
}
} catch (Exception ex) {
OseeLog.log(OteUiDefinePlugin.class, OseeLevel.SEVERE_POPUP, ex);
}
}
private final class CommitAction extends AbstractActionHandler {
public CommitAction(String text, ImageDescriptor image) throws Exception {
super(TestRunXViewer.this, text, image);
}
@Override
public void run() {
Artifact[] preSelected = dataManager.getSelectedForCommit();
Artifact[] unSelectable = dataManager.getUnCommitable();
Job job = new CommitTestRunJob(getAllItemsList(), preSelected, unSelectable, isOverrideAllowed());
job.addJobChangeListener(new JobChangeAdapter() {
@Override
public void done(IJobChangeEvent event) {
Artifact[] committed = ((CommitTestRunJob) event.getJob()).getCommitted();
dataManager.removeFromCommitable(Arrays.asList(committed));
}
});
job.schedule();
}
@Override
public void updateState() {
boolean haveUnCommitableItems = dataManager.getUnCommitable().length > 0;
boolean haveCommitableItems = dataManager.getAllCommitable().length > 0;
this.setEnabled(haveCommitableItems || CommitConfiguration.isCommitOverrideAllowed() && haveUnCommitableItems);
}
private boolean isOverrideAllowed() {
return CommitConfiguration.isCommitOverrideAllowed();
}
private Artifact[] getAllItemsList() {
List<Artifact> allItems = new ArrayList<>();
allItems.addAll(Arrays.asList(dataManager.getAllCommitable()));
if (isOverrideAllowed() != false) {
allItems.addAll(Arrays.asList(dataManager.getUnCommitable()));
}
return allItems.toArray(new Artifact[allItems.size()]);
}
}
private final class RemoveAllAction extends AbstractActionHandler {
public RemoveAllAction(String text, ImageDescriptor image) throws Exception {
super(TestRunXViewer.this, text, image);
}
@Override
public void run() {
dataManager.removeAll();
}
@Override
public void updateState() {
this.setEnabled(dataManager.isEmpty() != true);
}
}
private final class RemoveAction extends AbstractActionHandler {
public RemoveAction(String text, ImageDescriptor image) throws Exception {
super(TestRunXViewer.this, text, image);
}
@Override
public void run() {
dataManager.removeSelected();
}
@Override
public void updateState() {
this.setEnabled(getSelection().isEmpty() != true);
}
}
public boolean handleChangeDisposition() throws OseeCoreException {
if (!getSelectedArtifacts().isEmpty()) {
return setDisposition(getSelectedArtifacts());
}
return false;
}
@Override
public boolean handleAltLeftClick(TreeColumn treeColumn, TreeItem treeItem) {
XViewerColumn xCol = (XViewerColumn) treeColumn.getData();
Object holder = treeItem.getData();
boolean returnValue = false;
if (holder instanceof ArtifactItem) {
if (xCol.equals(TestRunXViewerFactory.DISPOSITION)) {
ArrayList<Artifact> list = new ArrayList<>();
list.add(((ArtifactItem) holder).getData());
try {
returnValue = setDisposition(list);
} catch (Exception ex) {
OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
}
}
}
return returnValue;
}
private boolean setDisposition(ArrayList<Artifact> selectedArtifacts) throws OseeCoreException {
boolean returnValue = false;
ArrayList<Artifact> dispositionArtifacts = new ArrayList<>();
for (Artifact artifact : selectedArtifacts) {
if (artifact.isOfType(CoreArtifactTypes.TestRun)) {
String name = artifact.getName();
if (!name.equals(Artifact.UNNAMED)) {
Artifact dispoArtifact = null;
try {
dispoArtifact =
ArtifactQuery.getArtifactFromTypeAndName(CoreArtifactTypes.TestRunDisposition, name,
artifact.getBranch());
} catch (ArtifactDoesNotExist ex) {
dispoArtifact =
ArtifactTypeManager.addArtifact(CoreArtifactTypes.TestRunDisposition, artifact.getBranch());
dispoArtifact.setName(name);
}
if (dispoArtifact != null) {
dispositionArtifacts.add(dispoArtifact);
}
}
}
}
try {
returnValue =
ArtifactPromptChange.promptChangeAttribute(OteAttributeTypes.TestDisposition, dispositionArtifacts, true,
false);
refresh();
} catch (Exception ex) {
OseeLog.log(OteUiDefinePlugin.class, Level.SEVERE, ex);
}
return returnValue;
}
public ArrayList<Artifact> getSelectedArtifacts() {
ArrayList<Artifact> arts = new ArrayList<>();
TreeItem items[] = getTree().getSelection();
if (items.length > 0) {
for (TreeItem item : items) {
if (item.getData() instanceof ArtifactItem) {
arts.add(((ArtifactItem) item.getData()).getData());
}
}
}
return arts;
}
}