Package com.ponysdk.ui.server.form.renderer

Source Code of com.ponysdk.ui.server.form.renderer.ListBoxFormFieldRenderer

/*
* Copyright (c) 2011 PonySDK
* Copyright (c) 2011 PonySDK
*  Owners:
*  Luciano Broussal  <luciano.broussal AT gmail.com>
*  Mathieu Barbier   <mathieu.barbier AT gmail.com>
*  Nicolas Ciaravola <nicolas.ciaravola.pro AT gmail.com>
*  WebSite:
*  http://code.google.com/p/pony-sdk/
*
* Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* 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.ponysdk.ui.server.form.renderer;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.ponysdk.core.event.EventHandler;
import com.ponysdk.ui.server.basic.IsPWidget;
import com.ponysdk.ui.server.basic.PListBox;
import com.ponysdk.ui.server.basic.event.HasPChangeHandlers;
import com.ponysdk.ui.server.basic.event.PChangeEvent;
import com.ponysdk.ui.server.basic.event.PChangeHandler;
import com.ponysdk.ui.server.basic.event.PDomEvent.Type;
import com.ponysdk.ui.server.form.FormField;

public class ListBoxFormFieldRenderer implements FormFieldRenderer, HasPChangeHandlers, PChangeHandler {

    private final List<FormFieldComponent<PListBox>> fields = new ArrayList<FormFieldComponent<PListBox>>();

    private final List<PChangeHandler> changeHandlers = new ArrayList<PChangeHandler>();

    private final List<String> items = new ArrayList<String>();

    private final Map<String, Object> hiddenValueByItems = new HashMap<String, Object>();

    private final Map<Object, String> itemsByHiddenValue = new HashMap<Object, String>();

    private boolean enabled = true;

    private final String caption;

    private Object value;

    private final boolean emptySelection;

    private final boolean multipleSelect;

    private String debugID;

    public ListBoxFormFieldRenderer() {
        this(null, true, false);
    }

    public ListBoxFormFieldRenderer(final boolean emptySelection) {
        this(null, emptySelection, false);
    }

    public ListBoxFormFieldRenderer(final String caption) {
        this(caption, true, false);
    }

    public ListBoxFormFieldRenderer(final String caption, final boolean emptySelection, final boolean multipleSelect) {
        this.caption = caption;
        this.emptySelection = emptySelection;
        this.multipleSelect = multipleSelect;
    }

    public ListBoxFormFieldRenderer(final String caption, final boolean emptySelection) {
        this(caption, emptySelection, false);
    }

    @Override
    public IsPWidget render(final FormField formField) {
        final PListBox listBox = new PListBox(emptySelection, multipleSelect);
        if (debugID != null) {
            listBox.ensureDebugId(debugID);
        }
        final FormFieldComponent<PListBox> formFieldComponent = new FormFieldComponent<PListBox>(listBox);
        formFieldComponent.getInput().addChangeHandler(this);
        formFieldComponent.setCaption(caption);

        fields.add(formFieldComponent);

        addListener(formFieldComponent.getInput());

        for (final String item : items) {
            formFieldComponent.getInput().addItem(item);
        }
        setEnabled(enabled);
        return formFieldComponent;
    }

    private void addListener(final PListBox listBox) {
        for (final PChangeHandler handler : changeHandlers) {
            listBox.addChangeHandler(handler);
        }
    }

    @Override
    public void addErrorMessage(final String errorMessage) {
        for (final FormFieldComponent<PListBox> field : fields) {
            field.addErrorMessage(errorMessage);
        }
    }

    @Override
    public void clearErrorMessage() {
        for (final FormFieldComponent<PListBox> field : fields) {
            field.clearErrors();
        }
    }

    public void clear() {
        for (final FormFieldComponent<PListBox> field : fields) {
            field.getInput().clear();
        }
        items.clear();
        hiddenValueByItems.clear();
        itemsByHiddenValue.clear();
    }

    @Override
    public void reset() {
        for (final FormFieldComponent<PListBox> field : fields) {
            field.getInput().setSelectedIndex(-1);
        }
        value = null;
    }

    public boolean hasItem(final String item) {
        return items.contains(item);
    }

    public void addItem(final String item) {
        for (final FormFieldComponent<PListBox> field : fields) {
            field.getInput().addItem(item);
        }
        items.add(item);
    }

    public void addItem(final String item, final Object hiddenValue) {
        for (final FormFieldComponent<PListBox> field : fields) {
            field.getInput().addItem(item);
        }
        items.add(item);
        hiddenValueByItems.put(item, hiddenValue);
        itemsByHiddenValue.put(hiddenValue, item);
    }

    @Override
    public void setEnabled(final boolean enabled) {
        this.enabled = enabled;
        for (final FormFieldComponent<PListBox> field : fields) {
            field.getInput().setEnabled(enabled);
        }
    }

    @Override
    public boolean isEnabled() {
        return enabled;
    }

    public void setSelectedItem(final String text, final boolean selected) {
        this.value = hiddenValueByItems.get(text);
        for (final FormFieldComponent<PListBox> field : fields) {
            field.getInput().setSelectedItem(text, selected);
        }
    }

    public void setSelectedItem(final String text) {
        setSelectedItem(text, true);
    }

    public void setSelectedValue(final Object value, final boolean selected) {
        this.value = value;
        final String item = itemsByHiddenValue.get(value);
        for (final FormFieldComponent<PListBox> field : fields) {
            field.getInput().setSelectedItem(item, selected);
        }
    }

    public void setSelectedValue(final Object value) {
        setSelectedValue(value, true);
    }

    public static ListBoxFormFieldRenderer newTrueFalseListBoxFormFieldRenderer(final String caption, final String trueCaption, final String falseCaption) {
        final ListBoxFormFieldRenderer listBoxFormFieldRenderer = new ListBoxFormFieldRenderer(caption, false, false);
        listBoxFormFieldRenderer.addItem(trueCaption, true);
        listBoxFormFieldRenderer.addItem(falseCaption, false);
        return listBoxFormFieldRenderer;
    }

    public static ListBoxFormFieldRenderer newTrueFalseListBoxFormFieldRenderer(final String caption) {
        return newTrueFalseListBoxFormFieldRenderer(caption, "true", "false");
    }

    public static ListBoxFormFieldRenderer newTrueFalseListBoxFormFieldRenderer() {
        return newTrueFalseListBoxFormFieldRenderer(null, "true", "false");
    }

    @Override
    public void addChangeHandler(final PChangeHandler handler) {
        changeHandlers.add(handler);
        for (final FormFieldComponent<PListBox> field : fields) {
            field.getInput().addChangeHandler(handler);
        }
    }

    @Override
    public Collection<PChangeHandler> getChangeHandlers() {
        return changeHandlers;
    }

    @Override
    public Object getValue() {
        return value;
    }

    @Override
    public void onChange(final PChangeEvent event) {

        // Propagate to all listbox first
        for (final FormFieldComponent<PListBox> field : fields) {
            final PListBox listBox = field.getInput();
            if (!listBox.equals(event.getSource())) { // avoid call again the selected value update
                final PListBox source = (PListBox) event.getSource();
                listBox.setSelectedIndex(source.getSelectedIndex());
            }
        }

        // Then pick up the value
        if (!fields.isEmpty()) {
            value = hiddenValueByItems.get(fields.get(0).getInput().getSelectedItem());
        }
    }

    @Override
    public void setValue(final Object value) {
        setSelectedValue(value);
    }

    @Override
    public void ensureDebugID(final String debugID) {
        this.debugID = debugID;
        if (fields.isEmpty()) return;

        for (final FormFieldComponent<PListBox> field : fields) {
            field.getInput().ensureDebugId(debugID);
        }
    }

    @Override
    public <H extends EventHandler> void addDomHandler(final H handler, final Type<H> type) {
        for (final FormFieldComponent<PListBox> field : fields) {
            field.getInput().addDomHandler(handler, type);
        }
    }

}
TOP

Related Classes of com.ponysdk.ui.server.form.renderer.ListBoxFormFieldRenderer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.