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
044package org.jfree.data.gantt;
045
046import java.io.Serializable;
047import java.util.Date;
048import java.util.List;
049
050import org.jfree.data.time.SimpleTimePeriod;
051import org.jfree.data.time.TimePeriod;
052import org.jfree.util.ObjectUtilities;
053import 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 */
059public 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}