/*
 * This file Copyright (C) 2009-2014 Mnemosyne LLC
 *
 * It may be used under the GNU Public License v2 or v3 licenses,
 * or any future license endorsed by Mnemosyne LLC.
 *
 * $Id: hig.cc 14225 2014-01-19 01:09:44Z jordan $
 */

#include <iostream>

#include <QCheckBox>
#include <QGridLayout>
#include <QHBoxLayout>
#include <QLabel>

#include "hig.h"


HIG :: HIG (QWidget * parent):
  QWidget (parent),
  myRow (0),
  myHasTall (false),
  myGrid (new QGridLayout (this))
{
  myGrid->setContentsMargins (PAD_BIG, PAD_BIG, PAD_BIG, PAD_BIG);
  myGrid->setHorizontalSpacing (PAD_BIG);
  myGrid->setVerticalSpacing (PAD);
  myGrid->setColumnStretch  (1, 1);
}

HIG :: ~HIG ()
{
  delete myGrid;
}

/***
****
***/

void
HIG :: addSectionDivider ()
{
  QWidget * w = new QWidget (this);
  myGrid->addWidget (w, myRow, 0, 1, 2);
  ++myRow;
}

void
HIG :: addSectionTitle (const QString& title)
{
  QLabel * label = new QLabel (this);
  label->setText (title);
  label->setStyleSheet ("font: bold");
  label->setAlignment (Qt::AlignLeft|Qt::AlignVCenter);
  addSectionTitle (label);
}

void
HIG :: addSectionTitle (QWidget * w)
{
  myGrid->addWidget (w, myRow, 0, 1, 2, Qt::AlignLeft|Qt::AlignVCenter);
  ++myRow;
}

void
HIG :: addSectionTitle (QLayout * l)
{
  myGrid->addLayout (l, myRow, 0, 1, 2, Qt::AlignLeft|Qt::AlignVCenter);
  ++myRow;
}


QLayout *
HIG :: addRow (QWidget * w)
{
  QHBoxLayout * h = new QHBoxLayout ();
  h->addSpacing (18);
  h->addWidget (w);

  QLabel * l;
  if ((l = qobject_cast<QLabel*>(w)))
    l->setAlignment (Qt::AlignLeft);

  return h;
}

void
HIG :: addWideControl (QLayout * l)
{
  QHBoxLayout * h = new QHBoxLayout ();
  h->addSpacing (18);
  h->addLayout (l);
  myGrid->addLayout (h, myRow, 0, 1, 2, Qt::AlignLeft|Qt::AlignVCenter);
  ++myRow;
}

void
HIG :: addWideControl (QWidget * w)
{
  QHBoxLayout * h = new QHBoxLayout ();
  h->addSpacing (18);
  h->addWidget (w);
  myGrid->addLayout (h, myRow, 0, 1, 2, Qt::AlignLeft|Qt::AlignVCenter);
  ++myRow;
}

QCheckBox*
HIG :: addWideCheckBox (const QString& text, bool isChecked)
{
  QCheckBox * check = new QCheckBox (text, this);
  check->setChecked (isChecked);
  addWideControl (check);
  return check;
}

void
HIG :: addLabel (QWidget * w)
{
  QHBoxLayout * h = new QHBoxLayout ();
  h->addSpacing (18);
  h->addWidget (w);
  myGrid->addLayout (h, myRow, 0, 1, 1, Qt::AlignLeft|Qt::AlignVCenter);
}

QLabel*
HIG :: addLabel (const QString& text)
{
  QLabel * label = new QLabel (text, this);
  addLabel (label);
  return label;
}

void
HIG :: addTallLabel (QWidget * w)
{
  QHBoxLayout * h = new QHBoxLayout ();
  h->addSpacing (18);
  h->addWidget (w);
  myGrid->addLayout (h, myRow, 0, 1, 1, Qt::AlignLeft|Qt::AlignTop);
}

QLabel*
HIG :: addTallLabel (const QString& text)
{
  QLabel * label = new QLabel (text, this);
  addTallLabel (label);
  return label;
}

void
HIG :: addControl (QWidget * w)
{
  myGrid->addWidget (w, myRow, 1, 1, 1);
}

void
HIG :: addControl (QLayout * l)
{
  myGrid->addLayout (l, myRow, 1, 1, 1);
}

QLabel *
HIG :: addRow (const QString& text, QWidget * control, QWidget * buddy)
{
  QLabel * label = addLabel (text);
  addControl (control);
  label->setBuddy (buddy ? buddy : control);
  ++myRow;
  return label;
}

QLabel *
HIG :: addTallRow (const QString& text, QWidget * control, QWidget * buddy)
{
  QLabel* label = addTallLabel (text);
  label->setBuddy (buddy ? buddy : control);
  addControl (control);
  myHasTall = true;
  myGrid->setRowStretch  (myRow, 1);
  ++myRow;
  return label;
}

QLabel *
HIG :: addRow (const QString& text, QLayout * control, QWidget * buddy)
{
  QLabel * label = addLabel (text);
  addControl (control);
  if (buddy != 0)
    label->setBuddy (buddy);
  ++myRow;
  return label;
}

void
HIG :: addRow (QWidget * label, QWidget * control, QWidget * buddy)
{
  addLabel (label);

  if (control)
    {
      addControl (control);

      QLabel * l = qobject_cast<QLabel*> (label);
      if (l != 0)
        l->setBuddy (buddy ? buddy : control);
    }

  ++myRow;
}

void
HIG :: addRow (QWidget * label, QLayout * control, QWidget * buddy)
{
  addLabel (label);

  if (control)
    {
      addControl (control);

      QLabel * l = qobject_cast<QLabel*> (label);
      if (l != 0 && buddy != 0)
        l->setBuddy (buddy);
    }

  ++myRow;
}

void
HIG :: finish ()
{
  if (!myHasTall)
    {
      QWidget * w = new QWidget (this);
      myGrid->addWidget (w, myRow, 0, 1, 2);
      myGrid->setRowStretch (myRow, 100);
      ++myRow;
    }
}
