/******************************************************************************* * Copyright (c) 2007, 2010 Association for Decentralized Information Management * in Industry THTH ry. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VTT Technical Research Centre of Finland - initial API and implementation *******************************************************************************/ package org.simantics.utils.ui.color; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Canvas; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; /** * * Widget to edit colors * * @author Marko Luukkainen * */ public class ColorComposite extends Composite{ private Color color = new Color(255,255,255); private ColorGradient rGradient; private ColorGradient gGradient; private ColorGradient bGradient; private ColorGradient colorGradient; Text rText; Text gText; Text bText; ColorGradientCanvas rCanvas; ColorGradientCanvas gCanvas; ColorGradientCanvas bCanvas; ColorGradientCanvas colorCanvas; public ColorComposite(Composite parent, int style) { super(parent,style); updateGradients(); GridLayout layout = new GridLayout(); layout.makeColumnsEqualWidth = false; layout.numColumns = 3; this.setLayout(layout); colorCanvas = new ColorGradientCanvas(this,SWT.BORDER|SWT.HORIZONTAL); GridData colorCanvasData = new GridData(); colorCanvasData.horizontalSpan = 3; colorCanvasData.heightHint = 32; colorCanvasData.widthHint = 600; colorCanvasData.grabExcessHorizontalSpace = true; colorCanvas.setLayoutData(colorCanvasData); //layout data used with labels GridData labelData = new GridData(); labelData.widthHint = 30; //layout data used with gradients GridData gradientData = new GridData(); gradientData.grabExcessHorizontalSpace = true; gradientData.heightHint = 16; gradientData.widthHint = 500; //layout data used with texts GridData textData = new GridData(); textData.widthHint = 30; //Composite rComposite = new Composite(this,SWT.NONE); //Layout rLayout = new FillLayout(SWT.HORIZONTAL); //rComposite.setLayout(rLayout); Label rLabel = new Label(this,SWT.NONE); rLabel.setText("Red"); rLabel.setLayoutData(labelData); rCanvas = new ColorGradientCanvas(this,SWT.BORDER|SWT.HORIZONTAL); rCanvas.setLayoutData(gradientData); rText = new Text(this,SWT.BORDER); rText.setLayoutData(textData); rCanvas.addMouseListener(new ColorSelectListener(rCanvas) { void setValue(int value) { Color newColor = new Color(value,color.getG(),color.getB()); updateColor(newColor); }; }); //Composite gComposite = new Composite(this,SWT.NONE); //Layout gLayout = new FillLayout(SWT.HORIZONTAL); //gComposite.setLayout(gLayout); Label gLabel = new Label(this,SWT.NONE); gLabel.setText("Green"); gLabel.setLayoutData(labelData); gCanvas = new ColorGradientCanvas(this,SWT.BORDER|SWT.HORIZONTAL); gCanvas.setLayoutData(gradientData); gText = new Text(this,SWT.BORDER); gText.setLayoutData(textData); gCanvas.addMouseListener(new ColorSelectListener(gCanvas) { void setValue(int value) { Color newColor = new Color(color.getR(),value,color.getB()); updateColor(newColor); }; }); //Composite bComposite = new Composite(this,SWT.NONE); //Layout bLayout = new FillLayout(SWT.HORIZONTAL); //bComposite.setLayout(bLayout); Label bLabel = new Label(this,SWT.NONE); bLabel.setText("Blue"); bLabel.setLayoutData(labelData); bCanvas = new ColorGradientCanvas(this,SWT.BORDER|SWT.HORIZONTAL); bCanvas.setLayoutData(gradientData); bText = new Text(this,SWT.BORDER); bText.setLayoutData(textData); bCanvas.addMouseListener(new ColorSelectListener(bCanvas) { void setValue(int value) { Color newColor = new Color(color.getR(),color.getG(),value); updateColor(newColor); }; }); updateWidgets(); } private abstract class ColorSelectListener implements MouseListener { private Canvas canvas; public ColorSelectListener(Canvas canvas) { this.canvas = canvas; } public void mouseDoubleClick(MouseEvent e) { } public void mouseDown(MouseEvent e) { Rectangle r = this.canvas.getBounds(); double d = (double)e.x / (double)r.width; int value = (int)(d * 255); if (value < 0) value = 0; if (value > 255) value = 255; setValue(value); } public void mouseUp(MouseEvent e) { } abstract void setValue(int value); } private void updateColor(Color color) { this.color = color; updateWidgets(); } private void updateGradients() { rGradient = new ColorGradient(new ColorValue[]{ new ColorValue(new Color(0,color.getG(),color.getB()),0.0), new ColorValue(new Color(255,color.getG(),color.getB()),1.0)}); gGradient = new ColorGradient(new ColorValue[]{ new ColorValue(new Color(color.getR(),0,color.getB()),0.0), new ColorValue(new Color(color.getR(),255,color.getB()),1.0)}); bGradient = new ColorGradient(new ColorValue[]{ new ColorValue(new Color(color.getR(),color.getG(),0),0.0), new ColorValue(new Color(color.getR(),color.getG(),255),1.0)}); colorGradient = new ColorGradient(new ColorValue[]{ new ColorValue(new Color(color.getR(),color.getG(),color.getB()),0.0)}); } private void updateWidgets() { updateGradients(); rCanvas.setGradient(rGradient); gCanvas.setGradient(gGradient); bCanvas.setGradient(bGradient); colorCanvas.setGradient(colorGradient); rText.setText(Integer.toString(color.getR())); gText.setText(Integer.toString(color.getG())); bText.setText(Integer.toString(color.getB())); } }