/*******************************************************************************
 * Copyright (c) 2000, 2015 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.ui.contexts;

import java.util.Set;

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

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

	/**
	 * The context manager which has changed. This value is never <code>null</code>.
	 */
	private final IContextManager contextManager;

	/**
	 * Whether the set of defined contexts has changed.
	 */
	private final boolean definedContextIdsChanged;

	/**
	 * Whether the set of enabled contexts has changed.
	 */
	private final boolean enabledContextIdsChanged;

	/**
	 * The set of context identifiers (strings) that were defined before the change
	 * occurred. If the defined contexts did not changed, then this value is
	 * <code>null</code>.
	 */
	private final Set previouslyDefinedContextIds;

	/**
	 * The set of context identifiers (strings) that were enabled before the change
	 * occurred. If the enabled contexts did not changed, then this value is
	 * <code>null</code>.
	 */
	private final Set previouslyEnabledContextIds;

	/**
	 * Creates a new instance of this class.
	 *
	 * @param contextManager              the instance of the interface that
	 *                                    changed.
	 * @param definedContextIdsChanged    true, iff the definedContextIds property
	 *                                    changed.
	 * @param enabledContextIdsChanged    true, iff the enabledContextIds property
	 *                                    changed.
	 * @param previouslyDefinedContextIds the set of identifiers to previously
	 *                                    defined contexts. 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
	 *                                    definedContextIdsChanged is
	 *                                    <code>false</code> and must not be null if
	 *                                    definedContextIdsChanged is
	 *                                    <code>true</code>.
	 * @param previouslyEnabledContextIds the set of identifiers to previously
	 *                                    enabled contexts. 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
	 *                                    enabledContextIdsChanged is
	 *                                    <code>false</code> and must not be null if
	 *                                    enabledContextIdsChanged is
	 *                                    <code>true</code>.
	 */
	public ContextManagerEvent(IContextManager contextManager, boolean definedContextIdsChanged,
			boolean enabledContextIdsChanged, Set previouslyDefinedContextIds, Set previouslyEnabledContextIds) {
		if (contextManager == null) {
			throw new NullPointerException();
		}

		if (!definedContextIdsChanged && previouslyDefinedContextIds != null) {
			throw new IllegalArgumentException();
		}

		if (!enabledContextIdsChanged && previouslyEnabledContextIds != null) {
			throw new IllegalArgumentException();
		}

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

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

		this.contextManager = contextManager;
		this.definedContextIdsChanged = definedContextIdsChanged;
		this.enabledContextIdsChanged = enabledContextIdsChanged;
	}

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

	/**
	 * Returns the set of identifiers to previously defined contexts.
	 *
	 * @return the set of identifiers to previously defined contexts. 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 haveDefinedContextIdsChanged() is
	 *         <code>false</code> and is guaranteed to not be null if
	 *         haveDefinedContextIdsChanged() is <code>true</code>.
	 */
	public Set getPreviouslyDefinedContextIds() {
		return previouslyDefinedContextIds;
	}

	/**
	 * Returns the set of identifiers to previously enabled contexts.
	 *
	 * @return the set of identifiers to previously enabled contexts. 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 haveEnabledContextIdsChanged() is
	 *         <code>false</code> and is guaranteed to not be null if
	 *         haveEnabledContextIdsChanged() is <code>true</code>.
	 */
	public Set getPreviouslyEnabledContextIds() {
		return previouslyEnabledContextIds;
	}

	/**
	 * Returns whether or not the definedContextIds property changed.
	 *
	 * @return true, iff the definedContextIds property changed.
	 */
	public boolean haveDefinedContextIdsChanged() {
		return definedContextIdsChanged;
	}

	/**
	 * Returns whether or not the enabledContextIds property changed.
	 *
	 * @return true, iff the enabledContextIds property changed.
	 */
	public boolean haveEnabledContextIdsChanged() {
		return enabledContextIdsChanged;
	}
}
