/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.opengl.examples;


import java.util.Vector;
import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.opengl.GL;
import org.eclipse.swt.widgets.*;

class ColorSelectionGroup implements Listener {
	private Color color;
	private Label label;
	private Image image;
	private Button button;
	private Vector listeners = new Vector();

	/**
	 * Constructor.
	 * 
	 * @param parent the parent composite
	 * @param style style bits to be applied to the color group
	 */
	ColorSelectionGroup(Composite parent, int style) {
		super();
		initColor(parent.getDisplay());

		Composite colorGroup = new Composite(parent, style);
		GridLayout layout = new GridLayout(2, false);
		layout.marginWidth = 0;
		layout.marginHeight = 0;
		colorGroup.setLayout(layout);
//		GridData data = new GridData(GridData.FILL_HORIZONTAL);
//		data.grabExcessHorizontalSpace = true;
//		colorGroup.setLayoutData(data);

		button = new Button(colorGroup, SWT.NONE);
		button.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
		image = new Image(button.getDisplay(), 12, 12);
		drawButtonImage();
		button.setImage(image);
		button.addListener(SWT.Selection, this);
		button.addDisposeListener(new DisposeListener() {
			public void widgetDisposed(DisposeEvent event) {
				if (image != null) image.dispose();
				if (color != null) color.dispose();
			}
		});
		
		label = new Label(colorGroup, SWT.NONE);
		label.setText("Color");
//		data = new GridData(GridData.FILL_HORIZONTAL);
//		data.grabExcessHorizontalSpace = true;
//		label.setLayoutData(data);
	}

	/**
	 * Adds the argument to this group's collection of
	 * color selection listeners.
	 * 
	 * @param listener
	 */
	void addColorSelectionListener(IColorSelectionListener listener) {
		listeners.addElement(listener);
	}
	
	/**
	 * Draws the colored square on the selection button.
	 */
	void drawButtonImage() {
		GC gc = new GC(image);
		gc.setBackground(color);
		Rectangle bounds = image.getBounds();
		gc.fillRectangle(0, 0, bounds.width, bounds.height);
		gc.drawRectangle(0, 0, bounds.width - 1, bounds.height - 1);
		gc.dispose();
	}

	/**
	 * @see org.eclipse.swt.widgets.Listener#handleEvent(Event)
	 */
	public void handleEvent(Event e) {
		Shell shell = button.getShell();
		ColorDialog colorDialog = new ColorDialog(shell);
		colorDialog.setRGB(
			new RGB(color.getRed(), color.getGreen(), color.getBlue()));
		RGB rgb = colorDialog.open();
		if (rgb == null) return;
		setRGB(rgb);
		notifyListeners(rgb);
	}

	/**
	 * Initializes the color by querying for the current color.
	 * 
	 * @param display
	 */
	void initColor(Display display) {
		double[] currentColor = new double[4];
		GL.glGetDoublev(GL.GL_CURRENT_COLOR, currentColor);
		RGB rgb =
			new RGB(
				(int) currentColor[0] * 255,
				(int) currentColor[1] * 255,
				(int) currentColor[2] * 255);
		color = new Color(display, rgb);
	}
	
	/**
	 * Notifies all registered color selection listeners.
	 * 
	 * @param value
	 */
	void notifyListeners(RGB rgb) {
		IColorSelectionListener[] listenersArr =
			new IColorSelectionListener[listeners.size()];
		listeners.copyInto(listenersArr);
		for (int i = 0; i < listenersArr.length; i++) {
			listenersArr [i].handleColorSelection(rgb);
		}
	}

	/**
	 * Removes the argument from this group's collection of color selection
	 * listeners.  If the argument is not a registered listener then does
	 * nothing.
	 * 
	 * @param listener
	 */
	void removeColorSelectionListener(IColorSelectionListener listener) {
		listeners.removeElement(listener);
	}

	/**
	 * Sets the text for the group's label.
	 * 
	 * @param text the new label text
	 */
	void setText(String text) {
		label.setText(text);
	}

	/**
	 * Sets the current color.
	 * 
	 * @param rgb the rgb of the new color
	 */
	void setRGB(RGB rgb) {
		Color oldColor = color;
		color = new Color(button.getDisplay(), rgb);
		drawButtonImage();
		button.setImage(image);
		if (oldColor != null) oldColor.dispose();
	}
}
