/*******************************************************************************
 * Copyright (c) 2006 Sybase, Inc. 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:
 * Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.pagedesigner.jsf.ui.sections;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StyleComboDialogField;
import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
import org.eclipse.jst.pagedesigner.meta.EditorCreator;
import org.eclipse.jst.pagedesigner.properties.internal.AttributeGroup;
import org.eclipse.jst.pagedesigner.ui.dialogfields.DialogFieldWrapper;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;

/**
 * @author mengbo
 */
public class JSFCoreConvertNumberGroup extends AttributeGroup
{
    private StyleComboDialogField _typeField;
    private StyleComboDialogField _patternField;
    private StyleComboDialogField _currencyCodeField;
    private StringDialogField     _currencySymbolField;

    final private static String[] TYPES = { "number", "currency", "percentage", "custom" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
                                        };

    /**
     * The default constructor
     */
    public JSFCoreConvertNumberGroup()
    {
        super(ITLDConstants.URI_JSF_CORE, IJSFConstants.TAG_CONVERTNUMBER, new String[] { IJSFConstants.ATTR_TYPE,
                IJSFConstants.ATTR_CURRENCYCODE, IJSFConstants.ATTR_CURRENCYSYMBOL, IJSFConstants.ATTR_PATTERN});
    }

    protected DialogField createDialogField(IPropertyPageDescriptor ppd)
    {
    	EditorCreator creator = EditorCreator.getInstance();
        if (ppd.getAttributeName().equals(IJSFConstants.ATTR_TYPE))
        {
            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
            	.createDialogFieldWithWrapper(getURI(), getTagName(), ppd, null);
            _typeField = (StyleComboDialogField) wrapper.getWrappedDialogField();
                    _typeField.setItems(TYPES);
            return wrapper;
        }
        else if (ppd.getAttributeName().equals(IJSFConstants.ATTR_CURRENCYCODE))
        {
            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
            	.createDialogFieldWithWrapper(getURI(), getTagName(), ppd, null);
            _currencyCodeField = (StyleComboDialogField) wrapper.getWrappedDialogField();
            return wrapper;
        }
        else if (ppd.getAttributeName().equals(IJSFConstants.ATTR_CURRENCYSYMBOL))
        {
            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
            		.createDialogFieldWithWrapper(getURI(), getTagName(), ppd, null);
            _currencySymbolField = (StringDialogField) wrapper.getWrappedDialogField();
            return wrapper;
        }
        else if (ppd.getAttributeName().equals(IJSFConstants.ATTR_PATTERN))
        {
            DialogFieldWrapper wrapper = (DialogFieldWrapper) creator
            	.createDialogFieldWithWrapper(getURI(), getTagName(), ppd, null);
            _patternField = (StyleComboDialogField) wrapper.getWrappedDialogField();
            return wrapper;
        }
        else
        {
            return null;
        }
    }

    public IDialogFieldApplyListener getDialogFieldApplyListener(IPropertyPageDescriptor ppd)
    {
        String attribute = ppd.getAttributeName();
        if (attribute.equals(IJSFConstants.ATTR_CURRENCYCODE) || attribute.equals(IJSFConstants.ATTR_CURRENCYSYMBOL)
                || attribute.equals(IJSFConstants.ATTR_PATTERN))
        {
            IDialogFieldApplyListener listener = new IDialogFieldApplyListener()
            {
                public void dialogFieldApplied(DialogField field)
                {
                    updateFieldData();
                }
            };
            return listener;
        }
        else if (attribute.equals(IJSFConstants.ATTR_TYPE))
        {
            IDialogFieldApplyListener listener = new IDialogFieldApplyListener()
            {
                public void dialogFieldApplied(DialogField field)
                {
                    updateFieldStatus();
                    updateFieldData();
                }
            };
            return listener;
        }
        else
        {
            return null;
        }
    }

    /* (non-Javadoc)
     * @see org.eclipse.jst.pagedesigner.pagedesigner.properties.attrgroup.AttributeGroup#refreshData()
     */
    public void refreshData()
    {
        IDOMElement element = getElement();

        String type = element.getAttribute(IJSFConstants.ATTR_TYPE);
        if (!_typeField.getText().equalsIgnoreCase(TYPES[3]))
        {
            _typeField.setTextWithoutUpdate(type);
        }

        String currencyCode = element.getAttribute(IJSFConstants.ATTR_CURRENCYCODE);
        _currencyCodeField.setTextWithoutUpdate(currencyCode);

        String currencySymbol = element.getAttribute(IJSFConstants.ATTR_CURRENCYSYMBOL);
        _currencySymbolField.setTextWithoutUpdate(currencySymbol);

        String pattern = element.getAttribute(IJSFConstants.ATTR_PATTERN);
        _patternField.setTextWithoutUpdate(pattern);

        updateFieldStatus();
    }

    private void updateFieldStatus()
    {
        String type = _typeField.getText();

        if (type.equalsIgnoreCase(TYPES[0]))
        {
            _currencyCodeField.setEnabled(false);
            _currencySymbolField.setEnabled(false);
            _patternField.setEnabled(false);
        }
        else if (type.equalsIgnoreCase(TYPES[1]))
        {
            _currencyCodeField.setEnabled(true);
            _currencySymbolField.setEnabled(true);
            _patternField.setEnabled(false);
        }
        else if (type.equalsIgnoreCase(TYPES[2]))
        {
            _currencyCodeField.setEnabled(false);
            _currencySymbolField.setEnabled(false);
            _patternField.setEnabled(false);
        }
        else if (type.equalsIgnoreCase(TYPES[3]))
        {
            _currencyCodeField.setEnabled(false);
            _currencySymbolField.setEnabled(false);
            _patternField.setEnabled(true);
        }
    }

    private void updateFieldData()
    {
        String type = _typeField.getText();
        String currencyCode = _currencyCodeField.getText();
        String currencySymbol = _currencySymbolField.getText();
        String pattern = _patternField.getText();

        // update the model
        if (type.equalsIgnoreCase(TYPES[3]))
        {
            type = ""; //$NON-NLS-1$
        }

        if (!_currencyCodeField.isEnabled())
        {
            currencyCode = ""; //$NON-NLS-1$
        }

        if (!_currencySymbolField.isEnabled())
        {
            currencySymbol = ""; //$NON-NLS-1$
        }

        if (!_patternField.isEnabled())
        {
            pattern = ""; //$NON-NLS-1$
        }

        Map map = new HashMap();
        map.put(IJSFConstants.ATTR_TYPE, type);
        map.put(IJSFConstants.ATTR_CURRENCYCODE, currencyCode);
        map.put(IJSFConstants.ATTR_CURRENCYSYMBOL, currencySymbol);
        map.put(IJSFConstants.ATTR_PATTERN, pattern);

        ChangeAttributeCommand c = new ChangeAttributeCommand(SectionResources
                .getString("JSFCoreConvertNumberSection.CommandLabel.ChangeAttribute"), getElement(), map); //$NON-NLS-1$
        c.execute();
    }
}
