/*******************************************************************************
 * Copyright (c) 2000, 2004 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.activities;

import java.util.Set;

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

/**
 * An instance of this class describes changes to an instance of 
 * <code>IActivityManager</code>.  This class does not give details as to the 
 * specifics of a change, only that the given property on the source object has 
 * changed.
 * 
 * <p>
 * This class is not intended to be extended by clients.
 * </p>
 * 
 * @since 3.0
 * @see IActivityManagerListener#activityManagerChanged(ActivityManagerEvent)
 */
public final class ActivityManagerEvent {
    private IActivityManager activityManager;

    private boolean definedActivityIdsChanged;

    private boolean definedCategoryIdsChanged;

    private boolean enabledActivityIdsChanged;

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

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

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

    /**
     * Creates a new instance of this class.
     * 
     * @param activityManager
     *            the instance of the interface that changed.
     * @param definedActivityIdsChanged
     *            <code>true</code>, iff the definedActivityIds property
     *            changed.
     * @param definedCategoryIdsChanged
     *            <code>true</code>, iff the definedCategoryIds property
     *            changed.
     * @param enabledActivityIdsChanged
     *            <code>true</code>, iff the enabledActivityIds property
     *            changed.
     * @param previouslyDefinedActivityIds
     *            the set of identifiers to previously defined activities. 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 definedActivityIdsChanged is
     *            <code>false</code> and must not be null if
     *            definedActivityIdsChanged is <code>true</code>.
     * @param previouslyDefinedCategoryIds
     *            the set of identifiers to previously defined category. 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 previouslyEnabledActivityIds
     *            the set of identifiers to previously enabled activities. 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 enabledActivityIdsChanged is
     *            <code>false</code> and must not be null if
     *            enabledActivityIdsChanged is <code>true</code>.
     */
    public ActivityManagerEvent(IActivityManager activityManager,
            boolean definedActivityIdsChanged,
            boolean definedCategoryIdsChanged,
            boolean enabledActivityIdsChanged,
            final Set previouslyDefinedActivityIds,
            final Set previouslyDefinedCategoryIds,
            final Set previouslyEnabledActivityIds) {
        if (activityManager == null) {
			throw new NullPointerException();
		}

        if (!definedActivityIdsChanged && previouslyDefinedActivityIds != null) {
			throw new IllegalArgumentException();
		}

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

        if (!enabledActivityIdsChanged && previouslyEnabledActivityIds != null) {
			throw new IllegalArgumentException();
		}

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

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

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

        this.activityManager = activityManager;
        this.definedActivityIdsChanged = definedActivityIdsChanged;
        this.definedCategoryIdsChanged = definedCategoryIdsChanged;
        this.enabledActivityIdsChanged = enabledActivityIdsChanged;
    }

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

    /**
     * Returns the activity identifiers that were previously defined.
     * 
     * @return The set of defined activity identifiers before the changed; may
     *         be empty, but never <code>null</code>. This set will only
     *         contain strings.
     */
    public final Set getPreviouslyDefinedActivityIds() {
        return previouslyDefinedActivityIds;
    }

    /**
     * Returns the category identifiers that were previously defined.
     * 
     * @return The set of defined category identifiers before the changed; may
     *         be empty, but never <code>null</code>. This set will only
     *         contain strings.
     */
    public final Set getPreviouslyDefinedCategoryIds() {
        return previouslyDefinedCategoryIds;
    }

    /**
     * Returns the activity identifiers that were previously enabled.
     * 
     * @return The set of enabled activity identifiers before the changed; may
     *         be empty, but never <code>null</code>. This set will only
     *         contain strings.
     */
    public final Set getPreviouslyEnabledActivityIds() {
        return previouslyEnabledActivityIds;
    }

    /**
     * Returns whether or not the definedActivityIds property changed.
     * 
     * @return <code>true</code>, iff the definedActivityIds property changed.
     */
    public boolean haveDefinedActivityIdsChanged() {
        return definedActivityIdsChanged;
    }

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

    /**
     * Returns whether or not the enabledActivityIds property changed.
     * 
     * @return <code>true</code>, iff the enabledActivityIds property changed.
     */
    public boolean haveEnabledActivityIdsChanged() {
        return enabledActivityIdsChanged;
    }
}
