001: /*
002: * Copyright (C) 2004 NNL Technology AB
003: * Visit www.infonode.net for information about InfoNode(R)
004: * products and how to contact NNL Technology AB.
005: *
006: * This program is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU General Public License
008: * as published by the Free Software Foundation; either version 2
009: * of the License, or (at your option) any later version.
010: *
011: * This program is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
014: * GNU General Public License for more details.
015: *
016: * You should have received a copy of the GNU General Public License
017: * along with this program; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
019: * MA 02111-1307, USA.
020: */
021:
022: // $Id: Direction.java,v 1.6 2004/09/28 15:07:29 jesper Exp $
023: package net.infonode.util;
024:
025: import java.io.IOException;
026: import java.io.ObjectInputStream;
027:
028: /**
029: * An enum class for directions, up, down, left, right.
030: *
031: * @author $Author: jesper $
032: * @version $Revision: 1.6 $
033: */
034: final public class Direction extends Enum {
035: private static final long serialVersionUID = 1;
036:
037: /**
038: * Up direction.
039: */
040: public static final Direction UP = new Direction(0, "Up", false);
041:
042: /**
043: * Right direction.
044: */
045: public static final Direction RIGHT = new Direction(1, "Right",
046: true);
047:
048: /**
049: * Down direction.
050: */
051: public static final Direction DOWN = new Direction(2, "Down", false);
052:
053: /**
054: * Left direction.
055: */
056: public static final Direction LEFT = new Direction(3, "Left", true);
057:
058: /**
059: * Array containing all directions.
060: */
061: public static final Direction[] DIRECTIONS = { UP, RIGHT, DOWN,
062: LEFT };
063:
064: static {
065: UP.rotateCW = RIGHT;
066: RIGHT.rotateCW = DOWN;
067: DOWN.rotateCW = LEFT;
068: LEFT.rotateCW = UP;
069: }
070:
071: private transient Direction rotateCW;
072: private transient boolean isHorizontal;
073:
074: private Direction(int value, String name, boolean isHorizontal) {
075: super (value, name);
076: this .isHorizontal = isHorizontal;
077: }
078:
079: /**
080: * Returns the direction that is one quarter of a revolution clock wise.
081: *
082: * @return the direction that is one quarter of a revolution clock wise
083: */
084: public Direction getNextCW() {
085: return rotateCW;
086: }
087:
088: /**
089: * Returns the direction that is one quarter of a revolution counter clock wise.
090: *
091: * @return the direction that is one quarter of a revolution counter clock wise
092: */
093: public Direction getNextCCW() {
094: return rotateCW.rotateCW.rotateCW;
095: }
096:
097: /**
098: * Returns true if the direction is horizontal.
099: *
100: * @return true if the direction is horizontal
101: */
102: public boolean isHorizontal() {
103: return isHorizontal;
104: }
105:
106: /**
107: * Returns the opposite direction.
108: *
109: * @return the opposite direction
110: */
111: public Direction getOpposite() {
112: return getNextCW().getNextCW();
113: }
114:
115: /**
116: * Gets all directions.
117: *
118: * @return all directions
119: * @since 1.1.0
120: */
121: public static Direction[] getDirections() {
122: return (Direction[]) DIRECTIONS.clone();
123: }
124:
125: /**
126: * Decodes a direction from a stream.
127: *
128: * @param in the stream containing the direction
129: * @return the direction
130: * @throws IOException if there is a stream error
131: */
132: public static Direction decode(ObjectInputStream in)
133: throws IOException {
134: return (Direction) decode(Direction.class, in);
135: }
136:
137: }
|