Package net.wigis.graph.ui

Source Code of net.wigis.graph.ui.WiGiGUI$LabelAndValue

/******************************************************************************************************
* Copyright (c) 2010, University of California, Santa Barbara
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
*    * Redistributions of source code must retain the above copyright notice, this list of
*      conditions and the following disclaimer.
*    * Redistributions in binary form must reproduce the above copyright notice, this list of
*      conditions and the following disclaimer in the documentation and/or other materials
*      provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*****************************************************************************************************/

package net.wigis.graph.ui;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.faces.model.SelectItem;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLJPanel;
import javax.swing.JComboBox;
import javax.swing.JFrame;

import net.wigis.graph.GraphsBean;
import net.wigis.graph.GraphsPathFilter;
import net.wigis.graph.PaintBean;
import net.wigis.graph.dnv.DNVGraph;
import net.wigis.graph.dnv.DNVNode;
import net.wigis.graph.dnv.interaction.implementations.InterpolationMethod;
import net.wigis.graph.dnv.utilities.GraphFunctions;
import net.wigis.graph.dnv.utilities.Timer;
import net.wigis.graph.dnv.utilities.Vector2D;
import net.wigis.web.GraphServlet;

// TODO: Auto-generated Javadoc
/**
* The Class WiGiGUI.
*
* This class runs a local GUI version of WiGis without many of the features from the full web system.
*
* @author Brynjar Gretarsson
*/
public class WiGiGUI extends GLJPanel implements KeyListener, MouseListener, MouseMotionListener, MouseWheelListener, ComponentListener, FocusListener
{

  /** The Constant serialVersionUID. */
  private static final long serialVersionUID = 1L;

  /** The pb. */
  private PaintBean pb;
 
  private JFrame mainFrame;
  private JFrame overviewFrame;
  private JFrame settingsFrame;
 
  private WiGiGUIHandler handler;

  /**
   * Instantiates a new wi gi gui.
   *
   * @param pb
   *            the pb
   */
  public WiGiGUI( GLCapabilities caps, PaintBean pb, JFrame mainFrame, JFrame overviewFrame, WiGiGUIHandler handler )
  {
    super( caps );

    this.pb = pb;
    this.mainFrame = mainFrame;
    this.overviewFrame = overviewFrame;
    this.initSettingsFrame();

    this.handler = handler;
    new Thread()
    {
      Timer timer = new Timer();
      public void run()
      {
        while( true )
        {
          timer.setStart();
          repaint();
          timer.setEnd();
          if( timer.getLastSegment( Timer.MILLISECONDS ) < 33 )
          {
            try
            {
              Thread.sleep( 33 - (int)timer.getLastSegment( Timer.MILLISECONDS ) );
            }
            catch( InterruptedException e )
            {
              e.printStackTrace();
            }
          }
        }
      }
    }.start();
  }

  JComboBox graphSelect;
  public void initSettingsFrame()
  {
    settingsFrame = new JFrame( "Settings" );
    fixSettingsFrameBounds();
    graphSelect = new JComboBox();
    GraphsBean gb = new GraphsBean();
    List<SelectItem> fileList = gb.getFileList();
    for( SelectItem item : fileList )
    {
      LabelAndValue lav = new LabelAndValue( item.getLabel(), (String)item.getValue() );
      graphSelect.addItem( lav );
      if( lav.getValue().equals( pb.getSelectedFile() ) )
      {
        graphSelect.setSelectedItem( lav );
      }
    }
    graphSelect.addActionListener( new ActionListener(){

      @Override
      public void actionPerformed( ActionEvent arg0 )
      {
        LabelAndValue lav = (LabelAndValue)graphSelect.getSelectedItem();
        pb.setSelectedFile( lav.getValue() );
      }
     
    });
   
    settingsFrame.addKeyListener( this );
    settingsFrame.add( graphSelect );
  }

  public void showSettingsFrame()
  {
    settingsFrame.setVisible( true );
  }
 
  public void hideSettingsFrame()
  {
    settingsFrame.setVisible( false );
  }
 
  private void fixSettingsFrameBounds()
  {
    settingsFrame.setBounds( mainFrame.getX() + mainFrame.getWidth() + 10, mainFrame.getY() + WiGiOverviewPanel.OVERVIEW_SIZE + 10, WiGiOverviewPanel.OVERVIEW_SIZE, mainFrame.getHeight() - WiGiOverviewPanel.OVERVIEW_SIZE - 10 );
  }

  private Timer timer = new Timer( Timer.NANOSECONDS );
  private boolean printFPS = false;
  /*
   * (non-Javadoc)
   *
   * @see javax.swing.JComponent#paint(java.awt.Graphics)
   */
  public void paint( Graphics g )
  {
    if( printFPS )
    {
      timer.setEnd();
      float segment = timer.getLastSegment( Timer.SECONDS );
      if( segment != 0 )
      {
        System.out.println( "FPS:" + (1.0f/segment) );
      }
      timer.setStart();
    }
    try
    {
      pb.paint( (Graphics2D)g, getWidth(), getHeight(), false, true );
      new Thread(){
        public void run()
        {
          overviewFrame.repaint();
        }
      }.start();
    }
    catch( IOException e )
    {
      e.printStackTrace();
    }
  }

  /**
   * The main method.
   *
   * @param args
   *            the arguments
   * @throws IOException
   *             Signals that an I/O exception has occurred.
   */
  public static void main( String args[] ) throws IOException
  {
    WiGiGUI canvas = init();
    canvas.showSettingsFrame();
  }

  public static WiGiGUI init() {
    GraphsPathFilter.init();
    PaintBean pb = new PaintBean();
//    pb.setSelectedFile( Settings.GRAPHS_PATH + "UserStudy/testGraphs/graph1large.dnv" );
//    pb.setSelectedFile( Settings.GRAPHS_PATH + "UserStudy/testGraphs/graph1large.dnv" );
    pb.setWhiteSpaceBuffer( 0.14f );
    pb.setDrawNeighborHighlight( true );
    pb.setInterpolationMethodUseWholeGraph( true );
    pb.setScalePositions( true );
    pb.setPlaySound( true );
    JFrame frame = new JFrame( "WiGi - GUI" );
    frame.setSize( 800, 800 );
    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    JFrame overviewFrame = new JFrame("Overview");
    WiGiGUIHandler handler = new WiGiGUIHandler( pb, overviewFrame );
    handler.setWiGiDockIcon();
    frame.setIconImage( handler.getWigiIconImage() );
    overviewFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    overviewFrame.setUndecorated( true );
    overviewFrame.setSize( WiGiOverviewPanel.OVERVIEW_SIZE, WiGiOverviewPanel.OVERVIEW_SIZE );
    overviewFrame.setResizable( false );
    overviewFrame.setIconImage( handler.getWigiIconImage() );

    GLCapabilities caps = new GLCapabilities();
    caps.setDoubleBuffered( true );
    caps.setHardwareAccelerated( true );
    WiGiOverviewPanel overviewPanel = new WiGiOverviewPanel( pb );
    overviewFrame.getContentPane().add( overviewPanel );

    caps = new GLCapabilities();
    caps.setDoubleBuffered( true );
    caps.setHardwareAccelerated( true );
    WiGiGUI canvas = new WiGiGUI( caps, pb, frame, overviewFrame, handler );
    overviewPanel.setRenderComponent( canvas );
    canvas.setBounds( 0, 0, pb.getWidthInt(), pb.getHeightInt() );
//    canvas.setDoubleBuffered( true );
    canvas.addMouseListener( canvas );
    canvas.addMouseMotionListener( canvas );
    canvas.addMouseWheelListener( canvas );
    canvas.addKeyListener( canvas );
    canvas.getSettingsFrame().setIconImage( handler.getWigiIconImage() );
   
    frame.addComponentListener( canvas );
    frame.addKeyListener( canvas );
    frame.add( canvas );
//    moveOverview();
   
    // Placing window in the center of the screen
      // Get the size of the screen
      Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
      // Determine the new location of the window
      int w = frame.getSize().width;
      int h = frame.getSize().height;
      int x = (dim.width-w)/2;
      int y = (dim.height-h)/2;
      // Move the window
      frame.setLocation( x, y );
    frame.setVisible( true );
    overviewFrame.setBounds( frame.getX() + frame.getWidth() + 10, frame.getY(), WiGiOverviewPanel.OVERVIEW_SIZE, WiGiOverviewPanel.OVERVIEW_SIZE );
    overviewFrame.setVisible(true);

    pb.setWidth( canvas.getWidth() );
    pb.setHeight( canvas.getHeight() );
                   
    return canvas;
  }

 
  public class LabelAndValue
  {
    private String label;
    private String value;
   
    public LabelAndValue( String label, String value )
    {
      this.label = label;
      this.value = value;
    }
   
    public String toString()
    {
      return label;
    }

    public String getLabel()
    {
      return label;
    }

    public void setLabel( String label )
    {
      this.label = label;
    }

    public String getValue()
    {
      return value;
    }

    public void setValue( String value )
    {
      this.value = value;
    }
  }
 
  @Override
  public void mouseWheelMoved( MouseWheelEvent e )
  {
    int x = e.getX();
    int y = e.getY();
   
    int amount = e.getWheelRotation();
   
    zoom( x, y, amount );
   
    this.repaint();
  }

  public void zoom( int x, int y, float amount )
  {
//    System.out.println( "Zooming " + x + ", " + y + " : " + amount );
    int zoomOut = 0;
    if( amount > 0 )
      zoomOut = 1;
    else if( amount < 0 )
      zoomOut = -1;
   
    int minX = (int)Math.round( WiGiOverviewPanel.OVERVIEW_SIZE * pb.getMinX() );
    int maxX = (int)Math.round( WiGiOverviewPanel.OVERVIEW_SIZE * pb.getMaxX() );
    int minY = (int)Math.round( WiGiOverviewPanel.OVERVIEW_SIZE * pb.getMinY() );
    int maxY = (int)Math.round( WiGiOverviewPanel.OVERVIEW_SIZE * pb.getMaxY() );

    int width = maxX - minX;
    int height = maxY - minY;
   
    if( zoomOut != 1 && width <= 10 )
    {
      return;
    }
   
    int offset;
    if( zoomOut == 1 )
    {
      offset = width / 3;
    }
    else
    {
      offset = width / 4;
    }

//      if ( width + zoomOut*offset > 10)
//         {
             // zoom like in google maps, depends on where the mouse is at the time of the mouse wheel scroll
             double percent = x / pb.getWidth();
            
             int zoomNewW = width + zoomOut*offset;
             double zoomNewL = (percent*width + minX) - percent*zoomNewW;
             pb.setMinX( zoomNewL / (double)WiGiOverviewPanel.OVERVIEW_SIZE );
             pb.setMaxX( (zoomNewL+zoomNewW) / (double)WiGiOverviewPanel.OVERVIEW_SIZE );
            
             percent = y / pb.getHeight();
             int zoomNewH = height + zoomOut*offset;
             double zoomNewT = (percent*height + minY) - percent*zoomNewH;
             pb.setMinY( zoomNewT / (double)WiGiOverviewPanel.OVERVIEW_SIZE );
             pb.setMaxY( (zoomNewT+zoomNewH ) / (double)WiGiOverviewPanel.OVERVIEW_SIZE );
//         }
  }
  /*
   * (non-Javadoc)
   *
   * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)
   */
  @Override
  public void keyPressed( KeyEvent e )
  {
    if( File.separator.equals( "\\" ) )
    {
      if( e.getKeyCode() == KeyEvent.VK_CONTROL )
      {
        ctrlPressed = true;
      }
    }
    else
    {
      if( e.getKeyCode() == KeyEvent.VK_META )
      {
        ctrlPressed = true;
      }     
    }
    if ( e.getKeyCode() == KeyEvent.VK_SHIFT )
    {
      shiftPressed = true;
    }
    else if( e.getKeyCode() == KeyEvent.VK_B )
    {
      pb.setDrawNeighborHighlight( !pb.isDrawNeighborHighlight() );
    }
    else if( e.getKeyCode() == KeyEvent.VK_O )
    {     
      new Thread()
      {
        public void run()
        {
          pb.runLayout();
        }
      }.start();
    }else if( e.getKeyCode() == KeyEvent.VK_C )
    {     
      new Thread()
      {
        public void run()
        {
          pb.compLayout();
        }
      }.start();
    }
    else if( e.getKeyCode() == KeyEvent.VK_BACK_SPACE || e.getKeyCode() == KeyEvent.VK_DELETE )
    {
      for( DNVNode node : pb.getSelectedNodes() )
      {
        node.deleteNode();
      }
    }
    else if( e.getKeyCode() == KeyEvent.VK_S )
    {
      if( ctrlPressed )
      {
        pb.saveGraph();
      }
      else
      {
        pb.setPlaySound( !pb.isPlaySound() );
      }
    }
    else if( e.getKeyCode() == KeyEvent.VK_L )
    {
      pb.setShowLabels( !pb.isShowLabels() );
    }
    else if( e.getKeyCode() == KeyEvent.VK_E )
    {
      pb.setHideEdgeLabels( !pb.isHideEdgeLabels() );
    }
  }

  /*
   * (non-Javadoc)
   *
   * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)
   */
  @Override
  public void keyReleased( KeyEvent e )
  {
    if( File.separator.equals( "\\" ) )
    {
      if( e.getKeyCode() == KeyEvent.VK_CONTROL )
      {
        ctrlPressed = false;
      }
    }
    else
    {
      if( e.getKeyCode() == KeyEvent.VK_META )
      {
        ctrlPressed = false;
      }     
    }
    if ( e.getKeyCode() == KeyEvent.VK_SHIFT )
    {
      shiftPressed = false;
    }
  }

  /*
   * (non-Javadoc)
   *
   * @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent)
   */
  @Override
  public void keyTyped( KeyEvent e )
  {
  // TODO Auto-generated method stub

  }

  /*
   * (non-Javadoc)
   *
   * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
   */
  @Override
  public void mouseClicked( MouseEvent e )
  {
    if( e.getClickCount() == 2 )
    {
      handler.handleDoubleClick();
      AnimationThread a = new AnimationThread( this );
      a.start();
    }
  }

  private class AnimationThread extends Thread
  {
    Component c;
    public AnimationThread( Component c )
    {
      this.c = c;
    }
   
    public void run()
    {
      DNVGraph graph = pb.getGraph();
      while( graph.getAnimations().size() > 0 )
      {
        c.repaint();
      }
    }
  }
 
  /*
   * (non-Javadoc)
   *
   * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
   */
  @Override
  public void mouseEntered( MouseEvent e )
  {
  // TODO Auto-generated method stub

  }

  /*
   * (non-Javadoc)
   *
   * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
   */
  @Override
  public void mouseExited( MouseEvent e )
  {
  // TODO Auto-generated method stub

  }

  /** The mouse down x. */
  int mouseDownX = -1;

  /** The mouse down y. */
  int mouseDownY = -1;

  /** The selected node. */
  DNVNode selectedNode = null;

  /** The ctrl pressed. */
  boolean ctrlPressed = false;

  boolean shiftPressed = false;
 
  private int selectionBuffer = 10;

  /*
   * (non-Javadoc)
   *
   * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
   */
  @Override
  public void mousePressed( MouseEvent e )
  {
    mouseDownX = e.getPoint().x;
    mouseDownY = e.getPoint().y;

    selectedNode = handler.picking( mouseDownX, mouseDownY, selectionBuffer, ctrlPressed, true );
    if( selectedNode != null )
    {
      handler.playSound( 0 );
      InterpolationMethod.selectNode( pb, pb.getGraph(), Integer.MAX_VALUE, (int)pb.getLevel(), selectedNode );
    }
/*
    DNVGraph graph = pb.getGraph();
    int level = (int)pb.getLevel();

    double globalMinX = GraphFunctions.getMinXPosition( graph, level, true );
    double globalMaxX = GraphFunctions.getMaxXPosition( graph, level, true );
    double globalMinY = GraphFunctions.getMinYPosition( graph, level, true );
    double globalMaxY = GraphFunctions.getMaxYPosition( graph, level, true );
    if( globalMinY == globalMaxY )
    {
      globalMinY -= 10;
      globalMaxY += 10;
    }
    if( globalMinX == globalMaxX )
    {
      globalMinX -= 10;
      globalMaxX += 10;
    }
    double yBuffer = ( globalMaxY - globalMinY ) * pb.getWhiteSpaceBuffer();
    double xBuffer = ( globalMaxX - globalMinX ) * pb.getWhiteSpaceBuffer();
    globalMaxY += yBuffer;
    globalMinY -= yBuffer;
    globalMaxX += xBuffer;
    globalMinX -= xBuffer;

    List<DNVNode> nodes = graph.getNodes( level );
    SortByLabelSize sbls = new SortByLabelSize( pb.isHighlightNeighbors() );
    Collections.sort( nodes, sbls );
    DNVNode node;
    Vector2D screenPosition;
    double distance;
    double minDistance = Integer.MAX_VALUE;
    int nodeI = -1;
    int distX = 0; // dist b/w this node and mouse click
    int distY = 0;

    // Check if user clicked on a solid node label
    for( int i = nodes.size() - 1; i >= 0; i-- )
    {
      node = nodes.get( i );
      if( node.isVisible() && ( node.isForceLabel() || pb.isShowLabels() ) && node.getProperty( "faded" ) == null )
      {
        screenPosition = ImageRenderer.transformPosition( globalMinX, globalMaxX, globalMinY, globalMaxY, pb.getMinX(), pb.getMaxX(), pb
            .getMinY(), pb.getMaxY(), getWidth(), getHeight(), node.getPosition( true ) );
        ImageRenderer.Rectangle boundingRectangle = ImageRenderer.getRectangleBoundingTheLabel( node, screenPosition, null, (int)Math
            .round( pb.getNodeSize() * node.getRadius() ), node.getLabel( pb.isInterpolationLabels() ), pb.isCurvedLabels()
            || node.isCurvedLabel(), pb.getLabelSize(), pb.getMinX(), pb.getMaxX(), getWidth() / pb.getWidth(), pb.isScaleLabels(), pb
            .getMaxLabelLength(), pb.getCurvedLabelAngle(), pb.isBoldLabels(), false );
        if( mouseDownX >= boundingRectangle.left() && mouseDownX <= boundingRectangle.right() && mouseDownY <= boundingRectangle.bottom()
            && mouseDownY >= boundingRectangle.top() )
        {
          distX = (int)( mouseDownX - screenPosition.getX() );
          distY = (int)( mouseDownY - screenPosition.getY() );
          node.setProperty( "distX", "" + distX );
          node.setProperty( "distY", "" + distY );
          minDistance = 0;
          nodeI = i;
          break;
        }
      }
    }

    if( nodeI == -1 )
    {
      // loop thru all nodes to find closest node
      for( int i = nodes.size() - 1; i >= 0; i-- )
      {
        node = nodes.get( i );
        if( node.isVisible() )
        {
          screenPosition = ImageRenderer.transformPosition( globalMinX, globalMaxX, globalMinY, globalMaxY, pb.getMinX(), pb.getMaxX(), pb
              .getMinY(), pb.getMaxY(), getWidth(), getHeight(), node.getPosition( true ) );

          // find node closest to mouseDown
          distX = (int)( mouseDownX - screenPosition.getX() );
          distY = (int)( mouseDownY - screenPosition.getY() );

          distance = distX * distX + distY * distY;

          if( distance < minDistance )
          {
            node.setProperty( "distX", "" + distX );
            node.setProperty( "distY", "" + distY );

            minDistance = distance;
            nodeI = i;
          }
        }
      }
    }

    if( nodes.size() > 0 )
    {
      node = nodes.get( nodeI );

      double nodeWidth;
      nodeWidth = GraphServlet.getNodeWidth( pb, getWidth(), pb.getMinX(), pb.getMaxX(), node.getRadius() );
      // check if selected node is close enough to mouseDown
      if( Settings.DEBUG )
        System.out.println( "Minimum distance was " + Math.sqrt( minDistance ) );

      if( Math.sqrt( minDistance ) >= nodeWidth )
      {
        // Still no node selected so check nodes with faded labels
        for( int i = nodes.size() - 1; i >= 0; i-- )
        {
          node = nodes.get( i );
          if( node.isVisible() && ( node.isForceLabel() || pb.isShowLabels() ) && node.getProperty( "faded" ) != null
              && Float.parseFloat( node.getProperty( "faded" ) ) > 0.1 )
          {
            screenPosition = ImageRenderer.transformPosition( globalMinX, globalMaxX, globalMinY, globalMaxY, pb.getMinX(), pb.getMaxX(),
                pb.getMinY(), pb.getMaxY(), getWidth(), getHeight(), node.getPosition( true ) );
            ImageRenderer.Rectangle boundingRectangle = ImageRenderer.getRectangleBoundingTheLabel( node, screenPosition, null, (int)Math
                .round( pb.getNodeSize() * node.getRadius() ), node.getLabel( pb.isInterpolationLabels() ), pb.isCurvedLabels()
                || node.isCurvedLabel(), pb.getLabelSize(), pb.getMinX(), pb.getMaxX(), getWidth() / pb.getWidth(), pb
                .isScaleLabels(), pb.getMaxLabelLength(), pb.getCurvedLabelAngle(), pb.isBoldLabels(), false );
            if( mouseDownX >= boundingRectangle.left() && mouseDownX <= boundingRectangle.right() && mouseDownY <= boundingRectangle.bottom()
                && mouseDownY >= boundingRectangle.top() )
            {
              distX = (int)( mouseDownX - screenPosition.getX() );
              distY = (int)( mouseDownY - screenPosition.getY() );
              node.setProperty( "distX", "" + distX );
              node.setProperty( "distY", "" + distY );
              minDistance = 0;
              nodeI = i;
              break;
            }
          }
        }
      }

      node = nodes.get( nodeI );

      nodeWidth = GraphServlet.getNodeWidth( pb, getWidth(), pb.getMinX(), pb.getMaxX(), node.getRadius() );
      // check if selected node is close enough to mouseDown
      if( Settings.DEBUG )
        System.out.println( "Minimum distance was " + Math.sqrt( minDistance ) );
      if( Math.sqrt( minDistance ) < nodeWidth )
      {
        // if( node.isSelected() )
        // {
        // sameNode = true;
        // }
        pb.setSelectedNode( node, ctrlPressed );
        selectedNode = node;
      }
      else
      {
        if( pb.getSelectedNode() != null )
        {
          pb.setSelectedNode( null, ctrlPressed );
          // GraphServlet.runDocumentTopicsCircularLayout( null, pb,
          // graph, level );
        }
      }
      if( selectedNode == null )
      {
        minDistance = Integer.MAX_VALUE;
        List<DNVEdge> edges = graph.getEdges( level );
        DNVEdge edge;
        Vector2D screenPosition2;
        int edgeI = 0;
        for( int i = 0; i < edges.size(); i++ )
        {
          edge = edges.get( i );
          if( edge.isVisible() )
          {
            screenPosition = ImageRenderer.transformPosition( globalMinX, globalMaxX, globalMinY, globalMaxY, pb.getMinX(), pb.getMaxX(),
                pb.getMinY(), pb.getMaxY(), getWidth(), getHeight(), edge.getFrom().getPosition( true ) );
            screenPosition2 = ImageRenderer.transformPosition( globalMinX, globalMaxX, globalMinY, globalMaxY, pb.getMinX(),
                pb.getMaxX(), pb.getMinY(), pb.getMaxY(), getWidth(), getHeight(), edge.getTo().getPosition( true ) );
            distance = GraphServlet.getPointLineDistance( screenPosition, screenPosition2, mouseDownX, mouseDownY );
            if( distance < minDistance )
            {
              minDistance = distance;
              edgeI = i;
            }
          }
        }

        if( edges.size() > 0 )
        {
          edge = edges.get( edgeI );

          double edgeWidth = Math.max( edge.getThickness(), 4 );
          // check if selected node is close enough to mouseDown
          if( Settings.DEBUG )
            System.out.println( "Minimum distance was " + Math.sqrt( minDistance ) );
          if( Math.sqrt( minDistance ) < edgeWidth / 2.0 )
          {
            if( edge.isSelected() )
            {
              // sameNode = true;
            }
            pb.setSelectedEdge( edge, ctrlPressed );
          }
          else
          {
            pb.setSelectedEdge( null, ctrlPressed );
          }
        }
      }
    }
*/
    this.repaint();
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
   */
  @Override
  public void mouseReleased( MouseEvent e )
  {
    if( selectedNode != null )
    {
      moveNode( e.getPoint().x, e.getPoint().y, true );
    }
    else
    {
      pb.setSelectedNode( null, false );
    }
    previousMovePos = null;
  }

  private Vector2D previousMovePos = null;
  /*
   * (non-Javadoc)
   *
   * @see
   * java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent
   * )
   */
  @Override
  public void mouseDragged( MouseEvent e )
  {
    if( selectedNode != null )
    {
      moveNode( e.getPoint().x, e.getPoint().y, false );
      previousMovePos = null;
    }
    else
    {
      // Panning
      double xRatio = WiGiOverviewPanel.OVERVIEW_SIZE / pb.getWidth() * (pb.getMaxX() - pb.getMinX());
      double yRatio = WiGiOverviewPanel.OVERVIEW_SIZE / pb.getHeight() * (pb.getMaxY() - pb.getMinY());
      if( previousMovePos != null )
      {
        double movementX = (previousMovePos.getX() - e.getPoint().x) * xRatio;
        double movementY = (previousMovePos.getY() - e.getPoint().y) * yRatio;
        handler.performPanning( movementX, movementY );
      }

      previousMovePos = new Vector2D( e.getPoint().x, e.getPoint().y );
    }
  }

  /**
   * Move node.
   *
   * @param mouseUpX
   *            the mouse up x
   * @param mouseUpY
   *            the mouse up y
   */
  public void moveNode( int mouseUpX, int mouseUpY, boolean released )
  {
    DNVGraph graph = pb.getGraph();
    int level = (int)pb.getLevel();

    double globalMinX = GraphFunctions.getMinXPosition( graph, level, true );
    double globalMaxX = GraphFunctions.getMaxXPosition( graph, level, true );
    double globalMinY = GraphFunctions.getMinYPosition( graph, level, true );
    double globalMaxY = GraphFunctions.getMaxYPosition( graph, level, true );
    if( globalMinY == globalMaxY )
    {
      globalMinY -= 10;
      globalMaxY += 10;
    }
    if( globalMinX == globalMaxX )
    {
      globalMinX -= 10;
      globalMaxX += 10;
    }
    double yBuffer = ( globalMaxY - globalMinY ) * pb.getWhiteSpaceBuffer();
    double xBuffer = ( globalMaxX - globalMinX ) * pb.getWhiteSpaceBuffer();
    globalMaxY += yBuffer;
    globalMinY -= yBuffer;
    globalMaxX += xBuffer;
    globalMinX -= xBuffer;

    GraphServlet.moveSelectedNode( null, pb, graph, level, getWidth(), getHeight(), pb.getMinX(), pb.getMinY(), pb.getMaxX(), pb.getMaxY(),
        mouseUpX, mouseUpY, false, globalMinX, globalMaxX, globalMinY, globalMaxY, selectedNode, released );

    repaint();
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
   */
  @Override
  public void mouseMoved( MouseEvent e )
  {
    handler.hovering( e.getX(), e.getY() );
    this.repaint();
  }

  /*
   * (non-Javadoc)
   *
   * @seejava.awt.event.ComponentListener#componentHidden(java.awt.event.
   * ComponentEvent)
   */
  @Override
  public void componentHidden( ComponentEvent e )
  {
  // TODO Auto-generated method stub

  }

  /*
   * (non-Javadoc)
   *
   * @see
   * java.awt.event.ComponentListener#componentMoved(java.awt.event.ComponentEvent
   * )
   */
  @Override
  public void componentMoved( ComponentEvent e )
  {
//    System.out.println( "Component Moved" );
    handler.moveOverview( e.getComponent() );
    fixSettingsFrameBounds();
  }

  /*
   * (non-Javadoc)
   *
   * @seejava.awt.event.ComponentListener#componentResized(java.awt.event.
   * ComponentEvent)
   */
  @Override
  public void componentResized( ComponentEvent e )
  {
    pb.setWidth( this.getWidth() );
    pb.setHeight( this.getHeight() );
    handler.moveOverview( e.getComponent() );
    repaint();
    fixSettingsFrameBounds();
  }

  /*
   * (non-Javadoc)
   *
   * @see
   * java.awt.event.ComponentListener#componentShown(java.awt.event.ComponentEvent
   * )
   */
  @Override
  public void componentShown( ComponentEvent e )
  {
  // TODO Auto-generated method stub

  }

  /*
   * (non-Javadoc)
   *
   * @see java.awt.event.FocusListener#focusGained(java.awt.event.FocusEvent)
   */
  @Override
  public void focusGained( FocusEvent e )
  {
  // TODO Auto-generated method stub

  }

  /*
   * (non-Javadoc)
   *
   * @see java.awt.event.FocusListener#focusLost(java.awt.event.FocusEvent)
   */
  @Override
  public void focusLost( FocusEvent e )
  {
  // TODO Auto-generated method stub

  }
 
  public PaintBean getPaintBean() { return pb; }
  public JFrame getFrame() { return mainFrame; }
  public JFrame getOverviewFrame() { return overviewFrame; }

  /**
   * @return the settingsFrame
   */
  public JFrame getSettingsFrame()
  {
    return settingsFrame;
  }

  /**
   * @param settingsFrame the settingsFrame to set
   */
  public void setSettingsFrame( JFrame settingsFrame )
  {
    this.settingsFrame = settingsFrame;
  }
}
TOP

Related Classes of net.wigis.graph.ui.WiGiGUI$LabelAndValue

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.