/******************************************************************************* * Licensed Materials - Property of IBM * (c) Copyright IBM Corporation 2007,2009. All Rights Reserved. * * Note to U.S. Government Users Restricted Rights: * Use, duplication or disclosure restricted by GSA ADP Schedule * Contract with IBM Corp. *******************************************************************************/ package org.eclipse.epf.authoring.ui.forms; import java.util.List; import java.util.Set; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider; import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; import org.eclipse.epf.authoring.ui.AuthoringUIText; import org.eclipse.epf.authoring.ui.dialogs.ManageStateDialog; import org.eclipse.epf.authoring.ui.editors.MethodElementEditor; import org.eclipse.epf.authoring.ui.util.UIHelper; import org.eclipse.epf.library.edit.TngAdapterFactory; import org.eclipse.epf.library.edit.command.IActionManager; import org.eclipse.epf.library.edit.util.MethodPluginPropUtil; import org.eclipse.epf.library.edit.util.WorkProductPropUtil; import org.eclipse.epf.uma.Constraint; import org.eclipse.epf.uma.MethodPlugin; import org.eclipse.epf.uma.WorkProduct; import org.eclipse.epf.uma.util.UmaUtil; import org.eclipse.jface.resource.FontRegistry; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableFontProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.ui.forms.widgets.TableWrapData; /** * * @author achen * @since 7.5.1 */ public class WorkProductStatesPage extends BaseFormPage { private static final String FORM_PAGE_ID = "workProductStatesPage"; //$NON-NLS-1$ private WorkProductStatesPage page; private Shell shell; private WorkProduct workProduct; private MethodPlugin activePlugin; private IActionManager actionMgr; private Section statesSection; private Composite statesComposite; private Table ctrl_wp_states; private TableViewer wpStatesViewer; private IStructuredContentProvider wpStatesViewerContentProvider; private ITableLabelProvider wpStatesViewerLabelProvider; private Button ctrl_assign, ctrl_unassign; private Table ctrl_global_states; private TableViewer globalStatesViewer; private IStructuredContentProvider globalStatesViewerContentProvider; private ITableLabelProvider globalStatesViewerLabelProvider; private Button ctrl_manage_state; private Text des; public WorkProductStatesPage(FormEditor editor) { super(editor, FORM_PAGE_ID, AuthoringUIText.WORK_PRODUCT_STATES_PAGE_TITLE); page = this; } public void init(IEditorSite site, IEditorInput input) { super.init(site, input); shell = site.getShell(); workProduct = (WorkProduct) contentElement; activePlugin = UmaUtil.getMethodPlugin(workProduct); actionMgr = ((MethodElementEditor) getEditor()).getActionManager(); } protected void createFormContent(IManagedForm managedForm) { super.createFormContent(managedForm); UIHelper.setFormText(form, contentElement); statesSection = toolkit.createSection(form.getBody(), Section.TITLE_BAR | Section.DESCRIPTION | Section.TWISTIE | Section.EXPANDED); statesSection.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB)); statesSection.setText(AuthoringUIText.STATES_SECTION_NAME); statesSection.setDescription(AuthoringUIText.STATES_SECTION_DESC); statesSection.setLayout(new GridLayout()); statesComposite = toolkit.createComposite(statesSection); statesComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); statesComposite.setLayout(new GridLayout(4, false)); statesSection.setClient(statesComposite); createStatesArea(statesComposite); toolkit.paintBordersFor(statesComposite); addListeners(); loadData(); updateControls(); } protected void createStatesArea(Composite parent) { //the first row Composite wpStateComposite = toolkit.createComposite(parent); wpStateComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); wpStateComposite.setLayout(new GridLayout()); toolkit.createLabel(wpStateComposite, AuthoringUIText.STATES_WP_STATE_TEXT); ctrl_wp_states = toolkit.createTable(wpStateComposite, SWT.MULTI); { GridData gridData = new GridData(GridData.FILL_BOTH); gridData.widthHint = 300; gridData.heightHint = 150; ctrl_wp_states.setLayoutData(gridData); } Composite btnComposite1 = toolkit.createComposite(parent); btnComposite1.setLayoutData(new GridData(GridData.FILL_BOTH)); btnComposite1.setLayout(new GridLayout()); toolkit.createLabel(btnComposite1, null); toolkit.createLabel(btnComposite1, null); toolkit.createLabel(btnComposite1, null); toolkit.createLabel(btnComposite1, null); ctrl_assign = toolkit.createButton(btnComposite1, AuthoringUIText.STATES_ASSIGN_TEXT, SWT.NONE); { GridData gridData = new GridData(GridData.FILL_HORIZONTAL); ctrl_assign.setLayoutData(gridData); } ctrl_unassign = toolkit.createButton(btnComposite1, AuthoringUIText.STATES_UNASSIGN_TEXT, SWT.NONE); { GridData gridData = new GridData(GridData.FILL_HORIZONTAL); ctrl_unassign.setLayoutData(gridData); } Composite globalStateComposite = toolkit.createComposite(parent); globalStateComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); globalStateComposite.setLayout(new GridLayout()); toolkit.createLabel(globalStateComposite, AuthoringUIText.STATES_GLOBAL_STATE_TEXT); ctrl_global_states = toolkit.createTable(globalStateComposite, SWT.MULTI); { GridData gridData = new GridData(GridData.FILL_BOTH); gridData.widthHint = 300; gridData.heightHint = 150; ctrl_global_states.setLayoutData(gridData); } Composite btnComposite2 = toolkit.createComposite(parent); btnComposite2.setLayoutData(new GridData(GridData.FILL_BOTH)); btnComposite2.setLayout(new GridLayout()); toolkit.createLabel(btnComposite2, null); ctrl_manage_state = toolkit.createButton(btnComposite2, AuthoringUIText.STATES_MANAGE_TEXT, SWT.NONE); { GridData gridData = new GridData(GridData.FILL_HORIZONTAL); ctrl_manage_state.setLayoutData(gridData); } toolkit.createLabel(btnComposite2, null); Label comment = toolkit.createLabel(btnComposite2, AuthoringUIText.STATES_GLOBAL_NOTES_TEXT, SWT.WRAP); { GridData gridData = new GridData(); gridData.widthHint = 120; comment.setLayoutData(gridData); } //the second row Label desLabel = toolkit.createLabel(parent, AuthoringUIText.STATES_DES_TEXT); { GridData gridData = new GridData(); gridData.horizontalSpan = 4; desLabel.setLayoutData(gridData); } //the third row des = toolkit.createText(parent, "", SWT.MULTI | SWT.WRAP | SWT.BORDER | SWT.V_SCROLL); //$NON-NLS-1$ { GridData gridData = new GridData(GridData.FILL_BOTH); gridData.heightHint = 100; gridData.horizontalSpan = 3; des.setLayoutData(gridData); } des.setEditable(false); initProviders(); wpStatesViewer = new TableViewer(ctrl_wp_states); wpStatesViewer.setContentProvider(wpStatesViewerContentProvider); wpStatesViewer.setLabelProvider(wpStatesViewerLabelProvider); wpStatesViewer.setComparator(new StateViewerComparator()); globalStatesViewer = new TableViewer(ctrl_global_states); globalStatesViewer.setContentProvider(globalStatesViewerContentProvider); globalStatesViewer.setLabelProvider(globalStatesViewerLabelProvider); globalStatesViewer.setComparator(new StateViewerComparator()); toolkit.paintBordersFor(wpStateComposite); toolkit.paintBordersFor(btnComposite1); toolkit.paintBordersFor(globalStateComposite); toolkit.paintBordersFor(btnComposite2); } private void initProviders() { wpStatesViewerContentProvider = new AdapterFactoryContentProvider( TngAdapterFactory.INSTANCE.getNavigatorView_ComposedAdapterFactory()) { public Object[] getElements(Object object) { if (object instanceof WorkProduct) { WorkProduct wp = (WorkProduct)object; Set<Constraint> states = WorkProductPropUtil.getWorkProductPropUtil(actionMgr).getAllStates(wp); return states.toArray(); } return new Object[0]; } }; wpStatesViewerLabelProvider = new AdapterFactoryLabelProvider( TngAdapterFactory.INSTANCE.getNavigatorView_ComposedAdapterFactory()) { public String getColumnText(Object element, int columnIndex) { if (element instanceof Constraint) { return ((Constraint)element).getBody(); } return null; } }; globalStatesViewerContentProvider = new AdapterFactoryContentProvider( TngAdapterFactory.INSTANCE.getNavigatorView_ComposedAdapterFactory()) { public Object[] getElements(Object object) { if (object instanceof WorkProduct) { List<Constraint> globalStates = MethodPluginPropUtil.getMethodPluginPropUtil(actionMgr) .getWorkProductStatesInLibrary(activePlugin); return globalStates.toArray(); } return new Object[0]; } }; globalStatesViewerLabelProvider = new GlobalStatesLabelProvider( TngAdapterFactory.INSTANCE.getNavigatorView_ComposedAdapterFactory()); } private void addListeners() { wpStatesViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { updateControls(); updateDescription(wpStatesViewer); } }); ctrl_assign.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { assignState(); updateControls(); } }); ctrl_unassign.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { unassignState(); updateControls(); } }); globalStatesViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { updateControls(); updateDescription(globalStatesViewer); } }); ctrl_manage_state.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { ManageStateDialog dialog = new ManageStateDialog(shell, activePlugin, actionMgr, page); dialog.open(); } }); } private void assignState() { IStructuredSelection selection = (IStructuredSelection)globalStatesViewer.getSelection(); for (Object obj : selection.toList()) { if (obj instanceof Constraint) { WorkProductPropUtil.getWorkProductPropUtil(actionMgr).addWorkProductState( workProduct, (Constraint)obj); } } } private void unassignState() { IStructuredSelection selection = (IStructuredSelection)wpStatesViewer.getSelection(); for (Object obj : selection.toList()) { if (obj instanceof Constraint) { WorkProductPropUtil.getWorkProductPropUtil(actionMgr).removeWorkProductState( workProduct, ((Constraint)obj).getBody()); } } } private void loadData() { wpStatesViewer.setInput(workProduct); globalStatesViewer.setInput(workProduct); } public void updateControls() { IStructuredSelection globalSelection = (IStructuredSelection)globalStatesViewer.getSelection(); if (globalSelection.size() > 0) { ctrl_assign.setEnabled(true); } else { ctrl_assign.setEnabled(false); } IStructuredSelection wpSelection = (IStructuredSelection)wpStatesViewer.getSelection(); if (wpSelection.size() > 0) { ctrl_unassign.setEnabled(true); } else { ctrl_unassign.setEnabled(false); } wpStatesViewer.refresh(); globalStatesViewer.refresh(); } private void updateDescription(TableViewer viewer) { IStructuredSelection selection = (IStructuredSelection)viewer.getSelection(); if (selection.size() > 0) { Constraint state = (Constraint)selection.getFirstElement(); des.setText(state.getBriefDescription()); } } private boolean isLocalState(Constraint state) { List<Constraint> allLocalStates = MethodPluginPropUtil.getMethodPluginPropUtil(actionMgr) .getWorkProductStatesInPlugin(activePlugin); return allLocalStates.contains(state); } private class GlobalStatesLabelProvider extends AdapterFactoryLabelProvider implements ITableFontProvider { private FontRegistry registry = new FontRegistry(); private Font systemFont; public GlobalStatesLabelProvider(AdapterFactory adapterFactory) { super(adapterFactory); } public String getColumnText(Object element, int columnIndex) { if (element instanceof Constraint) { return ((Constraint)element).getBody(); } return null; } public Font getFont(Object element, int columnIndex) { if (systemFont == null) { systemFont = Display.getCurrent().getSystemFont(); } if ((element instanceof Constraint) && (isLocalState((Constraint)element))) { return registry.getBold(systemFont.getFontData()[0].getName()); } return systemFont; } } public class StateViewerComparator extends ViewerComparator { public int compare(Viewer viewer, Object e1, Object e2) { if ((e1 instanceof Constraint) && (e2 instanceof Constraint)) { String name1 = ((Constraint)e1).getBody(); String name2 = ((Constraint)e2).getBody(); return getComparator().compare(name1, name2); } return 0; } } }