Package org.rssowl.ui.internal.util

Source Code of org.rssowl.ui.internal.util.ColorPicker

/*   **********************************************************************  **
**   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);
  }
}
TOP

Related Classes of org.rssowl.ui.internal.util.ColorPicker

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.