001/*
002 * $Id: ProbeEvent.java,v 1.10 2011/03/24 16:06:34 davep Exp $
003 *
004 * This file is part of McIDAS-V
005 *
006 * Copyright 2007-2011
007 * Space Science and Engineering Center (SSEC)
008 * University of Wisconsin - Madison
009 * 1225 W. Dayton Street, Madison, WI 53706, USA
010 * https://www.ssec.wisc.edu/mcidas
011 * 
012 * All Rights Reserved
013 * 
014 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and
015 * some McIDAS-V source code is based on IDV and VisAD source code.  
016 * 
017 * McIDAS-V is free software; you can redistribute it and/or modify
018 * it under the terms of the GNU Lesser Public License as published by
019 * the Free Software Foundation; either version 3 of the License, or
020 * (at your option) any later version.
021 * 
022 * McIDAS-V is distributed in the hope that it will be useful,
023 * but WITHOUT ANY WARRANTY; without even the implied warranty of
024 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
025 * GNU Lesser Public License for more details.
026 * 
027 * You should have received a copy of the GNU Lesser Public License
028 * along with this program.  If not, see http://www.gnu.org/licenses.
029 */
030
031package edu.wisc.ssec.mcidasv.probes;
032
033import java.util.EventObject;
034
035import edu.wisc.ssec.mcidasv.util.Contract;
036
037/**
038 * This class captures a change to a probe and stores both the previous and
039 * current (as of the event's creation) changed values.
040 */
041@SuppressWarnings("serial")
042public class ProbeEvent<T> extends EventObject {
043
044    /**
045     * Previous value of the probe.
046     */
047    private final T oldValue;
048
049    /**
050     * Current value of the probe.
051     */
052    private final T newValue;
053
054    /**
055     * Generated when a {@link ReadoutProbe} changes either its position, 
056     * color, or visibility. Currently stores either position, color, or 
057     * visibility both before and after the change.
058     * 
059     * @param source Probe that generated this event.
060     * @param oldValue Old value of the probe.
061     * @param newValue New value of the probe.
062     * 
063     * @throws NullPointerException if any parameters are {@code null}.
064     */
065    public ProbeEvent(final ReadoutProbe source, final T oldValue, final T newValue) {
066        super(source);
067
068        Contract.notNull(source, "Events cannot originate from a null source object");
069        Contract.notNull(oldValue, "Old value cannot be null");
070        Contract.notNull(newValue, "New value cannot be null");
071
072        this.oldValue = oldValue;
073        this.newValue = newValue;
074    }
075
076    public ReadoutProbe getProbe() {
077        return (ReadoutProbe)getSource();
078    }
079
080    /**
081     * Returns the value of the probe before this event was generated.
082     * 
083     * @return Previous probe value.
084     */
085    public T getOldValue() {
086        return oldValue;
087    }
088
089    /**
090     * Returns the current (as of this event) value of the probe.
091     * 
092     * @return Current probe value.
093     */
094    public T getNewValue() {
095        return newValue;
096    }
097
098    /**
099     * Returns a brief summary of this event. Please note that this format is
100     * subject to change.
101     * 
102     * @return String that looks like {@code [ProbeEvent@HASHCODE: source=..., 
103     * oldValue=..., newValue=...]}.
104     */
105    @Override public String toString() {
106        return String.format("[ProbeEvent@%x: source=%s, oldValue=%s, newValue=%s]", hashCode(), source, oldValue, newValue);
107    }
108}