package figtree.webui; import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; import eu.webtoolkit.jwt.KeyboardModifier; import eu.webtoolkit.jwt.Signal1; import eu.webtoolkit.jwt.WLength; import eu.webtoolkit.jwt.WMouseEvent; import eu.webtoolkit.jwt.WPaintDevice; import eu.webtoolkit.jwt.WPaintedWidget; import eu.webtoolkit.jwt.WPainter; import eu.webtoolkit.jwt.WMouseEvent.Button; import eu.webtoolkit.jwt.utils.WebGraphics2D; import figtree.treeviewer.TreePane; import figtree.treeviewer.TreePaneSelector; import figtree.treeviewer.treelayouts.RectilinearTreeLayout; public class TreeWidget extends WPaintedWidget { private TreePane treePane; private WebGraphics2D graphics = new WebGraphics2D(new WPainter()); public TreeWidget() { treePane = new TreePane() { private static final long serialVersionUID = 1L; @Override public void repaint() { TreeWidget.this.update(); } @Override public Graphics getGraphics() { return graphics; } }; treePane.setTreeLayout(new RectilinearTreeLayout()); treePane.setSelectionColor(new Color(90, 108, 128)); final TreePaneSelector selector = new TreePaneSelector(treePane); clicked().addListener(this, new Signal1.Listener<WMouseEvent>() { @Override public void trigger(WMouseEvent event) { int dx = event.getDragDelta().x; int dy = event.getDragDelta().y; if (dx*dx + dy*dy < 4) selector.mouseClicked(convertMouseEvent(event, MouseEvent.MOUSE_CLICKED)); } }); mouseWentDown().addListener(this, new Signal1.Listener<WMouseEvent>() { @Override public void trigger(WMouseEvent event) { selector.mousePressed(convertMouseEvent(event, MouseEvent.MOUSE_PRESSED)); } }); mouseWentUp().addListener(this, new Signal1.Listener<WMouseEvent>() { @Override public void trigger(WMouseEvent event) { selector.mouseReleased(convertMouseEvent(event, MouseEvent.MOUSE_RELEASED)); } }); mouseDragged().addListener(this, new Signal1.Listener<WMouseEvent>() { @Override public void trigger(WMouseEvent event) { selector.mouseDragged(convertMouseEvent(event, MouseEvent.MOUSE_DRAGGED)); } }); } MouseEvent convertMouseEvent(WMouseEvent event, int type) { int modifiers = 0; if (event.getModifiers().contains(KeyboardModifier.AltModifier)) modifiers |= MouseEvent.ALT_DOWN_MASK; if (event.getModifiers().contains(KeyboardModifier.ShiftModifier)) modifiers |= MouseEvent.SHIFT_DOWN_MASK; if (event.getModifiers().contains(KeyboardModifier.ControlModifier)) modifiers |= MouseEvent.CTRL_DOWN_MASK; if (event.getModifiers().contains(KeyboardModifier.MetaModifier)) modifiers |= MouseEvent.META_DOWN_MASK; int button = 0; if (event.getButton() == Button.LeftButton) { modifiers |= MouseEvent.BUTTON1_DOWN_MASK; button = MouseEvent.BUTTON1; } else if (event.getButton() == Button.MiddleButton) { modifiers |= MouseEvent.BUTTON2_DOWN_MASK; button = MouseEvent.BUTTON2; } else if (event.getButton() == Button.RightButton) { modifiers |= MouseEvent.BUTTON3_DOWN_MASK; button = MouseEvent.BUTTON3; } return new MouseEvent(treePane, type, System.currentTimeMillis(), modifiers, event.getWidget().x, event.getWidget().y, 1, event.getButton() == Button.RightButton, button); } @Override public void resize(WLength width, WLength height) { super.resize(width, height); treePane.setSize((int)width.toPixels(), (int)height.toPixels()); } @Override protected void layoutSizeChanged(int width, int height) { super.layoutSizeChanged(width, height); treePane.setSize(width, height); } @Override protected void paintEvent(WPaintDevice paintDevice) { WPainter painter = new WPainter(paintDevice); WebGraphics2D graphics = new WebGraphics2D(painter); treePane.paint(graphics); } public TreePane getTreePane() { return treePane; } }