blob: 38271c294bb2f451a1fcf594e55f6d206aca08cc [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2019 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.List;
import java.util.logging.Level;
import org.eclipse.osee.ats.api.IAtsWorkItem;
import org.eclipse.osee.ats.api.data.AtsAttributeTypes;
import org.eclipse.osee.ats.api.workdef.IAtsWorkDefinition;
import org.eclipse.osee.ats.api.workflow.IAtsTeamWorkflow;
import org.eclipse.osee.ats.api.workflow.note.NoteItem;
import org.eclipse.osee.ats.ide.editor.WorkflowEditor;
import org.eclipse.osee.ats.ide.editor.tab.workflow.section.DuplicateWidgetUpdateResolver;
import org.eclipse.osee.ats.ide.internal.Activator;
import org.eclipse.osee.ats.ide.internal.AtsApiService;
import org.eclipse.osee.ats.ide.workdef.StateXWidgetPage;
import org.eclipse.osee.ats.ide.workflow.AbstractWorkflowArtifact;
import org.eclipse.osee.ats.ide.workflow.WorkflowManager;
import org.eclipse.osee.ats.ide.workflow.hooks.IAtsWorkItemHookIde;
import org.eclipse.osee.ats.ide.workflow.review.AbstractReviewArtifact;
import org.eclipse.osee.ats.ide.workflow.teamwf.TeamWorkFlowArtifact;
import org.eclipse.osee.framework.core.util.Result;
import org.eclipse.osee.framework.jdk.core.result.XResultData;
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.ui.plugin.util.AWorkbench;
import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
import org.eclipse.osee.framework.ui.skynet.artifact.annotation.AnnotationComposite;
import org.eclipse.osee.framework.ui.skynet.artifact.annotation.AttributeAnnotationManager;
import org.eclipse.osee.framework.ui.skynet.util.FormsUtil;
import org.eclipse.osee.framework.ui.skynet.widgets.ArtifactStoredWidget;
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.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.IManagedForm;
/**
* @author Donald G. Dunne
*/
public class WfeHeaderComposite extends Composite {
private final WorkflowEditor editor;
private final IAtsWorkItem workItem;
private WfeRelatedComposite relatedComposite;
private WfeActionableItemHeader actionableItemHeader;
private WfeMetricsHeader metricsHeader;
private final StateXWidgetPage currentStateXWidgetPage;
private static Color LIGHT_GREY;
private final IManagedForm managedForm;
private WfeCustomHeader customHeader;
private WfeTitleHeader titleHeader;
private WfeTransitionHeader transitionHeader;
private WfeStateCreatedOrigHeader stateHeader;
private WfeTeamAndIdsHeader teamHeader;
private WfeTargetedVersionHeader versionHeader;
private WfeAssigneesHeader assigneeHeader;
private WfeWorkPackage workPackageHeader;
private WfeActionableItemReviewHeader aiReviewHeader;
private WfeBlockedWorkflowHeader blockedWfHeader;
private WfeHoldWorkflowHeader holdWfHeader;
private WfeAttachmentsComposite attachmentsComposite;
public WfeTransitionHeader getWfeTransitionHeader() {
return transitionHeader;
}
public WfeHeaderComposite(Composite parent, int style, WorkflowEditor editor, StateXWidgetPage currentStateXWidgetPage, IManagedForm managedForm) {
super(parent, style);
this.editor = editor;
this.currentStateXWidgetPage = currentStateXWidgetPage;
this.managedForm = managedForm;
this.workItem = editor.getWorkItem();
}
public void refresh() {
if (titleHeader != null) {
titleHeader.refresh();
}
if (stateHeader != null) {
stateHeader.refresh();
}
if (teamHeader != null) {
teamHeader.refresh();
}
if (versionHeader != null) {
versionHeader.refresh();
}
if (assigneeHeader != null) {
assigneeHeader.refresh();
}
if (actionableItemHeader != null) {
actionableItemHeader.refresh();
}
if (metricsHeader != null) {
metricsHeader.refresh();
}
if (workPackageHeader != null) {
workPackageHeader.refresh();
}
if (relatedComposite != null) {
relatedComposite.refresh();
}
if (attachmentsComposite != null) {
attachmentsComposite.refresh();
}
if (transitionHeader != null) {
transitionHeader.refresh();
}
if (blockedWfHeader != null) {
blockedWfHeader.refresh();
}
if (holdWfHeader != null) {
holdWfHeader.refresh();
}
if (aiReviewHeader != null) {
aiReviewHeader.refresh();
}
if (customHeader != null) {
customHeader.refresh();
}
}
public void create() {
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.widthHint = 100;
this.setLayoutData(gd);
this.setLayout(ALayout.getZeroMarginLayout(1, false));
setBackground(Displays.getSystemColor(SWT.COLOR_WHITE));
try {
titleHeader = new WfeTitleHeader(this, SWT.NONE, workItem, editor, xModListener);
stateHeader = new WfeStateCreatedOrigHeader(this, SWT.NONE, workItem, editor);
teamHeader = new WfeTeamAndIdsHeader(this, SWT.NONE, workItem, editor);
createTargetVersionAndAssigneeHeader(this, currentStateXWidgetPage, editor.getToolkit());
createLatestHeader(this, editor.getToolkit());
if (workItem.isTeamWorkflow()) {
actionableItemHeader = new WfeActionableItemHeader(this, editor.getToolkit(), workItem, editor);
}
if (workItem.getWorkDefinition().getHeaderDef().isShowMetricsHeader()) {
metricsHeader = new WfeMetricsHeader(this, editor.getToolkit(), workItem, editor, managedForm);
}
int workPackageNumColumns = 2;
if (workItem.getWorkDefinition().getHeaderDef().isShowWorkPackageHeader()) {
createWorkPacakageHeader(this, editor.getToolkit(), workPackageNumColumns, editor);
}
int numColumns = 4;
createWorkDefHeader(this, editor.getToolkit(), workItem, numColumns);
createBlockedHoldHeader(this, editor.getToolkit());
customHeader = createCustomHeader(this, editor.getToolkit(), workItem, editor, managedForm);
createSMANotesHeader(this, editor.getToolkit(), numColumns);
createStateNotesHeader(this, workItem, editor.getToolkit(), numColumns, null);
createAnnotationsHeader(this, editor.getToolkit());
relatedComposite = new WfeRelatedComposite(this, SWT.NONE, editor);
relatedComposite.create();
attachmentsComposite = new WfeAttachmentsComposite(this, SWT.NONE, editor);
attachmentsComposite.create();
if (WfeActionableItemReviewHeader.isApplicable(workItem)) {
aiReviewHeader =
new WfeActionableItemReviewHeader(this, editor.getToolkit(), (AbstractReviewArtifact) workItem, editor);
}
boolean isEditable =
!((Artifact) workItem.getStoreObject()).isReadOnly() && ((AbstractWorkflowArtifact) workItem.getStoreObject()).isAccessControlWrite();
transitionHeader = new WfeTransitionHeader(this, editor, isEditable);
} catch (Exception ex) {
OseeLog.log(Activator.class, Level.SEVERE, ex);
}
}
private void createBlockedHoldHeader(WfeHeaderComposite parent, XFormToolkit toolkit) {
Composite comp = new Composite(parent, SWT.NONE);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
comp.setLayoutData(gridData);
int numColumns = 4;
comp.setLayout(ALayout.getZeroMarginLayout(numColumns, false));
toolkit.adapt(comp);
blockedWfHeader = new WfeBlockedWorkflowHeader(comp, SWT.NONE, workItem, editor);
holdWfHeader = new WfeHoldWorkflowHeader(comp, SWT.NONE, workItem, editor);
}
private WfeCustomHeader createCustomHeader(Composite comp, XFormToolkit toolkit, IAtsWorkItem workItem, WorkflowEditor editor, IManagedForm managedForm) {
return new WfeCustomHeader(comp, SWT.NONE, managedForm, workItem, editor);
}
public static void createWorkDefHeader(Composite comp, XFormToolkit toolkit, IAtsWorkItem workItem, int horizontalSpan) {
Composite headerComp = new Composite(comp, SWT.NONE);
GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
gridData.horizontalSpan = horizontalSpan;
headerComp.setLayoutData(gridData);
int numColumns = 5;
headerComp.setLayout(ALayout.getZeroMarginLayout(numColumns, false));
toolkit.adapt(headerComp);
IAtsWorkDefinition workDef = workItem.getWorkDefinition();
Label label = FormsUtil.createLabelValue(toolkit, headerComp, "Work Definition: ", workDef.getName());
label.addListener(SWT.MouseDoubleClick, new Listener() {
@Override
public void handleEvent(Event event) {
IWorkbenchPage page = AWorkbench.getActivePage();
try {
page.showView("org.eclipse.ui.views.ContentOutline", null, IWorkbenchPage.VIEW_ACTIVATE);
} catch (PartInitException ex) {
OseeLog.log(Activator.class, OseeLevel.SEVERE_POPUP, ex);
}
}
});
Label dragDropLabel = new Label(headerComp, SWT.NONE);
dragDropLabel.setText("Drag/Drop Related Here: ");
FormsUtil.setLabelFonts(dragDropLabel, FontManager.getDefaultLabelFont());
dragDropLabel.setLayoutData(new GridData());
toolkit.adapt(dragDropLabel, true, true);
Label dragDropBox = new Label(headerComp, SWT.BORDER);
new WfeDragAndDrop(dragDropBox, (AbstractWorkflowArtifact) workItem.getStoreObject(), WorkflowEditor.EDITOR_ID);
dragDropBox.setText(" ");
dragDropBox.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
toolkit.adapt(dragDropBox, true, true);
dragDropBox.setBackground(getLightGreyColor());
}
public void createSMANotesHeader(Composite comp, XFormToolkit toolkit, int horizontalSpan) {
// Display Workflow Note
String note = AtsApiService.get().getAttributeResolver().getSoleAttributeValue(workItem,
AtsAttributeTypes.WorkflowNotes, "");
if (!note.equals("")) {
FormsUtil.createLabelOrHyperlink(comp, toolkit, horizontalSpan, "Note: " + note);
}
}
public static void createStateNotesHeader(Composite comp, IAtsWorkItem workItem, XFormToolkit toolkit, int horizontalSpan, String forStateName) {
// Display global Notes
for (NoteItem noteItem : AtsApiService.get().getWorkItemService().getNotes(workItem).getNoteItems()) {
if (forStateName == null || noteItem.getState().equals(forStateName)) {
FormsUtil.createLabelOrHyperlink(comp, toolkit, horizontalSpan, noteItem.toString());
}
}
}
public void createWorkPacakageHeader(Composite parent, XFormToolkit toolkit, int horizontalSpan, WorkflowEditor editor) {
boolean show = workItem.isTeamWorkflow() && ((IAtsTeamWorkflow) workItem).getTeamDefinition().hasWorkPackages();
if (show) {
Composite comp = toolkit.createContainer(parent, 6);
comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
comp.setLayout(ALayout.getZeroMarginLayout(6, false));
workPackageHeader = new WfeWorkPackage(comp, SWT.NONE, (IAtsTeamWorkflow) workItem, editor);
}
}
private void createLatestHeader(Composite comp, XFormToolkit toolkit) {
if (AtsApiService.get().getStoreService().isHistorical(workItem)) {
Label label = toolkit.createLabel(comp,
"This is a historical version of this " + workItem.getArtifactTypeName() + " and can not be edited; Select \"Open Latest\" to view/edit latest version.");
label.setForeground(Displays.getSystemColor(SWT.COLOR_RED));
}
}
private void createAnnotationsHeader(Composite comp, XFormToolkit toolkit) {
try {
if (AttributeAnnotationManager.getAnnotations((Artifact) workItem.getStoreObject()).size() > 0) {
new AnnotationComposite(toolkit, comp, SWT.None, (Artifact) workItem.getStoreObject());
}
} catch (OseeCoreException ex) {
OseeLog.log(Activator.class, Level.SEVERE, "Exception resolving annotations", ex);
}
}
private void createTargetVersionAndAssigneeHeader(Composite parent, StateXWidgetPage page, XFormToolkit toolkit) {
boolean isShowTargetedVersion = isShowTargetedVersion();
boolean isCurrentNonCompleteCanceledState =
page.isCurrentNonCompleteCancelledState((AbstractWorkflowArtifact) workItem.getStoreObject());
if (!isShowTargetedVersion && !isCurrentNonCompleteCanceledState) {
return;
}
Composite comp = toolkit.createContainer(parent, 6);
comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
comp.setLayout(ALayout.getZeroMarginLayout(6, false));
// Targeted Version
if (isShowTargetedVersion) {
versionHeader = new WfeTargetedVersionHeader(comp, SWT.NONE, (IAtsTeamWorkflow) workItem, editor);
toolkit.createLabel(comp, " ");
}
// Current Assignees
if (isCurrentNonCompleteCanceledState) {
boolean editable = WorkflowManager.isAssigneeEditable((AbstractWorkflowArtifact) workItem.getStoreObject());
assigneeHeader = new WfeAssigneesHeader(comp, SWT.NONE, workItem, editable, editor);
}
}
public boolean isShowTargetedVersion() {
if (!workItem.isTeamWorkflow()) {
return false;
}
return AtsApiService.get().getVersionService().isTeamUsesVersions(
((TeamWorkFlowArtifact) workItem).getTeamDefinition());
}
private static Color getLightGreyColor() {
if (LIGHT_GREY == null) {
LIGHT_GREY = Displays.getColor(240, 240, 240);
}
return LIGHT_GREY;
}
@Override
public void dispose() {
if (customHeader != null) {
customHeader.dispose();
}
if (actionableItemHeader != null) {
actionableItemHeader.dispose();
}
if (metricsHeader != null) {
metricsHeader.dispose();
}
}
public XResultData isXWidgetDirty(XResultData rd) {
if (titleHeader != null) {
titleHeader.isXWidgetDirty(rd);
}
if (customHeader != null) {
customHeader.isXWidgetDirty(rd);
}
return rd;
}
public void getDirtyIArtifactWidgets(List<ArtifactStoredWidget> artWidgets) {
if (titleHeader != null) {
titleHeader.getDirtyIArtifactWidgets(artWidgets);
}
if (customHeader != null) {
customHeader.getDirtyIArtifactWidgets(artWidgets);
}
}
public Result isXWidgetSavable() {
if (titleHeader != null) {
Result result = titleHeader.isXWidgetSavable();
if (result.isTrue()) {
return result;
}
}
if (customHeader != null) {
return customHeader.isXWidgetSavable();
}
return Result.FalseResult;
}
final XModifiedListener xModListener = new XModifiedListener() {
@Override
public void widgetModified(XWidget xWidget) {
try {
if (AtsApiService.get().getStoreService().isDeleted(workItem)) {
return;
}
// Notify extensions of widget modified
for (IAtsWorkItemHookIde item : AtsApiService.get().getWorkItemServiceIde().getWorkItemHooksIde()) {
try {
boolean isEditable =
!((Artifact) workItem.getStoreObject()).isReadOnly() && ((AbstractWorkflowArtifact) workItem.getStoreObject()).isAccessControlWrite();
item.widgetModified(xWidget, editor.getToolkit(), workItem.getStateDefinition(), (Artifact) workItem,
isEditable);
} catch (Exception ex) {
OseeLog.log(Activator.class, Level.SEVERE, ex);
}
}
DuplicateWidgetUpdateResolver.updateDuplicateWidgets(managedForm, (AbstractWorkflowArtifact) workItem,
xWidget);
editor.onDirtied();
} catch (Exception ex) {
OseeLog.log(Activator.class, Level.SEVERE, ex);
}
}
};
public Collection<XWidget> getXWidgets(ArrayList<XWidget> widgets) {
titleHeader.getXWidgets(widgets);
relatedComposite.getXWidgets(widgets);
customHeader.getXWidgets(widgets);
return widgets;
}
}