/*******************************************************************************
 * Copyright (c) 2000, 2004 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();
    }
}
