/* ********************************************************************** **
** Copyright notice **
** **
** (c) 2005-2009 RSSOwl Development Team **
** http://www.rssowl.org/ **
** **
** 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.rssowl.org/legal/epl-v10.html **
** **
** A copy is found in the file epl-v10.html and important notices to the **
** license from the team is found in the textfile LICENSE.txt distributed **
** in this package. **
** **
** This copyright notice MUST APPEAR in all copies of the file! **
** **
** Contributors: **
** RSSOwl Development Team - initial API and implementation **
** **
** ********************************************************************** */
package org.rssowl.ui.internal.util;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
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.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.rssowl.ui.internal.OwlUI;
import java.util.ArrayList;
import java.util.List;
/**
* A {@link ToolItem} drop down that allows to either select from some
* predefined colors or to choose any color from the native color dialog.
*
* @author bpasero
*/
public class ColorPicker {
private static final String[] COLOR_LABELS = new String[] { //
Messages.ColorPicker_BARN_RED, //
Messages.ColorPicker_SALEM_RED, //
Messages.ColorPicker_SALMON, //
Messages.ColorPicker_PUMPKIN, //
Messages.ColorPicker_MARIGOLD_YELLOW, //
Messages.ColorPicker_MUSTARD, //
Messages.ColorPicker_BARBERRY_GREEN, //
Messages.ColorPicker_TAVERN_GREEN, //
Messages.ColorPicker_LEXINGTON_GREEN, //
Messages.ColorPicker_SEA_GREEN, //
Messages.ColorPicker_FEDERAL_BLUE, //
Messages.ColorPicker_SOLIDER_BLUE, //
Messages.ColorPicker_SLATE, //
Messages.ColorPicker_PITCH_BLACK, //
Messages.ColorPicker_DRIFTWOOD, //
Messages.ColorPicker_CHOCOLATE_BROWN //
};
private static final RGB[] COLOR_VALUES = new RGB[] { //
new RGB(124, 10, 2), // "Barn Red",
new RGB(163, 21, 2), // "Salem Red",
new RGB(214, 148, 99), // "Salmon",
new RGB(200, 118, 10), // "Pumpkin",
new RGB(240, 177, 12), // "Marigold Yellow",
new RGB(209, 161, 17), // "Mustard",
new RGB(136, 128, 54), // "Bayberry Green",
new RGB(129, 150, 93), // "Tavern Green",
new RGB(82, 92, 58), // "Lexington Green",
new RGB(126, 135, 130), // "Sea Green",
new RGB(111, 121, 174), // "Federal Blue",
new RGB(92, 101, 126), // "Soldier Blue",
new RGB(144, 152, 163), // "Slate",
new RGB(25, 16, 17), // "Pitch Black",
new RGB(82, 66, 41), // "Driftwood",
new RGB(82, 16, 0), // "Chocolate Brown"
};
private Menu fColorMenu;
private final Composite fParent;
private ToolBar fBar;
private ToolItem fColorItem;
private List<Image> fImagesToDispose = new ArrayList<Image>();
private RGB fSelectedColor = new RGB(0, 0, 0);
/**
* @param parent
* @param style
*/
public ColorPicker(Composite parent, int style) {
fParent = parent;
initControl(style);
}
/**
* @param color the color to show.
*/
public void setColor(RGB color) {
onColorSelected(color);
}
/**
* @return the control of the picker.
*/
public Control getControl() {
return fBar;
}
/**
* @return the selected color
*/
public RGB getColor() {
return fSelectedColor;
}
private void initControl(int style) {
fBar = new ToolBar(fParent, style);
OwlUI.makeAccessible(fBar, Messages.ColorPicker_COLOR_LABEL);
fBar.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
fColorMenu.dispose();
for (Image img : fImagesToDispose) {
img.dispose();
}
}
});
createColorMenu();
fColorItem = new ToolItem(fBar, SWT.DROP_DOWN);
fColorItem.setImage(createColorImage(fSelectedColor));
fColorItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
Rectangle rect = fColorItem.getBounds();
Point pt = new Point(rect.x, rect.y + rect.height);
pt = fBar.toDisplay(pt);
fColorMenu.setLocation(pt.x, pt.y);
fColorMenu.setVisible(true);
}
});
}
private void createColorMenu() {
fColorMenu = new Menu(fParent.getShell(), SWT.POP_UP);
/* Add some useful Colors */
for (int i = 0; i < COLOR_LABELS.length; i++) {
MenuItem item = new MenuItem(fColorMenu, SWT.RADIO);
item.setText(COLOR_LABELS[i]);
final RGB color = COLOR_VALUES[i];
item.setImage(createColorImage(color));
item.setData(color);
item.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
onColorSelected(color);
}
});
}
/* Add Item to open the native Color Picker */
new MenuItem(fColorMenu, SWT.SEPARATOR);
MenuItem moreColor = new MenuItem(fColorMenu, SWT.PUSH);
moreColor.setText(Messages.ColorPicker_OTHER);
moreColor.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
onSelectOtherColor();
}
});
}
private void onColorSelected(RGB color) {
fSelectedColor = color;
if (fColorItem.getImage() != null)
fColorItem.getImage().dispose();
fColorItem.setImage(createColorImage(fSelectedColor));
MenuItem[] items = fColorMenu.getItems();
for (MenuItem item : items) {
if (fSelectedColor.equals(item.getData()))
item.setSelection(true);
else if (item.getSelection())
item.setSelection(false);
}
}
private Image createColorImage(RGB color) {
Image img = OwlUI.createColorImage(fParent.getDisplay(), color);
fImagesToDispose.add(img);
return img;
}
private void onSelectOtherColor() {
ColorDialog dialog = new ColorDialog(fParent.getShell());
dialog.setRGB(fSelectedColor);
RGB color = dialog.open();
if (color != null)
onColorSelected(color);
}
}