/**
 * Copyright (c) 2011, Martin Foster <martin@ethereal-realms.org>
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * 
 *     * Redistributions of source code must retain the above copyright notice, 
 *       this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright 
 *       notice, this list of conditions and the following disclaimer in the 
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the Ethereal-Realms.org nor the names of its
 *       contributors may be used to endorse or promote products derived
 *       from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package org.lyra.Widgets;

import java.awt.Color;
import java.awt.Component;
import java.util.Map;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;

import org.lyra.Lyra;
import org.lyra.Interface.Constants;

/**
 * Makes use of a similar generation technique found in the RatingCellEditor
 * with exception that it is not going to be modifiable.
 * <p>
 * @author Martin Foster
 * @version 1.0.1,  %Revision, 95%, %LastChangedDate, 12/03/11 9:59PM%
 * @see CustomColorRenderer
 */
public class RatingCellRenderer extends CustomColorRenderer {

	// Serial Requirements
	private static final long serialVersionUID = 1L;

	// Images for details
	private ImageIcon iconFull  = new ImageIcon(Lyra.getIconByMap("Rating-Full"));
	private ImageIcon iconEmpty = new ImageIcon(Lyra.getIconByMap("Rating-Empty"));
	
	
	/**
	 * Default constructor for the rating system.
	 * <p>
	 * @param global Global parameter map.
	 */
	public RatingCellRenderer(Map<String, String> global) {
		
		// Initialise colours
		super(global);
		
	}
	// End of Constructor Class

	
	/* (non-Javadoc)
	 * @see javax.swing.table.DefaultTableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
	 */
	public Component getTableCellRendererComponent(
		JTable table,
		Object value, 
		boolean selected, 
		boolean focused,
		int row, 
		int column) {
	
		// Extract the Existing Component
		super.getTableCellRendererComponent(
				table, 
				value,
				selected, 
				focused, 
				row, 
				column
			);
		
		/*
		 * We have to take the value and use it to generate the actual display.
		 * By default the value will be zero accounting for instances where the
		 * current value is null.
		 */
		
		// Safety assign
		int actual = 0;
		
		// Parse in the actual value if not already assigned
		if (value != null) {
			
			// Parse
			actual = Integer.parseInt(value.toString());
			
			// Safety
			if (actual > Constants.getMaxRating())
				actual = 0;
		}
		
		/*
		 * We generate the panel and add in all of the additional images as
		 * necessary.  Every element has to be calculated and set.
		 */
		
		// Establish Holder
		JPanel panelRating = new JPanel();
		
		// Establish Layout
		panelRating.setLayout(new BoxLayout(panelRating, BoxLayout.X_AXIS));
		
		// Capture colouring
		Color bg = getBackground();
		panelRating.setForeground(getForeground());

		/*
		 * We have to create a new color object because Nimbus returns
		 * a color of type DerivedColor, which behaves strange, not sure
		 * why.
		 */
		panelRating.setBackground(new Color(
				bg.getRed(), 
				bg.getGreen(), 
				bg.getBlue())
			);
		panelRating.setOpaque(true);

		
		// Loop through and make calculations
		for (int count=1; count <= Constants.getMaxRating(); count++) {
			
			// Determine icon
			ImageIcon current = (count <= actual)
				? iconFull
				: iconEmpty;
			
			// Add in element
			panelRating.add(new JLabel(current));
		}

		// Spacer
		panelRating.add(Box.createHorizontalGlue());
		
		// Return Generated Material
		return panelRating;
	}
	// End of getTableCellRendererComponent Method
}
