blob: a680d410eb8e8d74b07c7403040bb9abf17d2469 [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.ats.editor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData;
import org.eclipse.osee.ats.AtsImage;
import org.eclipse.osee.ats.actions.ISelectedAtsArtifacts;
import org.eclipse.osee.ats.core.artifact.GoalArtifact;
import org.eclipse.osee.ats.core.type.AtsArtifactTypes;
import org.eclipse.osee.ats.core.type.AtsRelationTypes;
import org.eclipse.osee.ats.core.workflow.AbstractWorkflowArtifact;
import org.eclipse.osee.ats.goal.GoalXViewerFactory;
import org.eclipse.osee.ats.goal.RemoveFromGoalAction;
import org.eclipse.osee.ats.goal.SetGoalOrderAction;
import org.eclipse.osee.ats.internal.Activator;
import org.eclipse.osee.ats.world.IMenuActionProvider;
import org.eclipse.osee.ats.world.IWorldEditor;
import org.eclipse.osee.ats.world.IWorldEditorProvider;
import org.eclipse.osee.ats.world.WorldComposite;
import org.eclipse.osee.ats.world.WorldLabelProvider;
import org.eclipse.osee.ats.world.WorldXViewer;
import org.eclipse.osee.framework.core.exception.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.xnavigate.XNavigateComposite.TableLoadOption;
import org.eclipse.osee.framework.ui.skynet.XFormToolkit;
import org.eclipse.osee.framework.ui.skynet.artifact.editor.ArtifactEditor;
import org.eclipse.osee.framework.ui.skynet.util.ArtifactDragAndDrop;
import org.eclipse.osee.framework.ui.swt.ALayout;
import org.eclipse.osee.framework.ui.swt.Displays;
import org.eclipse.osee.framework.ui.swt.ImageManager;
import org.eclipse.osee.framework.ui.swt.Widgets;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.SectionPart;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
/**
* @author Roberto E. Escobar
* @author Donald G. Dunne
*/
public class SMAGoalMembersSection extends SectionPart implements ISelectedAtsArtifacts, IWorldEditor, IMenuActionProvider {
private final SMAEditor editor;
private WorldComposite worldComposite;
private static final Map<SMAEditor, CustomizeData> editorToCustDataMap = new HashMap<SMAEditor, CustomizeData>(20);
private static Map<SMAEditor, Boolean> editorToTableExpanded = new HashMap<SMAEditor, Boolean>();
private final static int DEFAULT_TABLE_HEIGHT = 400;
public SMAGoalMembersSection(SMAEditor editor, Composite parent, XFormToolkit toolkit, int style) {
super(parent, toolkit, style | ExpandableComposite.TITLE_BAR);
this.editor = editor;
}
@Override
public void initialize(final IManagedForm form) {
super.initialize(form);
final FormToolkit toolkit = form.getToolkit();
Section section = getSection();
section.setText("Members");
section.setLayout(new GridLayout());
section.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
Composite sectionBody = toolkit.createComposite(section, toolkit.getBorderStyle());
sectionBody.setLayout(ALayout.getZeroMarginLayout(2, false));
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
gd.widthHint = 300;
sectionBody.setLayoutData(gd);
ToolBar toolBar = createToolBar(sectionBody);
addDropToAddLabel(toolkit, sectionBody);
addDropToRemoveLabel(toolkit, sectionBody);
createWorldComposite(sectionBody);
createActions();
setupListenersForCustomizeDataCaching();
fillActionBar(toolBar);
section.setClient(sectionBody);
toolkit.paintBordersFor(section);
RefreshTableSizeJob job = new RefreshTableSizeJob("");
job.schedule(400);
}
private class RefreshTableSizeJob extends Job {
public RefreshTableSizeJob(String name) {
super(name);
}
@Override
protected IStatus run(IProgressMonitor monitor) {
Displays.ensureInDisplayThread(new Runnable() {
@Override
public void run() {
refreshTableSize();
}
});
return Status.OK_STATUS;
}
}
private ToolBar createToolBar(Composite parent) {
Composite actionComp = new Composite(parent, SWT.NONE);
actionComp.setLayout(ALayout.getZeroMarginLayout());
GridData gd = new GridData(SWT.FILL, SWT.NONE, true, false);
gd.horizontalSpan = 2;
actionComp.setLayoutData(gd);
ToolBar toolBar = new ToolBar(actionComp, SWT.FLAT | SWT.RIGHT);
gd = new GridData(GridData.FILL_HORIZONTAL);
toolBar.setLayoutData(gd);
ToolItem expandItem = new ToolItem(toolBar, SWT.PUSH);
expandItem.setImage(ImageManager.getImage(AtsImage.EXPAND_TABLE));
expandItem.setToolTipText("Expand/Collapse Table Height");
expandItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
toggleTableExpand();
refreshTableSize();
}
});
return toolBar;
}
private void refreshTableSize() {
GridData gd = null;
if (!isTableExpanded()) {
gd = new GridData(SWT.FILL, SWT.NONE, true, false);
gd.heightHint = DEFAULT_TABLE_HEIGHT;
} else {
gd = new GridData(SWT.FILL, SWT.FILL, true, true);
}
gd.horizontalSpan = 2;
worldComposite.setLayoutData(gd);
worldComposite.layout(true);
getManagedForm().reflow(true);
}
private void fillActionBar(ToolBar toolBar) {
new ActionContributionItem(worldComposite.getXViewer().getCustomizeAction()).fill(toolBar, -1);
}
private void createWorldComposite(final Composite sectionBody) {
worldComposite =
new WorldComposite(this, new GoalXViewerFactory((GoalArtifact) editor.getAwa()), sectionBody, SWT.BORDER);
CustomizeData customizeData = editorToCustDataMap.get(editor);
if (customizeData == null) {
customizeData = worldComposite.getCustomizeDataCopy();
}
WorldLabelProvider labelProvider = (WorldLabelProvider) worldComposite.getXViewer().getLabelProvider();
labelProvider.setParentGoal((GoalArtifact) editor.getAwa());
worldComposite.getWorldXViewer().addMenuActionProvider(this);
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
gd.horizontalSpan = 2;
worldComposite.setLayoutData(gd);
try {
customizeData = null;
worldComposite.load("Members", editor.getAwa().getRelatedArtifacts(AtsRelationTypes.Goal_Member),
customizeData, TableLoadOption.None);
} catch (OseeCoreException ex) {
OseeLog.log(Activator.class, Level.SEVERE, ex);
}
}
private boolean isTableExpanded() {
if (editor != null && editorToTableExpanded.containsKey(editor)) {
return editorToTableExpanded.get(editor);
}
return false;
}
private void toggleTableExpand() {
if (editor != null) {
Boolean expanded = editorToTableExpanded.get(editor);
if (expanded == null) {
expanded = true;
} else {
expanded = !expanded;
}
editorToTableExpanded.put(editor, expanded);
}
}
private void setupListenersForCustomizeDataCaching() {
worldComposite.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
editorToCustDataMap.put(editor, worldComposite.getCustomizeDataCopy());
}
});
editor.addEditorListeners(new ISMAEditorListener() {
@Override
public void editorDisposing() {
editorToCustDataMap.remove(editor);
editorToTableExpanded.remove(editor);
}
});
}
protected void addDropToAddLabel(FormToolkit toolkit, Composite sectionBody) {
Label dropToAddLabel = new Label(sectionBody, SWT.BORDER);
dropToAddLabel.setText(" Drop New Members Here");
dropToAddLabel.setBackgroundImage(ImageManager.getImage(AtsImage.DROP_HERE_TO_ADD_BACKGROUND));
GridData gd = new GridData(GridData.FILL_BOTH);
gd.heightHint = 25;
dropToAddLabel.setLayoutData(gd);
toolkit.adapt(dropToAddLabel, true, true);
new ArtifactDragAndDrop(dropToAddLabel, editor.getAwa(), ArtifactEditor.EDITOR_ID) {
@Override
public void performArtifactDrop(Artifact[] dropArtifacts) {
super.performArtifactDrop(dropArtifacts);
try {
List<Artifact> members = new ArrayList<Artifact>();
members.addAll(((GoalArtifact) editor.getAwa()).getMembers());
for (Artifact art : dropArtifacts) {
if (!members.contains(art)) {
members.add(art);
editor.getAwa().addRelation(AtsRelationTypes.Goal_Member, art);
}
}
editor.getAwa().setRelationOrder(AtsRelationTypes.Goal_Member, members);
editor.doSave(null);
} catch (OseeCoreException ex) {
OseeLog.log(Activator.class, OseeLevel.SEVERE_POPUP, ex);
}
}
};
}
protected void addDropToRemoveLabel(FormToolkit toolkit, Composite sectionBody) {
Label dropToAddLabel = new Label(sectionBody, SWT.BORDER);
dropToAddLabel.setText(" Drop Members to Remove");
dropToAddLabel.setBackgroundImage(ImageManager.getImage(AtsImage.DROP_HERE_TO_REMOVE_BACKGROUND));
GridData gd = new GridData(GridData.FILL_BOTH);
gd.heightHint = 25;
dropToAddLabel.setLayoutData(gd);
toolkit.adapt(dropToAddLabel, true, true);
new ArtifactDragAndDrop(dropToAddLabel, editor.getAwa(), ArtifactEditor.EDITOR_ID) {
@Override
public void performArtifactDrop(Artifact[] dropArtifacts) {
super.performArtifactDrop(dropArtifacts);
final Set<Artifact> artifacts = new HashSet<Artifact>();
final List<Artifact> artList = new ArrayList<Artifact>();
for (Artifact artifact : dropArtifacts) {
artifacts.add(artifact);
artList.add(artifact);
}
RemoveFromGoalAction remove =
new RemoveFromGoalAction((GoalArtifact) editor.getAwa(), new ISelectedAtsArtifacts() {
@Override
public Set<? extends Artifact> getSelectedSMAArtifacts() {
return artifacts;
}
@Override
public List<Artifact> getSelectedAtsArtifacts() {
return artList;
}
});
remove.run();
}
};
}
@Override
public void refresh() {
super.refresh();
Displays.ensureInDisplayThread(new Runnable() {
@Override
public void run() {
if (Widgets.isAccessible(worldComposite)) {
worldComposite.getXViewer().refresh();
}
}
});
}
@Override
public void dispose() {
if (Widgets.isAccessible(worldComposite)) {
worldComposite.dispose();
}
super.dispose();
}
@Override
public void createToolBarPulldown(Menu menu) {
// do nothing
}
@Override
public String getCurrentTitleLabel() {
return "";
}
@Override
public IWorldEditorProvider getWorldEditorProvider() {
return null;
}
@Override
public void reSearch() {
// do nothing
}
@Override
public void reflow() {
// do nothing
}
@Override
public void setTableTitle(String title, boolean warning) {
// do nothing
}
Action setGoalOrderAction, removeFromGoalAction;
public void createActions() {
setGoalOrderAction = new SetGoalOrderAction((GoalArtifact) editor.getAwa(), this);
removeFromGoalAction = new RemoveFromGoalAction((GoalArtifact) editor.getAwa(), this);
}
@Override
public void updateMenuActionsForTable() {
MenuManager mm = worldComposite.getXViewer().getMenuManager();
mm.insertBefore(WorldXViewer.MENU_GROUP_ATS_WORLD_EDIT, setGoalOrderAction);
mm.insertBefore(WorldXViewer.MENU_GROUP_ATS_WORLD_EDIT, removeFromGoalAction);
mm.insertBefore(WorldXViewer.MENU_GROUP_ATS_WORLD_EDIT, new Separator());
}
@Override
public Set<Artifact> getSelectedSMAArtifacts() {
Set<Artifact> artifacts = new HashSet<Artifact>();
for (Artifact art : worldComposite.getSelectedArtifacts()) {
if (art instanceof AbstractWorkflowArtifact) {
artifacts.add(art);
}
}
return artifacts;
}
@Override
public List<Artifact> getSelectedAtsArtifacts() {
List<Artifact> artifacts = new ArrayList<Artifact>();
for (Artifact art : worldComposite.getSelectedArtifacts()) {
if (art.isOfType(AtsArtifactTypes.AtsArtifact)) {
artifacts.add(art);
}
}
return artifacts;
}
}