Package org.thechiselgroup.choosel.core.client.views.ui

Source Code of org.thechiselgroup.choosel.core.client.views.ui.NumberSlotControl$CalculationResolverFactory

/*******************************************************************************
* Copyright 2009, 2010 Lars Grammel
*
* 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 org.thechiselgroup.choosel.core.client.views.ui;

import java.util.Arrays;
import java.util.List;

import org.thechiselgroup.choosel.core.client.resources.DataType;
import org.thechiselgroup.choosel.core.client.ui.widget.listbox.ExtendedListBox;
import org.thechiselgroup.choosel.core.client.ui.widget.listbox.ListBoxControl;
import org.thechiselgroup.choosel.core.client.util.ConversionException;
import org.thechiselgroup.choosel.core.client.util.Converter;
import org.thechiselgroup.choosel.core.client.util.NullConverter;
import org.thechiselgroup.choosel.core.client.util.math.AverageCalculation;
import org.thechiselgroup.choosel.core.client.util.math.Calculation;
import org.thechiselgroup.choosel.core.client.util.math.MaxCalculation;
import org.thechiselgroup.choosel.core.client.util.math.MinCalculation;
import org.thechiselgroup.choosel.core.client.util.math.SumCalculation;
import org.thechiselgroup.choosel.core.client.views.model.Slot;
import org.thechiselgroup.choosel.core.client.views.model.SlotMappingConfiguration;
import org.thechiselgroup.choosel.core.client.views.resolvers.CalculationResolver;
import org.thechiselgroup.choosel.core.client.views.resolvers.FixedValueResolver;
import org.thechiselgroup.choosel.core.client.views.resolvers.FixedValueResolverFactory;
import org.thechiselgroup.choosel.core.client.views.resolvers.ResourceCountResolver;
import org.thechiselgroup.choosel.core.client.views.resolvers.ViewItemResolverFactory;
import org.thechiselgroup.choosel.core.client.views.resolvers.ViewItemValueResolver;

import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

public class NumberSlotControl extends SlotControl {

    public class CalculationResolverFactory implements ViewItemResolverFactory {

        private Calculation calculation;

        public CalculationResolverFactory(Calculation calculation) {

            this.calculation = calculation;
        }

        @Override
        public String getDescription() {
            return calculation.getDescription();
        }

        @Override
        public ViewItemValueResolver getResolver() {
            return new CalculationResolver(propertySelector.getSelectedValue(),
                    calculation);
        }
    }

    private VerticalPanel panel;

    private ListBoxControl<String> propertySelector;

    private ListBoxControl<ViewItemResolverFactory> resolverFactorySelector;

    private ChangeHandler changeHandler;

    private final SlotMappingConfiguration slotMappingConfiguration;

    // TODO this class should probably be completely rewritten
    public NumberSlotControl(Slot slot,
            final SlotMappingConfiguration slotMappingConfiguration) {

        super(slot);

        this.slotMappingConfiguration = slotMappingConfiguration;

        changeHandler = new ChangeHandler() {
            @Override
            public void onChange(ChangeEvent event) {
                ViewItemResolverFactory resolverFactory = resolverFactorySelector
                        .getSelectedValue();

                propertySelector
                        .setVisible(!(resolverFactory instanceof FixedValueResolverFactory));

                slotMappingConfiguration.setResolver(getSlot(),
                        resolverFactory.getResolver());
            }
        };

        // TODO the slot mapping configuration should be what defines these
        // below The Resolvers should have Id's and the ability to determine if
        // something is resolvable
        ViewItemResolverFactory[] calculations = new ViewItemResolverFactory[] {
                new FixedValueResolverFactory(new ResourceCountResolver()),
                new CalculationResolverFactory(new SumCalculation()),
                new CalculationResolverFactory(new AverageCalculation()),
                new CalculationResolverFactory(new MinCalculation()),
                new CalculationResolverFactory(new MaxCalculation()),
                new FixedValueResolverFactory(new FixedValueResolver(
                        new Double(1), DataType.NUMBER)) };

        resolverFactorySelector = new ListBoxControl<ViewItemResolverFactory>(
                new ExtendedListBox(false),
                new Converter<ViewItemResolverFactory, String>() {
                    @Override
                    public String convert(ViewItemResolverFactory value)
                            throws ConversionException {
                        return value.getDescription();
                    }
                });
        resolverFactorySelector.setValues(Arrays.asList(calculations));

        // TODO lawl, hack
        resolverFactorySelector.setSelectedValue(calculations[0]);
        resolverFactorySelector.setChangeHandler(changeHandler);

        // TODO I guessing that this is where the property should be selected as
        // well, should possible alert user to selecting SUM without selectin
        // gproperty?

        // this should all be defined by the transformation UI classes
        propertySelector = new ListBoxControl<String>(
                new ExtendedListBox(false), new NullConverter<String>());
        propertySelector.setChangeHandler(changeHandler);

        panel = new VerticalPanel();
        panel.add(resolverFactorySelector.asWidget());
        panel.add(propertySelector.asWidget());
    }

    @Override
    public Widget asWidget() {
        return panel;
    }

    @Override
    public void updateOptions(List<String> properties) {
        propertySelector.setValues(properties);

        if (propertySelector.getSelectedValue() == null) {
            ViewItemValueResolver resolver = slotMappingConfiguration
                    .getResolver(getSlot());

            // TODO generic interface for resolvers that require property
            if (resolver instanceof CalculationResolver) {
                String property = ((CalculationResolver) resolver)
                        .getProperty();
                propertySelector.setSelectedValue(property);
            }
        }
    }
}
TOP

Related Classes of org.thechiselgroup.choosel.core.client.views.ui.NumberSlotControl$CalculationResolverFactory

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.