    001    /* ===========================================================
    002     * JFreeChart : a free chart library for the Java(tm) platform
    003     * ===========================================================
    004     *
    005     * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
    006     *
    007     * Project Info:  http://www.jfree.org/jfreechart/index.html
    008     *
    009     * This library is free software; you can redistribute it and/or modify it
    010     * under the terms of the GNU Lesser General Public License as published by
    011     * the Free Software Foundation; either version 2.1 of the License, or
    012     * (at your option) any later version.
    013     *
    014     * This library is distributed in the hope that it will be useful, but
    015     * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
    016     * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
    017     * License for more details.
    018     *
    019     * You should have received a copy of the GNU Lesser General Public
    020     * License along with this library; if not, write to the Free Software
    021     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
    022     * USA.
    023     *
    024     * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
    025     * in the United States and other countries.]
    026     *
    027     * ---------
    028     * Task.java
    029     * ---------
    030     * (C) Copyright 2003, 2004, by Object Refinery Limited.
    031     *
    032     * Original Author:  David Gilbert (for Object Refinery Limited);
    033     * Contributor(s):   -;
    034     *
    035     * $Id: Task.java,v 1.4.2.1 2005/10/25 21:31:44 mungady Exp $
    036     *
    037     * Changes
    038     * -------
    039     * 10-Jan-2003 : Version 1 (DG);
    040     * 16-Sep-2003 : Added percentage complete (DG);
    041     * 30-Jul-2004 : Added clone() and equals() methods and implemented
    042     *               Serializable (DG);
    043     *
    044     */
    045
    046    package org.jfree.data.gantt;
    047
    048    import java.io.Serializable;
    049    import java.util.Date;
    050    import java.util.List;
    051
    052    import org.jfree.data.time.SimpleTimePeriod;
    053    import org.jfree.data.time.TimePeriod;
    054    import org.jfree.util.ObjectUtilities;
    055    import org.jfree.util.PublicCloneable;
    056
    057    /**
    058     * A simple representation of a task.  The task has a description and a
    059     * duration.  You can add sub-tasks to the task.
    060     */
    061    public class Task implements Cloneable, PublicCloneable, Serializable {
    062
    063        /** For serialization. */
    064        private static final long serialVersionUID = 1094303785346988894L;
    065
    066        /** The task description. */
    067        private String description;
    068
    069        /** The time period for the task (estimated or actual). */
    070        private TimePeriod duration;
    071
    072        /** The percent complete (<code>null</code> is permitted). */
    073        private Double percentComplete;
    074
    075        /** Storage for the sub-tasks (if any). */
    076        private List subtasks;
    077
    078        /**
    079         * Creates a new task.
    080         *
    081         * @param description  the task description (<code>null</code> not
    082         *                     permitted).
    083         * @param duration  the task duration (<code>null</code> permitted).
    084         */
    085        public Task(String description, TimePeriod duration) {
    086            if (description == null) {
    087                throw new IllegalArgumentException("Null 'description' argument.");
    088            }
    089            this.description = description;
    090            this.duration = duration;
    091            this.percentComplete = null;
    092            this.subtasks = new java.util.ArrayList();
    093        }
    094
    095        /**
    096         * Creates a new task.
    097         *
    098         * @param description  the task description (<code>null</code> not
    099         *                     permitted).
    100         * @param start  the start date (<code>null</code> not permitted).
    101         * @param end  the end date (<code>null</code> not permitted).
    102         */
    103        public Task(String description, Date start, Date end) {
    104            this(description, new SimpleTimePeriod(start, end));
    105        }
    106
    107        /**
    108         * Returns the task description.
    109         *
    110         * @return The task description (never <code>null</code>).
    111         */
    112        public String getDescription() {
    113            return this.description;
    114        }
    115
    116        /**
    117         * Sets the task description.
    118         *
    119         * @param description  the description (<code>null</code> not permitted).
    120         */
    121        public void setDescription(String description) {
    122            if (description == null) {
    123                throw new IllegalArgumentException("Null 'description' argument.");
    124            }
    125            this.description = description;
    126        }
    127
    128        /**
    129         * Returns the duration (actual or estimated) of the task.
    130         *
    131         * @return The task duration (possibly <code>null</code>).
    132         */
    133        public TimePeriod getDuration() {
    134            return this.duration;
    135        }
    136
    137        /**
    138         * Sets the task duration (actual or estimated).
    139         *
    140         * @param duration  the duration (<code>null</code> permitted).
    141         */
    142        public void setDuration(TimePeriod duration) {
    143            this.duration = duration;
    144        }
    145
    146        /**
    147         * Returns the percentage complete for this task.
    148         *
    149         * @return The percentage complete (possibly <code>null</code>).
    150         */
    151        public Double getPercentComplete() {
    152            return this.percentComplete;
    153        }
    154
    155        /**
    156         * Sets the percentage complete for the task.
    157         *
    158         * @param percent  the percentage (<code>null</code> permitted).
    159         */
    160        public void setPercentComplete(Double percent) {
    161            this.percentComplete = percent;
    162        }
    163
    164        /**
    165         * Sets the percentage complete for the task.
    166         *
    167         * @param percent  the percentage.
    168         */
    169        public void setPercentComplete(double percent) {
    170            setPercentComplete(new Double(percent));
    171        }
    172
    173        /**
    174         * Adds a sub-task to the task.
    175         *
    176         * @param subtask  the subtask (<code>null</code> not permitted).
    177         */
    178        public void addSubtask(Task subtask) {
    179            if (subtask == null) {
    180                throw new IllegalArgumentException("Null 'subtask' argument.");
    181            }
    182            this.subtasks.add(subtask);
    183        }
    184
    185        /**
    186         * Removes a sub-task from the task.
    187         *
    188         * @param subtask  the subtask.
    189         */
    190        public void removeSubtask(Task subtask) {
    191            this.subtasks.remove(subtask);
    192        }
    193
    194        /**
    195         * Returns the sub-task count.
    196         *
    197         * @return The sub-task count.
    198         */
    199        public int getSubtaskCount() {
    200            return this.subtasks.size();
    201        }
    202
    203        /**
    204         * Returns a sub-task.
    205         *
    206         * @param index  the index.
    207         *
    208         * @return The sub-task.
    209         */
    210        public Task getSubtask(int index) {
    211            return (Task) this.subtasks.get(index);
    212        }
    213
    214        /**
    215         * Tests this object for equality with an arbitrary object.
    216         *
    217         * @param object  the other object (<code>null</code> permitted).
    218         *
    219         * @return A boolean.
    220         */
    221        public boolean equals(Object object) {
    222            if (object == this) {
    223                return true;
    224            }
    225            if (!(object instanceof Task)) {
    226                return false;
    227            }
    228            Task that = (Task) object;
    229            if (!ObjectUtilities.equal(this.description, that.description)) {
    230                return false;
    231            }
    232            if (!ObjectUtilities.equal(this.duration, that.duration)) {
    233                return false;
    234            }
    235            if (!ObjectUtilities.equal(this.percentComplete,
    236                    that.percentComplete)) {
    237                return false;
    238            }
    239            if (!ObjectUtilities.equal(this.subtasks, that.subtasks)) {
    240                return false;
    241            }
    242            return true;
    243        }
    244
    245        /**
    246         * Returns a clone of the task.
    247         *
    248         * @return A clone.
    249         *
    250         * @throws CloneNotSupportedException  never thrown by this class, but
    251         *         subclasses may not support cloning.
    252         */
    253        public Object clone() throws CloneNotSupportedException {
    254            Task clone = (Task) super.clone();
    255            return clone;
    256        }
    257
    258    }