blob: e9026aec265fcaf4896d464af8c8794193449f24 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2008 IBM Corporation and others.
// 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:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.edit.ui;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.ui.viewer.IViewerProvider;
import org.eclipse.emf.common.util.WrappedException;
import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.epf.common.ui.util.MsgBox;
import org.eclipse.epf.library.edit.LibraryEditPlugin;
import org.eclipse.epf.library.edit.LibraryEditResources;
import org.eclipse.epf.library.edit.TngAdapterFactory;
import org.eclipse.epf.library.edit.process.BSActivityItemProvider;
import org.eclipse.epf.library.edit.util.ExposedAdapterFactory;
import org.eclipse.epf.library.edit.util.ExtensionManager;
import org.eclipse.epf.library.edit.util.IRunnableWithProgress;
import org.eclipse.epf.library.edit.util.ProcessUtil;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.uma.Activity;
import org.eclipse.epf.uma.BreakdownElement;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.Process;
import org.eclipse.epf.uma.ProcessComponent;
import org.eclipse.epf.uma.Role;
import org.eclipse.epf.uma.TeamProfile;
import org.eclipse.epf.uma.VariabilityType;
import org.eclipse.epf.uma.WorkProduct;
import org.eclipse.epf.uma.util.MessageException;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.operation.ModalContext;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.progress.WorkbenchJob;
/**
* @author Phong Nguyen Le
* @since 1.5
*
*/
public class UIHelper implements IUIHelper {
/**
* Get teams in scope
*
* @param adapterFactory
* @param e
* @param role
* @param teamList
*/
private static void getTeamsInScope(AdapterFactory adapterFactory,
BreakdownElement e, Role role, List teamList) {
// get children for activity
ITreeItemContentProvider itemProvider = (ITreeItemContentProvider) adapterFactory
.adapt(e, ITreeItemContentProvider.class);
Collection children = itemProvider.getChildren(e);
for (Iterator itor = children.iterator(); itor.hasNext();) {
Object obj = itor.next();
if (obj instanceof TeamProfile) {
TeamProfile team = (TeamProfile) obj;
List allTeams = new ArrayList();
// get all sub teams as well
ProcessUtil.getAllSubTeams(team, allTeams);
for (Iterator teamItor = allTeams.iterator(); teamItor
.hasNext();) {
Object o = teamItor.next();
if (o instanceof TeamProfile) {
// get roles from teams
List roles = ProcessUtil.getRoles(((TeamProfile) o)
.getTeamRoles());
if (roles.contains(role)) {
teamList.add(o);
}
}
}
}
}
// get parent
Object currentParent = itemProvider.getParent(e);
if (currentParent != null) {
// go up
getTeamsInScope(adapterFactory, (BreakdownElement) currentParent,
role, teamList);
}
}
/* (non-Javadoc)
* @see org.eclipse.epf.library.edit.util.IUIHelper#getTeam(org.eclipse.epf.uma.Activity, org.eclipse.epf.uma.Role, java.lang.Object)
*/
public TeamProfile getTeam(Activity activity, Role role, Object UIContext) {
List teamList = new ArrayList();
AdapterFactory adapterFactory = TngAdapterFactory.INSTANCE
.getOBS_ComposedAdapterFactory();
// find out all team in visible scope
getTeamsInScope(adapterFactory, activity, role, teamList);
if (teamList.size() == 1) {
return (TeamProfile) teamList.get(0);
}
if (teamList.size() > 1) {
return TeamSelection.getSelectedTeam(teamList, role,
UIContext instanceof Shell ? (Shell) UIContext : null);
}
// there are no teams to assign
return null;
}
/* (non-Javadoc)
* @see org.eclipse.epf.library.edit.util.IUIHelper#runInModalContext(org.eclipse.epf.library.edit.util.IRunnableWithProgress, boolean, org.eclipse.core.runtime.IProgressMonitor, java.lang.Object)
*/
public IStatus runInModalContext(final IRunnableWithProgress operation,
boolean fork, IProgressMonitor monitor, Object uiContext) {
org.eclipse.jface.operation.IRunnableWithProgress op = new org.eclipse.jface.operation.IRunnableWithProgress() {
public void run(IProgressMonitor monitor)
throws InvocationTargetException, InterruptedException {
operation.run(monitor);
}
};
try {
ModalContext.run(op, true, monitor, ((Shell)uiContext)
.getDisplay());
return Status.OK_STATUS;
} catch (Exception e) {
LibraryEditPlugin.INSTANCE.log(e);
Throwable ex;
if (e instanceof InvocationTargetException) {
ex = ((InvocationTargetException) e)
.getTargetException();
} else {
ex = e;
}
String msg = TngUtil.toStackTraceString(ex);
return new Status(IStatus.ERROR,
LibraryEditPlugin.INSTANCE.getSymbolicName(), 0,
msg, ex);
}
}
public List selectTasks(List taskList, WorkProduct wp) {
ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
TngAdapterFactory.INSTANCE
.getNavigatorView_ComposedAdapterFactory()) {
public String getColumnText(Object obj, int column) {
if (obj instanceof MethodElement) {
return TngUtil.getPresentationName(obj);
}
return super.getText(obj);
}
};
IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
TngAdapterFactory.INSTANCE
.getNavigatorView_ComposedAdapterFactory()) {
public Object[] getElements(Object object) {
return ((List) object).toArray();
}
};
try {
ProcessListSelectionDialog dlg = new ProcessListSelectionDialog(
PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getShell(),
taskList,
contentProvider,
labelProvider,
NLS
.bind(
LibraryEditResources.ui_UserInteractionHelper_wplistdlg_msg,
wp.getName()));
dlg.setTitle(LibraryEditResources.ui_UserInteractionHelper_tasks);
dlg.setBlockOnOpen(true);
dlg.open();
Object[] objs = dlg.getResult();
List selectedTasks = new ArrayList();
if ((objs != null) && (objs.length > 0)) {
for (int i = 0; i < objs.length; i++) {
selectedTasks.add(objs[i]);
}
}
return selectedTasks;
} finally {
// dispose
labelProvider.dispose();
contentProvider.dispose();
}
}
public List selectWorkProducts(List wpList, Role role) {
ILabelProvider labelProvider = new AdapterFactoryLabelProvider(
TngAdapterFactory.INSTANCE
.getNavigatorView_ComposedAdapterFactory()) {
public String getColumnText(Object obj, int column) {
if (obj instanceof MethodElement) {
return TngUtil.getPresentationName(obj);
}
return super.getText(obj);
}
};
IStructuredContentProvider contentProvider = new AdapterFactoryContentProvider(
TngAdapterFactory.INSTANCE
.getNavigatorView_ComposedAdapterFactory()) {
public Object[] getElements(Object object) {
return ((List) object).toArray();
}
};
try {
ProcessListSelectionDialog dlg = new ProcessListSelectionDialog(
PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getShell(),
// MsgBox.getDefaultShell(),
wpList,
contentProvider,
labelProvider,
NLS
.bind(
LibraryEditResources.ui_UserInteractionHelper_rolelistdlg_msg,
role.getName()));
dlg
.setTitle(LibraryEditResources.ui_UserInteractionHelper_workproducts);
dlg.setBlockOnOpen(true);
dlg.open();
Object[] objs = dlg.getResult();
List selectedWps = new ArrayList();
if ((objs != null) && (objs.length > 0)) {
for (int i = 0; i < objs.length; i++) {
selectedWps.add(objs[i]);
}
}
return selectedWps;
} finally {
// dispose
labelProvider.dispose();
contentProvider.dispose();
}
}
private static class RunnableWithProgress implements org.eclipse.jface.operation.IRunnableWithProgress {
private IRunnableWithProgress operation;
public RunnableWithProgress(IRunnableWithProgress op) {
this.operation = op;
}
public void run(IProgressMonitor monitor)
throws InvocationTargetException, InterruptedException {
operation.run(monitor);
}
}
public IStatus runAsJob(final IRunnableWithProgress runnable, String taskName,
Object shell) {
Job job = new WorkspaceJob(taskName) {
public IStatus runInWorkspace(IProgressMonitor monitor)
throws CoreException {
try {
// monitor.beginTask(taskName, IProgressMonitor.UNKNOWN);
runnable.run(monitor);
return Status.OK_STATUS;
} catch (InvocationTargetException e) {
Throwable ex;
if (e.getCause() != null) {
ex = e.getCause();
} else {
ex = e;
}
return new Status(IStatus.ERROR, LibraryEditPlugin
.getPlugin().getId(), 0, ex.toString(), ex);
} catch (InterruptedException e) {
return new Status(IStatus.ERROR, LibraryEditPlugin
.getPlugin().getId(), 0, e.toString(), e);
} finally {
monitor.done();
}
}
};
PlatformUI.getWorkbench().getProgressService().showInDialog((Shell) shell, job);
job.schedule();
return job.getResult();
}
public boolean runInUI(IRunnableWithProgress runnable,
ISchedulingRule rule, Object shell) {
if (shell == null) {
shell = LibraryEditPlugin.getDefault().getContext();
}
IRunnableContext context = new ProgressMonitorDialog((Shell) shell);
try {
PlatformUI.getWorkbench().getProgressService().runInUI(context,
new RunnableWithProgress(runnable), rule);
return true;
} catch (Exception e) {
LibraryEditPlugin.getDefault().getLogger().logError(e);
String title = LibraryEditResources.errorDialog_title;
ExtensionManager.getDefaultUserInteractionHandler().getMessenger()
.showError(title, e.toString(), null, e);
// LibraryEditPlugin.getDefault().getMsgDialog().displayError(title,
// e.toString(), e);
}
return false;
}
public static boolean runWithProgress(final IRunnableWithProgress runnable,
final IRunnableContext runnableContext, final boolean canCancel, final String msg) {
final MultiStatus status = new MultiStatus(LibraryEditPlugin.INSTANCE
.getSymbolicName(), IStatus.OK,
LibraryEditResources.error_reason, null);
final org.eclipse.jface.operation.IRunnableWithProgress operation = new org.eclipse.jface.operation.IRunnableWithProgress() {
public void run(IProgressMonitor monitor)
throws InvocationTargetException, InterruptedException {
monitor.beginTask(msg, IProgressMonitor.UNKNOWN);
monitor.subTask(""); //$NON-NLS-1$
try {
runnable.run(monitor);
} catch (RuntimeException e) {
String msg;
if (e instanceof MessageException) {
msg = e.getMessage();
} else {
StringWriter strWriter = new StringWriter();
e.printStackTrace(new PrintWriter(strWriter));
msg = strWriter.toString();
}
status.add(new Status(IStatus.ERROR,
LibraryEditPlugin.INSTANCE.getSymbolicName(), 0,
msg, e));
} finally {
monitor.done();
}
}
};
try {
if (Display.getCurrent() == null) {
// current thread is not a user-interface thread
//
Display.getDefault().syncExec(new Runnable() {
public void run() {
try {
runnableContext.run(true, canCancel, operation);
} catch (Exception e) {
LibraryEditPlugin.getDefault().getLogger().logError(e);
}
}
});
} else {
runnableContext.run(true, canCancel, operation);
}
if (!status.isOK()) {
ExtensionManager.getDefaultUserInteractionHandler()
.getMessenger().showError(
LibraryEditResources.errorDialog_title,
LibraryEditResources.error_msgWithDetails,
status);
} else {
return true;
}
} catch (Exception exception) {
// Something went wrong that shouldn't.
//
LibraryEditPlugin.getDefault().getLogger().logError(exception);
}
return false;
}
public boolean runWithProgress(IRunnableWithProgress runnable,
boolean canCancel, String msg) {
return runWithProgress(runnable, getRunnableContext(), false, msg);
}
public IRunnableContext getRunnableContext() {
Shell shell;
Object uiCtx = ExtensionManager.getDefaultUserInteractionHandler().getUIContext();
if (uiCtx instanceof Shell) {
shell = (Shell) uiCtx;
} else {
shell = MsgBox.getDefaultShell();
}
return new ProgressMonitorDialog(shell);
}
public static Viewer doGetViewer(AdapterFactory adapterFactory, Process proc) {
if (adapterFactory instanceof ExposedAdapterFactory) {
for (Iterator iter = Collections.unmodifiableList(
((ExposedAdapterFactory) adapterFactory)
.getChangeListeners()).iterator(); iter.hasNext();) {
Object listener = iter.next();
if (listener instanceof IContentProvider && listener instanceof IViewerProvider) {
Viewer viewer = ((IViewerProvider) listener).getViewer();
if (viewer.getInput() instanceof ProcessComponent
&& ((ProcessComponent) viewer.getInput())
.getProcess() == proc)
return viewer;
}
}
}
return null;
}
public boolean refreshNeeded(AdapterFactory adapterFactory,
BSActivityItemProvider itemProvider) {
Process process = (Process) itemProvider.getTopItem();
if (process == null)
return false;
// check if the given process is currently opened in editor
//
Viewer viewer = doGetViewer(adapterFactory, process);
if (viewer != null && viewer.getControl() != null
&& !viewer.getControl().isDisposed()) {
return true;
}
for (Iterator iter = TngUtil.getContributors(process); iter.hasNext();) {
Object element = iter.next();
BSActivityItemProvider adapter = (BSActivityItemProvider) adapterFactory
.adapt(element, ITreeItemContentProvider.class);
if (refreshNeeded(adapterFactory, adapter))
return true;
}
for (Iterator iter = TngUtil.getGeneralizers(process,
VariabilityType.EXTENDS); iter.hasNext();) {
Object element = iter.next();
BSActivityItemProvider adapter = (BSActivityItemProvider) adapterFactory
.adapt(element, ITreeItemContentProvider.class);
if (refreshNeeded(adapterFactory, adapter))
return true;
}
return false;
}
public void refreshAllViewers(final ExposedAdapterFactory adapterFactory) {
UserInteractionHelper.getUIHelper().runSafely(new Runnable() {
public void run() {
for (Iterator iter = Collections.unmodifiableList(
adapterFactory.getChangeListeners()).iterator(); iter.hasNext();) {
Object listener = iter.next();
if (listener instanceof IContentProvider && listener instanceof IViewerProvider) {
Viewer viewer = ((IViewerProvider) listener).getViewer();
if (viewer != null && viewer.getControl() != null
&& !viewer.getControl().isDisposed()
&& viewer.getInput() instanceof ProcessComponent) {
viewer.refresh();
}
}
}
}
}, true);
}
public void refreshViewer(AdapterFactory factory, Process proc) {
final Viewer viewer = doGetViewer(factory, proc);
if (viewer != null && viewer.getControl() != null
&& !viewer.getControl().isDisposed()) {
UserInteractionHelper.getUIHelper().runSafely(new Runnable() {
public void run() {
viewer.refresh();
}
}, true);
}
}
public void refreshIDsInViewer(final ExposedAdapterFactory adapterFactory) {
UserInteractionHelper.getUIHelper().runSafely(new Runnable() {
public void run() {
for (Iterator iter = Collections.unmodifiableList(
adapterFactory.getChangeListeners()).iterator(); iter.hasNext();) {
Object listener = iter.next();
if (listener instanceof IContentProvider && listener instanceof IViewerProvider) {
Viewer viewer = ((IViewerProvider) listener).getViewer();
if (viewer != null && viewer.getControl() != null
&& !viewer.getControl().isDisposed()
&& viewer.getInput() instanceof ProcessComponent) {
Process proc = ((ProcessComponent) viewer.getInput())
.getProcess();
BSActivityItemProvider itemProvider = (BSActivityItemProvider) adapterFactory
.adapt(proc, ITreeItemContentProvider.class);
if (itemProvider.isRefreshAllIDsRequired()) {
ProcessUtil.updateIDs(adapterFactory, proc);
viewer.refresh();
itemProvider.setRefreshAllIDsRequired(false);
}
}
}
}
}
}, true);
}
public Object getViewer(AdapterFactory adapterFactory, Process proc) {
return doGetViewer(adapterFactory, proc);
}
public void runSafely(final Runnable runnable, boolean synchronous) {
Display display = null;
try {
display = Display.getCurrent();
} catch (Exception e) {
//
}
Runnable runner = new Runnable() {
public void run() {
try {
runnable.run();
} catch (Exception e) {
LibraryEditUIPlugin.getDefault().getLogger().logError(e);
}
}
};
if(display == null) {
// current thread is not a user-interface thread
//
try {
display = Display.getDefault();
}
catch(Exception e) {
}
if(display != null) {
if(synchronous) {
display.syncExec(runner);
}
else {
display.asyncExec(runner);
}
}
else {
runner.run();
}
}
else {
// current thread is a user-interface thread
//
if(synchronous) {
runner.run();
}
else {
display.asyncExec(runner);
}
}
}
public void runWithBusyIndicator(Runnable runnable) {
BusyIndicator.showWhile(Display.getCurrent(), runnable);
}
public void runInUI(final IRunnableWithProgress runnable, String taskName) {
Shell shell = (Shell) LibraryEditPlugin.getDefault().getContext();
if (shell == null) {
try {
runnable.run(new NullProgressMonitor());
return;
} catch (Exception e) {
LibraryEditPlugin.getDefault().getLogger().logError(e);
throw new WrappedException(e);
}
}
Job job = new WorkbenchJob(taskName) {
public IStatus runInUIThread(IProgressMonitor monitor) {
monitor.beginTask("", IProgressMonitor.UNKNOWN); //$NON-NLS-1$
try {
runnable.run(monitor);
return Status.OK_STATUS;
} catch (InvocationTargetException e) {
Throwable ex;
if (e.getCause() != null) {
ex = e.getCause();
} else {
ex = e;
}
return new Status(IStatus.ERROR, LibraryEditPlugin
.getPlugin().getId(), 0, ex.toString(), ex);
} catch (InterruptedException e) {
return new Status(IStatus.ERROR, LibraryEditPlugin
.getPlugin().getId(), 0, e.toString(), e);
} finally {
monitor.done();
}
}
};
PlatformUI.getWorkbench().getProgressService().showInDialog(shell, job);
job.schedule();
}
}