package org.limewire.setting.evt;

import org.limewire.setting.AbstractSetting;
import org.limewire.setting.Setting;

/**
 * SettingEvent are fired when a {@link AbstractSetting} changed its state.
 */
public class SettingEvent {
    
    /**
     * Various types of events that may occur.
     */
    public static enum EventType {
        /**
         * A Setting was reloaded.
         */
        RELOAD,
        
        /**
         * A Setting was reverted to the default value.
         */
        REVERT_TO_DEFAULT,
        
        /**
         * The always save flag was changed.
         */
        ALWAYS_SAVE_CHANGED,
        
        /**
         * The privacy flag was changed.
         */
        PRIVACY_CHANGED,
        
        /**
         * The value changed.
         */
        VALUE_CHANGED
    }
    
    private final EventType type;
    
    private final Setting setting;
    
    /**
     * Create a SettingEvent.
     * 
     * @param type the type of the Event
     * @param setting the Setting that triggered the event
     */
    public SettingEvent(EventType type, Setting setting) {
        if (type == null) {
            throw new NullPointerException("EventType is null");
        }
        
        if (setting == null) {
            throw new NullPointerException("Setting is null");
        }
        
        this.type = type;
        this.setting = setting;
    }
    
    /**
     * Returns the type of the event.  
     */
    public EventType getEventType() {
        return type;
    }
    
    /**
     * Returns the Setting that triggered the event.
     */
    public Setting getSetting() {
        return setting;
    }
    
    @Override
    public String toString() {
        return type + ": " + setting;
    }
}
