/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-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.*;

/**
 * PropertySource containing street information pertenant to Address
 */
public class StreetAddress implements IPropertySource {
	
	//properties
	private Integer buildNo;
	private String aptBox;
	private String streetName;

	//default property values
	private static final Integer BUILD_NO_DEFAULT = new Integer(0);
	private static final String APTBOX_DEFAULT = MessageUtil.getString("unspecified"); //$NON-NLS-1$
	private static final String STREETNAME_DEFAULT = MessageUtil.getString("unspecified"); //$NON-NLS-1$

	//property unique keys
	public static final String P_ID_BUILD_NO = "Street.buildingNo"; //$NON-NLS-1$
	public static final String P_ID_APTBOX = "Street.aptNo"; //$NON-NLS-1$
	public static final String P_ID_STREET = "Street.street"; //$NON-NLS-1$
	
	//property display keys
	public static final String P_BUILD_NO = MessageUtil.getString("building_number"); //$NON-NLS-1$
	public static final String P_APTBOX = MessageUtil.getString("apt.no_or_box.no"); //$NON-NLS-1$
	public static final String P_STREET = MessageUtil.getString("street"); //$NON-NLS-1$

	//
	private static Vector descriptors;

	static {
		descriptors = new Vector();
		descriptors.addElement(new TextPropertyDescriptor(P_ID_BUILD_NO, P_BUILD_NO));
		descriptors.addElement(new TextPropertyDescriptor(P_ID_APTBOX, P_APTBOX));
		descriptors.addElement(new TextPropertyDescriptor(P_ID_STREET, P_STREET));
	}
/**
 * Street Default Constructor.
 */
public StreetAddress() {
	super();
}
/**
 * Convenience Street constructor. AptBox set to default
 */
public StreetAddress(int buildNo, String streetName) {
	super();
	setBuildNo(new Integer(buildNo));
	setStreetName(streetName);
}
/**
 * Convenience Street constructor.
 */
public StreetAddress(int buildNo, String aptBox, String streetName) {
	super();
	setBuildNo(new Integer(buildNo));
	setAptBox(aptBox);
	setStreetName(streetName);
}
/* (non-Javadoc)
 * Method declared on Object
 */
public boolean equals(Object ob) {
	return toString().equals(ob.toString());
}
/**
 * the appartment number
 */
private String getAptBox() {
	if(aptBox == null)
		aptBox = APTBOX_DEFAULT;
	return aptBox;
}
/**
 * Returns the building number
 */
private Integer getBuildNo() {
	if(buildNo == null)
		buildNo = BUILD_NO_DEFAULT;
	return buildNo;
}
/**
 * Returns the descriptors
 */
private static Vector getDescriptors() {
	return descriptors;
}
/* (non-Javadoc)
 * Method declared on IPropertySource
 */
public Object getEditableValue() {
	return this.toString();
}
/* (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_BUILD_NO returns java.lang.Integer
 * 	2) P_APTBOX returns java.lang.String
 *	3) P_STREET returns java.lang.String
 */
public Object getPropertyValue(Object propKey) {
	if (propKey.equals(P_ID_BUILD_NO))
		return getBuildNo().toString();
	if (propKey.equals(P_ID_APTBOX))
		return getAptBox();
	if (propKey.equals(P_ID_STREET))
		return getStreetName();
	return null;
}
/**
 * Returns the street name
 */
private String getStreetName() {
	if(streetName == null)
		streetName = STREETNAME_DEFAULT;
	return streetName;
}
/* (non-Javadoc)
 * Method declared on Object
 */
public int hashCode()
{	return toString().hashCode();
}
/* (non-Javadoc)
 * Method declared on IPropertySource
 */
public boolean isPropertySet(Object property) {
	if (property.equals(P_ID_BUILD_NO))
		return getBuildNo() != BUILD_NO_DEFAULT;
	if (property.equals(P_ID_APTBOX))
		return getAptBox() != APTBOX_DEFAULT;
	if (property.equals(P_ID_STREET))
		return getStreetName() != STREETNAME_DEFAULT;
	return false;
}
/* (non-Javadoc)
 * Method declared on IPropertySource
 */
public void resetPropertyValue(Object property) {
	if (property.equals(P_ID_BUILD_NO)) {
		setBuildNo(BUILD_NO_DEFAULT);
		return;
	}
	if (property.equals(P_ID_APTBOX)) {
		setAptBox(APTBOX_DEFAULT);
		return;
	}
	if (property.equals(P_ID_STREET)) {
		setStreetName(STREETNAME_DEFAULT);
		return;
	}
}
/**
 * Sets the appartment number
 */
private void setAptBox(String newAptBox) {
	aptBox = newAptBox;
}
/**
 * Sets the building number
 */
private void setBuildNo(Integer newBuildNo) {
	buildNo = newBuildNo;
}
/** 
 * The <code>Name</code> implementation of this
 * <code>IPropertySource</code> method 
 * defines the following Setable properties
 *
 * 	1) P_BUILD_NO expects java.lang.Integer
 * 	2) P_APTBOX expects java.lang.String
 *	3) P_STREET expects java.lang.String
 */
public void setPropertyValue(Object name, Object value) {
	if (name.equals(P_ID_BUILD_NO)) {
		try {
			setBuildNo(new Integer(Integer.parseInt((String)value)));
		} catch (NumberFormatException e) {
			setBuildNo(BUILD_NO_DEFAULT);
		}
		return;
	}
	if (name.equals(P_ID_APTBOX)) {
		setAptBox((String) value);
		return;
	}
	if (name.equals(P_ID_STREET)){
		setStreetName((String) value);
		return;
	}
}
/**
 * Sets the street name
 */
private void setStreetName(String newStreetName) {
	streetName = newStreetName;
}
/**
 * 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 (!getAptBox().equals(APTBOX_DEFAULT)) {
		outStringBuffer.append(getAptBox());
		outStringBuffer.append(", "); //$NON-NLS-1$
	}
	if (!getBuildNo().equals(BUILD_NO_DEFAULT)) {
		outStringBuffer.append(getBuildNo());
		outStringBuffer.append(" "); //$NON-NLS-1$
	}
	if (!getStreetName().equals(STREETNAME_DEFAULT)) {
		outStringBuffer.append(getStreetName());
	}
	return outStringBuffer.toString();
}
}
