/******************************************************************************* * Copyright (c) 2010 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.ats.column; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.nebula.widgets.xviewer.IAltLeftClickProvider; import org.eclipse.nebula.widgets.xviewer.IMultiColumnEditProvider; import org.eclipse.nebula.widgets.xviewer.IXViewerValueColumn; import org.eclipse.nebula.widgets.xviewer.XViewer; import org.eclipse.nebula.widgets.xviewer.XViewerColumn; import org.eclipse.osee.ats.api.data.AtsArtifactTypes; import org.eclipse.osee.ats.api.team.IAtsTeamDefinition; import org.eclipse.osee.ats.api.version.IAtsVersion; import org.eclipse.osee.ats.api.version.VersionLockedType; import org.eclipse.osee.ats.api.version.VersionReleaseType; import org.eclipse.osee.ats.core.client.action.ActionManager; import org.eclipse.osee.ats.core.client.team.TeamWorkFlowArtifact; import org.eclipse.osee.ats.core.client.util.AtsUtilClient; import org.eclipse.osee.ats.core.client.workflow.AbstractWorkflowArtifact; import org.eclipse.osee.ats.core.config.AtsVersionService; import org.eclipse.osee.ats.core.config.Versions; import org.eclipse.osee.ats.internal.Activator; import org.eclipse.osee.ats.util.widgets.dialog.VersionListDialog; import org.eclipse.osee.ats.util.xviewer.column.XViewerAtsColumn; import org.eclipse.osee.ats.world.WorldXViewerFactory; import org.eclipse.osee.framework.jdk.core.type.OseeCoreException; import org.eclipse.osee.framework.jdk.core.util.Collections; import org.eclipse.osee.framework.jdk.core.util.Strings; 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.utility.Artifacts; import org.eclipse.osee.framework.ui.plugin.util.AWorkbench; import org.eclipse.osee.framework.ui.skynet.util.LogUtil; import org.eclipse.osee.framework.ui.swt.Displays; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.TreeColumn; import org.eclipse.swt.widgets.TreeItem; /** * @author Donald G. Dunne */ public class TargetedVersionColumn extends XViewerAtsColumn implements IXViewerValueColumn, IAltLeftClickProvider, IMultiColumnEditProvider { public static TargetedVersionColumn instance = new TargetedVersionColumn(); public static TargetedVersionColumn getInstance() { return instance; } private TargetedVersionColumn() { super(WorldXViewerFactory.COLUMN_NAMESPACE + ".versionTarget", "Targeted Version", 40, SWT.LEFT, true, SortDataType.String, true, "Date this workflow transitioned to the Completed state."); } /** * XViewer uses copies of column definitions so originals that are registered are not corrupted. Classes extending * XViewerValueColumn MUST extend this constructor so the correct sub-class is created */ @Override public TargetedVersionColumn copy() { TargetedVersionColumn newXCol = new TargetedVersionColumn(); super.copy(this, newXCol); return newXCol; } @Override public boolean handleAltLeftClick(TreeColumn treeColumn, TreeItem treeItem) { try { if (treeItem.getData() instanceof Artifact) { Artifact useArt = (Artifact) treeItem.getData(); if (useArt.isOfType(AtsArtifactTypes.Action)) { if (ActionManager.getTeams(useArt).size() == 1) { useArt = ActionManager.getFirstTeam(useArt); } else { return false; } } if (!(useArt.isOfType(AtsArtifactTypes.TeamWorkflow))) { return false; } boolean modified = promptChangeVersion(Arrays.asList((TeamWorkFlowArtifact) useArt), AtsUtilClient.isAtsAdmin() ? VersionReleaseType.Both : VersionReleaseType.UnReleased, AtsUtilClient.isAtsAdmin() ? VersionLockedType.Both : VersionLockedType.UnLocked); XViewer xViewer = ((XViewerColumn) treeColumn.getData()).getTreeViewer(); if (modified && isPersistViewer(xViewer)) { useArt.persist("persist goals via alt-left-click"); } if (modified) { xViewer.update(useArt, null); return true; } } } catch (OseeCoreException ex) { OseeLog.log(Activator.class, OseeLevel.SEVERE_POPUP, ex); } return false; } public static boolean promptChangeVersion(AbstractWorkflowArtifact sma, VersionReleaseType versionReleaseType, VersionLockedType versionLockType) throws OseeCoreException { if (AtsUtilClient.isAtsAdmin() && !sma.isTeamWorkflow()) { AWorkbench.popup("ERROR ", "Cannot set version for: \n\n" + sma.getName()); return false; } return promptChangeVersion(Arrays.asList((TeamWorkFlowArtifact) sma), versionReleaseType, versionLockType); } public static boolean promptChangeVersion(final Collection awas, VersionReleaseType versionReleaseType, VersionLockedType versionLockType) throws OseeCoreException { IAtsTeamDefinition teamDefHoldingVersions = null; for (TeamWorkFlowArtifact teamArt : awas) { if (!teamArt.getTeamDefinition().isTeamUsesVersions()) { AWorkbench.popup("ERROR", "Team \"" + teamArt.getTeamDefinition().getName() + "\" doesn't use versions."); return false; } if (AtsVersionService.get().isReleased(teamArt) || AtsVersionService.get().isVersionLocked(teamArt)) { String error = "Team Workflow\n \"" + teamArt.getName() + "\"\n targeted version is locked or already released."; if (AtsUtilClient.isAtsAdmin() && !MessageDialog.openConfirm(Displays.getActiveShell(), "Change Version", error + "\n\nOverride?")) { return false; } else if (!AtsUtilClient.isAtsAdmin()) { AWorkbench.popup("ERROR", error); continue; } } if (teamDefHoldingVersions != null && teamDefHoldingVersions != teamArt.getTeamDefinition().getTeamDefinitionHoldingVersions()) { AWorkbench.popup("ERROR", "Can't change version on Workflows that have different release version sets."); return false; } if (teamDefHoldingVersions == null) { teamDefHoldingVersions = teamArt.getTeamDefinition().getTeamDefinitionHoldingVersions(); } } if (teamDefHoldingVersions == null) { AWorkbench.popup("ERROR", "No versions configured for impacted team(s)."); return false; } TeamWorkFlowArtifact teamArt = awas.iterator().next(); final VersionListDialog vld = new VersionListDialog("Select Version", "Select Version", teamDefHoldingVersions.getVersions( versionReleaseType, versionLockType)); if (awas.size() == 1 && AtsVersionService.get().hasTargetedVersion(teamArt)) { Object[] objs = new Object[1]; objs[0] = AtsVersionService.get().getTargetedVersion(teamArt); vld.setInitialSelections(objs); } int result = vld.open(); if (result != 0) { return false; } Object obj = vld.getResult()[0]; IAtsVersion newVersion = (IAtsVersion) obj; //now check selected version if (newVersion.isVersionLocked()) { String error = "Version \"" + newVersion.getCommitFullDisplayName() + "\" is locked or already released."; if (AtsUtilClient.isAtsAdmin() && !MessageDialog.openConfirm(Displays.getActiveShell(), "Change Version", error + "\n\nOverride?")) { return false; } else if (!AtsUtilClient.isAtsAdmin()) { AWorkbench.popup("ERROR", error); } } for (TeamWorkFlowArtifact teamArt1 : awas) { AtsVersionService.get().setTargetedVersionAndStore(teamArt1, newVersion); } Artifacts.persistInTransaction("ATS Prompt Change Version", awas); return true; } @Override public String getColumnText(Object element, XViewerColumn column, int columnIndex) { try { if (Artifacts.isOfType(element, AtsArtifactTypes.Action)) { Set strs = new HashSet(); for (TeamWorkFlowArtifact team : ActionManager.getTeams(element)) { String str = Versions.getTargetedVersionStr(team); if (Strings.isValid(str)) { strs.add(str); } } return Collections.toString(";", strs); } else { return Versions.getTargetedVersionStr(element); } } catch (OseeCoreException ex) { return LogUtil.getCellExceptionString(ex); } } @Override public void handleColumnMultiEdit(TreeColumn treeColumn, Collection treeItems) { try { Set awas = new HashSet(); List arts = new ArrayList(); for (TreeItem item : treeItems) { Artifact art = (Artifact) item.getData(); if (art.isOfType(AtsArtifactTypes.TeamWorkflow)) { awas.add((TeamWorkFlowArtifact) art); arts.add(art); } } promptChangeVersion(awas, AtsUtilClient.isAtsAdmin() ? VersionReleaseType.Both : VersionReleaseType.UnReleased, AtsUtilClient.isAtsAdmin() ? VersionLockedType.Both : VersionLockedType.UnLocked); getXViewer().update(awas.toArray(), null); return; } catch (OseeCoreException ex) { OseeLog.log(Activator.class, OseeLevel.SEVERE_POPUP, ex); } } }