/******************************************************************************* * Copyright (c) 2012 Original authors and others. * 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: * Original authors and others - initial API and implementation ******************************************************************************/ package org.eclipse.nebula.widgets.nattable.style.editor; import org.eclipse.nebula.widgets.nattable.util.GUIHelper; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.ColorDialog; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; /** * A button that displays a solid block of color and allows the user to pick a * color. The user can double click on the button in order to change the * selected color which also changes the background color of the button. * */ public class ColorPicker extends CLabel { private Color selectedColor; private Image image; public ColorPicker(Composite parent, final Color originalColor) { super(parent, SWT.SHADOW_OUT); if (originalColor == null) throw new IllegalArgumentException("null"); //$NON-NLS-1$ this.selectedColor = originalColor; setImage(getColorImage(originalColor)); addMouseListener(new MouseAdapter() { @Override public void mouseDown(MouseEvent e) { ColorDialog dialog = new ColorDialog(new Shell( Display.getDefault(), SWT.SHELL_TRIM)); dialog.setRGB(ColorPicker.this.selectedColor.getRGB()); RGB selected = dialog.open(); if (selected != null) { update(selected); } } }); } private Image getColorImage(Color color) { Display display = Display.getCurrent(); this.image = new Image(display, new Rectangle(10, 10, 70, 20)); GC gc = new GC(this.image); gc.setBackground(color); gc.fillRectangle(this.image.getBounds()); gc.dispose(); return this.image; } private void update(RGB selected) { this.selectedColor = GUIHelper.getColor(selected); setImage(getColorImage(this.selectedColor)); } /** * @return the Color most recently selected by the user. * <em>Note that it is the responsibility of the client to * dispose this resource</em> */ public Color getSelectedColor() { return this.selectedColor; } /** * Set the current selected color that will be displayed by the picker. * <em>Note that this class is not responsible * for destroying the given Color object. It does not take ownership. Instead it will create its own internal * copy of the given Color resource.</em> * * @param backgroundColor */ public void setSelectedColor(Color backgroundColor) { if (backgroundColor == null) throw new IllegalArgumentException("null"); //$NON-NLS-1$ update(backgroundColor.getRGB()); } @Override public void dispose() { super.dispose(); this.image.dispose(); } }