Package org.thechiselgroup.choosel.visualization_component.timeline.client

Source Code of org.thechiselgroup.choosel.visualization_component.timeline.client.TimeLineItem

/*******************************************************************************
* 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.visualization_component.timeline.client;

import java.util.Date;

import org.thechiselgroup.choosel.core.client.ui.CSS;
import org.thechiselgroup.choosel.core.client.ui.Color;
import org.thechiselgroup.choosel.core.client.visualization.model.VisualItem;
import org.thechiselgroup.choosel.core.client.visualization.model.VisualItemInteraction;
import org.thechiselgroup.choosel.core.client.visualization.model.VisualItem.Status;
import org.thechiselgroup.choosel.core.client.visualization.model.VisualItem.Subset;

import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.EventListener;

public class TimeLineItem {

    protected static final String CSS_RESOURCE_ITEM_ICON = "resourceItemIcon";

    protected static final int Z_INDEX_DEFAULT = 5;

    protected static final int Z_INDEX_HIGHLIGHTED = 20;

    protected static final int Z_INDEX_SELECTED = 10;

    private static final int OVERVIEW_BAND_ID = 1;

    private static final String TICK_ELEMENT = "tick";

    private JsTimeLineEvent timeLineEvent;

    private String iconElementID;

    private String tickElementID;

    private final VisualItem visualItem;

    public TimeLineItem(VisualItem visualItem, TimeLine view) {
        this.visualItem = visualItem;

        Object date = visualItem.getValue(TimeLine.DATE);
        String dateString;
        if (date instanceof Date) {
            dateString = date.toString();
        } else if (date instanceof String) {
            dateString = (String) date;
        } else {
            throw new RuntimeException(date.toString()
                    + " not an appropriate date");
        }

        timeLineEvent = JsTimeLineEvent.create(dateString, null, "", this);
        tickElementID = view.getEventElementID(OVERVIEW_BAND_ID, TICK_ELEMENT,
                timeLineEvent);
    }

    private Color getBorderColor() {
        return (Color) visualItem.getValue(TimeLine.BORDER_COLOR);
    }

    private Color getColor() {
        return (Color) visualItem.getValue(TimeLine.COLOR);
    }

    public JsTimeLineEvent getTimeLineEvent() {
        return timeLineEvent;
    }

    public void onPainted(String labelElementID, String iconElementID) {
        assert labelElementID != null;
        assert iconElementID != null;

        /*
         * every time the event is repainted, we need to hook up our listeners
         * again
         */
        registerListeners(labelElementID);
        registerListeners(iconElementID);

        this.iconElementID = iconElementID;

        // fix icon representation
        updateIconElement(iconElementID);
    }

    private void registerListeners(String elementID) {
        Element element = DOM.getElementById(elementID);

        DOM.sinkEvents(element, Event.MOUSEEVENTS | Event.ONCLICK);
        DOM.setEventListener(element, new EventListener() {
            @Override
            public void onBrowserEvent(Event event) {
                visualItem.reportInteraction(new VisualItemInteraction(event));
            }
        });
    }

    private void setIconColor(Color color, Color borderColor) {
        if (iconElementID == null) {
            return;
        }

        Element element = DOM.getElementById(iconElementID);

        // can happen on resize
        if (element == null) {
            return;
        }

        Element div = (Element) element.getFirstChild();
        if (div != null) {
            CSS.setBackgroundColor(div, color.toRGBa());
            CSS.setBorderColor(div, borderColor.toRGBa());
        }
    }

    public void setStatusStyling() {
        Color color = getColor();
        Color borderColor = getBorderColor();

        setIconColor(color, borderColor);

        if (DOM.getElementById(tickElementID) == null) {
            return;
        }

        updateTickZIndex();
        updateTickColor(color);
    }

    public void updateBorderColor() {
        Color color = getColor();

        setIconColor(color, getBorderColor());

        if (DOM.getElementById(tickElementID) == null) {
            return;
        }

        updateTickColor(color);
    }

    public void updateColor() {
        Color color = getColor();

        setIconColor(color, getBorderColor());

        if (DOM.getElementById(tickElementID) == null) {
            return;
        }

        updateTickColor(color);
    }

    private void updateIconElement(String iconElementID) {
        Element element = DOM.getElementById(iconElementID);

        if (element == null) {
            return;
        }

        element.setInnerHTML("<div style='background-color: "
                + getColor().toRGBa() + "; border-color: "
                + getBorderColor().toRGBa() + ";' class='"
                + CSS_RESOURCE_ITEM_ICON + "'></div>");
    }

    private void updateTickColor(Color color) {
        Element tickElement = DOM.getElementById(tickElementID);

        CSS.setBackgroundColor(tickElement, color.toRGBa());

        // /*
        // * TODO refactor: this sets a bottom border on highlighted ticks,
        // * because they are otherwise hard to see
        // */
        // if (visualItem.isStatus(Subset.HIGHLIGHTED, Status.COMPLETE,
        // Status.PARTIAL)) {
        // CSS.setBorderBottom(tickElement, "6px solid black");
        // } else {
        // CSS.setBorderBottom(tickElement, "none");
        // }

        timeLineEvent.setTickBackgroundColor(color.toRGBa());
    }

    private void updateTickZIndex() {
        if (visualItem.isStatus(Subset.HIGHLIGHTED, Status.FULL, Status.PARTIAL)) {
            CSS.setZIndex(tickElementID, Z_INDEX_HIGHLIGHTED);
            timeLineEvent.setTickZIndex("" + Z_INDEX_HIGHLIGHTED);
        } else if (visualItem.isStatus(Subset.SELECTED, Status.FULL,
                Status.PARTIAL)) {
            CSS.setZIndex(tickElementID, Z_INDEX_SELECTED);
            timeLineEvent.setTickZIndex("" + Z_INDEX_SELECTED);
        } else {
            CSS.setZIndex(tickElementID, Z_INDEX_DEFAULT);
            timeLineEvent.setTickZIndex("" + Z_INDEX_DEFAULT);
        }
    }

}
TOP

Related Classes of org.thechiselgroup.choosel.visualization_component.timeline.client.TimeLineItem

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.