com.totsp.gwittir.client.fx.ui.ReflectedImageGroup.java Source code

Java tutorial

Introduction

Here is the source code for com.totsp.gwittir.client.fx.ui.ReflectedImageGroup.java

Source

/*
 * ReflectedImageGroup.java
 *
 * Created on November 7, 2007, 8:43 PM
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

package com.totsp.gwittir.client.fx.ui;

import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.MouseListener;
import com.google.gwt.user.client.ui.Widget;
import com.totsp.gwittir.client.log.Level;
import com.totsp.gwittir.client.ui.AbstractBoundCollectionWidget;
import com.totsp.gwittir.client.ui.Renderer;
import com.totsp.gwittir.client.ui.ToStringRenderer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 *
 * @author cooper
 */
public class ReflectedImageGroup<T> extends AbstractBoundCollectionWidget<T, String> {

    private Collection value;
    final private double maxScalar = 1.25D;
    private transient ReflectedImage[] images;
    final private int baseWidth;
    final private int baseHeight;
    final private double reflectHeight;
    final private double opacity;
    final private Grid grid = new Grid(1, 3);
    final private FlexTable imagesPanel = new FlexTable();
    private Object selected;
    private int lastSelectedIndex = -1;

    /** Creates a new instance of ReflectedImageGroup */
    public ReflectedImageGroup(final int baseWidth, final int baseHeight, final double reflectHeight,
            final double opacity) {
        super();
        this.baseWidth = baseWidth;
        this.baseHeight = baseHeight;
        this.reflectHeight = reflectHeight;
        this.opacity = opacity;
        this.imagesPanel.setHeight("100%");
        final int padding = ((int) (baseHeight * maxScalar) - baseHeight) / 4;
        this.grid.setCellSpacing(padding);
        this.grid.setHeight("100%");
        this.grid.setStyleName("gwittir-ReflectedFisheyeImageGroup");
        this.grid.getRowFormatter().setVerticalAlign(0, HasVerticalAlignment.ALIGN_MIDDLE);
        this.imagesPanel.getRowFormatter().setVerticalAlign(0, HasVerticalAlignment.ALIGN_MIDDLE);
        this.grid.setWidget(0, 1, imagesPanel);
        this.imagesPanel.setCellPadding(0);
        this.imagesPanel.setCellSpacing(2);
        Renderer<T, String> renderer = (Renderer<T, String>) ToStringRenderer.INSTANCE;
        this.setRenderer(renderer);
        super.initWidget(grid);
    }

    public Collection<T> getValue() {
        return this.value;
    }

    public void setValue(Collection<T> value) {
        this.value = value;
        this.changes.firePropertyChange("value", null, value);
        this.render(this.value == null ? new ArrayList() : this.value);
    }

    protected void render(Collection value) {
        this.images = new ReflectedImage[value.size()];
        this.lastSelectedIndex = -1;
        this.imagesPanel.clear();
        if (this.imagesPanel.getRowCount() > 0) {
            this.imagesPanel.removeRow(0);
        }
        if (value == null) {
            return;
        }
        Iterator<T> it = value.iterator();
        final int maxSize = (int) (baseWidth * maxScalar) + 4;
        this.imagesPanel.setWidth(maxSize * value.size() + "px");
        for (int i = 0; it.hasNext(); i++) {
            final int index = i;
            final T selectObject = it.next();
            this.images[i] = new ReflectedImage(this.getRenderer().render(selectObject).toString(), this.baseWidth,
                    this.baseHeight, this.reflectHeight, this.opacity);

            this.imagesPanel.getCellFormatter().setWidth(0, index, maxSize + "px");
            this.imagesPanel.getCellFormatter().setHorizontalAlignment(0, index,
                    HasHorizontalAlignment.ALIGN_CENTER);
            this.imagesPanel.setWidget(0, index, this.images[i]);

            this.images[i].addMouseListener(new MouseListener() {
                final Timer t = new Timer() {
                    public void run() {
                        if (selectObject != selected) {
                            images[index].setHeight((int) (baseHeight * maxScalar));
                            images[index].setWidth((int) (baseWidth * maxScalar));
                        }
                    }

                };

                public void onMouseUp(Widget sender, int x, int y) {
                }

                public void onMouseMove(Widget sender, int x, int y) {
                }

                public void onMouseDown(Widget sender, int x, int y) {
                    setSelected(selectObject);
                }

                public void onMouseLeave(Widget sender) {
                    t.cancel();
                    if (selectObject != selected) {
                        images[index].setHeight(baseHeight);
                        images[index].setWidth(baseWidth);
                    }
                }

                public void onMouseEnter(Widget sender) {
                    t.schedule(50);
                }

            });
        }
    }

    public Object getSelected() {
        return selected;
    }

    public void setSelected(Object selected) {
        LOG.log(Level.SPAM, selected + " :: " + selected.getClass(), null);
        if (selected == this.selected) {
            return;
        }
        Object old = this.selected;

        Object[] arr = value.toArray();
        if (lastSelectedIndex != -1) {
            this.imagesPanel.getCellFormatter().removeStyleName(0, lastSelectedIndex, "selected");
            this.images[lastSelectedIndex].setHeight(baseHeight);
            this.images[lastSelectedIndex].setWidth(baseWidth);
        }
        this.selected = selected;

        boolean found = false;
        int index;
        for (index = 0; selected != null && index < arr.length; index++) {
            if (arr[index] == selected) {
                found = true;
                break;
            }
        }
        if (!found && selected != null) {
            throw new RuntimeException("Not an option");
        }
        images[index].setHeight((int) (baseHeight * maxScalar));
        images[index].setWidth((int) (baseWidth * maxScalar));
        this.imagesPanel.getCellFormatter().setStyleName(0, index, "selected");
        this.changes.firePropertyChange("selected", old, selected);
        this.lastSelectedIndex = index;
    }

}