| //------------------------------------------------------------------------------ |
| // 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.forms; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.eclipse.emf.common.notify.AdapterFactory; |
| import org.eclipse.emf.common.ui.viewer.IViewerProvider; |
| import org.eclipse.emf.ecore.EClass; |
| import org.eclipse.emf.edit.provider.ITreeItemContentProvider; |
| import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; |
| import org.eclipse.epf.authoring.gef.figures.Colors; |
| import org.eclipse.epf.authoring.ui.AuthoringUIHelpContexts; |
| import org.eclipse.epf.authoring.ui.AuthoringUIPlugin; |
| import org.eclipse.epf.authoring.ui.AuthoringUIResources; |
| import org.eclipse.epf.authoring.ui.celleditors.AbstractCheckBoxCellEditor; |
| import org.eclipse.epf.authoring.ui.celleditors.ProcessCheckBoxCellEditor; |
| import org.eclipse.epf.authoring.ui.editors.ColumnDescriptor; |
| import org.eclipse.epf.authoring.ui.editors.MethodElementEditor; |
| import org.eclipse.epf.authoring.ui.editors.ProcessEditor; |
| import org.eclipse.epf.authoring.ui.providers.ExposedAdapterFactoryContentProvider; |
| import org.eclipse.epf.authoring.ui.providers.VariabilityElementLabelProvider; |
| import org.eclipse.epf.authoring.ui.views.ProcessViewer; |
| import org.eclipse.epf.common.utils.StrUtil; |
| import org.eclipse.epf.library.edit.TngAdapterFactory; |
| import org.eclipse.epf.library.edit.command.IActionManager; |
| import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider; |
| import org.eclipse.epf.library.edit.process.IBSItemProvider; |
| import org.eclipse.epf.library.edit.process.IColumnAware; |
| import org.eclipse.epf.library.edit.util.DescriptorPropUtil; |
| import org.eclipse.epf.library.edit.util.PredecessorList; |
| import org.eclipse.epf.library.edit.util.ProcessUtil; |
| import org.eclipse.epf.library.edit.util.Suppression; |
| import org.eclipse.epf.library.edit.util.TngUtil; |
| import org.eclipse.epf.uma.BreakdownElement; |
| import org.eclipse.epf.uma.DescribableElement; |
| import org.eclipse.epf.uma.Descriptor; |
| import org.eclipse.epf.uma.Process; |
| import org.eclipse.epf.uma.ProcessComponent; |
| import org.eclipse.epf.uma.TaskDescriptor; |
| import org.eclipse.epf.uma.UmaPackage; |
| import org.eclipse.epf.uma.WorkBreakdownElement; |
| import org.eclipse.epf.uma.WorkOrder; |
| import org.eclipse.epf.uma.WorkProductDescriptor; |
| import org.eclipse.jface.action.IAction; |
| import org.eclipse.jface.viewers.CellEditor; |
| import org.eclipse.jface.viewers.CheckboxCellEditor; |
| import org.eclipse.jface.viewers.ComboBoxCellEditor; |
| import org.eclipse.jface.viewers.DecoratingLabelProvider; |
| import org.eclipse.jface.viewers.ICellEditorValidator; |
| import org.eclipse.jface.viewers.ICellModifier; |
| import org.eclipse.jface.viewers.IColorProvider; |
| import org.eclipse.jface.viewers.ILabelProviderListener; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.TextCellEditor; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.custom.CTabFolder; |
| import org.eclipse.swt.graphics.Color; |
| import org.eclipse.swt.graphics.Font; |
| import org.eclipse.swt.graphics.Image; |
| 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.Display; |
| import org.eclipse.swt.widgets.Event; |
| import org.eclipse.swt.widgets.Listener; |
| import org.eclipse.swt.widgets.Widget; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.forms.IManagedForm; |
| import org.eclipse.ui.forms.editor.FormEditor; |
| import org.eclipse.ui.forms.widgets.FormToolkit; |
| import org.eclipse.ui.forms.widgets.ScrolledForm; |
| import org.eclipse.ui.forms.widgets.Section; |
| import org.eclipse.ui.forms.widgets.TableWrapData; |
| import org.eclipse.ui.forms.widgets.TableWrapLayout; |
| |
| |
| /** |
| * Breadown structure editor |
| * |
| * @author Phong Nguyen Le |
| * @author Shilpa Toraskar |
| * @since 1.0 |
| */ |
| public class ProcessBreakdownStructureFormPage extends ProcessFormPage |
| implements IViewerProvider { |
| |
| protected static final String TXT_TRUE = "true"; //$NON-NLS-1$ |
| |
| protected static final String TXT_FALSE = "false"; //$NON-NLS-1$ |
| |
| protected static final Collection<EClass> ECLASSES; |
| |
| private int tabIndex = 0; |
| |
| static { |
| ECLASSES = new ArrayList<EClass>(); |
| ECLASSES.add(UmaPackage.eINSTANCE.getMethodPackage()); |
| } |
| |
| private class ProcessAdapterFactoryLabelProvider extends |
| VariabilityElementLabelProvider implements IColorProvider { |
| |
| private DecoratingLabelProvider decoratingLabelProvider; |
| |
| /** |
| * @param adapterFactory |
| */ |
| public ProcessAdapterFactoryLabelProvider(AdapterFactory adapterFactory) { |
| super(adapterFactory); |
| decoratingLabelProvider = new DecoratingLabelProvider( |
| new AdapterFactoryLabelProvider(adapterFactory), |
| PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()); |
| } |
| |
| public void addListener(ILabelProviderListener listener) { |
| super.addListener(listener); |
| decoratingLabelProvider.addListener(listener); |
| } |
| |
| public void removeListener(ILabelProviderListener listener) { |
| super.removeListener(listener); |
| decoratingLabelProvider.removeListener(listener); |
| } |
| |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#getColumnImage(java.lang.Object, int) |
| */ |
| public Image getColumnImage(Object object, int columnIndex) { |
| if(columnIndex == 0) { |
| return getImage(object); |
| } |
| return super.getColumnImage(object, columnIndex); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#getImage(java.lang.Object) |
| */ |
| public Image getImage(Object object) { |
| return decoratingLabelProvider.getImage(object); |
| } |
| |
| /** |
| * |
| * @see org.eclipse.jface.viewers.IColorProvider#getForeground(java.lang.Object) |
| */ |
| public Color getForeground(Object element) { |
| if (isSuppressed(element)) { |
| return Colors.SUPRESSED_ELEMENT_LABEL; |
| } |
| else if (isExternal(element)) { |
| return Colors.INHERITED_ELEMENT_LABEL; |
| } |
| Object obj = TngUtil.unwrap(element); |
| if (obj instanceof Descriptor) { |
| Descriptor d = (Descriptor) obj; |
| if (DescriptorPropUtil.getDesciptorPropUtil().isCreatedByReference(d)) { |
| return Colors.DYNAMIC_ELEMENT_LABEL; |
| } |
| } |
| return null; |
| } |
| |
| private boolean isSuppressed(Object element) { |
| if (element instanceof BreakdownElement) { |
| return getSuppression() |
| .isSuppressed((BreakdownElement) element); |
| } else if (element instanceof BreakdownElementWrapperItemProvider) { |
| return getSuppression().isSuppressed( |
| (BreakdownElementWrapperItemProvider) element); |
| } |
| return false; |
| } |
| |
| private Suppression getSuppression() { |
| return ((ProcessEditor) ProcessBreakdownStructureFormPage.this |
| .getEditor()).getSuppression(); |
| } |
| |
| /** |
| * |
| * @see org.eclipse.jface.viewers.IColorProvider#getBackground(java.lang.Object) |
| */ |
| public Color getBackground(Object element) { |
| // let OS take control over tree widget background |
| // rather than sending one fixed background. |
| return null; |
| } |
| |
| /** |
| * |
| * @see com.ibm.library.edit.util.VariabilityElementLabelProvider#isExternal(java.lang.Object) |
| */ |
| public boolean isExternal(Object element) { |
| return ProcessUtil.isInherited(element); |
| } |
| |
| /** |
| * @see com.ibm.library.edit.util.VariabilityElementLabelProvider#getFont(java.lang.Object) |
| */ |
| public Font getFont(Object element) { |
| if (isExternal(element)) { |
| return italicFont; |
| } |
| if (element instanceof TaskDescriptor) { |
| TaskDescriptor td = (TaskDescriptor) element; |
| if (DescriptorPropUtil.getDesciptorPropUtil().getGreenParentDescriptor(td) != null) { |
| return italicFont; |
| } |
| } |
| return regularFont; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.epf.authoring.ui.providers.VariabilityElementLabelProvider#dispose() |
| */ |
| public void dispose() { |
| decoratingLabelProvider.dispose(); |
| decoratingLabelProvider = null; |
| super.dispose(); |
| } |
| } |
| |
| protected class ValidatingTextCellEditor extends TextCellEditor { |
| protected Object lastInvalidElement; |
| |
| private int columnIndex; |
| |
| /** |
| * @param parent |
| */ |
| public ValidatingTextCellEditor(Composite parent) { |
| super(parent); |
| } |
| |
| public void setColumnIndex(int columnIndex) { |
| this.columnIndex = columnIndex; |
| } |
| |
| public int getColumnIndex() { |
| return columnIndex; |
| } |
| |
| public Object getLastInvalidElement() { |
| return lastInvalidElement; |
| } |
| |
| String isValid(String txt) { |
| IStructuredSelection selection = (IStructuredSelection) viewer |
| .getSelection(); |
| if (selection.size() == 1) { |
| Object e = selection.getFirstElement(); |
| String msg = isValid(e, txt); |
| if (msg != null) { |
| lastInvalidElement = e; |
| } else { |
| lastInvalidElement = null; |
| } |
| return msg; |
| } |
| return null; |
| } |
| |
| protected String isValid(Object e, String txt) { |
| return null; |
| } |
| } |
| |
| protected static class CellEditorValidator implements ICellEditorValidator { |
| |
| private ValidatingTextCellEditor cellEditor; |
| |
| /** |
| * |
| */ |
| public CellEditorValidator(ValidatingTextCellEditor cellEditor) { |
| this.cellEditor = cellEditor; |
| } |
| |
| /** |
| * @see org.eclipse.jface.viewers.ICellEditorValidator#isValid(java.lang.Object) |
| */ |
| public String isValid(Object value) { |
| return cellEditor.isValid((String) value); |
| } |
| |
| } |
| |
| protected class ValidatingDeactivateListener implements Listener { |
| private ValidatingTextCellEditor cellEditor; |
| |
| public ValidatingDeactivateListener(ValidatingTextCellEditor cellEditor) { |
| this.cellEditor = cellEditor; |
| } |
| |
| public void handleEvent(Event e) { |
| Display.getCurrent().asyncExec(new Runnable() { |
| public void run() { |
| if (cellEditor.getLastInvalidElement() != null) { |
| AuthoringUIPlugin |
| .getDefault() |
| .getMsgDialog() |
| .displayError( |
| AuthoringUIResources.editProcessElementErrorDialog_title, |
| cellEditor.getErrorMessage()); |
| viewer.editElement(cellEditor.getLastInvalidElement(), |
| cellEditor.getColumnIndex()); |
| } |
| } |
| |
| }); |
| } |
| } |
| |
| // private class ValidatingFocusAdapter extends FocusAdapter { |
| // private ValidatingTextCellEditor cellEditor; |
| // |
| // ValidatingFocusAdapter(ValidatingTextCellEditor cellEditor) { |
| // this.cellEditor = cellEditor; |
| // } |
| // |
| // public void focusLost(FocusEvent e) { |
| // Display.getCurrent().asyncExec(new Runnable() { |
| // |
| // public void run() { |
| // if (cellEditor.getLastInvalidElement() != null) { |
| // AuthoringUIPlugin |
| // .getDefault() |
| // .getMsgDialog() |
| // .displayError( |
| // AuthoringUIResources |
| // .getString("AuthoringUI.editProcessElementErrorDialog.title"), |
| // //$NON-NLS-1$ |
| // cellEditor.getErrorMessage()); |
| // viewer.editElement(cellEditor.getLastInvalidElement(), |
| // cellEditor.getColumnIndex()); |
| // } |
| // } |
| // |
| // }); |
| // } |
| // } |
| |
| // private Composite parent = null; |
| |
| protected ColumnDescriptor[] columnDescriptors; |
| |
| // private boolean validNamePrompted = false; |
| // private int promptCount = 0; |
| |
| // private MethodElement promptedElement; |
| |
| // private TableTreeViewer tableTreeViewer; |
| |
| protected AdapterFactory adapterFactory; |
| |
| // private int tabIndex; |
| |
| // private Object tabFolder; |
| |
| protected ProcessViewer viewer; |
| |
| protected TextCellEditor textCellEditor; |
| |
| protected ValidatingTextCellEditor nameCellEditor; |
| |
| protected ValidatingTextCellEditor predListCellEditor; |
| |
| protected ComboBoxCellEditor comboBoxCellEditor; |
| |
| protected CheckboxCellEditor checkBoxCellEditor; |
| |
| protected ValidatingTextCellEditor presentationNameCellEditor; |
| |
| // private HashMap columnIndexToNameMap; |
| protected boolean isReadOnly; |
| |
| /** |
| * Creates an instance |
| * @param editor |
| * @param id |
| * @param title |
| */ |
| public ProcessBreakdownStructureFormPage(FormEditor editor, String id, |
| String title) { |
| super(editor, id, title); |
| } |
| |
| /** |
| * If returns true, editing is disabled or not available for the process |
| * breakdown structure. |
| * |
| */ |
| public boolean isReadOnly() { |
| if (isReadOnly) { |
| return isReadOnly; |
| } |
| return TngUtil.isLocked(process); |
| } |
| |
| /** |
| * If returns true, editing is disabled or not available for the process |
| * breakdown structure. |
| * |
| */ |
| public boolean basicIsReadOnly() { |
| return isReadOnly; |
| } |
| |
| /** |
| * Enables/disable modifying process breakdown structure |
| * |
| * @param isReadOnly |
| */ |
| public void setReadOnly(boolean isReadOnly) { |
| this.isReadOnly = isReadOnly; |
| } |
| |
| /** |
| * Sets adapter factory to create item provider for each element in |
| * the breakdown structure |
| * |
| * @param adapterFactory |
| */ |
| public void setAdapterFactory(AdapterFactory adapterFactory) { |
| this.adapterFactory = adapterFactory; |
| } |
| |
| /** |
| * Sets column descriptors to define the columns of the tree. |
| * |
| * @param columnDescriptors |
| */ |
| public void setColumnDescriptors(ColumnDescriptor[] columnDescriptors) { |
| this.columnDescriptors = columnDescriptors; |
| |
| if (adapterFactory instanceof IColumnAware) { |
| Map<Integer, String> columnIndexToNameMap = new HashMap<Integer, String>(); |
| for (int i = 0; i < columnDescriptors.length; i++) { |
| columnIndexToNameMap.put(new Integer(i), |
| columnDescriptors[i].id); |
| } |
| ((IColumnAware) adapterFactory) |
| .setColumnIndexToNameMap(columnIndexToNameMap); |
| } |
| } |
| |
| protected void setText(BreakdownElement e, String prop, String txt) { |
| IActionManager actionMgr = ((MethodElementEditor) getEditor()) |
| .getActionManager(); |
| if (prop == IBSItemProvider.COL_PREDECESSORS) { |
| WorkBreakdownElement wbe = (WorkBreakdownElement) e; |
| List<WorkOrder> addList = new ArrayList<WorkOrder>(); |
| List<WorkOrder> predToBeDeleted = new ArrayList<WorkOrder>(); |
| if(PredecessorList.prepareUpdatePredecessors(adapterFactory, wbe, txt, addList, predToBeDeleted)) { |
| if(!predToBeDeleted.isEmpty()) { |
| actionMgr.doAction( |
| IActionManager.REMOVE_MANY, |
| wbe, |
| UmaPackage.eINSTANCE.getWorkBreakdownElement_LinkToPredecessor(), |
| predToBeDeleted, -1); |
| } |
| if(!addList.isEmpty()) { |
| actionMgr |
| .doAction( |
| IActionManager.ADD_MANY, |
| wbe, |
| UmaPackage.eINSTANCE |
| .getWorkBreakdownElement_LinkToPredecessor(), |
| addList, -1); |
| } |
| } |
| |
| return; |
| } |
| |
| ProcessUtil.setAttribute(actionMgr, e, prop, txt); |
| } |
| |
| protected String getText(BreakdownElement e, String prop) { |
| // handle editing presentation name of extending/contributing activity |
| // specially |
| // |
| if (prop == IBSItemProvider.COL_PRESENTATION_NAME |
| && ProcessUtil.isExtendingOrLocallyContributing(e)) { |
| return ((DescribableElement) e).getPresentationName(); |
| } |
| |
| IBSItemProvider adapter = (IBSItemProvider) adapterFactory.adapt(e, |
| ITreeItemContentProvider.class); |
| return adapter.getAttribute(e, prop); |
| } |
| |
| /** |
| * Set tab index for the form page |
| * @param id |
| */ |
| public void setTabIndex(int id) { |
| tabIndex = id; |
| } |
| |
| /** |
| * Return tab index for the form page |
| */ |
| public int getTabIndex() { |
| return tabIndex; |
| } |
| |
| /** |
| * Set tab folder |
| * @param tabFolder |
| */ |
| public void setTabFolder(CTabFolder tabFolder) { |
| // this.tabFolder = tabFolder; |
| } |
| |
| /** |
| * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm) |
| */ |
| protected void createFormContent(IManagedForm managedForm) { |
| // create form toolkit |
| ScrolledForm form = managedForm.getForm(); |
| FormToolkit toolkit = managedForm.getToolkit(); |
| form.setText(getEditor().getPartName()); |
| |
| TableWrapLayout layout = new TableWrapLayout(); |
| form.getBody().setLayout(layout); |
| |
| Section section = toolkit.createSection(form.getBody(), |
| Section.EXPANDED | Section.TITLE_BAR); |
| TableWrapData td = new TableWrapData(TableWrapData.FILL_GRAB, |
| TableWrapData.FILL_GRAB); |
| section.setLayoutData(td); |
| section |
| .setText(getTitle() |
| + " " + AuthoringUIResources.processBreakdownStructureFormPage_BSEditor); //$NON-NLS-1$ |
| section.setLayout(new GridLayout()); |
| |
| Composite composite = toolkit.createComposite(section); |
| // composite.setLayout(new GridLayout(1, false)); |
| composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); |
| composite.setLayout(new GridLayout()); |
| section.setClient(composite); |
| Control control = createControl(composite); |
| toolkit.adapt(control, true, true); |
| GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true); |
| gridData.verticalIndent = 10; |
| gridData.heightHint = 600; |
| control.setLayoutData(gridData); |
| |
| ProcessEditor editor = (ProcessEditor) getEditor(); |
| // editor.createContextMenuFor(tableTreeViewer); |
| editor.createContextMenuFor(viewer); |
| |
| setInput(process); |
| } |
| |
| |
| /** |
| * Create control |
| * @param parent |
| * @return |
| * Control |
| */ |
| public Control createControl(Composite parent) { |
| // this.parent = parent; |
| // This is the page for the table tree viewer. |
| // |
| Composite comp = new Composite(parent, SWT.NONE); |
| GridLayout layout = new GridLayout(); |
| layout.marginHeight = 0; |
| layout.marginWidth = 0; |
| comp.setLayout(layout); |
| GridData gd = new GridData(GridData.BEGINNING | GridData.FILL_BOTH); |
| comp.setLayoutData(gd); |
| |
| viewer = new ProcessViewer(comp, SWT.MULTI | SWT.H_SCROLL |
| | SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION); |
| viewer.setUseHashlookup(true); |
| viewer.getControl().setLayoutData(gd); |
| viewer.setupColumns(columnDescriptors); |
| viewer.setContentProvider(new ExposedAdapterFactoryContentProvider( |
| adapterFactory)); |
| viewer.setLabelProvider(new ProcessAdapterFactoryLabelProvider(adapterFactory)); |
| |
| |
| viewer.setActionManager(((MethodElementEditor) getEditor()) |
| .getActionManager()); |
| |
| textCellEditor = new TextCellEditor(viewer.getCellEditorParent()); |
| comboBoxCellEditor = new ComboBoxCellEditor(viewer |
| .getCellEditorParent(), new String[] { TXT_TRUE, TXT_FALSE }); |
| checkBoxCellEditor = new CheckboxCellEditor(viewer |
| .getCellEditorParent()); |
| |
| //set all editors and modifiers |
| setAllEditorsAndModifiers(); |
| |
| viewer.setAutoExpandLevel(3); |
| viewer.setInput(process); |
| |
| // int dndOperations = DND.DROP_COPY | DND.DROP_MOVE ; |
| // Transfer[] transfers = new Transfer[] { TNGObjTransfer.getInstance() |
| // }; |
| // tableTreeViewer.addDropSupport(DND.DROP_MOVE, transfers, new |
| // BSTabDropAdapter(tableTreeViewer)); |
| |
| // BSEditorView.getView().createContextMenuFor(tableTreeViewer); |
| // return tableTreeViewer.getControl(); |
| |
| setContextHelp(viewer.getControl()); |
| |
| return comp; |
| |
| } |
| |
| |
| /** |
| * Set all editors and modifiers for the viewer |
| */ |
| private void setAllEditorsAndModifiers() |
| { |
| setCellEditors(); |
| setCheckBoxCellEditors(); |
| |
| // Set the cell modifier |
| viewer.setCellModifier(new ICellModifier() { |
| /** |
| * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String) |
| */ |
| public boolean canModify(Object element, String property) { |
| // System.out.println("canModify: element="+element+", |
| // property="+property); |
| |
| if (isReadOnly() || |
| (element instanceof BreakdownElementWrapperItemProvider && ((BreakdownElementWrapperItemProvider) element).isReadOnly())) { |
| return false; |
| } |
| |
| // if (!(element instanceof BreakdownElement) |
| // && !(element instanceof BreakdownElementWrapperItemProvider && !((BreakdownElementWrapperItemProvider) element) |
| // .isReadOnly())) { |
| // Collection types = new ArrayList(); |
| // types.add(VariabilityType.EXTENDS_LITERAL); |
| // if (TngUtil |
| // .isGeneralizer( |
| // (VariabilityElement) ((BreakdownElementWrapperItemProvider) element) |
| // .getOwner(), types)) |
| // return false; |
| // } |
| |
| if (property == IBSItemProvider.COL_ID |
| || property == IBSItemProvider.COL_TYPE |
| || property == IBSItemProvider.COL_MODEL_INFO |
| || property == IBSItemProvider.COL_DELIVERABLE) { |
| return false; |
| } |
| |
| element = TngUtil.unwrap(element); |
| if (!(element instanceof WorkProductDescriptor) |
| && (property == IBSItemProvider.COL_ENTRY_STATE || property == IBSItemProvider.COL_EXIT_STATE)) { |
| return false; |
| } |
| if (!(element instanceof WorkBreakdownElement) |
| && (property == IBSItemProvider.COL_PREDECESSORS)) { |
| return false; |
| } |
| |
| return true; |
| } |
| |
| /** |
| * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String) |
| */ |
| public Object getValue(Object element, String property) { |
| // System.out.println("getValue: element="+element+", |
| // property="+property); |
| BreakdownElement e = (BreakdownElement) TngUtil.unwrap(element); |
| String val = getText(e, property); |
| switch (getCellEditorType(property)) { |
| case ColumnDescriptor.CELL_EDITOR_TYPE_COMBO_BOOLEAN: |
| if (TXT_TRUE.equalsIgnoreCase(val)) { |
| return new Integer(0); |
| } else { |
| return new Integer(1); |
| } |
| case ColumnDescriptor.CELL_EDITOR_TYPE_TEXT: |
| return val; |
| case ColumnDescriptor.CELL_EDITOR_TYPE_CHECK_BOOLEAN: |
| return Boolean.valueOf(val); |
| default: |
| return val; |
| } |
| } |
| |
| /** |
| * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object) |
| */ |
| public void modify(final Object element, String property, |
| Object value) { |
| // System.out.println("modify: element="+element+", |
| // property="+property+", value="+value); |
| Widget item = (Widget) element; |
| BreakdownElement be = (BreakdownElement) TngUtil.unwrap(item |
| .getData()); |
| |
| final int columnIndex = getColumnIndex(property); |
| CellEditor cellEditor = viewer.getCellEditors()[columnIndex]; |
| String errMsg = cellEditor.getErrorMessage(); |
| if (errMsg != null) { |
| return; |
| } |
| |
| String txt; |
| switch (getCellEditorType(property)) { |
| case ColumnDescriptor.CELL_EDITOR_TYPE_TEXT: |
| txt = (String) value; |
| break; |
| case ColumnDescriptor.CELL_EDITOR_TYPE_COMBO_BOOLEAN: |
| int index = ((Number) value).intValue(); |
| if (index == 0) { |
| txt = TXT_TRUE; |
| } else { |
| txt = TXT_FALSE; |
| } |
| break; |
| case ColumnDescriptor.CELL_EDITOR_TYPE_CHECK_BOOLEAN: |
| txt = value.toString(); |
| break; |
| default: |
| txt = TngUtil.checkNull(value.toString()); |
| } |
| setText(be, property, txt); |
| if (property == IBSItemProvider.COL_PRESENTATION_NAME |
| && StrUtil.isBlank(be.getName())) { |
| be.setName(txt); |
| } |
| |
| viewer.refresh(); |
| } |
| }); |
| } |
| |
| |
| /** |
| * Get cell editor for the given column |
| * @param columnID |
| * @param columnIndex |
| * @return |
| * Cell Editor |
| */ |
| public CellEditor getCellEditor(String columnID, int columnIndex) { |
| if (columnID == IBSItemProvider.COL_PRESENTATION_NAME) { |
| if (presentationNameCellEditor == null) { |
| presentationNameCellEditor = new ValidatingTextCellEditor( |
| viewer.getCellEditorParent()) { |
| protected String isValid(Object e, String txt) { |
| e = TngUtil.unwrap(e); |
| Suppression suppression = ((ProcessEditor)getEditor()).getSuppression(); |
| boolean ignoreSuppressed = true; |
| return ProcessUtil |
| .checkBreakdownElementPresentationName( |
| adapterFactory, (BreakdownElement) e, |
| txt, suppression, ignoreSuppressed); |
| } |
| }; |
| |
| presentationNameCellEditor |
| .setValidator(new CellEditorValidator( |
| presentationNameCellEditor)); |
| // presentationNameCellEditor.getControl().addFocusListener(new |
| // ValidatingFocusAdapter(presentationNameCellEditor)); |
| presentationNameCellEditor.getControl().addListener( |
| SWT.Deactivate, |
| new ValidatingDeactivateListener( |
| presentationNameCellEditor)); |
| } |
| presentationNameCellEditor.setColumnIndex(columnIndex); |
| |
| return presentationNameCellEditor; |
| } else if (columnID == IBSItemProvider.COL_NAME) { |
| if (nameCellEditor == null) { |
| nameCellEditor = new ValidatingTextCellEditor(viewer |
| .getCellEditorParent()) { |
| protected String isValid(Object e, String txt) { |
| e = TngUtil.unwrap(e); |
| Suppression suppression = ((ProcessEditor)getEditor()).getSuppression(); |
| return TngUtil |
| .checkActivityName(adapterFactory, e, txt, suppression); |
| } |
| }; |
| nameCellEditor.setValidator(new CellEditorValidator( |
| nameCellEditor)); |
| // nameCellEditor.getControl().addFocusListener(new |
| // ValidatingFocusAdapter(nameCellEditor)); |
| nameCellEditor.getControl().addListener(SWT.Deactivate, |
| new ValidatingDeactivateListener(nameCellEditor)); |
| } |
| nameCellEditor.setColumnIndex(columnIndex); |
| |
| return nameCellEditor; |
| } else if (columnID == IBSItemProvider.COL_PREDECESSORS) { |
| if (predListCellEditor == null) { |
| predListCellEditor = new ValidatingTextCellEditor(viewer |
| .getCellEditorParent()) { |
| protected String isValid(Object e, String txt) { |
| e = TngUtil.unwrap(e); |
| return ProcessUtil.checkPredecessorList( |
| (WorkBreakdownElement) e, txt, adapterFactory, |
| process, null); |
| } |
| }; |
| predListCellEditor.setValidator(new CellEditorValidator( |
| predListCellEditor)); |
| // predListCellEditor.getControl().addFocusListener(new |
| // ValidatingFocusAdapter(predListCellEditor)); |
| predListCellEditor.getControl().addListener(SWT.Deactivate, |
| new ValidatingDeactivateListener(predListCellEditor)); |
| } |
| predListCellEditor.setColumnIndex(columnIndex); |
| |
| return predListCellEditor; |
| } |
| return null; |
| } |
| |
| /** |
| * Set cell editors for all columns |
| */ |
| public void setCellEditors() { |
| CellEditor[] cellEditors = new CellEditor[columnDescriptors.length]; |
| for (int i = 0; i < columnDescriptors.length; i++) { |
| CellEditor cellEditor = getCellEditor(columnDescriptors[i].id, i); |
| if (cellEditor != null) { |
| cellEditors[i] = cellEditor; |
| } else { |
| switch (columnDescriptors[i].cellEditorType) { |
| case ColumnDescriptor.CELL_EDITOR_TYPE_COMBO_BOOLEAN: |
| cellEditors[i] = comboBoxCellEditor; |
| break; |
| case ColumnDescriptor.CELL_EDITOR_TYPE_TEXT: |
| cellEditors[i] = textCellEditor; |
| break; |
| case ColumnDescriptor.CELL_EDITOR_TYPE_CHECK_BOOLEAN: |
| cellEditors[i] = checkBoxCellEditor; |
| break; |
| default: |
| cellEditors[i] = null; |
| } |
| } |
| } |
| viewer.setCellEditors(cellEditors); |
| } |
| |
| |
| |
| |
| /** |
| * Set input for viewer |
| * @param newInput |
| */ |
| public void setInput(Object newInput) { |
| if (newInput instanceof Process) { |
| process = (Process) newInput; |
| if (process.eContainer() instanceof ProcessComponent) { |
| viewer.setInput(process.eContainer()); |
| // viewer.expandAll(); |
| // viewer.reveal(process); |
| return; |
| } |
| } |
| viewer.setInput(null); |
| } |
| |
| protected int getColumnIndex(String property) { |
| Object[] colProps = viewer.getColumnProperties(); |
| for (int i = 0; i < colProps.length; i++) { |
| if (colProps[i] == property) |
| return i; |
| } |
| return -1; |
| } |
| |
| protected int getCellEditorType(String property) { |
| for (int i = 0; i < columnDescriptors.length; i++) { |
| ColumnDescriptor desc = columnDescriptors[i]; |
| if (desc.id == property) { |
| return desc.cellEditorType; |
| } |
| } |
| return ColumnDescriptor.CELL_EDITOR_TYPE_NONE; |
| } |
| |
| /** |
| * Return viewer |
| */ |
| public Viewer getViewer() { |
| return viewer; |
| } |
| |
| /** |
| * Set process as input |
| * @param proc |
| */ |
| public void setProcess(Process proc) { |
| if (process != proc) { |
| setInput(proc); |
| } |
| } |
| |
| /** |
| * Returns the adapterFactory. |
| */ |
| public AdapterFactory getAdapterFactory() { |
| return adapterFactory; |
| } |
| |
| /** |
| * Update columns with new column descriptors |
| * @param newColumnDescriptors |
| */ |
| public void updateColumns(ColumnDescriptor[] newColumnDescriptors) { |
| setColumnDescriptors(newColumnDescriptors); |
| viewer.setupColumns(newColumnDescriptors); |
| setAllEditorsAndModifiers(); |
| viewer.refresh(); |
| } |
| |
| /** |
| * @see org.eclipse.ui.forms.editor.FormPage#dispose() |
| */ |
| public void dispose() { |
| // if(adapterFactory instanceof ComposeableAdapterFactory) { |
| // ((ComposedAdapterFactory)adapterFactory).dispose(); |
| // } |
| |
| if (viewer.getContentProvider() != null) { |
| viewer.getContentProvider().dispose(); |
| } |
| |
| if (viewer.getLabelProvider() != null) { |
| viewer.getLabelProvider().dispose(); |
| } |
| |
| super.dispose(); |
| } |
| |
| protected void setContextHelp(Control control) { |
| AdapterFactory adapterFac = getAdapterFactory(); |
| AdapterFactory allFac = TngAdapterFactory.INSTANCE |
| .getProcessComposedAdapterFactory(); |
| AdapterFactory wbsFac = TngAdapterFactory.INSTANCE |
| .getWBS_ComposedAdapterFactory(); |
| AdapterFactory obsFac = TngAdapterFactory.INSTANCE |
| .getOBS_ComposedAdapterFactory(); |
| AdapterFactory pbsFac = TngAdapterFactory.INSTANCE |
| .getPBS_ComposedAdapterFactory(); |
| |
| // System.out.println("$$$ DEBUG: current dadpter fac = " + adapterFac); |
| // System.out.println("$$$ DEBUG: all dadpter fac = " + allFac); |
| // System.out.println("$$$ DEBUG: wbs dadpter fac = " + wbsFac); |
| // System.out.println("$$$ DEBUG: obs dadpter fac = " + obsFac); |
| // System.out.println("$$$ DEBUG: pbs dadpter fac = " + pbsFac); |
| |
| if (adapterFac == wbsFac) |
| PlatformUI.getWorkbench().getHelpSystem().setHelp(control, |
| AuthoringUIHelpContexts.FORM_EDITOR_PROCESS_WBS_CONTEXT); |
| else if (adapterFac == obsFac) |
| PlatformUI.getWorkbench().getHelpSystem().setHelp(control, |
| AuthoringUIHelpContexts.FORM_EDITOR_PROCESS_OBS_CONTEXT); |
| else if (adapterFac == pbsFac) |
| PlatformUI.getWorkbench().getHelpSystem().setHelp(control, |
| AuthoringUIHelpContexts.FORM_EDITOR_PROCESS_PBS_CONTEXT); |
| else if (adapterFac == allFac) |
| PlatformUI.getWorkbench().getHelpSystem().setHelp(control, |
| AuthoringUIHelpContexts.FORM_EDITOR_PROCESS_ALLBS_CONTEXT); |
| } |
| |
| /** |
| * Gets additional actions to contribute to the context menu. |
| * |
| * @return |
| * Actions |
| */ |
| public IAction[] getAdditionalActions() { |
| return null; |
| } |
| |
| /** |
| * Set check box cell editors |
| */ |
| public void setCheckBoxCellEditors() { |
| AbstractCheckBoxCellEditor[] cellEditors = new AbstractCheckBoxCellEditor[columnDescriptors.length]; |
| for (int i = 0; i < columnDescriptors.length; i++) { |
| switch (columnDescriptors[i].cellEditorType) { |
| case ColumnDescriptor.CELL_EDITOR_TYPE_CHECK_BOOLEAN: |
| cellEditors[i] = new ProcessCheckBoxCellEditor(viewer |
| .getCellEditorParent()); |
| break; |
| default: |
| cellEditors[i] = null; |
| } |
| } |
| ((ProcessViewer) viewer).setCheckBoxCellEditors(cellEditors); |
| } |
| |
| } |