/* Copyright (c) 1998   Alexander Yukhimets. All rights reserved. */
#include<string.h>
#include<unistd.h>
#include<stdio.h>

#include"axyftp.h"
#include"utils.h"
#include"dirinfo.h"
#include"viewer.h"

#ifdef BUILD_GTK

#include<gtk/gtk.h>

void fill_dirinfo(GtkWidget* text,dirinfo* di){
  int i;
  char* line;
  for(i=1;i<=di->total;i++){
    line=get_fileinfo_string(di->files[i]);
    if(line){
      gtk_text_set_point(GTK_TEXT(text),gtk_text_get_length(GTK_TEXT(text)));
      gtk_text_insert(GTK_TEXT(text),NULL,NULL,NULL,line,-1);
      WXfree(line);
    }
  }
  gtk_text_set_point(GTK_TEXT(text),0);
}

int fill_viewer(GtkWidget* text,int fd){
  char buf[1025];
  int len;

  while((len=read(fd,buf,1024))>0){
    buf[len]='\0';
    gtk_text_set_point(GTK_TEXT(text),gtk_text_get_length(GTK_TEXT(text)));
    gtk_text_insert(GTK_TEXT(text),NULL,NULL,NULL,buf,-1);
  }
  close(fd);
  return len;
}

static void destroy_cb(GtkWidget* w){
  while(!GTK_IS_WINDOW(w))w=gtk_widget_get_toplevel(w);
  gtk_widget_destroy(w);
}

GtkWidget* create_viewer(GtkWidget* parent,char* name){
  GtkWidget *viewer,*box,*text,*actions,*align,*button,*scroll;
  char* title;

  title=WXmalloc(strlen(name)+20);
  sprintf(title,"AxY FTP viewer - %s",name);

  viewer=gtk_dialog_new();
  gtk_window_set_title(GTK_WINDOW(viewer),title);
  WXfree(title);

  gtk_container_border_width(GTK_CONTAINER(viewer),6);

  box=gtk_hbox_new(FALSE,0);
  gtk_box_pack_start(GTK_BOX(GTK_DIALOG(viewer)->vbox),box,TRUE,TRUE,0);
  gtk_widget_show(box);

  text=gtk_text_new(NULL,NULL);
  gtk_box_pack_start(GTK_BOX(box),text,TRUE,TRUE,0);
  gtk_widget_show(text);
  gtk_widget_set_usize(text,gdk_string_width(mystyle->font,"W")*80+8,
      gtkfontheight*24+8);

  scroll=gtk_vscrollbar_new(GTK_TEXT(text)->vadj);
  gtk_box_pack_start(GTK_BOX(box),scroll,FALSE,FALSE,0);
  gtk_widget_show(scroll);

  /*scroll=gtk_hscrollbar_new(GTK_TEXT(text)->hadj);
  gtk_box_pack_start(GTK_BOX(GTK_DIALOG(viewer)->vbox),scroll,FALSE,FALSE,0);
  gtk_widget_show(scroll);*/
  
  actions=gtk_hbox_new(TRUE,6);
  gtk_container_add(GTK_CONTAINER(GTK_DIALOG(viewer)->action_area),actions);
  gtk_widget_show(actions);

  align=gtk_alignment_new(0.5,0.5,0,0);
  gtk_box_pack_start(GTK_BOX(actions),align,TRUE,TRUE,4);
  gtk_widget_show(align);

  button=gtk_button_new_with_label(" CANCEL ");
  gtk_container_add(GTK_CONTAINER(align),button);
  gtk_widget_show(button);

  gtk_signal_connect(GTK_OBJECT(button),"clicked",
      GTK_SIGNAL_FUNC(destroy_cb),NULL);
  gtk_signal_connect(GTK_OBJECT(viewer),"destroy",
      GTK_SIGNAL_FUNC(destroy_cb),NULL);
  /*
  XtAddCallback(XtParent(viewer),XmNpopdownCallback,destroy_cb,NULL);
  */

  gtk_widget_show(viewer);

  return text;
}

#elif defined BUILD_MOTIF

#include<Xm/Xm.h>
#include<Xm/Form.h>
#include<Xm/Text.h>
#include<Xm/Label.h>
#include<Xm/PushB.h>

void fill_dirinfo(Widget text,dirinfo* di){
  int i;
  char* line;
  for(i=1;i<=di->total;i++){
    line=get_fileinfo_string(di->files[i]);
    if(line){
      XmTextInsert(text,XmTextGetLastPosition(text),line);
      XtFree(line);
    }
  }
  XmTextShowPosition(text,0);
  XmUpdateDisplay(text);
}


int fill_viewer(Widget text,int fd){
  char buf[1025];
  int len;

  while((len=read(fd,buf,1024))>0){
    buf[len]='\0';
    XmTextInsert(text,XmTextGetLastPosition(text),buf);
    XmUpdateDisplay(text);
  }
  close(fd);
  return len;
}

static void destroy_cb(Widget w,XtPointer app,XtPointer call){
  while(!XtIsWMShell(w))w=XtParent(w);
  XtDestroyWidget(w);
}

Widget create_viewer(Widget parent,char* name){
  Widget viewer,text,button;
  Arg args[10];
  Cardinal n;
  Dimension d;
  Pixel white_pixel,black_pixel;
  char* title;

  white_pixel=WhitePixelOfScreen(XtScreen(parent));
  black_pixel=BlackPixelOfScreen(XtScreen(parent));
  title=XtMalloc(strlen(name)+20);
  sprintf(title,"AxY FTP viewer - %s",name);

  n=0;
  XtSetArg(args[n],XmNtitle,title);n++;
  XtSetArg(args[n],XmNtransient,False);n++;
  XtSetArg(args[n],XmNverticalSpacing,8);n++;
  viewer=XmCreateFormDialog(parent,"viewer",args,n);
  XtFree(title);
/*
  n=0;
  XtSetArg(args[n],XmNhighlightThickness,0);n++;
  XtSetArg(args[n],XmNalignment,XmALIGNMENT_CENTER);n++;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM);n++;
  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE);n++;
  XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM);n++;
  XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM);n++;
  label=XmCreateLabel(viewer,name,args,n);
  XtManageChild(label);
*/

  n=0;
  XtSetArg(args[n],XmNhighlightThickness,0);n++;
  XtSetArg(args[n],XmNrows,24);n++;
  XtSetArg(args[n],XmNcolumns,80);n++;
  XtSetArg(args[n],XmNeditable,False);n++;
  XtSetArg(args[n],XmNeditMode,XmMULTI_LINE_EDIT);n++;
  XtSetArg(args[n],XmNcursorPositionVisible,False);n++;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM);n++;
  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE);n++;
  XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM);n++;
  XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM);n++;
  text=XmCreateScrolledText(viewer,"text",args,n);
  XtManageChild(text);
  XtVaSetValues(text,XmNbackground,white_pixel,
		     XmNforeground,black_pixel,NULL);
  

  n=0;
  XtSetArg(args[n],XmNhighlightThickness,0);n++;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_NONE);n++;
  XtSetArg(args[n],XmNtopWidget,XtParent(text));n++;
  XtSetArg(args[n],XmNleftAttachment,XmATTACH_POSITION);n++;
  XtSetArg(args[n],XmNleftPosition,50);n++;
  XtSetArg(args[n],XmNrightAttachment,XmATTACH_NONE);n++;
  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM);n++;
  button=XmCreatePushButton(viewer,"CANCEL",args,n);
  XtManageChild(button);
  XtVaGetValues(button,XmNwidth,&d,NULL);
  XtVaSetValues(button,XmNleftOffset,-d/2,NULL);

  XtVaSetValues(XtParent(text),XmNbottomAttachment,XmATTACH_WIDGET,
      XmNbottomWidget,button,NULL);

  /*XtAddCallback(button,XmNactivateCallback,destroy_cb,NULL);*/
  XtAddCallback(XtParent(viewer),XmNpopdownCallback,destroy_cb,NULL);

  XtManageChild(viewer);

  return text;
}

#else
#error Either BUILD_GTK or BUILD_MOTIF should be defined
#endif


syntax highlighted by Code2HTML, v. 0.9.1