/* Copyright (c) 1998   Alexander Yukhimets. All rights reserved. */
#include"axyftp.h"
#include"utils.h"
#include"functions.h"
#include"little_dialogs.h"
#include"dirname.h"

#define MAX_VISIBLE_ITEMS 10

#ifdef BUILD_GTK

#include<gtk/gtk.h>

void clear_dirname(GtkWidget* w){
  gtk_list_clear_items(GTK_LIST(GTK_COMBO(w)->list),0,-1);
  gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(w)->entry),"");
}

static void dirname_cb(GtkWidget* w,GtkWidget* item,gpointer app){
  int which,ret;
  char *s,*mask;
  which=(int)app;

  gtk_widget_hide(gtk_widget_get_toplevel(w));
  process_events();
  gtk_label_get(GTK_LABEL(GTK_BIN(item)->child),&s);
  if(s!=NULL){
    switch(which){
      case LOCAL:
        if(strcmp(appdata.local.list->dir,s)==0)break;
        busy_cursor(TRUE);
	/*
        XtCallActionProc(w,"CBCancel",NULL,NULL,0);
        xms=XmStringCreateLocalized(appdata.local.list->dir);
        XmListSelectItem(list,xms,False);
        XmStringFree(xms);
	*/
        ret=chg_local_dirname(s);
        if(!ret){
          mask=gtk_entry_get_text(GTK_ENTRY(appdata.local.text));
          update_local(mask);
        }
        if(!appdata.job)busy_cursor(FALSE);
        break;
      case REMOTE:
	/*
        XtCallActionProc(w,"CBCancel",NULL,NULL,0);
        XmUpdateDisplay(toplevel);
	*/
        if(appdata.remote.list){
          if(strcmp(appdata.remote.list->dir,s)==0)break;
	  /*
          xms=XmStringCreateLocalized(appdata.local.list->dir);
          XmListSelectItem(list,xms,False);
          XmStringFree(xms);
	  */
        }
        if(!appdata.connected){
          (void)popup_warning_dialog(toplevel,"Not Connected");
          break;
        }
        if(!appdata.job){
          appdata.job=5;
          busy_cursor(TRUE);
          ret=chg_remote_dirname(s);
          if(!ret){
            mask=gtk_entry_get_text(GTK_ENTRY(appdata.remote.text));
            update_remote(mask);
          }
          busy_cursor(FALSE);
          appdata.job=0;
        }
        break;
      default:
        break;
    }
    return;
  }
}

static int dirtext_cb(GtkWidget* w,gpointer app){
  int which,ret;
  char* s;

  which=(int)app;
  s=gtk_entry_get_text(GTK_ENTRY(w));

  switch(which){
    case LOCAL:
      gtk_widget_hide(gtk_widget_get_toplevel(
	    GTK_WIDGET(GTK_COMBO(appdata.local.combo)->list)));
      process_events();
      if(strcmp(appdata.local.list->dir,s)==0)break;
      busy_cursor(TRUE);
      /*
      XtCallActionProc(w,"CBCancel",NULL,NULL,0);
      xms=XmStringCreateLocalized(appdata.local.list->dir);
      XmListSelectItem(list,xms,False);
      XmStringFree(xms);
      */
      ret=chg_local_dirname(s);
      if(!ret){
	char* mask=gtk_entry_get_text(GTK_ENTRY(appdata.local.text));
	update_local(mask);
      }
      if(!appdata.job)busy_cursor(FALSE);
      break;
    case REMOTE:
      gtk_widget_hide(gtk_widget_get_toplevel(
	    GTK_WIDGET(GTK_COMBO(appdata.remote.combo)->list)));
      process_events();
      /*
      XtCallActionProc(w,"CBCancel",NULL,NULL,0);
      XmUpdateDisplay(toplevel);
      */
      if(appdata.remote.list){
	if(strcmp(appdata.remote.list->dir,s)==0)break;
	/*
	xms=XmStringCreateLocalized(appdata.local.list->dir);
	XmListSelectItem(list,xms,False);
	XmStringFree(xms);
	*/
      }
      if(!appdata.connected){
	(void)popup_warning_dialog(toplevel,"Not Connected");
	break;
      }
      if(!appdata.job){
	appdata.job=5;
	busy_cursor(TRUE);
	ret=chg_remote_dirname(s);
	if(!ret){
	  char* mask=gtk_entry_get_text(GTK_ENTRY(appdata.remote.text));
	  update_remote(mask);
	}
	busy_cursor(FALSE);
	appdata.job=0;
      }
      break;
    default:
      break;
  }
  
  return TRUE;
}
  
void update_dirname(GtkWidget* combo,dirinfo *di){
  char* s;
  int found;
  GtkWidget* item;
  GList* items;

  items=GTK_LIST(GTK_COMBO(combo)->list)->children;
  found=0;
  while(items!=NULL){
    gtk_label_get(GTK_LABEL(GTK_BIN(items->data)->child),&s);
    if(strcmp(di->dir,s)==0){
      found=1;
      break;
    }
    items=items->next;
  }

  if(!found){
    item=gtk_list_item_new_with_label(di->dir);
    gtk_widget_show(item);
    items=(GList*)WXmalloc(sizeof(GList));
    items->next=NULL;
    items->prev=NULL;
    items->data=(gpointer)item;
    gtk_list_prepend_items(GTK_LIST(GTK_COMBO(combo)->list),items);
  }
  gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry),di->dir);
  return;
}


GtkWidget* create_dirname(GtkWidget* parent,int which){
  GtkWidget *dirname;

  dirname=gtk_combo_new();
  gtk_widget_set_usize(GTK_COMBO(dirname)->entry,0,gtkfontheight*2);
  gtk_widget_show(dirname);

  switch(which){
    case LOCAL:
      appdata.local.combo=dirname;
      break;
    case REMOTE:
      appdata.remote.combo=dirname;
      break;
    default:
      break;
  }

  gtk_signal_connect(GTK_OBJECT(GTK_COMBO(dirname)->list),"select_child",
    GTK_SIGNAL_FUNC(dirname_cb),(gpointer)which);

  gtk_signal_connect(GTK_OBJECT(GTK_COMBO(dirname)->entry),"activate",
    GTK_SIGNAL_FUNC(dirtext_cb),(gpointer)which);

  return dirname;

}

#elif defined BUILD_MOTIF

#include<Xm/Xm.h>
#include<Xm/RowColumn.h>
#include<Dt/ComboBox.h>
#include<Xm/TextF.h>
#include<Xm/List.h>

void clear_dirname(Widget w){
  Widget list,text;

  list=XtNameToWidget(w,"*List");
  text=XtNameToWidget(w,"*Text");
  /*XtVaGetValues(w,DtNtextField,&child,NULL);*/

  XmTextFieldSetString(text,"");

  /*XtVaGetValues(w,DtNlist,&child,NULL);*/
  XmListDeleteAllItems(list);
  /*
  XtVaSetValues(w,DtNvisibleItemCount,1,NULL);
  XtVaSetValues(list,XmNvisibleItemCount,1,NULL);
  */
  /*XmComboBoxUpdate(w);*/
}

void dirfield_cb(Widget w,XtPointer app,XtPointer call){
  XmAnyCallbackStruct *cbs;
  int which,ret;
  String s,mask;
  Widget text,list,combo;
  /*XmString xms;*/
  cbs=(XmAnyCallbackStruct*)call;
  which=(int)app;
  
  if(cbs->event==NULL || 
     cbs->event->type==ButtonPress || cbs->event->type==ButtonRelease){
    return;
  } 

  text=w;
  do {
    combo=XtParent(w);
  } while(!XtIsSubclass(combo,dtComboBoxWidgetClass));
  list=XtNameToWidget(combo,"*List");
  /*XtVaGetValues(w,DtNlist,&list,DtNtextField,&text,NULL);*/

  s=XmTextFieldGetString(text);

  switch(which){
    case LOCAL:
      if(strcmp(appdata.local.list->dir,s)==0) {
	int p=XmTextFieldGetLastPosition(text);
	XmTextFieldShowPosition(text,p);
	XmTextFieldSetInsertionPosition(text,p);
	break;
      }
      busy_cursor(True);
      /*XtCallActionProc(list,"ListKbdCancel",NULL,NULL,0);*/
      /*XtCallActionProc(w,"ComboBoxKbdCancel",NULL,NULL,0);*/
      /*XmUpdateDisplay(toplevel);*/
      /*xms=XmStringCreateLocalized(appdata.local.list->dir);*/
      /*DtComboBoxSelectItem(w,xms);*/
      /*XmListSelectItem(list,xms,False);*/
      /*XmStringFree(xms);*/
      ret=chg_local_dirname(s);
      if(!ret){
	mask=XmTextFieldGetString(appdata.local.text);
	update_local(mask);
	XtFree(mask);
      }
      if(!appdata.job)busy_cursor(False);
      break;
    case REMOTE:
      /*XtCallActionProc(list,"ListKbdCancel",NULL,NULL,0);*/
      /*XtCallActionProc(w,"ComboBoxKbdCancel",NULL,NULL,0);*/
      /*XmUpdateDisplay(toplevel);*/
      if(appdata.remote.list){
	if(strcmp(appdata.remote.list->dir,s)==0){
	  int p=XmTextFieldGetLastPosition(text);
	  XmTextFieldShowPosition(text,p);
	  XmTextFieldSetInsertionPosition(text,p);
	  break;
	}
	/*xms=XmStringCreateLocalized(appdata.local.list->dir);*/
	/*XmListSelectItem(list,xms,False);*/
	/*XmStringFree(xms);*/
      }
      if(!appdata.connected){
	(void)popup_warning_dialog(toplevel,"Not Connected");
	break;
      }
      if(!appdata.job){
	appdata.job=5;
	busy_cursor(True);
	ret=chg_remote_dirname(s);
	if(!ret){
	  mask=XmTextFieldGetString(appdata.remote.text);
	  update_remote(mask);
	  XtFree(mask);
	}
	busy_cursor(False);
	appdata.job=0;
      }
      break;
    default:
      break;
  }
  XtFree(s);
}
  
void dirname_cb(Widget w,XtPointer app,XtPointer call){
  DtComboBoxCallbackStruct *cbs;
  int which,ret;
  String s,mask;
  Widget text,list;
  /*XmString xms;*/
  cbs=(DtComboBoxCallbackStruct*)call;
  which=(int)app;
  

  list=XtNameToWidget(w,"*List");
  text=XtNameToWidget(w,"*Text");
  /*XtVaGetValues(w,DtNlist,&list,DtNtextField,&text,NULL);*/
  
  if(XmStringGetLtoR(cbs->item_or_text,XmFONTLIST_DEFAULT_TAG,&s)){

    switch(which){
      case LOCAL:
	if(strcmp(appdata.local.list->dir,s)==0){
	  int p=XmTextFieldGetLastPosition(text);
	  XmTextFieldShowPosition(text,p);
	  XmTextFieldSetInsertionPosition(text,p);
	  XmUpdateDisplay(text);
	  break;
	}
        busy_cursor(True);
	/*XtCallActionProc(list,"ListKbdCancel",NULL,NULL,0);*/
	/*XtCallActionProc(w,"ComboBoxKbdCancel",NULL,NULL,0);*/
	/*XmUpdateDisplay(toplevel);*/
	/*xms=XmStringCreateLocalized(appdata.local.list->dir);*/
	/*DtComboBoxSelectItem(w,xms);*/
	/*XmListSelectItem(list,xms,False);*/
	/*XmStringFree(xms);*/
	ret=chg_local_dirname(s);
        if(!ret){
	  mask=XmTextFieldGetString(appdata.local.text);
          update_local(mask);
	  XtFree(mask);
	}
	if(!appdata.job)busy_cursor(False);
	break;
      case REMOTE:
	/*XtCallActionProc(list,"ListKbdCancel",NULL,NULL,0);*/
	/*XtCallActionProc(w,"ComboBoxKbdCancel",NULL,NULL,0);*/
	/*XmUpdateDisplay(toplevel);*/
	if(appdata.remote.list){
	  if(strcmp(appdata.remote.list->dir,s)==0){
	    int p=XmTextFieldGetLastPosition(text);
	    XmTextFieldShowPosition(text,p);
	    XmTextFieldSetInsertionPosition(text,p);
	    break;
	  }
	  /*xms=XmStringCreateLocalized(appdata.local.list->dir);*/
	  /*XmListSelectItem(list,xms,False);*/
	  /*XmStringFree(xms);*/
	}
        if(!appdata.connected){
	  (void)popup_warning_dialog(toplevel,"Not Connected");
	  break;
	}
	if(!appdata.job){
	  appdata.job=5;
	  busy_cursor(True);
	  ret=chg_remote_dirname(s);
	  if(!ret){
	    mask=XmTextFieldGetString(appdata.remote.text);
	    update_remote(mask);
	    XtFree(mask);
	  }
	  busy_cursor(False);
	  appdata.job=0;
	}
	break;
      default:
	break;
    }
    XtFree(s);
    return;
  }
}
  
void update_dirname(Widget combo,dirinfo *di){
  Widget text,list;
  XmString item;
  XmStringTable xmt;
  int count,i;
  XmTextPosition p;

  list=XtNameToWidget(combo,"*List");
  text=XtNameToWidget(combo,"*Text");

  item=XmStringCreateLocalized(di->dir);
  XtVaGetValues(list,XmNitems,&xmt,XmNitemCount,&count,NULL);
  for(i=0;i<count;i++){
    if(XmStringByteCompare(xmt[i],item))break;
  }
  if(i==count){
    DtComboBoxAddItem(combo,item,1,FALSE);
    /*XmListAddItemUnselected(list,item,1);*/
    count++;
    if(count<=MAX_VISIBLE_ITEMS){
      XtVaSetValues(combo,DtNvisibleItemCount,count,NULL);
      XtVaSetValues(list,XmNvisibleItemCount,count,NULL);
    }
  }
  XmListSelectItem(list,item,False);
  XmStringFree(item);
  XmTextFieldSetString(text,di->dir);
  p=XmTextFieldGetLastPosition(text);
  XmTextFieldShowPosition(text,p);
  XmTextFieldSetInsertionPosition(text,p);
  /*XmComboBoxUpdate(combo);*/
  return;
}

Widget create_dirname(Widget parent,int which){
  Arg args[10];
  Cardinal n;
  Widget dirname,list,text;
  Pixel white_pixel,black_pixel;

  white_pixel=WhitePixelOfScreen(XtScreen(parent));
  black_pixel=BlackPixelOfScreen(XtScreen(parent));

  n=0;
  XtSetArg(args[n],DtNcomboBoxType,DtDROP_DOWN_COMBO_BOX);n++;
  dirname=DtCreateComboBox(parent,"dirname",args,n);
  XtManageChild(dirname);
  XtAddCallback(dirname,DtNselectionCallback,dirname_cb,(XtPointer)which);

  list=XtNameToWidget(dirname,"*List");
  text=XtNameToWidget(dirname,"*Text");

  n=0; 
  XtSetArg(args[n],XmNbackground,white_pixel);n++;
  XtSetArg(args[n],XmNforeground,black_pixel);n++;
  XtSetArg(args[n],XmNmarginWidth,3);n++;/* Motif 2.x workaround */
  XtSetArg(args[n],XmNmarginHeight,3);n++;
  XtSetArg(args[n],XmNhighlightThickness,0);n++;
  XtSetValues(text,args,n);
  XtAddCallback(text,XmNactivateCallback,dirfield_cb,(XtPointer)which);


  n=0;
  XtSetArg(args[n],XmNbackground,white_pixel);n++;
  XtSetArg(args[n],XmNforeground,black_pixel);n++;
  XtSetArg(args[n],XmNhighlightThickness,0);n++;
  XtSetArg(args[n],XmNselectionPolicy,XmBROWSE_SELECT);n++;
  XtSetValues(list,args,n);

  switch(which){
    case LOCAL:
      appdata.local.combo=dirname;
      break;
    case REMOTE:
      appdata.remote.combo=dirname;
      break;
    default:
      break;
  }

  return dirname;

}

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


syntax highlighted by Code2HTML, v. 0.9.1