Log.debug(LOG, "Mouse selected call ", selectedCall);
	private void addListeners()	{		addKeyListener(new KeyAdapter()			{				public void keyPressed(KeyEvent e)				{					boolean processedChar = true;					boolean processedCode = true;					beginUpdate();					try					{						// System.out.println(e);						switch ( e.getKeyChar() )						{						case '+':							model.addLevel();							break;						case '-':							model.removeLevel();							break;						case 'r':							model.getRootRenderState().setRenderCall(model.getCallGraph());							break;						case 'p':							model.getRootRenderState().setRenderCallToParent();							break;						default:							processedChar = false;						}						switch ( e.getKeyCode() )						{						case KeyEvent.VK_UP:								model.shiftVertical(true);							break;						case KeyEvent.VK_DOWN:							model.shiftVertical(false);							break;						case KeyEvent.VK_RIGHT:							model.shiftHorizontal(true);							break;						case KeyEvent.VK_LEFT:							model.shiftHorizontal(false);							break;						default:							processedCode = false;						}					}					finally					{						endUpdate();						if ( !processedCode && !processedChar )						{							propagateKeyEvent(e);						}					}				}			});				addMouseListener(new MouseAdapter()			{				public void mouseClicked(MouseEvent e)				{					beginUpdate();					try					{						// System.out.println(e);						if ( e.getModifiers() == MouseEvent.BUTTON1_MASK )						{							Call selectedCall = pick(e.getPoint());							model.setMouseOverCall(selectedCall);							model.setSelectedCall(selectedCall);							if ( selectedCall != null && e.getClickCount() == 2 )							{								model.getRootRenderState().setRenderCall(selectedCall);							}						}					}					finally					{												endUpdate();					}				}				public void mousePressed(MouseEvent e)				{					// System.out.println(e);					if ( e.getClickCount() == 1 && e.getModifiers() == MouseEvent.BUTTON1_MASK )					{						mouseClickPoint = e.getPoint();						mouseClickLocation = (EyeLocation)model.getEye().clone();						renderMode = BlockRenderer.RENDER_WIREFRAME;					}				}				public void mouseReleased(MouseEvent e)				{					renderMode = BlockRenderer.RENDER_SOLID;					mouseClickPoint = null;					BlockDiagramView.this.repaint();				}			});		addMouseMotionListener(new MouseMotionAdapter()			{				public void mouseMoved(MouseEvent e)				{					try					{						beginUpdate();												Call mouseOverCall = pick(e.getPoint());						model.setMouseOverCall(mouseOverCall);					}					finally					{						endUpdate();					}				}				public void mouseDragged(MouseEvent e)				{					beginUpdate();					// System.out.println(e);					if ( mouseClickPoint != null )					{						Point dragToPoint = e.getPoint();						int dx = dragToPoint.x - mouseClickPoint.x;						int dy = dragToPoint.y - mouseClickPoint.y;						double width = getSize().getWidth();						double height = getSize().getHeight();						double xFraction = -dx / width / 2 / DRAG_ROTATE_FACTOR;						double yFraction = dy / height / 2 / DRAG_ROTATE_FACTOR;						model.moveEye(xFraction, yFraction);					}					endUpdate();				}			});	}