/*******************************************************************************
 * Copyright (c) 2007 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.tests.views.properties.tabbed.override.items;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.forms.widgets.TableWrapData;
import org.eclipse.ui.forms.widgets.TableWrapLayout;
import org.eclipse.ui.tests.views.properties.tabbed.model.Information;

/**
 * An item for when the Information element is the selected element in the
 * override tests view.
 * 
 * @author Anthony Hunter
 * @since 3.4
 */
public class InformationItem implements IOverrideTestsItem {

	private Composite composite;

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem#createControls(org.eclipse.swt.widgets.Composite)
	 */
	public void createControls(Composite parent) {
		FormToolkit toolkit = new FormToolkit(parent.getDisplay());
		composite = toolkit.createComposite(parent);
		composite.setLayout(new FillLayout());

		ScrolledForm form = toolkit.createScrolledForm(composite);
		form.getBody().setLayout(new TableWrapLayout());

		Section section = toolkit.createSection(form.getBody(),
				Section.DESCRIPTION);
		TableWrapData td = new TableWrapData(TableWrapData.FILL,
				TableWrapData.TOP);
		td.grabHorizontal = true;
		section.setLayoutData(td);
		section.setText(getText() + " Properties"); //$NON-NLS-1$
		toolkit.createCompositeSeparator(section);
		section.setDescription("Set the properties of the selected " + //$NON-NLS-1$
				getText() + " element.");//$NON-NLS-1$

		Composite sectionClient = toolkit.createComposite(section);
		FormLayout layout = new FormLayout();
		layout.marginWidth = 5;
		layout.marginHeight = 5;
		layout.spacing = 2;
		sectionClient.setLayout(layout);
		section.setClient(sectionClient);
		toolkit.paintBordersFor(sectionClient);

		Button radioLeft = toolkit.createButton(sectionClient, "Choice 1",//$NON-NLS-1$
				SWT.RADIO);
		FormData data = new FormData();
		data.left = new FormAttachment(0, 0);
		data.top = new FormAttachment(0, 5);
		radioLeft.setLayoutData(data);

		Button radioRight = toolkit.createButton(sectionClient, "Choice 2",//$NON-NLS-1$
				SWT.RADIO);
		data = new FormData();
		data.left = new FormAttachment(radioLeft, 5);
		data.top = new FormAttachment(0, 5);
		radioRight.setLayoutData(data);

		Button radioRight2 = toolkit.createButton(sectionClient, "Choice 3",//$NON-NLS-1$
				SWT.RADIO);
		data = new FormData();
		data.left = new FormAttachment(radioRight, 5);
		data.right = new FormAttachment(100, 0);
		data.top = new FormAttachment(0, 5);
		radioRight2.setLayoutData(data);

		Button flag = toolkit.createButton(sectionClient,
				"Value of the flag property", SWT.CHECK);//$NON-NLS-1$
		data = new FormData();
		data.left = new FormAttachment(0, 0);
		data.right = new FormAttachment(100, 0);
		data.top = new FormAttachment(radioLeft, 5);
		flag.setLayoutData(data);

		Label nameLabel = toolkit.createLabel(sectionClient, "Text Property:"); //$NON-NLS-1$
		data = new FormData();
		data.left = new FormAttachment(0, 0);
		data.top = new FormAttachment(flag, 5);
		nameLabel.setLayoutData(data);

		Text nameText = toolkit.createText(sectionClient, ""); //$NON-NLS-1$
		data = new FormData();
		data.left = new FormAttachment(nameLabel, 5);
		data.right = new FormAttachment(100, 0);
		data.top = new FormAttachment(flag, 5);
		nameText.setLayoutData(data);

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem#dispose()
	 */
	public void dispose() {
		if (composite != null && !composite.isDisposed()) {
			composite.dispose();
			composite = null;
		}
	}

	public Composite getComposite() {
		return composite;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem#getElement()
	 */
	public Class getElement() {
		return Information.class;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem#getImage()
	 */
	public Image getImage() {
		return PlatformUI.getWorkbench().getSharedImages().getImage(
				ISharedImages.IMG_OBJS_INFO_TSK);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.tests.views.properties.tabbed.override.items.IOverrideTestsItem#getText()
	 */
	public String getText() {
		return "Information"; //$NON-NLS-1$
	}
}
