/*
 * @(#)ButtonEvent.java
 *
 * Copyright 2002 - 2003 JIDE Software Inc. All rights reserved.
 */
package com.jidesoft.dialog;

import java.awt.*;
import java.util.EventObject;

/**
 * An EventObject used to change the state of any button.
 */
public class ButtonEvent extends EventObject {

    private static final long serialVersionUID = 392703660104570538L;

    /**
     * The first number in the range of IDs used for <code>ButtonEvent</code>.
     */
    public static final int BUTTON_EVENT_FIRST = AWTEvent.RESERVED_ID_MAX + 1300;

    /**
     * The last number in the range of IDs used for <code>DockableFrame</code> events.
     */
    public static final int BUTTON_EVENT_LAST = BUTTON_EVENT_FIRST + 9;

    /**
     * This event is fired when you want to show the button.
     */
    public static final int SHOW_BUTTON = BUTTON_EVENT_FIRST;

    /**
     * This event is fired when you want to hide the button.
     */
    public static final int HIDE_BUTTON = 1 + BUTTON_EVENT_FIRST;

    /**
     * This event is fired when you want to enable the button.
     */
    public static final int ENABLE_BUTTON = 2 + BUTTON_EVENT_FIRST;

    /**
     * This event is fired when you want to disable the button.
     */
    public static final int DISABLE_BUTTON = 3 + BUTTON_EVENT_FIRST;

    /**
     * This event is fired when you want to change the text of the button.
     */
    public static final int CHANGE_BUTTON_TEXT = 4 + BUTTON_EVENT_FIRST;

    /**
     * This event is fired when you want to change the mnemonic of the button.
     */
    public static final int CHANGE_BUTTON_MNEMONIC = 5 + BUTTON_EVENT_FIRST;

    /**
     * This event is fired when you want to change the tooltip of the button.
     */
    public static final int CHANGE_BUTTON_TOOLTIP = 6 + BUTTON_EVENT_FIRST;

    /**
     * This event is fired when you want to set focus to the button.
     */
    public static final int CHANGE_BUTTON_FOCUS = 7 + BUTTON_EVENT_FIRST;

    /**
     * This event is fired when you want to set the button to the default button in a root pane.
     */
    public static final int SET_DEFAULT_BUTTON = 8 + BUTTON_EVENT_FIRST;

    /**
     * This event is fired when you want to clear the default button from a root pane.
     */
    public static final int CLEAR_DEFAULT_BUTTON = 9 + BUTTON_EVENT_FIRST;

    private int _id;

    private String _buttonName;

    private String _userObject;

    /**
     * Creates a ButtonEvent with source, id and the button name.
     *
     * @param source
     * @param id
     * @param buttonName
     */
    public ButtonEvent(Object source, int id, String buttonName) {
        super(source);
        _id = id;
        _buttonName = buttonName;
        checkParam();
    }

    /**
     * Creates a ButtonEvent with source, id, the button name and a user object. User object is required for
     * CHANGE_BUTTON_TEXT and CHANGE_BUTTON_TOOLTIP event.
     *
     * @param source
     * @param id
     * @param buttonName
     * @param userObject
     */
    public ButtonEvent(Object source, int id, String buttonName, String userObject) {
        super(source);
        _id = id;
        _buttonName = buttonName;
        _userObject = userObject;
        checkParam();
    }

    private void checkParam() {
        if (getID() < BUTTON_EVENT_FIRST && getID() > BUTTON_EVENT_LAST) {
            throw new IllegalArgumentException(getID() + " is an invalid event id for ButtonEvent");
        }
        if (_buttonName == null || _buttonName.trim().length() == 0) {
            throw new IllegalArgumentException("buttonName cannot be null or empty");
        }
        if ((_userObject == null || _userObject.trim().length() == 0)
                && (getID() == CHANGE_BUTTON_TEXT
                || getID() == CHANGE_BUTTON_MNEMONIC
                || getID() == CHANGE_BUTTON_TOOLTIP)) {
            throw new IllegalArgumentException("userObject cannot be null or empty for " + paramString());
        }
    }

    /**
     * Returns the event id.
     *
     * @return event id.
     */
    public int getID() {
        return _id;
    }

    /**
     * Sets the event id.
     *
     * @param id
     */
    public void setID(int id) {
        _id = id;
    }

    /**
     * Gets the button name of this event object.
     *
     * @return the button name.
     */
    public String getButtonName() {
        return _buttonName;
    }

    /**
     * Sets the button name.
     *
     * @param buttonName
     */
    public void setButtonName(String buttonName) {
        _buttonName = buttonName;
    }

    /**
     * Gets the user object of this event object.
     *
     * @return the user object.
     */
    public String getUserObject() {
        return _userObject;
    }

    /**
     * Sets the user object.
     *
     * @param userObject
     */
    public void setUserObject(String userObject) {
        _userObject = userObject;
    }

    /**
     * Returns a parameter string identifying this event. This method is useful for event logging and for debugging.
     *
     * @return a string identifying the event and its attributes
     */
    public String paramString() {
        String typeStr;
        switch (getID()) {
            case SHOW_BUTTON:
                typeStr = "SHOW_BUTTON";
                break;
            case HIDE_BUTTON:
                typeStr = "HIDE_BUTTON";
                break;
            case ENABLE_BUTTON:
                typeStr = "ENABLE_BUTTON";
                break;
            case DISABLE_BUTTON:
                typeStr = "DISABLE_BUTTON";
                break;
            case CHANGE_BUTTON_TEXT:
                typeStr = "CHANGE_BUTTON_TEXT";
                break;
            case CHANGE_BUTTON_MNEMONIC:
                typeStr = "CHANGE_BUTTON_MNEMONIC";
                break;
            case CHANGE_BUTTON_TOOLTIP:
                typeStr = "CHANGE_BUTTON_TOOLTIP";
                break;
            case CHANGE_BUTTON_FOCUS:
                typeStr = "CHANGE_BUTTON_FOCUS";
                break;
            case SET_DEFAULT_BUTTON:
                typeStr = "SET_DEFAULT_BUTTON";
                break;
            default:
                typeStr = "BUTTON_EVENT_UNKNOWN";
        }
        return typeStr;
    }
}
