/*******************************************************************************
 * Copyright (c) 2003, 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.commands;

import java.util.Set;

import org.eclipse.ui.internal.util.Util;

/**
 * An instance of this class describes changes to an instance of
 * <code>ICommandManager</code>.
 * <p>
 * This class is not intended to be extended by clients.
 * </p>
 * 
 * @since 3.0
 * @see ICommandManagerListener#commandManagerChanged(CommandManagerEvent)
 * @see org.eclipse.core.commands.CommandManagerEvent
 * @deprecated Please use the "org.eclipse.core.commands" plug-in instead.
 */
public final class CommandManagerEvent {

    /**
     * Whether the set of active contexts has changed.
     */
    private final boolean activeContextIdsChanged;

    /**
     * Whether the active key configuration has changed.
     */
    private final boolean activeKeyConfigurationIdChanged;

    /**
     * Whether the locale has changed.
     */
    private final boolean activeLocaleChanged;

    /**
     * Whether the platform has changed.
     */
    private final boolean activePlatformChanged;

    /**
     * Whether the command manager has changed.
     */
    private final ICommandManager commandManager;

    /**
     * Whether the list of defined categories has changed.
     */
    private final boolean definedCategoryIdsChanged;

    /** 
     * Whether the list of defined commands has changed.
     */
    private final boolean definedCommandIdsChanged;

    /**
     * Whether the list of defined key configurations has changed.
     */
    private final boolean definedKeyConfigurationIdsChanged;

    /**
     * The set of the defined categories before the change occurred.  This is a
     * set of strings (category identifiers).
     */
    private final Set previouslyDefinedCategoryIds;

    /**
     * The set of the defined commands before the change occurred.  This is a
     * set of strings (command identifiers).
     */
    private final Set previouslyDefinedCommandIds;

    /**
     * The set of the defined key configurations before the change occurred.
     * This is a set of strings (key configuration identifiers).
     */
    private final Set previouslyDefinedKeyConfigurationIds;

    /**
     * Creates a new instance of this class.
     * 
     * @param commandManager
     *            the instance of the interface that changed.
     * @param activeContextIdsChanged
     *            true, iff the activeContextIdsChanged property changed.
     * @param activeKeyConfigurationIdChanged
     *            true, iff the activeKeyConfigurationIdChanged property
     *            changed.
     * @param activeLocaleChanged
     *            true, iff the activeLocaleChanged property changed.
     * @param activePlatformChanged
     *            true, iff the activePlatformChanged property changed.
     * @param definedCategoryIdsChanged
     *            true, iff the definedCategoryIdsChanged property changed.
     * @param definedCommandIdsChanged
     *            true, iff the definedCommandIdsChanged property changed.
     * @param definedKeyConfigurationIdsChanged
     *            true, iff the definedKeyConfigurationIdsChanged property
     *            changed.
     * @param previouslyDefinedCategoryIds
     *            the set of identifiers to previously defined categories. This
     *            set may be empty. If this set is not empty, it must only
     *            contain instances of <code>String</code>. This set must be
     *            <code>null</code> if definedCategoryIdsChanged is
     *            <code>false</code> and must not be null if
     *            definedCategoryIdsChanged is <code>true</code>.
     * @param previouslyDefinedCommandIds
     *            the set of identifiers to previously defined commands. This
     *            set may be empty. If this set is not empty, it must only
     *            contain instances of <code>String</code>. This set must be
     *            <code>null</code> if definedCommandIdsChanged is
     *            <code>false</code> and must not be null if
     *            definedContextIdsChanged is <code>true</code>.
     * @param previouslyDefinedKeyConfigurationIds
     *            the set of identifiers to previously defined key
     *            configurations. This set may be empty. If this set is not
     *            empty, it must only contain instances of <code>String</code>.
     *            This set must be <code>null</code> if
     *            definedKeyConfigurationIdsChanged is <code>false</code> and
     *            must not be null if definedKeyConfigurationIdsChanged is
     *            <code>true</code>.
     */
    public CommandManagerEvent(ICommandManager commandManager,
            boolean activeContextIdsChanged,
            boolean activeKeyConfigurationIdChanged,
            boolean activeLocaleChanged, boolean activePlatformChanged,
            boolean definedCategoryIdsChanged,
            boolean definedCommandIdsChanged,
            boolean definedKeyConfigurationIdsChanged,
            Set previouslyDefinedCategoryIds, Set previouslyDefinedCommandIds,
            Set previouslyDefinedKeyConfigurationIds) {
        if (commandManager == null)
            throw new NullPointerException();

        if (!definedCategoryIdsChanged && previouslyDefinedCategoryIds != null)
            throw new IllegalArgumentException();

        if (!definedCommandIdsChanged && previouslyDefinedCommandIds != null)
            throw new IllegalArgumentException();

        if (!definedKeyConfigurationIdsChanged
                && previouslyDefinedKeyConfigurationIds != null)
            throw new IllegalArgumentException();

        if (definedCategoryIdsChanged) {
            this.previouslyDefinedCategoryIds = Util.safeCopy(
                    previouslyDefinedCategoryIds, String.class);
        } else {
            this.previouslyDefinedCategoryIds = null;
        }

        if (definedCommandIdsChanged) {
            this.previouslyDefinedCommandIds = Util.safeCopy(
                    previouslyDefinedCommandIds, String.class);
        } else {
            this.previouslyDefinedCommandIds = null;
        }

        if (definedKeyConfigurationIdsChanged) {
            this.previouslyDefinedKeyConfigurationIds = Util.safeCopy(
                    previouslyDefinedKeyConfigurationIds, String.class);
        } else {
            this.previouslyDefinedKeyConfigurationIds = null;
        }

        this.commandManager = commandManager;
        this.activeContextIdsChanged = activeContextIdsChanged;
        this.activeKeyConfigurationIdChanged = activeKeyConfigurationIdChanged;
        this.activeLocaleChanged = activeLocaleChanged;
        this.activePlatformChanged = activePlatformChanged;
        this.definedCategoryIdsChanged = definedCategoryIdsChanged;
        this.definedCommandIdsChanged = definedCommandIdsChanged;
        this.definedKeyConfigurationIdsChanged = definedKeyConfigurationIdsChanged;
    }

    /**
     * Returns the instance of the interface that changed.
     * 
     * @return the instance of the interface that changed. Guaranteed not to be
     *         <code>null</code>.
     */
    public ICommandManager getCommandManager() {
        return commandManager;
    }

    /**
     * Returns the set of identifiers to previously defined categories.
     * 
     * @return the set of identifiers to previously defined categories. This set
     *         may be empty. If this set is not empty, it is guaranteed to only
     *         contain instances of <code>String</code>. This set is
     *         guaranteed to be <code>null</code> if
     *         haveDefinedCategoryIdsChanged() is <code>false</code> and is
     *         guaranteed to not be null if haveDefinedCategoryIdsChanged() is
     *         <code>true</code>.
     */
    public Set getPreviouslyDefinedCategoryIds() {
        return previouslyDefinedCategoryIds;
    }

    /**
     * Returns the set of identifiers to previously defined commands.
     * 
     * @return the set of identifiers to previously defined commands. This set
     *         may be empty. If this set is not empty, it is guaranteed to only
     *         contain instances of <code>String</code>. This set is
     *         guaranteed to be <code>null</code> if
     *         haveDefinedCommandIdsChanged() is <code>false</code> and is
     *         guaranteed to not be null if haveDefinedCommandIdsChanged() is
     *         <code>true</code>.
     */
    public Set getPreviouslyDefinedCommandIds() {
        return previouslyDefinedCommandIds;
    }

    /**
     * Returns the set of identifiers to previously defined key conigurations.
     * 
     * @return the set of identifiers to previously defined key configurations.
     *         This set may be empty. If this set is not empty, it is guaranteed
     *         to only contain instances of <code>String</code>. This set is
     *         guaranteed to be <code>null</code> if
     *         haveDefinedKeyConfigurationIdsChanged() is <code>false</code>
     *         and is guaranteed to not be null if
     *         haveDefinedKeyConfigurationIdsChanged() is <code>true</code>.
     */
    public Set getPreviouslyDefinedKeyConfigurationIds() {
        return previouslyDefinedKeyConfigurationIds;
    }

    /**
     * Returns whether or not the activeKeyConfigurationId property changed.
     * 
     * @return true, iff the activeKeyConfigurationId property changed.
     */
    public boolean hasActiveKeyConfigurationIdChanged() {
        return activeKeyConfigurationIdChanged;
    }

    /**
     * Returns whether or not the activeLocale property changed.
     * 
     * @return true, iff the activeLocale property changed.
     */
    public boolean hasActiveLocaleChanged() {
        return activeLocaleChanged;
    }

    /**
     * Returns whether or not the activePlatform property changed.
     * 
     * @return true, iff the activePlatform property changed.
     */
    public boolean hasActivePlatformChanged() {
        return activePlatformChanged;
    }

    /**
     * Returns whether or not the activeContextIds property changed.
     * 
     * @return true, iff the activeContextIds property changed.
     */
    public boolean haveActiveContextIdsChanged() {
        return activeContextIdsChanged;
    }

    /**
     * Returns whether or not the definedCategoryIds property changed.
     * 
     * @return true, iff the definedCategoryIds property changed.
     */
    public boolean haveDefinedCategoryIdsChanged() {
        return definedCategoryIdsChanged;
    }

    /**
     * Returns whether or not the definedCommandIds property changed.
     * 
     * @return true, iff the definedCommandIds property changed.
     */
    public boolean haveDefinedCommandIdsChanged() {
        return definedCommandIdsChanged;
    }

    /**
     * Returns whether or not the definedKeyConfigurationIds property changed.
     * 
     * @return true, iff the definedKeyConfigurationIds property changed.
     */
    public boolean haveDefinedKeyConfigurationIdsChanged() {
        return definedKeyConfigurationIdsChanged;
    }
}
