blob: d8739bb01483d8161a31f42d5ccc3477331aae10 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}
}