/*
* (C) 2004 - Geotechnical Software Services
*
* This code is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This code is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program; if not, write to the Free
* Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
* MA 02111-1307, USA.
*/
package no.geosoft.cc.locale;
import java.lang.ref.WeakReference;
import java.util.Collection;
import java.util.Iterator;
import java.util.ArrayList;
import java.util.TimeZone;
/**
* A manager class for keeping track of a "current" time zone.
*
* Reading times from 3rd party sources:
*
* <pre>
* DateFormat format = new SimpleDateFormat (pattern);
* format.setTimeZone (TimeZone.getTimeZone ([accroding to input format]);
* Date time = format.parse (string);
* </pre>
*
* Reading times from GUI:
*
* <pre>
* DateFormat format = new SimpleDateFormat (pattern);
* format.setTimeZone (TimeZone.getTimeZone (TimeZoneManager.getTimeZone());
* Date time = format.parse (string);
* </pre>
*
* Displaying times:
*
* <pre>
* Date date;
* DateFormat format = new SimpleDateFormat (pattern);
* format.setTimeZone (TimeZoneManager.getTimeZone());
* System.out.println (format.format (date));
* </pre>
*
* @author <a href="mailto:jacob.dreyer@geosoft.no">Jacob Dreyer</a>
*/
public class TimeZoneManager
{
private TimeZone timeZone_;
private Collection listeners_; // of WeakReference (TimeZoneListener)
/**
* Create a time manager with the specified current time zone.
*
* @param timeZone Current time zone.
*/
public TimeZoneManager (TimeZone timeZone)
{
timeZone_ = timeZone;
}
/**
* Create a time manager with the default current time zone (UTC).
*/
public TimeZoneManager()
{
this (TimeZone.getTimeZone ("UTC"));
}
/**
* Return the current time zone.
*
* @return Current time zone.
*/
public TimeZone getTimeZone()
{
return timeZone_;
}
/**
* Set new current time zone and update listeners.
*
* @param timeZone New current time zone.
*/
public void setTimeZone (TimeZone timeZone)
{
if (timeZone.equals (timeZone_))
return;
timeZone_ = timeZone;
// Call listeners
if (listeners_ != null) {
for (Iterator i = listeners_.iterator(); i.hasNext(); ) {
WeakReference reference = (WeakReference) i.next();
TimeZoneListener listener = (TimeZoneListener) reference.get();
if (listener == null)
i.remove();
else
listener.timeZoneChanged (timeZone_);
}
}
}
/**
* Add a time zone listener.
*
* @param timeZoneListener Listener to add.
*/
public void addTimeZoneListener (TimeZoneListener timeZoneListener)
{
if (listeners_ == null)
listeners_ = new ArrayList();
// Check to see if it is there already
for (Iterator i = listeners_.iterator(); i.hasNext(); ) {
WeakReference reference = (WeakReference) i.next();
TimeZoneListener listener = (TimeZoneListener) reference.get();
if (listener == timeZoneListener)
return;
}
// Add the listener
listeners_.add (new WeakReference (timeZoneListener));
}
/**
* Remove time zone listener.
*
* @param timeZoneListener Listener to remove.
*/
public void removeTimeZoneListener (TimeZoneListener timeZoneListener)
{
if (listeners_ == null) return;
for (Iterator i = listeners_.iterator(); i.hasNext(); ) {
WeakReference reference = (WeakReference) i.next();
TimeZoneListener listener = (TimeZoneListener) reference.get();
if (listener == timeZoneListener) {
i.remove();
break;
}
}
}
}