/*******************************************************************************
 * Copyright (c) 2007, 2008 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:
 *    Takashi ITOH - initial API and implementation
 *******************************************************************************/
package org.eclipse.actf.visualization.gui.msaa.properties;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertySource;
import org.eclipse.ui.views.properties.PropertyDescriptor;

public class AttributePropertySource implements IPropertySource {

	private Map attrMap = new LinkedHashMap();
	private String attributes;
	private String editableText;
	
	public AttributePropertySource(String attributes) {
		this.attributes = attributes;
		if( null != attributes ) {
			StringTokenizer st = new StringTokenizer(attributes,";"); //$NON-NLS-1$
	        while( st.hasMoreTokens() ) {
	            String name = st.nextToken();
	            String value = null;
	            int sep = name.indexOf(':');
	            if( sep > 0 ) {
	            	value = name.substring(sep+1).trim();
	                name = name.substring(0,sep).trim();
	            }
	            put(name, value);
	        }
		}
	}
	public AttributePropertySource(String attributes, String editableText) {
		this(attributes);
		this.editableText = editableText;
	}
	
	public void put(Object key, Object value) {
        attrMap.put(key, value);
	}

	public Object getEditableValue() {
		if( null != editableText ) {
			return editableText;
		}
		return attributes;
	}

	public IPropertyDescriptor[] getPropertyDescriptors() {
		List<PropertyDescriptor> descriptors = new ArrayList<PropertyDescriptor>();
		for( Iterator it = attrMap.keySet().iterator(); it.hasNext(); ) {
			Object name = it.next();
			descriptors.add(new PropertyDescriptor(name,(String)name));
		}
		return descriptors.toArray(new IPropertyDescriptor[descriptors.size()]);
	}

	public Object getPropertyValue(Object id) {
		return attrMap.get(id);
	}

	public boolean isPropertySet(Object id) {
		return false;
	}

	public void resetPropertyValue(Object id) {
	}

	public void setPropertyValue(Object id, Object value) {
	}

}
