X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.utils.ui%2Fsrc%2Forg%2Fsimantics%2Futils%2Fui%2Fcolor%2FColorComposite.java;fp=bundles%2Forg.simantics.utils.ui%2Fsrc%2Forg%2Fsimantics%2Futils%2Fui%2Fcolor%2FColorComposite.java;h=bae10b93586e926a5e33e6ca20b87cda1fb5de3e;hp=0000000000000000000000000000000000000000;hb=969bd23cab98a79ca9101af33334000879fb60c5;hpb=866dba5cd5a3929bbeae85991796acb212338a08 diff --git a/bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/color/ColorComposite.java b/bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/color/ColorComposite.java new file mode 100644 index 000000000..bae10b935 --- /dev/null +++ b/bundles/org.simantics.utils.ui/src/org/simantics/utils/ui/color/ColorComposite.java @@ -0,0 +1,191 @@ +/******************************************************************************* + * 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())); + } +}