// A class that implements the Angle interface.
// Barry Cornelius, 7th February 2000
import java.util.StringTokenizer;
public class AngleImpl implements Angle
{
   private int iDegrees;
   private int iMinutes;
   private int iSeconds;
   private char iDirection;
   public AngleImpl()
   {
      this(0, 0, 0, 'E');
   }
   public AngleImpl(final Angle pAngle)
   {
      this(pAngle.getDegrees(), pAngle.getMinutes(),
           pAngle.getSeconds(), pAngle.getDirection());
   }
   public AngleImpl(final int pDegrees, final int pMinutes, final int pSeconds,
                    final char pDirection) 
   {
      iDegrees = pDegrees; 
      iMinutes = pMinutes; 
      iSeconds = pSeconds;
      iDirection = pDirection;
   }
   public AngleImpl(final String pAngleString)
   {
      try
      {
         final StringTokenizer tTokens =
                               new StringTokenizer(pAngleString, "-");
         final String tDegreesString = tTokens.nextToken();
         iDegrees = new Integer(tDegreesString).intValue();
         final String tMinutesString = tTokens.nextToken();
         iMinutes = new Integer(tMinutesString).intValue();
         final String tSecondsString = tTokens.nextToken();
         iSeconds = new Integer(tSecondsString).intValue();
         final String tDirectionString = tTokens.nextToken();
         iDirection = tDirectionString.charAt(0);
      }
      catch(Exception pException)
      {
         iDegrees = 0; 
         iMinutes = 0; 
         iSeconds = 0;
         iDirection = 'E';
      }
   }
   public int getDegrees()
   {
      return iDegrees;
   }
   public int getMinutes()
   {
      return iMinutes;
   }
   public int getSeconds()
   {
      return iSeconds;
   }
   public char getDirection()
   {
      return iDirection;
   }
   public void setDegrees(final int pDegrees)
   {
      iDegrees = pDegrees;
   }
   public void setMinutes(final int pMinutes)
   {
      iMinutes = pMinutes;
   }
   public void setSeconds(final int pSeconds)
   {
      iSeconds = pSeconds;
   }
   public void setDirection(final char pDirection)
   {
      iDirection = pDirection;
   }
   public boolean equals(final Object pObject)
   {
      if (! (pObject instanceof AngleImpl) )
      {
         return false;
      }
      final AngleImpl tAngleImpl = (AngleImpl)pObject;
      return iDegrees==tAngleImpl.iDegrees &&
             iMinutes==tAngleImpl.iMinutes &&
             iSeconds==tAngleImpl.iSeconds &&
             iDirection==tAngleImpl.iDirection;
   }
   public int hashCode()
   {
      return getDistance();
   }
   public String toString()
   {
      return iDegrees + "-" + iMinutes/10 + iMinutes%10 +
                        "-" + iSeconds/10 + iSeconds%10 + "-" + iDirection;
   }
   public int getDistance()
   {
      final int tMagnitude = iDegrees*3600 + iMinutes*60 + iSeconds;
      if (iDirection=='E' || iDirection=='N')
      {
         return tMagnitude;
      }
      else
      {
         return -tMagnitude;
      }
   }
}
