    001    /* ===========================================================
    002     * JFreeChart : a free chart library for the Java(tm) platform
    003     * ===========================================================
    004     *
    005     * (C) Copyright 2000-2008, 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-2008, by Object Refinery Limited.
    031     *
    032     * Original Author:  David Gilbert (for Object Refinery Limited);
    033     * Contributor(s):   -;
    034     *
    035     * Changes
    036     * -------
    037     * 10-Jan-2003 : Version 1 (DG);
    038     * 16-Sep-2003 : Added percentage complete (DG);
    039     * 30-Jul-2004 : Added clone() and equals() methods and implemented
    040     *               Serializable (DG);
    041     *
    042     */
    043
    044    package org.jfree.data.gantt;
    045
    046    import java.io.Serializable;
    047    import java.util.Date;
    048    import java.util.List;
    049
    050    import org.jfree.data.time.SimpleTimePeriod;
    051    import org.jfree.data.time.TimePeriod;
    052    import org.jfree.util.ObjectUtilities;
    053    import org.jfree.util.PublicCloneable;
    054
    055    /**
    056     * A simple representation of a task.  The task has a description and a
    057     * duration.  You can add sub-tasks to the task.
    058     */
    059    public class Task implements Cloneable, PublicCloneable, Serializable {
    060
    061        /** For serialization. */
    062        private static final long serialVersionUID = 1094303785346988894L;
    063
    064        /** The task description. */
    065        private String description;
    066
    067        /** The time period for the task (estimated or actual). */
    068        private TimePeriod duration;
    069
    070        /** The percent complete (<code>null</code> is permitted). */
    071        private Double percentComplete;
    072
    073        /** Storage for the sub-tasks (if any). */
    074        private List subtasks;
    075
    076        /**
    077         * Creates a new task.
    078         *
    079         * @param description  the task description (<code>null</code> not
    080         *                     permitted).
    081         * @param duration  the task duration (<code>null</code> permitted).
    082         */
    083        public Task(String description, TimePeriod duration) {
    084            if (description == null) {
    085                throw new IllegalArgumentException("Null 'description' argument.");
    086            }
    087            this.description = description;
    088            this.duration = duration;
    089            this.percentComplete = null;
    090            this.subtasks = new java.util.ArrayList();
    091        }
    092
    093        /**
    094         * Creates a new task.
    095         *
    096         * @param description  the task description (<code>null</code> not
    097         *                     permitted).
    098         * @param start  the start date (<code>null</code> not permitted).
    099         * @param end  the end date (<code>null</code> not permitted).
    100         */
    101        public Task(String description, Date start, Date end) {
    102            this(description, new SimpleTimePeriod(start, end));
    103        }
    104
    105        /**
    106         * Returns the task description.
    107         *
    108         * @return The task description (never <code>null</code>).
    109         */
    110        public String getDescription() {
    111            return this.description;
    112        }
    113
    114        /**
    115         * Sets the task description.
    116         *
    117         * @param description  the description (<code>null</code> not permitted).
    118         */
    119        public void setDescription(String description) {
    120            if (description == null) {
    121                throw new IllegalArgumentException("Null 'description' argument.");
    122            }
    123            this.description = description;
    124        }
    125
    126        /**
    127         * Returns the duration (actual or estimated) of the task.
    128         *
    129         * @return The task duration (possibly <code>null</code>).
    130         */
    131        public TimePeriod getDuration() {
    132            return this.duration;
    133        }
    134
    135        /**
    136         * Sets the task duration (actual or estimated).
    137         *
    138         * @param duration  the duration (<code>null</code> permitted).
    139         */
    140        public void setDuration(TimePeriod duration) {
    141            this.duration = duration;
    142        }
    143
    144        /**
    145         * Returns the percentage complete for this task.
    146         *
    147         * @return The percentage complete (possibly <code>null</code>).
    148         */
    149        public Double getPercentComplete() {
    150            return this.percentComplete;
    151        }
    152
    153        /**
    154         * Sets the percentage complete for the task.
    155         *
    156         * @param percent  the percentage (<code>null</code> permitted).
    157         */
    158        public void setPercentComplete(Double percent) {
    159            this.percentComplete = percent;
    160        }
    161
    162        /**
    163         * Sets the percentage complete for the task.
    164         *
    165         * @param percent  the percentage.
    166         */
    167        public void setPercentComplete(double percent) {
    168            setPercentComplete(new Double(percent));
    169        }
    170
    171        /**
    172         * Adds a sub-task to the task.
    173         *
    174         * @param subtask  the subtask (<code>null</code> not permitted).
    175         */
    176        public void addSubtask(Task subtask) {
    177            if (subtask == null) {
    178                throw new IllegalArgumentException("Null 'subtask' argument.");
    179            }
    180            this.subtasks.add(subtask);
    181        }
    182
    183        /**
    184         * Removes a sub-task from the task.
    185         *
    186         * @param subtask  the subtask.
    187         */
    188        public void removeSubtask(Task subtask) {
    189            this.subtasks.remove(subtask);
    190        }
    191
    192        /**
    193         * Returns the sub-task count.
    194         *
    195         * @return The sub-task count.
    196         */
    197        public int getSubtaskCount() {
    198            return this.subtasks.size();
    199        }
    200
    201        /**
    202         * Returns a sub-task.
    203         *
    204         * @param index  the index.
    205         *
    206         * @return The sub-task.
    207         */
    208        public Task getSubtask(int index) {
    209            return (Task) this.subtasks.get(index);
    210        }
    211
    212        /**
    213         * Tests this object for equality with an arbitrary object.
    214         *
    215         * @param object  the other object (<code>null</code> permitted).
    216         *
    217         * @return A boolean.
    218         */
    219        public boolean equals(Object object) {
    220            if (object == this) {
    221                return true;
    222            }
    223            if (!(object instanceof Task)) {
    224                return false;
    225            }
    226            Task that = (Task) object;
    227            if (!ObjectUtilities.equal(this.description, that.description)) {
    228                return false;
    229            }
    230            if (!ObjectUtilities.equal(this.duration, that.duration)) {
    231                return false;
    232            }
    233            if (!ObjectUtilities.equal(this.percentComplete,
    234                    that.percentComplete)) {
    235                return false;
    236            }
    237            if (!ObjectUtilities.equal(this.subtasks, that.subtasks)) {
    238                return false;
    239            }
    240            return true;
    241        }
    242
    243        /**
    244         * Returns a clone of the task.
    245         *
    246         * @return A clone.
    247         *
    248         * @throws CloneNotSupportedException  never thrown by this class, but
    249         *         subclasses may not support cloning.
    250         */
    251        public Object clone() throws CloneNotSupportedException {
    252            Task clone = (Task) super.clone();
    253            return clone;
    254        }
    255
    256    }