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    }