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 }