package org.feature.multi.perspective.model.editor.editors.snippets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.zest.core.widgets.Graph;
import org.eclipse.zest.core.widgets.GraphConnection;
import org.eclipse.zest.core.widgets.GraphItem;
import org.eclipse.zest.core.widgets.GraphNode;
import org.eclipse.zest.core.widgets.ZestStyles;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Region;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
/**
* This snippet shows how you can add a paint listener to a Zest graph to paint on top of
* the widget. This snippet allows you to type and it selects all the nodes that match
* what you type.
*
* @author Ian Bull
*
*/
public class GraphSnippet5 {
public static final int BACKSPACE = 8;
public static final int ENTER = 13;
/**
* @param args
*/
public static void main(String[] args) {
final Map figureListing = new HashMap();
final StringBuffer stringBuffer = new StringBuffer();
final Display d = new Display();
FontData fontData = d.getSystemFont().getFontData()[0];
fontData.height = 42;
final Font font = new Font(d, fontData);
Shell shell = new Shell(d);
shell.setText("Graph Snippet 5");
Image image1 = Display.getDefault().getSystemImage(SWT.ICON_INFORMATION);
Image image2 = Display.getDefault().getSystemImage(SWT.ICON_WARNING);
Image image3 = Display.getDefault().getSystemImage(SWT.ICON_ERROR);
shell.setLayout(new FillLayout());
shell.setSize(400, 400);
final Graph g = new Graph(shell, SWT.NONE);
g.setConnectionStyle(ZestStyles.CONNECTIONS_DIRECTED);
GraphNode n1 = new GraphNode(g, SWT.NONE, "org.eclipse.Information", image1);
GraphNode n2 = new GraphNode(g, SWT.NONE, "org.eclipse.Warning", image2);
GraphNode n3 = new GraphNode(g, SWT.NONE, "org.eclipse.Error", image3);
figureListing.put(n1.getText().toLowerCase(), n1);
figureListing.put(n2.getText().toLowerCase(), n2);
figureListing.put(n3.getText().toLowerCase(), n3);
new GraphConnection(g, SWT.NONE, n1, n2);
new GraphConnection(g, SWT.NONE, n2, n3);
n1.setLocation(10, 10);
n2.setLocation(200, 10);
n3.setLocation(200, 200);
g.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
boolean complete = false;
if (e.keyCode == BACKSPACE) {
if (stringBuffer.length() > 0) {
stringBuffer.deleteCharAt(stringBuffer.length() - 1);
}
} else if (e.keyCode == ENTER) {
complete = true;
} else if ((e.character >= 'a' && e.character <= 'z') || (e.character >= 'A' && e.character <= 'Z') || (e.character == '.') || (e.character >= '0' && e.character <= '9')) {
stringBuffer.append(e.character);
}
Iterator iterator = figureListing.keySet().iterator();
List list = new ArrayList();
if (stringBuffer.length() > 0) {
while (iterator.hasNext()) {
String string = (String) iterator.next();
if (string.indexOf(stringBuffer.toString().toLowerCase()) >= 0) {
list.add(figureListing.get(string));
}
}
}
g.setSelection((GraphItem[]) list.toArray(new GraphItem[list.size()]));
if (complete && stringBuffer.length() > 0) {
stringBuffer.delete(0, stringBuffer.length());
}
g.redraw();
}
});
g.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
e.gc.setFont(font);
e.gc.setClipping((Region) null);
e.gc.setForeground(ColorConstants.black);
e.gc.drawText(stringBuffer.toString(), 50, 50, true);
}
});
shell.open();
while (!shell.isDisposed()) {
while (!d.readAndDispatch()) {
d.sleep();
}
}
image1.dispose();
image2.dispose();
image3.dispose();
font.dispose();
}
}