/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Eclipse Public License, Version 1.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.eclipse.org/org/documents/epl-v10.php
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.ide.eclipse.adt.internal.editors.layout.properties;

import com.android.ide.eclipse.adt.internal.editors.descriptors.AttributeDescriptor;
import com.android.ide.eclipse.adt.internal.editors.descriptors.ListAttributeDescriptor;

import org.eclipse.wb.core.controls.CCombo3;
import org.eclipse.wb.internal.core.model.property.Property;
import org.eclipse.wb.internal.core.model.property.editor.AbstractComboPropertyEditor;
import org.eclipse.wb.internal.core.model.property.editor.ITextValuePropertyEditor;

class EnumXmlPropertyEditor extends AbstractComboPropertyEditor implements
        ITextValuePropertyEditor {
    public static final EnumXmlPropertyEditor INSTANCE = new EnumXmlPropertyEditor();

    private EnumXmlPropertyEditor() {
    }

    @Override
    protected String getText(Property property) throws Exception {
        Object value = property.getValue();
        if (value == null) {
            return "";
        } else if (value instanceof String) {
            return (String) value;
        } else if (value == Property.UNKNOWN_VALUE) {
            return "<varies>";
        } else {
            return "";
        }
    }

    private String[] getItems(Property property) {
        XmlProperty xmlProperty = (XmlProperty) property;
        AttributeDescriptor descriptor = xmlProperty.getDescriptor();
        assert descriptor instanceof ListAttributeDescriptor;
        ListAttributeDescriptor list = (ListAttributeDescriptor) descriptor;
        return list.getValues();
    }

    @Override
    protected void addItems(Property property, CCombo3 combo) throws Exception {
        for (String item : getItems(property)) {
            combo.add(item);
        }
    }

    @Override
    protected void selectItem(Property property, CCombo3 combo) throws Exception {
        combo.setText(getText(property));
    }

    @Override
    protected void toPropertyEx(Property property, CCombo3 combo, int index) throws Exception {
        property.setValue(getItems(property)[index]);
    }

    @Override
    public void setText(Property property, String text) throws Exception {
        property.setValue(text);
    }
}
