/*->c.viewlo    */

/* Spark!   (c) D. J. Pilling,     April 1989                         */
/*                   Filing System  Interface                         */


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <ctype.h>
#include <time.h>

#include "h.os"
#include "h.wimp"
#include "h.sprite"
#include "h.bbc"
#include "h.flex"


#include "h.wos"
#include "h.timex"



#include "h.view"


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


void createicon(int posn)
{
  int icon;

  wimp_icreate wic;

  wic.w=viewhandle[view];
  wic.i.box.x0=vtable[view][posn].x+HMARGIN;
  wic.i.box.y0=vtable[view][posn].y+VMARGIN;
  wic.i.box.x1=vtable[view][posn].x+WIDTH-HMARGIN;
  wic.i.box.y1=vtable[view][posn].y+HEIGHT-VMARGIN;

  wic.i.data.indirecttext.buffer=leaf(vtable[view][posn].lname);
  wic.i.data.indirecttext.bufflen=strlen(wic.i.data.indirecttext.buffer);

  if(viewdisp[view])
  {
    if(vtable[view][posn].tiny[0])
    {
     wic.i.flags=wimp_ITEXT    | wimp_ISPRITE   | wimp_INDIRECT   | 0xA000 |
      wimp_IVCENTRE |wimp_IFORECOL*7 | wimp_IBACKCOL*1 | wimp_IREDRAW;
     wic.i.data.indirecttext.validstring=vtable[view][posn].tiny;
    }
    else
    {
     wic.i.data.indirecttext.validstring=vtable[view][posn].typs;
     wic.i.flags=wimp_ITEXT    | wimp_ISPRITE   | wimp_INDIRECT   | 0xA000 |
                 wimp_IVCENTRE |wimp_IFORECOL*7 | wimp_IBACKCOL*1 |
         wimp_IFILLED  |wimp_IHALVESPRITE  | wimp_IREDRAW;
    }
  }
  else
  {
     wic.i.data.indirecttext.validstring=vtable[view][posn].typs;
     wic.i.flags=wimp_ITEXT    | wimp_ISPRITE    | wimp_INDIRECT  | 0xA000 |
        wimp_IHCENTRE | wimp_IFORECOL*7 | wimp_IBACKCOL*1 | wimp_IREDRAW;
  }


  if(vtable[view][posn].selected)
                wic.i.flags |= wimp_ISELECTED;

  wimp_create_icon(&wic,&icon);

  vtable[view][posn].icon=icon;
}



/*

void createtexticon(int posn)
{
  int icon;
  wimp_icreate wic;

  wic.w=viewhandle[view];
  wic.i.box.x0=vtable[view][posn].x+WIDTH;
  wic.i.box.y0=vtable[view][posn].y+VMARGIN;
  wic.i.box.x1=vtable[view][posn].x+WIDTH+TEXTW;
  wic.i.box.y1=vtable[view][posn].y+HEIGHT-VMARGIN;

  writetextdata(posn);

  wic.i.data.indirecttext.buffer=vtable[view][posn].text;
  wic.i.data.indirecttext.bufflen=strlen(vtable[view][posn].text);
  wic.i.data.indirecttext.validstring=NULL;

  wic.i.flags=wimp_ITEXT | wimp_INDIRECT   | 0x6000 |
                 wimp_IVCENTRE |wimp_IFORECOL*7 | wimp_IBACKCOL*1;

  wimp_create_icon(&wic,&icon);
  vtable[view][posn].icons=icon;
}

*/




void trashicons(int v)
{
 int i;


 if(viewhandle[v])
 {
  for(i=0;i<vnofiles[v];i++)
  {
   if(vtable[view][i].icon!=-1)
   {
    wimp_delete_icon(viewhandle[v],vtable[view][i].icon);
    vtable[view][i].icon=-1;
   }
  }
 }
}



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


void swopentries(int rank[],int i,int j) /* swop around two entries */
{
 int temp;
 temp=rank[j];
 rank[j]=rank[i];
 rank[i]=temp;
}


int xcmp(const void * x1p,const void * x2p)
{
 /*
    return  0 if x1==x2
            1 if x1>x2
           -1 if x1<x2
 */

 int x1=*((int *) x1p);
 int x2=*((int *) x2p);

 switch(viewsort[view])
  {
   case 1: /* sort by type */
          if(vtable[view][x1].stat.type==vtable[view][x2].stat.type)
              {
               if(x1==x2)
                                return(0);
               else
               if(x1>x2)
                                return(1);
               else
                                return(-1);
              }
          else
          if(vtable[view][x1].stat.type<vtable[view][x2].stat.type)
                                return(1);
          else
                                return(-1);
          break;

   case 2: /* sort by size */

          if(vtable[view][x1].stat.length==vtable[view][x2].stat.length)
                                return(0);
          else
          if(vtable[view][x1].stat.length<vtable[view][x2].stat.length)
                                return(1);
          else
                                return(-1);
          break;

   case 3: /* sort by date */

          return(cmptimes(&vtable[view][x1].stat,&vtable[view][x2].stat));
          break;
  }

 return(1);
}


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

void calcposns(void)
{
 int i,xn;

 int rank[512];

 xn=viewxn[view];

 for(i=0;i<vnofiles[view];i++) rank[i]=i;

 /* sort ? */

 if(viewsort[view] && vnofiles[view])
  qsort(rank,vnofiles[view],sizeof(int),xcmp);

 for(i=0;i<vnofiles[view];i++)
 {
  vtable[view][rank[i]].x=(i % xn)*WIDTH;
  vtable[view][rank[i]].y=-((i / xn)+1)*HEIGHT;
 }
}


void createicons(void)
{
 int i;

 for(i=0;i<vnofiles[view];i++)
 {
  createicon(i);
  if(viewdisp[view]==2) writetextdata(i);
 }
}






/* i= filenumber            */
/* size = number of entries */

void setnofiles(int i,int size)
{
 int result;

 vnofiles[i]=size;
 size+=MINENTRY;
 result=flex_extend((flex_ptr)(&vtable[i]),size*sizeof(ficon));
 if(!result)
 {
  errorbox("{MEMERR}");
 }
}


void bootfile(void)
{ 
 int i;

 view=-1;

 for(i=0;i<BATN;i++)
 {
  vactive[i]=0;
  vnofiles[i]=0;
  viewhandle[i]=0;
 }

 for(i=0;i<BATN;i++)
 {
  flex_alloc((flex_ptr)(&vtable[i]),MINENTRY*sizeof(ficon));
  if(!vtable[i]) fatalerror("{MEMERR}");
 }
}



int getview(int window)   /* set vdi and file off current window */
{
 int i;

 for(i=0;i<BATN;i++) if(viewhandle[i]==window) break;

 if(i==BATN) return(0); 

 view=i;
 return(1);
}

