001    package stringtransformers;
002    
003    import cs101.io.connection.*;
004    import cs101.io.Console;
005    import java.awt.*;
006    import java.awt.event.*;
007    
008    public final class TVConnectManager {
009    
010      public static MouseListener getListener( final StringTransformer who )
011      {
012        //    Console.println ("TVCM:  Creating listener for "+ who);
013        return new MouseAdapter () {
014          public void mouseClicked( MouseEvent me )
015          {
016            //        Console.println( "TVCM ST MA: mouse clicked " + who  );
017    
018              TVConnectManager.selectTarget ( who );
019          }
020        };
021      }
022    
023      public static MouseListener getListener( final OutputAcceptor who )
024      {
025        //    Console.println ("TVCM:  Creating listener for an OutputAcceptor " + who);
026        return new MouseAdapter () {
027            public void mouseClicked( MouseEvent me )
028            {
029              //      Console.println( "TVCM OA MA: mouse clicked " + who );
030    
031              TVConnectManager.selectFromTarget ( who );
032            }
033        };
034      }
035    
036      public static MouseListener getListener( final InputAcceptor who )
037      {
038        //    Console.println ("TVCM:  Creating listener for an InputAcceptor " + who);
039        return new MouseAdapter () {
040            public void mouseClicked( MouseEvent me )
041            {
042              //      Console.println( "TVCM IA MA: mouse clicked " + who );
043    
044              TVConnectManager.selectToTarget ( who );
045            }
046        };
047      }
048    
049      private static OutputAcceptor fromTarget;
050      private static long fromTargetSelectTime;
051    
052      private static void selectFromTarget( OutputAcceptor which )
053      {
054        TVConnectManager.fromTarget = which;
055        TVConnectManager.fromTargetSelectTime =
056          System.currentTimeMillis();
057    
058        Console.println ("TVCM:  selected a From target: " + which);
059      }
060    
061      private static void selectTarget( StringTransformer which )
062      {
063        if ( ( TVConnectManager.fromTarget == null ) 
064             || ( TVConnectManager.fromTarget == which )
065             || ( TVConnectManager.fromTargetIsStale() ) )
066          {
067            TVConnectManager.selectFromTarget( which );
068          }
069        else 
070          {
071            TVConnectManager.selectToTarget( which );
072          }
073      }
074    
075      private static void selectToTarget( InputAcceptor which )
076      {
077        Console.println( "TVCM:  selecting To target: " + which );
078    
079        if ( TVConnectManager.fromTarget == null )
080          {
081            Console.println( "TVCM:  From target is null; punting To selection");
082          }
083        if ( TVConnectManager.fromTarget == which )
084          {
085            Console.println( "TVCM:  From (" + TVConnectManager.fromTarget + 
086                             ") and To (" + which + 
087                             ") targets are same; punting To selection"); 
088          }
089        if ( TVConnectManager.fromTargetIsStale() )
090          {
091            Console.println( "TVCM:  From target (" +  TVConnectManager.fromTarget
092                             + ") is stale ("
093                             + ( System.currentTimeMillis() - 
094                               TVConnectManager.fromTargetSelectTime )
095                             + "); punting To selection");
096          }
097    
098        try
099          {
100            if ( isConnectable( TVConnectManager.fromTarget, which )
101                 && ( ! TVConnectManager.fromTargetIsStale() ))
102              {
103                Console.println ("TVCM:  selected a To target (" +
104                                 which + ")....attempting connect from " +  
105                                 TVConnectManager.fromTarget);
106    
107                new StringConnector( TVConnectManager.fromTarget,
108                                     which );
109                Console.println ("TVCM:  connected "+  TVConnectManager.fromTarget + " to " + which);
110              }
111            else
112              {
113                System.err.println ( "TV:  Ignoring mouse release in " + which );
114              }
115          }
116        catch (ConnectionRejectedException e)
117          {
118            Console.println ("TVCM:  rejected connection from "+  TVConnectManager.fromTarget + " to " + which);
119          }
120        TVConnectManager.fromTarget = null;
121        Console.println("");
122      }
123    
124      private static final boolean isConnectable( Object from, Object to )
125      {
126        return ( ( from != null )
127                 && ( to != null )
128                 && ( from instanceof OutputAcceptor )
129                 && ( to instanceof InputAcceptor ) 
130                 && ( from != to ) );
131      }
132    
133      private static boolean fromTargetIsStale()
134      {
135        return ( ( System.currentTimeMillis() 
136                   - TVConnectManager.fromTargetSelectTime )
137                 >= 10000 );
138      }
139    
140      private TVConnectManager(){}
141    }
142