/*******************************************************************************
 * 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.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Button;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertySource;
import org.eclipse.ui.views.properties.PropertyDescriptor;
import org.eclipse.ui.views.properties.TextPropertyDescriptor;

/**
 * The property source provider for a button element.
 * 
 * @author Anthony Hunter
 */
public class ButtonElementProperties
    implements IPropertySource {

    final protected ButtonElement element;

    protected static final String PROPERTY_FONT = "font"; //$NON-NLS-1$

    protected static final String PROPERTY_SIZE = "size"; //$NON-NLS-1$

    protected static final String PROPERTY_TEXT = "text"; //$NON-NLS-1$

    private final Object PropertiesTable[][] = {
        {PROPERTY_FONT, new FontPropertyDescriptor(PROPERTY_FONT, "Font")},//$NON-NLS-1$
        {PROPERTY_SIZE, new PropertyDescriptor(PROPERTY_SIZE, "Size")},//$NON-NLS-1$
        {PROPERTY_TEXT, new TextPropertyDescriptor(PROPERTY_TEXT, "Text")}, //$NON-NLS-1$
    };

    String strFont = "";//$NON-NLS-1$

    Point ptSize = null;

    String strText = "";//$NON-NLS-1$

    protected void firePropertyChanged(String propName, Object value) {
        Button ctl = element.getControl();

        if (ctl == null) {
            // the GUIView is probably hidden in this case
            return;
        }

        if (propName.equals(PROPERTY_FONT)) {
            /**
             * Font oldfont = ctl.getFont(); if (oldfont != null) {
             * oldfont.dispose(); }
             */
            ctl
                .setFont(new Font(ctl.getDisplay(),
                    new FontData((String) value)));
            return;
        }
        if (propName.equals(PROPERTY_TEXT)) {
            ctl.setText((String) value);
            return;
        }

    }

    protected void initProperties() {
        Button ctl = element.getControl();

        if (ctl == null) {
            // the GUIView is probably hidden in this case
            return;
        }

        strText = ctl.getText();
        /**
         * Font font = ctl.getFont(); if (font != null) { strFont =
         * font.getFontData().toString(); }
         */
        ptSize = ctl.getSize();
    }

    /**
     * Creates a new ButtonElementProperties.
     * 
     * @param element
     *            the element whose properties this instance represents
     */
    public ButtonElementProperties(ButtonElement element) {
        super();
        this.element = element;
        initProperties();
    }

    /**
     * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
     */
    public Object getEditableValue() {
        return this;
    }

    /**
     * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
     */
    public IPropertyDescriptor[] getPropertyDescriptors() {
        // Create the property vector.
        IPropertyDescriptor[] propertyDescriptors = new IPropertyDescriptor[PropertiesTable.length];

        for (int i = 0; i < PropertiesTable.length; i++) {
            // Add each property supported.

            PropertyDescriptor descriptor;

            descriptor = (PropertyDescriptor) PropertiesTable[i][1];
            propertyDescriptors[i] = descriptor;
            descriptor.setCategory("Basic");//$NON-NLS-1$
        }

        // Return it.
        return propertyDescriptors;

    }

    /**
     * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(Object)
     */
    public Object getPropertyValue(Object name) {
        if (name.equals(PROPERTY_FONT))
            return strFont;
        if (name.equals(PROPERTY_SIZE))
            return new SizePropertySource(element, ptSize);
        if (name.equals(PROPERTY_TEXT))
            return strText;

        return null;
    }

    /**
     * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(Object)
     */
    public boolean isPropertySet(Object id) {
        return false;
    }

    /**
     * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(Object)
     */
    public void resetPropertyValue(Object id) {
        //
    }

    /**
     * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(Object,
     *      Object)
     */
    public void setPropertyValue(Object name, Object value) {
        firePropertyChanged((String) name, value);

        if (name.equals(PROPERTY_FONT)) {
            strFont = (String) value;
            return;
        }
        if (name.equals(PROPERTY_TEXT)) {
            strText = (String) value;
            return;
        }
        if (name.equals(PROPERTY_SIZE)) {
            SizePropertySource sizeProp = (SizePropertySource) value;
            ptSize = sizeProp.getValue();
        }

    }

    /**
     * Returns the mocha element.
     * 
     * @return MochaElement
     */
    public ButtonElement getButtonElement() {
        return element;
    }

}
