/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.motorolamobility.studio.android.db.core;

import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;

public class CanRefreshStatus extends MultiStatus
{

    /**
     * Status type severity (bit mask, value 16) indicating that a user interaction will be needed.
     * in this case a Yes/no dialog must be displayed using this status messages as dialog message.
     * @see #getSeverity()
     * @see #matches(int)
     */
    public static final int ASK_USER = 0x10;

    /**
     * Status type severity (bit mask, value 16) indicating that a user interaction will be needed.
     * in this case a Yes/no/cancel dialog must be displayed using this status messages as dialog message.
     * Yes/No response will be sent to refresh, cancel will cancel the refresh
     * @see #getSeverity()
     * @see #matches(int)
     */
    public static final int CANCELABLE = 0x20;

    /**
     * Builds a new {@link CanRefreshStatus} instance
     * @param pluginId the plug-in id.
     * @param severity the severity code.
     * @param newChildren new Status's children. (can't be null)
     * @param message The new status message.
     * @param exception The {@link Throwable} that caused the error, if any. (Can be null).
     */
    public CanRefreshStatus(int severity, String pluginId, IStatus[] newChildren, String message,
            Throwable exception)
    {
        super(pluginId, OK, newChildren, message, exception);
        setSeverity(severity);
    }

    /**
     * Builds a new {@link CanRefreshStatus} instance
     * @param pluginId the plug-in id.
     * @param severity the severity code.
     * @param message The new status message.
     * @param exception The {@link Throwable} that caused the error, if any. (Can be null).
     */
    public CanRefreshStatus(int severity, String pluginId, String message, Throwable exception)
    {
        super(pluginId, OK, message, exception);
        setSeverity(severity);
    }

    /**
     * Builds a new {@link CanRefreshStatus} instance
     * @param pluginId the plug-in id.
     * @param severity the severity code.
     * @param newChildren new Status's children. (can't be null)
     * @param message The new status message.
     */
    public CanRefreshStatus(int severity, String pluginId, IStatus[] newChildren, String message)
    {
        super(pluginId, OK, newChildren, message, null);
        setSeverity(severity);
    }

    /**
     * Builds a new {@link CanRefreshStatus} instance
     * @param pluginId the plug-in id.
     * @param severity the severity code.
     * @param message The new status message.
     */
    public CanRefreshStatus(int severity, String pluginId, String message)
    {
        super(pluginId, OK, message, null);
        setSeverity(severity);
    }

    /**
     * Sets the severity.
     *
     * @param severity the severity; one of <code>OK</code>, <code>ERROR</code>, 
     * <code>INFO</code>, <code>WARNING</code>,  or <code>CANCEL</code>
     */
    @Override
    protected void setSeverity(int severity)
    {
        Assert.isLegal((severity == OK) || (severity == ERROR) || (severity == WARNING)
                || (severity == INFO) || (severity == CANCEL) || (severity == ASK_USER)
                || (severity == (ASK_USER | CANCELABLE)));

        if ((severity & ASK_USER) != 0)
        {
            super.setSeverity(WARNING);
        }

        setCode(severity);
    }

    /* (non-Javadoc)
     * @see org.eclipse.core.runtime.Status#matches(int)
     */
    @Override
    public boolean matches(int severityMask)
    {
        if ((severityMask & ASK_USER) != 0)
        {
            return (getCode() & severityMask) == severityMask;
        }
        return super.matches(severityMask);
    }

}
