// $codepro.audit.disable com.instantiations.assist.eclipse.analysis.audit.rule.effectivejava.alwaysOverridetoString.alwaysOverrideToString, com.instantiations.assist.eclipse.analysis.deserializeabilitySecurity, com.instantiations.assist.eclipse.analysis.disallowReturnMutable, com.instantiations.assist.eclipse.analysis.enforceCloneableUsageSecurity
/*******************************************************************************
 * Copyright (c) 2010, 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 extends the default tree viewer to be able to browse the items
 * using user-defined commands
 * 
 * Contributors:
 *   Sebastien Dubois - Created for Mylyn Review R4E project
 *   
 ******************************************************************************/
package org.eclipse.mylyn.reviews.r4e.ui.internal.navigator;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.layout.TreeColumnLayout;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.DecoratingCellLabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.mylyn.reviews.r4e.core.model.R4EFileVersion;
import org.eclipse.mylyn.reviews.r4e.ui.internal.filters.TreeTableFilter;
import org.eclipse.mylyn.reviews.r4e.ui.internal.model.IR4EUIModelElement;
import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIFileContext;
import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIModelController;
import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIReviewBasic;
import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIReviewGroup;
import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIReviewItem;
import org.eclipse.mylyn.reviews.r4e.ui.internal.model.R4EUIRootElement;
import org.eclipse.mylyn.reviews.r4e.ui.internal.sorters.TreeTableComparator;
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.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.TreeItem;

/**
 * @author Sebastien Dubois
 * @version $Revision: 1.0 $
 */
public class ReviewNavigatorTreeViewer extends TreeViewer {

	// ------------------------------------------------------------------------
	// Constants
	// ------------------------------------------------------------------------

	/**
	 * Field REVIEW_COLUMN_LABEL. (value is ""Review: "")
	 */
	private static final String REVIEW_COLUMN_LABEL = "Review-> "; //$NON-NLS-1$

	/**
	 * Field REVIEW_GROUP_COLUMN_TOOLTIP. (value is ""Group: "")
	 */
	private static final String REVIEW_GROUP_COLUMN_TOOLTIP = "Group-> "; //$NON-NLS-1$

	/**
	 * Field INVALID_PATH. (value is ""--"")
	 */
	private static final String INVALID_PATH = "--"; //$NON-NLS-1$

	/**
	 * Field VERSION_TARGET_LABEL. (value is ""Target Version: "")
	 */
	private static final String VERSION_TARGET_LABEL = "Target Version: "; //$NON-NLS-1$

	/**
	 * Field VERSION_BASE_LABEL. (value is ""Base Version: "")
	 */
	private static final String VERSION_BASE_LABEL = "Base Version: "; //$NON-NLS-1$

	/**
	 * Field NUM_CHANGES_ITEM_COLUMN_TOOLTIP. (value is ""Number of Reviewed Changes / Number of Changes for this Review
	 * Item"")
	 */
	private static final String NUM_CHANGES_ITEM_COLUMN_TOOLTIP = "Number of Reviewed Changes / Number of Changes for this Review Item"; //$NON-NLS-1$

	/**
	 * Field NUM_CHANGES_FILE_COLUMN_TOOLTIP. (value is ""Number of Changes for this File"")
	 */
	private static final String NUM_CHANGES_FILE_COLUMN_TOOLTIP = "Number of Changes for this File"; //$NON-NLS-1$

	/**
	 * Field NUM_ANOMALIES_COLUMN_TOOLTIP. (value is ""Number of Anomalies written for this File"")
	 */
	private static final String NUM_ANOMALIES_COLUMN_TOOLTIP = "Number of Anomalies written for this File"; //$NON-NLS-1$

	// ------------------------------------------------------------------------
	// Member variables
	// ------------------------------------------------------------------------

	/**
	 * Field fIsDefaultDisplay.
	 */
	private boolean fIsDefaultDisplay = true;

	/**
	 * Field fDefaultInput.
	 */
	private Object fDefaultInput = null;

	/**
	 * Field fTreeColumnLayout.
	 */
	private TreeColumnLayout fTreeColumnLayout = null;

	/**
	 * Field fTreeComparator.
	 */
	ViewerComparator fTreeComparator = null;

	/**
	 * Field fTreeTableComparator.
	 */
	TreeTableComparator fTreeTableComparator = null;

	/**
	 * Field fElementColumn.
	 */
	private TreeViewerColumn fElementColumn = null;

	/**
	 * Field fPathColumn.
	 */
	private TreeViewerColumn fPathColumn = null;

	/**
	 * Field fAssignColumn.
	 */
	private TreeViewerColumn fAssignColumn = null;

	/**
	 * Field fNumChangesColumn.
	 */
	private TreeViewerColumn fNumChangesColumn = null;

	/**
	 * Field fNumAnomaliesColumn.
	 */
	private TreeViewerColumn fNumAnomaliesColumn = null;

	/**
	 * Field fElementColumnWeight.
	 */
	private int fElementColumnWeight = 25;

	/**
	 * Field fPathColumnWeight.
	 */
	private int fPathColumnWeight = 50;

	/**
	 * Field fAssignColumnWeigth.
	 */
	private int fAssignColumnWeight = 9;

	/**
	 * Field fNumChangesColumnWeight.
	 */
	private int fNumChangesColumnWeight = 8;

	/**
	 * Field fNumAnomaliesColumnWeigth.
	 */
	private int fNumAnomaliesColumnWeight = 8;

	// ------------------------------------------------------------------------
	// Methods
	// ------------------------------------------------------------------------

	/**
	 * Method isDefaultDisplay.
	 * 
	 * @return boolean
	 */
	public boolean isDefaultDisplay() {
		return fIsDefaultDisplay;
	}

	/**
	 * Method setDefaultInput.
	 * 
	 * @param aInput
	 *            - Object
	 */
	public void setDefaultInput(Object aInput) {
		fDefaultInput = aInput;
	}

	/**
	 * Constructor for ReviewNavigatorTreeViewer.
	 * 
	 * @param aParent
	 *            Composite
	 * @param aStyle
	 *            int
	 */
	public ReviewNavigatorTreeViewer(Composite aParent, int aStyle) {
		super(aParent, aStyle);
		fTreeColumnLayout = new TreeColumnLayout();
		fTreeTableComparator = new TreeTableComparator();
		aParent.setLayout(fTreeColumnLayout);
	}

	/**
	 * Method getPrevious.
	 * 
	 * @param aItem
	 *            TreeItem
	 * @return TreeItem
	 */
	public TreeItem getPrevious(TreeItem aItem) {
		final TreeItem newItem = (TreeItem) getPreviousItem(aItem);
		if (null == newItem) {
			return aItem;
		}
		return newItem;
	}

	/**
	 * Method getNext.
	 * 
	 * @param aItem
	 *            TreeItem
	 * @return TreeItem
	 */
	public TreeItem getNext(TreeItem aItem) {
		final TreeItem newItem = (TreeItem) getNextItem(aItem, true);
		if (null == newItem) {
			return aItem;
		}
		return newItem;
	}

	/**
	 * Method setViewTree.
	 */
	public void setViewTree() {
		final Object[] expandedElements = getExpandedElements();

		double elementColumnWidth = R4EUIConstants.INVALID_VALUE;
		double pathColumnWidth = R4EUIConstants.INVALID_VALUE;
		double assignColumnWidth = R4EUIConstants.INVALID_VALUE;
		double numChangesColumnWidth = R4EUIConstants.INVALID_VALUE;
		double numAnomaliesColumnWidth = R4EUIConstants.INVALID_VALUE;

		if (null != fElementColumn) {
			elementColumnWidth = fElementColumn.getColumn().getWidth();
		}
		createElementsColumn();
		getTree().setHeaderVisible(false);
		if (null != fPathColumn) {
			pathColumnWidth = fPathColumn.getColumn().getWidth();
			fPathColumn.getColumn().dispose();
			fPathColumn = null;
		}
		if (null != fAssignColumn) {
			assignColumnWidth = fAssignColumn.getColumn().getWidth();
			fAssignColumn.getColumn().dispose();
			fAssignColumn = null;
		}
		if (null != fNumChangesColumn) {
			numChangesColumnWidth = fNumChangesColumn.getColumn().getWidth();
			fNumChangesColumn.getColumn().dispose();
			fNumChangesColumn = null;
		}
		if (null != fNumAnomaliesColumn) {
			numAnomaliesColumnWidth = fNumAnomaliesColumn.getColumn().getWidth();
			fNumAnomaliesColumn.getColumn().dispose();
			fNumAnomaliesColumn = null;
		}
		fTreeColumnLayout.setColumnData(fElementColumn.getColumn(), new ColumnWeightData(100, true));

		//Calculate column weights to preserve (if any)
		if (elementColumnWidth != R4EUIConstants.INVALID_VALUE && pathColumnWidth != R4EUIConstants.INVALID_VALUE
				&& assignColumnWidth != R4EUIConstants.INVALID_VALUE
				&& numChangesColumnWidth != R4EUIConstants.INVALID_VALUE
				&& numAnomaliesColumnWidth != R4EUIConstants.INVALID_VALUE) {
			final double totalWidth = elementColumnWidth + pathColumnWidth + assignColumnWidth + numChangesColumnWidth
					+ numAnomaliesColumnWidth;
			fElementColumnWeight = (int) ((elementColumnWidth / totalWidth) * 100);
			fPathColumnWeight = (int) ((pathColumnWidth / totalWidth) * 100);
			fAssignColumnWeight = (int) ((assignColumnWidth / totalWidth) * 100);
			fNumChangesColumnWeight = (int) ((numChangesColumnWidth / totalWidth) * 100);
			fNumAnomaliesColumnWeight = (int) ((numAnomaliesColumnWidth / totalWidth) * 100);
		}
		fIsDefaultDisplay = true;

		//Remove Tree Table filters
		final TreeTableFilter filter = ((ReviewNavigatorActionGroup) R4EUIModelController.getNavigatorView()
				.getActionSet()).getTreeTableFilter();
		this.removeFilter(filter);

		//Restore Tree sorters (if any)
		setComparator(fTreeComparator);

		//Restore Default Tree input
		this.setInput(fDefaultInput);

		//Refresh Display	
		this.getTree().getParent().layout();

		//Set Expanded states correctly
		final List<Object> updatedExpandedElements = new ArrayList<Object>();
		if (expandedElements.length > 0) {
			if (null != expandedElements[0] && null != ((IR4EUIModelElement) expandedElements[0]).getParent()) {
				updatedExpandedElements.add(((IR4EUIModelElement) expandedElements[0]).getParent());
				if (null != ((IR4EUIModelElement) expandedElements[0]).getParent().getParent()) {
					updatedExpandedElements.add(((IR4EUIModelElement) expandedElements[0]).getParent().getParent());
				}
			}
			for (Object expandedElement : expandedElements) {
				if (null != expandedElement) {
					updatedExpandedElements.add(expandedElement);
				}
			}
		} else {
			final R4EUIReviewBasic activeReview = R4EUIModelController.getActiveReview();
			if (null != activeReview) {
				updatedExpandedElements.add(activeReview);
				if (null != activeReview.getParent()) {
					updatedExpandedElements.add(activeReview.getParent());
				}
			}
		}
		Object[] elementsToExpand = updatedExpandedElements.toArray(new Object[updatedExpandedElements.size()]);
		setExpandedElements(elementsToExpand);
	}

	/**
	 * Method setViewTreeTable.
	 */
	public void setViewTreeTable() {
		final Object[] expandedElements = getExpandedElements();

		//Create Columns
		createPathColumn();
		createAssignmentColumn();
		createNumChangesColumn();
		createNumAnomaliesColumn();
		getTree().setHeaderVisible(true);

		//Reset Layout to adjust Columns widths
		fTreeColumnLayout.setColumnData(fElementColumn.getColumn(), new ColumnWeightData(fElementColumnWeight, true));
		fTreeColumnLayout.setColumnData(fPathColumn.getColumn(), new ColumnWeightData(fPathColumnWeight, true));
		fTreeColumnLayout.setColumnData(fAssignColumn.getColumn(), new ColumnWeightData(fAssignColumnWeight, true));
		fTreeColumnLayout.setColumnData(fNumChangesColumn.getColumn(), new ColumnWeightData(fNumChangesColumnWeight,
				true));
		fTreeColumnLayout.setColumnData(fNumAnomaliesColumn.getColumn(), new ColumnWeightData(
				fNumAnomaliesColumnWeight, true));

		final R4EUIReviewBasic activeReview = R4EUIModelController.getActiveReview();
		if (null != activeReview) {
			fElementColumn.getColumn().setText(activeReview.getReview().getName());
			fElementColumn.getColumn().setToolTipText(
					REVIEW_GROUP_COLUMN_TOOLTIP + activeReview.getParent().getName() + R4EUIConstants.LINE_FEED
							+ REVIEW_COLUMN_LABEL + activeReview.getName());
		}

		//Set Tree Table Filters (shows only Review Items and Files for current review
		final TreeTableFilter filter = ((ReviewNavigatorActionGroup) R4EUIModelController.getNavigatorView()
				.getActionSet()).getTreeTableFilter();
		fIsDefaultDisplay = false;

		//Save Default Tree input and adjust Tree Table input
		fDefaultInput = this.getInput();
		if (fDefaultInput instanceof R4EUIRootElement || fDefaultInput instanceof R4EUIReviewGroup) {
			this.setInput(R4EUIModelController.getActiveReview());
		}
		this.addFilter(filter);

		//Set Default sorter
		fTreeComparator = getComparator();
		setComparator(fTreeTableComparator);

		//Refresh Display	
		this.getTree().getParent().layout();
		setExpandedElements(expandedElements);
	}

	/**
	 * Method createElementsColumn.
	 */
	public void createElementsColumn() {
		if (null == fElementColumn) {
			final DecoratingCellLabelProvider provider = new DecoratingCellLabelProvider(
					new ReviewNavigatorLabelProvider(), new ReviewNavigatorDecorator());
			fElementColumn = new TreeViewerColumn(this, SWT.NONE);
			fElementColumn.setLabelProvider(provider);
			fElementColumn.getColumn().setMoveable(false);
			fElementColumn.getColumn().setResizable(true);

			fElementColumn.getColumn().addListener(SWT.Selection, new Listener() {
				public void handleEvent(Event event) {
					if (!isDefaultDisplay()) {
						fTreeTableComparator.setColumnName(R4EUIConstants.ELEMENTS_LABEL_NAME);
						getTree().setSortDirection(fTreeTableComparator.getDirection());
						getTree().setSortColumn(fElementColumn.getColumn());
						refresh();
					}
				}
			});
		}
	}

	/**
	 * Method createPathColumn.
	 */
	private void createPathColumn() {
		if (null == fPathColumn) {
			fPathColumn = new TreeViewerColumn(this, SWT.NONE);
			fPathColumn.getColumn().setText(R4EUIConstants.PATH_LABEL);
			fTreeColumnLayout.setColumnData(fPathColumn.getColumn(), new ColumnWeightData(0, true));
			fPathColumn.getColumn().setMoveable(true);
			fPathColumn.getColumn().setResizable(true);
			fPathColumn.setLabelProvider(new ColumnLabelProvider() {
				@Override
				public String getText(Object aElement) {
					if (aElement instanceof R4EUIFileContext) {
						//First try target file version
						R4EFileVersion version = ((R4EUIFileContext) aElement).getTargetFileVersion();
						if (null != version) {
							return UIUtils.getProjectPath(version);
						} else {
							//Try base file version
							version = ((R4EUIFileContext) aElement).getBaseFileVersion();
							if (null != version) {
								return UIUtils.getProjectPath(version);
							} else {
								return INVALID_PATH;
							}
						}
					} else {
						return null;
					}
				}

				@Override
				public String getToolTipText(Object aElement) {
					final StringBuffer buffer = new StringBuffer();
					if (aElement instanceof R4EUIFileContext) {
						final R4EFileVersion targetVersion = ((R4EUIFileContext) aElement).getTargetFileVersion();
						final R4EFileVersion baseVersion = ((R4EUIFileContext) aElement).getBaseFileVersion();
						buffer.append(R4EUIConstants.FILE_LABEL);
						if (null != targetVersion) {
							buffer.append(UIUtils.getProjectPath(targetVersion));
						} else if (null != baseVersion) {
							buffer.append(UIUtils.getProjectPath(baseVersion));
						} else {
							buffer.append(INVALID_PATH);
						}
						buffer.append(R4EUIConstants.LINE_FEED);
						buffer.append(VERSION_TARGET_LABEL);
						if (null == targetVersion) {
							buffer.append(R4EUIConstants.NO_VERSION_PROPERTY_MESSAGE);
						} else {
							buffer.append(targetVersion.getVersionID());
						}
						buffer.append(R4EUIConstants.LINE_FEED);
						buffer.append(VERSION_BASE_LABEL);
						if (null == baseVersion) {
							buffer.append(R4EUIConstants.NO_VERSION_PROPERTY_MESSAGE);
						} else {
							buffer.append(baseVersion.getVersionID());
						}
						return buffer.toString();
					}
					return null;
				}

				@Override
				public Point getToolTipShift(Object object) {
					return new Point(R4EUIConstants.TOOLTIP_DISPLAY_OFFSET_X, R4EUIConstants.TOOLTIP_DISPLAY_OFFSET_Y);
				}

				@Override
				public int getToolTipDisplayDelayTime(Object object) {
					return R4EUIConstants.TOOLTIP_DISPLAY_DELAY;
				}

				@Override
				public int getToolTipTimeDisplayed(Object object) {
					return R4EUIConstants.TOOLTIP_DISPLAY_TIME;
				}

				@Override
				public void update(ViewerCell cell) {
					final Object element = cell.getElement();
					if (element instanceof R4EUIFileContext) {
						//First try target file version
						R4EFileVersion version = ((R4EUIFileContext) element).getTargetFileVersion();
						if (null != version) {
							cell.setText(UIUtils.getProjectPath(version));
						} else {
							//Try base file version
							version = ((R4EUIFileContext) element).getBaseFileVersion();
							if (null != version) {
								cell.setText(UIUtils.getProjectPath(version));
							} else {
								cell.setText(INVALID_PATH);
							}
						}
					} else {
						cell.setText(null);
					}
				}
			});

			fPathColumn.getColumn().addListener(SWT.Selection, new Listener() {
				public void handleEvent(Event event) {
					fTreeTableComparator.setColumnName(R4EUIConstants.PATH_LABEL);
					getTree().setSortDirection(fTreeTableComparator.getDirection());
					getTree().setSortColumn(fPathColumn.getColumn());
					refresh();
				}
			});
		}
	}

	/**
	 * Method createAssignmentColumn.
	 */
	private void createAssignmentColumn() {
		if (null == fAssignColumn) {
			fAssignColumn = new TreeViewerColumn(this, SWT.NONE);
			fAssignColumn.getColumn().setText(R4EUIConstants.ASSIGNED_TO_LABEL2);
			fTreeColumnLayout.setColumnData(fAssignColumn.getColumn(), new ColumnWeightData(0, true));
			fAssignColumn.getColumn().setMoveable(true);
			fAssignColumn.getColumn().setResizable(true);
			fAssignColumn.setLabelProvider(new ColumnLabelProvider() {
				@Override
				public String getText(Object element) {
					if (element instanceof R4EUIReviewItem) {
						return UIUtils.formatAssignedParticipants(((R4EUIReviewItem) element).getItem().getAssignedTo());
					} else if (element instanceof R4EUIFileContext) {
						return UIUtils.formatAssignedParticipants(((R4EUIFileContext) element).getFileContext()
								.getAssignedTo());
					}
					return null;
				}

				@Override
				public String getToolTipText(Object element) {
					return null;
				}

				@Override
				public Point getToolTipShift(Object object) {
					return new Point(R4EUIConstants.TOOLTIP_DISPLAY_OFFSET_X, R4EUIConstants.TOOLTIP_DISPLAY_OFFSET_Y);
				}

				@Override
				public int getToolTipDisplayDelayTime(Object object) {
					return R4EUIConstants.TOOLTIP_DISPLAY_DELAY;
				}

				@Override
				public int getToolTipTimeDisplayed(Object object) {
					return 0;
				}

				@Override
				public void update(ViewerCell cell) {
					final Object element = cell.getElement();
					if (element instanceof R4EUIReviewItem) {
						cell.setText(UIUtils.formatAssignedParticipants(((R4EUIReviewItem) element).getItem()
								.getAssignedTo()));
					} else if (element instanceof R4EUIFileContext) {
						cell.setText(UIUtils.formatAssignedParticipants(((R4EUIFileContext) element).getFileContext()
								.getAssignedTo()));
					} else {
						cell.setText(null);
					}
				}
			});

			fAssignColumn.getColumn().addListener(SWT.Selection, new Listener() {
				public void handleEvent(Event event) {
					fTreeTableComparator.setColumnName(R4EUIConstants.ASSIGNED_TO_LABEL2);
					getTree().setSortDirection(fTreeTableComparator.getDirection());
					getTree().setSortColumn(fAssignColumn.getColumn());
					refresh();
				}
			});
		}
	}

	/**
	 * Method createNumChangesColumn.
	 */
	private void createNumChangesColumn() {
		if (null == fNumChangesColumn) {
			fNumChangesColumn = new TreeViewerColumn(this, SWT.NONE);
			fNumChangesColumn.getColumn().setText(R4EUIConstants.CHANGES_LABEL);
			fTreeColumnLayout.setColumnData(fNumChangesColumn.getColumn(), new ColumnWeightData(0, true));
			fNumChangesColumn.getColumn().setMoveable(true);
			fNumChangesColumn.getColumn().setResizable(true);
			fNumChangesColumn.setLabelProvider(new ColumnLabelProvider() {
				@Override
				public String getText(Object element) {
					if (element instanceof R4EUIReviewItem) {
						return UIUtils.formatNumChanges(((R4EUIReviewItem) element).getNumChanges(),
								((R4EUIReviewItem) element).getNumReviewedChanges());
					} else if (element instanceof R4EUIFileContext) {
						return UIUtils.formatNumChanges(((R4EUIFileContext) element).getNumChanges(),
								((R4EUIFileContext) element).getNumReviewedChanges());
					}
					return null;
				}

				@Override
				public String getToolTipText(Object element) {
					if (element instanceof R4EUIReviewItem) {
						return NUM_CHANGES_ITEM_COLUMN_TOOLTIP;
					} else { //Assume File
						return NUM_CHANGES_FILE_COLUMN_TOOLTIP;
					}
				}

				@Override
				public Point getToolTipShift(Object object) {
					return new Point(R4EUIConstants.TOOLTIP_DISPLAY_OFFSET_X, R4EUIConstants.TOOLTIP_DISPLAY_OFFSET_Y);
				}

				@Override
				public int getToolTipDisplayDelayTime(Object object) {
					return R4EUIConstants.TOOLTIP_DISPLAY_DELAY;
				}

				@Override
				public int getToolTipTimeDisplayed(Object object) {
					return R4EUIConstants.TOOLTIP_DISPLAY_TIME;
				}

				@Override
				public void update(ViewerCell cell) {
					final Object element = cell.getElement();
					if (element instanceof R4EUIReviewItem) {
						cell.setText(UIUtils.formatNumChanges(((R4EUIReviewItem) element).getNumChanges(),
								((R4EUIReviewItem) element).getNumReviewedChanges()));
					} else if (element instanceof R4EUIFileContext) {
						cell.setText(UIUtils.formatNumChanges(((R4EUIFileContext) element).getNumChanges(),
								((R4EUIFileContext) element).getNumReviewedChanges()));
					} else {
						cell.setText(null);
					}
				}
			});

			fNumChangesColumn.getColumn().addListener(SWT.Selection, new Listener() {
				public void handleEvent(Event event) {
					fTreeTableComparator.setColumnName(R4EUIConstants.CHANGES_LABEL);
					getTree().setSortDirection(fTreeTableComparator.getDirection());
					getTree().setSortColumn(fNumChangesColumn.getColumn());
					refresh();
				}
			});
		}
	}

	/**
	 * Method createNumAnomaliesColumn.
	 */
	private void createNumAnomaliesColumn() {
		if (null == fNumAnomaliesColumn) {
			fNumAnomaliesColumn = new TreeViewerColumn(this, SWT.NONE);
			fNumAnomaliesColumn.getColumn().setText(R4EUIConstants.ANOMALIES_LABEL);
			fNumAnomaliesColumn.getColumn().setMoveable(true);
			fNumAnomaliesColumn.getColumn().setResizable(true);
			fTreeColumnLayout.setColumnData(fNumAnomaliesColumn.getColumn(), new ColumnWeightData(0, true));
			fNumAnomaliesColumn.setLabelProvider(new ColumnLabelProvider() {
				@Override
				public String getText(Object element) {
					if (element instanceof R4EUIReviewItem) {
						return Integer.toString(((R4EUIReviewItem) element).getNumAnomalies());
					} else if (element instanceof R4EUIFileContext) {
						return Integer.toString(((R4EUIFileContext) element).getNumAnomalies());
					}
					return null;
				}

				@Override
				public String getToolTipText(Object element) {
					return NUM_ANOMALIES_COLUMN_TOOLTIP;
				}

				@Override
				public Point getToolTipShift(Object object) {
					return new Point(R4EUIConstants.TOOLTIP_DISPLAY_OFFSET_X, R4EUIConstants.TOOLTIP_DISPLAY_OFFSET_Y);
				}

				@Override
				public int getToolTipDisplayDelayTime(Object object) {
					return R4EUIConstants.TOOLTIP_DISPLAY_DELAY;
				}

				@Override
				public int getToolTipTimeDisplayed(Object object) {
					return R4EUIConstants.TOOLTIP_DISPLAY_TIME;
				}

				@Override
				public void update(ViewerCell cell) {
					final Object element = cell.getElement();
					if (element instanceof R4EUIReviewItem) {
						cell.setText(Integer.toString(((R4EUIReviewItem) element).getNumAnomalies()));
					} else if (element instanceof R4EUIFileContext) {
						cell.setText(Integer.toString(((R4EUIFileContext) element).getNumAnomalies()));
					} else {
						cell.setText(null);
					}
				}
			});

			fNumAnomaliesColumn.getColumn().addListener(SWT.Selection, new Listener() {
				public void handleEvent(Event event) {
					// ignore
					fTreeTableComparator.setColumnName(R4EUIConstants.ANOMALIES_LABEL);
					getTree().setSortDirection(fTreeTableComparator.getDirection());
					getTree().setSortColumn(fNumAnomaliesColumn.getColumn());
					refresh();
				}
			});
		}
	}
}
