View Javadoc

1   /*
2    * Copyright (c) 2003, the JUNG Project and the Regents of the University of
3    * California All rights reserved.
4    * 
5    * This software is open-source under the BSD license; see either "license.txt"
6    * or http://jung.sourceforge.net/license.txt for a description.
7    */
8   package edu.uci.ics.jung.visualization3d;
9   
10  /**
11   */
12  
13  import java.awt.event.MouseEvent;
14  
15  import javax.media.j3d.Bounds;
16  import javax.media.j3d.BranchGroup;
17  import javax.media.j3d.Canvas3D;
18  import javax.media.j3d.TransformGroup;
19  import javax.swing.event.ChangeListener;
20  
21  import com.sun.j3d.utils.picking.PickResult;
22  import com.sun.j3d.utils.picking.PickTool;
23  import com.sun.j3d.utils.picking.behaviors.PickTranslateBehavior;
24  
25  import edu.uci.ics.jung.visualization.picking.PickedState;
26  import edu.uci.ics.jung.visualization.util.ChangeEventSupport;
27  import edu.uci.ics.jung.visualization.util.DefaultChangeEventSupport;
28  
29  /**
30   * 
31   * @author Tom Nelson - tomnelson@dev.java.net
32   *
33   */
34  public class PickVertexBehavior<V,E> extends PickTranslateBehavior implements ChangeEventSupport {
35  
36  	Bounds bounds;
37  	BranchGroup root;
38  	ChangeEventSupport support = new DefaultChangeEventSupport(this);
39  	PickedState<V> pickedState;
40  
41  	public PickVertexBehavior(BranchGroup root, Canvas3D canvas, Bounds bounds, PickedState<V> pickedState){
42  		super(root, canvas, bounds);
43  		this.setSchedulingBounds(bounds);
44  		this.bounds = bounds;
45  		this.root = root;
46  		this.pickedState = pickedState;
47  		pickCanvas.setMode(PickTool.GEOMETRY);
48  	}
49  
50  	public void updateScene(int xpos, int ypos){
51  		
52  		if(mevent.getButton() == MouseEvent.BUTTON1) {  // ButtonOne
53  			int buttonOne = MouseEvent.BUTTON1_MASK;
54  			int shiftButtonOne = MouseEvent.BUTTON1_MASK | MouseEvent.SHIFT_MASK;
55  			int modifiers = mevent.getModifiers();
56  			if(modifiers == buttonOne) {
57  				// clear previous picked stuff
58  				pickedState.clear();
59  				doPick(xpos, ypos);
60  			} else if(modifiers == shiftButtonOne) {
61  				doPick(xpos, ypos);
62  			}
63  		}
64  	}
65  	
66  	private void doPick(int xpos, int ypos) {
67  		pickCanvas.setShapeLocation(xpos, ypos);
68  		PickResult result = pickCanvas.pickClosest();
69  		if(result != null) {
70  
71  			TransformGroup tg = (TransformGroup)result.getNode(PickResult.TRANSFORM_GROUP);
72  			if(tg instanceof VertexGroup) {
73  
74  				System.err.println("picked "+tg);
75  				pickedState.pick(((VertexGroup<V>)tg).vertex, true);
76  				fireStateChanged();
77  			}
78  		}
79  	}
80  
81  	public void addChangeListener(ChangeListener l) {
82  		support.addChangeListener(l);
83  
84  	}
85  
86  	public void fireStateChanged() {
87  		support.fireStateChanged();
88  
89  	}
90  
91  	public ChangeListener[] getChangeListeners() {
92  		return support.getChangeListeners();
93  	}
94  
95  	public void removeChangeListener(ChangeListener l) {
96  		support.removeChangeListener(l);
97  	}
98  }
99