View Javadoc

1   /*
2    * CurrentRowOrColumnNumber.java Created @ Jun 16, 2004
3    * 
4    * 
5    * Copyright (c) 2003-2005 Delft University of Technology, Jaffalaan 5, 2628 BX
6    * Delft, the Netherlands. All rights reserved.
7    * 
8    * See for project information <a href="http://www.simulation.tudelft.nl/">
9    * www.simulation.tudelft.nl </a>.
10   * 
11   * The source code and binary code of this software is proprietary information
12   * of Delft University of Technology.
13   */
14  
15  package org.gscg.common.interactionlayer.timecontrol;
16  
17  import java.io.IOException;
18  import java.io.ObjectOutputStream;
19  import java.io.Serializable;
20  import java.rmi.RemoteException;
21  import java.text.DateFormat;
22  import java.util.ArrayList;
23  import java.util.Calendar;
24  import java.util.HashMap;
25  
26  import nl.tudelft.simulation.dsol.experiment.TimeUnit;
27  import nl.tudelft.simulation.dsol.experiment.TimeUnitInterface;
28  import nl.tudelft.simulation.dsol.simulators.SimulatorInterface;
29  import nl.tudelft.simulation.event.Event;
30  import nl.tudelft.simulation.event.EventInterface;
31  import nl.tudelft.simulation.event.EventListenerInterface;
32  import nl.tudelft.simulation.event.EventProducer;
33  import nl.tudelft.simulation.event.EventType;
34  import nl.tudelft.simulation.logger.Logger;
35  
36  import org.gscg.singleuser.interactionlayer.dataobjects.CurrentRowOrColumnData;
37  
38  /***
39   * The RowOrColumnNumber calculates the row or column which should be selected
40   * according to the time in the simulation. Implementing row or column control
41   * in this way makes sure that not every actor in a game is going to perform
42   * this expensive code every time for itself, instead we use a 'global'
43   * approach, and thus increase our performance.
44   * <p>
45   * 
46   * Copyright (c) 2003-2005 Delft University of Technology, Jaffalaan 5, 2628 BX
47   * Delft, the Netherlands. All rights reserved.
48   * 
49   * See for project information <a href="http://www.simulation.tudelft.nl/">
50   * www.simulation.tudelft.nl </a>.
51   * 
52   * The source code and binary code of this software is proprietary information
53   * of Delft University of Technology.
54   * 
55   * @author <a
56   *         href="http://www.tbm.tudelft.nl/webstaf/stijnh/index.htm">Stijn-Pieter
57   *         van Houten </a>
58   * @version $Revision: 1.2 $ $Date: 2005/08/09 20:49:45 $
59   * @since 1.1.1
60   */
61  public class GlobalRowOrColumnNumber implements Serializable
62  {
63  	/*** the serial version uid */
64  	private static final long serialVersionUID = 11L;
65  
66  	/***
67  	 * fired when the current row or column must be updated according to the
68  	 * simulation time
69  	 */
70  	public static final EventType UPDATE_CURRENT_DAY = new EventType(
71  			"UPDATE_CURRENT_DAY");
72  
73  	/***
74  	 * fired when the current row or column must be updated according to the
75  	 * simulation time
76  	 */
77  	public static final EventType UPDATE_CURRENT_WEEK = new EventType(
78  			"UPDATE_CURRENT_WEEK");
79  
80  	/***
81  	 * fired when the current row or column must be updated according to the
82  	 * simulation time
83  	 */
84  	public static final EventType UPDATE_CURRENT_MONTH = new EventType(
85  			"UPDATE_CURRENT_MONTH");
86  
87  	/*** fired when the date in the game has changed */
88  	public static final EventType UPDATE_CURRENT_DATE = new EventType(
89  			"UPDATE_CURRENT_DATE");
90  
91  	/***
92  	 * fired when the all the columns and rows must be updated according to the
93  	 * simulation time
94  	 */
95  	public static final EventType UPDATE_CURRENT_DATES = new EventType(
96  			"UPDATE_CURRENT_DATES");
97  
98  	/*** fired to indicate the total number of days in the simulation */
99  	public static final EventType TOTAL_NUMBER_OF_DAYS = new EventType(
100 			"TOTAL_NUMBER_OF_DAYS");
101 
102 	/*** the current number */
103 	private static int currentNumberDay = 0;
104 
105 	/*** the current number */
106 	private static int currentNumberWeek = 0;
107 
108 	/*** the current number */
109 	private static int currentNumberMonth = 0;
110 
111 	/*** the number of days */
112 	private static int numberOfDays = 0;
113 
114 	/*** links a week number to a table row number */
115 	private static HashMap dayNumberTableRowNumber = new HashMap();
116 
117 	/*** links a week number to a table row number */
118 	private static HashMap weekNumberTableRowNumber = new HashMap();
119 
120 	/*** links a week number to a table row number */
121 	private static HashMap monthNumberTableRowNumber = new HashMap();
122 
123 	/*** the progress calendar */
124 	private static Calendar progressCalendar = Calendar.getInstance();
125 
126 	/*** the static progress data and time instance */
127 	private static GlobalRowOrColumnNumber globalRowOrColumnNumber = null;
128 
129 	/*** the day header values */
130 	private static ArrayList dayHeaderValues = new ArrayList();
131 
132 	/*** the week header values */
133 	private static ArrayList weekHeaderValues = new ArrayList();
134 
135 	/*** the month header values */
136 	private static ArrayList monthHeaderValues = new ArrayList();
137 
138 	/*** the runlength determines the length of the simulation */
139 	private static int runLength = 0;
140 
141 	/*** the start time in milliseconds */
142 	private static long startTime = 0L;
143 
144 	/*** the time unit of the simulation */
145 	private static TimeUnitInterface simulatorTimeUnit = null;
146 
147 	/*** the current day */
148 	private static int currentDay = 0;
149 
150 	/*** the current week */
151 	private static int currentWeek = 0;
152 
153 	/*** the current month */
154 	private static int currentMonth = 0;
155 
156 	/*** the event producer */
157 	private CustomEventProducer customEventProducer = null;
158 
159 	/*** the event listener */
160 	private CustomEventListener customEventListener = null;
161 
162 	/*** the simulator */
163 	private SimulatorInterface simulator = null;
164 
165 	/***
166 	 * constructs a new GlobalRowOrColumnNumber
167 	 * 
168 	 * @param simulator the simulator
169 	 */
170 	public GlobalRowOrColumnNumber(final SimulatorInterface simulator)
171 	{
172 		super();
173 		GlobalRowOrColumnNumber.globalRowOrColumnNumber = this;
174 		this.simulator = simulator;
175 		this.customEventListener = new CustomEventListener();
176 		this.customEventProducer = new CustomEventProducer();
177 
178 		try
179 		{
180 			this.simulator.addListener(this.customEventListener,
181 					SimulatorInterface.TIME_CHANGED_EVENT);
182 
183 			// set the runLength and startTime
184 			GlobalRowOrColumnNumber.runLength = (int) this.simulator
185 					.getReplication().getRunControl().getRunLength();
186 
187 			GlobalRowOrColumnNumber.startTime = this.simulator.getReplication()
188 					.getRunControl().getTreatment().getStartTime();
189 
190 			GlobalRowOrColumnNumber.simulatorTimeUnit = this.simulator
191 					.getReplication().getRunControl().getTreatment()
192 					.getTimeUnit();
193 
194 			long time = (long) TimeUnit.convert(this.simulator
195 					.getSimulatorTime(),
196 					GlobalRowOrColumnNumber.simulatorTimeUnit,
197 					TimeUnitInterface.MILLISECOND);
198 			GlobalRowOrColumnNumber.progressCalendar
199 					.setTimeInMillis(GlobalRowOrColumnNumber.startTime + time);
200 
201 			// calculate the number of days, weeks and months
202 			GlobalRowOrColumnNumber.calculateNumberOfDays();
203 			GlobalRowOrColumnNumber.calculateNumberOfWeeks();
204 			GlobalRowOrColumnNumber.calculateNumberOfMonths();
205 
206 			// we set the initial values, we do this after the above methods are
207 			// called, since they are used by them
208 			GlobalRowOrColumnNumber.currentDay = GlobalRowOrColumnNumber.progressCalendar
209 					.get(Calendar.DAY_OF_YEAR);
210 			GlobalRowOrColumnNumber.currentWeek = GlobalRowOrColumnNumber.progressCalendar
211 					.get(Calendar.WEEK_OF_YEAR);
212 			GlobalRowOrColumnNumber.currentMonth = GlobalRowOrColumnNumber.progressCalendar
213 					.get(Calendar.MONTH);
214 		} catch (Exception exception)
215 		{
216 			exception.printStackTrace();
217 			Logger.severe(this, "Economics", exception);
218 		}
219 	}
220 
221 	/***
222 	 * Method calculateNumberOfColumns.
223 	 */
224 	private static void calculateNumberOfDays()
225 	{
226 		if (GlobalRowOrColumnNumber.runLength != 0)
227 		{
228 			Calendar calendar = Calendar.getInstance();
229 			calendar.setTimeInMillis(GlobalRowOrColumnNumber.startTime);
230 			try
231 			{
232 				GlobalRowOrColumnNumber.numberOfDays = (int) TimeUnit
233 						.convert(
234 								GlobalRowOrColumnNumber.runLength,
235 								GlobalRowOrColumnNumber.globalRowOrColumnNumber.simulator
236 										.getReplication().getRunControl()
237 										.getTreatment().getTimeUnit(),
238 								TimeUnitInterface.DAY);
239 
240 				// we add one day to the number of days to prevent array out of
241 				// bounds exceptions in a user interface
242 				GlobalRowOrColumnNumber.numberOfDays++;
243 				GlobalRowOrColumnNumber.currentDay = calendar
244 						.get(Calendar.DAY_OF_YEAR);
245 
246 				// used when the runlength of an interactive simulation is
247 				// spanned over two or more calendar years
248 				int additionalDays = 0;
249 
250 				for (int i = 0; i < GlobalRowOrColumnNumber.numberOfDays; i++)
251 				{
252 					int year = calendar.get(Calendar.YEAR);
253 					calendar.setTimeInMillis(GlobalRowOrColumnNumber.startTime
254 							+ (TimeUnitInterface.DAY.getValue() * i));
255 
256 					// a year has passed, add the additional days!
257 					if (calendar.get(Calendar.YEAR) > year)
258 					{
259 						calendar
260 								.setTimeInMillis(GlobalRowOrColumnNumber.startTime
261 										+ (TimeUnitInterface.DAY.getValue() * i - 1));
262 
263 						additionalDays += calendar
264 								.getActualMaximum(Calendar.DAY_OF_YEAR);
265 
266 						calendar
267 								.setTimeInMillis(GlobalRowOrColumnNumber.startTime
268 										+ (TimeUnitInterface.DAY.getValue() * i));
269 					}
270 
271 					// check for double values
272 					if (GlobalRowOrColumnNumber.dayNumberTableRowNumber
273 							.get(new Integer(
274 									(calendar.get(Calendar.DAY_OF_YEAR) + additionalDays))) == null)
275 					{
276 						GlobalRowOrColumnNumber.dayHeaderValues.add(DateFormat
277 								.getDateInstance().format(calendar.getTime()));
278 
279 						GlobalRowOrColumnNumber.dayNumberTableRowNumber
280 								.put(
281 										new Integer(
282 												(calendar
283 														.get(Calendar.DAY_OF_YEAR) + additionalDays)),
284 										new Integer(i));
285 					}
286 				}
287 
288 				// add some empty rows or colums for layout reasons
289 				if (GlobalRowOrColumnNumber.numberOfDays < 13)
290 				{
291 					for (int i = 0; i < 10 - GlobalRowOrColumnNumber.numberOfDays; i++)
292 					{
293 						GlobalRowOrColumnNumber.dayHeaderValues.add("");
294 					}
295 				}
296 			} catch (RemoteException remoteException)
297 			{
298 				Logger.severe(GlobalRowOrColumnNumber.class,
299 						"CalculateNumberOfColumns", remoteException);
300 			}
301 		} else
302 		{
303 			Logger.severe(GlobalRowOrColumnNumber.class,
304 					"calculateNumberOfCoumns", "Number of columns is 0");
305 		}
306 	}
307 
308 	/***
309 	 * Method calculateNumberOfWeeks.
310 	 */
311 	private static synchronized void calculateNumberOfWeeks()
312 	{
313 		Calendar calendar = Calendar.getInstance();
314 		calendar.setTimeInMillis(GlobalRowOrColumnNumber.startTime);
315 
316 		int weekResidu = calendar.getActualMaximum(Calendar.DAY_OF_WEEK)
317 				- calendar.get(Calendar.DAY_OF_WEEK);
318 
319 		int daysLeft = GlobalRowOrColumnNumber.numberOfDays - weekResidu;
320 		int weekCounter = 0;
321 		int lastValue = 0;
322 
323 		Calendar weekCalendar = Calendar.getInstance();
324 		weekCalendar.setTime(calendar.getTime());
325 
326 		GlobalRowOrColumnNumber.weekHeaderValues.add(DateFormat
327 				.getDateInstance().format(weekCalendar.getTime()));
328 		GlobalRowOrColumnNumber.currentWeek = weekCalendar
329 				.get(Calendar.WEEK_OF_YEAR);
330 		lastValue = GlobalRowOrColumnNumber.currentWeek;
331 
332 		// used in the case we are in the last week of a year
333 		int additionalWeeks = 0;
334 
335 		if (GlobalRowOrColumnNumber.currentWeek == 52)
336 		{
337 			additionalWeeks += 52;
338 		}
339 
340 		GlobalRowOrColumnNumber.weekNumberTableRowNumber.put(new Integer(
341 				GlobalRowOrColumnNumber.currentWeek), new Integer(weekCounter));
342 
343 		weekCalendar.setTimeInMillis(weekCalendar.getTimeInMillis()
344 				+ ((weekResidu + 1) * TimeUnitInterface.DAY.getValue()));
345 
346 		while (daysLeft >= weekCalendar.getActualMaximum(Calendar.DAY_OF_WEEK))
347 		{
348 			weekCounter++;
349 			int daysInWeek = weekCalendar
350 					.getActualMaximum(Calendar.DAY_OF_WEEK);
351 			daysLeft -= daysInWeek;
352 
353 			// occasionally the weeknumber is 53
354 			if (weekCalendar.get(Calendar.WEEK_OF_YEAR) == 53)
355 			{
356 				additionalWeeks -= 52;
357 				GlobalRowOrColumnNumber.currentWeek = weekCalendar
358 						.get(Calendar.WEEK_OF_YEAR)
359 						+ additionalWeeks;
360 				additionalWeeks += 52;
361 			} else
362 			{
363 				GlobalRowOrColumnNumber.currentWeek = weekCalendar
364 						.get(Calendar.WEEK_OF_YEAR)
365 						+ additionalWeeks;
366 
367 				// for some crazy reason sometimes the program immediately
368 				// jumps to a value of 104
369 				// this results in 52 -- 0, 104--1, which eventually
370 				// leads to nullpointer exceptions elsewhere
371 				// this is very ugly code, however it seems to work....
372 				if (lastValue == 52
373 						&& GlobalRowOrColumnNumber.currentWeek == 104)
374 				{
375 					GlobalRowOrColumnNumber.currentWeek = 52;
376 					additionalWeeks -= 52;
377 				}
378 			}
379 
380 			// check for double values
381 			if (GlobalRowOrColumnNumber.weekNumberTableRowNumber
382 					.get(new Integer(GlobalRowOrColumnNumber.currentWeek)) != null)
383 			{
384 				weekCounter += 1;
385 			}
386 			GlobalRowOrColumnNumber.weekNumberTableRowNumber.put(new Integer(
387 					GlobalRowOrColumnNumber.currentWeek), new Integer(
388 					weekCounter));
389 			GlobalRowOrColumnNumber.weekHeaderValues.add(DateFormat
390 					.getDateInstance().format(weekCalendar.getTime()));
391 
392 			if ((GlobalRowOrColumnNumber.currentWeek % 52) == 0)
393 			{
394 				additionalWeeks += 52;
395 			}
396 
397 			weekCalendar.setTimeInMillis(weekCalendar.getTimeInMillis()
398 					+ (daysInWeek * TimeUnitInterface.DAY.getValue()));
399 
400 			lastValue = GlobalRowOrColumnNumber.currentWeek;
401 		}
402 
403 		if (daysLeft > 0)
404 		{
405 			weekCounter++;
406 			GlobalRowOrColumnNumber.weekHeaderValues.add(DateFormat
407 					.getDateInstance().format(weekCalendar.getTime()));
408 		}
409 
410 		// add some empty rows or colums for layout reasons
411 		if (weekCounter < 13)
412 		{
413 			for (int i = 0; i < 10 - weekCounter; i++)
414 			{
415 				GlobalRowOrColumnNumber.weekHeaderValues.add("");
416 			}
417 		}
418 	}
419 
420 	/***
421 	 * Method calculateNumberOfMonths.
422 	 */
423 	private static void calculateNumberOfMonths()
424 	{
425 		Calendar calendar = Calendar.getInstance();
426 		calendar.setTimeInMillis(GlobalRowOrColumnNumber.startTime);
427 
428 		int monthResidu = calendar.getActualMaximum(Calendar.DAY_OF_MONTH)
429 				- calendar.get(Calendar.DAY_OF_MONTH);
430 
431 		int daysLeft = GlobalRowOrColumnNumber.numberOfDays - monthResidu;
432 
433 		int monthCounter = 0;
434 
435 		Calendar monthCalendar = Calendar.getInstance();
436 		monthCalendar.setTime(calendar.getTime());
437 
438 		GlobalRowOrColumnNumber.monthHeaderValues.add(DateFormat
439 				.getDateInstance().format(monthCalendar.getTime()));
440 		GlobalRowOrColumnNumber.currentMonth = monthCalendar
441 				.get(Calendar.MONTH);
442 
443 		// used when the runlength of an interactive simulation is spanned over
444 		// two or more calendar years
445 		int additionalMonths = 0;
446 
447 		// in the unlikely event we start in the last month of a year
448 		if (GlobalRowOrColumnNumber.currentMonth == 11)
449 		{
450 			additionalMonths += 12;
451 		}
452 
453 		GlobalRowOrColumnNumber.monthNumberTableRowNumber.put(new Integer(
454 				GlobalRowOrColumnNumber.currentMonth),
455 				new Integer(monthCounter));
456 
457 		monthCalendar.setTimeInMillis(monthCalendar.getTimeInMillis()
458 				+ ((monthResidu + 1) * TimeUnitInterface.DAY.getValue()));
459 
460 		while (daysLeft >= monthCalendar
461 				.getActualMaximum(Calendar.DAY_OF_MONTH))
462 		{
463 			monthCounter++;
464 			int daysInMonth = monthCalendar
465 					.getActualMaximum(Calendar.DAY_OF_MONTH);
466 			daysLeft -= daysInMonth;
467 
468 			GlobalRowOrColumnNumber.monthHeaderValues.add(DateFormat
469 					.getDateInstance().format(monthCalendar.getTime()));
470 			GlobalRowOrColumnNumber.currentMonth = monthCalendar
471 					.get(Calendar.MONTH)
472 					+ additionalMonths;
473 			GlobalRowOrColumnNumber.monthNumberTableRowNumber.put(new Integer(
474 					GlobalRowOrColumnNumber.currentMonth), new Integer(
475 					monthCounter));
476 
477 			if (monthCalendar.get(Calendar.MONTH) == 11)
478 			{
479 				additionalMonths += 12;
480 			}
481 			monthCalendar.set(Calendar.MONTH,
482 					monthCalendar.get(Calendar.MONTH) + 1);
483 		}
484 
485 		if (daysLeft > 0)
486 		{
487 			monthCounter++;
488 			GlobalRowOrColumnNumber.monthHeaderValues.add(DateFormat
489 					.getDateInstance().format(monthCalendar.getTime()));
490 		}
491 
492 		// add some empty rows or colums for layout reasons
493 		if (monthCounter < 13)
494 		{
495 			for (int i = 0; i < 10 - monthCounter; i++)
496 			{
497 				GlobalRowOrColumnNumber.monthHeaderValues.add("");
498 			}
499 		}
500 	}
501 
502 	//
503 	// private methods
504 	//
505 	/***
506 	 * writes a serializable method to stream
507 	 * 
508 	 * @param out the outputstream
509 	 * @throws IOException on IOException
510 	 */
511 	private synchronized void writeObject(final ObjectOutputStream out)
512 			throws IOException
513 	{
514 		out.defaultWriteObject();
515 		out.writeObject(new Integer(GlobalRowOrColumnNumber.currentNumberDay));
516 		out.writeObject(new Integer(GlobalRowOrColumnNumber.currentNumberWeek));
517 		out
518 				.writeObject(new Integer(
519 						GlobalRowOrColumnNumber.currentNumberMonth));
520 		out.writeObject(GlobalRowOrColumnNumber.progressCalendar);
521 		out.writeObject(new Integer(GlobalRowOrColumnNumber.numberOfDays));
522 		out.writeObject(new Integer(GlobalRowOrColumnNumber.runLength));
523 		out.writeObject(new Long(GlobalRowOrColumnNumber.startTime));
524 		out.writeObject(GlobalRowOrColumnNumber.simulatorTimeUnit);
525 		out.writeObject(new Integer(GlobalRowOrColumnNumber.currentDay));
526 		out.writeObject(new Integer(GlobalRowOrColumnNumber.currentWeek));
527 		out.writeObject(new Integer(GlobalRowOrColumnNumber.currentMonth));
528 		out.writeObject(GlobalRowOrColumnNumber.dayHeaderValues);
529 		out.writeObject(GlobalRowOrColumnNumber.weekHeaderValues);
530 		out.writeObject(GlobalRowOrColumnNumber.monthHeaderValues);
531 		out.writeObject(GlobalRowOrColumnNumber.dayNumberTableRowNumber);
532 		out.writeObject(GlobalRowOrColumnNumber.weekNumberTableRowNumber);
533 		out.writeObject(GlobalRowOrColumnNumber.monthNumberTableRowNumber);
534 	}
535 
536 	/***
537 	 * reads a serializable method from stream
538 	 * 
539 	 * @param in the inputstream
540 	 */
541 	private synchronized void readObject(final java.io.ObjectInputStream in)
542 	{
543 		try
544 		{
545 			in.defaultReadObject();
546 
547 			// custome deserialize methods
548 			GlobalRowOrColumnNumber.globalRowOrColumnNumber = this;
549 			GlobalRowOrColumnNumber.currentNumberDay = ((Integer) in
550 					.readObject()).intValue();
551 			GlobalRowOrColumnNumber.currentNumberWeek = ((Integer) in
552 					.readObject()).intValue();
553 			GlobalRowOrColumnNumber.currentNumberMonth = ((Integer) in
554 					.readObject()).intValue();
555 			GlobalRowOrColumnNumber.progressCalendar = (Calendar) in
556 					.readObject();
557 			GlobalRowOrColumnNumber.numberOfDays = ((Integer) in.readObject())
558 					.intValue();
559 			GlobalRowOrColumnNumber.runLength = ((Integer) in.readObject())
560 					.intValue();
561 			GlobalRowOrColumnNumber.startTime = ((Long) in.readObject())
562 					.longValue();
563 			GlobalRowOrColumnNumber.simulatorTimeUnit = (TimeUnitInterface) in
564 					.readObject();
565 			GlobalRowOrColumnNumber.currentDay = ((Integer) in.readObject())
566 					.intValue();
567 			GlobalRowOrColumnNumber.currentWeek = ((Integer) in.readObject())
568 					.intValue();
569 			GlobalRowOrColumnNumber.currentMonth = ((Integer) in.readObject())
570 					.intValue();
571 			GlobalRowOrColumnNumber.dayHeaderValues = (ArrayList) in
572 					.readObject();
573 			GlobalRowOrColumnNumber.weekHeaderValues = (ArrayList) in
574 					.readObject();
575 			GlobalRowOrColumnNumber.monthHeaderValues = (ArrayList) in
576 					.readObject();
577 			GlobalRowOrColumnNumber.dayNumberTableRowNumber = (HashMap) in
578 					.readObject();
579 			GlobalRowOrColumnNumber.weekNumberTableRowNumber = (HashMap) in
580 					.readObject();
581 			GlobalRowOrColumnNumber.monthNumberTableRowNumber = (HashMap) in
582 					.readObject();
583 		} catch (Exception exception)
584 		{
585 			exception.printStackTrace();
586 		}
587 	}
588 
589 	//
590 	// GETTERS
591 	//
592 	/***
593 	 * @return Retuns the current number day
594 	 */
595 	public static int getCurrentNumberDay()
596 	{
597 		return GlobalRowOrColumnNumber.currentNumberDay;
598 	}
599 
600 	/***
601 	 * @return Retuns the current number month
602 	 */
603 	public static int getCurrentNumberMonth()
604 	{
605 		return GlobalRowOrColumnNumber.currentNumberMonth;
606 	}
607 
608 	/***
609 	 * @return Retuns the current number week
610 	 */
611 	public static int getCurrentNumberWeek()
612 	{
613 		return GlobalRowOrColumnNumber.currentNumberWeek;
614 	}
615 
616 	/***
617 	 * @return Retuns the day header values
618 	 */
619 	public static ArrayList getDayHeaderValues()
620 	{
621 		return GlobalRowOrColumnNumber.dayHeaderValues;
622 	}
623 
624 	/***
625 	 * @return Retuns the week header values
626 	 */
627 	public static ArrayList getWeekHeaderValues()
628 	{
629 		return GlobalRowOrColumnNumber.weekHeaderValues;
630 	}
631 
632 	/***
633 	 * @return Retuns the month header values
634 	 */
635 	public static ArrayList getMonthHeaderValues()
636 	{
637 		return GlobalRowOrColumnNumber.monthHeaderValues;
638 	}
639 
640 	/***
641 	 * @return Retuns the GlobalRowOrColumnNumber instance
642 	 */
643 	public static GlobalRowOrColumnNumber getGlobalRowOrColumnNumber()
644 	{
645 		return GlobalRowOrColumnNumber.globalRowOrColumnNumber;
646 	}
647 
648 	/***
649 	 * @return Retuns the day number table row number
650 	 */
651 	public static HashMap getDayNumberTableRowNumber()
652 	{
653 		return GlobalRowOrColumnNumber.dayNumberTableRowNumber;
654 	}
655 
656 	/***
657 	 * @return Retuns the week number table row number
658 	 */
659 	public static HashMap getWeekNumberTableRowNumber()
660 	{
661 		return GlobalRowOrColumnNumber.weekNumberTableRowNumber;
662 	}
663 
664 	/***
665 	 * @return Retuns the month number table row number
666 	 */
667 	public static HashMap getMonthNumberTableRowNumber()
668 	{
669 		return GlobalRowOrColumnNumber.monthNumberTableRowNumber;
670 	}
671 
672 	/***
673 	 * @return Returns the number of days in the simulation
674 	 */
675 	public static int getNumberOfDays()
676 	{
677 		return GlobalRowOrColumnNumber.numberOfDays;
678 	}
679 
680 	/***
681 	 * @return Returns the progress calendar
682 	 */
683 	public static Calendar getProgressCalendar()
684 	{
685 		return GlobalRowOrColumnNumber.progressCalendar;
686 	}
687 
688 	/***
689 	 * @return Returns the startTime
690 	 */
691 	public static long getStartTime()
692 	{
693 		return GlobalRowOrColumnNumber.startTime;
694 	}
695 
696 	/***
697 	 * @return Retuns the custom event producer
698 	 */
699 	public CustomEventProducer getCustomEventProducer()
700 	{
701 		return this.customEventProducer;
702 	}
703 
704 	/***
705 	 * A custom implementation of an event producer.
706 	 * <p>
707 	 * (c) copyright 2005 <a href="http://www.simulation.tudelft.nl">Delft
708 	 * University of Technology </a>, the Netherlands. <br>
709 	 * See for project information <a
710 	 * href="http://www.simulation.tudelft.nl">www.simulation.tudelft.nl </a>
711 	 * <br>
712 	 * 
713 	 * Copyright (c) 2003-2005 Delft University of Technology, Jaffalaan 5, 2628
714 	 * BX Delft, the Netherlands. All rights reserved.
715 	 * 
716 	 * See for project information <a href="http://www.simulation.tudelft.nl/">
717 	 * www.simulation.tudelft.nl </a>.
718 	 * 
719 	 * The source code and binary code of this software are proprietary
720 	 * information of Delft University of Technology.
721 	 * 
722 	 * @author <a
723 	 *         href="http://www.tbm.tudelft.nl/webstaf/stijnh/index.htm">Stijn-Pieter
724 	 *         van Houten </a>
725 	 * @version $Revision: 1.2 $ $Date: 2005/08/09 20:49:45 $
726 	 * @since 1.1.3
727 	 */
728 	public static class CustomEventProducer extends EventProducer implements
729 			Serializable
730 	{
731 		/*** the serial version uid */
732 		private static final long serialVersionUID = 11L;
733 
734 		/***
735 		 * constructs a new CustomEventProducer
736 		 */
737 		public CustomEventProducer()
738 		{
739 			super();
740 		}
741 
742 
743 		/***
744 		 * @see nl.tudelft.simulation.event.EventProducer#fireEvent(nl.tudelft.simulation.event.EventInterface)
745 		 */
746 		public synchronized EventInterface fireEvent(final EventInterface event)
747 		{
748 			return super.fireEvent(event);
749 		}
750 	}
751 
752 	/***
753 	 * A custom implementation of an event listener.
754 	 * <p>
755 	 * (c) copyright 2005 <a href="http://www.simulation.tudelft.nl">Delft
756 	 * University of Technology </a>, the Netherlands. <br>
757 	 * See for project information <a
758 	 * href="http://www.simulation.tudelft.nl">www.simulation.tudelft.nl </a>
759 	 * <br>
760 	 * 
761 	 * Copyright (c) 2003-2005 Delft University of Technology, Jaffalaan 5, 2628
762 	 * BX Delft, the Netherlands. All rights reserved.
763 	 * 
764 	 * See for project information <a href="http://www.simulation.tudelft.nl/">
765 	 * www.simulation.tudelft.nl </a>.
766 	 * 
767 	 * The source code and binary code of this software are proprietary
768 	 * information of Delft University of Technology.
769 	 * 
770 	 * @author <a
771 	 *         href="http://www.tbm.tudelft.nl/webstaf/stijnh/index.htm">Stijn-Pieter
772 	 *         van Houten </a>
773 	 * @version $Revision: 1.2 $ $Date: 2005/08/09 20:49:45 $
774 	 * @since 1.1.3
775 	 */
776 	private static class CustomEventListener implements EventListenerInterface,
777 			Serializable
778 	{
779 		/*** the serial version uid */
780 		private static final long serialVersionUID = 11L;
781 
782 		/***
783 		 * constructs a new CustomEventListener
784 		 */
785 		public CustomEventListener()
786 		{
787 			super();
788 		}
789 
790 		/***
791 		 * @see nl.tudelft.simulation.event.EventListenerInterface#notify(nl.tudelft.simulation.event.EventInterface)
792 		 */
793 		public void notify(final EventInterface event) throws RemoteException
794 		{
795 			if (event.getType().equals(SimulatorInterface.TIME_CHANGED_EVENT))
796 			{
797 				long time = (long) TimeUnit.convert(((Double) event
798 						.getContent()).doubleValue(),
799 						GlobalRowOrColumnNumber.simulatorTimeUnit,
800 						TimeUnitInterface.MILLISECOND);
801 				GlobalRowOrColumnNumber.progressCalendar
802 						.setTimeInMillis(GlobalRowOrColumnNumber.startTime
803 								+ time);
804 				int newDay = GlobalRowOrColumnNumber.progressCalendar
805 						.get(Calendar.DAY_OF_YEAR);
806 
807 				if (GlobalRowOrColumnNumber.currentDay != newDay)
808 				{
809 					GlobalRowOrColumnNumber.currentDay = newDay;
810 					GlobalRowOrColumnNumber.currentNumberDay++;
811 
812 					GlobalRowOrColumnNumber.globalRowOrColumnNumber.customEventProducer
813 							.fireEvent(new Event(
814 									GlobalRowOrColumnNumber.UPDATE_CURRENT_DAY,
815 									GlobalRowOrColumnNumber.globalRowOrColumnNumber,
816 									new Integer(
817 											GlobalRowOrColumnNumber.currentNumberDay)));
818 
819 					int newWeek = GlobalRowOrColumnNumber.progressCalendar
820 							.get(Calendar.WEEK_OF_YEAR);
821 					if (GlobalRowOrColumnNumber.currentWeek != newWeek)
822 					{
823 						GlobalRowOrColumnNumber.currentWeek = newWeek;
824 						GlobalRowOrColumnNumber.currentNumberWeek++;
825 						GlobalRowOrColumnNumber.globalRowOrColumnNumber.customEventProducer
826 								.fireEvent(new Event(
827 										GlobalRowOrColumnNumber.UPDATE_CURRENT_WEEK,
828 										GlobalRowOrColumnNumber.globalRowOrColumnNumber,
829 										new Integer(
830 												GlobalRowOrColumnNumber.currentNumberWeek)));
831 					}
832 
833 					int newMonth = GlobalRowOrColumnNumber.progressCalendar
834 							.get(Calendar.MONTH);
835 					if (GlobalRowOrColumnNumber.currentMonth != newMonth)
836 					{
837 						GlobalRowOrColumnNumber.currentMonth = newMonth;
838 						GlobalRowOrColumnNumber.currentNumberMonth++;
839 
840 						GlobalRowOrColumnNumber.globalRowOrColumnNumber.customEventProducer
841 								.fireEvent(new Event(
842 										GlobalRowOrColumnNumber.UPDATE_CURRENT_MONTH,
843 										GlobalRowOrColumnNumber.globalRowOrColumnNumber,
844 										new Integer(
845 												GlobalRowOrColumnNumber.currentNumberMonth)));
846 					}
847 					GlobalRowOrColumnNumber.globalRowOrColumnNumber.customEventProducer
848 							.fireEvent(new Event(
849 									GlobalRowOrColumnNumber.UPDATE_CURRENT_DATE,
850 									GlobalRowOrColumnNumber.globalRowOrColumnNumber,
851 									new CurrentRowOrColumnData(
852 											GlobalRowOrColumnNumber.progressCalendar
853 													.get(Calendar.DAY_OF_MONTH),
854 											GlobalRowOrColumnNumber.progressCalendar
855 													.get(Calendar.MONTH),
856 											GlobalRowOrColumnNumber.progressCalendar
857 													.get(Calendar.YEAR))));
858 				}
859 			}
860 		}
861 	}
862 }