/* * org.openmicroscopy.shoola.util.ui * *------------------------------------------------------------------------------ * Copyright (C) 2006-2008 University of Dundee. All rights reserved. * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *------------------------------------------------------------------------------ */ package org.openmicroscopy.shoola.util.ui; //Java imports import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Image; import java.util.ArrayList; import java.util.List; import javax.swing.JPanel; //Third-party libraries //Application-internal dependencies /** * The rating component. * * @author Jean-Marie Burel      * <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @author Donald MacDonald      * <a href="mailto:donald@lifesci.dundee.ac.uk">donald@lifesci.dundee.ac.uk</a> * @version 3.0 * <small> * (<b>Internal version:</b> $Revision: $Date: $) * </small> * @since OME3.0 */ public class RatingComponent extends JPanel { /** Index corresponding to 16x16 icons. */ public static final int HIGH_SIZE = 0; /** Index corresponding to 12x12 icons. */ public static final int MEDIUM_SIZE = 1; /** Index corresponding to 8x8 icons. */ public static final int SMALL_SIZE = 2; /** Bound property indicating that the value has changed. */ public static final String RATE_PROPERTY = "rate"; /** * Bound property indicating that the modification of the value has ended. */ public static final String RATE_END_PROPERTY = "rateEnd"; /** The maximum number of value. */ public static final int MAX_VALUE = 5; /** The maximum number of value. */ public static final int MIN_VALUE = 0; /** The collection of selected stars. */ private List<Image> plus; /** The collection of unselected stars. */ private List<Image> minus; /** The currently selected value. */ private int currentValue; /** The image used when the rate increases. */ private Image selected; /** The image used when the rate decreases. */ private Image unselected; /** The canvas hosting the rating stars. */ private RatingCanvas canvas; /** The selected size. */ private int size; /** Fills the {@link #plus} and {@link #minus} lists. */ private void fillLists() { plus.clear(); minus.clear(); int n = MAX_VALUE-currentValue; for (int i = 0; i < n; i++) minus.add(unselected); for (int i = 0; i < currentValue; i++) plus.add(selected); } /** Initializes the components. */ private void initialize() { canvas = new RatingCanvas(this); plus = new ArrayList<Image>(); minus = new ArrayList<Image>(); IconManager icons = IconManager.getInstance(); switch (size) { case HIGH_SIZE: selected = icons.getImageIcon( IconManager.START_SELECTED).getImage(); unselected = icons.getImageIcon( IconManager.START_UNSELECTED).getImage(); break; case MEDIUM_SIZE: selected = icons.getImageIcon( IconManager.START_SELECTED_12).getImage(); unselected = icons.getImageIcon( IconManager.START_UNSELECTED_12).getImage(); break; case SMALL_SIZE: selected = icons.getImageIcon( IconManager.START_SELECTED_8).getImage(); unselected = icons.getImageIcon( IconManager.START_UNSELECTED_8).getImage(); } int w = selected.getWidth(null); int h = selected.getHeight(null); canvas.setPreferredSize( new Dimension(w*MAX_VALUE+(MAX_VALUE-1)*RatingCanvas.SPACE, h+2*RatingCanvas.SPACE)); fillLists(); } /** * Builds and lays out the UI. * * @param hasListeners Pass <code>true</code> to install the listeners, * <code>false</code> otherwise. */ private void buildGUI(boolean hasListeners) { setBorder(null); setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); add(canvas); //add(Box.createHorizontalStrut(5)); if (!hasListeners) canvas.setEnabled(false); } /** Creates a default instance. */ public RatingComponent() { this(0, HIGH_SIZE, true); } /** * Creates a default instance. * * @param size The size of the stars. One of the constants * defined by this class. */ public RatingComponent(int size) { this(0, size, true); } /** * Creates a default instance. * * @param selected The number of stars. * @param size The size of the stars. One of the constants * defined by this class. */ public RatingComponent(int selected, int size) { this(selected, size, true); } /** * Creates a new instance with default value equals to <code>0</code> * * @param size The size of the stars. One of the constants * defined by this class. * @param hasListeners Pass <code>true</code> to install the listeners, * <code>false</code> otherwise. */ public RatingComponent(int size, boolean hasListeners) { this(0, size, hasListeners); } /** * Creates a new instance. * * @param selected The number of stars. * @param size The size of the stars. One of the constants * defined by this class. * @param hasListeners Pass <code>true</code> to install the listeners, * <code>false</code> otherwise. */ public RatingComponent(int selected, int size, boolean hasListeners) { if (selected < MIN_VALUE) selected = MIN_VALUE; if (selected > MAX_VALUE) selected = MAX_VALUE; switch (size) { case HIGH_SIZE: case MEDIUM_SIZE: case SMALL_SIZE: this.size = size; break; default: this.size = SMALL_SIZE; } currentValue = selected; initialize(); buildGUI(hasListeners); } /** * Returns the collection of selected stars. * * @return See above. */ List<Image> getPlus() { return plus; } /** * Returns the collection of unselected stars. * * @return See above. */ List<Image> getMinus() { return minus; } /** Invokes when the mouse is released i.e. the dragging has ended.*/ void onMouseReleased() { firePropertyChange(RATE_END_PROPERTY, Boolean.valueOf(false), Boolean.valueOf(true)); } /** * Sets the value. * * @param value The current value. */ public void setValue(int value) { if (value < MIN_VALUE || value > MAX_VALUE) return; int oldValue = currentValue; currentValue = value; fillLists(); canvas.repaint(); firePropertyChange(RATE_PROPERTY, oldValue, currentValue); } /** * Returns the currently selected value. * * @return See above. */ public int getCurrentValue() { if (currentValue < MIN_VALUE) return MIN_VALUE; if (currentValue > MAX_VALUE) return MAX_VALUE; return currentValue; } /** * Overridden to set the background of the canvas. * @see JPanel#setBackground(Color) */ public void setBackground(Color bg) { super.setBackground(bg); if (canvas != null) canvas.setBackground(bg); } /** * Overridden to add or remove the listeners * @see javax.swing.JComponent#setEnabled(boolean) */ public void setEnabled(boolean enabled) { super.setEnabled(enabled); canvas.setEnabled(enabled); } }