/*
 *  Abuse - dark 2D side-scrolling platform game
 *  Copyright (c) 1995 Crack dot Com
 *  Copyright (c) 2005-2011 Sam Hocevar <sam@hocevar.net>
 *
 *  This software was released into the Public Domain. As with most public
 *  domain software, no warranty is made or implied by Crack dot Com, by
 *  Jonathan Clark, or by Sam Hocevar.
 */

#if defined HAVE_CONFIG_H
#   include "config.h"
#endif

#include <unistd.h>

#include "common.h"

#include "filesel.h"
#include "input.h"
#include "scroller.h"
#include "jdir.h"

class file_picker : public spicker
{
  char **f,**d;
  int tf,td,wid,sid;
  char cd[300];
  public:
  file_picker(int X, int Y, int ID, int Rows, ifield *Next);
  virtual int total() { return tf+td; }
  virtual int item_width() { return wm->font()->width()*wid; }
  virtual int item_height() { return wm->font()->height()+1; }
  virtual void draw_item(image *screen, int x, int y, int num, int active);
  virtual void note_selection(image *screen, InputManager *inm, int x);
  void free_up();
  ~file_picker() { free_up(); }
} ;

void file_picker::free_up()
{
  int i=0;
  for (; i<tf; i++)
    free(f[i]);
  for (i=0; i<td; i++)
    free(d[i]);
  if (tf) free(f);
  if (td) free(d);
}

void file_picker::note_selection(image *screen, InputManager *inm, int x)
{
  if (x<td)
  {
#if !defined __CELLOS_LV2__
    if (strcmp(d[x],"."))
    {
      int x1,y1,x2,y2;
      area(x1,y1,x2,y2);
      screen->bar(x1,y1,x2,y2,wm->medium_color());

      char st[200],curdir[200];
      sprintf(st,"%s/%s",cd,d[x]);
      getcwd(curdir,200);
      chdir(st);
      getcwd(cd,200);
      chdir(curdir);

      free_up();
      get_directory(cd,f,tf,d,td);
      wid=0;
      int i=0;
      for (; i<tf; i++)
      if ((int)strlen(f[i])>wid) wid=strlen(f[i]);
      for (i=0; i<td; i++)
      if ((int)strlen(d[i])+2>wid) wid=strlen(d[i])+2;
      sx=0;



      reconfigure();
      draw_first(screen);
    }
#endif
  } else
  {
    char nm[200];
    sprintf(nm,"%s/%s",cd,f[x-td]);
    text_field *link=(text_field *)inm->get(sid);
    link->change_data(nm,strlen(nm),1,screen);
  }

}

void file_picker::draw_item(image *screen, int x, int y, int num, int active)
{
  if (active)
    screen->bar(x,y,x+item_width()-1,y+item_height()-1,wm->black());

  if (num<td)
  {
    char st[100];
    sprintf(st,"<%s>",d[num]);
    wm->font()->put_string(screen,x,y,st,wm->bright_color());
  } else
    wm->font()->put_string(screen,x,y,f[num-td],wm->bright_color());
}

file_picker::file_picker(int X, int Y, int ID, int Rows, ifield *Next)
  : spicker(X,Y,0,Rows,1,1,0,Next)
{

  sid=ID;

  strcpy(cd,".");

  get_directory(cd,f,tf,d,td);
  wid=0;
  int i=0;
  for (; i<tf; i++)
    if ((int)strlen(f[i])>wid) wid=strlen(f[i]);
  for (i=0; i<td; i++)
    if ((int)strlen(d[i])+2>wid) wid=strlen(d[i])+2;
  reconfigure();
}

Jwindow *file_dialog(char const *prompt, char const *def,
             int ok_id, char const *ok_name, int cancel_id,
                     char const *cancel_name, char const *FILENAME_str,
                     int filename_id)
{
  int wh2 = 5 + wm->font()->height() + 5;
  int wh3 = wh2 + wm->font()->height() + 12;
  Jwindow *j=wm->new_window(0,0,-1,-1,
                new info_field(5, 5, 0, prompt,
                            new text_field(0, wh2, filename_id,
                       ">","****************************************",def,
                new button(50, wh3, ok_id, ok_name,
                new button(100, wh3, cancel_id, cancel_name,
                new file_picker(15, wh3 + wm->font()->height() + 10, filename_id, 8,
                      NULL))))),

                FILENAME_str);
  return j;
}