#include <stdio.h>
#include <Menu.h>

#include "DrawView.h"
#include "QuelInfo.h"
#include "IconShape.h"
#include "Window.h"
#include "Dialog.h"
#ifdef ET25
#include "Fields.h"
#include "Cluster.h"
#include "BorderItems.h"
#else
#include "EditTextItem.h"
#endif
#include "Buttons.h"
#include "dynload.h"

const int	district_id= 10020;

extern "C" void make_district_menu();

class DistDialog: public Dialog {
#ifdef ET25
  TextField	*eti;
#else
  EditTextItem	*eti;
#endif
  bool		cancelled;
public:
#ifdef ET25
  DistDialog(): ("District distance") {};
#else
  DistDialog(): ("District distance", eBWinBlock) {};
#endif
  VObject *DoCreateDialog();
  void Control(int id, int part, void *v);

  double MaxDist() {
#ifdef ET25
    return atof(eti->AsString());
#else
    return atof(eti->GetText()->AsString());
#endif
  }
  bool Cancelled() { return cancelled; }
};

VObject *DistDialog::DoCreateDialog() {
  return
  new Cluster(cIdNone, eVObjHLeft, 5,
    new BorderItem("Enter maximum distance",
#ifdef ET25
      eti= new TextField(cIdNone, 20)),
#else
      eti= new EditTextItem(cIdNone)),
#endif
    new Cluster(cIdNone, eVObjVCenter, Point(10),
      new ActionButton(cIdOk, "Compute", TRUE),
      new ActionButton(cIdCancel, "Cancel"),
      0),
    0);
}

void DistDialog::Control(int id, int part, void *v)
{
  cancelled= (id == cIdCancel);
  Dialog::Control(id, part, v);
}


void make_district_menu(DrawView *dv, Menu *m, int i)
{
  switch (i) {
  case 0:
    fprintf(stderr, "Creating district menu\n");
    m->AppendItems("-", "Find District", district_id, 0);
    break;

  case district_id:
    QueryShape	*qs;
    long	start_oid;
    char	s[1000];

    dv->SetMessage("Select start of district");
    if (!(qs= dv->SelectShape()))
      return;
    start_oid= qs->GetOid();

    DistDialog	*dd= new DistDialog;
    dd->Show();
    double max_dist= dd->MaxDist();
    delete dd;

    dv->SetMessage("Computing district...");

    dv->HourOn();
    sprintf(s, "./finddistrict %ld %f %s",
      start_oid, max_dist, GetDb());
    system(s);

    dv->HourOff();
    dv->DoQueryRefresh();
    dv->SetMessage("Computed district");
    break;

  case -1:
    m->EnableItem(district_id);
    break;
  }
}
