blob: bb42e3246f55f90b3a406c04f283f88afc4f7a93 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 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.authoring.ui.util;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
import org.eclipse.epf.authoring.ui.AuthoringUIResources;
import org.eclipse.epf.authoring.ui.editors.BreakdownElementEditorInput;
import org.eclipse.epf.common.ui.util.MsgBox;
import org.eclipse.epf.common.utils.StrUtil;
import org.eclipse.epf.diagram.core.part.AbstractDiagramEditor;
import org.eclipse.epf.diagram.core.part.DiagramEditorInput;
import org.eclipse.epf.diagram.core.part.DiagramEditorInputProxy;
import org.eclipse.epf.diagram.ui.service.DiagramEditorHelper;
import org.eclipse.epf.library.edit.IModifyChecker;
import org.eclipse.epf.library.edit.LibraryEditResources;
import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
import org.eclipse.epf.library.edit.util.MethodElementUtil;
import org.eclipse.epf.library.edit.util.PracticePropUtil;
import org.eclipse.epf.library.edit.util.ProcessUtil;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.library.edit.validation.DependencyChecker;
import org.eclipse.epf.library.edit.validation.IValidator;
import org.eclipse.epf.library.edit.validation.internal.ContentElementNameValidator;
import org.eclipse.epf.library.edit.validation.internal.ValidatorFactory;
import org.eclipse.epf.library.services.SafeUpdateController;
import org.eclipse.epf.library.ui.LibraryUIText;
import org.eclipse.epf.uma.Activity;
import org.eclipse.epf.uma.ContentElement;
import org.eclipse.epf.uma.Deliverable;
import org.eclipse.epf.uma.Guidance;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.Practice;
import org.eclipse.epf.uma.UmaPackage;
import org.eclipse.epf.uma.VariabilityElement;
import org.eclipse.epf.uma.VariabilityType;
import org.eclipse.epf.uma.WorkProduct;
import org.eclipse.epf.uma.util.UserDefinedTypeMeta;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.osgi.util.TextProcessor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
/**
* Helper Utility class for UI
*
* @author Shilpa Toraskar
* @author Phong Nguyen Le
* @since 1.0
*/
public class UIHelper {
/**
* Setting items in a table
*
* @param table
* @param items
*/
public static void setItems(Table table, ArrayList items) {
table.removeAll();
for (int i = 0; i < items.size(); i++) {
TableItem item = new TableItem(table, SWT.NONE);
item.setText((String) items.get(i));
}
}
/**
* Create list on the given composite with given style
* @param toolkit
* @param parent
* @param style
*/
public static List createList(FormToolkit toolkit, Composite parent,
int style) {
List list = new List(parent, style | SWT.NULL);
toolkit.adapt(list, true, true);
return list;
}
/*
* Method will return Object[] of guidance excluding Practice.
* MethodElementUtil#getSelectedGuidances(EObject) calculates all guidance.
*/
public static Object[] getSelectedGuidances(ContentElement contentElement) {
java.util.List list = MethodElementUtil
.getSelectedGuidances(contentElement);
for (Iterator it = list.iterator(); it.hasNext();) {
Object obj = it.next();
if (obj instanceof Practice)
it.remove();
}
return list.toArray();
}
private static String getFormPageTitlePrefixFor(MethodElement methodElement) {
String elementLabel = LibraryUIText.getUIText(methodElement);
if (methodElement instanceof WorkProduct) {
return LibraryUIText.TEXT_WORK_PRODUCT + " (" + elementLabel + ")"; //$NON-NLS-1$ //$NON-NLS-2$
} else if (methodElement instanceof Guidance) {
if (methodElement instanceof Practice) {
Practice prac = (Practice)methodElement;
if (PracticePropUtil.getPracticePropUtil().isUdtType(prac)) {
elementLabel = getNameForUtd(prac);
return elementLabel;
}
}
return LibraryUIText.TEXT_GUIDANCE + " (" + elementLabel + ")"; //$NON-NLS-1$ //$NON-NLS-2$
} else {
return elementLabel;
}
}
private static String getNameForUtd(Practice prac) {
try {
String typeName = PracticePropUtil.getPracticePropUtil().getUtdData(prac)
.getRteNameMap().get(UserDefinedTypeMeta._typeName);
return typeName;
} catch (Exception e) {
AuthoringUIPlugin.getDefault().getLogger().logError(e);
}
return null;
}
/**
* Sets text for the given form based on the given element, including variable information of the element
* if there is any.
*
* @param form
* @param element
*/
public static void setFormText(ScrolledForm form, MethodElement element) {
String delimiter = ". , ; ! ? ~ @ # $ % ^ & * ( ) { } [ ] < > \\ / \" ' ` | "; //$NON-NLS-1$
if (form != null && !form.isDisposed()) {
StringBuffer str = new StringBuffer();
str.append(getFormPageTitlePrefixFor(element));
str.append(AuthoringUIResources.editor_title_colon_with_spaces);
if(element instanceof VariabilityElement) {
str.append(TngUtil.getLabel((VariabilityElement) element,
"", true)); //$NON-NLS-1$
}
else if(element.getName() != null){
str.append(element.getName());
}
form.setText(TextProcessor.process(str.toString(), delimiter));
}
}
/**
* Check whether given deliverables leads to circular dependency
* @param toBePart
* @param deliverable
* @return
* Boolean value to indicate whether cicular dependency is detected
* @deprecated moved to {@link DependencyChecker#checkCircularDeliverables(Deliverable, Deliverable)}
*/
public static boolean checkCircularDeliverables(Deliverable toBePart,
Deliverable deliverable) {
return DependencyChecker.checkCircularDeliverables(toBePart, deliverable);
}
/**
* Check whether deliverable parts are in chain
*
* @param e
* @param roots
*/
public static void deliverablePartsChain(Deliverable e, java.util.List roots) {
java.util.List list = e.getDeliveredWorkProducts();
if (list != null && list.size() > 0) {
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
Object obj = iterator.next();
if (obj instanceof Deliverable) {
roots.add(obj);
deliverablePartsChain((Deliverable) obj, roots);
}
}
}
}
/**
* Resolve content element name conflicts
* @param container
* @param element
* @param reference
*/
public static String resolveContentElementNameConflict(EObject container, MethodElement element, EReference
reference) {
final IValidator validator = new ContentElementNameValidator(container
, reference,
(ContentElement) element, new ValidatorFactory.TypeFilter(element));
String msg = validator.isValid(element.getName());
if (msg != null) {
String featureTxt = TngUtil.getFeatureText(UmaPackage.eINSTANCE
.getNamedElement_Name());
String title = LibraryEditResources.resolveNameConflictDialog_title;
String dlgMsg = NLS.bind(
LibraryEditResources.resolveNameConflictDialog_text,
StrUtil.toLower(featureTxt), element.getName());
String currentValue = (String) element.eGet(UmaPackage.eINSTANCE
.getNamedElement_Name());
IInputValidator inputValidator = new IInputValidator() {
public String isValid(String newText) {
return validator.isValid(newText);
}
};
InputDialog inputDlg = new InputDialog(
MsgBox.getDefaultShell(), title, dlgMsg, currentValue,
inputValidator);
if (inputDlg.open() == Window.CANCEL) {
throw new OperationCanceledException();
}
return inputDlg.getValue();
}
return null;
}
/**
* Diagram editors of object itself will be closed. And Parent diagram editors
* will be refreshed.
* @deprecated (see: {@link DiagramEditorHelper} - refreshParentDiagramEditors())
*/
public static void refreshOpenDiagramEditorsOfParent(Object refreshElement, java.util.List openEditorRefs) {
openEditorRefs = new ArrayList();
// Now refresh object's parent's diagrams.
IWorkbenchPage workbenchPage = AuthoringUIPlugin.getDefault()
.getWorkbench().getActiveWorkbenchWindow()
.getActivePage();
IEditorReference[] editorReferences = workbenchPage
.getEditorReferences();
for (int i = 0; i < editorReferences.length; i++) {
IEditorReference reference = editorReferences[i];
IEditorPart editor = reference.getEditor(true);
if (editor != null) {
IEditorInput input = editor.getEditorInput();
Object element = null;
if (input instanceof BreakdownElementEditorInput) {
BreakdownElementEditorInput binput = (BreakdownElementEditorInput)input;
if (binput.getWrapper() != null) {
element = binput.getWrapper();
if(element instanceof BreakdownElementWrapperItemProvider){
Object parent = ((BreakdownElementWrapperItemProvider)element).getParent(null);
if(parent instanceof BreakdownElementWrapperItemProvider){
if(element.equals(refreshElement))
refreshOpenDiagramEditorsOfParent(parent, openEditorRefs);
}
}
} else {
element = binput.getMethodElement();
}
}
else if (input instanceof DiagramEditorInputProxy) {
DiagramEditorInput diagramInput = ((DiagramEditorInputProxy) input).getDiagramEditorInput();
if (diagramInput != null) {
element = diagramInput.getMethodElement();
}
}
if (element != null)
{
if(element instanceof Activity){
if(((Activity)element).getBreakdownElements().contains(refreshElement))
openEditorRefs.add(reference);
else if(refreshElement instanceof BreakdownElementWrapperItemProvider){
Object localRefreshElement = refreshElement;
while((localRefreshElement instanceof BreakdownElementWrapperItemProvider)
&& ((BreakdownElementWrapperItemProvider)localRefreshElement).getOwner()!= null){
if(((BreakdownElementWrapperItemProvider)localRefreshElement).getOwner()
.equals(element)){
openEditorRefs.add(reference);
}
localRefreshElement = ((BreakdownElementWrapperItemProvider)localRefreshElement).getOwner();
}
}
}else if(element instanceof BreakdownElementWrapperItemProvider){
Collection c = ((BreakdownElementWrapperItemProvider)element).getChildren(element);
if(c != null && c.contains(refreshElement)){
openEditorRefs.add(reference);
}
}
}
}
}
int size = openEditorRefs.size();
//IEditorReference[] references = new IEditorReference[size];
for (int i = 0; i < size; i++) {
IEditorReference reference = (IEditorReference) openEditorRefs.get(i);
IEditorPart editor = reference.getEditor(true);
if(editor instanceof AbstractDiagramEditor ){
((AbstractDiagramEditor)editor).refreshDiagram();
}
}
}
/**
* Close diagram editors including parent editors
* @param closeElement
* @param closeEditorRefs
* @deprecated
*/
public static void closeDiagramEditorsIncludingParent(Object closeElement, java.util.List closeEditorRefs) {
closeEditorRefs = new ArrayList();
IWorkbenchPage workbenchPage = AuthoringUIPlugin.getDefault()
.getWorkbench().getActiveWorkbenchWindow()
.getActivePage();
IEditorReference[] editorReferences = workbenchPage
.getEditorReferences();
for (int i = 0; i < editorReferences.length; i++) {
IEditorReference reference = editorReferences[i];
IEditorPart editor = reference.getEditor(true);
if (editor != null) {
IEditorInput input = editor.getEditorInput();
Object element = null;
if (input instanceof BreakdownElementEditorInput) {
BreakdownElementEditorInput binput = (BreakdownElementEditorInput)input;
if (binput.getWrapper() != null) {
element = binput.getWrapper();
if(element instanceof BreakdownElementWrapperItemProvider){
Object parent = ((BreakdownElementWrapperItemProvider)element).getParent(null);
if(parent instanceof BreakdownElementWrapperItemProvider){
if(element.equals(closeElement))
closeDiagramEditorsIncludingParent(parent, closeEditorRefs);
}
}
} else {
element = binput.getMethodElement();
}
}
else if (input instanceof DiagramEditorInputProxy) {
DiagramEditorInput diagramInput = ((DiagramEditorInputProxy) input).getDiagramEditorInput();
if (diagramInput != null) {
element = diagramInput.getMethodElement();
}
}
if (element != null)
{
//closeEditorRefs.add(reference);
if(element instanceof Activity){
if(element.equals(closeElement))
closeEditorRefs.add(reference);
if(((Activity)element).getBreakdownElements().contains(closeElement))
closeEditorRefs.add(reference);
else if(closeElement instanceof BreakdownElementWrapperItemProvider){
if(((BreakdownElementWrapperItemProvider)closeElement).getOwner()
!= null)
if(((BreakdownElementWrapperItemProvider)closeElement).getOwner()
.equals(element)){
closeEditorRefs.add(reference);
if(((BreakdownElementWrapperItemProvider)closeElement).getOwner()
instanceof BreakdownElementWrapperItemProvider){
if(((BreakdownElementWrapperItemProvider)((BreakdownElementWrapperItemProvider)
closeElement).getOwner()).getOwner().equals(element))
closeEditorRefs.add(reference);
}
}
}
}else if(element instanceof BreakdownElementWrapperItemProvider){
Collection c = ((BreakdownElementWrapperItemProvider)element).getChildren(element);
if(c != null && c.contains(closeElement)){
closeEditorRefs.add(reference);
}
}
}
}
}
int size = closeEditorRefs.size();
IEditorReference[] references = new IEditorReference[size];
for (int i = 0; i < size; i++) {
references[i] = (IEditorReference) closeEditorRefs.get(i);
}
workbenchPage.closeEditors(references, false);
}
/**
* Get base activity for the given activity
* @param activity
* @return
* Base activity
*/
public static VariabilityElement getBaseActivity(Activity activity){
while (!activity.getVariabilityType().equals(
VariabilityType.NA)) {
VariabilityElement ve = activity
.getVariabilityBasedOnElement();
if ((ve != null) && (ve instanceof Activity)) {
activity = (Activity) ve;
} else {
break;
}
}
return activity;
}
/**
* Close diagram editors
*
* @param closeElement
* @param closeEditorRefs
* @deprecated (see: {@link DiagramEditorHelper})
*
*/
public static void closeDiagramEditors(Object closeElement, java.util.List closeEditorRefs) {
closeEditorRefs = new ArrayList();
IWorkbenchPage workbenchPage = AuthoringUIPlugin.getDefault()
.getWorkbench().getActiveWorkbenchWindow()
.getActivePage();
IEditorReference[] editorReferences = workbenchPage
.getEditorReferences();
for (int i = 0; i < editorReferences.length; i++) {
IEditorReference reference = editorReferences[i];
IEditorPart editor = reference.getEditor(true);
if (editor != null) {
IEditorInput input = editor.getEditorInput();
Object element = null;
if (input instanceof BreakdownElementEditorInput) {
BreakdownElementEditorInput binput = (BreakdownElementEditorInput)input;
if (binput.getWrapper() != null) {
element = binput.getWrapper();
if(element instanceof BreakdownElementWrapperItemProvider){
Object parent = ((BreakdownElementWrapperItemProvider)element).getParent(element);
if(parent instanceof BreakdownElementWrapperItemProvider){
if(element.equals(closeElement))
closeDiagramEditors(parent, closeEditorRefs);
}
}
} else {
element = binput.getMethodElement();
}
}
else if (input instanceof DiagramEditorInputProxy) {
DiagramEditorInput diagramInput = ((DiagramEditorInputProxy) input).getDiagramEditorInput();
if (diagramInput != null) {
element = diagramInput.getMethodElement();
}
}
if (element != null) {
if (element.equals(closeElement)) {
closeEditorRefs.add(reference);
} else {
// check whether element is child of closeElement
// directly/indirectly
if (closeElement instanceof Activity) {
Collection collection = new ArrayList();
ProcessUtil.getChildElements(
(Activity) closeElement, Activity.class,
collection);
if (collection.contains(element)) {
closeEditorRefs.add(reference);
}
}
}
}
}
}
int size = closeEditorRefs.size();
IEditorReference[] references = new IEditorReference[size];
for (int i = 0; i < size; i++) {
references[i] = (IEditorReference) closeEditorRefs.get(i);
}
workbenchPage.closeEditors(references, false);
references = null;
}
/**
* Diagram editors of object itself will be closed. And Parent diagram editors
* will be refreshed. code not tested use refreshOpenDiagramEditors method.
* Not used currently
* @param object
*/
public static void syncDiagramEditors(Object object) {
java.util.List closeEditors = new ArrayList();
java.util.List refreshEditors = new ArrayList();
IWorkbenchPage workbenchPage = AuthoringUIPlugin.getDefault()
.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IEditorReference[] editorReferences = workbenchPage
.getEditorReferences();
for (int i = 0; i < editorReferences.length; i++) {
IEditorReference reference = editorReferences[i];
IEditorPart editor = reference.getEditor(true);
if (editor != null) {
IEditorInput input = editor.getEditorInput();
Object editorElement = null;
if (input instanceof BreakdownElementEditorInput) {
BreakdownElementEditorInput binput = (BreakdownElementEditorInput)input;
if(binput.getWrapper() != null){
editorElement = binput.getWrapper();
}else{
editorElement = binput.getMethodElement();
}
}
else if (input instanceof DiagramEditorInputProxy) {
DiagramEditorInput diagramInput = ((DiagramEditorInputProxy) input).getDiagramEditorInput();
if (diagramInput != null) {
editorElement = diagramInput.getMethodElement();
}
}
if(editorElement != null){
if(editorElement.equals(object)){
closeEditors.add(reference);
}else{
if(editorElement instanceof Activity){
if(((Activity)editorElement).getBreakdownElements().contains(object))
refreshEditors.add(reference);
else if(object instanceof BreakdownElementWrapperItemProvider){
Object local = object;
while((local instanceof BreakdownElementWrapperItemProvider)
&& ((BreakdownElementWrapperItemProvider)local).getOwner()!= null){
if(((BreakdownElementWrapperItemProvider)local).getOwner()
.equals(editorElement)){
refreshEditors.add(reference);
}
local = ((BreakdownElementWrapperItemProvider)local).getOwner();
}
}
}else if(editorElement instanceof BreakdownElementWrapperItemProvider){
Collection c = ((BreakdownElementWrapperItemProvider)editorElement).getChildren(editorElement);
if(c != null && c.contains(object)){
refreshEditors.add(reference);
}
}
}
}
}
}
// Close editor references and refresh editors.
int size = closeEditors.size();
IEditorReference[] references = new IEditorReference[size];
for (int i = 0; i < size; i++) {
references[i] = (IEditorReference) closeEditors.get(i);
}
workbenchPage.closeEditors(references, false);
references = null;
size = refreshEditors.size();
//IEditorReference[] references = new IEditorReference[size];
for (int i = 0; i < size; i++) {
IEditorReference reference = (IEditorReference) refreshEditors.get(i);
IEditorPart editor = reference.getEditor(true);
if(editor instanceof AbstractDiagramEditor ){
((AbstractDiagramEditor)editor).refreshDiagram();
}
}
}
public static void showProblemsView() {
SafeUpdateController
.asyncExec(new Runnable() {
public void run() {
try {
if (PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null &&
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() != null) {
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IViewPart view = page.findView(IPageLayout.ID_PROBLEM_VIEW);
if (view == null) {
page.showView(IPageLayout.ID_PROBLEM_VIEW, null, IWorkbenchPage.VIEW_VISIBLE);
}
}
} catch (Exception e) {
// couldn't open the
// problem view, too
// bad..
AuthoringUIPlugin.getDefault().getLogger().logError(e);
}
}
});
}
public static boolean checkModify(Resource res, Shell shell) {
return checkModify(Collections.singleton(res), shell);
}
public static class ModifyChecker implements IModifyChecker {
private Shell shell;
public ModifyChecker(Shell shell) {
this.shell = shell;
}
public boolean checkModify(Resource res) {
return UIHelper.checkModify(res, shell);
}
public boolean checkModify(Collection<Resource> modifiedResources) {
return UIHelper.checkModify(modifiedResources, shell);
}
}
public static boolean checkModify(Collection modifiedResources, Shell shell) {
if (shell == null) {
Display display = Display.getCurrent();
if (display != null) {
shell = display.getActiveShell();
}
}
IStatus status = UserInteractionHelper.checkModify(modifiedResources,
shell);
if (!status.isOK()) {
handleError(status);
return false;
}
return true;
}
private static void handleError(IStatus status) {
AuthoringUIPlugin
.getDefault()
.getMsgDialog()
.display(AuthoringUIResources.errorDialog_title,
AuthoringUIResources.editDialog_msgCannotEdit, status);
}
}