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

#include"axyftp.h"
#include"utils.h"
#include"functions.h"
#include"progress_dialog.h"

static void translate_time(char* buf,long tot){
  long hours;
  long mins;
  long secs;

  hours=tot/(60*60);
  tot-=(hours*60*60);
  mins=tot/60;
  tot-=(mins*60);
  secs=tot;

  if(hours){
    sprintf(buf,"%ld:%.2ld:%.2ld",hours,mins,secs);
  } else {
    sprintf(buf,"%ld:%.2ld",mins,secs);
  }
}

#ifdef BUILD_GTK

#include<gtk/gtk.h>

static int xfer_cancel_cb(GtkWidget* w){
  appdata.small_interrupt=1;
  gtk_widget_set_sensitive(WXnameToWidget(w,"Cancel"),FALSE);
  return TRUE;
}

void update_progress_dialog(GtkWidget* w,
    int value,long size,float rate,long elapsed,long left){
  GtkWidget *child;
  char buf[25];

  if(value>=0){
    sprintf(buf,"%d %%",value);
    child=WXnameToWidget(w,"percent");
    gtk_label_set(GTK_LABEL(child),buf);

    child=WXnameToWidget(w,"Scrollbar");
    gtk_progress_bar_update(GTK_PROGRESS_BAR(child),((float)value)/100.);
  }

  if(size>=0){
    child=WXnameToWidget(w,"size");
    sprintf(buf,"%ld",size);
    gtk_label_set(GTK_LABEL(child),buf);
  }
  
  if(rate>=0){
    child=WXnameToWidget(w,"rate");
    sprintf(buf,"%.3f kBps",rate);
    gtk_label_set(GTK_LABEL(child),buf);
  }
  
  if(elapsed>=0){
    child=WXnameToWidget(w,"elapsed");
    translate_time(buf,elapsed);
    gtk_label_set(GTK_LABEL(child),buf);
  }
  
  if(left>=0){
    child=WXnameToWidget(w,"left");
    translate_time(buf,left);
    gtk_label_set(GTK_LABEL(child),buf);
  }
}

void init_progress_dialog(GtkWidget* w,char* name,long size){
  GtkWidget *child;
  char* buf;
  
  child=WXnameToWidget(w,"toptext");
  buf=WXmalloc(strlen(name)+30);
  sprintf(buf,"%s (%ld bytes)",name,size);
  gtk_label_set(GTK_LABEL(child),buf);
  WXfree(buf);

  child=WXnameToWidget(w,"percent");
  gtk_label_set(GTK_LABEL(child),"0");

  child=WXnameToWidget(w,"Scrollbar");
  gtk_progress_bar_update(GTK_PROGRESS_BAR(child),0);

  child=WXnameToWidget(w,"size");
  gtk_label_set(GTK_LABEL(child),"0");
  
  child=WXnameToWidget(w,"rate");
  gtk_label_set(GTK_LABEL(child),"? kBps");
  
  child=WXnameToWidget(w,"elapsed");
  gtk_label_set(GTK_LABEL(child),"0:00");
  
  child=WXnameToWidget(w,"left");
  gtk_label_set(GTK_LABEL(child),"?:??");
  
  child=WXnameToWidget(w,"Cancel");
  gtk_widget_set_sensitive(child,TRUE);
}

void show_progress_dialog(GtkWidget* w){
  gtk_window_position(GTK_WINDOW(w),GTK_WIN_POS_NONE);
  gtk_widget_show(w);
  process_events();
}

void hide_progress_dialog(GtkWidget* w){
  gtk_widget_hide(w);
  process_events();
}

GtkWidget* create_progress_dialog(GtkWidget* parent){
  GtkWidget *progress,*vbox,*hbox,*labels,*al;
  GtkWidget *toptext,*scale,*scroll,*size,*rate,*elapsed,*left,*cancel;
  GtkStyle* ns;

  progress=gtk_window_new(GTK_WINDOW_DIALOG);
  gtk_widget_realize(progress);
  /*
  gdk_window_set_functions(progress->window,0);
  gdk_window_set_decorations(progress->window,0);
  */
  gtk_window_set_title(GTK_WINDOW(progress),"AxY FTP transfer");
  gtk_container_border_width(GTK_CONTAINER(progress),6);
  gtk_widget_set_usize(progress,gdk_string_width(mystyle->font,"Cancel")*15,
      gtkfontheight*7.5);

  vbox=gtk_vbox_new(FALSE,2);
  gtk_container_add(GTK_CONTAINER(progress),vbox);
  gtk_widget_show(vbox);

  toptext=gtk_label_new("");
  gtk_box_pack_start(GTK_BOX(vbox),toptext,TRUE,TRUE,2);
  gtk_widget_show(toptext);
  gtk_widget_set_name(toptext,"toptext");

  scale=gtk_label_new("");
  gtk_box_pack_start(GTK_BOX(vbox),scale,TRUE,TRUE,2);
  gtk_widget_show(scale);
  gtk_widget_set_name(scale,"percent");

  scroll=gtk_progress_bar_new();
  gtk_box_pack_start(GTK_BOX(vbox),scroll,FALSE,FALSE,2);
  gtk_widget_show(scroll);
  gtk_widget_set_name(scroll,"Scrollbar");
  ns=style_full_copy(mystyle);
  ns->bg[GTK_STATE_PRELIGHT].pixel=0;
  ns->bg[GTK_STATE_PRELIGHT].red=12079;
  ns->bg[GTK_STATE_PRELIGHT].green=12079;
  ns->bg[GTK_STATE_PRELIGHT].blue=53199;
  ns->klass->xthickness=1;
  ns->klass->ythickness=1;
  gtk_widget_set_style(scroll,ns);
  gtk_widget_set_usize(scroll,0,gtkfontheight);
  
  hbox=gtk_hbox_new(FALSE,4);
  gtk_box_pack_start(GTK_BOX(vbox),hbox,TRUE,TRUE,2);
  gtk_widget_show(hbox);

  al=gtk_alignment_new(1,0.8,0,0);
  gtk_box_pack_end(GTK_BOX(hbox),al,FALSE,FALSE,2);
  gtk_widget_show(al);

  cancel=gtk_button_new_with_label(" Cancel ");
  gtk_container_add(GTK_CONTAINER(al),cancel);
  gtk_widget_show(cancel);
  gtk_widget_set_name(cancel,"Cancel");
  gtk_signal_connect(GTK_OBJECT(cancel),"clicked",
      GTK_SIGNAL_FUNC(xfer_cancel_cb),NULL);
  gtk_signal_connect(GTK_OBJECT(progress),"delete_event",
      GTK_SIGNAL_FUNC(xfer_cancel_cb),NULL);

  al=gtk_alignment_new(0,0,1,0);
  gtk_box_pack_end(GTK_BOX(hbox),al,TRUE,TRUE,2);
  gtk_widget_show(al);

  labels=gtk_hbox_new(TRUE,4);
  gtk_container_add(GTK_CONTAINER(al),labels);
  gtk_widget_show(labels);

  size=gtk_label_new("");
  gtk_box_pack_start(GTK_BOX(labels),size,TRUE,TRUE,2);
  gtk_widget_show(size);
  gtk_widget_set_name(size,"size");

  rate=gtk_label_new("");
  gtk_box_pack_start(GTK_BOX(labels),rate,TRUE,TRUE,2);
  gtk_widget_show(rate);
  gtk_widget_set_name(rate,"rate");

  elapsed=gtk_label_new("");
  gtk_box_pack_start(GTK_BOX(labels),elapsed,TRUE,TRUE,2);
  gtk_widget_show(elapsed);
  gtk_widget_set_name(elapsed,"elapsed");

  left=gtk_label_new("");
  gtk_box_pack_start(GTK_BOX(labels),left,TRUE,TRUE,2);
  gtk_widget_show(left);
  gtk_widget_set_name(left,"left");

  /*if(XAllocNamedColor(XtDisplay(parent),cmap,"#2F2FCF",&color,&exact)){*/

  return progress;
}

#elif defined BUILD_MOTIF

#include<Xm/Xm.h>
#include<Xm/Scale.h>
#include<Xm/Form.h>
#include<Xm/Label.h>
#include<Xm/PushB.h>
#include<Xm/ScrollBar.h>

static void xfer_cancel_cb(Widget w,XtPointer app,XtPointer call){
  appdata.small_interrupt=1;
  XtSetSensitive(w,False);
}

void update_progress_dialog(Widget w,
  int value,long size,float rate,long elapsed,long left){
  Widget child;
  char buf[25];
  XmString xms;


  if(value>=0){
    child=XtNameToWidget(w,"*scale");
    XtVaSetValues(child,XmNvalue,0,XmNsliderSize,(value==0)?1:value,NULL);

    child=XtNameToWidget(w,"*percent");
    sprintf(buf,"%d %%",value);
    xms=XmStringCreateLocalized(buf);
    XtVaSetValues(child,XmNlabelString,xms,NULL);
    XmStringFree(xms);
  }

  
  if(size>=0){
    child=XtNameToWidget(w,"*size");
    sprintf(buf,"%ld",size);
    xms=XmStringCreateLocalized(buf);
    XtVaSetValues(child,XmNlabelString,xms,NULL);
    XmStringFree(xms);
  }
  
  if(rate>=0){
    child=XtNameToWidget(w,"*rate");
    sprintf(buf,"%.3f kBps",rate);
    xms=XmStringCreateLocalized(buf);
    XtVaSetValues(child,XmNlabelString,xms,NULL);
    XmStringFree(xms);
  }
  
  if(elapsed>=0){
    child=XtNameToWidget(w,"*elapsed");
    translate_time(buf,elapsed);
    xms=XmStringCreateLocalized(buf);
    XtVaSetValues(child,XmNlabelString,xms,NULL);
    XmStringFree(xms);
  }
  
  if(left>=0){
    child=XtNameToWidget(w,"*left");
    translate_time(buf,left);
    xms=XmStringCreateLocalized(buf);
    XtVaSetValues(child,XmNlabelString,xms,NULL);
    XmStringFree(xms);
  }
}

void init_progress_dialog(Widget w,char* name,long size){
  Widget child;
  char* buf;
  XmString xms;
  
  child=XtNameToWidget(w,"*toptext");
  buf=XtMalloc(strlen(name)+30);
  sprintf(buf,"%s (%ld bytes)",name,size);
  xms=XmStringCreateLocalized(buf);
  XtVaSetValues(child,XmNlabelString,xms,NULL);
  XmStringFree(xms);
  XtFree(buf);

  child=XtNameToWidget(w,"*percent");
  xms=XmStringCreateLocalized("0 %");
  XtVaSetValues(child,XmNlabelString,xms,NULL);
  XmStringFree(xms);

  child=XtNameToWidget(w,"*scale");
  XtVaSetValues(child,XmNvalue,0,XmNsliderSize,1,NULL);

  child=XtNameToWidget(w,"*size");
  xms=XmStringCreateLocalized("0");
  XtVaSetValues(child,XmNlabelString,xms,NULL);
  XmStringFree(xms);
  
  child=XtNameToWidget(w,"*rate");
  xms=XmStringCreateLocalized("? kBps");
  XtVaSetValues(child,XmNlabelString,xms,NULL);
  XmStringFree(xms);
  
  child=XtNameToWidget(w,"*elapsed");
  xms=XmStringCreateLocalized("0:00");
  XtVaSetValues(child,XmNlabelString,xms,NULL);
  XmStringFree(xms);
  
  child=XtNameToWidget(w,"*left");
  xms=XmStringCreateLocalized("?:??");
  XtVaSetValues(child,XmNlabelString,xms,NULL);
  XmStringFree(xms);
  
  child=XtNameToWidget(w,"*Cancel");
  XtSetSensitive(child,True);
}

void show_progress_dialog(Widget w){
  XtManageChild(w);
  XmUpdateDisplay(toplevel);
  process_events();
}

void hide_progress_dialog(Widget w){
  XtUnmanageChild(w);
  XmUpdateDisplay(toplevel);
  XmUpdateDisplay(w);
  process_events();
/*  XtDestroyWidget(w);*/
}

static void slider_cb(Widget w,XtPointer app,XtPointer call){
  XtVaSetValues(w,XmNvalue,0,NULL);
  return;
}

Widget create_progress_dialog(Widget parent){
  Widget progress;
  Widget toptext,scale,size,rate,elapsed,left,cancel,percent;
  Arg args[15];
  Cardinal n;
  Dimension d;
  XmString xms;
  Colormap cmap;
  XColor color,exact;

  n=0;
  XtSetArg(args[n],XmNtitle,"AxY FTP transfer");n++;
  /*XtSetArg(args[n],XmNdialogStyle,XmDIALOG_APPLICATION_MODAL);n++;*/
  XtSetArg(args[n],XmNverticalSpacing,6);n++;
  XtSetArg(args[n],XmNhorizontalSpacing,6);n++;
  XtSetArg(args[n],XmNresizePolicy,XmRESIZE_NONE);n++;
  XtSetArg(args[n],XmNinput,False);n++;
  progress=XmCreateFormDialog(parent,"progress",args,n);

  xms=XmStringCreateLocalized("|");
  n=0;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM);n++;
  XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM);n++;
  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE);n++;
  XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM);n++;
  XtSetArg(args[n],XmNresizable,True);n++;
  XtSetArg(args[n],XmNlabelString,xms);n++;
  XtSetArg(args[n],XmNmarginLeft,12);n++;
  XtSetArg(args[n],XmNalignment,XmALIGNMENT_CENTER);n++;
  XtSetArg(args[n],XmNrecomputeSize,True);n++;
  toptext=XmCreateLabel(progress,"toptext",args,n);
  XtManageChild(toptext);
  
  n=0;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNtopWidget,toptext);n++;
  XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM);n++;
  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE);n++;
  XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM);n++;
  XtSetArg(args[n],XmNresizable,True);n++;
  XtSetArg(args[n],XmNlabelString,xms);n++;
  XtSetArg(args[n],XmNmarginTop,10);n++;
  XtSetArg(args[n],XmNalignment,XmALIGNMENT_CENTER);n++;
  XtSetArg(args[n],XmNrecomputeSize,FALSE);n++;
  percent=XmCreateLabel(progress,"percent",args,n);
  XtManageChild(percent);

  /*
  n=0;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNtopWidget,percent);n++;
  XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM);n++;
  XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM);n++;
  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE);n++;
  XtSetArg(args[n],XmNorientation,XmHORIZONTAL);n++;
  XtSetArg(args[n],XmNprocessingDirection,XmMAX_ON_RIGHT);n++;
  XtSetArg(args[n],XmNslidingMode,XmTHERMOMETER);n++;
  XtSetArg(args[n],XmNhighlightThickness,0);n++;
  XtSetArg(args[n],XmNsliderVisual,XmFOREGROUND_COLOR);n++;
  XtSetArg(args[n],XmNshowValue,FALSE);n++;
  scale=XmCreateScale(progress,"scale",args,n);
  XtManageChild(scale);

  XtVaGetValues(parent,XmNcolormap,&cmap,NULL);
  if(XAllocNamedColor(XtDisplay(parent),cmap,"#2F2FCF",&color,&exact)){
    scroll=XtNameToWidget(scale,"*Scrollbar");
    XtVaSetValues(scroll,XmNforeground,color.pixel,NULL);
  }
  */

  n=0;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNtopWidget,percent);n++;
  XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM);n++;
  XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM);n++;
  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE);n++;

  XtSetArg(args[n],XmNhighlightThickness,0);n++;
  /*XtSetArg(args[n],XmNsensitive,FALSE);n++;*/
  XtSetArg(args[n],XmNminimum,0);n++;
  XtSetArg(args[n],XmNmaximum,100);n++;
  XtSetArg(args[n],XmNvalue,0);n++;
  XtSetArg(args[n],XmNorientation,XmHORIZONTAL);n++;
  XtSetArg(args[n],XmNprocessingDirection,XmMAX_ON_RIGHT);n++;
  XtSetArg(args[n],XmNshowArrows,FALSE);n++;
  XtSetArg(args[n],XmNsliderSize,1);n++;
  XtVaGetValues(parent,XmNcolormap,&cmap,NULL);
  if(XAllocNamedColor(XtDisplay(parent),cmap,"#2F2FCF",&color,&exact)){
    XtSetArg(args[n],XmNtroughColor,color.pixel);n++;
  }
  scale=XmCreateScrollBar(progress,"scale",args,n);
  XtManageChild(scale);
  XtAddCallback(scale,XmNvalueChangedCallback,slider_cb,NULL);
  XtAddCallback(scale,XmNdragCallback,slider_cb,NULL);

  n=0;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNtopWidget,scale);n++;
  XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM);n++;
  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE);n++;
  XtSetArg(args[n],XmNrightAttachment,XmATTACH_POSITION);n++;
  XtSetArg(args[n],XmNrightPosition,1*100/5);n++;
  XtSetArg(args[n],XmNresizable,True);n++;
  XtSetArg(args[n],XmNlabelString,xms);n++;
  XtSetArg(args[n],XmNmarginLeft,12);n++;
  XtSetArg(args[n],XmNrecomputeSize,True);n++;
  size=XmCreateLabel(progress,"size",args,n);
  XtManageChild(size);

  n=0;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNtopWidget,scale);n++;
  XtSetArg(args[n],XmNleftAttachment,XmATTACH_POSITION);n++;
  XtSetArg(args[n],XmNleftPosition,1*100/5);n++;
  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE);n++;
  XtSetArg(args[n],XmNrightAttachment,XmATTACH_POSITION);n++;
  XtSetArg(args[n],XmNrightPosition,2*100/5);n++;
  XtSetArg(args[n],XmNresizable,True);n++;
  XtSetArg(args[n],XmNlabelString,xms);n++;
  XtSetArg(args[n],XmNmarginLeft,12);n++;
  XtSetArg(args[n],XmNrecomputeSize,True);n++;
  rate=XmCreateLabel(progress,"rate",args,n);
  XtManageChild(rate);

  n=0;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNtopWidget,scale);n++;
  XtSetArg(args[n],XmNleftAttachment,XmATTACH_POSITION);n++;
  XtSetArg(args[n],XmNleftPosition,2*100/5);n++;
  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE);n++;
  XtSetArg(args[n],XmNrightAttachment,XmATTACH_POSITION);n++;
  XtSetArg(args[n],XmNrightPosition,3*100/5);n++;
  XtSetArg(args[n],XmNresizable,True);n++;
  XtSetArg(args[n],XmNlabelString,xms);n++;
  XtSetArg(args[n],XmNmarginLeft,12);n++;
  XtSetArg(args[n],XmNrecomputeSize,True);n++;
  elapsed=XmCreateLabel(progress,"elapsed",args,n);
  XtManageChild(elapsed);

  n=0;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNtopWidget,scale);n++;
  XtSetArg(args[n],XmNleftAttachment,XmATTACH_POSITION);n++;
  XtSetArg(args[n],XmNleftPosition,3*100/5);n++;
  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_NONE);n++;
  XtSetArg(args[n],XmNrightAttachment,XmATTACH_POSITION);n++;
  XtSetArg(args[n],XmNrightPosition,4*100/5);n++;
  XtSetArg(args[n],XmNresizable,True);n++;
  XtSetArg(args[n],XmNlabelString,xms);n++;
  XtSetArg(args[n],XmNmarginLeft,12);n++;
  XtSetArg(args[n],XmNrecomputeSize,True);n++;
  left=XmCreateLabel(progress,"left",args,n);
  XtManageChild(left);

  n=0;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNtopWidget,scale);n++;
  XtSetArg(args[n],XmNleftAttachment,XmATTACH_NONE);n++;
  XtSetArg(args[n],XmNbottomAttachment,XmATTACH_FORM);n++;
  XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM);n++;
  cancel=XmCreatePushButton(progress,"Cancel",args,n);
  XtManageChild(cancel);
  XtAddCallback(cancel,XmNactivateCallback,xfer_cancel_cb,NULL);
  XtAddCallback(cancel,XmNdisarmCallback,xfer_cancel_cb,NULL);

  XtVaGetValues(cancel,XmNwidth,&d,NULL);
  XtVaSetValues(progress,XmNwidth,d*10,NULL);

  XmStringFree(xms);

  return progress;
}

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


syntax highlighted by Code2HTML, v. 0.9.1