blob: 34b460b1ccbcaec2de17ed40cfa660333a2e65ca [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2004, 2007 Boeing
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Boeing - initial API and implementation
**********************************************************************/
package org.eclipse.osee.ats.ide.editor.tab.workflow.header;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.osee.ats.api.AtsApi;
import org.eclipse.osee.ats.api.IAtsWorkItem;
import org.eclipse.osee.ats.api.data.AtsRelationTypes;
import org.eclipse.osee.ats.api.review.IAtsAbstractReview;
import org.eclipse.osee.ats.api.workflow.IAtsAction;
import org.eclipse.osee.ats.api.workflow.IAtsTask;
import org.eclipse.osee.ats.api.workflow.IAtsTeamWorkflow;
import org.eclipse.osee.ats.ide.actions.OpenInAtsWorldAction;
import org.eclipse.osee.ats.ide.editor.WorkflowEditor;
import org.eclipse.osee.ats.ide.internal.AtsApiService;
import org.eclipse.osee.ats.ide.workflow.AbstractWorkflowArtifact;
import org.eclipse.osee.ats.ide.workflow.task.TaskEditor;
import org.eclipse.osee.ats.ide.workflow.task.TaskEditorSimpleProvider;
import org.eclipse.osee.ats.ide.world.WorldEditor;
import org.eclipse.osee.ats.ide.world.WorldEditorSimpleProvider;
import org.eclipse.osee.framework.core.data.ArtifactToken;
import org.eclipse.osee.framework.core.data.IRelationLink;
import org.eclipse.osee.framework.core.enums.CoreRelationTypes;
import org.eclipse.osee.framework.jdk.core.util.Collections;
import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
import org.eclipse.osee.framework.skynet.core.relation.RelationLink;
import org.eclipse.osee.framework.ui.plugin.util.AWorkbench;
import org.eclipse.osee.framework.ui.skynet.widgets.XModifiedListener;
import org.eclipse.osee.framework.ui.skynet.widgets.XWidget;
import org.eclipse.osee.framework.ui.swt.ALayout;
import org.eclipse.osee.framework.ui.swt.Displays;
import org.eclipse.osee.framework.ui.swt.FontManager;
import org.eclipse.osee.framework.ui.swt.Widgets;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
/**
* @author Donald G. Dunne
*/
public class WfeRelatedComposite extends Composite implements XModifiedListener {
private final WorkflowEditor editor;
private final IAtsWorkItem workItem;
private XRelatedWidget siblingWidget, tasksWidget, reviewsWidget, parentTeamWfWidget, parentActionWfWidget,
supportingWidget, derivedFromWidget, derivedToWidget;
private final AtsApi atsApi;
public WfeRelatedComposite(Composite parent, int style, WorkflowEditor editor) {
super(parent, style);
this.editor = editor;
this.workItem = editor.getWorkItem();
this.atsApi = AtsApiService.get();
}
public void create() {
setLayout(ALayout.getZeroMarginLayout(7, false));
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
setLayoutData(gd);
editor.getToolkit().adapt(this);
createRelated();
refresh();
layout(true, true);
getParent().layout(true, true);
editor.getWorkFlowTab().getManagedForm().reflow(true);
}
private void createRelated() {
Label label = new Label(this, SWT.NONE);
label.setText("Related: ");
label.setBackground(Displays.getSystemColor(SWT.COLOR_WHITE));
label.setFont(FontManager.getCourierNew12Bold());
IAtsAction action = workItem.getParentAction();
if (action != null) {
parentActionWfWidget = new XRelatedWidget("Parent Action", this);
parentActionWfWidget.setToolkit(editor.getToolkit());
parentActionWfWidget.setToolTip("Select to Open");
parentActionWfWidget.setIncludeColon(false);
parentActionWfWidget.createWidgets(this, 2);
}
if (workItem.isTask() || workItem.isReview()) {
IAtsTeamWorkflow teamWf = workItem.getParentTeamWorkflow();
if (teamWf != null) {
parentTeamWfWidget = new XRelatedWidget("Parent Team WF", this);
parentTeamWfWidget.setIncludeColon(false);
parentTeamWfWidget.setToolTip("Select to Open");
parentTeamWfWidget.setToolkit(editor.getToolkit());
parentTeamWfWidget.createWidgets(this, 2);
}
}
if (workItem.isTeamWorkflow()) {
siblingWidget = new XRelatedWidget("Siblings: ", this);
siblingWidget.setToolkit(editor.getToolkit());
siblingWidget.setToolTip("Select to Open");
siblingWidget.createWidgets(this, 2);
tasksWidget = new XRelatedWidget("Tasks: ", this);
tasksWidget.setToolkit(editor.getToolkit());
tasksWidget.setToolTip("Select to Open");
tasksWidget.createWidgets(this, 2);
reviewsWidget = new XRelatedWidget("Reviews: ", this);
reviewsWidget.setToolkit(editor.getToolkit());
reviewsWidget.setToolTip("Select to Open");
reviewsWidget.createWidgets(this, 2);
}
supportingWidget = new XRelatedWidget("Supporting: ", this);
supportingWidget.setToolkit(editor.getToolkit());
supportingWidget.setToolTip("Select to Open");
supportingWidget.createWidgets(this, 2);
Collection<ArtifactToken> derivedFrom =
atsApi.getRelationResolver().getRelated(workItem, AtsRelationTypes.Derive_From);
if (!derivedFrom.isEmpty()) {
derivedFromWidget = new XRelatedWidget("Derived From: ", this);
derivedFromWidget.setToolkit(editor.getToolkit());
derivedFromWidget.setToolTip("Select to Open");
derivedFromWidget.createWidgets(this, 2);
}
Collection<ArtifactToken> derived = atsApi.getRelationResolver().getRelated(workItem, AtsRelationTypes.Derive_To);
if (!derived.isEmpty()) {
derivedToWidget = new XRelatedWidget("Derived: ", this);
derivedToWidget.setToolkit(editor.getToolkit());
derivedToWidget.setToolTip("Select to Open");
derivedToWidget.createWidgets(this, 2);
}
}
@Override
public void widgetModified(XWidget widget) {
if (parentActionWfWidget != null && widget.equals(parentActionWfWidget)) {
IAtsAction action = workItem.getParentAction();
if (action != null) {
(new OpenInAtsWorldAction((AbstractWorkflowArtifact) workItem)).run();
}
}
if (parentTeamWfWidget != null && widget.equals(parentTeamWfWidget)) {
IAtsTeamWorkflow teamWf = workItem.getParentTeamWorkflow();
WorkflowEditor.edit(teamWf);
}
if (siblingWidget != null && widget.equals(siblingWidget)) {
(new OpenInAtsWorldAction((AbstractWorkflowArtifact) workItem)).run();
}
if (tasksWidget != null && widget.equals(tasksWidget)) {
Collection<IAtsTask> tasks = atsApi.getTaskService().getTasks((IAtsTeamWorkflow) workItem);
if (tasks.isEmpty()) {
AWorkbench.popup("No Tasks Found");
return;
}
TaskEditor.open(
new TaskEditorSimpleProvider("Tasks for " + workItem.toStringWithAtsId(), Collections.castAll(tasks)));
}
if (reviewsWidget != null && widget.equals(reviewsWidget)) {
Collection<IAtsAbstractReview> reviews = atsApi.getReviewService().getReviews((IAtsTeamWorkflow) workItem);
if (reviews.isEmpty()) {
AWorkbench.popup("No Reviews Found");
return;
} else {
WorldEditor.open(new WorldEditorSimpleProvider("Reviews for " + workItem.toStringWithAtsId(),
Collections.castAll(reviews)));
}
}
if (supportingWidget != null && widget.equals(supportingWidget)) {
Map<IRelationLink, Artifact> supporting = getSupporting();
if (supporting.isEmpty()) {
AWorkbench.popup("No Supporting Items Found");
return;
} else {
WorldEditor.open(new WorldEditorSimpleProvider("Supporting for " + workItem.toStringWithAtsId(),
Collections.castAll(supporting.values())));
}
}
if (derivedFromWidget != null && widget.equals(derivedFromWidget)) {
Collection<ArtifactToken> derivedFrom =
atsApi.getRelationResolver().getRelated(workItem, AtsRelationTypes.Derive_From);
if (derivedFrom.isEmpty()) {
AWorkbench.popup("No Derived From Found");
return;
} else {
if (derivedFrom.size() == 1) {
WorkflowEditor.edit((IAtsWorkItem) derivedFrom.iterator().next());
} else {
WorldEditor.open(new WorldEditorSimpleProvider("Derived From " + workItem.toStringWithAtsId(),
Collections.castAll(derivedFrom)));
}
}
}
if (derivedToWidget != null && widget.equals(derivedToWidget)) {
Collection<ArtifactToken> derivedTo =
atsApi.getRelationResolver().getRelated(workItem, AtsRelationTypes.Derive_To);
if (derivedTo.isEmpty()) {
AWorkbench.popup("No Derived To Found");
return;
} else {
if (derivedTo.size() == 1) {
WorkflowEditor.edit((IAtsWorkItem) derivedTo.iterator().next());
} else {
WorldEditor.open(new WorldEditorSimpleProvider("Derived To From " + workItem.toStringWithAtsId(),
Collections.castAll(derivedTo)));
}
}
}
}
private Map<IRelationLink, Artifact> getSupporting() {
Set<IRelationLink> supportingLink = new HashSet<>();
supportingLink.addAll(atsApi.getRelationResolver().getRelations(workItem.getStoreObject(),
CoreRelationTypes.SupportingInfo_SupportingInfo));
supportingLink.addAll(atsApi.getRelationResolver().getRelations(workItem.getStoreObject(),
CoreRelationTypes.SupportingInfo_IsSupportedBy));
Map<IRelationLink, Artifact> supporting = new HashMap<>();
for (IRelationLink iLink : supportingLink) {
RelationLink link = (RelationLink) iLink;
if (workItem.getId().intValue() == link.getArtIdA()) {
Artifact otherArt = (Artifact) atsApi.getQueryService().getArtifact(link.getArtifactB());
supporting.put(link, otherArt);
} else {
Artifact otherArt = (Artifact) atsApi.getQueryService().getArtifact(link.getArtifactA());
supporting.put(link, otherArt);
}
}
return supporting;
}
public Collection<XWidget> getXWidgets(ArrayList<XWidget> widgets) {
if (siblingWidget != null) {
widgets.add(siblingWidget);
}
if (tasksWidget != null) {
widgets.add(tasksWidget);
}
if (reviewsWidget != null) {
widgets.add(reviewsWidget);
}
if (parentActionWfWidget != null) {
widgets.add(parentActionWfWidget);
}
if (parentTeamWfWidget != null) {
widgets.add(parentTeamWfWidget);
}
if (siblingWidget != null) {
widgets.add(siblingWidget);
}
return widgets;
}
public void refresh() {
if (Widgets.isAccessible(this)) {
if (workItem.isTeamWorkflow()) {
IAtsTeamWorkflow teamWf = (IAtsTeamWorkflow) workItem;
Collection<IAtsTeamWorkflow> workflows = atsApi.getActionService().getSiblingTeamWorkflows(teamWf);
siblingWidget.setCurrentValue(String.valueOf(workflows.size()));
siblingWidget.refresh();
tasksWidget.setCurrentValue(String.valueOf(atsApi.getTaskService().getTasks(teamWf).size()));
tasksWidget.refresh();
reviewsWidget.setCurrentValue(String.valueOf(atsApi.getReviewService().getReviews(teamWf).size()));
reviewsWidget.refresh();
}
if (supportingWidget != null) {
Map<IRelationLink, Artifact> supporting = getSupporting();
supportingWidget.setCurrentValue(String.valueOf(supporting.size()));
supportingWidget.refresh();
}
if (derivedFromWidget != null) {
Collection<ArtifactToken> derivedFrom =
atsApi.getRelationResolver().getRelated(workItem, AtsRelationTypes.Derive_From);
derivedFromWidget.setCurrentValue(String.valueOf(derivedFrom.size()));
derivedFromWidget.refresh();
}
if (derivedToWidget != null) {
Collection<ArtifactToken> derivedTo =
atsApi.getRelationResolver().getRelated(workItem, AtsRelationTypes.Derive_To);
derivedToWidget.setCurrentValue(String.valueOf(derivedTo.size()));
derivedToWidget.refresh();
}
}
}
}