// $codepro.audit.disable com.instantiations.assist.eclipse.analysis.audit.rule.effectivejava.alwaysOverridetoString.alwaysOverrideToString, staticFieldSecurity, com.instantiations.assist.eclipse.analysis.deserializeabilitySecurity, com.instantiations.assist.eclipse.analysis.enforceCloneableUsageSecurity, com.instantiations.assist.eclipse.analysis.instanceFieldSecurity
/*******************************************************************************
 * Copyright (c) 2012 Ericsson AB 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
 * 
 * Description:
 * 
 * This class implements the tabbed property section for the Postponed Anomaly model element
 * 
 * Contributors:
 *   Sebastien Dubois - Created for Mylyn Review R4E project
 *   
 ******************************************************************************/

package org.eclipse.mylyn.reviews.r4e.ui.internal.properties.tabbed;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.mylyn.reviews.r4e.core.model.R4EAnomaly;
import org.eclipse.mylyn.reviews.r4e.core.model.R4EAnomalyState;
import org.eclipse.mylyn.reviews.r4e.core.model.R4ECommentType;
import org.eclipse.mylyn.reviews.r4e.core.model.R4EReviewPhase;
import org.eclipse.mylyn.reviews.r4e.core.model.R4EReviewState;
import org.eclipse.mylyn.reviews.r4e.core.model.RModelFactory;
import org.eclipse.mylyn.reviews.r4e.core.model.drules.R4EDesignRule;
import org.eclipse.mylyn.reviews.r4e.core.model.drules.R4EDesignRuleClass;
import org.eclipse.mylyn.reviews.r4e.core.model.drules.R4EDesignRuleRank;
import org.eclipse.mylyn.reviews.r4e.core.model.serial.Persistence.RModelFactoryExt;
import org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.CompatibilityException;
import org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.OutOfSyncException;
import org.eclipse.mylyn.reviews.r4e.core.model.serial.impl.ResourceHandlingException;
import org.eclipse.mylyn.reviews.r4e.ui.R4EUIPlugin;
import org.eclipse.mylyn.reviews.r4e.ui.internal.dialogs.IAnomalyInputDialog;
import org.eclipse.mylyn.reviews.r4e.ui.internal.dialogs.ICalendarDialog;
import org.eclipse.mylyn.reviews.r4e.ui.internal.dialogs.R4EUIDialogFactory;
import org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIPosition;
import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIAnomalyBasic;
import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIAnomalyExtended;
import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIModelController;
import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIPostponedAnomaly;
import org.eclipse.mylyn.reviews.r4e.ui.internal.utils.R4EUIConstants;
import org.eclipse.mylyn.reviews.r4e.ui.internal.utils.UIUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
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.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;

/**
 * @author Sebastien Dubois
 * @version $Revision: 1.0 $
 */
public class PostponedAnomalyTabPropertySection extends ModelElementTabPropertySection {

	// ------------------------------------------------------------------------
	// Constants
	// ------------------------------------------------------------------------

	/**
	 * Field ANOMALY_DETAILS_SECTION_LABEL. (value is ""Anomaly Details"")
	 */
	private static final String ANOMALY_DETAILS_SECTION_LABEL = "Anomaly Details";

	/**
	 * Field PARTICIPANT_DETAILS_SECTION_LABEL. (value is ""Participants Details"")
	 */
	private static final String PARTICIPANT_DETAILS_SECTION_LABEL = "Participants Details";

	// ------------------------------------------------------------------------
	// Member variables
	// ------------------------------------------------------------------------

	/**
	 * Field fReviewNameText.
	 */
	protected Text fReviewNameText = null;

	/**
	 * Field fPosition.
	 */
	private IR4EUIPosition fPosition;

	/**
	 * Field fTitleText.
	 */
	protected Text fTitleText = null;

	/**
	 * Field fAuthorText.
	 */
	protected Text fAuthorText = null;

	/**
	 * Field fCreationDateText.
	 */
	protected Text fCreationDateText = null;

	/**
	 * Field fPositionText.
	 */
	protected Text fPositionText = null;

	/**
	 * Field fDescriptionText.
	 */
	protected Text fDescriptionText = null;

	/**
	 * Field fStateLabel.
	 */
	private CLabel fStateLabel = null;

	/**
	 * Field fStateCombo.
	 */
	protected CCombo fStateCombo = null;

	/**
	 * Field fClassCombo.
	 */
	protected CCombo fClassCombo = null;

	/**
	 * Field fRankCombo.
	 */
	protected CCombo fRankCombo = null;

	/**
	 * Field fRuleId.
	 */
	protected Text fRuleId = null;

	/**
	 * Field fRuleButton.
	 */
	protected Button fRuleButton = null;

	/**
	 * Field fDateText.
	 */
	protected Text fDateText = null;

	/**
	 * Field fCalendarButton.
	 */
	protected Button fCalendarButton = null;

	/**
	 * Field fDecidedByLabel.
	 */
	private CLabel fDecidedByLabel = null;

	/**
	 * Field fDecidedByCombo.
	 */
	protected CCombo fDecidedByCombo = null;

	/**
	 * Field fFixedByLabel.
	 */
	private CLabel fFixedByLabel = null;

	/**
	 * Field fFixedByCombo.
	 */
	protected CCombo fFixedByCombo = null;

	/**
	 * Field fFollowUpByLabel.
	 */
	private CLabel fFollowUpByLabel = null;

	/**
	 * Field fFollowUpByCombo.
	 */
	protected CCombo fFollowUpByCombo = null;

	/**
	 * Field fAssignedToCombo.
	 */
	private CCombo fAssignedToCombo;

	// ------------------------------------------------------------------------
	// Methods
	// ------------------------------------------------------------------------

	/**
	 * Method shouldUseExtraSpace.
	 * 
	 * @return boolean
	 * @see org.eclipse.ui.views.properties.tabbed.ISection#shouldUseExtraSpace()
	 */
	@Override
	public boolean shouldUseExtraSpace() {
		return true;
	}

	/**
	 * Method createControls.
	 * 
	 * @param parent
	 *            Composite
	 * @param aTabbedPropertySheetPage
	 *            TabbedPropertySheetPage
	 * @see org.eclipse.ui.views.properties.tabbed.ISection#createControls(Composite, TabbedPropertySheetPage)
	 */
	@Override
	public void createControls(Composite parent, TabbedPropertySheetPage aTabbedPropertySheetPage) {
		super.createControls(parent, aTabbedPropertySheetPage);

		//Tell element to build its own detailed tab layout
		final TabbedPropertySheetWidgetFactory widgetFactory = aTabbedPropertySheetPage.getWidgetFactory();
		final Composite composite = widgetFactory.createFlatFormComposite(parent);
		FormData data = null;

		//Postponed Anomaly Original Review (read-only)
		widgetFactory.setBorderStyle(SWT.NULL);
		fReviewNameText = widgetFactory.createText(composite, "", SWT.NULL);
		data = new FormData();
		data.left = new FormAttachment(0, R4EUIConstants.TABBED_PROPERTY_LABEL_WIDTH);
		data.right = new FormAttachment(100, 0); // $codepro.audit.disable numericLiterals
		data.top = new FormAttachment(composite, ITabbedPropertyConstants.VSPACE);
		fReviewNameText.setEditable(false);
		fReviewNameText.setToolTipText(R4EUIConstants.PARENT_REVIEW_TOOLTIP);
		fReviewNameText.setLayoutData(data);

		final CLabel reviewNameLabel = widgetFactory.createCLabel(composite, R4EUIConstants.ORIGINAL_REVIEW_LABEL);
		data = new FormData();
		data.left = new FormAttachment(0, 0);
		data.right = new FormAttachment(fReviewNameText, -ITabbedPropertyConstants.HSPACE);
		data.top = new FormAttachment(fReviewNameText, 0, SWT.CENTER);
		reviewNameLabel.setToolTipText(R4EUIConstants.PARENT_REVIEW_TOOLTIP);
		reviewNameLabel.setLayoutData(data);

		//Anomaly title
		widgetFactory.setBorderStyle(SWT.BORDER);
		fTitleText = widgetFactory.createText(composite, "", SWT.MULTI);
		data = new FormData();
		data.left = new FormAttachment(0, R4EUIConstants.TABBED_PROPERTY_LABEL_WIDTH);
		data.right = new FormAttachment(100, 0); // $codepro.audit.disable numericLiterals
		data.top = new FormAttachment(fReviewNameText, ITabbedPropertyConstants.VSPACE);
		fTitleText.setToolTipText(R4EUIConstants.ANOMALY_TITLE_TOOLTIP);
		fTitleText.setLayoutData(data);
		fTitleText.addFocusListener(new FocusListener() {
			public void focusLost(FocusEvent e) {
				try {
					if (!fRefreshInProgress) {

						//Set new model data
						final String currentUser = R4EUIModelController.getReviewer();
						final R4EAnomaly modelAnomaly = ((R4EUIAnomalyBasic) fProperties.getElement()).getAnomaly();
						String newValue = fTitleText.getText().trim();
						if (!newValue.equals(modelAnomaly.getTitle())) {
							if (((R4EUIPostponedAnomaly) fProperties.getElement()).checkCompatibility()) {
								final Long bookNum = R4EUIModelController.FResourceUpdater.checkOut(modelAnomaly,
										currentUser);
								modelAnomaly.setTitle(fTitleText.getText());
								R4EUIModelController.FResourceUpdater.checkIn(bookNum);

								//Set new UI display
								if (fProperties.getElement() instanceof R4EUIAnomalyExtended) {
									fProperties.getElement().setName(
											R4EUIAnomalyExtended.buildAnomalyExtName(modelAnomaly,
													((R4EUIAnomalyExtended) fProperties.getElement()).getPosition()));
								} else {
									fProperties.getElement().setName(
											R4EUIAnomalyBasic.buildAnomalyName(modelAnomaly,
													((R4EUIAnomalyBasic) fProperties.getElement()).getPosition()));
								}
							}
						}
					}
				} catch (ResourceHandlingException e1) {
					UIUtils.displayResourceErrorDialog(e1);
				} catch (OutOfSyncException e1) {
					UIUtils.displaySyncErrorDialog(e1);
				} catch (CompatibilityException e1) {
					UIUtils.displayCompatibilityErrorDialog(e1);
				}
				R4EUIModelController.getNavigatorView().getTreeViewer().refresh();
				refresh();
			}

			public void focusGained(FocusEvent e) { // $codepro.audit.disable emptyMethod
				//Nothing to do
			}
		});
		UIUtils.addTabbedPropertiesTextResizeListener(fTitleText);

		final CLabel titleLabel = widgetFactory.createCLabel(composite, R4EUIConstants.TITLE_LABEL);
		data = new FormData();
		data.left = new FormAttachment(0, 0);
		data.right = new FormAttachment(fTitleText, -ITabbedPropertyConstants.HSPACE);
		data.top = new FormAttachment(fTitleText, 0, SWT.CENTER);
		titleLabel.setToolTipText(R4EUIConstants.ANOMALY_TITLE_TOOLTIP);
		titleLabel.setLayoutData(data);

		//Anomaly Description
		fDescriptionText = widgetFactory.createText(composite, "", SWT.MULTI);
		data = new FormData();
		data.left = new FormAttachment(0, R4EUIConstants.TABBED_PROPERTY_LABEL_WIDTH);
		data.right = new FormAttachment(100, 0); // $codepro.audit.disable numericLiterals
		data.top = new FormAttachment(fTitleText, ITabbedPropertyConstants.VSPACE);
		fDescriptionText.setLayoutData(data);
		fDescriptionText.setToolTipText(R4EUIConstants.ANOMALY_DESCRIPTION_TOOLTIP);
		fDescriptionText.addFocusListener(new FocusListener() {
			public void focusLost(FocusEvent e) {
				try {
					if (!fRefreshInProgress) {
						//Set new model data
						final String currentUser = R4EUIModelController.getReviewer();
						final R4EAnomaly modelAnomaly = ((R4EUIAnomalyBasic) fProperties.getElement()).getAnomaly();
						String newValue = fDescriptionText.getText().trim();
						if (!newValue.equals(modelAnomaly.getDescription())) {
							if (((R4EUIPostponedAnomaly) fProperties.getElement()).checkCompatibility()) {
								final Long bookNum = R4EUIModelController.FResourceUpdater.checkOut(modelAnomaly,
										currentUser);
								modelAnomaly.setDescription(fDescriptionText.getText());
								R4EUIModelController.FResourceUpdater.checkIn(bookNum);
							}
						}
					}
				} catch (ResourceHandlingException e1) {
					UIUtils.displayResourceErrorDialog(e1);
				} catch (OutOfSyncException e1) {
					UIUtils.displaySyncErrorDialog(e1);
				} catch (CompatibilityException e1) {
					UIUtils.displayCompatibilityErrorDialog(e1);
				}
				refresh();
			}

			public void focusGained(FocusEvent e) { // $codepro.audit.disable emptyMethod
				//Nothing to do
			}
		});
		UIUtils.addTabbedPropertiesTextResizeListener(fDescriptionText);

		final CLabel descriptionLabel = widgetFactory.createCLabel(composite, R4EUIConstants.DESCRIPTION_LABEL);
		data = new FormData();
		data.left = new FormAttachment(0, 0);
		data.right = new FormAttachment(fDescriptionText, -ITabbedPropertyConstants.HSPACE);
		data.top = new FormAttachment(fDescriptionText, 0, SWT.CENTER);
		descriptionLabel.setToolTipText(R4EUIConstants.ANOMALY_DESCRIPTION_TOOLTIP);
		descriptionLabel.setLayoutData(data);

		//State
		fStateCombo = widgetFactory.createCCombo(composite, SWT.READ_ONLY);
		data = new FormData();
		data.left = new FormAttachment(0, R4EUIConstants.TABBED_PROPERTY_LABEL_WIDTH);
		data.right = new FormAttachment(100, 0); // $codepro.audit.disable numericLiterals
		data.top = new FormAttachment(fDescriptionText, ITabbedPropertyConstants.VSPACE);
		fStateCombo.setToolTipText(R4EUIConstants.ANOMALY_STATE_TOOLTIP);
		fStateCombo.setVisibleItemCount(6);
		fStateCombo.setLayoutData(data);
		fStateCombo.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event event) {
				try {
					if (!fRefreshInProgress) {

						R4EAnomalyState newState = R4EUIAnomalyExtended.getStateFromString(fStateCombo.getText());
						if (!newState.equals(((R4EUIAnomalyBasic) fProperties.getElement()).getAnomaly().getState())) {
							if (((R4EUIPostponedAnomaly) fProperties.getElement()).checkCompatibility()) {
								if (newState.equals(R4EAnomalyState.REJECTED)
										&& !((R4EUIAnomalyBasic) fProperties.getElement()).getAnomaly()
												.getState()
												.equals(R4EAnomalyState.REJECTED)) {
									//Force the user to enter a comment if the state is changed to REJECTED
									final boolean commentResult = ((R4EUIAnomalyBasic) fProperties.getElement()).createComment(true);
									if (commentResult) {
										UIUtils.changeAnomalyState(fProperties.getElement(), newState);
										return;
									} else {
										final ErrorDialog dialog = new ErrorDialog(null,
												R4EUIConstants.DIALOG_TITLE_ERROR, "Cannot change Anomaly State",
												new Status(IStatus.ERROR, R4EUIPlugin.PLUGIN_ID, 0,
														"Please enter a reason for rejecting this anomaly", null),
												IStatus.ERROR);
										Display.getDefault().syncExec(new Runnable() {
											public void run() {
												dialog.open();
											}
										});
										refresh();
										return;
									}
								}
								UIUtils.changeAnomalyState(fProperties.getElement(), newState);
							}
						}
					}
				} catch (ResourceHandlingException e) {
					UIUtils.displayResourceErrorDialog(e);
				} catch (CompatibilityException e1) {
					UIUtils.displayCompatibilityErrorDialog(e1);
				}
				refresh();
				R4EUIModelController.getNavigatorView().getTreeViewer().refresh();
			}
		});
		addScrollListener(fStateCombo);

		fStateLabel = widgetFactory.createCLabel(composite, R4EUIConstants.STATE_LABEL);
		data = new FormData();
		data.left = new FormAttachment(0, 0);
		data.right = new FormAttachment(fStateCombo, -ITabbedPropertyConstants.HSPACE);
		data.top = new FormAttachment(fStateCombo, 0, SWT.CENTER);
		fStateLabel.setToolTipText(R4EUIConstants.ANOMALY_STATE_TOOLTIP);
		fStateLabel.setLayoutData(data);

		//Assigned To
		fAssignedToCombo = widgetFactory.createCCombo(composite, SWT.READ_ONLY);
		data = new FormData();
		data.left = new FormAttachment(0, R4EUIConstants.TABBED_PROPERTY_LABEL_WIDTH);
		data.right = new FormAttachment(100, 0); // $codepro.audit.disable numericLiterals
		data.top = new FormAttachment(fStateCombo, ITabbedPropertyConstants.VSPACE);
		fAssignedToCombo.setToolTipText(R4EUIConstants.ASSIGNED_TO_TOOLTIP);
		fAssignedToCombo.setLayoutData(data);
		fAssignedToCombo.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event event) {
				try {
					if (!fRefreshInProgress) {

						final String currentUser = R4EUIModelController.getReviewer();
						final R4EAnomaly modelAnomaly = ((R4EUIAnomalyBasic) fProperties.getElement()).getAnomaly();
						final String newValue = fAssignedToCombo.getText().trim();
						if (!modelAnomaly.getAssignedTo().contains(newValue)) {
							if (((R4EUIPostponedAnomaly) fProperties.getElement()).checkCompatibility()) {
								final Long bookNum = R4EUIModelController.FResourceUpdater.checkOut(modelAnomaly,
										currentUser);
								modelAnomaly.getAssignedTo().clear();
								modelAnomaly.getAssignedTo().add(newValue);
							}
						}
					}
				} catch (ResourceHandlingException e1) {
					UIUtils.displayResourceErrorDialog(e1);
				} catch (OutOfSyncException e1) {
					UIUtils.displaySyncErrorDialog(e1);
				} catch (CompatibilityException e1) {
					UIUtils.displayCompatibilityErrorDialog(e1);
				}
				R4EUIModelController.getNavigatorView().getTreeViewer().refresh();
				refresh();
			}
		});
		addScrollListener(fAssignedToCombo);

		final CLabel assignedToLabel = widgetFactory.createCLabel(composite, R4EUIConstants.ASSIGNED_TO_LABEL);
		data = new FormData();
		data.left = new FormAttachment(0, 0);
		data.right = new FormAttachment(fAssignedToCombo, -ITabbedPropertyConstants.HSPACE);
		data.top = new FormAttachment(fAssignedToCombo, 0, SWT.CENTER);
		assignedToLabel.setToolTipText(R4EUIConstants.ASSIGNED_TO_TOOLTIP);
		assignedToLabel.setLayoutData(data);

		createParticipantDetailsSection(widgetFactory, composite, createAnomalyDetailsSection(widgetFactory, composite));
	}

	/**
	 * Method createAnomalyDetailsSection.
	 * 
	 * @param aWidgetFactory
	 *            TabbedPropertySheetWidgetFactory
	 * @param aComposite
	 *            Composite
	 * @return Composite
	 */
	private Composite createAnomalyDetailsSection(TabbedPropertySheetWidgetFactory aWidgetFactory,
			final Composite aComposite) {
		//Anomaly Details section
		final ExpandableComposite anomalyDetailsSection = aWidgetFactory.createExpandableComposite(aComposite,
				ExpandableComposite.TWISTIE);
		final FormData data = new FormData();
		data.left = new FormAttachment(0, 0);
		data.right = new FormAttachment(100, 0); // $codepro.audit.disable numericLiterals
		data.top = new FormAttachment(fAssignedToCombo, ITabbedPropertyConstants.VSPACE);
		anomalyDetailsSection.setLayoutData(data);
		anomalyDetailsSection.setText(ANOMALY_DETAILS_SECTION_LABEL);
		anomalyDetailsSection.addExpansionListener(new ExpansionAdapter() {
			@Override
			public void expansionStateChanged(ExpansionEvent e) {
				final ScrolledComposite scrolledParent = (ScrolledComposite) aComposite.getParent()
						.getParent()
						.getParent()
						.getParent()
						.getParent();
				scrolledParent.setMinSize(aComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
				scrolledParent.layout(true, true);
			}
		});
		anomalyDetailsSection.setLayout(new GridLayout(1, false));

		final Composite anomalyDetailsSectionClient = aWidgetFactory.createComposite(anomalyDetailsSection);
		anomalyDetailsSectionClient.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
		anomalyDetailsSectionClient.setLayout(new GridLayout(4, false));
		anomalyDetailsSection.setClient(anomalyDetailsSectionClient);

		//Anomaly Creation Date (read-only)
		final CLabel creationDateLabel = aWidgetFactory.createCLabel(anomalyDetailsSectionClient,
				R4EUIConstants.CREATION_DATE_LABEL);
		GridData gridData = new GridData(SWT.FILL, SWT.CENTER, false, false);
		gridData.horizontalSpan = 1;
		creationDateLabel.setToolTipText(R4EUIConstants.ANOMALY_CREATION_DATE_TOOLTIP);
		creationDateLabel.setLayoutData(gridData);

		aWidgetFactory.setBorderStyle(SWT.NULL);
		fCreationDateText = aWidgetFactory.createText(anomalyDetailsSectionClient, "", SWT.NULL);
		gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
		gridData.horizontalSpan = 3;
		fCreationDateText.setEditable(false);
		fCreationDateText.setToolTipText(R4EUIConstants.ANOMALY_CREATION_DATE_TOOLTIP);
		fCreationDateText.setLayoutData(gridData);

		//Anomaly position (read-only)
		final CLabel positionLabel = aWidgetFactory.createCLabel(anomalyDetailsSectionClient,
				R4EUIConstants.POSITION_LABEL);
		gridData = new GridData(SWT.FILL, SWT.CENTER, false, false);
		gridData.horizontalSpan = 1;
		positionLabel.setToolTipText(R4EUIConstants.ANOMALY_POSITION_TOOLTIP);
		positionLabel.setLayoutData(gridData);

		fPositionText = aWidgetFactory.createText(anomalyDetailsSectionClient, "", SWT.NULL);
		gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
		gridData.horizontalSpan = 3;
		fPositionText.setEditable(false);
		fPositionText.setToolTipText(R4EUIConstants.ANOMALY_POSITION_TOOLTIP);
		fPositionText.setLayoutData(gridData);

		//Class
		final CLabel classLabel = aWidgetFactory.createCLabel(anomalyDetailsSectionClient, R4EUIConstants.CLASS_LABEL);
		gridData = new GridData(SWT.FILL, SWT.CENTER, false, false);
		gridData.horizontalSpan = 1;
		classLabel.setToolTipText(R4EUIConstants.ANOMALY_CLASS_TOOLTIP);
		classLabel.setLayoutData(gridData);

		aWidgetFactory.setBorderStyle(SWT.BORDER);
		fClassCombo = aWidgetFactory.createCCombo(anomalyDetailsSectionClient, SWT.READ_ONLY);
		gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
		gridData.horizontalSpan = 3;
		fClassCombo.setToolTipText(R4EUIConstants.ANOMALY_CLASS_TOOLTIP);
		fClassCombo.setLayoutData(gridData);
		fClassCombo.addSelectionListener(new SelectionListener() {
			public void widgetSelected(SelectionEvent e) {
				try {
					if (!fRefreshInProgress) {

						final String currentUser = R4EUIModelController.getReviewer();
						final R4EAnomaly modelAnomaly = ((R4EUIAnomalyBasic) fProperties.getElement()).getAnomaly();
						final R4EDesignRuleClass newValue = UIUtils.getClassFromString(fClassCombo.getText());
						if (null == modelAnomaly.getType()
								|| !newValue.equals(((R4ECommentType) modelAnomaly.getType()).getType())) {
							if (((R4EUIPostponedAnomaly) fProperties.getElement()).checkCompatibility()) {
								final Long bookNum = R4EUIModelController.FResourceUpdater.checkOut(modelAnomaly,
										currentUser);
								final R4ECommentType type = RModelFactoryExt.eINSTANCE.createR4ECommentType();
								type.setType(newValue);
								modelAnomaly.setType(type);
								R4EUIModelController.FResourceUpdater.checkIn(bookNum);
							}
						}
					}
				} catch (ResourceHandlingException e1) {
					UIUtils.displayResourceErrorDialog(e1);
				} catch (OutOfSyncException e1) {
					UIUtils.displaySyncErrorDialog(e1);
				} catch (CompatibilityException e1) {
					UIUtils.displayCompatibilityErrorDialog(e1);
				}
				refresh();
			}

			public void widgetDefaultSelected(SelectionEvent e) { // $codepro.audit.disable emptyMethod
				//No implementation needed
			}
		});
		addScrollListener(fClassCombo);

		//Rank
		final CLabel rankLabel = aWidgetFactory.createCLabel(anomalyDetailsSectionClient, R4EUIConstants.RANK_LABEL);
		gridData = new GridData(SWT.FILL, SWT.CENTER, false, false);
		gridData.horizontalSpan = 1;
		rankLabel.setToolTipText(R4EUIConstants.ANOMALY_RANK_TOOLTIP);
		rankLabel.setLayoutData(gridData);

		fRankCombo = aWidgetFactory.createCCombo(anomalyDetailsSectionClient, SWT.READ_ONLY);
		fRankCombo.setToolTipText(R4EUIConstants.ANOMALY_RANK_TOOLTIP);
		gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
		gridData.horizontalSpan = 3;
		fRankCombo.setLayoutData(gridData);
		fRankCombo.addSelectionListener(new SelectionListener() {
			public void widgetSelected(SelectionEvent e) {
				try {
					if (!fRefreshInProgress) {

						final String currentUser = R4EUIModelController.getReviewer();
						final R4EAnomaly modelAnomaly = ((R4EUIAnomalyBasic) fProperties.getElement()).getAnomaly();
						final R4EDesignRuleRank newValue = UIUtils.getRankFromString(fRankCombo.getText());
						if (!newValue.equals(modelAnomaly.getRank())) {
							if (((R4EUIPostponedAnomaly) fProperties.getElement()).checkCompatibility()) {
								final Long bookNum = R4EUIModelController.FResourceUpdater.checkOut(modelAnomaly,
										currentUser);
								modelAnomaly.setRank(newValue);
								R4EUIModelController.FResourceUpdater.checkIn(bookNum);
							}
						}
					}
				} catch (ResourceHandlingException e1) {
					UIUtils.displayResourceErrorDialog(e1);
				} catch (OutOfSyncException e1) {
					UIUtils.displaySyncErrorDialog(e1);
				} catch (CompatibilityException e1) {
					UIUtils.displayCompatibilityErrorDialog(e1);
				}
				refresh();
			}

			public void widgetDefaultSelected(SelectionEvent e) { // $codepro.audit.disable emptyMethod
				//No implementation needed
			}
		});
		addScrollListener(fRankCombo);

		//RuleId
		final CLabel ruleIdLabel = aWidgetFactory.createCLabel(anomalyDetailsSectionClient,
				R4EUIConstants.RULE_ID_LABEL);
		gridData = new GridData(SWT.FILL, SWT.CENTER, false, false);
		gridData.horizontalSpan = 1;
		ruleIdLabel.setToolTipText(R4EUIConstants.ANOMALY_RULE_ID_TOOLTIP);
		ruleIdLabel.setLayoutData(gridData);

		final Composite ruleComposite = aWidgetFactory.createComposite(anomalyDetailsSectionClient);
		gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
		gridData.horizontalSpan = 3;
		ruleComposite.setToolTipText(R4EUIConstants.ANOMALY_RULE_ID_TOOLTIP);
		ruleComposite.setLayoutData(gridData);
		ruleComposite.setLayout(new GridLayout(2, false));

		fRuleId = aWidgetFactory.createText(ruleComposite, "", SWT.NULL);
		fRuleId.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
		fRuleId.setEditable(false);
		fRuleButton = aWidgetFactory.createButton(ruleComposite, R4EUIConstants.UPDATE_LABEL, SWT.NONE);
		fRuleButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
		fRuleButton.addSelectionListener(new SelectionListener() {
			public void widgetSelected(SelectionEvent e) {
				//Modify anomaly
				R4EUIModelController.setJobInProgress(true);
				final R4EAnomaly modelAnomaly = ((R4EUIAnomalyBasic) fProperties.getElement()).getAnomaly();
				final IAnomalyInputDialog dialog = R4EUIDialogFactory.getInstance().getNewAnomalyInputDialog();
				dialog.create();
				dialog.setTitle(modelAnomaly.getTitle());
				dialog.setDescription(modelAnomaly.getDescription());
				dialog.setDueDate(modelAnomaly.getDueDate());
				if (modelAnomaly.getAssignedTo().size() > 0) {
					dialog.setAssigned(modelAnomaly.getAssignedTo().get(0));
				}
				if (null != modelAnomaly.getType()) {
					dialog.setClass_(((R4ECommentType) modelAnomaly.getType()).getType());
				}
				dialog.setRank(modelAnomaly.getRank());
				dialog.setRuleID(modelAnomaly.getRuleID());
				final int result = dialog.open();
				if (result == Window.OK) {
					try {
						if (!fRefreshInProgress
								&& ((R4EUIPostponedAnomaly) fProperties.getElement()).checkCompatibility()) {

							//Set new model data
							final String currentUser = R4EUIModelController.getReviewer();
							final Long bookNum = R4EUIModelController.FResourceUpdater.checkOut(modelAnomaly,
									currentUser);
							modelAnomaly.setTitle(dialog.getAnomalyTitleValue());
							modelAnomaly.setDescription(dialog.getAnomalyDescriptionValue());
							modelAnomaly.setDueDate(dialog.getDueDate());
							modelAnomaly.getAssignedTo().clear();
							modelAnomaly.getAssignedTo().add(dialog.getAssigned());
							if (null != dialog.getRuleReferenceValue()) {
								final R4EDesignRule rule = dialog.getRuleReferenceValue();
								final R4ECommentType commentType = RModelFactory.eINSTANCE.createR4ECommentType();
								commentType.setType(rule.getClass_());
								modelAnomaly.setType(commentType);
								modelAnomaly.setRank(rule.getRank());
								modelAnomaly.setRuleID(rule.getId());
							} else {
								final R4ECommentType commentType = RModelFactory.eINSTANCE.createR4ECommentType();
								commentType.setType(dialog.getClass_());
								modelAnomaly.setType(commentType);
								modelAnomaly.setRank(dialog.getRank());
								modelAnomaly.setRuleID("");
							}
							R4EUIModelController.FResourceUpdater.checkIn(bookNum);

							//Set new UI display
							if (fProperties.getElement() instanceof R4EUIAnomalyExtended) {
								fProperties.getElement().setName(
										R4EUIAnomalyExtended.buildAnomalyExtName(modelAnomaly,
												((R4EUIAnomalyBasic) fProperties.getElement()).getPosition()));
							} else {
								fProperties.getElement().setName(
										R4EUIAnomalyBasic.buildAnomalyName(modelAnomaly,
												((R4EUIAnomalyBasic) fProperties.getElement()).getPosition()));
							}
						}
					} catch (ResourceHandlingException e1) {
						UIUtils.displayResourceErrorDialog(e1);
					} catch (OutOfSyncException e1) {
						UIUtils.displaySyncErrorDialog(e1);
					} catch (CompatibilityException e1) {
						UIUtils.displayCompatibilityErrorDialog(e1);
					}
					refresh();
					R4EUIModelController.getNavigatorView().getTreeViewer().refresh();
				}
				R4EUIModelController.setJobInProgress(false); //Enable view
			}

			public void widgetDefaultSelected(SelectionEvent e) {
				// No implementation needed
			}
		});

		//Due Date
		final CLabel dateLabel = aWidgetFactory.createCLabel(anomalyDetailsSectionClient, R4EUIConstants.DUE_DATE_LABEL);
		gridData = new GridData(SWT.FILL, SWT.CENTER, false, false);
		gridData.horizontalSpan = 1;
		dateLabel.setLayoutData(gridData);

		final Composite dateComposite = aWidgetFactory.createComposite(anomalyDetailsSectionClient);
		gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
		gridData.horizontalSpan = 3;
		dateComposite.setToolTipText(R4EUIConstants.ANOMALY_DUE_DATE_TOOLTIP);
		dateComposite.setLayoutData(gridData);
		dateComposite.setLayout(new GridLayout(2, false));

		fDateText = aWidgetFactory.createText(dateComposite, "", SWT.NULL);
		fDateText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
		fDateText.setEditable(false);
		fCalendarButton = aWidgetFactory.createButton(dateComposite, "...", SWT.NONE);
		fCalendarButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
		fCalendarButton.addSelectionListener(new SelectionListener() {
			public void widgetSelected(SelectionEvent e) {
				R4EUIModelController.setJobInProgress(true);
				final ICalendarDialog dialog = R4EUIDialogFactory.getInstance().getCalendarDialog();
				final int result = dialog.open();
				if (result == Window.OK) {
					final SimpleDateFormat dateFormat = new SimpleDateFormat(R4EUIConstants.SIMPLE_DATE_FORMAT);
					fDateText.setText(dateFormat.format(dialog.getDate()));
					try {
						if (!fRefreshInProgress) {
							final String currentUser = R4EUIModelController.getReviewer();
							final R4EAnomaly modelAnomaly = ((R4EUIAnomalyBasic) fProperties.getElement()).getAnomaly();
							final Date newValue = dialog.getDate();
							if (!newValue.equals(modelAnomaly.getDueDate())) {
								if (((R4EUIPostponedAnomaly) fProperties.getElement()).checkCompatibility()) {

									final Long bookNum = R4EUIModelController.FResourceUpdater.checkOut(modelAnomaly,
											currentUser);
									modelAnomaly.setDueDate(newValue);
									R4EUIModelController.FResourceUpdater.checkIn(bookNum);
								}
							}
						}
					} catch (ResourceHandlingException e1) {
						UIUtils.displayResourceErrorDialog(e1);
					} catch (OutOfSyncException e1) {
						UIUtils.displaySyncErrorDialog(e1);
					} catch (CompatibilityException e1) {
						UIUtils.displayCompatibilityErrorDialog(e1);
					}
					refresh();
				}
				R4EUIModelController.setJobInProgress(false);
			}

			public void widgetDefaultSelected(SelectionEvent e) { // $codepro.audit.disable emptyMethod
				// No implementation needed
			}
		});

		return anomalyDetailsSection;
	}

	/**
	 * Method createParticipantDetailsSection.
	 * 
	 * @param aWidgetFactory
	 *            TabbedPropertySheetWidgetFactory
	 * @param aComposite
	 *            Composite
	 * @param aTopComposite
	 *            Composite
	 */
	private void createParticipantDetailsSection(TabbedPropertySheetWidgetFactory aWidgetFactory,
			final Composite aComposite, final Composite aTopComposite) {
		//Participants Details section
		final ExpandableComposite participantDetailsSection = aWidgetFactory.createExpandableComposite(aComposite,
				ExpandableComposite.TWISTIE);
		final FormData data = new FormData();
		data.left = new FormAttachment(0, 0);
		data.right = new FormAttachment(100, 0); // $codepro.audit.disable numericLiterals
		data.top = new FormAttachment(aTopComposite, ITabbedPropertyConstants.VSPACE);
		participantDetailsSection.setLayoutData(data);
		participantDetailsSection.setText(PARTICIPANT_DETAILS_SECTION_LABEL);
		participantDetailsSection.addExpansionListener(new ExpansionAdapter() {
			@Override
			public void expansionStateChanged(ExpansionEvent e) {
				final ScrolledComposite scrolledParent = (ScrolledComposite) aComposite.getParent()
						.getParent()
						.getParent()
						.getParent()
						.getParent();
				scrolledParent.setMinSize(aComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
				scrolledParent.layout(true, true);
			}
		});
		participantDetailsSection.setLayout(new GridLayout(1, false));

		final Composite participantDetailsSectionClient = aWidgetFactory.createComposite(participantDetailsSection);
		participantDetailsSectionClient.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
		participantDetailsSectionClient.setLayout(new GridLayout(4, false));
		participantDetailsSection.setClient(participantDetailsSectionClient);

		//Anomaly Author (read-only)
		final CLabel authorLabel = aWidgetFactory.createCLabel(participantDetailsSectionClient,
				R4EUIConstants.AUTHOR_LABEL);
		GridData gridData = new GridData(SWT.FILL, SWT.CENTER, false, false);
		gridData.horizontalSpan = 1;
		authorLabel.setToolTipText(R4EUIConstants.ANOMALY_AUTHOR_TOOLTIP);
		authorLabel.setLayoutData(gridData);

		aWidgetFactory.setBorderStyle(SWT.NULL);
		fAuthorText = aWidgetFactory.createText(participantDetailsSectionClient, "", SWT.NULL);
		gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
		gridData.horizontalSpan = 3;
		fAuthorText.setEditable(false);
		fAuthorText.setToolTipText(R4EUIConstants.ANOMALY_AUTHOR_TOOLTIP);
		fAuthorText.setLayoutData(gridData);

		//Decided by
		aWidgetFactory.setBorderStyle(SWT.BORDER);
		fDecidedByLabel = aWidgetFactory.createCLabel(participantDetailsSectionClient, R4EUIConstants.DECIDED_BY_LABEL);
		gridData = new GridData(SWT.FILL, SWT.CENTER, false, false);
		gridData.horizontalSpan = 1;
		fDecidedByLabel.setToolTipText(R4EUIConstants.ANOMALY_DECIDED_BY_TOOLTIP);
		fDecidedByLabel.setLayoutData(gridData);

		fDecidedByCombo = aWidgetFactory.createCCombo(participantDetailsSectionClient, SWT.READ_ONLY);
		gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
		gridData.horizontalSpan = 3;
		fDecidedByCombo.setToolTipText(R4EUIConstants.ANOMALY_DECIDED_BY_TOOLTIP);
		fDecidedByCombo.setLayoutData(gridData);
		fDecidedByCombo.addSelectionListener(new SelectionListener() {
			public void widgetSelected(SelectionEvent e) {
				try {
					if (!fRefreshInProgress) {

						final String currentUser = R4EUIModelController.getReviewer();
						final R4EAnomaly modelAnomaly = ((R4EUIAnomalyExtended) fProperties.getElement()).getAnomaly();
						final String newValue = fDecidedByCombo.getText();
						if (!newValue.equals(modelAnomaly.getDecidedByID())) {
							if (((R4EUIPostponedAnomaly) fProperties.getElement()).checkCompatibility()) {
								final Long bookNum = R4EUIModelController.FResourceUpdater.checkOut(modelAnomaly,
										currentUser);
								modelAnomaly.setDecidedByID(newValue);
								R4EUIModelController.FResourceUpdater.checkIn(bookNum);

								//Also update original anomaly
								((R4EUIPostponedAnomaly) fProperties.getElement()).updateOriginalAnomaly();
							}
						}
					}
				} catch (ResourceHandlingException e1) {
					UIUtils.displayResourceErrorDialog(e1);
				} catch (OutOfSyncException e1) {
					UIUtils.displaySyncErrorDialog(e1);
				} catch (CompatibilityException e1) {
					UIUtils.displayCompatibilityErrorDialog(e1);
				}
				refresh();
			}

			public void widgetDefaultSelected(SelectionEvent e) { // $codepro.audit.disable emptyMethod
				//No implementation needed
			}
		});
		addScrollListener(fDecidedByCombo);

		//Fixed by
		fFixedByLabel = aWidgetFactory.createCLabel(participantDetailsSectionClient, R4EUIConstants.FIXED_BY_LABEL);
		gridData = new GridData(SWT.FILL, SWT.CENTER, false, false);
		gridData.horizontalSpan = 1;
		fFixedByLabel.setToolTipText(R4EUIConstants.ANOMALY_FIXED_BY_TOOLTIP);
		fFixedByLabel.setLayoutData(gridData);

		fFixedByCombo = aWidgetFactory.createCCombo(participantDetailsSectionClient, SWT.READ_ONLY);
		gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
		gridData.horizontalSpan = 3;
		fFixedByCombo.setToolTipText(R4EUIConstants.ANOMALY_FIXED_BY_TOOLTIP);
		fFixedByCombo.setLayoutData(gridData);
		fFixedByCombo.addSelectionListener(new SelectionListener() {
			public void widgetSelected(SelectionEvent e) {
				try {
					if (!fRefreshInProgress) {

						final String currentUser = R4EUIModelController.getReviewer();
						final R4EAnomaly modelAnomaly = ((R4EUIAnomalyExtended) fProperties.getElement()).getAnomaly();
						final String newValue = fFixedByCombo.getText();
						if (!newValue.equals(modelAnomaly.getFixedByID())) {
							if (((R4EUIPostponedAnomaly) fProperties.getElement()).checkCompatibility()) {
								final Long bookNum = R4EUIModelController.FResourceUpdater.checkOut(modelAnomaly,
										currentUser);
								modelAnomaly.setFixedByID(newValue);
								R4EUIModelController.FResourceUpdater.checkIn(bookNum);

								//Also update original anomaly
								((R4EUIPostponedAnomaly) fProperties.getElement()).updateOriginalAnomaly();
							}
						}
					}
				} catch (ResourceHandlingException e1) {
					UIUtils.displayResourceErrorDialog(e1);
				} catch (OutOfSyncException e1) {
					UIUtils.displaySyncErrorDialog(e1);
				} catch (CompatibilityException e1) {
					UIUtils.displayCompatibilityErrorDialog(e1);
				}
				refresh();
			}

			public void widgetDefaultSelected(SelectionEvent e) { // $codepro.audit.disable emptyMethod
				//No implementation needed
			}
		});
		addScrollListener(fFixedByCombo);

		//Follow-up by
		fFollowUpByLabel = aWidgetFactory.createCLabel(participantDetailsSectionClient,
				R4EUIConstants.FOLLOWUP_BY_LABEL);
		gridData = new GridData(SWT.FILL, SWT.CENTER, false, false);
		gridData.horizontalSpan = 1;
		fFollowUpByLabel.setToolTipText(R4EUIConstants.ANOMALY_FOLLOWUP_BY_TOOLTIP);
		fFollowUpByLabel.setLayoutData(gridData);

		fFollowUpByCombo = aWidgetFactory.createCCombo(participantDetailsSectionClient, SWT.READ_ONLY);
		gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
		gridData.horizontalSpan = 3;
		fFollowUpByCombo.setToolTipText(R4EUIConstants.ANOMALY_FOLLOWUP_BY_TOOLTIP);
		fFollowUpByCombo.setLayoutData(gridData);
		fFollowUpByCombo.addSelectionListener(new SelectionListener() {
			public void widgetSelected(SelectionEvent e) {
				try {
					if (!fRefreshInProgress) {

						final String currentUser = R4EUIModelController.getReviewer();
						final R4EAnomaly modelAnomaly = ((R4EUIAnomalyExtended) fProperties.getElement()).getAnomaly();
						final String newValue = fFollowUpByCombo.getText();
						if (!newValue.equals(modelAnomaly.getFollowUpByID())) {
							if (((R4EUIPostponedAnomaly) fProperties.getElement()).checkCompatibility()) {
								final Long bookNum = R4EUIModelController.FResourceUpdater.checkOut(modelAnomaly,
										currentUser);
								modelAnomaly.setFollowUpByID(newValue);
								R4EUIModelController.FResourceUpdater.checkIn(bookNum);

								//Also update original anomaly
								((R4EUIPostponedAnomaly) fProperties.getElement()).updateOriginalAnomaly();
							}
						}
					}
				} catch (ResourceHandlingException e1) {
					UIUtils.displayResourceErrorDialog(e1);
				} catch (OutOfSyncException e1) {
					UIUtils.displaySyncErrorDialog(e1);
				} catch (CompatibilityException e1) {
					UIUtils.displayCompatibilityErrorDialog(e1);
				}
				refresh();
			}

			public void widgetDefaultSelected(SelectionEvent e) { // $codepro.audit.disable emptyMethod
				//No implementation needed
			}
		});
		addScrollListener(fFollowUpByCombo);
	}

	/**
	 * Method refresh.
	 * 
	 * @see org.eclipse.ui.views.properties.tabbed.ISection#refresh()
	 */
	@Override
	public void refresh() {
		fRefreshInProgress = true;
		final R4EUIPostponedAnomaly uiModelAnomaly = (R4EUIPostponedAnomaly) fProperties.getElement();
		final R4EAnomaly modelAnomaly = uiModelAnomaly.getAnomaly();

		String originalReview = uiModelAnomaly.getOriginalReviewName();
		if (null != originalReview) {
			fReviewNameText.setText(originalReview);
		} else {
			fReviewNameText.setText(""); //$NON-NLS-1$
		}
		fTitleText.setText(modelAnomaly.getTitle());
		fAuthorText.setText(modelAnomaly.getAuthor().getId());
		fCreationDateText.setText(modelAnomaly.getCreatedOn().toString());
		fPosition = ((R4EUIAnomalyBasic) fProperties.getElement()).getPosition();
		if (null == fPosition) {
			fPositionText.setText(R4EUIConstants.GLOBAL_ANOMALY_PROPERTY_VALUE);
		} else {
			fPositionText.setText(fPosition.toString());
		}
		fDescriptionText.setText(modelAnomaly.getDescription());

		String[] participants = R4EUIModelController.getActiveReview()
				.getParticipantIDs()
				.toArray(new String[R4EUIModelController.getActiveReview().getParticipantIDs().size()]);
		fAssignedToCombo.removeAll();
		fAssignedToCombo.add("");
		for (String participant : participants) {
			fAssignedToCombo.add(participant);
		}
		if (modelAnomaly.getAssignedTo().size() > 0 && null != modelAnomaly.getAssignedTo().get(0)) {
			fAssignedToCombo.setText(modelAnomaly.getAssignedTo().get(0));
		} else {
			fAssignedToCombo.setText("");
		}

		fClassCombo.setItems(UIUtils.getClasses());
		if (null != modelAnomaly.getType() && null != ((R4ECommentType) modelAnomaly.getType()).getType()) {
			fClassCombo.select(((R4ECommentType) modelAnomaly.getType()).getType().getValue());
		} else {
			fClassCombo.setText("");
		}

		fRankCombo.setItems(UIUtils.getRanks());
		//Bug 368865:  Mapping needed for DEPRECATED value to MINOR
		int rankValue = modelAnomaly.getRank().getValue();
		fRankCombo.select(rankValue == R4EDesignRuleRank.DEPRECATED_VALUE
				? R4EDesignRuleRank.MINOR_VALUE
				: rankValue);

		if (null != modelAnomaly.getRuleID()) {
			fRuleId.setText(modelAnomaly.getRuleID());
		}
		if (null != modelAnomaly.getDueDate()) {
			final SimpleDateFormat dateFormat = new SimpleDateFormat(R4EUIConstants.SIMPLE_DATE_FORMAT);
			fDateText.setText(dateFormat.format(modelAnomaly.getDueDate()));
		} else {
			fDateText.setText("");
		}

		if (fProperties.getElement() instanceof R4EUIAnomalyExtended) {
			fStateCombo.setItems(((R4EUIAnomalyExtended) uiModelAnomaly).getAvailableStates());
			fStateCombo.select(((R4EUIAnomalyExtended) uiModelAnomaly).mapStateToIndex(modelAnomaly.getState()));

			if (null != R4EUIModelController.getActiveReview()) {
				fDecidedByCombo.setItems(participants);
				int selectPos = UIUtils.mapParticipantToIndex(modelAnomaly.getDecidedByID());
				if (selectPos != R4EUIConstants.INVALID_VALUE) {
					fDecidedByCombo.select(selectPos);
				} else {
					//User is not valid anymore for selection, just display the text
					fDecidedByCombo.setText(modelAnomaly.getDecidedByID() != null ? modelAnomaly.getDecidedByID() : "");
				}

				fFixedByCombo.setItems(participants);
				selectPos = UIUtils.mapParticipantToIndex(modelAnomaly.getFixedByID());
				if (selectPos != R4EUIConstants.INVALID_VALUE) {
					fFixedByCombo.select(selectPos);
				} else {
					//User is not valid anymore for selection, just display the text
					fFixedByCombo.setText(modelAnomaly.getFixedByID() != null ? modelAnomaly.getFixedByID() : "");
				}

				fFollowUpByCombo.setItems(participants);
				selectPos = UIUtils.mapParticipantToIndex(modelAnomaly.getFollowUpByID());
				if (selectPos != R4EUIConstants.INVALID_VALUE) {
					fFollowUpByCombo.select(selectPos);
				} else {
					//User is not valid anymore for selection, just display the text
					fFollowUpByCombo.setText(modelAnomaly.getFollowUpByID() != null
							? modelAnomaly.getFollowUpByID()
							: "");
				}
			}
		}
		setEnabledFields();
		fRefreshInProgress = false;
	}

	/**
	 * Method setEditableFields.
	 */
	@Override
	protected void setEnabledFields() {
		if (R4EUIModelController.isJobInProgress()
				|| fProperties.getElement().isReadOnly()
				|| null == R4EUIModelController.getActiveReview()
				|| ((R4EReviewState) R4EUIModelController.getActiveReview().getReview().getState()).getState().equals(
						R4EReviewPhase.COMPLETED) || !fProperties.getElement().isEnabled()) {
			fReviewNameText.setForeground(UIUtils.DISABLED_FONT_COLOR);
			fTitleText.setForeground(UIUtils.DISABLED_FONT_COLOR);
			fTitleText.setEditable(false);
			fAuthorText.setForeground(UIUtils.DISABLED_FONT_COLOR);
			fCreationDateText.setForeground(UIUtils.DISABLED_FONT_COLOR);
			fPositionText.setForeground(UIUtils.DISABLED_FONT_COLOR);
			fDescriptionText.setForeground(UIUtils.DISABLED_FONT_COLOR);
			fDescriptionText.setEditable(false);
			fStateCombo.setEnabled(false);
			fClassCombo.setEnabled(false);
			fRankCombo.setEnabled(false);
			fDateText.setForeground(UIUtils.DISABLED_FONT_COLOR);
			fCalendarButton.setEnabled(false);
			fDecidedByCombo.setEnabled(false);
			fFixedByCombo.setEnabled(false);
			fFollowUpByCombo.setEnabled(false);
			fRuleButton.setEnabled(false);
			fRuleId.setForeground(UIUtils.DISABLED_FONT_COLOR);
			fAssignedToCombo.setEnabled(false);
			if (fProperties.getElement() instanceof R4EUIAnomalyExtended) {
				fStateLabel.setVisible(true);
				fStateCombo.setVisible(true);
				fDecidedByLabel.setVisible(true);
				fDecidedByCombo.setVisible(true);
				fFixedByLabel.setVisible(true);
				fFixedByCombo.setVisible(true);
				fFollowUpByLabel.setVisible(true);
				fFollowUpByCombo.setVisible(true);
			} else {
				fStateLabel.setVisible(false);
				fStateCombo.setVisible(false);
				fDecidedByLabel.setVisible(false);
				fDecidedByCombo.setVisible(false);
				fFixedByLabel.setVisible(false);
				fFixedByCombo.setVisible(false);
				fFollowUpByLabel.setVisible(false);
				fFollowUpByCombo.setVisible(false);
			}
		} else {
			fReviewNameText.setForeground(UIUtils.ENABLED_FONT_COLOR);
			fAuthorText.setForeground(UIUtils.ENABLED_FONT_COLOR);
			fCreationDateText.setForeground(UIUtils.ENABLED_FONT_COLOR);
			fPositionText.setForeground(UIUtils.ENABLED_FONT_COLOR);
			fDescriptionText.setForeground(UIUtils.ENABLED_FONT_COLOR);
			fDescriptionText.setEditable(true);
			fRuleButton.setEnabled(true);
			fRuleId.setForeground(UIUtils.ENABLED_FONT_COLOR);
			fAssignedToCombo.setEnabled(true);

			final R4EUIAnomalyBasic uiAnomaly = (R4EUIAnomalyBasic) fProperties.getElement();

			if (uiAnomaly.isTitleEnabled()) {
				fTitleText.setForeground(UIUtils.ENABLED_FONT_COLOR);
				fTitleText.setEditable(true);
			} else {
				fTitleText.setForeground(UIUtils.DISABLED_FONT_COLOR);
				fTitleText.setEditable(false);
			}

			if (uiAnomaly.isDueDateEnabled()) {
				fDateText.setForeground(UIUtils.ENABLED_FONT_COLOR);
				fCalendarButton.setEnabled(true);
			} else {
				fDateText.setForeground(UIUtils.DISABLED_FONT_COLOR);
				fCalendarButton.setEnabled(false);
			}

			if (uiAnomaly.isClassEnabled()) {
				fClassCombo.setEnabled(true);
			} else {
				fClassCombo.setEnabled(false);
			}

			if (uiAnomaly.isRankEnabled()) {
				fRankCombo.setEnabled(true);
			} else {
				fRankCombo.setEnabled(false);
			}

			if (fProperties.getElement() instanceof R4EUIAnomalyExtended) {
				fStateLabel.setVisible(true);
				fStateCombo.setVisible(true);
				fStateCombo.setEnabled(true);

				fDecidedByLabel.setVisible(true);
				fDecidedByCombo.setVisible(true);
				if (((R4EUIAnomalyExtended) uiAnomaly).isDecidedByEnabled()) {
					fDecidedByCombo.setEnabled(true);
				} else {
					fDecidedByCombo.setEnabled(false);
				}

				fFixedByLabel.setVisible(true);
				fFixedByCombo.setVisible(true);
				if (((R4EUIAnomalyExtended) uiAnomaly).isFixedByEnabled()) {
					fFixedByCombo.setEnabled(true);
				} else {
					fFixedByCombo.setEnabled(false);
				}

				fFollowUpByLabel.setVisible(true);
				fFollowUpByCombo.setVisible(true);
				if (((R4EUIAnomalyExtended) uiAnomaly).isFollowUpByEnabled()) {
					fFollowUpByCombo.setEnabled(true);
				} else {
					fFollowUpByCombo.setEnabled(false);
				}
			} else {
				fStateLabel.setVisible(false);
				fStateCombo.setVisible(false);
				fDecidedByCombo.setEnabled(false);
				fFixedByCombo.setEnabled(false);
				fFollowUpByCombo.setEnabled(false);
				fDecidedByLabel.setVisible(false);
				fDecidedByCombo.setVisible(false);
				fFixedByLabel.setVisible(false);
				fFixedByCombo.setVisible(false);
				fFollowUpByLabel.setVisible(false);
				fFollowUpByCombo.setVisible(false);
			}
		}
	}
}
