import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Iterator;
import java.util.MissingResourceException;
import java.util.Random;
import java.util.ResourceBundle;
import java.util.Vector;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Path;
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.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.ColorDialog;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Sash;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
public class GraphicsExample {
Composite parent;
GraphicsTab[] tabs;
GraphicsTab tab;
Object[] tabBackground;
boolean animate;
Listener redrawListener;
ToolBar toolBar;
Tree tabList;
Canvas canvas;
Composite controlPanel, tabPanel;
ToolItem playItem, pauseItem, backItem, dbItem;
Spinner timerSpinner;
Menu backMenu;
MenuItem customMI;
Image customImage;
Color customColor;
Vector images;
static boolean advanceGraphics, advanceGraphicsInit;
static final int TIMER = 30;
public GraphicsExample(final Composite parent) {
this.parent = parent;
redrawListener = new Listener() {
public void handleEvent(Event e) {
redraw();
}
};
GridData data;
GridLayout layout = new GridLayout(3, false);
layout.horizontalSpacing = 1;
parent.setLayout(layout);
tabs = createTabs();
images = new Vector();
createToolBar(parent);
createTabList(parent);
final Sash sash = new Sash(parent, SWT.VERTICAL);
createTabPanel(parent);
data = new GridData(SWT.FILL, SWT.CENTER, true, false);
data.horizontalSpan = 3;
toolBar.setLayoutData(data);
data = new GridData(SWT.CENTER, SWT.FILL, false, true);
data.widthHint = tabList.computeSize(SWT.DEFAULT, SWT.DEFAULT).x + 50;
tabList.setLayoutData(data);
data = new GridData(SWT.CENTER, SWT.FILL, false, true);
sash.setLayoutData(data);
data = new GridData(SWT.FILL, SWT.FILL, true, true);
tabPanel.setLayoutData(data);
sash.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
if (event.detail != SWT.DRAG) {
GridData data = (GridData) tabList.getLayoutData();
data.widthHint = event.x
- tabList.computeTrim(0, 0, 0, 0).width;
parent.layout(true);
animate = pauseItem.getEnabled();
} else {
animate = false;
}
}
});
setTab(tab);
startAnimationTimer();
}
boolean checkAdvancedGraphics() {
if (advanceGraphicsInit)
return advanceGraphics;
advanceGraphicsInit = true;
Display display = Display.getCurrent();
try {
Path path = new Path(display);
path.dispose();
} catch (SWTException e) {
Shell shell = display.getActiveShell(), newShell = null;
if (shell == null)
shell = newShell = new Shell(display);
MessageBox dialog = new MessageBox(shell, SWT.ICON_WARNING | SWT.OK);
dialog.setText("Warning"); //$NON-NLS-1$
dialog.setMessage("LibNotFound"); //$NON-NLS-1$
dialog.open();
if (newShell != null)
newShell.dispose();
return false;
}
return advanceGraphics = true;
}
void createCanvas(Composite parent) {
canvas = new Canvas(parent, SWT.NO_BACKGROUND);
canvas.addListener(SWT.Paint, new Listener() {
public void handleEvent(Event event) {
GC gc;
Rectangle rect = canvas.getClientArea();
Image buffer = null;
if (dbItem.getSelection()) {
buffer = new Image(canvas.getDisplay(), rect);
gc = new GC(buffer);
} else {
gc = event.gc;
}
paintBackground(gc, rect);
GraphicsTab tab = getTab();
if (tab != null)
tab.paint(gc, rect.width, rect.height);
if (gc != event.gc)
gc.dispose();
if (buffer != null) {
event.gc.drawImage(buffer, 0, 0);
buffer.dispose();
}
}
});
}
void createControlPanel(Composite parent) {
Group group;
controlPanel = group = new Group(parent, SWT.NONE);
group.setText(getResourceString("Settings")); //$NON-NLS-1$
controlPanel.setLayout(new RowLayout());
}
void createTabPanel(Composite parent) {
tabPanel = new Composite(parent, SWT.NONE);
GridData data;
GridLayout layout = new GridLayout(1, false);
layout.marginHeight = layout.marginWidth = 0;
tabPanel.setLayout(layout);
createCanvas(tabPanel);
createControlPanel(tabPanel);
data = new GridData(SWT.FILL, SWT.FILL, true, true);
canvas.setLayoutData(data);
data = new GridData(SWT.FILL, SWT.CENTER, true, false);
controlPanel.setLayoutData(data);
}
void createToolBar(final Composite parent) {
final Display display = parent.getDisplay();
toolBar = new ToolBar(parent, SWT.FLAT);
Listener toolBarListener = new Listener() {
public void handleEvent(Event event) {
switch (event.type) {
case SWT.Selection: {
if (event.widget == playItem) {
animate = true;
playItem.setEnabled(!animate);
pauseItem.setEnabled(animate);
} else if (event.widget == pauseItem) {
animate = false;
playItem.setEnabled(!animate);
pauseItem.setEnabled(animate);
} else if (event.widget == backItem) {
final ToolItem toolItem = (ToolItem) event.widget;
final ToolBar toolBar = toolItem.getParent();
Rectangle toolItemBounds = toolItem.getBounds();
Point point = toolBar.toDisplay(new Point(
toolItemBounds.x, toolItemBounds.y));
backMenu.setLocation(point.x, point.y
+ toolItemBounds.height);
backMenu.setVisible(true);
}
}
break;
}
}
};
playItem = new ToolItem(toolBar, SWT.PUSH);
playItem.setText(getResourceString("Play")); //$NON-NLS-1$
playItem.setImage(loadImage(display, "play.gif")); //$NON-NLS-1$
playItem.addListener(SWT.Selection, toolBarListener);
pauseItem = new ToolItem(toolBar, SWT.PUSH);
pauseItem.setText(getResourceString("Pause")); //$NON-NLS-1$
pauseItem.setImage(loadImage(display, "pause.gif")); //$NON-NLS-1$
pauseItem.addListener(SWT.Selection, toolBarListener);
backItem = new ToolItem(toolBar, SWT.PUSH);
backItem.setText(getResourceString("Background")); //$NON-NLS-1$
backItem.addListener(SWT.Selection, toolBarListener);
String[] names = new String[] { getResourceString("White"), //$NON-NLS-1$
getResourceString("Black"), //$NON-NLS-1$
getResourceString("Red"), //$NON-NLS-1$
getResourceString("Green"), //$NON-NLS-1$
getResourceString("Blue"), //$NON-NLS-1$
getResourceString("CustomColor"), //$NON-NLS-1$
};
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), null, };
backMenu = new Menu(parent);
Listener listener = new Listener() {
public void handleEvent(Event event) {
MenuItem item = (MenuItem) event.widget;
if (customMI == item) {
ColorDialog dialog = new ColorDialog(parent.getShell());
RGB rgb = dialog.open();
if (rgb == null)
return;
if (customColor != null)
customColor.dispose();
customColor = new Color(display, rgb);
if (customImage != null)
customImage.dispose();
customImage = createImage(display, customColor);
item.setData(new Object[] { customColor, customImage });
item.setImage(customImage);
}
tabBackground = (Object[]) item.getData();
backItem.setImage((Image) tabBackground[1]);
canvas.redraw();
}
};
for (int i = 0; i < names.length; i++) {
MenuItem item = new MenuItem(backMenu, SWT.NONE);
item.setText(names[i]);
item.addListener(SWT.Selection, listener);
Image image = null;
if (colors[i] != null) {
image = createImage(display, colors[i]);
images.addElement(image);
item.setImage(image);
} else {
// custom menu item
customMI = item;
}
item.setData(new Object[] { colors[i], image });
if (tabBackground == null) {
tabBackground = (Object[]) item.getData();
backItem.setImage((Image) tabBackground[1]);
}
}
dbItem = new ToolItem(toolBar, SWT.CHECK);
dbItem.setText(getResourceString("DoubleBuffer")); //$NON-NLS-1$
dbItem.setImage(loadImage(display, "db.gif")); //$NON-NLS-1$
ToolItem separator = new ToolItem(toolBar, SWT.SEPARATOR);
Composite comp = new Composite(toolBar, SWT.NONE);
GridData data;
GridLayout layout = new GridLayout(1, false);
layout.verticalSpacing = 0;
layout.marginWidth = layout.marginHeight = 3;
comp.setLayout(layout);
timerSpinner = new Spinner(comp, SWT.BORDER | SWT.WRAP);
data = new GridData(SWT.CENTER, SWT.CENTER, false, false);
timerSpinner.setLayoutData(data);
Label label = new Label(comp, SWT.NONE);
label.setText(getResourceString("Animation")); //$NON-NLS-1$
data = new GridData(SWT.CENTER, SWT.CENTER, false, false);
label.setLayoutData(data);
timerSpinner.setMaximum(1000);
timerSpinner.setSelection(TIMER);
timerSpinner.setSelection(TIMER);
separator.setControl(comp);
separator.setWidth(comp.computeSize(SWT.DEFAULT, SWT.DEFAULT).x);
}
Image createImage(Display display, Color color) {
Image image = new Image(display, 16, 16);
GC gc = new GC(image);
gc.setBackground(color);
Rectangle rect = image.getBounds();
gc.fillRectangle(rect);
if (color.equals(display.getSystemColor(SWT.COLOR_BLACK))) {
gc.setForeground(display.getSystemColor(SWT.COLOR_WHITE));
}
gc.drawRectangle(rect.x, rect.y, rect.width - 1, rect.height - 1);
gc.dispose();
return image;
}
void createTabList(Composite parent) {
tabList = new Tree(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL
| SWT.BORDER);
HashSet set = new HashSet();
for (int i = 0; i < tabs.length; i++) {
GraphicsTab tab = tabs[i];
set.add(tab.getCategory());
}
for (Iterator iter = set.iterator(); iter.hasNext();) {
String text = (String) iter.next();
TreeItem item = new TreeItem(tabList, SWT.NONE);
item.setText(text);
}
TreeItem[] items = tabList.getItems();
for (int i = 0; i < items.length; i++) {
TreeItem item = items[i];
for (int j = 0; j < tabs.length; j++) {
GraphicsTab tab = tabs[j];
if (item.getText().equals(tab.getCategory())) {
TreeItem item1 = new TreeItem(item, SWT.NONE);
item1.setText(tab.getText());
item1.setData(tab);
}
}
}
tabList.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
TreeItem item = (TreeItem) event.item;
if (item != null) {
setTab((GraphicsTab) item.getData());
}
}
});
}
GraphicsTab[] createTabs() {
return new GraphicsTab[] { new LineTab(this), new StarPolyTab(this),
tab = new IntroTab(this), new BlackHoleTab(this), };
}
/**
* Disposes all resources created by the receiver.
*/
public void dispose() {
if (tabs != null) {
for (int i = 0; i < tabs.length; i++) {
GraphicsTab tab = tabs[i];
tab.dispose();
}
}
tabs = null;
if (images != null) {
for (int i = 0; i < images.size(); i++) {
((Image) images.elementAt(i)).dispose();
}
}
images = null;
if (customColor != null)
customColor.dispose();
customColor = null;
if (customImage != null)
customImage.dispose();
customImage = null;
}
TreeItem findItemByData(TreeItem[] items, Object data) {
for (int i = 0; i < items.length; i++) {
TreeItem item = items[i];
if (item.getData() == data)
return item;
item = findItemByData(item.getItems(), data);
if (item != null)
return item;
}
return null;
}
/**
* Gets the current tab.
*/
public GraphicsTab getTab() {
return tab;
}
Listener getRedrawListener() {
return redrawListener;
}
/**
* Gets a string from the resource bundle. We don't want to crash because of
* a missing String. Returns the key if not found.
*/
static String getResourceString(String key) {
return "key";
}
static Image loadImage(Display display, Class clazz, String string) {
InputStream stream = clazz.getResourceAsStream(string);
if (stream == null)
return null;
Image image = null;
try {
image = new Image(display, stream);
} catch (SWTException ex) {
} finally {
try {
stream.close();
} catch (IOException ex) {
}
}
return image;
}
Image loadImage(Display display, String name) {
Image image = loadImage(display, GraphicsExample.class, name);
if (image != null)
images.addElement(image);
return image;
}
void paintBackground(GC gc, Rectangle rect) {
gc.setBackground((Color) tabBackground[0]);
gc.fillRectangle(rect);
}
/**
* Redraws the current tab.
*/
public void redraw() {
canvas.redraw();
}
/**
* Grabs input focus.
*/
public void setFocus() {
tabList.setFocus();
}
/**
* Sets the current tab.
*/
public void setTab(GraphicsTab tab) {
this.tab = tab;
Control[] children = controlPanel.getChildren();
for (int i = 0; i < children.length; i++) {
Control control = children[i];
control.dispose();
}
if (tab != null) {
tab.createControlPanel(controlPanel);
animate = tab.isAnimated();
}
playItem.setEnabled(!animate);
pauseItem.setEnabled(animate);
GridData data = (GridData) controlPanel.getLayoutData();
children = controlPanel.getChildren();
data.exclude = children.length == 0;
controlPanel.setVisible(!data.exclude);
if (data.exclude) {
tabPanel.layout();
} else {
tabPanel.layout(children);
}
if (tab != null) {
TreeItem[] selection = tabList.getSelection();
if (selection.length == 0 || selection[0].getData() != tab) {
TreeItem item = findItemByData(tabList.getItems(), tab);
if (item != null)
tabList.setSelection(new TreeItem[] { item });
}
}
canvas.redraw();
}
void startAnimationTimer() {
final Display display = Display.getCurrent();
display.timerExec(timerSpinner.getSelection(), new Runnable() {
public void run() {
if (canvas.isDisposed())
return;
if (animate) {
GraphicsTab tab = getTab();
if (tab != null && tab.isAnimated()) {
Rectangle rect = canvas.getClientArea();
tab.next(rect.width, rect.height);
canvas.redraw();
canvas.update();
}
}
display.timerExec(timerSpinner.getSelection(), this);
}
});
}
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setText(getResourceString("SWTGraphics")); //$NON-NLS-1$
final GraphicsExample example = new GraphicsExample(shell);
shell.addListener(SWT.Close, new Listener() {
public void handleEvent(Event event) {
example.dispose();
}
});
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
}
}
/*******************************************************************************
* Copyright (c) 2000, 2005 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
******************************************************************************/
abstract class GraphicsTab {
GraphicsExample example;
public GraphicsTab(GraphicsExample example) {
this.example = example;
}
/**
* Creates the widgets used to control the drawing.
*/
public void createControlPanel(Composite parent) {
}
/**
* Disposes resources created by the receiver.
*/
public void dispose() {
}
/**
* Answer the receiver's name.
*/
public abstract String getText();
/**
* Answer the receiver's category.
*/
public String getCategory() {
return GraphicsExample.getResourceString("Misc"); //$NON-NLS-1$
}
/**
* Answer whether the receiver is animated or not.
*/
public boolean isAnimated() {
return false;
}
/**
* Advance the animation.
*/
public void next(int width, int height) {
}
/**
* Paint the receiver into the specified GC.
*/
public void paint(GC gc, int width, int height) {
}
}
/*******************************************************************************
* Copyright (c) 2000, 2005 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
******************************************************************************/
class LineTab extends GraphicsTab {
public LineTab(GraphicsExample example) {
super(example);
}
public String getText() {
return GraphicsExample.getResourceString("Line"); //$NON-NLS-1$
}
public void paint(GC gc, int width, int height) {
gc.drawLine(0, 0, width, height);
gc.drawLine(width, 0, 0, height);
}
}
/*******************************************************************************
* Copyright (c) 2000, 2005 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
******************************************************************************/
class StarPolyTab extends GraphicsTab {
int[] radial;
static final int POINTS = 11;
Combo fillRuleCb;
public StarPolyTab(GraphicsExample example) {
super(example);
radial = new int[POINTS * 2];
}
public void createControlPanel(Composite parent) {
new Label(parent, SWT.NONE).setText(GraphicsExample
.getResourceString("FillRule")); //$NON-NLS-1$
fillRuleCb = new Combo(parent, SWT.DROP_DOWN);
fillRuleCb.add("FILL_EVEN_ODD");
fillRuleCb.add("FILL_WINDING");
fillRuleCb.select(0);
fillRuleCb.addListener(SWT.Selection, example.getRedrawListener());
}
public String getCategory() {
return GraphicsExample.getResourceString("Polygons"); //$NON-NLS-1$
}
public String getText() {
return GraphicsExample.getResourceString("StarPolygon"); //$NON-NLS-1$
}
public void paint(GC gc, int width, int height) {
int centerX = width / 2;
int centerY = height / 2;
int pos = 0;
for (int i = 0; i < POINTS; ++i) {
double r = Math.PI * 2 * pos / POINTS;
radial[i * 2] = (int) ((1 + Math.cos(r)) * centerX);
radial[i * 2 + 1] = (int) ((1 + Math.sin(r)) * centerY);
pos = (pos + POINTS / 2) % POINTS;
}
Display display = Display.getCurrent();
gc.setFillRule(fillRuleCb.getSelectionIndex() != 0 ? SWT.FILL_WINDING
: SWT.FILL_EVEN_ODD);
gc.setBackground(display.getSystemColor(SWT.COLOR_WHITE));
gc.fillPolygon(radial);
gc.drawPolygon(radial);
}
}
/*******************************************************************************
* Copyright (c) 2000, 2005 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
******************************************************************************/
class BlackHoleTab extends GraphicsTab {
int size = 1;
public BlackHoleTab(GraphicsExample example) {
super(example);
}
public String getText() {
return GraphicsExample.getResourceString("BlackHole"); //$NON-NLS-1$
}
public boolean isAnimated() {
return true;
}
public void next(int width, int height) {
if (size > width * 3 / 2)
size = 0;
else
size += 10;
}
public void paint(GC gc, int width, int height) {
Display display = Display.getCurrent();
gc.setBackground(display.getSystemColor(SWT.COLOR_BLACK));
gc.fillOval((width - size) / 2, (height - size) / 2, size, size);
}
}
/*******************************************************************************
* Copyright (c) 2000, 2005 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
******************************************************************************/
class IntroTab extends GraphicsTab {
Font font;
Image image;
Random random = new Random();
float x, y;
float incX = 10.0f;
float incY = 5.0f;
int textWidth, textHeight;
String text = "SWT";
public IntroTab(GraphicsExample example) {
super(example);
}
public void dispose() {
if (image != null)
image.dispose();
image = null;
if (font != null)
font.dispose();
font = null;
}
public String getCategory() {
return GraphicsExample.getResourceString("Introduction"); //$NON-NLS-1$
}
public String getText() {
return GraphicsExample.getResourceString("SWT"); //$NON-NLS-1$
}
public boolean isAnimated() {
return true;
}
public void next(int width, int height) {
x += incX;
y += incY;
float random = (float) Math.random();
if (x + textWidth > width) {
x = width - textWidth;
incX = random * -width / 16 - 1;
}
if (x < 0) {
x = 0;
incX = random * width / 16 + 1;
}
if (y + textHeight > height) {
y = (height - textHeight) - 2;
incY = random * -height / 16 - 1;
}
if (y < 0) {
y = 0;
incY = random * height / 16 + 1;
}
}
public void paint(GC gc, int width, int height) {
if (!example.checkAdvancedGraphics())
return;
Display display = Display.getCurrent();
if (image == null) {
image = example.loadImage(Display.getCurrent(), "irmaos.jpg");
Rectangle rect = image.getBounds();
FontData fd = display.getSystemFont().getFontData()[0];
font = new Font(display, fd.getName(), rect.height / 4, SWT.BOLD);
gc.setFont(font);
Point size = gc.stringExtent(text);
textWidth = size.x;
textHeight = size.y;
}
Path path = new Path(display);
path.addString(text, x, y, font);
gc.setClipping(path);
Rectangle rect = image.getBounds();
gc.drawImage(image, 0, 0, rect.width, rect.height, 0, 0, width, height);
gc.setClipping((Rectangle) null);
gc.setForeground(display.getSystemColor(SWT.COLOR_BLUE));
gc.drawPath(path);
}
}
|