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

#include"axyftp.h"
#include"utils.h"
#include"multi.h"
#include"buttons.h"
#include"dirlist.h"
#include"functions.h"
#include"little_dialogs.h"
#include"prompt_dialogs.h"

#ifdef BUILD_GTK

#include<gtk/gtk.h>

static void chgdir_cb(GtkWidget*,gpointer);
static void delete_cb(GtkWidget*,gpointer);
static void refresh_cb(GtkWidget*,gpointer);
static void view_cb(GtkWidget*,gpointer);
static void mkdir_cb(GtkWidget*,gpointer);
static void exec_cb(GtkWidget*,gpointer);
static void rename_cb(GtkWidget*,gpointer);
static void dirinfo_cb(GtkWidget*,gpointer);

void dirinfo_cb(GtkWidget* w,gpointer app){
  int which=(int)app;

  switch(which){
    case LOCAL:
      show_local_dirinfo();
      break;
    case REMOTE:
      if(!appdata.remote.list){
	(void)popup_warning_dialog(toplevel,"Not connected");
	break;
      }
      show_remote_dirinfo();
      break;
  }
  return;
}

void rename_cb(GtkWidget* w,gpointer app){
  int which=(int)app;
  int selrow;

  switch(which){
    case LOCAL:
      selrow=get_selected_row(appdata.local.table);
      switch(selrow){
	case NONE:
	case MANY:
	  (void)popup_warning_dialog(toplevel,
	   "Exactly one local file should be selected");
	  break;
	default:
	  rename_local_num(selrow);
	  break;
      }
      break;
    case REMOTE:
      if(appdata.job)break;
      if(!appdata.connected){
	(void)popup_warning_dialog(toplevel,"Not connected");
	break;
      }
      selrow=get_selected_row(appdata.remote.table);
      switch(selrow){
	case NONE:
	case MANY:
	  (void)popup_warning_dialog(toplevel,
	   "Exactly one remote file should be selected");
          break;
	default:
	  rename_remote_num(selrow);
	  break;
      }
      break;
    default:
      break;
  }
  return;
}

void exec_cb(GtkWidget* w,gpointer app){
  int which=(int)app;

  switch(which){
    case LOCAL:
      gtk_widget_show(appdata.exec_local);
      break;
    case REMOTE:
      if(appdata.job)break;
      if(!appdata.connected){
	(void)popup_warning_dialog(toplevel,"Not connected");
	break;
      }
      gtk_widget_show(appdata.exec_remote);
      break;
  }
  return;
}

void mkdir_cb(GtkWidget* w,gpointer app){
  int which=(int)app;

  switch(which){
    case LOCAL:
      gtk_widget_show(appdata.mkdir_local);
      break;
    case REMOTE:
      if(appdata.job)break;
      if(!appdata.connected){
	(void)popup_warning_dialog(toplevel,"Not connected");
	break;
      }
      gtk_widget_show(appdata.mkdir_remote);
      break;
  }
  return;
}

void view_cb(GtkWidget* w,gpointer app){
  int which=(int)app;
  int selrow;

  switch(which){
    case LOCAL:
      selrow=get_selected_row(appdata.local.table);
      switch(selrow){
	case NONE:
	case MANY:
	  (void)popup_warning_dialog(toplevel,
	   "Exactly one local file should be selected");
	  break;
	default:
	  busy_cursor(TRUE);
	  view_local_num(selrow);
	  if(!appdata.job)busy_cursor(FALSE);
	  break;
      }
      break;
    case REMOTE:
      if(appdata.job)break;
      if(!appdata.connected){
	(void)popup_warning_dialog(toplevel,"Not connected");
	break;
      }
      selrow=get_selected_row(appdata.remote.table);
      switch(selrow){
	case NONE:
	case MANY:
	  (void)popup_warning_dialog(toplevel,
	   "Exactly one remote file should be selected");
          break;
	default:
	  appdata.job=3;
	  busy_cursor(TRUE);
	  view_remote_num(selrow);
	  busy_cursor(FALSE);
	  appdata.job=0;
	  break;
      }
      break;
    default:
      break;
  }
  return;
}

void refresh_cb(GtkWidget* w,gpointer app){
  int which=(int)app;
  char* mask;

  switch(which){
    case LOCAL:
      busy_cursor(TRUE);
      mask=gtk_entry_get_text(GTK_ENTRY(appdata.local.text));
      update_local(mask);
      if(!appdata.job)busy_cursor(FALSE);
      break;
    case REMOTE:
      if(appdata.job)break;
      if(!appdata.connected){
	(void)popup_warning_dialog(toplevel,"Not connected");
	break;
      }
      appdata.job=7;
      busy_cursor(TRUE);
      mask=gtk_entry_get_text(GTK_ENTRY(appdata.remote.text));
      update_remote(mask);
      busy_cursor(FALSE);
      appdata.job=0;
      break;
  }
  return;
}

void delete_cb(GtkWidget* w,gpointer app){
  int which=(int)app;
  int *selrow;

  switch(which){
    case LOCAL:
      selrow=get_selected_rows(appdata.local.table);
      if(selrow==NULL){
	(void)popup_warning_dialog(toplevel,"Nothing selected");
	return;
      }
      busy_cursor(TRUE);
      if(!delete_local_files(selrow)){
	  char* mask=gtk_entry_get_text(GTK_ENTRY(appdata.local.text));
	  update_local(mask);
      }
      if(!appdata.job)busy_cursor(FALSE);
      break;
    case REMOTE:
      if(appdata.job)break;
      if(!appdata.connected){
	(void)popup_warning_dialog(toplevel,"Not connected");
	break;
      }
      selrow=get_selected_rows(appdata.remote.table);
      if(selrow==NULL){
	(void)popup_warning_dialog(toplevel,"Nothing selected");
	return;
      }

      appdata.job=4;
      busy_cursor(TRUE);
      if(!delete_remote_files(selrow)){
	char* mask=gtk_entry_get_text(GTK_ENTRY(appdata.remote.text));
	update_remote(mask);
      }
      busy_cursor(FALSE);
      appdata.job=0;
      break;
    default:
      break;
  }
  return;
}

void chgdir_cb(GtkWidget* w,gpointer app){
  int which=(int)app;
  int selrow;
  char* mask;
  int ret;

  switch(which){
    case LOCAL:
      selrow=get_selected_row(appdata.local.table);
      switch(selrow){
	case NONE:
	case MANY:
	  (void)popup_warning_dialog(toplevel,
	   "Exactly one local entry should be selected");
	  break;
	default:
	  busy_cursor(TRUE);
	  ret=chg_local_dir(selrow);
	  mask=gtk_entry_get_text(GTK_ENTRY(appdata.local.text));
	  if(!ret)update_local(mask);
	  if(!appdata.job)busy_cursor(FALSE);
	  break;
      }
      break;
    case REMOTE:
      if(appdata.job)break;
      if(!appdata.connected){
	(void)popup_warning_dialog(toplevel,"Not connected");
	break;
      }
      selrow=get_selected_row(appdata.remote.table);
      switch(selrow){
	case NONE:
	case MANY:
	  (void)popup_warning_dialog(toplevel,
	   "Exactly one remote entry should be selected");
          break;
	default:
	  appdata.job=5;
	  busy_cursor(TRUE);
	  ret=chg_remote_dir(selrow);
	  mask=gtk_entry_get_text(GTK_ENTRY(appdata.remote.text));
	  if(!ret)update_remote(mask);
	  busy_cursor(FALSE);
	  appdata.job=0;
	  break;
      }
      break;
    default:
      break;
  }
  return;
}

GtkWidget* create_buttons(GtkWidget* parent,int which){
  GtkWidget *bar;
  GtkWidget *chdir,*mkdir,*text,*view,*exec,*rename,*delete,*refresh,*dirinfo;

  bar=gtk_vbox_new(TRUE,4);
  gtk_widget_show(bar);

  chdir=gtk_button_new_with_label("ChgDir");
  gtk_widget_show(chdir);
  gtk_box_pack_start(GTK_BOX(bar),chdir,FALSE,TRUE,0);
  gtk_signal_connect(GTK_OBJECT(chdir),"clicked",
      GTK_SIGNAL_FUNC(chgdir_cb),(gpointer)which);
  
  mkdir=gtk_button_new_with_label("MkDir");
  gtk_widget_show(mkdir);
  gtk_box_pack_start(GTK_BOX(bar),mkdir,FALSE,TRUE,0);
  gtk_signal_connect(GTK_OBJECT(mkdir),"clicked",
      GTK_SIGNAL_FUNC(mkdir_cb),(gpointer)which);

  text=gtk_entry_new();
  gtk_widget_show(text);
  gtk_widget_set_usize(text,8+gdk_string_width(mystyle->font,"Refresh"),
      gtkfontheight*2);
  gtk_box_pack_start(GTK_BOX(bar),text,FALSE,TRUE,0);
  gtk_signal_connect(GTK_OBJECT(text),"activate",
      GTK_SIGNAL_FUNC(refresh_cb),(gpointer)which);
  
  view=gtk_button_new_with_label("View");
  gtk_widget_show(view);
  gtk_box_pack_start(GTK_BOX(bar),view,FALSE,TRUE,0);
  gtk_signal_connect(GTK_OBJECT(view),"clicked",
      GTK_SIGNAL_FUNC(view_cb),(gpointer)which);

  exec=gtk_button_new_with_label("Exec");
  gtk_widget_show(exec);
  gtk_box_pack_start(GTK_BOX(bar),exec,FALSE,TRUE,0);
  gtk_signal_connect(GTK_OBJECT(exec),"clicked",
      GTK_SIGNAL_FUNC(exec_cb),(gpointer)which);

  rename=gtk_button_new_with_label("Rename");
  gtk_widget_show(rename);
  gtk_box_pack_start(GTK_BOX(bar),rename,FALSE,TRUE,0);
  gtk_signal_connect(GTK_OBJECT(rename),"clicked",
      GTK_SIGNAL_FUNC(rename_cb),(gpointer)which);

  delete=gtk_button_new_with_label("Delete");
  gtk_widget_show(delete);
  gtk_box_pack_start(GTK_BOX(bar),delete,FALSE,TRUE,0);
  gtk_signal_connect(GTK_OBJECT(delete),"clicked",
      GTK_SIGNAL_FUNC(delete_cb),(gpointer)which);

  refresh=gtk_button_new_with_label("Refresh");
  gtk_widget_show(refresh);
  gtk_box_pack_start(GTK_BOX(bar),refresh,FALSE,TRUE,0);
  gtk_signal_connect(GTK_OBJECT(refresh),"clicked",
      GTK_SIGNAL_FUNC(refresh_cb),(gpointer)which);

  dirinfo=gtk_button_new_with_label("DirInfo");
  gtk_widget_show(dirinfo);
  gtk_box_pack_start(GTK_BOX(bar),dirinfo,FALSE,TRUE,0);
  gtk_signal_connect(GTK_OBJECT(dirinfo),"clicked",
      GTK_SIGNAL_FUNC(dirinfo_cb),(gpointer)which);

  switch(which){
    case LOCAL:
      appdata.local.text=text;
      break;
    case REMOTE:
      appdata.remote.text=text;
      break;
    default:
	break;
  }
  
  return bar;
}

#elif defined BUILD_MOTIF

#include<Xm/Screen.h>
#include<Xm/Xm.h>
#include<Xm/PushB.h>
#include<Xm/Form.h>
#include<Xm/TextF.h>


static void chgdir_cb(Widget,XtPointer,XtPointer);
static void delete_cb(Widget,XtPointer,XtPointer);
static void refresh_cb(Widget,XtPointer,XtPointer);
static void view_cb(Widget,XtPointer,XtPointer);
static void mkdir_cb(Widget,XtPointer,XtPointer);
static void exec_cb(Widget,XtPointer,XtPointer);
static void rename_cb(Widget,XtPointer,XtPointer);
static void dirinfo_cb(Widget,XtPointer,XtPointer);

void dirinfo_cb(Widget w,XtPointer app,XtPointer call){
  int which=(int)app;

  switch(which){
    case LOCAL:
      show_local_dirinfo();
      break;
    case REMOTE:
      if(!appdata.remote.list){
	(void)popup_warning_dialog(toplevel,"Not connected");
	break;
      }
      show_remote_dirinfo();
      break;
  }
  return;
}

void rename_cb(Widget w,XtPointer app,XtPointer call){
  int which=(int)app;
  int selrow;

  switch(which){
    case LOCAL:
      selrow=get_selected_row(appdata.local.table);
      switch(selrow){
	case NONE:
	case MANY:
	  (void)popup_warning_dialog(toplevel,
	   "Exactly one local file should be selected");
	  break;
	default:
	  rename_local_num(selrow);
	  break;
      }
      break;
    case REMOTE:
      if(appdata.job)break;
      if(!appdata.connected){
	(void)popup_warning_dialog(toplevel,"Not connected");
	break;
      }
      selrow=get_selected_row(appdata.remote.table);
      switch(selrow){
	case NONE:
	case MANY:
	  (void)popup_warning_dialog(toplevel,
	   "Exactly one remote file should be selected");
          break;
	default:
	  rename_remote_num(selrow);
	  break;
      }
      break;
    default:
      break;
  }
  return;
}

void exec_cb(Widget w,XtPointer app,XtPointer call){
  int which=(int)app;

  switch(which){
    case LOCAL:
      XtManageChild(appdata.exec_local);
      break;
    case REMOTE:
      if(appdata.job)break;
      if(!appdata.connected){
	(void)popup_warning_dialog(toplevel,"Not connected");
	break;
      }
      XtManageChild(appdata.exec_remote);
      break;
  }
  return;
}

void mkdir_cb(Widget w,XtPointer app,XtPointer call){
  int which=(int)app;

  switch(which){
    case LOCAL:
      XtManageChild(appdata.mkdir_local);
      break;
    case REMOTE:
      if(appdata.job)break;
      if(!appdata.connected){
	(void)popup_warning_dialog(toplevel,"Not connected");
	break;
      }
      XtManageChild(appdata.mkdir_remote);
      break;
  }
  return;
}

void view_cb(Widget w,XtPointer app,XtPointer call){
  int which=(int)app;
  int selrow;

  switch(which){
    case LOCAL:
      selrow=get_selected_row(appdata.local.table);
      switch(selrow){
	case NONE:
	case MANY:
	  (void)popup_warning_dialog(toplevel,
	   "Exactly one local file should be selected");
	  break;
	default:
	  busy_cursor(True);
	  view_local_num(selrow);
	  if(!appdata.job)busy_cursor(False);
	  break;
      }
      break;
    case REMOTE:
      if(appdata.job)break;
      if(!appdata.connected){
	(void)popup_warning_dialog(toplevel,"Not connected");
	break;
      }
      selrow=get_selected_row(appdata.remote.table);
      switch(selrow){
	case NONE:
	case MANY:
	  (void)popup_warning_dialog(toplevel,
	   "Exactly one remote file should be selected");
          break;
	default:
	  appdata.job=3;
	  busy_cursor(True);
	  view_remote_num(selrow);
	  busy_cursor(False);
	  appdata.job=0;
	  break;
      }
      break;
    default:
      break;
  }
  return;
}

void refresh_cb(Widget w,XtPointer app,XtPointer call){
  int which=(int)app;
  char* mask;

  switch(which){
    case LOCAL:
      busy_cursor(True);
      XmUpdateDisplay(toplevel);
      mask=XmTextFieldGetString(appdata.local.text);
      update_local(mask);
      XtFree(mask);
      if(!appdata.job)busy_cursor(False);
      break;
    case REMOTE:
      if(appdata.job)break;
      if(!appdata.connected){
	(void)popup_warning_dialog(toplevel,"Not connected");
	break;
      }
      appdata.job=7;
      busy_cursor(True);
      XmUpdateDisplay(toplevel);
      mask=XmTextFieldGetString(appdata.remote.text);
      update_remote(mask);
      XtFree(mask);
      busy_cursor(False);
      appdata.job=0;
      break;
  }
  return;
}

void delete_cb(Widget w,XtPointer app,XtPointer call){
  int which=(int)app;
  int *selrow;

  switch(which){
    case LOCAL:
      selrow=get_selected_rows(appdata.local.table);
      if(selrow==NULL){
	(void)popup_warning_dialog(toplevel,"Nothing selected");
	return;
      }
      busy_cursor(TRUE);
      if(!delete_local_files(selrow)){
	char* mask=XmTextFieldGetString(appdata.local.text);
	update_local(mask);
	WXfree(mask);
      }
      if(!appdata.job)busy_cursor(FALSE);
      break;
    case REMOTE:
      if(appdata.job)break;
      if(!appdata.connected){
	(void)popup_warning_dialog(toplevel,"Not connected");
	break;
      }
      selrow=get_selected_rows(appdata.remote.table);
      if(selrow==NULL){
	(void)popup_warning_dialog(toplevel,"Nothing selected");
	return;
      }
      appdata.job=4;
      busy_cursor(TRUE);
      if(!delete_remote_files(selrow)){
	char* mask=XmTextFieldGetString(appdata.remote.text);
	update_remote(mask);
	WXfree(mask);
      }
      busy_cursor(FALSE);
      appdata.job=0;
      break;
    default:
      break;
  }
  return;
}

void chgdir_cb(Widget w,XtPointer app,XtPointer cbs){
  int which=(int)app;
  int selrow;
  char* mask;
  int ret;

  switch(which){
    case LOCAL:
      selrow=get_selected_row(appdata.local.table);
      switch(selrow){
	case NONE:
	case MANY:
	  (void)popup_warning_dialog(toplevel,
	   "Exactly one local entry should be selected");
	  break;
	default:
	  busy_cursor(True);
	  XmUpdateDisplay(toplevel);
	  ret=chg_local_dir(selrow);
	  mask=XmTextFieldGetString(appdata.local.text);
	  if(!ret)update_local(mask);
	  XtFree(mask);
	  if(!appdata.job)busy_cursor(False);
	  break;
      }
      break;
    case REMOTE:
      if(appdata.job)break;
      if(!appdata.connected){
	(void)popup_warning_dialog(toplevel,"Not connected");
	break;
      }
      selrow=get_selected_row(appdata.remote.table);
      switch(selrow){
	case NONE:
	case MANY:
	  (void)popup_warning_dialog(toplevel,
	   "Exactly one remote entry should be selected");
          break;
	default:
	  appdata.job=5;
	  busy_cursor(True);
	  XmUpdateDisplay(toplevel);
	  ret=chg_remote_dir(selrow);
	  mask=XmTextFieldGetString(appdata.remote.text);
	  if(!ret)update_remote(mask);
	  XtFree(mask);
	  busy_cursor(False);
	  appdata.job=0;
	  break;
      }
      break;
    default:
      break;
  }
  return;
}


Widget create_buttons(Widget parent,int which){
  Widget bar;
  Arg args[10];
  Cardinal n;
  Widget chdir,mkdir,text,view,exec,rename,delete,refresh,dirinfo;
  Dimension h,w;

  n=0;
  XtSetArg(args[n],XmNfractionBase,9);n++;
  bar=XmCreateForm(parent,"buttons",args,n);
  XtManageChild(bar);

  n=0;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_FORM);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],XmNbottomAttachment,XmATTACH_POSITION);n++;
  XtSetArg(args[n],XmNbottomPosition,1);n++;
  */
  chdir=XmCreatePushButton(bar,"ChgDir",args,n);
  XtManageChild(chdir);
  XtAddCallback(chdir,XmNactivateCallback,chgdir_cb,(XtPointer)which);

  n=0;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNtopWidget,chdir);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],XmNbottomAttachment,XmATTACH_POSITION);n++;
  XtSetArg(args[n],XmNbottomPosition,2);n++;
  */
  mkdir=XmCreatePushButton(bar,"MkDir",args,n);
  XtManageChild(mkdir);
  XtAddCallback(mkdir,XmNactivateCallback,mkdir_cb,(XtPointer)which);

  n=0;
  /*XtSetArg(args[n],XmNhighlightThickness,0);n++;*/
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNtopWidget,mkdir);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],XmNbottomAttachment,XmATTACH_POSITION);n++;
  XtSetArg(args[n],XmNbottomPosition,3);n++;
  */
  XtSetArg(args[n],XmNresizeWidth,True);n++;
  XtSetArg(args[n],XmNbackground,WhitePixelOfScreen(XtScreen(parent)));n++;
  text=XmCreateTextField(bar,"text",args,n);
  XtManageChild(text);
  XtVaGetValues(text,XmNheight,&h,NULL);
  XtVaSetValues(mkdir,XmNheight,h,NULL);
  XtVaSetValues(chdir,XmNheight,h,NULL);
  XtAddCallback(text,XmNactivateCallback,refresh_cb,(XtPointer)which);

  n=0;
  XtSetArg(args[n],XmNheight,h);n++;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNtopWidget,text);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],XmNbottomAttachment,XmATTACH_POSITION);n++;
  XtSetArg(args[n],XmNbottomPosition,4);n++;
  */
  view=XmCreatePushButton(bar,"View",args,n);
  XtManageChild(view);
  XtAddCallback(view,XmNactivateCallback,view_cb,(XtPointer)which);

  n=0;
  XtSetArg(args[n],XmNheight,h);n++;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNtopWidget,view);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],XmNbottomAttachment,XmATTACH_POSITION);n++;
  XtSetArg(args[n],XmNbottomPosition,5);n++;
  */
  exec=XmCreatePushButton(bar,"Exec",args,n);
  XtManageChild(exec);
  XtAddCallback(exec,XmNactivateCallback,exec_cb,(XtPointer)which);

  n=0;
  XtSetArg(args[n],XmNheight,h);n++;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNtopWidget,exec);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],XmNbottomAttachment,XmATTACH_POSITION);n++;
  XtSetArg(args[n],XmNbottomPosition,6);n++;
  */
  rename=XmCreatePushButton(bar,"Rename",args,n);
  XtManageChild(rename);
  XtAddCallback(rename,XmNactivateCallback,rename_cb,(XtPointer)which);

  n=0;
  XtSetArg(args[n],XmNheight,h);n++;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNtopWidget,rename);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],XmNbottomAttachment,XmATTACH_POSITION);n++;
  XtSetArg(args[n],XmNbottomPosition,7);n++;
  */
  delete=XmCreatePushButton(bar,"Delete",args,n);
  XtManageChild(delete);
  XtAddCallback(delete,XmNactivateCallback,delete_cb,(XtPointer)which);

  n=0;
  XtSetArg(args[n],XmNheight,h);n++;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNtopWidget,delete);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],XmNbottomAttachment,XmATTACH_POSITION);n++;
  XtSetArg(args[n],XmNbottomPosition,8);n++;
  */
  refresh=XmCreatePushButton(bar,"Refresh",args,n);
  XtManageChild(refresh);
  XtAddCallback(refresh,XmNactivateCallback,refresh_cb,(XtPointer)which);

  n=0;
  XtSetArg(args[n],XmNheight,h);n++;
  XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET);n++;
  XtSetArg(args[n],XmNtopWidget,refresh);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],XmNbottomAttachment,XmATTACH_FORM);n++;
  */
  dirinfo=XmCreatePushButton(bar,"DirInfo",args,n);n++;
  XtManageChild(dirinfo);
  XtAddCallback(dirinfo,XmNactivateCallback,dirinfo_cb,(XtPointer)which);

  XtVaGetValues(refresh,XmNwidth,&w,NULL);
  XtVaSetValues(chdir,XmNwidth,w,NULL);
  XtVaSetValues(mkdir,XmNwidth,w,NULL);
  XtVaSetValues(text,XmNwidth,w,NULL);
  XtVaSetValues(text,XmNresizeWidth,False,NULL);
  XtVaSetValues(view,XmNwidth,w,NULL);
  XtVaSetValues(exec,XmNwidth,w,NULL);
  XtVaSetValues(rename,XmNwidth,w,NULL);
  XtVaSetValues(delete,XmNwidth,w,NULL);
  XtVaSetValues(dirinfo,XmNwidth,w,NULL);

  switch(which){
    case LOCAL:
      appdata.local.text=text;
      break;
    case REMOTE:
      appdata.remote.text=text;
      break;
    default:
      break;
  }
  
  return bar;
}

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


syntax highlighted by Code2HTML, v. 0.9.1