void ribi::con3::WtConnectThreeGameDialog::ShowWinner()
{
  assert(m_state = state_winner);
  assert(m_board->GetWinner() != Winner::no_winner);
  assert(!m_timer->isActive());
  //Request all info from m_board, before deleting it
  const Winner winner_index = m_board->GetWinner();
  const std::string text
    = (winner_index == Winner::draw
    ? "draw" : "winner");

  //There is a winner
  this->clear();
  Wt::WImage * winner = new Wt::WImage;

  switch(winner_index)
  {
      case Winner::player1:
        winner->setImageRef(
          m_resources
            ->GetPlayersFilenames()[0]);
        break;
      case Winner::player2:
        winner->setImageRef(
          m_resources
            ->GetPlayersFilenames()[1]);
        break;
      case Winner::player3:
        winner->setImageRef(
          m_resources
            ->GetPlayersFilenames()[2]);
        break;
      case Winner::draw:
        winner->setImageRef(
          m_resources
            ->GetEmptyFilename());
        break;
      default:
        assert(!"Should not get here");
        throw std::logic_error("Known value of GetCurrentPlayer in ribi::con3::WtConnectThreeGameDialog::OnValidMove");
  }
  this->addWidget(winner);
  this->addWidget(new Wt::WBreak);
  {
    Wt::WText * const title = new Wt::WText(text.c_str());
    title->setStyleClass("title");
    this->addWidget(title);
  }
  this->addWidget(new Wt::WBreak);
  {
    Wt::WPushButton * const button(new Wt::WPushButton("Restart",this));
    button->clicked().connect(
      this,
      &ribi::con3::WtConnectThreeGameDialog::RestartGame);
  }
}