diff options
author | Mark Joy | 2013-03-28 17:31:10 +0000 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org | 2013-04-01 21:35:57 +0000 |
commit | 36632cf6930fd06657e218464958d96a7576970e (patch) | |
tree | e79b98e152b00f1651f658de32883b638600e879 | |
parent | 1500bdedcec98ea89060eae2312c2c8dc4839584 (diff) | |
download | org.eclipse.osee-36632cf6930fd06657e218464958d96a7576970e.tar.gz org.eclipse.osee-36632cf6930fd06657e218464958d96a7576970e.tar.xz org.eclipse.osee-36632cf6930fd06657e218464958d96a7576970e.zip |
bug[ats_TGGYW]: Goal page resizing causes horizontal scrollbar to disappear
Bug 404570
Change-Id: I40677d7bb6e43ab762c6e8fc0bccdfd4402329b2
5 files changed, 243 insertions, 494 deletions
diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAEditor.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAEditor.java index 6ddd70e76f2..87c3f6e17d9 100644 --- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAEditor.java +++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAEditor.java @@ -42,6 +42,8 @@ import org.eclipse.osee.ats.task.TaskTabXWidgetActionPage; import org.eclipse.osee.ats.util.AtsUtil; import org.eclipse.osee.ats.world.AtsMetricsComposite; import org.eclipse.osee.ats.world.IAtsMetricsProvider; +import org.eclipse.osee.ats.world.IWorldEditor; +import org.eclipse.osee.ats.world.IWorldEditorProvider; import org.eclipse.osee.framework.access.AccessControlManager; import org.eclipse.osee.framework.core.enums.PermissionEnum; import org.eclipse.osee.framework.core.exception.OseeArgumentException; @@ -74,6 +76,7 @@ import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; @@ -89,7 +92,7 @@ import org.eclipse.ui.views.contentoutline.IContentOutlinePage; /** * @author Donald G. Dunne */ -public class SMAEditor extends AbstractArtifactEditor implements IDirtyReportable, ISMAEditorEventHandler, ISelectedAtsArtifacts, IAtsMetricsProvider, IXTaskViewer { +public class SMAEditor extends AbstractArtifactEditor implements IWorldEditor, IDirtyReportable, ISMAEditorEventHandler, ISelectedAtsArtifacts, IAtsMetricsProvider, IXTaskViewer { public static final String EDITOR_ID = "org.eclipse.osee.ats.editor.SMAEditor"; private AbstractWorkflowArtifact awa; private SMAWorkFlowTab workFlowTab; @@ -678,8 +681,8 @@ public class SMAEditor extends AbstractArtifactEditor implements IDirtyReportabl if (page.equals(workFlowTab)) { provider = getDefaultSelectionProvider(); } else if (page.equals(membersTab)) { - if (membersTab != null && membersTab.getSmaGoalMembersSection() != null) { - provider = membersTab.getSmaGoalMembersSection().getWorldComposite().getWorldXViewer(); + if (membersTab != null && membersTab.getGoalMembersSection() != null) { + provider = membersTab.getWorldXViewer(); } } else if (page.equals(taskTabXWidgetActionPage)) { provider = taskTabXWidgetActionPage.getTaskComposite().getTaskXViewer(); @@ -704,4 +707,34 @@ public class SMAEditor extends AbstractArtifactEditor implements IDirtyReportabl return java.util.Collections.emptyList(); } + @Override + public void reflow() { + // do nothing + } + + @Override + public void setTableTitle(String title, boolean warning) { + // do nothing + } + + @Override + public void reSearch() { + // do nothing + } + + @Override + public IWorldEditorProvider getWorldEditorProvider() { + return null; + } + + @Override + public void createToolBarPulldown(Menu menu) { + // do nothing + } + + @Override + public String getCurrentTitleLabel() { + return null; + } + }
\ No newline at end of file diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAGoalMembersSection.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAGoalMembersSection.java deleted file mode 100644 index 76e530faedb..00000000000 --- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAGoalMembersSection.java +++ /dev/null @@ -1,424 +0,0 @@ -/******************************************************************************* - * 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.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -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.api.data.AtsArtifactTypes; -import org.eclipse.osee.ats.api.data.AtsRelationTypes; -import org.eclipse.osee.ats.core.client.actions.ISelectedAtsArtifacts; -import org.eclipse.osee.ats.core.client.artifact.GoalArtifact; -import org.eclipse.osee.ats.core.client.task.TaskArtifact; -import org.eclipse.osee.ats.core.client.workflow.AbstractWorkflowArtifact; -import org.eclipse.osee.ats.goal.GoalXViewerFactory; -import org.eclipse.osee.ats.goal.RemoveFromGoalAction; -import org.eclipse.osee.ats.goal.RemoveFromGoalAction.RemovedFromGoalHandler; -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.WorldViewDragAndDrop; -import org.eclipse.osee.ats.world.WorldXViewer; -import org.eclipse.osee.framework.core.exception.OseeCoreException; -import org.eclipse.osee.framework.jdk.core.util.Lib; -import org.eclipse.osee.framework.logging.OseeLog; -import org.eclipse.osee.framework.plugin.core.util.Jobs; -import org.eclipse.osee.framework.skynet.core.artifact.Artifact; -import org.eclipse.osee.framework.skynet.core.artifact.ArtifactData; -import org.eclipse.osee.framework.ui.plugin.xnavigate.XNavigateComposite.TableLoadOption; -import org.eclipse.osee.framework.ui.skynet.action.RefreshAction; -import org.eclipse.osee.framework.ui.skynet.action.RefreshAction.IRefreshActionHandler; -import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactTransfer; -import org.eclipse.osee.framework.ui.swt.ALayout; -import org.eclipse.osee.framework.ui.swt.Displays; -import org.eclipse.osee.framework.ui.swt.Widgets; -import org.eclipse.swt.SWT; -import org.eclipse.swt.dnd.DND; -import org.eclipse.swt.dnd.DropTargetEvent; -import org.eclipse.swt.events.DisposeEvent; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.swt.widgets.ToolBar; - -/** - * @author Roberto E. Escobar - * @author Donald G. Dunne - */ -public class SMAGoalMembersSection extends Composite implements ISelectedAtsArtifacts, IWorldEditor, IMenuActionProvider, IRefreshActionHandler { - - private final SMAEditor editor; - private WorldComposite worldComposite; - private static final Map<String, CustomizeData> editorToCustDataMap = new HashMap<String, CustomizeData>(20); - private final String id; - private final GoalArtifact goalArtifact; - - public SMAGoalMembersSection(String id, SMAEditor editor, Composite parent, int style, Integer defaultTableWidth, GoalArtifact goalArtifact) { - super(parent, style); - this.id = id; - this.editor = editor; - this.goalArtifact = goalArtifact; - - setLayout(new GridLayout(2, true)); - setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); - - ToolBar toolBar = createToolBar(); - - createWorldComposite(defaultTableWidth); - createActions(); - setupListenersForCustomizeDataCaching(); - fillActionBar(toolBar); - editor.getToolkit().adapt(this); - } - - private ToolBar createToolBar() { - Composite actionComp = new Composite(this, 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); - - editor.getToolkit().adapt(actionComp); - editor.getToolkit().adapt(toolBar); - return toolBar; - } - - private void fillActionBar(ToolBar toolBar) { - - new ActionContributionItem(worldComposite.getXViewer().getCustomizeAction()).fill(toolBar, -1); - new ActionContributionItem(new RefreshAction(this)).fill(toolBar, -1); - } - - private void createWorldComposite(Integer defaultTableWidth) { - worldComposite = - new WorldComposite(id, this, new GoalXViewerFactory((GoalArtifact) editor.getAwa()), this, SWT.BORDER, false); - - new GoalDragAndDrop(worldComposite, SMAEditor.EDITOR_ID); - - CustomizeData customizeData = editorToCustDataMap.get(getTableExpandKey()); - if (customizeData == null) { - customizeData = worldComposite.getCustomizeDataCopy(); - } - WorldLabelProvider labelProvider = (WorldLabelProvider) worldComposite.getXViewer().getLabelProvider(); - labelProvider.setParentGoal((GoalArtifact) editor.getAwa()); - - worldComposite.getWorldXViewer().addMenuActionProvider(this); - - GridData gd = null; - if (defaultTableWidth != null && defaultTableWidth > 0) { - gd = new GridData(SWT.FILL, SWT.NONE, true, false); - gd.heightHint = defaultTableWidth; - } else { - gd = new GridData(SWT.FILL, SWT.FILL, true, true); - } - gd.widthHint = 200; - gd.horizontalSpan = 2; - worldComposite.setLayoutData(gd); - worldComposite.layout(true); - - customizeData = null; - reload(); - } - - public void reload() { - if (isTableDisposed()) { - return; - } - Job job = new Job("Load Goal Members") { - - @Override - protected IStatus run(IProgressMonitor monitor) { - if (isTableDisposed()) { - return Status.OK_STATUS; - } - try { - final List<Artifact> artifacts = goalArtifact.getMembers(); - Displays.ensureInDisplayThread(new Runnable() { - @Override - public void run() { - if (isTableDisposed()) { - return; - } - worldComposite.load("Members", artifacts, (CustomizeData) null, TableLoadOption.None); - } - - }); - } catch (OseeCoreException ex) { - OseeLog.log(Activator.class, Level.SEVERE, ex); - return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Exception loading Goal Members", ex); - } - return Status.OK_STATUS; - } - }; - Jobs.startJob(job, false); - } - - private boolean isTableDisposed() { - return worldComposite == null || worldComposite.getXViewer() == null || worldComposite.getXViewer().getTree() == null || worldComposite.getXViewer().getTree().isDisposed(); - } - - private String getTableExpandKey() { - return editor.getAwa().getHumanReadableId() + id; - } - - private void setupListenersForCustomizeDataCaching() { - worldComposite.addDisposeListener(new DisposeListener() { - - @Override - public void widgetDisposed(DisposeEvent e) { - editorToCustDataMap.put(getTableExpandKey(), worldComposite.getCustomizeDataCopy()); - } - }); - editor.addEditorListeners(new ISMAEditorListener() { - - @Override - public void editorDisposing() { - editorToCustDataMap.remove(getTableExpandKey()); - } - }); - } - - public void refresh() { - Displays.ensureInDisplayThread(new Runnable() { - - @Override - public void run() { - if (Widgets.isAccessible(worldComposite)) { - updateShown(); - worldComposite.update(); - worldComposite.getXViewer().refresh(); - } - } - }); - } - - private void updateShown() { - List<Artifact> members; - try { - members = goalArtifact.getMembers(); - } catch (OseeCoreException ex) { - OseeLog.log(Activator.class, Level.SEVERE, ex); - return; - } - List<Artifact> loadedArtifacts = worldComposite.getLoadedArtifacts(); - List<Artifact> toRemoveFromLoaded = new LinkedList<Artifact>(members); - members.removeAll(loadedArtifacts); - for (Artifact art : members) { - worldComposite.insert(art, -1); - } - loadedArtifacts.removeAll(toRemoveFromLoaded); - worldComposite.getXViewer().remove(loadedArtifacts); - } - - @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); - RemovedFromGoalHandler handler = new RemovedFromGoalHandler() { - - @Override - public void removedFromGoal(Collection<? extends Artifact> removed) { - worldComposite.removeItems(removed); - worldComposite.getXViewer().remove(removed); - worldComposite.getXViewer().refresh(goalArtifact); - } - - }; - removeFromGoalAction = new RemoveFromGoalAction((GoalArtifact) editor.getAwa(), this, handler); - } - - @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; - } - - @Override - public List<TaskArtifact> getSelectedTaskArtifacts() { - List<TaskArtifact> tasks = new ArrayList<TaskArtifact>(); - for (Artifact art : worldComposite.getSelectedArtifacts()) { - if (art instanceof TaskArtifact) { - tasks.add((TaskArtifact) art); - } - } - return tasks; - } - - public WorldComposite getWorldComposite() { - return worldComposite; - } - - @Override - public void refreshActionHandler() { - refresh(); - } - - private class GoalDragAndDrop extends WorldViewDragAndDrop { - - private boolean isFeedbackAfter = false; - - public GoalDragAndDrop(WorldComposite worldComposite, String viewId) { - super(worldComposite, viewId); - } - - private Artifact getSelectedArtifact(DropTargetEvent event) { - if (event.item != null && event.item.getData() instanceof Artifact) { - return (Artifact) event.item.getData(); - } - return null; - } - - @Override - public void operationChanged(DropTargetEvent event) { - if (!(event.detail == 1)) { - isFeedbackAfter = false; - } else { - isFeedbackAfter = true; - } - } - - @Override - public void performDragOver(DropTargetEvent event) { - if (isValidForArtifactDrop(event)) { - event.detail = DND.DROP_MOVE; - Artifact selectedArtifact = getSelectedArtifact(event); - if (selectedArtifact != null) { - if (isFeedbackAfter) { - event.feedback = DND.FEEDBACK_INSERT_AFTER | DND.FEEDBACK_SCROLL; - } else { - event.feedback = DND.FEEDBACK_INSERT_BEFORE | DND.FEEDBACK_SCROLL; - } - } - } - } - - @Override - public void performDrop(final DropTargetEvent event) { - final ArtifactData artData = ArtifactTransfer.getInstance().nativeToJava(event.currentDataType); - final List<Artifact> droppedArtifacts = Arrays.asList(artData.getArtifacts()); - final Artifact dropTarget = getSelectedArtifact(event); - if (ArtifactTransfer.getInstance().isSupportedType(event.currentDataType)) { - try { - Collections.reverse(droppedArtifacts); - List<Artifact> members = goalArtifact.getMembers(); - for (Artifact dropped : droppedArtifacts) { - if (!members.contains(dropped)) { - goalArtifact.addMember(dropped); - int index = isFeedbackAfter ? members.indexOf(dropTarget) + 1 : members.indexOf(dropTarget); - worldComposite.insert(dropped, index); - worldComposite.update(); - } - if (dropTarget != null) { - goalArtifact.setRelationOrder(AtsRelationTypes.Goal_Member, dropTarget, isFeedbackAfter, dropped); - } - } - goalArtifact.persist(SMAGoalMembersSection.class.getSimpleName()); - worldComposite.getXViewer().refresh(goalArtifact); - worldComposite.getXViewer().update(dropTarget, null); - } catch (OseeCoreException ex) { - OseeLog.log(Activator.class, Level.WARNING, Lib.exceptionToString(ex)); - } - } - } - - } - -} diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAMembersTab.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAMembersTab.java index 6e7fbcba751..f9443af0e96 100644 --- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAMembersTab.java +++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAMembersTab.java @@ -11,8 +11,11 @@ package org.eclipse.osee.ats.editor; +import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.logging.Level; @@ -22,22 +25,34 @@ import org.eclipse.core.runtime.Status; 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.IToolBarManager; +import org.eclipse.nebula.widgets.xviewer.customize.CustomizeData; +import org.eclipse.osee.ats.api.data.AtsRelationTypes; import org.eclipse.osee.ats.core.client.artifact.GoalArtifact; import org.eclipse.osee.ats.core.client.config.AtsBulkLoad; +import org.eclipse.osee.ats.goal.GoalXViewerFactory; import org.eclipse.osee.ats.internal.Activator; import org.eclipse.osee.ats.world.IWorldViewerEventHandler; +import org.eclipse.osee.ats.world.WorldComposite; +import org.eclipse.osee.ats.world.WorldLabelProvider; +import org.eclipse.osee.ats.world.WorldViewDragAndDrop; import org.eclipse.osee.ats.world.WorldXViewer; import org.eclipse.osee.ats.world.WorldXViewerEventManager; import org.eclipse.osee.framework.core.exception.OseeCoreException; -import org.eclipse.osee.framework.core.operation.CompositeOperation; import org.eclipse.osee.framework.core.operation.IOperation; import org.eclipse.osee.framework.core.operation.Operations; +import org.eclipse.osee.framework.jdk.core.util.Lib; import org.eclipse.osee.framework.jdk.core.util.Strings; import org.eclipse.osee.framework.logging.OseeLog; +import org.eclipse.osee.framework.plugin.core.util.Jobs; import org.eclipse.osee.framework.skynet.core.artifact.Artifact; +import org.eclipse.osee.framework.skynet.core.artifact.ArtifactData; import org.eclipse.osee.framework.skynet.core.event.model.EventBasicGuidArtifact; import org.eclipse.osee.framework.skynet.core.event.model.EventModType; +import org.eclipse.osee.framework.ui.plugin.xnavigate.XNavigateComposite.TableLoadOption; import org.eclipse.osee.framework.ui.skynet.ArtifactImageManager; +import org.eclipse.osee.framework.ui.skynet.action.RefreshAction; +import org.eclipse.osee.framework.ui.skynet.artifact.ArtifactTransfer; import org.eclipse.osee.framework.ui.skynet.util.FormsUtil; import org.eclipse.osee.framework.ui.skynet.util.LoadingComposite; import org.eclipse.osee.framework.ui.swt.Displays; @@ -45,17 +60,17 @@ import org.eclipse.osee.framework.ui.swt.ExceptionComposite; import org.eclipse.osee.framework.ui.swt.Widgets; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; +import org.eclipse.swt.dnd.DND; +import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormPage; +import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.progress.UIJob; /** @@ -65,7 +80,8 @@ public class SMAMembersTab extends FormPage implements IWorldViewerEventHandler private final GoalArtifact goalArtifact; private IManagedForm managedForm; private Composite bodyComp; - private SMAGoalMembersSection smaGoalMembersSection; + private ScrolledForm scrolledForm; + private WorldComposite worldComposite; private LoadingComposite loadingComposite; public final static String ID = "ats.members.tab"; private final SMAEditor editor; @@ -84,8 +100,9 @@ public class SMAMembersTab extends FormPage implements IWorldViewerEventHandler super.createFormContent(managedForm); this.managedForm = managedForm; + scrolledForm = managedForm.getForm(); try { - managedForm.getForm().addDisposeListener(new DisposeListener() { + scrolledForm.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { storeScrollLocation(); @@ -93,10 +110,10 @@ public class SMAMembersTab extends FormPage implements IWorldViewerEventHandler }); updateTitleBar(); - bodyComp = managedForm.getForm().getBody(); - GridLayout gridLayout = new GridLayout(1, false); + bodyComp = scrolledForm.getBody(); + GridLayout gridLayout = new GridLayout(1, true); bodyComp.setLayout(gridLayout); - GridData gd = new GridData(SWT.LEFT, SWT.LEFT, true, true); + GridData gd = new GridData(SWT.LEFT, SWT.LEFT, false, false); bodyComp.setLayoutData(gd); setLoading(true); @@ -108,14 +125,14 @@ public class SMAMembersTab extends FormPage implements IWorldViewerEventHandler } private void updateTitleBar() throws OseeCoreException { - if (managedForm != null && Widgets.isAccessible(managedForm.getForm())) { + if (Widgets.isAccessible(scrolledForm)) { String titleString = editor.getTitleStr(); String displayableTitle = Strings.escapeAmpersands(titleString); - if (!managedForm.getForm().getText().equals(displayableTitle)) { - managedForm.getForm().getForm().setText(displayableTitle); + if (!scrolledForm.getText().equals(displayableTitle)) { + scrolledForm.setText(displayableTitle); } - if (!ArtifactImageManager.getImage(goalArtifact).equals(managedForm.getForm().getImage())) { - managedForm.getForm().setImage(ArtifactImageManager.getImage(goalArtifact)); + if (!ArtifactImageManager.getImage(goalArtifact).equals(scrolledForm.getImage())) { + scrolledForm.setImage(ArtifactImageManager.getImage(goalArtifact)); } } } @@ -131,10 +148,11 @@ public class SMAMembersTab extends FormPage implements IWorldViewerEventHandler public void refreshData() { if (Widgets.isAccessible(bodyComp)) { List<IOperation> ops = AtsBulkLoad.getConfigLoadingOperations(); - IOperation operation = new CompositeOperation("Load Members Tab", Activator.PLUGIN_ID, ops); + IOperation operation = Operations.createBuilder("Load Members Tab").addAll(ops).build(); Operations.executeAsJob(operation, false, Job.LONG, reloadAdapter); } } + private final class ReloadJobChangeAdapter extends JobChangeAdapter { private final SMAEditor editor; @@ -154,15 +172,16 @@ public class SMAMembersTab extends FormPage implements IWorldViewerEventHandler public IStatus runInUIThread(IProgressMonitor monitor) { if (firstTime) { try { - if (managedForm != null && Widgets.isAccessible(managedForm.getForm())) { + if (Widgets.isAccessible(scrolledForm)) { updateTitleBar(); setLoading(false); boolean createdAndLoaded = createMembersBody(); if (!createdAndLoaded) { - smaGoalMembersSection.reload(); + reload(); } jumptoScrollLocation(); - FormsUtil.addHeadingGradient(editor.getToolkit(), managedForm.getForm(), true); + FormsUtil.addHeadingGradient(editor.getToolkit(), scrolledForm, true); + refreshToolbar(); editor.onDirtied(); } firstTime = false; @@ -180,7 +199,7 @@ public class SMAMembersTab extends FormPage implements IWorldViewerEventHandler showBusy(false); } if (managedForm != null && Widgets.isAccessible(managedForm.getForm())) { - smaGoalMembersSection.refresh(); + refresh(); } } return Status.OK_STATUS; @@ -192,8 +211,8 @@ public class SMAMembersTab extends FormPage implements IWorldViewerEventHandler private void handleException(Exception ex) { setLoading(false); - if (Widgets.isAccessible(smaGoalMembersSection)) { - smaGoalMembersSection.dispose(); + if (Widgets.isAccessible(worldComposite)) { + worldComposite.dispose(); } OseeLog.log(Activator.class, Level.SEVERE, ex); new ExceptionComposite(bodyComp, ex); @@ -216,30 +235,64 @@ public class SMAMembersTab extends FormPage implements IWorldViewerEventHandler * @return true if created; false if skipped */ private boolean createMembersBody() { - if (!Widgets.isAccessible(smaGoalMembersSection)) { - - smaGoalMembersSection = - new SMAGoalMembersSection("workflow.edtor.members.tab", editor, bodyComp, SWT.NONE, null, goalArtifact); - smaGoalMembersSection.layout(); - smaGoalMembersSection.setFocus(); - - smaGoalMembersSection.getWorldComposite().getWorldXViewer().getTree().addListener(SWT.MouseWheel, - new Listener() { - - @Override - public void handleEvent(Event event) { - ScrolledComposite sc = managedForm.getForm(); - Point origin = sc.getOrigin(); - origin.y -= event.count * 16; - sc.setOrigin(origin); - } - }); - getSite().setSelectionProvider(smaGoalMembersSection.getWorldComposite().getWorldXViewer()); + if (!Widgets.isAccessible(worldComposite)) { + worldComposite = + new WorldComposite("workflow.edtor.members.tab", editor, new GoalXViewerFactory( + (GoalArtifact) editor.getAwa()), bodyComp, SWT.BORDER, false); + + new GoalDragAndDrop(worldComposite, SMAEditor.EDITOR_ID); + + WorldLabelProvider labelProvider = (WorldLabelProvider) worldComposite.getXViewer().getLabelProvider(); + labelProvider.setParentGoal((GoalArtifact) editor.getAwa()); + + GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); + gd.widthHint = 100; + gd.heightHint = 100; + worldComposite.setLayoutData(gd); + + reload(); return true; } return false; } + public void reload() { + if (isTableDisposed()) { + return; + } + Job job = new Job("Load Goal Members") { + + @Override + protected IStatus run(IProgressMonitor monitor) { + if (isTableDisposed()) { + return Status.OK_STATUS; + } + try { + final List<Artifact> artifacts = goalArtifact.getMembers(); + Displays.ensureInDisplayThread(new Runnable() { + @Override + public void run() { + if (isTableDisposed()) { + return; + } + worldComposite.load("Members", artifacts, (CustomizeData) null, TableLoadOption.None); + } + + }); + } catch (OseeCoreException ex) { + OseeLog.log(Activator.class, Level.SEVERE, ex); + return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Exception loading Goal Members", ex); + } + return Status.OK_STATUS; + } + }; + Jobs.startJob(job, false); + } + + private boolean isTableDisposed() { + return worldComposite == null || worldComposite.getXViewer() == null || worldComposite.getXViewer().getTree() == null || worldComposite.getXViewer().getTree().isDisposed(); + } + private void jumptoScrollLocation() { // Jump to scroll location if set Integer selection = guidToScrollLocation.get(goalArtifact.getGuid()); @@ -251,8 +304,8 @@ public class SMAMembersTab extends FormPage implements IWorldViewerEventHandler @Override public void dispose() { - if (smaGoalMembersSection != null) { - smaGoalMembersSection.dispose(); + if (worldComposite != null) { + worldComposite.dispose(); } if (editor.getToolkit() != null) { editor.getToolkit().dispose(); @@ -264,7 +317,6 @@ public class SMAMembersTab extends FormPage implements IWorldViewerEventHandler private void storeScrollLocation() { if (managedForm != null && managedForm.getForm() != null) { Integer selection = managedForm.getForm().getVerticalBar().getSelection(); - // System.out.println("Storing selection => " + selection); guidToScrollLocation.put(goalArtifact.getGuid(), selection); } } @@ -280,7 +332,6 @@ public class SMAMembersTab extends FormPage implements IWorldViewerEventHandler @Override public void run() { Integer selection = guidToScrollLocation.get(goalArtifact.getGuid()); - // System.out.println("Restoring selection => " + selection); // Find the ScrolledComposite operating on the control. ScrolledComposite sComp = null; @@ -307,19 +358,52 @@ public class SMAMembersTab extends FormPage implements IWorldViewerEventHandler } public void refresh() { - if (editor != null && !goalArtifact.isInTransition()) { - // add pages back - refreshData(); + Displays.ensureInDisplayThread(new Runnable() { + + @Override + public void run() { + if (Widgets.isAccessible(worldComposite)) { + updateShown(); + worldComposite.update(); + worldComposite.getXViewer().refresh(); + } + } + }); + } + + private void updateShown() { + List<Artifact> members; + try { + members = goalArtifact.getMembers(); + } catch (OseeCoreException ex) { + OseeLog.log(Activator.class, Level.SEVERE, ex); + return; } + List<Artifact> loadedArtifacts = worldComposite.getLoadedArtifacts(); + List<Artifact> toRemoveFromLoaded = new LinkedList<Artifact>(members); + members.removeAll(loadedArtifacts); + for (Artifact art : members) { + worldComposite.insert(art, -1); + } + loadedArtifacts.removeAll(toRemoveFromLoaded); + worldComposite.getXViewer().remove(loadedArtifacts); + } + + private void refreshToolbar() { + IToolBarManager toolBarMgr = scrolledForm.getToolBarManager(); + toolBarMgr.removeAll(); + toolBarMgr.add(getWorldXViewer().getCustomizeAction()); + toolBarMgr.add(new RefreshAction(worldComposite)); + scrolledForm.updateToolBar(); } - public SMAGoalMembersSection getSmaGoalMembersSection() { - return smaGoalMembersSection; + public WorldComposite getGoalMembersSection() { + return worldComposite; } @Override public WorldXViewer getWorldXViewer() { - return smaGoalMembersSection.getWorldComposite().getWorldXViewer(); + return worldComposite.getWorldXViewer(); } @Override @@ -347,4 +431,74 @@ public class SMAMembersTab extends FormPage implements IWorldViewerEventHandler return editor.isDisposed(); } -}
\ No newline at end of file + private class GoalDragAndDrop extends WorldViewDragAndDrop { + + private boolean isFeedbackAfter = false; + + public GoalDragAndDrop(WorldComposite worldComposite, String viewId) { + super(worldComposite, viewId); + } + + private Artifact getSelectedArtifact(DropTargetEvent event) { + if (event.item != null && event.item.getData() instanceof Artifact) { + return (Artifact) event.item.getData(); + } + return null; + } + + @Override + public void operationChanged(DropTargetEvent event) { + if (!(event.detail == 1)) { + isFeedbackAfter = false; + } else { + isFeedbackAfter = true; + } + } + + @Override + public void performDragOver(DropTargetEvent event) { + if (isValidForArtifactDrop(event)) { + event.detail = DND.DROP_MOVE; + Artifact selectedArtifact = getSelectedArtifact(event); + if (selectedArtifact != null) { + if (isFeedbackAfter) { + event.feedback = DND.FEEDBACK_INSERT_AFTER | DND.FEEDBACK_SCROLL; + } else { + event.feedback = DND.FEEDBACK_INSERT_BEFORE | DND.FEEDBACK_SCROLL; + } + } + } + } + + @Override + public void performDrop(final DropTargetEvent event) { + final ArtifactData artData = ArtifactTransfer.getInstance().nativeToJava(event.currentDataType); + final List<Artifact> droppedArtifacts = Arrays.asList(artData.getArtifacts()); + final Artifact dropTarget = getSelectedArtifact(event); + if (ArtifactTransfer.getInstance().isSupportedType(event.currentDataType)) { + try { + Collections.reverse(droppedArtifacts); + List<Artifact> members = goalArtifact.getMembers(); + for (Artifact dropped : droppedArtifacts) { + if (!members.contains(dropped)) { + goalArtifact.addMember(dropped); + int index = isFeedbackAfter ? members.indexOf(dropTarget) + 1 : members.indexOf(dropTarget); + worldComposite.insert(dropped, index); + worldComposite.update(); + } + if (dropTarget != null) { + goalArtifact.setRelationOrder(AtsRelationTypes.Goal_Member, dropTarget, isFeedbackAfter, dropped); + } + } + goalArtifact.persist(SMAMembersTab.class.getSimpleName()); + worldComposite.getXViewer().refresh(goalArtifact); + worldComposite.getXViewer().update(dropTarget, null); + } catch (OseeCoreException ex) { + OseeLog.log(Activator.class, Level.WARNING, Lib.exceptionToString(ex)); + } + } + } + + } + +} diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAWorkFlowTab.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAWorkFlowTab.java index 4f1e897f520..f054441aba5 100644 --- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAWorkFlowTab.java +++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/editor/SMAWorkFlowTab.java @@ -57,7 +57,6 @@ import org.eclipse.osee.ats.world.IWorldViewerEventHandler; import org.eclipse.osee.ats.world.WorldXViewer; import org.eclipse.osee.ats.world.WorldXViewerEventManager; import org.eclipse.osee.framework.core.exception.OseeCoreException; -import org.eclipse.osee.framework.core.operation.CompositeOperation; import org.eclipse.osee.framework.core.operation.IOperation; import org.eclipse.osee.framework.core.operation.Operations; import org.eclipse.osee.framework.core.util.Result; @@ -120,7 +119,6 @@ public class SMAWorkFlowTab extends FormPage implements IWorldViewerEventHandler private SMAWorkflowMetricsHeader workflowMetricsHeader; private SMADetailsSection smaDetailsSection; private SMARelationsSection smaRelationsSection; - private SMAGoalMembersSection smaGoalMembersSection; private SMAHistorySection smaHistorySection; private LoadingComposite loadingComposite; public final static String ID = "ats.workflow.tab"; @@ -195,7 +193,7 @@ public class SMAWorkFlowTab extends FormPage implements IWorldViewerEventHandler public void refreshData() { List<IOperation> ops = new ArrayList<IOperation>(); ops.addAll(AtsBulkLoad.getConfigLoadingOperations()); - IOperation operation = new CompositeOperation("Load Workflow Tab", Activator.PLUGIN_ID, ops); + IOperation operation = Operations.createBuilder("Load Workflow Tab").addAll(ops).build(); Operations.executeAsJob(operation, false, Job.LONG, new ReloadJobChangeAdapter(editor)); } private final class ReloadJobChangeAdapter extends JobChangeAdapter { @@ -375,7 +373,6 @@ public class SMAWorkFlowTab extends FormPage implements IWorldViewerEventHandler gd.widthHint = 100; headerComp.setLayoutData(gd); headerComp.setLayout(ALayout.getZeroMarginLayout(1, false)); - // mainComp.setBackground(Displays.getSystemColor(SWT.COLOR_RED)); // Display relations try { @@ -545,9 +542,6 @@ public class SMAWorkFlowTab extends FormPage implements IWorldViewerEventHandler if (smaRelationsSection != null) { smaRelationsSection.dispose(); } - if (smaGoalMembersSection != null) { - smaGoalMembersSection.dispose(); - } for (SMAWorkFlowSection section : sections) { section.dispose(); } @@ -577,7 +571,6 @@ public class SMAWorkFlowTab extends FormPage implements IWorldViewerEventHandler @Override public void run() { Integer selection = guidToScrollLocation.get(awa.getGuid()); - // System.out.println("Restoring selection => " + selection); // Find the ScrolledComposite operating on the control. ScrolledComposite sComp = null; @@ -727,9 +720,7 @@ public class SMAWorkFlowTab extends FormPage implements IWorldViewerEventHandler @Override public WorldXViewer getWorldXViewer() { - if (smaGoalMembersSection != null && Widgets.isAccessible(smaGoalMembersSection.getWorldComposite())) { - return smaGoalMembersSection.getWorldComposite().getWorldXViewer(); - } + // do nothing return null; } diff --git a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/goal/GoalXViewerFactory.java b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/goal/GoalXViewerFactory.java index 0c10241b10b..c5e82ac8441 100644 --- a/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/goal/GoalXViewerFactory.java +++ b/plugins/org.eclipse.osee.ats/src/org/eclipse/osee/ats/goal/GoalXViewerFactory.java @@ -122,9 +122,4 @@ public class GoalXViewerFactory extends SkynetXViewerFactory { this.soleGoalArtifact = soleGoalArtifact; } - @Override - public boolean isSearhTop() { - return true; - } - } |