/* mode buttons for ksirc - Robbie Ward <linuxphreak@gmx.co.uk>*/

#include "chanButtons.h"
#include "chanButtons.moc"

#include <tdelocale.h>
#include <tdepopupmenu.h>
#include <knuminput.h>
#include <kstdguiitem.h>
#include <kpushbutton.h>

#include <tqlayout.h>
#include <tqtooltip.h>
#include <tqlineedit.h>

#include "ksircprocess.h"

static void makeSquare(TQWidget *w)
{
   TQSize sh = w->sizeHint();
   int s = sh.height();
   w->setFixedSize(s,s);
}

chanButtons::chanButtons(KSircProcess *proc, TQWidget *parent, const char *name)
: TQWidget(parent, name),
  m_proc(proc)
{
  Popupmenu = new TDEPopupMenu( this );
  Popupmenu->insertTitle(i18n("Channel Modes"));
  toggleMenu[0] = Popupmenu->insertItem(i18n("i (invite-only)"), this, TQ_SLOT(invite()));
  toggleMenu[1] = Popupmenu->insertItem(i18n("l (limited users)"), this, TQ_SLOT(limited()));
  toggleMenu[2] = Popupmenu->insertItem(i18n("k (key to join)"), this, TQ_SLOT(key()));
  toggleMenu[3] = Popupmenu->insertItem(i18n("s (secret)"), this, TQ_SLOT(secret()));
  Popupmenu->insertSeparator();
  Popupmenu->insertTitle(i18n("User Modes"));
  toggleMenu[4] = Popupmenu->insertItem(i18n("i (be invisible)"), this, TQ_SLOT(invisible()));
  toggleMenu[5] = Popupmenu->insertItem(i18n("w (receive wallops)"), this, TQ_SLOT(wallops()));
  toggleMenu[6] = Popupmenu->insertItem(i18n("s (get server notices)"), this, TQ_SLOT(serverNotices()));

  layout = new TQHBoxLayout(this);
  layout->setSpacing(0);
  layout->setMargin(0);

  protectButton = new TQPushButton(i18n("T"), this);
  protectButton->setToggleButton(true);
  makeSquare(protectButton);
  TQToolTip::add(protectButton, i18n("Only op'ed users can change the topic"));
  connect(protectButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(protectMode()));
  layout->addWidget(protectButton);

  outsideButton = new TQPushButton(i18n("N"), this);
  outsideButton->setToggleButton(true);
  makeSquare(outsideButton);
  TQToolTip::add(outsideButton, i18n("No outside messages"));
  connect(outsideButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(outsideMode()));
  layout->addWidget(outsideButton);

  moderateButton = new TQPushButton(i18n("M"), this);
  moderateButton->setToggleButton(true);
  makeSquare(moderateButton);
  TQToolTip::add(moderateButton, i18n("Only op'ed users and voiced users (+v) can speak"));
  connect(moderateButton, TQ_SIGNAL(clicked()), this, TQ_SLOT(moderateMode()));
  layout->addWidget(moderateButton);

  menuButton = new TQPushButton(i18n("..."), this);
  makeSquare(menuButton);
  menuButton->setFixedWidth(menuButton->width()*2);
  menuButton->setPopup(Popupmenu);
  TQToolTip::add(menuButton, i18n("More mode commands"));
  layout->addWidget(menuButton);
}

void chanButtons::invite()
{
  if (Popupmenu->isItemChecked(toggleMenu[0])) {
    Popupmenu->setItemChecked(toggleMenu[0], false);
    emit mode(TQString("-i"), 0);
  }
  else {
    Popupmenu->setItemChecked(toggleMenu[0], true);
    emit mode(TQString("+i"), 0);
  }
}

void chanButtons::limited()
{
  chanDialog = new chanbuttonsDialog(chanbuttonsDialog::limited);
  chanDialog->exec();
  if (chanDialog->sendLimitedUsers() == 0) {
    Popupmenu->setItemChecked(toggleMenu[1], false);
    emit mode(TQString("-l"), 0);
  }
  else {
    Popupmenu->setItemChecked(toggleMenu[1], true);
    emit mode(TQString("+l %1").arg(chanDialog->sendLimitedUsers()), 0);
  }
  delete chanDialog;
}

void chanButtons::key()
{
  chanDialog = new chanbuttonsDialog(chanbuttonsDialog::key);
  if (Popupmenu->isItemChecked(toggleMenu[2])) {
    chanDialog->exec();
    Popupmenu->setItemChecked(toggleMenu[2], false);
    emit mode(TQString("-k %1").arg(chanDialog->sendKey()), 0);
  }
  else {
    chanDialog->exec();
    Popupmenu->setItemChecked(toggleMenu[2], true);
    emit mode(TQString("+k %1").arg(chanDialog->sendKey()), 0);
  }
  delete chanDialog;
}

void chanButtons::secret()
{
  if (Popupmenu->isItemChecked(toggleMenu[3])) {
    Popupmenu->setItemChecked(toggleMenu[3], false);
    emit mode(TQString("-s"), 0);
  }
  else {
    Popupmenu->setItemChecked(toggleMenu[3], true);
    emit mode(TQString("+s"), 0);
  }
}

void chanButtons::invisible()
{
  if (Popupmenu->isItemChecked(toggleMenu[4])) {
    Popupmenu->setItemChecked(toggleMenu[4], false);
    emit mode(TQString("-i"), 1, m_proc->getNick());
  }
  else {
    Popupmenu->setItemChecked(toggleMenu[4], true);
    emit mode(TQString("+i"), 1, m_proc->getNick());
  }
}

void chanButtons::wallops()
{
  if (Popupmenu->isItemChecked(toggleMenu[5])) {
    Popupmenu->setItemChecked(toggleMenu[5], false);
    emit mode(TQString("-w"), 1, m_proc->getNick());
  }
  else {
    Popupmenu->setItemChecked(toggleMenu[5], true);
    emit mode(TQString("+w"), 1, m_proc->getNick());
  }
}

void chanButtons::serverNotices()
{
  if (Popupmenu->isItemChecked(toggleMenu[6])) {
    Popupmenu->setItemChecked(toggleMenu[6], false);
    emit mode(TQString("-s"), 1, m_proc->getNick());
  }
  else {
    Popupmenu->setItemChecked(toggleMenu[6], true);
    emit mode(TQString("+s"), 1, m_proc->getNick());
  }
}

void chanButtons::protectMode()
{
  if (protectButton->isOn())
    emit mode(TQString("+t"), 0);
  else
    emit mode(TQString("-t"), 0);
}

void chanButtons::outsideMode()
{
  if (outsideButton->isOn())
    emit mode(TQString("+n"), 0);
  else
    emit mode(TQString("-n"), 0);
}

void chanButtons::moderateMode()
{
  if (moderateButton->isOn())
    emit mode(TQString("+m"), 0);
  else
    emit mode(TQString("-m"), 0);
}

void chanButtons::setButtonsEnabled(bool enabled)
{
  // Set all the channel mode entries disabled if non-op else enable them
  protectButton->setEnabled(enabled);
  outsideButton->setEnabled(enabled);
  moderateButton->setEnabled(enabled);
  Popupmenu->setItemEnabled(toggleMenu[0], enabled);
  Popupmenu->setItemEnabled(toggleMenu[1], enabled);
  Popupmenu->setItemEnabled(toggleMenu[2], enabled);
  Popupmenu->setItemEnabled(toggleMenu[3], enabled);
}

void chanButtons::setMenuItemMode(int id, bool value)
{
  Popupmenu->setItemChecked(toggleMenu[id], value);
}

chanbuttonsDialog::chanbuttonsDialog(const type &modeType, TQWidget *parent,
                          const char *name, bool modal) : KDialog(parent, name, modal)
{
  m_sendKey = "";
  m_sendLimitedUsers = 0;
  resize(190, 82);
  setCaption(i18n("Limit Number of Users"));
  LimitedLayout = new TQVBoxLayout(this);
  LimitedLayout->setSpacing(9);
  LimitedLayout->setMargin(11);

  switch (modeType) {
    case limited:
      SpinBox = new KIntSpinBox(this);
      LimitedLayout->addWidget(SpinBox);
      break;
    case key:
      EditBox = new TQLineEdit(this);
      LimitedLayout->addWidget(EditBox);
      break;
  }

  Layout = new TQHBoxLayout;
  Layout->setSpacing(6);
  Layout->setMargin(0);

  okButton = new KPushButton(KStdGuiItem::ok(), this);
  okButton->setSizePolicy(TQSizePolicy((TQSizePolicy::SizeType)1, (TQSizePolicy::SizeType)1,
                                      okButton->sizePolicy().hasHeightForWidth()));
  Layout->addWidget(okButton);
  switch (modeType) {
    case limited:
      connect(okButton, TQ_SIGNAL(clicked()), TQ_SLOT(limitedUsers()));
      break;
    case key:
      connect(okButton, TQ_SIGNAL(clicked()), TQ_SLOT(keyString()));
      break;
  }

  Layout->addWidget(okButton);

  cancelButton = new KPushButton(KStdGuiItem::cancel(), this);
  cancelButton->setSizePolicy(TQSizePolicy((TQSizePolicy::SizeType)1, (TQSizePolicy::SizeType)1,
                                      cancelButton->sizePolicy().hasHeightForWidth()));
  Layout->addWidget(cancelButton);
  connect(cancelButton, TQ_SIGNAL(clicked()), TQ_SLOT(reject()));
  LimitedLayout->addLayout(Layout);

  TQSpacerItem *spacer = new TQSpacerItem(20, 20, TQSizePolicy::Minimum, TQSizePolicy::Expanding);
  LimitedLayout->addItem(spacer);
}

void chanbuttonsDialog::keyString()
{
  m_sendKey = EditBox->text();
  accept();
}

void chanbuttonsDialog::limitedUsers()
{
  m_sendLimitedUsers = SpinBox->value();
  accept();
}