es.upm.fi.dia.oeg.map4rdf.client.widget.FacetWidget.java Source code

Java tutorial

Introduction

Here is the source code for es.upm.fi.dia.oeg.map4rdf.client.widget.FacetWidget.java

Source

/**
 * Copyright (c) 2011 Ontology Engineering Group, 
 * Departamento de Inteligencia Artificial,
 * Facultad de Informetica, Universidad 
 * Politecnica de Madrid, Spain
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
package es.upm.fi.dia.oeg.map4rdf.client.widget;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.google.gwt.dom.client.Style.Position;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.ResizeComposite;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.Widget;

import es.upm.fi.dia.oeg.map4rdf.client.util.DrawPointStyle;
import es.upm.fi.dia.oeg.map4rdf.client.widget.event.FacetValueSelectionChangedEvent;
import es.upm.fi.dia.oeg.map4rdf.client.widget.event.FacetValueSelectionChangedHandler;
import es.upm.fi.dia.oeg.map4rdf.client.widget.event.HasFacetValueSelectionChangedHandler;
import es.upm.fi.dia.oeg.map4rdf.share.ConfigurationDrawColoursBy;

/**
 * @author Alexander De Leon
 */
public class FacetWidget extends ResizeComposite implements HasFacetValueSelectionChangedHandler {

    /**
     * Stylesheet contract
     */
    public static interface Stylesheet {
        String facet();

        String facetHeader();

        String facetSelectionOption();
    }

    private Label label;
    private LayoutPanel panel;
    private ScrollPanel scrollPanel;
    private FlowPanel selectionsPanel;
    private final Map<String, CheckBox> selectionOptions;
    private Stylesheet stylesheet;
    private static int[] freeHexColour;
    private Map<String, Integer> relationFacetIDHexColour;
    private ConfigurationDrawColoursBy drawColoursBy = ConfigurationDrawColoursBy.getDefault();

    public FacetWidget(ConfigurationDrawColoursBy drawColoursBy) {
        this.drawColoursBy = drawColoursBy;
        selectionOptions = new HashMap<String, CheckBox>();
        if (freeHexColour == null) {
            freeHexColour = new int[DrawPointStyle.getHexColours().length];
            for (int i = 0; i < freeHexColour.length; i++) {
                freeHexColour[i] = 0;
            }
        }
        relationFacetIDHexColour = new HashMap<String, Integer>();
        initWidget(createUi());
    }

    public FacetWidget(Stylesheet stylesheet, ConfigurationDrawColoursBy drawColoursBy1) {
        this(drawColoursBy1);
        setStylesheet(stylesheet);
    }

    public void setLabel(String label) {
        this.label.setText(label);
    }

    public void addFacetSelectionOption(final String id, String label) {
        CheckBox checkBox = new CheckBox(label);
        checkBox.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
            @Override
            public void onValueChange(ValueChangeEvent<Boolean> event) {
                fireSelectionChanged(id, event.getValue());
            }
        });
        if (stylesheet != null) {
            checkBox.addStyleName(stylesheet.facetSelectionOption());
        }
        selectionOptions.put(id, checkBox);
        selectionsPanel.add(checkBox);
    }

    public void sort() {
        selectionsPanel.clear();
        for (CheckBox cb : getSortedSelections()) {
            selectionsPanel.add(cb);
        }
    }

    public void setStylesheet(Stylesheet stylesheet) {
        this.stylesheet = stylesheet;
        applyStylesheet(stylesheet);
    }

    public void applyStylesheet(Stylesheet stylesheet) {
        addStyleName(stylesheet.facet());
        label.addStyleName(stylesheet.facetHeader());
        for (Map.Entry<String, CheckBox> selectionOption : selectionOptions.entrySet()) {
            selectionOption.getValue().addStyleDependentName(stylesheet.facetSelectionOption());
        }
    }

    @Override
    public void addFacetValueSelectionChangedHandler(FacetValueSelectionChangedHandler handler) {
        addHandler(handler, FacetValueSelectionChangedEvent.getType());
    }

    private Widget createUi() {
        panel = new LayoutPanel();
        label = new Label();

        panel.add(label);

        selectionsPanel = new FlowPanel();
        scrollPanel = new ScrollPanel();
        scrollPanel.setWidget(selectionsPanel);
        panel.add(scrollPanel);

        panel.forceLayout();

        return panel;
    }

    @Override
    public void setHeight(String height) {
        super.setHeight(height);
        this.getElement().getStyle().setProperty("minHeight", 50 * selectionOptions.size(), Unit.PX);
        scrollPanel.getElement().getStyle().setPosition(Position.ABSOLUTE);
        scrollPanel.getElement().getStyle().setTop(22, Unit.PX);
    }

    public void setHeight(String height, int numberOfElements) {
        super.setHeight(height);
        int minHeight = 30 + 15 * numberOfElements;
        if (minHeight > 150) {
            minHeight = 150;
        }
        this.getElement().getStyle().setProperty("minHeight", minHeight, Unit.PX);
        scrollPanel.getElement().getStyle().setPosition(Position.ABSOLUTE);
        scrollPanel.getElement().getStyle().setTop(22, Unit.PX);
    }

    private void fireSelectionChanged(String id, Boolean value) {
        if (value && drawColoursBy == ConfigurationDrawColoursBy.FACET) {
            relationFacetIDHexColour.put(id, getFirtsFreeColour());
            selectionOptions.get(id).getElement().getStyle().setProperty("background",
                    DrawPointStyle.getHexColours()[relationFacetIDHexColour.get(id)]);
        } else {
            if (relationFacetIDHexColour.containsKey(id)) {
                removeHexColour(relationFacetIDHexColour.get(id));
            }
            selectionOptions.get(id).getElement().getStyle().setProperty("background", "");
        }
        if (relationFacetIDHexColour.get(id) != null && drawColoursBy == ConfigurationDrawColoursBy.FACET) {
            fireEvent(new FacetValueSelectionChangedEvent(
                    DrawPointStyle.getHexColours()[relationFacetIDHexColour.get(id)], id, value));
        } else {
            fireEvent(new FacetValueSelectionChangedEvent("", id, value));
        }
        if (!value) {
            relationFacetIDHexColour.remove(id);
        }
    }

    private List<CheckBox> getSortedSelections() {
        List<CheckBox> sortedList = new ArrayList<CheckBox>(selectionOptions.values());
        Collections.sort(sortedList, new Comparator<CheckBox>() {
            @Override
            public int compare(CheckBox o1, CheckBox o2) {
                return o1.getText().compareTo(o2.getText());
            }
        });
        return sortedList;
    }

    private synchronized int getFirtsFreeColour() {
        int menor = Integer.MAX_VALUE;
        int firtsFreeColour = 0;
        for (int i = 0; i < freeHexColour.length; i++) {
            if (freeHexColour[i] < menor) {
                firtsFreeColour = i;
                menor = freeHexColour[i];
            }
        }
        freeHexColour[firtsFreeColour]++;
        return firtsFreeColour;
    }

    private synchronized void removeHexColour(int positionHexColour) {
        if (positionHexColour >= 0 && positionHexColour < freeHexColour.length) {
            freeHexColour[positionHexColour]--;
            if (freeHexColour[positionHexColour] < 0) {
                freeHexColour[positionHexColour] = 0;
            }
        }
    }

    public void setConfigurationDrawColours(ConfigurationDrawColoursBy drawColoursBy2) {
        this.drawColoursBy = drawColoursBy2;

    }
}