/** 
 * iPaqInfoPublisher.java
 *
 * Description:	
 * @author			daassi
 * @version			
 */

//package iPaqVisualizer;

import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import javax.swing.*;
import java.awt.image.BufferedImage ;
import java.awt.Graphics;

import java.net.*;
import java.io.*;
import java.awt.image.*;

public class iPaqVisualizer extends JFrame 
{          
     
   Socket driverSocket = null;
   
   PrintWriter out ;
   BufferedReader in ;
    
   int iPAQWidth = 320, iPAQHeight = 240;
   
   String inputSignalLine;      
    
   boolean timeLineHasBeenInit = false ;  
   
   int topOfTheFrame = 0 ; // 21 ;
   
   Image graphImage = null ;
   int imageWidth = 100, imageHeight = 100 ;
   int imagePixels [] ;
   
   int selectedAreaPosX = 0, selectedAreaPosY = topOfTheFrame ;
   int selectedAreaWidth = 60, selectedAreaHeight = 40 ;
   
   int minSelectedAreaWidth = 60, minSelectedAreaHeight = 40 ;
   int maxSelectedAreaWidth = 320, maxSelectedAreaHeight = 240 ;
   
   boolean mousePressedInSelectedArea = false ; 
   
      
   BasicStroke wideStroke = new BasicStroke(3.5f);
   Color selectedAreaColor = new Color (0.1F, 0.1F, 0.9F, 0.5F);
      
   Cursor downRightScalingCursor =  new Cursor(Cursor.SE_RESIZE_CURSOR );       
   Cursor defaultCursor =  new Cursor(Cursor.DEFAULT_CURSOR );    
    
   boolean selectedAreaUpdated = false ;
   
   int selectedCorner = 0 ;
         
     public iPaqVisualizer ()
     { 
       
        addMouseListener (new MouseAdapter ()
   		{
   			public void mousePressed(MouseEvent e) 
   			{
   			  mouseIsPressed ( e.getX(), e.getY()) ;   			      					  									
   			}
   									 
   			public void mouseReleased(MouseEvent e)
   			{
   			  mouseIsReleased () ;    			   								  
   			}
   				
   			public void mouseClicked(MouseEvent e) 
   			{    								 
   			       				   								 
   			}			   								 
   								 
   			public void mouseEntered(MouseEvent e)
   			{     				    									  
   			}    				
   				
       }	 
       );
       
       
       addMouseMotionListener (new MouseMotionAdapter ()
   		{   									  
   			public void mouseDragged(MouseEvent e) 
   			{ 
   			    mouseIsDragged ( e.getX(), e.getY()) ;   								   
   			}
   									
   			public void mouseMoved(MouseEvent e) 
   			{    					   									
   			  mouseIsMoving( e.getX(), e.getY());      								   
   			}    				  							
   		  }	   									
   		);
       
       initComponents() ;
       setServerSocket();
     }
   
        
    public void mouseIsPressed (int posX, int posY)
   	{
   	   if ((posX >= selectedAreaPosX) && (posX <= (selectedAreaPosX + selectedAreaWidth))
   	      && (posY >= (selectedAreaPosY + topOfTheFrame)) && (posY <= (selectedAreaPosY + topOfTheFrame + selectedAreaHeight)))
   	   {   	      	     	   
   	      mousePressedInSelectedArea = true ;
   	   } 
   	
   	}
     
   	public void mouseIsReleased ()
   	{   	
   	  mousePressedInSelectedArea = false ; 
   	     	     	  
   	  if (selectedAreaUpdated)
   	  {   	     
   	     String  oneLineToTheSocket = "selectedAreaUpdated"; 	
	     out.println(oneLineToTheSocket);
	     
	     out.println(Integer.toString(selectedAreaPosX));
	     out.println(Integer.toString(selectedAreaPosY));
	     
	     out.println(Integer.toString(selectedAreaWidth));
	     out.println(Integer.toString(selectedAreaHeight));
    	   	         	     	        	       	     
   	     selectedAreaUpdated = false ;    	     
   	  }	
   	
   	}
   	   	
   	public void mouseIsDragged (int posX, int posY)
   	{ 
   	  int width = 0, height = 0;   	  
   	  int currentPosX = 0, currentPosY = 0;
   	  	
   	  if (mousePressedInSelectedArea)
   	  {   	  
   	     switch (selectedCorner)
   	     {
   	         case 0 :  	    
   	         if (posX <= (selectedAreaWidth/2))
   	         {
   	            selectedAreaPosX = 1;   	     
   	          }
   	          else
   	          { 
   	             if (posX >= (iPAQWidth - (selectedAreaWidth/2)))
   	             {
   	                selectedAreaPosX = iPAQWidth - selectedAreaWidth;   	     
   	             }
   	             else
   	             {	        
   	                selectedAreaPosX = posX-(selectedAreaWidth/2);
   	             }   	          	         	     
   	          }
   	     
   	          if (posY <= (topOfTheFrame + (selectedAreaHeight/2)))
   	          {   	             
   	             selectedAreaPosY = 1;   	     
   	          }
   	          else
   	          { 	        
   	             if (posY >= ((iPAQHeight + topOfTheFrame)- (selectedAreaHeight/2)))
   	             {
   	                selectedAreaPosY = iPAQHeight - selectedAreaHeight;   	     
   	             }
   	             else
   	             {    	        
   	                selectedAreaPosY = posY - topOfTheFrame -(selectedAreaHeight/2); 
   	             } 	         	     
   	           }   	             	           
   	              	           
   	           selectedAreaUpdated = true ;
   	           
   	          break ;
   	          
   	         case 1 :   	         
   	                 
   	             // left top corner        
   	            break ;
   	        
   	         case 2 :   	         
   	               
   	             // right top corner
   	                
   	            break ;
   	        
   	         case 3 :   	                
   	                        
   	                 if (posX > iPAQWidth)
   	                 {
   	                   currentPosX = iPAQWidth ;   	                 
   	                 }
   	                 else
   	                 {
   	                   currentPosX = posX;  	                 
   	                 }
   	                   	                 
   	                 if (posY > (iPAQHeight + topOfTheFrame))
   	                 {
   	                   currentPosY = (iPAQHeight + topOfTheFrame) ;   	                 
   	                 }
   	                 else
   	                 {
   	                   currentPosY = posY;   	                 
   	                 }
   	                 
   	                 width = currentPosX - selectedAreaPosX +1 ; 
   	                 height = currentPosY - selectedAreaPosY - topOfTheFrame +1;
   	               
   	                if ((width <= maxSelectedAreaWidth) && (width >= minSelectedAreaWidth) &&
   	                   (height <= maxSelectedAreaHeight) && (height >= minSelectedAreaHeight) &&
   	                   ((selectedAreaPosX+ width) <= iPAQWidth) && ((selectedAreaPosY+ height) <= iPAQHeight))
   	                {               
   	                   
   	                   selectedAreaWidth = width ;
   	                   selectedAreaHeight = height ;   	                     
   	                   
   	                   selectedAreaUpdated = true ; 	             
   	                }   	              	                            
     	                 
   	            break ;
   	        
   	        case 4 :   	                  
   	                  
   	              // left right corner         
   	   	        
   	         default :
   	        
   	            break ;
   	       }   	      	     
   	     
   	     paint(getGraphics());   	     
   	     
   	  }
   	
   	}
   		
    public int distance (int posX1, int posY1, int posX2, int posY2)
   	{
   	  int dist = 0;
   	  
   	  dist = (int)Math.sqrt( ((posX1 - posX2)*(posX1 - posX2)) + ((posY1 - posY2)*(posY1 - posY2))); 
   	     	  
   	  return dist ;   	
   	}
    
    public void mouseIsMoving(int posX, int posY)
   	{   	  
   	    int cornerDistance = 5 ;   	  
   	
   	       if (distance (posX, posY, selectedAreaPosX + selectedAreaWidth, selectedAreaPosY + topOfTheFrame + selectedAreaHeight) <= cornerDistance)
   	       {   	            	        	
   	          selectedCorner = 3 ;
   	            	          
   	          setCursor(downRightScalingCursor);   
   	       }
   	       else
   	       {  	               	            
   	          selectedCorner = 0 ;
   	            
   	         setCursor(defaultCursor);   	       
   	       }   	
   	}		
   		//nouveau 
	  public void establishConnection() throws IOException
      {                                    
        try 
        {
            driverSocket = new Socket("pc-daassi.imag.fr", 1900);
            out = new PrintWriter(driverSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(driverSocket.getInputStream()));
        }
        catch (UnknownHostException e)
        {
            System.err.println("Don't know about host: pc-daassi.");
            System.exit(1);  
        } 
           
        catch (IOException e) 
        {
          System.err.println("Couldn't get I/O for the connection to: bilget.imag.fr.");
          System.exit(1);        
        }	 	
	 		 	 		 	 	
	  System.out.println("the time device is listening to messages");
	 	 
	 // new added
	 	try 
        {
          listenToSocket();
        } 
        catch (IOException e)
        {
          System.err.println("Could not listen to this port: 1900.");
          System.exit(1);
        }
         
    }  
    
  
 public void listenToSocket() throws IOException
 {           
   int imageSize = 0;
              	 	
	 if(driverSocket!= null)
  	 {                     
       if(!timeLineHasBeenInit)
	   {	     	     
	   
	     inputSignalLine = in.readLine() ;	        	     	    
	   
	    while (!(inputSignalLine.equals("End")))
	    {	   
	    
	 	 if ((inputSignalLine.equals("startSending")))
	 	 { 	 	 
	 	   inputSignalLine = in.readLine() ;	 	 
	 	 
	 	   imageWidth = Integer.parseInt(inputSignalLine) ;
	 	 
	 	   inputSignalLine = in.readLine() ;	 	  
	 	 	 	 
	 	   inputSignalLine = in.readLine() ;	 	  
	 	 	 		 	 
	 	   imageHeight = Integer.parseInt(inputSignalLine) ;
	 	  
	 	   imageSize = imageWidth * imageHeight ; 
	 	 
	 	   imagePixels = new int [imageSize] ;	 	 
	 	 	 	  
           for (int i = 0; i < imageSize; i++)
           {
              inputSignalLine = in.readLine() ;            
                               
              imagePixels [i] = Integer.parseInt(inputSignalLine) ;           	     
	       }	      
                                                                  
           MemoryImageSource sourcePixelImage = new MemoryImageSource(imageWidth, imageHeight, new DirectColorModel(32, 0xff0000, 65280, 255), imagePixels, 0, imageWidth);
           graphImage = Toolkit.getDefaultToolkit().createImage(sourcePixelImage);
           graphImage.flush();		  	 
	  	 
	  	 
	  	 }
	  	 else
	  	 { 		  	  	 
	  	   inputSignalLine = in.readLine() ;
	  	 
	  	   if (inputSignalLine.equals("selectedAreaRotated"))
	  	   { 
	  	    	  	 
	  	     // write the code to receive data and then rotate the image  	   
	  	     	  	   
	  	   }
	  	   else
	  	   {
	  	      if (inputSignalLine.equals("selectedAreaSize"))
	  	      {
	  	         inputSignalLine = in.readLine() ;	  	   
	  	         selectedAreaWidth = Integer.parseInt(inputSignalLine) ;
	  	   
	  	         inputSignalLine = in.readLine() ;
	  	         selectedAreaHeight = Integer.parseInt(inputSignalLine) ;	  	      
	  	      }
	  	      else
	  	      {
	  	      
	  	      
	  	      }	  	   
	  	   }
	  	}
	  		  	 
	  	 paint(getGraphics());
	   	             
         }
  } 
                                                      
  }           
        
}
           
  public void setServerConnection() 
  {               
      try 
       {                  
          establishConnection() ;         
       }
       catch (IOException e) 
       {
         System.err.println("Couldn't establish the connection to the server.");
         System.exit(1);        
       }       		

  }  
  	
    public void setServerSocket() 
	{				
		try
		{			
		   setServerConnection();			
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	public void initComponents()  
	{
		// the following code sets the frame's initial state
		getContentPane().setLayout(null);
		setLocation(0, 0);
		setTitle("This is the graphDisplayer");

        setVisible(true);
		setSize(iPAQWidth, iPAQHeight + topOfTheFrame);
	}
	
	public void paint (Graphics graphics)
	{
	   if (graphImage != null)
	   { 
	     Graphics2D g = (Graphics2D)graphics ;
	   
	     g.drawImage (graphImage, 0, topOfTheFrame, null);
	     
	     g.setStroke(wideStroke);
	     g.setColor (selectedAreaColor);	    
	     g.drawRect(selectedAreaPosX,  topOfTheFrame + selectedAreaPosY, selectedAreaWidth, selectedAreaHeight);
		     
	   }
	} 

 // Main entry point
	static public void main(String[] args) 
	{  	
		new iPaqVisualizer();			
		 
	}

}
