/**************************************************************************** * Copyright (c) 2008 Atos Origin. * * 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: * Thibault Landre (Atos Origin) - Initial API and implementation * *****************************************************************************/ package org.eclipse.papyrus.infra.gmfdiag.preferences.jface.preference; import org.eclipse.gmf.runtime.diagram.ui.properties.sections.appearance.ColorPalettePopup; import org.eclipse.gmf.runtime.draw2d.ui.figures.FigureUtilities; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.preference.FieldEditor; import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.resource.CompositeImageDescriptor; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.PaletteData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; /** * A field editor that display a button and a small rectangle under it to show the color selected. * * This field editor is inspired by the class {@link org.eclipse.gmf.runtime.diagram.ui.properties.sections.appearance.ColorsAndFontsPropertySection * <em>ColorsAndFontsPropertySection</em>} * * @author tlandre */ public class ColorFieldEditor extends FieldEditor { private Image buttonImage; private Image backgroundImage; private ColorPalettePopup colorSelector; private Button colorButton; /** * Default constructor * * @param name * the preference name to use * @param image * the image to display * @param parent * the parent composite */ public ColorFieldEditor(String name, Image image, Composite parent) { super(name, "", parent); // $NON-NLS-1$ backgroundImage = image; } @Override public void load() { super.load(); buttonImage = new ColorOverlayImageDescriptor(backgroundImage.getImageData(), PreferenceConverter.getColor(getPreferenceStore(), getPreferenceName())).createImage(); colorButton.setImage(buttonImage); } @Override protected void adjustForNumColumns(int numColumns) { // TODO Auto-generated method stub } @Override protected void doFillIntoGrid(Composite parent, int numColumns) { colorButton = new Button(parent, SWT.PUSH); colorButton.setLayoutData(new GridData()); colorButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { changeColors(colorButton); } }); } @Override protected void doLoad() { doLoadColor(PreferenceConverter.getColor(getPreferenceStore(), getPreferenceName())); } @Override protected void doLoadDefault() { doLoadColor(PreferenceConverter.getDefaultColor(getPreferenceStore(), getPreferenceName())); } private void doLoadColor(RGB rgb) { updateButtonImage(rgb); if(colorSelector != null) { colorSelector.setPreviousColor(FigureUtilities.RGBToInteger(rgb)); } } @Override protected void doStore() { if(colorSelector != null) { PreferenceConverter.setValue(getPreferenceStore(), getPreferenceName(), colorSelector.getSelectedColor()); } } @Override public int getNumberOfControls() { return 1; } private void changeColors(Button button) { colorSelector = new ColorPalettePopup(colorButton.getParent().getShell(), IDialogConstants.BUTTON_BAR_HEIGHT); Rectangle r = button.getBounds(); Point location = button.getParent().toDisplay(r.x, r.y); colorSelector.open(location); if(colorSelector.getSelectedColor() == null && !colorSelector.useDefaultColor()) { return; } updateButtonImage(colorSelector.getSelectedColor()); } private void updateButtonImage(RGB rgb) { if(!colorButton.isDisposed() && colorButton.getImage() != null && !colorButton.getImage().isDisposed()) { colorButton.getImage().dispose(); Image overlyedImage = new ColorOverlayImageDescriptor(backgroundImage.getImageData(), rgb).createImage(); colorButton.setImage(overlyedImage); } } protected static class ColorOverlayImageDescriptor extends CompositeImageDescriptor { /** default color icon width */ private static final Point ICON_SIZE = new Point(16, 16); /** the basic icon */ private ImageData basicImgData; /** the color of the thin color bar */ private RGB rgb; /** * Creates a new color menu image descriptor * * @param basicImgData * The basic Image data * @param rgb * The color bar RGB value */ public ColorOverlayImageDescriptor(ImageData basicImgData, RGB rgb) { this.basicImgData = basicImgData; this.rgb = rgb; } /** * @see org.eclipse.jface.resource.CompositeImageDescriptor#drawCompositeImage(int, int) */ protected void drawCompositeImage(int width, int height) { // draw the thin color bar underneath if(rgb != null) { ImageData colorBar = new ImageData(width, height / 5, 1, new PaletteData(new RGB[]{ rgb })); drawImage(colorBar, 0, height - height / 5); } // draw the base image drawImage(basicImgData, 0, 0); } /** * @see org.eclipse.jface.resource.CompositeImageDescriptor#getSize() */ protected Point getSize() { return ICON_SIZE; } } }