/*******************************************************************************
 * Copyright (c) 2000, 2005 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.propertysheet;

import java.util.Vector;

import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertySource;
import org.eclipse.ui.views.properties.TextPropertyDescriptor;

/**
 * Example IPropertySource whose value as well as its children are editable.
 */
public class Name implements IPropertySource {
    private String firstName = ""; //$NON-NLS-1$

    private String lastName = ""; //$NON-NLS-1$

    private String initial = ""; //$NON-NLS-1$

    // property unique keys
    public static String P_ID_FIRSTNAME = "Name.FirstName"; //$NON-NLS-1$

    public static String P_ID_LASTNAME = "Name.LastName"; //$NON-NLS-1$

    public static String P_ID_MIDDLENAME = "Name.Middle"; //$NON-NLS-1$

    // property display keys
    public static String P_FIRSTNAME = MessageUtil.getString("FirstName"); //$NON-NLS-1$

    public static String P_LASTNAME = MessageUtil.getString("LastName"); //$NON-NLS-1$

    public static String P_MIDDLENAME = MessageUtil.getString("Middle"); //$NON-NLS-1$

    // default values
    //
    private static final String FIRSTNAME_DEFAULT = null;

    private static final String LASTNAME_DEFAULT = null;

    private static final String MIDDLENAME_DEFAULT = null;

    public static final String P_DESCRIPTORS = "properties"; //$NON-NLS-1$

    static private Vector descriptors;
    static {
        descriptors = new Vector();
        descriptors.addElement(new TextPropertyDescriptor(P_ID_FIRSTNAME,
                P_FIRSTNAME));
        descriptors.addElement(new TextPropertyDescriptor(P_ID_LASTNAME,
                P_LASTNAME));
        descriptors.addElement(new TextPropertyDescriptor(P_ID_MIDDLENAME,
                P_MIDDLENAME));
    }

    /**
     * Creates a new Name.
     * @param name String in the form "firstname initial lastname"
     */
    public Name(String name) {
        int index1, index2;
        index1 = name.indexOf(' ');
        if (index1 < 0)
            index1 = name.length();
        index2 = name.lastIndexOf(' ');
        if (index2 > 0)
            lastName = name.substring(index2 + 1);
        firstName = name.substring(0, index1);
        if (index1 < index2)
            initial = name.substring(index1 + 1, index2);
    }

    /**
     * Returns the descriptors
     */
    private static Vector getDescriptors() {
        return descriptors;
    }

    /* (non-Javadoc)
     * Method declared on IPropertySource
     */
    public Object getEditableValue() {
        return this.toString();
    }

    /**
     * Returns the first name
     */
    private String getFirstName() {
        return firstName;
    }

    /**
     * Returns the initial
     */
    private String getInitial() {
        return initial;
    }

    /**
     * Returns the last name
     */
    private String getLastName() {
        return lastName;
    }

    /* (non-Javadoc)
     * Method declared on IPropertySource
     */
    public IPropertyDescriptor[] getPropertyDescriptors() {
        return (IPropertyDescriptor[]) getDescriptors().toArray(
                new IPropertyDescriptor[getDescriptors().size()]);
    }

    /** 
     * The <code>Name</code> implementation of this
     * <code>IPropertySource</code> method returns the following properties
     *
     * 	1) P_FIRSTNAME returns String, firstname
     * 	2) P_LASTNAME returns String, lastname
     *  3) P_MIDDLENAME returns String, middle
     */
    public Object getPropertyValue(Object propKey) {
        if (P_ID_FIRSTNAME.equals(propKey))
            return getFirstName();
        if (P_ID_LASTNAME.equals(propKey))
            return getLastName();
        if (P_ID_MIDDLENAME.equals(propKey))
            return getInitial();
        return null;
    }

    /* (non-Javadoc)
     * Method declared on IPropertySource
     */
    public boolean isPropertySet(Object key) {
        if (key.equals(P_ID_FIRSTNAME))
            return getFirstName() != FIRSTNAME_DEFAULT;
        if (key.equals(P_ID_LASTNAME))
            return getLastName() != LASTNAME_DEFAULT;
        if (key.equals(P_ID_MIDDLENAME))
            return getInitial() != MIDDLENAME_DEFAULT;
        return false;
    }

    /**
     * Implemented as part of IPropertySource framework. Sets the specified property 
     * to its default value.
     * 
     * @see 	IPropertySource#resetPropertyValue(Object)
     * @param 	property 	The property to reset.
     */
    public void resetPropertyValue(Object property) {
        if (P_ID_FIRSTNAME.equals(property)) {
            setFirstName(FIRSTNAME_DEFAULT);
            return;
        }
        if (P_ID_LASTNAME.equals(property)) {
            setLastName(LASTNAME_DEFAULT);
            return;
        }
        if (P_ID_MIDDLENAME.equals(property)) {
            setInitial(MIDDLENAME_DEFAULT);
            return;
        }
    }

    /**
     * Sets the first name
     */
    private void setFirstName(String newFirstName) {
        firstName = newFirstName;
    }

    /**
     * Sets the initial
     */
    private void setInitial(String newInitial) {
        initial = newInitial;
    }

    /**
     * Sets the last name
     */
    private void setLastName(String newLastName) {
        lastName = newLastName;
    }

    /** 
     * The <code>Name</code> implementation of this
     * <code>IPropertySource</code> method 
     * defines the following Setable properties
     *
     *	1) P_FIRST, expects String, sets the firstname of this OrganizationElement
     *  2) P_MIDDLENAME, expects String, sets middlename of this OrganizationElement
     *  3) P_LASTNAME, expects String, sets lastname of this OrganizationElement
     */
    public void setPropertyValue(Object propName, Object val) {
        if (P_ID_FIRSTNAME.equals(propName)) {
            setFirstName((String) val);
            return;
        }
        if (P_ID_LASTNAME.equals(propName)) {
            setLastName((String) val);
            return;
        }
        if (P_ID_MIDDLENAME.equals(propName)) {
            setInitial((String) val);
            return;
        }
    }

    /**
     * The value as displayed in the Property Sheet. Will not print default values
     * @return java.lang.String
     */
    public String toString() {
        StringBuffer outStringBuffer = new StringBuffer();
        if (getFirstName() != FIRSTNAME_DEFAULT) {
            outStringBuffer.append(getFirstName());
            outStringBuffer.append(" "); //$NON-NLS-1$
        }
        if (getInitial() != MIDDLENAME_DEFAULT) {
            outStringBuffer.append(getInitial());
            outStringBuffer.append(" "); //$NON-NLS-1$
        }
        if (getLastName() != LASTNAME_DEFAULT) {
            outStringBuffer.append(getLastName());
        }

        return outStringBuffer.toString();
    }
}
