blob: af8a685590b9b50ad458c3f4948d2c3102a4c896 [file] [log] [blame]
/*******************************************************************************
* 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.layout.*;
import org.eclipse.swt.widgets.*;
/**
* This dialog is used for prompting the user to select two colors for the
* creation of a gradient.
*/
public class GradientDialog extends Dialog {
Canvas canvas;
Button colorButton1, colorButton2; // color buttons
Button okButton, cancelButton;
Menu menu1, menu2;
RGB rgb1, rgb2; // first and second color used in gradient
int returnVal; // value to be returned by open(), set to SWT.OK
// if the ok button has been pressed
ArrayList resources;
public GradientDialog(Shell parent) {
this (parent, SWT.PRIMARY_MODAL);
}
public GradientDialog(Shell parent, int style) {
super(parent, style);
rgb1 = rgb2 = null;
returnVal = SWT.CANCEL;
resources = new ArrayList();
}
/**
* Sets up the dialog and opens it.
* */
public int open() {
final Shell dialog = new Shell(getParent(), SWT.DIALOG_TRIM | SWT.RESIZE | getStyle());
dialog.setText(GraphicsExample.getResourceString("Gradient")); //$NON-NLS-1$
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 2;
gridLayout.marginHeight = 10;
gridLayout.marginWidth = 10;
dialog.setLayout(gridLayout);
// create the controls in the dialog
createDialogControls(dialog);
dialog.addListener(SWT.Close, new Listener() {
public void handleEvent(Event event) {
for (int i = 0; i < resources.size(); i++) {
Object obj = resources.get(i);
if (obj != null && obj instanceof Resource) {
((Resource) obj).dispose();
}
}
dialog.dispose();
}
});
dialog.setDefaultButton (okButton);
dialog.pack ();
Rectangle rect = getParent().getMonitor().getBounds();
Rectangle bounds = dialog.getBounds();
dialog.setLocation(rect.x + (rect.width - bounds.width) / 2, rect.y + (rect.height - bounds.height) / 2);
dialog.setMinimumSize(bounds.width, bounds.height);
dialog.open ();
Display display = getParent().getDisplay();
while (!dialog.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
if (menu1 != null) {
menu1.dispose();
menu1 = null;
}
if (menu2 != null) {
menu2.dispose();
menu2 = null;
}
return returnVal;
}
/**
* Creates the controls of the dialog.
* */
public void createDialogControls(final Shell parent) {
final Display display = parent.getDisplay();
// message
Label message = new Label(parent, SWT.NONE);
message.setText(GraphicsExample.getResourceString("GradientDlgMsg"));
GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gridData.horizontalSpan = 2;
message.setLayoutData(gridData);
// default colors are white and black
if (rgb1 == null || rgb2 == null) {
rgb1 = display.getSystemColor(SWT.COLOR_WHITE).getRGB();
rgb2 = display.getSystemColor(SWT.COLOR_BLACK).getRGB();
}
// canvas
canvas = new Canvas(parent, SWT.NONE);
gridData = new GridData(GridData.FILL_BOTH);
gridData.widthHint = 200;
gridData.heightHint = 100;
canvas.setLayoutData(gridData);
canvas.addListener (SWT.Paint, new Listener () {
public void handleEvent (Event e) {
Image preview = null;
Point size = canvas.getSize();
Color color1 = new Color(display, rgb1);
Color color2 = new Color(display, rgb2);
preview = GraphicsExample.createImage(display, color1, color2, size.x, size.y);
if (preview != null) {
e.gc.drawImage (preview, 0, 0);
}
preview.dispose();
color1.dispose();
color2.dispose();
}
});
// composite used for both color buttons
Composite colorButtonComp = new Composite(parent, SWT.NONE);
// layout buttons
RowLayout layout = new RowLayout();;
layout.type = SWT.VERTICAL;
layout.pack = false;
colorButtonComp.setLayout(layout);
// position composite
gridData = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
colorButtonComp.setLayoutData(gridData);
ColorMenu colorMenu = new ColorMenu();
// color controls: first color
colorButton1 = new Button(colorButtonComp, SWT.PUSH);
colorButton1.setText(GraphicsExample.getResourceString("GradientDlgButton1"));
Color color1 = new Color(display, rgb1);
Image img1 = GraphicsExample.createImage(display, color1);
color1.dispose();
colorButton1.setImage(img1);
resources.add(img1);
menu1 = colorMenu.createMenu(parent.getParent(), new ColorListener() {
public void setColor(GraphicsBackground gb) {
rgb1 = gb.getBgColor1().getRGB();
colorButton1.setImage(gb.getThumbNail());
if (canvas != null) canvas.redraw();
}
});
colorButton1.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
final Button button = (Button) event.widget;
final Composite parent = button.getParent();
Rectangle bounds = button.getBounds();
Point point = parent.toDisplay(new Point(bounds.x, bounds.y));
menu1.setLocation(point.x, point.y + bounds.height);
menu1.setVisible(true);
}
});
// color controls: second color
colorButton2 = new Button(colorButtonComp, SWT.PUSH);
colorButton2.setText(GraphicsExample.getResourceString("GradientDlgButton2"));
Color color2 = new Color(display, rgb2);
Image img2 = GraphicsExample.createImage(display, color2);
color2.dispose();
colorButton2.setImage(img2);
resources.add(img2);
menu2 = colorMenu.createMenu(parent.getParent(), new ColorListener() {
public void setColor(GraphicsBackground gb) {
rgb2 = gb.getBgColor1().getRGB();
colorButton2.setImage(gb.getThumbNail());
if (canvas != null) canvas.redraw();
}
});
colorButton2.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
final Button button = (Button) event.widget;
final Composite parent = button.getParent();
Rectangle bounds = button.getBounds();
Point point = parent.toDisplay(new Point(bounds.x, bounds.y));
menu2.setLocation(point.x, point.y + bounds.height);
menu2.setVisible(true);
}
});
// composite used for ok and cancel buttons
Composite okCancelComp = new Composite(parent, SWT.NONE);
// layout buttons
RowLayout rowLayout = new RowLayout();
rowLayout.pack = false;
rowLayout.marginTop = 5;
okCancelComp.setLayout(rowLayout);
// position composite
gridData = new GridData(GridData.HORIZONTAL_ALIGN_END);
gridData.horizontalSpan = 2;
okCancelComp.setLayoutData(gridData);
// OK button
okButton = new Button (okCancelComp, SWT.PUSH);
okButton.setText("&OK");
okButton.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
returnVal = SWT.OK;
parent.close();
}
});
// cancel button
cancelButton = new Button (okCancelComp, SWT.PUSH);
cancelButton.setText("&Cancel");
cancelButton.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
parent.close();
}
});
}
/**
* Returns the first RGB selected by the user.
* */
public RGB getFirstRGB() {
return rgb1;
}
/**
* Sets the first RGB.
* @param rgb
*/
public void setFirstRGB(RGB rgb) {
this.rgb1 = rgb;
}
/**
* Returns the second RGB selected by the user.
* */
public RGB getSecondRGB() {
return rgb2;
}
/**
* Sets the second RGB.
* @param rgb
*/
public void setSecondRGB(RGB rgb) {
this.rgb2 = rgb;
}
}