package org.mindswap.swoop.renderer.entity.graph;
import com.touchgraph.graphlayout.*;
import com.touchgraph.graphlayout.interaction.DragNodeUI;
import com.touchgraph.graphlayout.interaction.LocalityScroll;
import com.touchgraph.graphlayout.interaction.TGAbstractClickUI;
import com.touchgraph.graphlayout.interaction.TGAbstractDragUI;
import com.touchgraph.graphlayout.interaction.TGUserInterface;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import org.mindswap.swoop.TermsDisplay;
/** GLNavigateUI. User interface for moving around the graph, as opposed
* to editing.
*
* @author Alexander Shapiro
* @author Murray Altheim (abstracted GLPanel to TGScrollPane interface)
* @version 1.21 $Id: GLNavigateUI.java,v 1.16 2002/04/04 06:21:06 x_ander Exp $
*/
public class GraphNavigateUI extends TGUserInterface {
GraphPanel glPanel;
TGPanel tgPanel;
GLNavigateMouseListener ml;
TGAbstractDragUI hvDragUI;
TGAbstractDragUI rotateDragUI;
//TGAbstractDragUI hvRotateDragUI;
TGAbstractClickUI hvScrollToCenterUI;
DragNodeUI dragNodeUI;
LocalityScroll localityScroll;
JPopupMenu nodePopup;
JPopupMenu edgePopup;
Node popupNode;
Edge popupEdge;
private TermsDisplay myDisplay;
public GraphNavigateUI( GraphPanel glp ) {
glPanel = glp;
tgPanel = glPanel.getTGPanel();
localityScroll = glPanel.getLocalityScroll();
hvDragUI = glPanel.getHVScroll().getHVDragUI();
rotateDragUI = glPanel.getRotateScroll().getRotateDragUI();
hvScrollToCenterUI = glPanel.getHVScroll().getHVScrollToCenterUI();
dragNodeUI = new DragNodeUI(tgPanel);
ml = new GLNavigateMouseListener();
setUpNodePopup();
setUpEdgePopup();
//myDisplay = termsDisplay;
}
public void activate() {
tgPanel.addMouseListener(ml);
}
public void deactivate() {
tgPanel.removeMouseListener(ml);
}
class GLNavigateMouseListener extends MouseAdapter {
public void mousePressed(MouseEvent e) {
Node mouseOverN = tgPanel.getMouseOverN();
if (e.getModifiers() == MouseEvent.BUTTON1_MASK) {
if (mouseOverN == null)
hvDragUI.activate(e);
else
{
dragNodeUI.activate(e);
}
}
}
public void mouseClicked(MouseEvent e) {
Node mouseOverN = tgPanel.getMouseOverN();
if (mouseOverN == null)
return;
int modifiers = e.getModifiers();
if ((modifiers & MouseEvent.BUTTON1_MASK) == MouseEvent.BUTTON1_MASK)
{
// if shift key is pressed, adjust the locale
if (( modifiers & InputEvent.SHIFT_MASK) == InputEvent.SHIFT_MASK)
{
try {
tgPanel.setLocale(mouseOverN, localityScroll.getLocalityRadius());
}
catch (TGException ex) {
System.out.println("Error changing locale");
ex.printStackTrace();
}
}
else
{
SwoopNode n = (SwoopNode)mouseOverN;
n.fireHyperLinkEvent();
}
}
}
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) {
popupNode = tgPanel.getMouseOverN();
popupEdge = tgPanel.getMouseOverE();
if (popupNode!=null) {
tgPanel.setMaintainMouseOver(true);
nodePopup.show(e.getComponent(), e.getX(), e.getY());
}
else if (popupEdge!=null) {
tgPanel.setMaintainMouseOver(true);
edgePopup.show(e.getComponent(), e.getX(), e.getY());
}
else {
glPanel.glPopup.show(e.getComponent(), e.getX(), e.getY());
}
}
}
}
private void setUpNodePopup() {
nodePopup = new JPopupMenu();
JMenuItem menuItem;
menuItem = new JMenuItem("Expand Node");
ActionListener expandAction = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(popupNode!=null) {
tgPanel.expandNode(popupNode);
}
}
};
menuItem.addActionListener(expandAction);
nodePopup.add(menuItem);
menuItem = new JMenuItem("Collapse Node");
ActionListener collapseAction = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(popupNode!=null) {
tgPanel.collapseNode(popupNode );
}
}
};
menuItem.addActionListener(collapseAction);
nodePopup.add(menuItem);
menuItem = new JMenuItem("Hide Node");
ActionListener hideAction = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(popupNode!=null) {
tgPanel.hideNode(popupNode );
}
}
};
menuItem.addActionListener(hideAction);
nodePopup.add(menuItem);
nodePopup.addPopupMenuListener(new PopupMenuListener() {
public void popupMenuCanceled(PopupMenuEvent e) {}
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
tgPanel.setMaintainMouseOver(false);
tgPanel.setMouseOverN(null);
tgPanel.repaint();
}
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {}
});
}
private void setUpEdgePopup() {
edgePopup = new JPopupMenu();
JMenuItem hideMenuItem = new JMenuItem("Hide Edge");
ActionListener hideAction = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(popupEdge!=null) {
tgPanel.hideEdge(popupEdge);
}
}
};
JMenuItem loosenMenuItem = new JMenuItem("Loosen Edge");
ActionListener loosenAction = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(popupEdge!=null) {
popupEdge.setLength( popupEdge.getLength() + 20 );
tgPanel.resetDamper();
}
}
};
JMenuItem tightenMenuItem = new JMenuItem("Tighten Edge");
ActionListener tightenAction = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(popupEdge!=null)
{
if (popupEdge.getLength() <= 20)
return;
popupEdge.setLength( popupEdge.getLength() - 20 );
tgPanel.resetDamper();
}
}
};
hideMenuItem.addActionListener( hideAction );
loosenMenuItem.addActionListener( loosenAction );
tightenMenuItem.addActionListener( tightenAction );
edgePopup.add(hideMenuItem);
edgePopup.add(loosenMenuItem);
edgePopup.add(tightenMenuItem);
edgePopup.addPopupMenuListener(new PopupMenuListener() {
public void popupMenuCanceled(PopupMenuEvent e) {}
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
tgPanel.setMaintainMouseOver(false);
tgPanel.setMouseOverE(null);
tgPanel.repaint();
}
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {}
});
}
// We need to have TermsDisplay so we can send it
// HyperlinkEvents when a node is clicked.
// In TouchGraphEntityRenderer, we always call this
// this method when a render is invoked.
public void setTermsDisplay( TermsDisplay display )
{ myDisplay = display; }
} // end com.touchgraph.graphlayout.interaction.GLNavigateUI