/*******************************************************************************
 * Copyright (c) 2006 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.examples.views.properties.tabbed.article.views;

import org.eclipse.jface.util.Assert;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.views.properties.IPropertySource;
import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;

/**
 * The size section on the button tab.
 * 
 * @author Anthony Hunter
 */
public class SizeSection
    extends AbstractPropertySection {

    private Text widthText;

    private Text heightText;

    private ButtonElement buttonElement;

    private ModifyListener listener = new ModifyListener() {

        public void modifyText(ModifyEvent arg0) {
            ButtonElementProperties properties = (ButtonElementProperties) buttonElement
                .getAdapter(IPropertySource.class);
            SizePropertySource sizePropertySource = (SizePropertySource) properties
                .getPropertyValue(ButtonElementProperties.PROPERTY_SIZE);
            sizePropertySource.setPropertyValue(SizePropertySource.ID_HEIGHT,
                heightText.getText());
            sizePropertySource.setPropertyValue(SizePropertySource.ID_WIDTH,
                widthText.getText());
        }
    };

    public void setInput(IWorkbenchPart part, ISelection selection) {
        super.setInput(part, selection);
        Assert.isTrue(selection instanceof IStructuredSelection);
        Object input = ((IStructuredSelection) selection).getFirstElement();
        Assert.isTrue(input instanceof ButtonElement);
        this.buttonElement = (ButtonElement) input;
    }

    /**
     * @see org.eclipse.ui.views.properties.tabbed.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite,
     *      org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
     */
    public void createControls(Composite parent,
            TabbedPropertySheetPage tabbedPropertySheetPage) {
        super.createControls(parent, tabbedPropertySheetPage);
        Composite composite = getWidgetFactory()
            .createFlatFormComposite(parent);
        FormData data;

        CLabel widthLabel = getWidgetFactory()
            .createCLabel(composite, "Width:"); //$NON-NLS-1$
        widthText = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
        CLabel heightLabel = getWidgetFactory().createCLabel(composite,
            "Height:"); //$NON-NLS-1$
        heightText = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$

        data = new FormData();
        data.left = new FormAttachment(0, 0);
        data.right = new FormAttachment(widthText,
            -ITabbedPropertyConstants.HSPACE);
        data.top = new FormAttachment(0, 0);
        widthLabel.setLayoutData(data);

        data = new FormData();
        data.left = new FormAttachment(0, STANDARD_LABEL_WIDTH);
        data.right = new FormAttachment(heightLabel,
            -ITabbedPropertyConstants.HSPACE);
        data.top = new FormAttachment(0, 0);
        widthText.setLayoutData(data);

        data = new FormData();
        data.left = new FormAttachment(50, 0);
        // data.right = new FormAttachment(heightText,
        // -ITabbedPropertyConstants.HSPACE);
        data.top = new FormAttachment(0, 0);
        heightLabel.setLayoutData(data);

        data = new FormData();
        data.left = new FormAttachment(heightLabel,
            ITabbedPropertyConstants.HSPACE);
        data.right = new FormAttachment(100, 0);
        data.top = new FormAttachment(0, 0);
        heightText.setLayoutData(data);

        heightText.addModifyListener(listener);
        widthText.addModifyListener(listener);
    }

    /*
     * @see org.eclipse.ui.views.properties.tabbed.view.ITabbedPropertySection#refresh()
     */
    public void refresh() {
        heightText.removeModifyListener(listener);
        widthText.removeModifyListener(listener);
        ButtonElementProperties properties = (ButtonElementProperties) buttonElement
            .getAdapter(IPropertySource.class);
        widthText.setText(Integer.toString(properties.ptSize.x));
        heightText.setText(Integer.toString(properties.ptSize.y));
        heightText.addModifyListener(listener);
        widthText.addModifyListener(listener);
    }
}