/*******************************************************************************
 * Copyright (c) 2001, 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.wst.common.frameworks.internal.dialog.ui;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.wst.common.environment.Choice;


/**
 * A dialog to display one or more errors to the user, as contained in an
 * <code>Status</code> object. If an error contains additional detailed
 * information then a Details button is automatically supplied, which shows or
 * hides an error details viewer when pressed by the user.
 *  
 */
public class OptionsDialog extends MessageDialog
{
  private Choice[] choices;
  private int returnCode_;

  public OptionsDialog(
    Shell parentShell,
    String dialogTitle,
    String message,
    IStatus status,
    int displayMask,
    Choice[] choices)
  {
    super(parentShell, dialogTitle, message, status, displayMask);
    this.choices = choices;
  }

  /*
   * (non-Javadoc) This should also be overwritten Method declared on Dialog.
   */
  @Override
protected void createButtonsForButtonBar(Composite parent)
  {
    // create a button for each options
    for (int i = 0; i < choices.length; i++)
    {
      createButton(parent, choices[i].getShortcut(), choices[i].getLabel(), true);
    }
    if (status.isMultiStatus() )
    {
      detailsButton =
        createButton(
          parent,
          StatusDialogConstants.DETAILS_ID,
          IDialogConstants.SHOW_DETAILS_LABEL,
          false);
    }
  }

  @Override
protected void buttonPressed(int id)
  {
    if (id == StatusDialogConstants.DETAILS_ID)
      // was the Details button pressed?
      super.buttonPressed(id);
    else
    {
      setReturnCode(id);
      close();
    }
  }

  @Override
protected void setReturnCode(int id)
  {
    returnCode_ = id;
  }

  @Override
public int getReturnCode()
  {
    return returnCode_;
  }
  /*
   * This is one of the few methods that needs to be overwritten by the
   * subclasses. The image names can be found in the Dialog class
   */
  @Override
protected Image getDialogImage()
  {
    // create image
    switch (status.getSeverity())
    {
      case IStatus.INFO :
        return PlatformUI.getWorkbench().getDisplay().getSystemImage(SWT.ICON_INFORMATION);
      case IStatus.WARNING :
        return PlatformUI.getWorkbench().getDisplay().getSystemImage(SWT.ICON_WARNING);
      default :
        return PlatformUI.getWorkbench().getDisplay().getSystemImage(SWT.ICON_ERROR);
    }
  }

}
