/****************************************************************
 * This file is distributed under the following license:
 *
 * Copyright (c) 2008, defnax
 * Copyright (c) 2008, Matt Edman, Justin Hipple
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU General Public License
 *  as published by the Free Software Foundation; either version 2
 *  of the License, or (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, 
 *  Boston, MA  02110-1301, USA.
 ****************************************************************/

/*
** \file vmessagebox.cpp
** \version $Id: vmessagebox.cpp 2362 2008-02-29 04:30:11Z edmanm $
** \brief Provides a custom Vidalia mesage box
*/

#include "html.h"
#include "vmessagebox.h"


/** Default constructor. */
VMessageBox::VMessageBox(QWidget *parent)
: QMessageBox(parent)
{
}

/** Returns the button (0, 1, or 2) that is OR-ed with QMessageBox::Default,
 * or 0 if none are. */
int
VMessageBox::defaultButton(int button0, int button1, int button2)
{
  Q_UNUSED(button0);
  int defaultButton = 0;
  if (button1 & QMessageBox::Default) {
    defaultButton = 1;
  } else if (button2 & QMessageBox::Default) {
    defaultButton = 2;
  }
  return defaultButton;
}

/** Returns the button (0, 1, or 2) that is OR-ed with QMessageBox::Escape,
 * or -1 if none are. */
int
VMessageBox::escapeButton(int button0, int button1, int button2)
{
  int escapeButton = -1;
  if (button0 & QMessageBox::Escape) {
    escapeButton = 0;
  } else if (button1 & QMessageBox::Escape) {
    escapeButton = 1;
  } else if (button2 & QMessageBox::Escape) {
    escapeButton = 2;
  }
  return escapeButton;
}

/** Returns the Button enum value from the given return value. */
int
VMessageBox::selected(int ret, int button0, int button1, int button2)
{
  if (ret == 0) {
    return (button0 & QMessageBox::ButtonMask);
  } else if (ret == 1) {
    return (button1 & QMessageBox::ButtonMask);
  }
  return (button2 & QMessageBox::ButtonMask);
}

/** Converts a Button enum value to a translated string. */
QString
VMessageBox::buttonText(int btn)
{
  QString text;
  int button = (btn & ~QMessageBox::FlagMask);
  switch (button) {
    case Ok:      text = tr("OK"); break;
    case Cancel:  text = tr("Cancel"); break;
    case Yes:     text = tr("Yes"); break;
    case No:      text = tr("No"); break;
    case Help:    text = tr("Help"); break;
    case Retry:   text = tr("Retry"); break;
    case ShowLog: text = tr("Show Log"); break;
    case ShowSettings: text = tr("Show Settings"); break;
    case Continue: text = tr("Continue"); break;
    case Quit:     text = tr("Quit"); break;
    case Browse:   text = tr("Browse"); break;
    default: break;
  }
  return text;
}

/** Displays a critical message box with the given caption, message text, and
 * visible buttons. To specify a button as a default button or an escape
 * button, OR the Button enum value with QMessageBox::Default or
 * QMessageBox::Escape, respectively. */
int
VMessageBox::critical(QWidget *parent, QString caption, QString text,
                      int button0, int button1, int button2)
{
  int ret = QMessageBox::critical(parent, caption, p(text),
              VMessageBox::buttonText(button0), 
              VMessageBox::buttonText(button1), 
              VMessageBox::buttonText(button2),
              VMessageBox::defaultButton(button0, button1, button2), 
              VMessageBox::escapeButton(button0, button1, button2));
  return VMessageBox::selected(ret, button0, button1, button2);
}

/** Displays an question message box with the given caption, message text, and
 * visible buttons. To specify a button as a default button or an escape
 * button, OR the Button enum value with QMessageBox::Default or
 * QMessageBox::Escape, respectively. */
int
VMessageBox::question(QWidget *parent, QString caption, QString text,
                      int button0, int button1, int button2)
{
  int ret = QMessageBox::question(parent, caption, p(text),
              VMessageBox::buttonText(button0), 
              VMessageBox::buttonText(button1), 
              VMessageBox::buttonText(button2),
              VMessageBox::defaultButton(button0, button1, button2), 
              VMessageBox::escapeButton(button0, button1, button2));
  return VMessageBox::selected(ret, button0, button1, button2);
}

/** Displays an information message box with the given caption, message text, and
 * visible buttons. To specify a button as a default button or an escape
 * button, OR the Button enum value with QMessageBox::Default or
 * QMessageBox::Escape, respectively. */
int
VMessageBox::information(QWidget *parent, QString caption, QString text,
                         int button0, int button1, int button2)
{
  int ret = QMessageBox::information(parent, caption, p(text),
              VMessageBox::buttonText(button0), 
              VMessageBox::buttonText(button1), 
              VMessageBox::buttonText(button2),
              VMessageBox::defaultButton(button0, button1, button2), 
              VMessageBox::escapeButton(button0, button1, button2));
  return VMessageBox::selected(ret, button0, button1, button2);
}

/** Displays a warning message box with the given caption, message text, and
 * visible buttons. To specify a button as a default button or an escape
 * button, OR the Button enum value with QMessageBox::Default or
 * QMessageBox::Escape, respectively. */
int
VMessageBox::warning(QWidget *parent, QString caption, QString text,
                     int button0, int button1, int button2)
{
  int ret = QMessageBox::warning(parent, caption, p(text),
              VMessageBox::buttonText(button0), 
              VMessageBox::buttonText(button1), 
              VMessageBox::buttonText(button2),
              VMessageBox::defaultButton(button0, button1, button2), 
              VMessageBox::escapeButton(button0, button1, button2));
  return VMessageBox::selected(ret, button0, button1, button2);
}

