1 19 20 package org.netbeans.modules.tasklist.usertasks.translators; 21 22 import java.util.ArrayList ; 23 import java.util.Calendar ; 24 import java.util.Collections ; 25 import java.util.Comparator ; 26 import java.util.Date ; 27 import java.util.List ; 28 import org.netbeans.modules.tasklist.usertasks.model.UserTask; 29 import org.netbeans.modules.tasklist.usertasks.model.UserTask.WorkPeriod; 30 import org.netbeans.modules.tasklist.usertasks.model.UserTaskList; 31 import org.netbeans.modules.tasklist.usertasks.util.UnaryFunction; 32 33 38 public class SpentTimesUserTaskProcessor implements UnaryFunction { 39 private static int[] FIELDS = { 40 Calendar.DAY_OF_YEAR, 41 Calendar.WEEK_OF_YEAR, 42 Calendar.MONTH, 43 Calendar.MONTH, 44 Calendar.YEAR 45 }; 46 private static int[] FIELD_ADDS = { 47 1, 48 1, 49 1, 50 3, 51 1 52 }; 53 54 private Date from; 55 private Date to; 56 private int minDuration; 57 private HistoryOptionsPanel.Group group; 58 59 private Comparator comp; 60 private List <long[]> durations = new ArrayList <long[]>(); 61 private List <Date > periods = new ArrayList <Date >(); 62 63 71 public SpentTimesUserTaskProcessor(Date from, Date to, 72 HistoryOptionsPanel.Group group, int minDuration) { 73 this.from = from; 74 this.to = to; 75 this.group = group; 76 this.minDuration = minDuration; 77 78 int field = FIELDS[group.ordinal()]; 79 int add = FIELD_ADDS[group.ordinal()]; 80 Calendar c = Calendar.getInstance(); 81 c.setTime(from); 82 switch (group) { 83 case DAILY: 84 break; 85 case WEEKLY: 86 c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek()); 87 break; 88 case MONTHLY: 89 c.set(Calendar.DAY_OF_MONTH, 1); 90 break; 91 case QUARTERLY: 92 c.set(Calendar.MONTH, c.get(Calendar.MONTH) / 3 * 3); 93 c.set(Calendar.DAY_OF_MONTH, 1); 94 break; 95 case YEARLY: 96 c.set(Calendar.DAY_OF_YEAR, 1); 97 break; 98 } 99 100 while (c.getTime().compareTo(to) < 0) { 101 periods.add(c.getTime()); 102 c.add(field, add); 103 } 104 periods.add(c.getTime()); 105 } 106 107 113 public List <Date > getPeriods() { 114 return periods; 115 } 116 117 122 public List <long[]> getDurations() { 123 return durations; 124 } 125 126 134 private long overlap(long start, long end, long start2, long end2) { 135 if (start2 >= end || end2 <= start) 136 return 0; 137 138 return Math.min(end, end2) - Math.max(start, start2); 139 } 140 141 public Object compute(Object obj) { 142 UserTaskInfo info = (UserTaskInfo) obj; 143 info.spentTimes = new long[periods.size() - 1]; 144 if ((info.object instanceof UserTask) && 145 !((UserTask) info.object).isValuesComputed()) { 146 for (WorkPeriod wp: ((UserTask) info.object).getWorkPeriods()) { 147 for (int i = 0; i < periods.size() - 1; i++) { 148 long ov = overlap(wp.getStart(), wp.getStart() + 149 wp.getDuration() * 60L * 1000, 150 periods.get(i).getTime(), 151 periods.get(i + 1).getTime()); 152 if (ov != 0) { 153 info.spentTimes[i] += ov; 154 } 155 } 156 } 157 } else { 158 for (UserTaskInfo ch: info.children) { 159 for (int i = 0; i < info.spentTimes.length; i++) { 160 info.spentTimes[i] += ch.spentTimes[i]; 161 } 162 } 163 } 164 return null; 165 } 166 } 167 | Popular Tags |