| /******************************************************************************* |
| * Copyright (c) 2006 IBM Corporation 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: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.swt.examples.graphics; |
| |
| import java.util.*; |
| |
| import org.eclipse.swt.*; |
| import org.eclipse.swt.graphics.*; |
| import org.eclipse.swt.widgets.*; |
| |
| /** |
| * This class utilizes the factory design pattern to create menus that may |
| * contain color items, pattern items and gradient items. To create a menu: |
| * first set the menu items that you wish to have appear in the menu by calling |
| * the setters (setColorItems(), setPatternItems(), setGradientItems()), and |
| * then call createMenu() to get an instance of a menu. By default, the menu |
| * will contain color items. |
| */ |
| public class ColorMenu { |
| |
| boolean enableColorItems, enablePatternItems, enableGradientItems; |
| |
| public ColorMenu() { |
| enableColorItems = true; |
| } |
| |
| /** |
| * Method used to specify whether or not the color menu items will appear in |
| * the menu. |
| * |
| * @param enable |
| * A boolean flag - true to make the color menu items visible in |
| * the menu; false otherwise. |
| */ |
| public void setColorItems(boolean enable) { |
| enableColorItems = enable; |
| } |
| |
| /** |
| * @return true if color menu items are contained in the menu; false otherwise. |
| * */ |
| public boolean getColorItems() { |
| return enableColorItems; |
| } |
| |
| /** |
| * Method used to specify whether or not the pattern menu items will appear |
| * in the menu. |
| * |
| * @param enable |
| * A boolean flag - true to make the pattern menu items visible |
| * in the menu; false otherwise. |
| */ |
| public void setPatternItems(boolean enable) { |
| enablePatternItems = enable; |
| } |
| |
| /** |
| * @return true if pattern menu items are contained in the menu; false otherwise. |
| * */ |
| public boolean getPatternItems() { |
| return enablePatternItems; |
| } |
| |
| /** |
| * Method used to specify whether or not the gradient menu items will appear |
| * in the menu. |
| * |
| * @param enable |
| * A boolean flag - true to make the gradient menu items visible |
| * in the menu; false otherwise. |
| */ |
| public void setGradientItems(boolean enable) { |
| enableGradientItems = enable; |
| } |
| |
| /** |
| * @return true if gradient menu items are contained in the menu; false otherwise. |
| */ |
| public boolean getGradientItems() { |
| return enableGradientItems; |
| } |
| |
| /** |
| * Creates and returns the menu based on the settings provided via |
| * setColorItems(), setPatternItems() and setGradientItems() |
| * |
| * @return A menu based on the settings |
| */ |
| public Menu createMenu(Control parent, ColorListener cl) { |
| Menu menu = new Menu(parent); |
| |
| MenuItemListener menuItemListener = createMenuItemListener(parent); |
| menu.addListener(SWT.Selection, menuItemListener); |
| menu.addListener(SWT.Dispose, menuItemListener); |
| menuItemListener.setColorListener(cl); |
| |
| if (enableColorItems) { |
| addColorItems(menu, menuItemListener, menuItemListener.getMenuResources()); |
| } |
| if (enablePatternItems) { |
| addPatternItems(menu, menuItemListener, menuItemListener.getMenuResources()); |
| } |
| if (enableGradientItems) { |
| addGradientItems(menu, menuItemListener); |
| } |
| return menu; |
| } |
| |
| /** Adds the colors items to the menu. */ |
| private void addColorItems(Menu menu, MenuItemListener menuListener, |
| ArrayList menuResources) { |
| Display display = menu.getDisplay(); |
| |
| if (menu.getItemCount() != 0) { |
| new MenuItem(menu, SWT.SEPARATOR); |
| } |
| |
| // color names |
| String[] names = new String[]{ |
| GraphicsExample.getResourceString("White"), //$NON-NLS-1$ |
| GraphicsExample.getResourceString("Black"), //$NON-NLS-1$ |
| GraphicsExample.getResourceString("Red"), //$NON-NLS-1$ |
| GraphicsExample.getResourceString("Green"), //$NON-NLS-1$ |
| GraphicsExample.getResourceString("Blue"), //$NON-NLS-1$ |
| GraphicsExample.getResourceString("Yellow"), //$NON-NLS-1$ |
| GraphicsExample.getResourceString("Cyan"), //$NON-NLS-1$ |
| }; |
| |
| // colors needed for the background menu |
| Color[] colors = new Color[]{ |
| display.getSystemColor(SWT.COLOR_WHITE), |
| display.getSystemColor(SWT.COLOR_BLACK), |
| display.getSystemColor(SWT.COLOR_RED), |
| display.getSystemColor(SWT.COLOR_GREEN), |
| display.getSystemColor(SWT.COLOR_BLUE), |
| display.getSystemColor(SWT.COLOR_YELLOW), |
| display.getSystemColor(SWT.COLOR_CYAN), |
| }; |
| |
| // add standard color items to menu |
| for (int i = 0; i < names.length; i++) { |
| MenuItem item = new MenuItem(menu, SWT.NONE); |
| item.setText(names[i]); |
| item.addListener(SWT.Selection, menuListener); |
| Color color = colors[i]; |
| GraphicsBackground gb = new GraphicsBackground(); |
| Image image = GraphicsExample.createImage(display, color); |
| gb.setBgColor1(color); |
| gb.setBgImage(image); |
| gb.setThumbNail(image); |
| menuResources.add(image); |
| item.setImage(image); |
| item.setData(gb); |
| } |
| |
| // add custom color item to menu |
| menuListener.customColorMI = new MenuItem(menu, SWT.NONE); |
| menuListener.customColorMI.setText(GraphicsExample.getResourceString("CustomColor")); //$NON-NLS-1$ |
| menuListener.customColorMI.addListener(SWT.Selection, menuListener); |
| GraphicsBackground gb = new GraphicsBackground(); |
| menuListener.customColorMI.setData(gb); |
| } |
| |
| /** Adds the pattern items to the menu. */ |
| private void addPatternItems(Menu menu, MenuItemListener menuListener, |
| ArrayList menuResources) { |
| Display display = menu.getDisplay(); |
| |
| if (menu.getItemCount() != 0) { |
| new MenuItem(menu, SWT.SEPARATOR); |
| } |
| |
| // pattern names |
| String[] names = new String[]{ |
| GraphicsExample.getResourceString("Pattern1"), //$NON-NLS-1$ |
| GraphicsExample.getResourceString("Pattern2"), //$NON-NLS-1$ |
| GraphicsExample.getResourceString("Pattern3"), //$NON-NLS-1$ |
| }; |
| |
| // pattern images |
| Image[] images = new Image[]{ |
| loadImage(display, "pattern1.jpg", menuResources), |
| loadImage(display, "pattern2.jpg", menuResources), |
| loadImage(display, "pattern3.jpg", menuResources), |
| }; |
| |
| // add the pre-defined patterns to the menu |
| for (int i = 0; i < names.length; i++) { |
| MenuItem item = new MenuItem(menu, SWT.NONE); |
| item.setText(names[i]); |
| item.addListener(SWT.Selection, menuListener); |
| Image image = images[i]; |
| GraphicsBackground gb = new GraphicsBackground(); |
| gb.setBgImage(image); |
| gb.setThumbNail(image); |
| item.setImage(image); |
| item.setData(gb); |
| } |
| |
| // add the custom pattern item |
| menuListener.customPatternMI = new MenuItem(menu, SWT.NONE); |
| menuListener.customPatternMI.setText(GraphicsExample.getResourceString("CustomPattern")); //$NON-NLS-1$ |
| menuListener.customPatternMI.addListener(SWT.Selection, menuListener); |
| GraphicsBackground gb = new GraphicsBackground(); |
| menuListener.customPatternMI.setData(gb); |
| } |
| |
| /** Adds the gradient menu item. */ |
| private void addGradientItems(Menu menu, MenuItemListener menuListener) { |
| if (menu.getItemCount() != 0) { |
| new MenuItem(menu, SWT.SEPARATOR); |
| } |
| menuListener.customGradientMI = new MenuItem(menu, SWT.NONE); |
| menuListener.customGradientMI.setText(GraphicsExample.getResourceString("Gradient")); //$NON-NLS-1$ |
| menuListener.customGradientMI.addListener(SWT.Selection, menuListener); |
| GraphicsBackground gb = new GraphicsBackground(); |
| menuListener.customGradientMI.setData(gb); |
| } |
| |
| /** Creates and returns the listener for menu items. */ |
| private MenuItemListener createMenuItemListener(final Control parent) { |
| return new MenuItemListener(parent); |
| } |
| |
| /** |
| * Creates and returns an instance of Image using on the path of an image. |
| * |
| * @param display |
| * A Display |
| * @param name |
| * The path of the image file |
| * @param resources |
| * The list of resources of the menu |
| */ |
| private Image loadImage(Display display, String name, ArrayList resources) { |
| Image image = GraphicsExample.loadImage(display, GraphicsExample.class, name); |
| if (image != null) resources.add(image); |
| return image; |
| } |
| |
| /** |
| * An inner class used as a listener for MenuItems added to the menu. |
| */ |
| static class MenuItemListener implements Listener { |
| MenuItem customColorMI, customPatternMI, customGradientMI; // custom menu items |
| Control parent; |
| Image customImage, customImageThumb; |
| Color customColor; |
| GraphicsBackground background; // used to store information about the background |
| ColorListener colorListener; |
| ArrayList resources; |
| |
| public MenuItemListener(Control parent){ |
| this.parent = parent; |
| resources = new ArrayList(); |
| } |
| /** |
| * Method used to set the ColorListener |
| * |
| * @param cl |
| * A ColorListener |
| * @see org.eclipse.swt.examples.graphics.ColorListener.java |
| */ |
| public void setColorListener(ColorListener cl) { |
| this.colorListener = cl; |
| } |
| |
| public ArrayList getMenuResources() { |
| return resources; |
| } |
| |
| public void handleEvent(Event event) { |
| switch (event.type) { |
| |
| case SWT.Dispose: |
| for (int i = 0; i < resources.size(); i++) { |
| ((Resource) resources.get(i)).dispose(); |
| } |
| resources = new ArrayList(); |
| break; |
| case SWT.Selection: |
| Display display = event.display; |
| MenuItem item = (MenuItem) event.widget; |
| if (customColorMI == item) { |
| ColorDialog dialog = new ColorDialog(parent.getShell()); |
| if (customColor != null && !customColor.isDisposed()) { |
| dialog.setRGB(customColor.getRGB()); |
| } |
| RGB rgb = dialog.open(); |
| if (rgb == null) return; |
| if (customColor != null) customColor.dispose(); |
| customColor = new Color(display, rgb); |
| if (customPatternMI != null) customPatternMI.setImage(null); |
| if (customGradientMI != null) customGradientMI.setImage(null); |
| if (customImage != null) customImage.dispose(); |
| customImage = GraphicsExample.createImage(display, customColor); |
| GraphicsBackground gb = new GraphicsBackground(); |
| gb.setBgImage(customImage); |
| gb.setThumbNail(customImage); |
| gb.setBgColor1(customColor); |
| item.setData(gb); |
| item.setImage(customImage); |
| resources.add(customColor); |
| resources.add(customImage); |
| } else if (customPatternMI == item) { |
| FileDialog dialog = new FileDialog(parent.getShell()); |
| dialog.setFilterExtensions(new String[] { "*.jpg", "*.gif", "*.*" }); |
| String name = dialog.open(); |
| if (name == null) return; |
| if (customColorMI != null) customColorMI.setImage(null); |
| if (customGradientMI != null) customGradientMI.setImage(null); |
| if (customColor != null) customColor.dispose(); |
| if (customImage != null) customImage.dispose(); |
| if (customImageThumb != null) customImageThumb.dispose(); |
| customImage = new Image(display, name); |
| customImageThumb = GraphicsExample.createThumbnail(display, name); |
| GraphicsBackground gb = new GraphicsBackground(); |
| gb.setBgImage(customImage); |
| gb.setThumbNail(customImageThumb); |
| item.setData(gb); |
| item.setImage(customImageThumb); |
| resources.add(customImageThumb); |
| } else if (customGradientMI == item) { |
| GradientDialog dialog = new GradientDialog(parent.getShell()); |
| if (background != null) { |
| if (background.getBgColor1() != null) |
| dialog.setFirstRGB(background.getBgColor1().getRGB()); |
| if (background.getBgColor2() != null) |
| dialog.setSecondRGB(background.getBgColor2().getRGB()); |
| } |
| if (dialog.open() != SWT.OK) return; |
| Color colorA = new Color(display, dialog.getFirstRGB()); |
| Color colorB = new Color(display, dialog.getSecondRGB()); |
| if (colorA == null || colorB == null) return; |
| if (customColorMI != null) customColorMI.setImage(null); |
| if (customPatternMI != null) customPatternMI.setImage(null); |
| if (customColor != null) customColor.dispose(); |
| if (customImage != null) customImage.dispose(); |
| customImage = GraphicsExample.createImage(display, colorA, |
| colorB, 16, 16); |
| GraphicsBackground gb = new GraphicsBackground(); |
| gb.setBgImage(customImage); |
| gb.setThumbNail(customImage); |
| gb.setBgColor1(colorA); |
| gb.setBgColor2(colorB); |
| item.setData(gb); |
| item.setImage(customImage); |
| resources.add(colorA); |
| resources.add(colorB); |
| resources.add(customImage); |
| } else { |
| if (customColorMI != null) customColorMI.setImage(null); |
| if (customPatternMI != null) customPatternMI.setImage(null); |
| if (customGradientMI != null) customGradientMI.setImage(null); |
| } |
| background = (GraphicsBackground) item.getData(); |
| colorListener.setColor(background); |
| break; |
| } |
| } |
| } |
| } |