/***************************************************************************/
/***************************************************************************/
/*                                                                         */
/*   (c) 1995-1999.  The Regents of the University of California.  All     */
/*   rights reserved.                                                      */
/*                                                                         */
/*   This work was produced at the University of California, Lawrence      */
/*   Livermore National Laboratory (UC LLNL) under contract no.            */
/*   W-7405-ENG-48 (Contract 48) between the U.S. Department of Energy     */
/*   (DOE) and The Regents of the University of California (University)    */
/*   for the operation of UC LLNL.  Copyright is reserved to the           */
/*   University for purposes of controlled dissemination,                  */
/*   commercialization through formal licensing, or other disposition      */
/*   under terms of Contract 48; DOE policies, regulations and orders;     */
/*   and U.S. statutes.  The rights of the Federal Government are          */
/*   reserved under Contract 48 subject to the restrictions agreed upon    */
/*   by the DOE and University.                                            */
/*                                                                         */
/*                                                                         */
/*                              DISCLAIMER                                 */
/*                                                                         */
/*   This software was prepared as an account of work sponsored by an      */
/*   agency of the United States Government.  Neither the United States    */
/*   Government nor the University of California nor any of their          */
/*   employees, makes any warranty, express or implied, or assumes any     */
/*   liability or responsibility for the accuracy, completeness, or        */
/*   usefulness of any information, apparatus, product, or process         */
/*   disclosed, or represents that its specific commercial products,       */
/*   process, or service by trade name, trademark, manufacturer, or        */
/*   otherwise, does not necessarily constitute or imply its               */
/*   endorsement, recommendation, or favoring by the United States         */
/*   Government or the University of California. The views and opinions    */
/*   of the authors expressed herein do not necessarily state or reflect   */
/*   those of the United States Government or the University of            */
/*   California, and shall not be used for advertising or product          */
/*   endorsement purposes.                                                 */
/*                                                                         */
/*   Permission to use, copy, modify and distribute this software and its  */
/*   documentation for any non-commercial purpose, without fee, is         */
/*   hereby granted, provided that the above copyright notice and this     */
/*   permission notice appear in all copies of the software and            */
/*   supporting documentation, and that all UC LLNL identification in      */
/*   the user interface remain unchanged.  The title to copyright LLNL     */
/*   XDIR shall at all times remain with The Regents of the University     */
/*   of California and users agree to preserve same. Users seeking the     */
/*   right to make derivative works with LLNL XDIR for commercial          */
/*   purposes may obtain a license from the Lawrence Livermore National    */
/*   Laboratory's Technology Transfer Office, P.O. Box 808, L-795,         */
/*   Livermore, CA 94550.                                                  */
/*                                                                         */
/***************************************************************************/
/***************************************************************************/

#include <Xm/SelectioB.h>
#include <Xm/ScrolledW.h>
#include <Xm/Form.h>
#include <Xm/DrawingA.h>
#include <Xm/PushB.h>
#include <Xm/PushBG.h>
#include <Xm/RowColumn.h>
#include <Xm/Frame.h>
#include <Xm/CascadeB.h>
#include <Xm/CascadeBG.h>
#include <Xm/SeparatoG.h>
#include <Xm/ScrollBar.h>
#include <Xm/Label.h>
#include <Xm/DrawnB.h>
#include "xdir.h"
#include "llnl.h"
#include "cachemsg.h"
#include "pulldown.h"

extern Widget w_toplev;
extern Display *display;
extern Window root_window;
extern int depth;
extern struct dirwin_st *dirwin_head;

void cb_send_quoted_command();
void cb_general_preferences();
void cb_save_prefs();
void cb_quit();
void cb_about_xdir();
void cb_resize_dirwin();
void cb_dirwin_close();
void cb_change_layout();
void cb_goto_home();
void cb_refresh_dir();
void cb_select_all();
void cb_deselect_all();
void cb_use_wildcard();
void cb_make_dir();
void cb_delete();
void cb_rename_selected_entries();
void cb_goto_dir();
void cb_goto_parent();
void HandleMouseEvents();
void HandleExposeEvents();
void HandleKeyboardEvents();
void cb_scroll_vertical();
void cb_scroll_horizontal();
void cb_connect_to_remote();
void cb_connect_to_anonymous();
void cb_connect_to_local();
void cb_popup_diagnostics();
void cb_change_xfer_mode();
void cb_disconnect();
void cb_viewer_preferences();
void cb_firewall_preferences();
void cb_launcher_preferences();
void cb_xdir_overview();
void cb_getting_started();
void cb_using_help();
void cb_hidden_features();
void cb_contextual_help();
void cb_availability();
void cb_help_ur_button();
void cb_help_file_menu();
void cb_help_connect_menu();
void cb_help_select_menu();
void cb_help_ops_menu();
void cb_help_goto_menu();
void cb_help_wins_menu();
void cb_help_close_button();
void cb_help_delete_button();
void cb_help_mkdir_button();
void cb_help_home_button();
void cb_help_parent_button();
void cb_help_refresh_button();
void cb_help_dot_files_button();
void cb_help_tunneling_button();
void cb_help_full_info_button();
void cb_help_tree_button();
void cb_help_iconic_button();
void cb_help_tabular_button();
void cb_help_xfer_mode_menu();
void cb_help_display_area();
void cb_view_selected_files();
void cb_iconify_all();
void cb_deiconify_all();
void cb_change_tunneling_mode();
void cb_help_prefs_menu();
void cb_search();
void cb_search_again();
void cb_change_dotfiles_mode();
void cb_change_cache_mode();
void cb_help_cache_button();
void cb_edit_history();
Widget BuildPulldownMenu();
Widget create_button();

static Widget w_searchAgainItem;
static Widget w_deleteItem;
static Widget w_renameItem;
static Widget w_viewItem;
static Widget w_launchMenu;
static Widget w_viewedFilesMenu;
static Widget w_quotedItem;
static Widget w_ancestorsMenu;

static MenuItem file_menu[10] = {
	{ "About LLNL XDIR", &xmPushButtonGadgetClass,
	  'A', NULL, NULL, cb_about_xdir, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "", &xmSeparatorGadgetClass,
	  '\0', NULL, NULL, NULL, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Iconify All", &xmPushButtonGadgetClass,
	  'I', NULL, NULL, cb_iconify_all, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Deiconify All", &xmPushButtonGadgetClass,
	  'D', NULL, NULL, cb_deiconify_all, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Close", &xmPushButtonGadgetClass,
	  'C', "Ctrl<Key>C", "Ctrl-C", cb_dirwin_close, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "", &xmSeparatorGadgetClass,
	  '\0', NULL, NULL, NULL, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Edit History...", &xmPushButtonGadgetClass,
	  'E', NULL, NULL, cb_edit_history, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "", &xmSeparatorGadgetClass,
	  '\0', NULL, NULL, NULL, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Quit", &xmPushButtonGadgetClass,
	  'Q', "Ctrl<Key>Q", "Ctrl-Q", cb_quit, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ NULL }
};


static MenuItem connect_menu[6] = {
	{ "Connect to Local", &xmPushButtonGadgetClass,
	  'L', NULL, NULL, cb_connect_to_local, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Connect to Remote...", &xmPushButtonGadgetClass,
	  'R', NULL, NULL, cb_connect_to_remote, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Connect to Anonymous...", &xmPushButtonGadgetClass,
	  'A', NULL, NULL, cb_connect_to_anonymous, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "", &xmSeparatorGadgetClass,
	  '\0', NULL, NULL, NULL, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Disconnect", &xmPushButtonGadgetClass,
	  'D', NULL, NULL, cb_disconnect, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ NULL }
};

static MenuItem prefs_menu[7] = {
	{ "General Preferences", &xmPushButtonGadgetClass,
	  'G', NULL, NULL, cb_general_preferences, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Launcher Preferences", &xmPushButtonGadgetClass,
	  'L', NULL, NULL, cb_launcher_preferences, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Viewer Preferences", &xmPushButtonGadgetClass,
	  'V', NULL, NULL, cb_viewer_preferences, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Firewall Preferences", &xmPushButtonGadgetClass,
	  'F', NULL, NULL, cb_firewall_preferences, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "", &xmSeparatorGadgetClass,
	  '\0', NULL, NULL, NULL, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Save Preferences", &xmPushButtonGadgetClass,
	  'S', NULL, NULL, cb_save_prefs, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ NULL }
};

static MenuItem select_menu[4] = {
	{ "Select All Entries", &xmPushButtonGadgetClass,
	  'S', "Ctrl<Key>A", "Ctrl-A", cb_select_all, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Deselect All Entries", &xmPushButtonGadgetClass,
	  'D', "Ctrl<Key>B", "Ctrl-B", cb_deselect_all, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Use Wildcard...", &xmPushButtonGadgetClass,
	  'U', NULL, NULL, cb_use_wildcard, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ NULL }
};

static MenuItem launch_menu[1] = {
	{ NULL }
};

static MenuItem ops_menu[13] = {
	{ "Search...", &xmPushButtonGadgetClass,
	  'S', "Ctrl<Key>F", "Ctrl-F", cb_search, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Search Again", &xmPushButtonGadgetClass,
	  'A', "Ctrl<Key>G", "Ctrl-G", cb_search_again, (MenuItem *)NULL,
	  &w_searchAgainItem },
	{ "", &xmSeparatorGadgetClass,
	  '\0', NULL, NULL, NULL, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Delete Selected Entries", &xmPushButtonGadgetClass,
	  'D', NULL, NULL, cb_delete, (MenuItem *)NULL,
	  &w_deleteItem },
	{ "Rename Selected Entries...", &xmPushButtonGadgetClass,
	  'R', NULL, NULL, cb_rename_selected_entries, (MenuItem *)NULL,
	  &w_renameItem },
	{ "View Selected Files", &xmPushButtonGadgetClass,
	  'V', NULL, NULL, cb_view_selected_files, (MenuItem *)NULL,
	  &w_viewItem },
	{ "Send Quoted Command...", &xmPushButtonGadgetClass,
	  'Q', NULL, NULL, cb_send_quoted_command, (MenuItem *)NULL,
	  &w_quotedItem },
	{ "", &xmSeparatorGadgetClass,
	  '\0', NULL, NULL, NULL, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Refresh Directory", &xmPushButtonGadgetClass,
	  'R', NULL, NULL, cb_refresh_dir, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Make Directory...", &xmPushButtonGadgetClass,
	  'M', NULL, NULL, cb_make_dir, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "", &xmSeparatorGadgetClass,
	  '\0', NULL, NULL, NULL, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Launch", &xmCascadeButtonGadgetClass,
	  'L', NULL, NULL, NULL, launch_menu,
	  &w_launchMenu },
	{ NULL }
};

static MenuItem ancestors_menu[1] = {
	{ NULL }
};

static MenuItem goto_menu[6] = {
	{ "Ancestor", &xmCascadeButtonGadgetClass,
	  'A', NULL, NULL, NULL, ancestors_menu,
	  &w_ancestorsMenu },
	{ "Directory...", &xmPushButtonGadgetClass,
	  'D', NULL, NULL, cb_goto_dir, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Home Directory", &xmPushButtonGadgetClass,
	  'H', NULL, NULL, cb_goto_home, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Parent Directory", &xmPushButtonGadgetClass,
	  'P', NULL, NULL, cb_goto_parent, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "", &xmSeparatorGadgetClass,
	  '\0', NULL, NULL, NULL, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ NULL }
};

static MenuItem viewed_files_menu[1] = {
	{ NULL }
};

static MenuItem wins_menu[5] = {
	{ "Diagnostics", &xmPushButtonGadgetClass,
	  'D', NULL, NULL, cb_popup_diagnostics, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "", &xmSeparatorGadgetClass,
	  '\0', NULL, NULL, NULL, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Viewed Files", &xmCascadeButtonGadgetClass,
	  'V', NULL, NULL, NULL, viewed_files_menu,
	  &w_viewedFilesMenu },
	{ "", &xmSeparatorGadgetClass,
	  '\0', NULL, NULL, NULL, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ NULL }
};

static MenuItem help_menu[9] = {
	{ "LLNL XDIR Overview", &xmPushButtonGadgetClass,
	  'L', NULL, NULL, cb_xdir_overview, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Using Help", &xmPushButtonGadgetClass,
	  'U', NULL, NULL, cb_using_help, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Getting Started", &xmPushButtonGadgetClass,
	  'G', NULL, NULL, cb_getting_started, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Hidden Features", &xmPushButtonGadgetClass,
	  'H', NULL, NULL, cb_hidden_features, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Display Area", &xmPushButtonGadgetClass,
	  'D', NULL, NULL, cb_help_display_area, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Availability", &xmPushButtonGadgetClass,
	  'A', NULL, NULL, cb_availability, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "", &xmSeparatorGadgetClass,
	  '\0', NULL, NULL, NULL, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ "Contextual Help", &xmPushButtonGadgetClass,
	  'C', NULL, NULL, cb_contextual_help, (MenuItem *)NULL,
	  (Widget *)NULL },
	{ NULL }
};


/*
 * create_dir_window - Create a directory window.  Returns a pointer
 *                     to the structure created to hold info about
 *                     this window.
 */
struct dirwin_st *
create_dir_window()
{
	static int first_time = True;
	static Pixmap llnl_pixmap;
	static Pixmap cachemsg_pixmap;
	Arg args[12];
	int i;
	struct dirwin_st *dirwin;
	Widget widget;
    Widget w_homeButton;
	Widget w_mkdirButton;
	Widget w_refreshDirButton;
	Widget w_closeButton;
	Widget w_horizontal_sb;
	Widget w_vertical_sb;
	Widget w_opsMenu;
	Widget w_gotoMenu;
	Widget w_llnl;
	Widget w_pulldown;
	Widget w_prefsMenu;
	Pixel fg;
	Pixel bg;
	XmString label;
	Dimension h;

    /* Create struct to hold info about this directory window */
    dirwin = XtNew(struct dirwin_st);

    /* Add structure to linked list */
    dirwin->prev = NULL;
    dirwin->next = dirwin_head;
    if (dirwin_head)
        dirwin_head->prev = dirwin;
    dirwin_head = dirwin;

    /* Initialize structure */
    dirwin->has_selection = False;
    dirwin->nentries = 0;
    dirwin->dirname = NULL;
    dirwin->temp_for_search = False;
	dirwin->max_host_menu_used = 0;

	/* Create toplevel shell for directory window */
	dirwin->w_shell = XtVaCreatePopupShell("dirWindow",
		topLevelShellWidgetClass, w_toplev, NULL);

	/* Attach custom icon */
	attach_wm_icon(dirwin->w_shell);

	/* Create form */
	dirwin->w_form = XtVaCreateWidget("form", xmFormWidgetClass,
		dirwin->w_shell, NULL);

	/* Add callback for the WM_DELETE_WINDOW protocol */
	add_wm_delete_window_cb(dirwin->w_shell, cb_dirwin_close, dirwin, False);

	/* Create form for menu and "LLNL XDIR" button */
	dirwin->w_menuForm = XtVaCreateWidget(
		"menuForm",
		xmFormWidgetClass,
		dirwin->w_form,
		XmNtopAttachment,	XmATTACH_FORM,
		XmNleftAttachment,	XmATTACH_FORM,
		XmNrightAttachment, XmATTACH_FORM,
		NULL
	);

	/* Create upper-right button */
	dirwin->w_urButton = XtVaCreateManagedWidget(
		"llnlxdirButton",
		xmDrawnButtonWidgetClass,
		dirwin->w_menuForm,
		XmNpushButtonEnabled,	True,
		XmNwidth,				104,
		XmNtopAttachment,		XmATTACH_FORM,
		XmNtopOffset,			-2,
		XmNbottomAttachment,	XmATTACH_FORM,
		XmNbottomOffset,		-2,
		XmNrightAttachment,		XmATTACH_FORM,
		XmNrightOffset,			-2,
		NULL
	);
	XtAddCallback(dirwin->w_urButton, XmNhelpCallback, cb_help_ur_button,
		(XtPointer)dirwin);
	add_llnlxdir_button_callbacks(dirwin);

	/* Create menu bar */
	i = 0;
	XtSetArg(args[i], XmNtopAttachment, XmATTACH_FORM); i++;
	XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
	XtSetArg(args[i], XmNrightAttachment, XmATTACH_WIDGET); i++;
	XtSetArg(args[i], XmNrightWidget, dirwin->w_urButton); i++;
	XtSetArg(args[i], XmNrightOffset, 0); i++;
	XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
	dirwin->w_dirMenuBar = XmCreateMenuBar(dirwin->w_menuForm, "dirMenuBar",
		args ,i);

	/* Create File menu */
	widget = BuildPulldownMenu(dirwin->w_dirMenuBar, "File", 'F', file_menu,
		(XtPointer)dirwin);
	XtAddCallback(widget, XmNhelpCallback, cb_help_file_menu,
		(XtPointer)dirwin);

	/* Create Connect menu */
	widget = BuildPulldownMenu(dirwin->w_dirMenuBar, "Connect", 'C',
		connect_menu, (XtPointer)dirwin);
	XtAddCallback(widget, XmNhelpCallback, cb_help_connect_menu,
		(XtPointer)dirwin);

	/* Create Prefs menu */
	w_prefsMenu = BuildPulldownMenu(dirwin->w_dirMenuBar, "Prefs", 'P',
		prefs_menu, (XtPointer)dirwin);
	XtAddCallback(w_prefsMenu, XmNhelpCallback, cb_help_prefs_menu,
		(XtPointer)dirwin);

	/* Create Select menu */
	widget = BuildPulldownMenu(dirwin->w_dirMenuBar, "Select", 'S', select_menu,
		(XtPointer)dirwin);
	XtAddCallback(widget, XmNhelpCallback, cb_help_select_menu,
		(XtPointer)dirwin);

	/* Create Ops menu */
	w_opsMenu = BuildPulldownMenu(dirwin->w_dirMenuBar, "Ops", 'O', ops_menu,
		(XtPointer)dirwin);
	XtAddCallback(w_opsMenu, XmNhelpCallback, cb_help_ops_menu,
		(XtPointer)dirwin);
	dirwin->w_searchAgainItem = w_searchAgainItem;
	dirwin->w_deleteItem = w_deleteItem;
	dirwin->w_renameItem = w_renameItem;
	dirwin->w_viewItem = w_viewItem;
	dirwin->w_quotedItem = w_quotedItem;
	dirwin->w_launchMenu = w_launchMenu;

	/* Create Goto menu */
	w_gotoMenu = BuildPulldownMenu(dirwin->w_dirMenuBar, "Goto", 'G', goto_menu,
		(XtPointer)dirwin);
	XtAddCallback(w_gotoMenu, XmNhelpCallback, cb_help_goto_menu,
		(XtPointer)dirwin);
	dirwin->w_gotoMenu = w_gotoMenu;
	initialize_goto_menu(dirwin);
	dirwin->w_ancestorsMenu = w_ancestorsMenu;

	/* Create Windows menu */
	dirwin->w_winsMenu = BuildPulldownMenu(dirwin->w_dirMenuBar, "Wins", 'W',
		wins_menu, (XtPointer)dirwin);
	XtAddCallback(dirwin->w_winsMenu, XmNhelpCallback, cb_help_wins_menu,
		(XtPointer)dirwin);
	initialize_wins_menu(dirwin);
	dirwin->w_viewedFilesMenu = w_viewedFilesMenu;
	initialize_viewed_files_menu(dirwin);

	/* Create Help Menu */
	widget = BuildPulldownMenu(dirwin->w_dirMenuBar, "Help", 'H', help_menu,
		(XtPointer)dirwin);
	XtVaSetValues(dirwin->w_dirMenuBar, XmNmenuHelpWidget, widget, NULL);

	XtManageChild(dirwin->w_dirMenuBar);
	XtManageChild(dirwin->w_menuForm);

	/* Create "Lawrence Livermore National Laboratory" label */
	if (first_time) {
    	XtVaGetValues(dirwin->w_form, XmNbackground, &bg, XmNforeground, &fg,
			NULL);
		llnl_pixmap = XCreatePixmapFromBitmapData(display, root_window,
			(char *)llnl_bits, llnl_width, llnl_height, fg, bg, depth);
	}
	w_llnl = XtVaCreateManagedWidget(
		"llnl",
		xmLabelWidgetClass,
		dirwin->w_form,
		XmNlabelType,			XmPIXMAP,
		XmNlabelPixmap,			llnl_pixmap,
		XmNmarginHeight,		0,
		XmNmarginWidth,			0,
		XmNbottomAttachment,	XmATTACH_FORM,
		XmNbottomOffset,		2,
		XmNleftAttachment,		XmATTACH_FORM,
		XmNleftOffset,			20,
		NULL
	);

	/* Create "Cache Referenced" label */
	if (first_time) {
    	XtVaGetValues(dirwin->w_form, XmNbackground, &bg, XmNforeground, &fg,
			NULL);
		cachemsg_pixmap = XCreatePixmapFromBitmapData(display, root_window,
			(char *)cachemsg_bits, cachemsg_width, cachemsg_height, fg, bg,
			depth);
	}
	dirwin->w_cacheMsg = XtVaCreateWidget(
		"cacheMsg",
		xmLabelWidgetClass,
		dirwin->w_form,
		XmNlabelType,			XmPIXMAP,
		XmNlabelPixmap,			cachemsg_pixmap,
		XmNmarginHeight,		0,
		XmNmarginWidth,			0,
		XmNbottomAttachment,	XmATTACH_FORM,
		XmNbottomOffset,		4,
		XmNrightAttachment,		XmATTACH_FORM,
		XmNrightOffset,			25,
		NULL
	);

	/* Create form for toolbar */
	dirwin->w_toolbarForm = XtVaCreateWidget(
		"toolbarForm",
		xmFormWidgetClass,
		dirwin->w_form,
		XmNtopAttachment,		XmATTACH_WIDGET,
		XmNtopWidget,			dirwin->w_menuForm,
		XmNtopOffset,			2,
		XmNleftAttachment,		XmATTACH_FORM,
		XmNleftOffset,			1,
		XmNrightAttachment,		XmATTACH_FORM,
		XmNrightOffset,			1,
   		NULL
	);

	/* Create "Close" button */
	w_closeButton = create_button("closeButton", dirwin, dirwin->w_toolbarForm);
	XtVaSetValues(w_closeButton,
		XmNrightAttachment,		XmATTACH_FORM,
		XmNrightOffset,			4,
		NULL
	);
    XtAddCallback(w_closeButton, XmNactivateCallback, cb_dirwin_close,
		(XtPointer)dirwin);
	XtAddCallback(w_closeButton, XmNhelpCallback, cb_help_close_button,
		(XtPointer)dirwin);

	/* Create "Delete selected entries" button */
	dirwin->w_deleteButton = create_button("deleteButton", dirwin,
		dirwin->w_toolbarForm);
	XtVaSetValues(dirwin->w_deleteButton,
		XmNrightAttachment,		XmATTACH_WIDGET,
		XmNrightWidget,			w_closeButton,
		XmNrightOffset,			-2,
		NULL
	);
    XtAddCallback(dirwin->w_deleteButton, XmNactivateCallback, cb_delete,
		(XtPointer)dirwin);
	XtAddCallback(dirwin->w_deleteButton, XmNhelpCallback,
		cb_help_delete_button, (XtPointer)dirwin);

	/* Create "Make New Directory" button */
	w_mkdirButton = create_button("mkdirButton", dirwin,
		dirwin->w_toolbarForm);
	XtVaSetValues(w_mkdirButton,
		XmNrightAttachment,		XmATTACH_WIDGET,
		XmNrightWidget,			dirwin->w_deleteButton,
		XmNrightOffset,			-2,
		NULL
	);
    XtAddCallback(w_mkdirButton, XmNactivateCallback, cb_make_dir,
		(XtPointer)dirwin);
	XtAddCallback(w_mkdirButton, XmNhelpCallback, cb_help_mkdir_button,
		(XtPointer)dirwin);

	/* Create "Go to Home Directory" button */
	w_homeButton = create_button("homeButton", dirwin, dirwin->w_toolbarForm);
	XtVaSetValues(w_homeButton,
		XmNrightAttachment,		XmATTACH_WIDGET,
		XmNrightWidget,			w_mkdirButton,
		XmNrightOffset,			-2,
		NULL
	);
    XtAddCallback(w_homeButton, XmNactivateCallback, cb_goto_home,
		(XtPointer)dirwin);
	XtAddCallback(w_homeButton, XmNhelpCallback, cb_help_home_button,
		(XtPointer)dirwin);

	/* Create "Go up to Parent" button */
	dirwin->w_upArrowButton = create_button("upArrowButton", dirwin,
		dirwin->w_toolbarForm);
	XtVaSetValues(dirwin->w_upArrowButton,
		XmNrightAttachment,		XmATTACH_WIDGET,
		XmNrightWidget,			w_homeButton,
		XmNrightOffset,			-2,
		NULL
	);
    XtAddCallback(dirwin->w_upArrowButton, XmNactivateCallback, cb_goto_parent,
		(XtPointer)dirwin);
	XtAddCallback(dirwin->w_upArrowButton, XmNhelpCallback,
		cb_help_parent_button, (XtPointer)dirwin);

	/* Initialize the "Go to Ancestors" menus */
	init_ancestors_menus(dirwin);

	/* Create "Refresh directory window" button */
	w_refreshDirButton = create_button("refreshDirButton", dirwin,
		dirwin->w_toolbarForm);
	XtVaSetValues(w_refreshDirButton,
		XmNrightAttachment,		XmATTACH_WIDGET,
		XmNrightWidget,			dirwin->w_upArrowButton,
		XmNrightOffset,			-2,
		NULL
	);
    XtAddCallback(w_refreshDirButton, XmNactivateCallback, cb_refresh_dir,
		(XtPointer)dirwin);
	XtAddCallback(w_refreshDirButton, XmNhelpCallback, cb_help_refresh_button,
		(XtPointer)dirwin);

	/* Create "Cache Mode" button */
	dirwin->w_cacheButton = create_button("cacheButton", dirwin,
		dirwin->w_toolbarForm);
	XtVaSetValues(dirwin->w_cacheButton,
		XmNrightAttachment,		XmATTACH_WIDGET,
		XmNrightWidget,			w_refreshDirButton,
		XmNrightOffset,			8,
		NULL
	);
    XtAddCallback(dirwin->w_cacheButton, XmNactivateCallback,
		cb_change_cache_mode, (XtPointer)dirwin);
	XtAddCallback(dirwin->w_cacheButton, XmNhelpCallback,
		cb_help_cache_button, (XtPointer)dirwin);

	/* Create "Dot Files Mode" button */
	dirwin->w_dotFilesButton = create_button("dotFilesButton", dirwin,
		dirwin->w_toolbarForm);
	XtVaSetValues(dirwin->w_dotFilesButton,
		XmNrightAttachment,		XmATTACH_WIDGET,
		XmNrightWidget,			dirwin->w_cacheButton,
		XmNrightOffset,			-2,
		NULL
	);
    XtAddCallback(dirwin->w_dotFilesButton, XmNactivateCallback,
		cb_change_dotfiles_mode, (XtPointer)dirwin);
	XtAddCallback(dirwin->w_dotFilesButton, XmNhelpCallback,
		cb_help_dot_files_button, (XtPointer)dirwin);

	/* Create "Tunneling Mode" button */
	dirwin->w_tunnelingButton = create_button("tunnelingButton", dirwin,
		dirwin->w_toolbarForm);
	XtVaSetValues(dirwin->w_tunnelingButton,
		XmNrightAttachment,		XmATTACH_WIDGET,
		XmNrightWidget,			dirwin->w_dotFilesButton,
		XmNrightOffset,			-2,
		NULL
	);
    XtAddCallback(dirwin->w_tunnelingButton, XmNactivateCallback,
		cb_change_tunneling_mode, (XtPointer)dirwin);
	XtAddCallback(dirwin->w_tunnelingButton, XmNhelpCallback,
		cb_help_tunneling_button, (XtPointer)dirwin);

	/* Create "Full Info Layout" button */
	dirwin->w_fullInfoButton = create_button("fullInfoButton", dirwin,
		dirwin->w_toolbarForm);
	XtVaSetValues(dirwin->w_fullInfoButton,
		XmNrightAttachment,		XmATTACH_WIDGET,
		XmNrightWidget,			dirwin->w_tunnelingButton,
		XmNrightOffset,			8,
		NULL
	);
	XtAddCallback(dirwin->w_fullInfoButton, XmNactivateCallback,
		cb_change_layout, (XtPointer)dirwin);
	XtAddCallback(dirwin->w_fullInfoButton, XmNhelpCallback,
		cb_help_full_info_button, (XtPointer)dirwin);

	/* Create "Tree Layout" button */
	dirwin->w_treeButton = create_button("treeButton", dirwin,
		dirwin->w_toolbarForm);
	XtVaSetValues(dirwin->w_treeButton,
		XmNrightAttachment,		XmATTACH_WIDGET,
		XmNrightWidget,			dirwin->w_fullInfoButton,
		XmNrightOffset,			-2,
		NULL
	);
	XtAddCallback(dirwin->w_treeButton, XmNactivateCallback,
		cb_change_layout, (XtPointer)dirwin);
	XtAddCallback(dirwin->w_treeButton, XmNhelpCallback, cb_help_tree_button,
		(XtPointer)dirwin);

	/* Create "Iconic" button */
	dirwin->w_iconicButton = create_button("iconicButton", dirwin,
		dirwin->w_toolbarForm);
	XtVaSetValues(dirwin->w_iconicButton,
		XmNrightAttachment,		XmATTACH_WIDGET,
		XmNrightWidget,			dirwin->w_treeButton,
		XmNrightOffset,			-2,
		NULL
	);
	XtAddCallback(dirwin->w_iconicButton, XmNactivateCallback,
		cb_change_layout, (XtPointer)dirwin);
	XtAddCallback(dirwin->w_iconicButton, XmNhelpCallback,
		cb_help_iconic_button, (XtPointer)dirwin);

	/* Create "Tabular" button */
	dirwin->w_tabularButton = create_button("tabularButton", dirwin,
		dirwin->w_toolbarForm);
	XtVaSetValues(dirwin->w_tabularButton,
		XmNrightAttachment,		XmATTACH_WIDGET,
		XmNrightWidget,			dirwin->w_iconicButton,
		XmNrightOffset,			-2,
		NULL
	);
	XtAddCallback(dirwin->w_tabularButton, XmNactivateCallback,
		cb_change_layout, (XtPointer)dirwin);
	XtAddCallback(dirwin->w_tabularButton, XmNhelpCallback,
		cb_help_tabular_button, (XtPointer)dirwin);

	/* Create the file transfer mode pulldown menu */
	w_pulldown = XmCreatePulldownMenu(dirwin->w_toolbarForm, "xferModeMenu",
		NULL, 0);
	label = XmStringCreateSimple("ASCII");
	dirwin->w_asciiItem = XtVaCreateManagedWidget(
		"asciiItem",
		xmPushButtonGadgetClass,
		w_pulldown,
		XmNlabelString, label,
		NULL
	);
	XtAddCallback(dirwin->w_asciiItem, XmNactivateCallback, cb_change_xfer_mode,
		(XtPointer)dirwin);
	XmStringFree(label);
	label = XmStringCreateSimple("Binary");
	dirwin->w_binaryItem = XtVaCreateManagedWidget(
		"asciiItem",
		xmPushButtonGadgetClass,
		w_pulldown,
		XmNlabelString, label,
		NULL
	);
	XtAddCallback(dirwin->w_binaryItem, XmNactivateCallback,
		cb_change_xfer_mode, (XtPointer)dirwin);
	XmStringFree(label);

    /* Create file transfer mode option menu */
    i = 0;
    XtSetArg(args[i], XmNsubMenuId, w_pulldown); i++;
	label = XmStringCreateSimple("");
	XtSetArg(args[i], XmNlabelString, label); i++;
	XtSetArg(args[i], XmNtopAttachment, XmATTACH_FORM); i++;
	XtSetArg(args[i], XmNbottomAttachment, XmATTACH_FORM); i++;
	XtSetArg(args[i], XmNleftAttachment, XmATTACH_FORM); i++;
	XtSetArg(args[i], XmNleftOffset, -3); i++;
	XtSetArg(args[i], XmNrightAttachment, XmATTACH_WIDGET); i++;
	XtSetArg(args[i], XmNrightWidget, dirwin->w_tabularButton); i++;
	XtSetArg(args[i], XmNrightOffset, 14); i++;
	XtSetArg(args[i], XmNmarginHeight, 0); i++;
	XtSetArg(args[i], XmNmarginWidth, 0); i++;
    dirwin->w_xferModeMenu = XmCreateOptionMenu(dirwin->w_toolbarForm,
		"xferModeMenu", args, i);
	XmStringFree(label);
    XtManageChild(dirwin->w_xferModeMenu);
	widget = XmOptionButtonGadget(dirwin->w_xferModeMenu);
	XtAddCallback(widget, XmNhelpCallback, cb_help_xfer_mode_menu,
		(XtPointer)dirwin);
	XtManageChild(widget);

	XtManageChild(dirwin->w_toolbarForm);

    /* Create scrolled window to hold drawing area widget */
    dirwin->w_scrolledWindow = XtVaCreateManagedWidget(
        "scrolledWindow",
        xmScrolledWindowWidgetClass,
        dirwin->w_form,
        XmNscrollingPolicy,		XmAPPLICATION_DEFINED,
		XmNuserData,			dirwin,
		XmNtopAttachment,		XmATTACH_WIDGET,
		XmNtopWidget,			dirwin->w_toolbarForm,
		XmNtopOffset,			2,
		XmNbottomAttachment,	XmATTACH_WIDGET,
		XmNbottomWidget,		w_llnl,
		XmNbottomOffset,		2,
		XmNleftAttachment,		XmATTACH_FORM,
		XmNleftOffset,			4,
		XmNrightAttachment,		XmATTACH_FORM,
		XmNrightOffset,			4,
        NULL
    );

	/* Create scrollbars */
	w_vertical_sb = XtVaCreateManagedWidget(
		"vertical_scrollbar",
		xmScrollBarWidgetClass,
		dirwin->w_scrolledWindow,
		XmNorientation,	XmVERTICAL,
		NULL
	);
	XtAddCallback(w_vertical_sb, XmNvalueChangedCallback, cb_scroll_vertical,
		(XtPointer)dirwin);
	XtAddCallback(w_vertical_sb, XmNdragCallback, cb_scroll_vertical,
		(XtPointer)dirwin);
	w_horizontal_sb = XtVaCreateManagedWidget(
		"horizontal_scrollbar",
		xmScrollBarWidgetClass,
		dirwin->w_scrolledWindow,
		XmNorientation,	XmHORIZONTAL,
		NULL
	);
	XtAddCallback(w_horizontal_sb, XmNvalueChangedCallback,
		cb_scroll_horizontal, (XtPointer)dirwin);
	XtAddCallback(w_horizontal_sb, XmNdragCallback, cb_scroll_horizontal,
		(XtPointer)dirwin);

	/* Create frame to pretty up drawing area widget */
	dirwin->w_drawingAreaFrame = XtVaCreateManagedWidget(
		"drawingAreaFrame",
		xmFrameWidgetClass,
		dirwin->w_scrolledWindow,
		XmNshadowType,		XmSHADOW_IN,
		NULL
	);

	/* Create drawing area widget to hold directory entries */
	dirwin->w_drawingArea = XtVaCreateManagedWidget(
		"drawingArea",
		xmDrawingAreaWidgetClass,
		dirwin->w_drawingAreaFrame,
		XmNuserData,		dirwin,
   		NULL
	);
	XtAddCallback(dirwin->w_drawingArea, XmNhelpCallback,
		cb_help_display_area, (XtPointer)dirwin);
	XtAddEventHandler(dirwin->w_drawingArea,
		ButtonPressMask |
		ButtonReleaseMask |
		EnterWindowMask |
		LeaveWindowMask |
		Button1MotionMask,
		False,
		HandleMouseEvents,
		(XtPointer)dirwin
	);
	XtAddEventHandler(dirwin->w_drawingArea,
		KeyPressMask,
		False,
		HandleKeyboardEvents,
		(XtPointer)dirwin
	);
	XtAddEventHandler(dirwin->w_drawingArea,
		ExposureMask,
		False,
		HandleExposeEvents,
		(XtPointer)dirwin
	);
	XtAddEventHandler(dirwin->w_drawingArea,
		(EventMask)0,
		True,
		HandleExposeEvents,
		(XtPointer)dirwin
	);

	/* Initialize ScrolledWindow */
	XmScrolledWindowSetAreas(dirwin->w_scrolledWindow, w_horizontal_sb,
		w_vertical_sb, dirwin->w_drawingAreaFrame);

	XtManageChild(dirwin->w_form);

	/* Initialize the popup and pulldown launch menus */
	init_launch_menus(dirwin);

	/* Make upper-right button the same height as the menu bar */
	XtVaGetValues(dirwin->w_dirMenuBar, XmNheight, &h, NULL);
	XtVaSetValues(dirwin->w_urButton, XmNheight, h, NULL);

	XtPopup(dirwin->w_shell, XtGrabNone);

	if (first_time) {
		initialize_graphics(dirwin);
		initialize_ur_button(dirwin);
		first_time = False;
	}
	traverse_to_widget(dirwin->w_drawingArea);
	add_dialog_to_list(dirwin->w_shell);

	XtAddCallback(dirwin->w_drawingArea, XmNresizeCallback, cb_resize_dirwin,
		(XtPointer)dirwin);

	return dirwin;
}



syntax highlighted by Code2HTML, v. 0.9.1