/*******************************************************************************
 * Copyright (c) 2010 Tasktop Technologies and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Tasktop Technologies - initial API and implementation
 *     Itema AS - Minor enhancements
 *******************************************************************************/

package org.eclipse.mylyn.internal.builds.ui.editor;

import java.util.LinkedHashSet;
import java.util.Set;

import org.eclipse.mylyn.builds.core.IBuild;
import org.eclipse.mylyn.builds.core.IBuildCause;
import org.eclipse.mylyn.builds.internal.core.BuildPackage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.TableWrapLayout;

/**
 * @author Steffen Pingel
 * @author Torkild U. Resheim
 */
public class SummaryPart extends AbstractBuildEditorPart {

	public SummaryPart() {
		super(ExpandableComposite.TITLE_BAR | ExpandableComposite.EXPANDED);
		setPartName(Messages.SummaryPart_Summary);
	}

	private void append(StringBuilder sb, String text) {
		if (text != null) {
			if (sb.length() > 0) {
				sb.append(". "); //$NON-NLS-1$
			}
			sb.append(text);
		}
	}

	@Override
	protected Control createContent(Composite parent, FormToolkit toolkit) {
		Composite composite = toolkit.createComposite(parent);
		TableWrapLayout layout = new TableWrapLayout();
		layout.numColumns = 2;
		composite.setLayout(layout);

		Text text;

		createLabel(composite, toolkit, Messages.SummaryPart_StartedOn);
		text = createTextReadOnly(composite, toolkit, ""); //$NON-NLS-1$
		bind(text, IBuild.class, BuildPackage.Literals.BUILD__TIMESTAMP);

		IBuild build = getInput(IBuild.class);

		if (build.getCause().size() > 0) {
			Set<String> causeDescriptions = new LinkedHashSet<String>();
			for (IBuildCause cause : build.getCause()) {
				if (cause.getDescription() != null) {
					causeDescriptions.add(cause.getDescription());
				}
			}
			StringBuilder sb = new StringBuilder();
			for (String string : causeDescriptions) {
				append(sb, string);
			}
			if (sb.length() > 0) {
				sb.append("."); //$NON-NLS-1$
			}

			createLabel(composite, toolkit, Messages.SummaryPart_Cause);
			text = createTextReadOnly(composite, toolkit, "", SWT.WRAP); //$NON-NLS-1$
			text.setText(sb.toString());
		}

		return composite;
	}

	public Control createControl(Composite parent, FormToolkit toolkit) {
		return createContent(parent, toolkit);
	}

}
