ribi::QtRichelBilderbeekGalleryDialog::QtRichelBilderbeekGalleryDialog(QWidget *parent) :
  QtHideAndShowDialog(parent),
  ui(new Ui::QtRichelBilderbeekGalleryDialog),
  m_programs(Program::GetAllPrograms())
{
  ui->setupUi(this);

  QtResources r;
  const int n = static_cast<int>(m_programs.size());
  ui->table->setColumnCount(5);
  ui->table->setRowCount(n + 1);
  {
    QtGalleryItem * const item = new QtGalleryItem(QIcon(r.GetCl().c_str()),QString());
    item->setToolTip("Command line");
    ui->table->setItem(0,1,item);
  }
  {
    QtGalleryItem * const item = new QtGalleryItem(QIcon(r.GetWindows().c_str()),QString());
    item->setToolTip("Windows-only desktop ");
    ui->table->setItem(0,2,item);
  }
  {
    QtGalleryItem * const item = new QtGalleryItem(QIcon(r.GetDesktop().c_str()),QString());
    item->setToolTip("Desktop");
    ui->table->setItem(0,3,item);
  }
  {
    QtGalleryItem * const item = new QtGalleryItem(QIcon(r.GetWeb().c_str()),QString());
    item->setToolTip("Web application");
    ui->table->setItem(0,4,item);
  }

  for (int row=0; row!=n; ++row)
  {
    {
      QtGalleryItem * const item = new QtGalleryItem(m_programs[row]->GetName().c_str());
      ui->table->setItem(row+1,0,item);
    }
    for (int col=0; col!=4; ++col)
    {
      ProgramStatus p =  ProgramStatus::unk;
      switch (col)
      {
        case 0: p = m_programs[row]->GetStatusConsole(); break;
        case 1: p = m_programs[row]->GetStatusDesktopWindowsOnly(); break;
        case 2: p = m_programs[row]->GetStatusDesktop(); break;
        case 3: p = m_programs[row]->GetStatusWebApplication(); break;
      }
      std::string s;
      switch (p)
      {
        case ProgramStatus::yes: s = r.GetGreen(); break;
        case ProgramStatus::no: s = r.GetRed(); break;
        case ProgramStatus::nvr: s = r.GetBlack(); break;
        case ProgramStatus::n_a: s = r.GetBlack(); break;
        case ProgramStatus::wip: s = r.GetYellow(); break;
        case ProgramStatus::tbd: s = r.GetOrange(); break;
        case ProgramStatus::unk: s = r.GetBlack(); break;
      }
      {
        QtGalleryItem * const item = new QtGalleryItem(QIcon(s.c_str()),QString());
        item->setToolTip(ProgramStatusToStr(p).c_str());
        ui->table->setItem(row+1,col+1,item);
      }
    }
  }

  //Set all row heights
  {
    const int n_rows = ui->table->rowCount();
    const int row_height = 18;
    for (int i=0; i!=n_rows; ++i)
    {
      ui->table->setRowHeight(i,row_height);
    }
  }
  //Set all column widths
  {
    const int n_cols = ui->table->columnCount();
    const int col_width = 18;
    const int first_col_width = 200;
    ui->table->setColumnWidth(0,first_col_width);
    for (int i=1; i!=n_cols; ++i)
    {
      ui->table->setColumnWidth(i,col_width);
    }
    ui->table->setMaximumWidth(first_col_width + (n_cols * col_width));
    ui->table->setMinimumWidth(first_col_width + (n_cols * col_width));
  }


  {
    //Put the maximized dialog in the screen center
    const QRect screen = QApplication::desktop()->screenGeometry();
    const int width = screen.width() - 64;
    const int height = screen.height() - 128;
    this->setGeometry(0,0,width,height);
    this->move( screen.center() - this->rect().center() );
    this->setMaximumHeight(height);
    this->setMaximumWidth(width);
  }
}
ribi::RichelBilderbeek::WtGalleryDialog::WtGalleryDialog()
  : m_ui{}
{
  this->setContentAlignment(Wt::AlignCenter);
  new Wt::WBreak(this);
  new Wt::WLabel("Overview of Richel Bilderbeek's work",this);
  new Wt::WBreak(this);
  new Wt::WBreak(this);
  this->addWidget(m_ui.m_table);

  //table->setHeaderCount(1,Wt::Horizontal);
  //table->setHeaderCount(1,Wt::Vertical);
  m_ui.m_table->setMaximumSize(400,200);
  QtResources r;
  m_ui.m_table->elementAt(0,0)->addWidget(new Wt::WLabel("Program"));
  m_ui.m_table->elementAt(0,1)->addWidget(new Wt::WImage(r.GetCl()));
  m_ui.m_table->elementAt(0,2)->addWidget(new Wt::WImage(r.GetWindows()));
  m_ui.m_table->elementAt(0,3)->addWidget(new Wt::WImage(r.GetDesktop()));
  m_ui.m_table->elementAt(0,4)->addWidget(new Wt::WImage(r.GetWeb()));
  //ui.m_table->setPositionScheme(Wt::PositionScheme(Wt::CenterX | Wt::CenterY));

  const std::vector<boost::shared_ptr<Program> > v = Program::GetAllPrograms();
  const std::size_t n = v.size();
  for (std::size_t i=0; i!=n; ++i)
  {
    //Add a label
    {
      Wt::WLabel * const label = new Wt::WLabel(v[i]->GetName().c_str());
      //label->setMaximumSize(Wt::WLength::Auto,6);
      //label->setHeight(6);
      m_ui.m_table->elementAt(i+1,0)->addWidget(label);
      //ui.m_table->elementAt(i+1,0)->setMaximumSize(Wt::WLength::Auto,6);
    }
    for (int j=0; j!=4; ++j)
    {
      ProgramStatus p =  ProgramStatus::unk;
      switch (j)
      {
        case 0: p = v[i]->GetStatusConsole(); break;
        case 1: p = v[i]->GetStatusDesktopWindowsOnly(); break;
        case 2: p = v[i]->GetStatusDesktop(); break;
        case 3: p = v[i]->GetStatusWebApplication(); break;
      }
      std::string s;
      switch (p)
      {
        case ProgramStatus::yes: s = r.GetGreen(); break;
        case ProgramStatus::no: s = r.GetRed(); break;
        case ProgramStatus::nvr: s = r.GetBlack(); break;
        case ProgramStatus::n_a: s = r.GetBlack(); break;
        case ProgramStatus::wip: s = r.GetYellow(); break;
        case ProgramStatus::tbd: s = r.GetOrange(); break;
        case ProgramStatus::unk: s = r.GetBlack(); break;
      }
      m_ui.m_table->elementAt(i+1,j+1)->addWidget(new Wt::WImage(s.c_str()));
    }
  }
  {
    const int n_rows = m_ui.m_table->rowCount();
    for (int i=0; i!=n_rows; ++i)
    {
      //ui.m_table->rowAt(i)->elementAt(0)->set
    }
  }
  m_ui.m_table->clicked().connect(this,&ribi::RichelBilderbeek::WtGalleryDialog::OnClick);
}
const std::vector<std::string> ribi::GalleryMenuDialog::CreateHtmlStatus() const noexcept
{
  std::vector<std::string> v;

  //Add header
  {
    v = c2h::Header::ToHtml(c2h::HeaderType::cpp,"CppRichelBilderbeekStatus.htm");
  }

  QtResources r;

  v.push_back("<table border=\"1\">");
  v.push_back(
    "<tr>"
      "<th>Name</th>"
      "<th><img src=\"" +  r.GetCl() +"\" alt=\"Console application\"/></th>"
      "<th><img src=\"" +  r.GetWindows() +"\" alt=\"Desktop (Windows only) application\"/></th>"
      "<th><img src=\"" +  r.GetDesktop() +"\" alt=\"Desktop application\"/></th>"
      "<th><img src=\"" +  r.GetWeb() +"\" alt=\"Web application\"/></th>"
    "</tr>");

  const std::vector<boost::shared_ptr<Program> > ps = Program::GetAllPrograms();

  std::for_each(ps.begin(),ps.end(),
    [&v,r](const boost::shared_ptr<Program>& p)
    {
      std::string s
        = "<tr>"
          "<td><a href=\""+p->GetUrl()+"\">" + p->GetName() + "</a></td>";
      for (int j=0; j!=4; ++j)
      {
        ProgramStatus status =  ProgramStatus::unk;
        switch (j)
        {
          case 0: status = p->GetStatusConsole(); break;
          case 1: status = p->GetStatusDesktopWindowsOnly(); break;
          case 2: status = p->GetStatusDesktop(); break;
          case 3: status = p->GetStatusWebApplication(); break;
        }
        std::string filename;
        switch (status)
        {
          case ProgramStatus::yes: filename = r.GetGreen(); break;
          case ProgramStatus::no: filename = r.GetRed(); break;
          case ProgramStatus::nvr: filename = r.GetBlack(); break;
          case ProgramStatus::n_a: filename = r.GetBlack(); break;
          case ProgramStatus::wip: filename = r.GetYellow(); break;
          case ProgramStatus::tbd: filename = r.GetOrange(); break;
          case ProgramStatus::unk: filename = r.GetBlack(); break;
        }
        s += "<td><img src=\"" + filename +"\" alt=\""+ filename +"\"/></td>";
      }
      s+="</tr>";
      v.push_back(s);
    }
  );

  v.push_back("</table>");

  //Add footer
  {
    const std::vector<std::string> w { c2h::Footer::ToHtml(c2h::FooterType::cpp) };
    std::copy(w.begin(),w.end(),std::back_inserter(v));
  }

  return v;
}