Milán Major

netscape-revival

1 branch
Code

cmd/xfe/mailfilter.c

/* -*- Mode:C; tab-width: 4 -*-
   mailfilter.c - Mail Filter frontend
   Copyright © 1996 Netscape Communications Corporation, 
   all rights reserved.

   Created:    Benjie Chen - 6/24/96
   */


/****************************************************************************/
/* Just to go with everyone else's feelings:  MOTIF SUCKS SUCKS SUCKS SUCKS */
/* OPTION menu sucks. X sucks. GUI sucks. Navigator sucks. lynx rules.      */
/****************************************************************************/

#include "mozilla.h"
#include "xfe.h"
#include "menu.h"
#include "outline.h"
#include "felocale.h"
#include "xlate.h"

/* Kludge around conflicts between Motif and xp_core.h... */
#undef Bool
#define Bool char

/* must be in front of addrbook.h */
#include "msg_filt.h"  
#include "msg_srch.h"  

#include <X11/IntrinsicP.h>
#include <X11/ShellP.h>
#include <XmL/Folder.h>
#include <XmL/Grid.h>
#include <Xm/ArrowBG.h>
#include "DtWidgets/ComboBox.h"

/* for XP_GetString() */
#include <xpgetstr.h>

static char* mailFilterHeaders[] = {
  "Type", "Order", "Name", "On"
};


static char* actionOptMenu[] = {
  "list of all user's mail folders", 0 
};

static MSG_PRIORITY priorityActionMenu[] = {
  MSG_HighPriority, MSG_NormalPriority, MSG_LowPriority, MSG_NoPriority, 99
};


typedef enum
{
  feFilterOn=11,
  feFilterOff
} feFilterStatus;



typedef struct fe_mailfilt_userData {
	int row;
	MSG_SearchAttribute attrib;
} fe_mailfilt_userData;

typedef struct fe_mailfilt_data {
  
  Widget filterDialog;
  Widget filterOutline;
  Widget editDialog;
  Widget deletebtn;
  Widget editbtn;
 
  Widget filterName; 
  Widget rulesRC;
  Widget content[5];	 /* rule content RC */
  Widget scopeOpt[5];  /* scope option */
  Widget whereOpt[5];  /* where option */
  Widget scopeOptPopup[5];
  Widget whereOptPopup[5];
  Widget scopeText[5]; /* scope text */
  Widget priLevel[5];  /* priority level */
  Widget priLevelPopup[5];
  Widget whereLabel[5];
  Widget rulesLabel[5];
  Widget thenTo;
  Widget thenToPopup;
  Widget thenClause;
  Widget thenClausePopup;
  Widget priAction;
  Widget priActionPopup;
  Widget commandGroup;
  Widget despField;
  Widget strip[5];
  Widget mainDespField;
  Widget filterOnBtn;
  Widget filterOffBtn;  
  Widget upBtn;
  Widget downBtn;

  /* these are just pointers to other widgets, they are not really
   * widgets themselves */
  /* priority buttons */
  Widget highBtn;
  Widget lowBtn;
  Widget noneBtn;
  /* selected btns */
  Widget scopeOptSelected[5];
  Widget whereOptSelected[5];
  Widget priLevelSelected[5];
  Widget thenToSelected;
  Widget thenClauseSelected;
  Widget priActionSelected;
  Widget editOkbtn;
 
  Dimension despwidth;
  MSG_FilterList *filterlist;

  int curPos;
  int stripCount;
  XP_Bool curFilterOn;
  
} fe_mailfilt_data;

#define FILTER_DATA(context) (CONTEXT_DATA(context)->filtdata)

static void 
fe_mailfilt_buildWhereOpt(MWContext *context, Dimension *width, 
					   	  Dimension *height, int num, 
						  MSG_SearchAttribute attrib);



/********************/
/* CODE STARTS HERE */
/********************/



/* this function get the rule data specified by the user */
static void
fe_mailfilt_getTerm(MWContext *context, 
					int num, 
					MSG_SearchAttribute *attrib,
					MSG_SearchOperator *op,
					MSG_SearchValue *value) 
{
  fe_mailfilt_data *d = FILTER_DATA(context);
  char *text;
  Widget w;
  fe_mailfilt_userData *userData;

  w=0;
  XtVaGetValues(d->scopeOpt[num], XmNmenuHistory, &w, NULL);
  XtVaGetValues(w, XmNuserData, &userData, 0);
  *attrib = (MSG_SearchAttribute) userData->attrib;
  w=0;
  XtVaGetValues(d->whereOpt[num], XmNmenuHistory, &w, NULL);
  XtVaGetValues(w, XmNuserData, &userData, 0);
  *op = (MSG_SearchOperator) userData->attrib;


  if (*attrib == attribPriority) {                      /* priority */
	value->attribute = *attrib;
  	w=0;
  	XtVaGetValues(d->priLevel[num], XmNmenuHistory, &w, NULL);
  	XtVaGetValues(w, XmNuserData, &userData, 0);
  	value->u.priority = (MSG_PRIORITY) userData->attrib;
  } else if (*attrib == attribDate) {                   /* Date */
  } else if (*attrib == attribMsgStatus) {              /* Status */
  } else {                                              /* everything else */
	value->attribute = *attrib;
    text = XmTextFieldGetString(d->scopeText[num]);
	strcpy(value->u.string, text);
  }
}


static void
fe_mailfilt_getAction(MWContext *context, 
					  MSG_RuleActionType *action, 
					  void **value) 
{
  fe_mailfilt_data *d = FILTER_DATA(context);
  char *text;
  Widget w;
  fe_mailfilt_userData *userData;

  w=0;
  XtVaGetValues(d->thenClause, XmNmenuHistory, &w, NULL);
  XtVaGetValues(w, XmNuserData, &userData, 0);
  *action = (MSG_RuleActionType) userData->attrib;
  switch (*action) {
	case acMoveToFolder:
		*value = NULL;
		break;
	case acChangePriority:
  		w=0;
  		XtVaGetValues(d->priAction, XmNmenuHistory, &w, NULL);
  		XtVaGetValues(w, XmNuserData, &userData, 0);
		*value = (void *) userData->attrib;
	default:
		*value = NULL;
  }
}




static void
fe_mailfilt_get_option_size ( Widget optionMenu, Widget btn,
							  Dimension *retWidth, Dimension *retHeight )
{
  Dimension width, height;
  Dimension mh, mw, ml, mr, mt, mb ; /*margin*/
  Dimension st, bw, ht;
  Dimension space;
  
  XtVaGetValues(btn, XmNwidth, &width,
				XmNheight, &height,
				XmNmarginHeight, &mh,
				XmNmarginWidth, &mw,
				XmNmarginLeft, &ml,
				XmNmarginRight, &mr,
				XmNmarginBottom, &mb,
				XmNmarginTop, &mt,
				XmNhighlightThickness, &ht,
				XmNshadowThickness, &st,
				XmNborderWidth, &bw,
				0);
  
  XtVaGetValues(optionMenu, XmNspacing, &space, 0);
  
  *retHeight = height + (mh+mt+mb+bw+st+ht + space ) * 2;
  *retWidth  = width + (mw+ml+mr+bw+st+ht + space) * 2;
}


static Widget
fe_mailfilt_make_opPopup(Widget popupW, MSG_SearchMenuItem menu[],
						 int itemNum, Dimension *width, Dimension *height,	
                          int row, XtCallbackProc cb, MWContext *context) 
{
  XmString xmStr;
  char *buttonLabel;
  Widget btn, returnBtn;
  Arg	av[30];
  Cardinal ac;
  int j = 0;
  fe_mailfilt_userData *userData;  

 
  while(j < itemNum) {
    j++;	
	buttonLabel = (char *) malloc(strlen(menu[j-1].name)+1);
	strcpy(buttonLabel, menu[j-1].name);
    xmStr = XmStringCreateLtoR(buttonLabel, XmSTRING_DEFAULT_CHARSET);

	userData = XP_NEW_ZAP(fe_mailfilt_userData);
    userData->row = row;
    userData->attrib = menu[j-1].attrib;
    ac = 0;
    XtSetArg(av[ac], XmNuserData, userData); ac++;
    XtSetArg(av[ac], XmNlabelString, xmStr); ac++;
    btn = XmCreatePushButtonGadget(popupW, "operatorBtn", av, ac);
    XtAddCallback(btn, XmNactivateCallback, cb, context);
	
    fe_mailfilt_get_option_size(popupW, btn, width, height);
    XtManageChild(btn);
    free(buttonLabel);
    XtFree(xmStr);
	if (j==1) returnBtn = btn;
  }
  return returnBtn;
}


static Widget
fe_mailfilt_make_option_menu( MWContext *context,
                              Widget parent, char* widgetName,
                              Widget *popup)
{
  Cardinal ac;
  Arg      av[10];
  Visual   *v = 0;
  Colormap cmap = 0;
  Cardinal depth =0;
  Widget option_menu;
  
  XtVaGetValues(CONTEXT_WIDGET(context),
				XtNvisual, &v, XtNcolormap, &cmap, XtNdepth, &depth, 0);
  
  ac = 0;
  XtSetArg(av[ac], XmNvisual, v); ac++;
  XtSetArg(av[ac], XmNdepth, depth); ac++;
  XtSetArg(av[ac], XmNcolormap, cmap); ac ++;
  *popup= XmCreatePulldownMenu(parent, widgetName, av, ac);
  
  ac = 0;
  XtSetArg(av[ac], XmNsubMenuId, *popup); ac++;
  XtSetArg(av[ac], XmNmarginWidth, 0); ac++;
  option_menu = XmCreateOptionMenu(parent, widgetName, av, ac);
  XtUnmanageChild(XmOptionLabelGadget(option_menu));
  
  return option_menu;
}

static void
fe_mailfilt_editclose_cb(Widget w, XtPointer closure, XtPointer calldata)
{
  MWContext* context = (MWContext *) closure;
  fe_mailfilt_data *d = FILTER_DATA(context);
  int32 count;
  MSG_CloseFilterList(d->filterlist);
  MSG_OpenFilterList(filterInbox, &(d->filterlist));
  MSG_GetFilterCount(d->filterlist, &count);
  fe_OutlineChange(d->filterOutline, 0, count, count);
  XtUnmanageChild(d->editDialog);
}

static void
fe_mailfilt_edit_destroy_cb(Widget w, XtPointer closure, XtPointer calldata)
{
  MWContext* context = (MWContext *) closure;
  fe_mailfilt_data *d = FILTER_DATA(context);
  fe_mailfilt_editclose_cb(w, closure, calldata);
  d->editDialog = NULL; 
}


static void
fe_mailfilt_getParams(MWContext *context, int position)
{
  fe_mailfilt_data *d = FILTER_DATA(context);
  int num;
  char *desptext;
  char *nametext;
  void *value2;
  MSG_Filter *filter;
  MSG_Rule *rule;
  MSG_RuleActionType action;
  MSG_SearchAttribute attrib;
  MSG_SearchOperator op;
  MSG_SearchValue value;
  int32 filterCount;

  nametext = XmTextFieldGetString(d->filterName);
  MSG_CreateFilter(filterInboxRule, nametext, &filter);
  desptext = XmTextGetString(d->despField);
  MSG_SetFilterDesc(filter, desptext);

  free(nametext);
  free(desptext);

  if (d->curFilterOn) {
	MSG_EnableFilter(filter, d->curFilterOn);
  }

  MSG_GetFilterRule(filter, &rule);

  for (num = 0; num < d->stripCount; num ++) {
	fe_mailfilt_getTerm(context, num, &attrib, &op, &value);
	MSG_RuleAddTerm(rule, attrib, op, &value);
  }

  fe_mailfilt_getAction(context, &action, &value2);
  MSG_RuleSetAction(rule, action, value2);

  if (position < 0) {
  	MSG_GetFilterCount(d->filterlist, &filterCount);
  	MSG_SetFilterAt(d->filterlist, filterCount, filter);
  } else {
  	MSG_SetFilterAt(d->filterlist, (MSG_FilterIndex) position, filter);
  }
}


static void
fe_mailfilt_editok_cb(Widget w, XtPointer closure, XtPointer calldata)
{
  MWContext* context = (MWContext *) closure;
  fe_mailfilt_data *d = FILTER_DATA(context);
  MSG_Filter *f;

  MSG_GetFilterAt(d->filterlist,d->curPos,&f);
  MSG_RemoveFilterAt(d->filterlist,d->curPos);
  MSG_DestroyFilter(f);
  fe_mailfilt_getParams(context, d->curPos);
  fe_mailfilt_editclose_cb(w, closure, calldata); 
}


static void
fe_mailfilt_newok_cb(Widget w, XtPointer closure, XtPointer calldata)
{
  MWContext* context = (MWContext *) closure;
  fe_mailfilt_getParams(context, -1);
  fe_mailfilt_editclose_cb(w, closure, calldata); 
}


static void
fe_mailfilt_whereOpt_cb(Widget w, XtPointer closure, XtPointer calldata)
{
  MWContext* context = (MWContext *) closure;
  fe_mailfilt_data *d = FILTER_DATA(context);
  int num;
  fe_mailfilt_userData *userData;
  MSG_SearchAttribute attrib;
  MSG_SearchOperator op;
  XtVaGetValues(w, XmNuserData, &userData, 0);
  num = userData->row - 1;
  op = (MSG_SearchOperator) userData->attrib;
  XtVaGetValues(d->scopeOptSelected[num], XmNuserData, &userData, 0);
  attrib = (MSG_SearchAttribute) userData->attrib;
  if (op == opIsEmpty || attrib == attribPriority) {
  	XtUnmanageChild(d->scopeText[num]);
  	XtVaSetValues(d->whereOpt[num],
				  XmNtopAttachment, XmATTACH_FORM,
				  XmNbottomAttachment, XmATTACH_FORM,
				  XmNleftAttachment, XmATTACH_WIDGET,
				  XmNleftWidget, d->whereLabel[num],
				  XmNrightAttachment, XmATTACH_FORM,
				  0);
  } else if (!XtIsManaged(d->scopeText[num])) {
  	XtVaSetValues(d->whereOpt[num],
				  XmNtopAttachment, XmATTACH_FORM,
				  XmNbottomAttachment, XmATTACH_FORM,
				  XmNleftAttachment, XmATTACH_WIDGET,
				  XmNleftWidget, d->whereLabel[num],
				  XmNrightAttachment, XmATTACH_NONE,
				  0);
  	XtVaSetValues(d->scopeText[num],
				  XmNtopAttachment, XmATTACH_FORM,
				  XmNbottomAttachment, XmATTACH_NONE,
				  XmNleftAttachment, XmATTACH_WIDGET,
				  XmNleftWidget, d->whereOpt[num],
				  0);
  	XtManageChild(d->scopeText[num]);
  }
  d->whereOptSelected[num] = w;


  if (op == opIsHigherThan && attrib == attribPriority) {
	XtManageChild(d->lowBtn);	
	XtUnmanageChild(d->highBtn);	
	XtUnmanageChild(d->noneBtn);	
  } else if (op == opIsLowerThan && attrib == attribPriority) {
	XtManageChild(d->highBtn);	
	XtUnmanageChild(d->lowBtn);	
	XtUnmanageChild(d->noneBtn);	
  }

}


static void
fe_mailfilt_scopeOpt_cb(Widget w, XtPointer closure, XtPointer calldata)
{
  MWContext* context = (MWContext *) closure;
  fe_mailfilt_data *d = FILTER_DATA(context);
  fe_mailfilt_userData *userData;
  int num;
  MSG_SearchAttribute attrib;
  Dimension width, height;
  Widget popupW;
  
  XtVaGetValues(w, XmNuserData, &userData, 0);
  num = userData->row - 1;
  attrib = userData->attrib;

  /* MOTIF SUCKS */
  if (attrib==attribPriority) {
  	XtUnmanageChild(d->whereOpt[num]);
  	XtUnmanageChild(d->scopeText[num]);
 	fe_mailfilt_buildWhereOpt(context, &width, &height, num, attrib);

  	XtVaSetValues(d->whereOpt[num],
				  XmNwidth, width,
				  XmNtopAttachment, XmATTACH_FORM,
				  XmNbottomAttachment, XmATTACH_FORM,
				  XmNleftAttachment, XmATTACH_WIDGET,
				  XmNleftWidget, d->whereLabel[num],
				  XmNrightAttachment, XmATTACH_NONE,
				  0);
  	XtVaSetValues(d->priLevel[num],
				  XmNtopAttachment, XmATTACH_FORM,
				  XmNbottomAttachment, XmATTACH_NONE,
				  XmNleftAttachment, XmATTACH_WIDGET,
				  XmNleftWidget, d->whereOpt[num],
				  XmNrightAttachment, XmATTACH_FORM,
				  0);
  	XtManageChild(d->whereOpt[num]);
  	XtManageChild(d->priLevel[num]);
  } else {
  	XtUnmanageChild(d->whereOpt[num]);
  	XtUnmanageChild(d->priLevel[num]);

 	fe_mailfilt_buildWhereOpt(context, &width, &height, num, attrib);

  	XtVaSetValues(d->whereOpt[num],
				  XmNwidth, width,
				  XmNtopAttachment, XmATTACH_FORM,
				  XmNbottomAttachment, XmATTACH_FORM,
				  XmNleftAttachment, XmATTACH_WIDGET,
				  XmNleftWidget, d->whereLabel[num],
				  XmNrightAttachment, XmATTACH_NONE,
				  0);
  	XtVaSetValues(d->scopeText[num],
				  XmNtopAttachment, XmATTACH_FORM,
				  XmNbottomAttachment, XmATTACH_NONE,
				  XmNleftAttachment, XmATTACH_WIDGET,
				  XmNleftWidget, d->whereOpt[num],
				  XmNrightAttachment, XmATTACH_FORM,
				  0);
  	XtManageChild(d->whereOpt[num]);
  	XtManageChild(d->scopeText[num]);
  }
  d->scopeOptSelected[num] = w;
}


static void
fe_mailfilt_thenClause_cb(Widget w, XtPointer closure, XtPointer calldata)
{
  MWContext* context = (MWContext *) closure;
  fe_mailfilt_data *d = FILTER_DATA(context);
  fe_mailfilt_userData *userData;
  int num; 
  MSG_SearchAttribute attrib;
  XtVaGetValues(w, XmNuserData, &userData, 0);
  num = userData->row - 1;
  attrib = userData->attrib;
  if (attrib==acChangePriority) {
	  XtUnmanageChild(d->thenTo);
	  XtVaSetValues(d->priAction,
					XmNtopAttachment, XmATTACH_WIDGET,
					XmNtopWidget, d->commandGroup,
					XmNbottomAttachment, XmATTACH_NONE,
					XmNleftAttachment, XmATTACH_WIDGET,
					XmNleftWidget, d->thenClause,
					XmNrightAttachment, XmATTACH_NONE,
					0);
	  XtManageChild(d->priAction);
  } else if (attrib==acMoveToFolder) {
	  XtUnmanageChild(d->priAction);
	  XtVaSetValues(d->thenTo,
					XmNtopAttachment, XmATTACH_WIDGET,
					XmNtopWidget, d->commandGroup,
					XmNbottomAttachment, XmATTACH_NONE,
					XmNleftAttachment, XmATTACH_WIDGET,
					XmNleftWidget, d->thenClause,
					XmNrightAttachment, XmATTACH_NONE,
					0);
      XtManageChild(d->thenTo);
  } else {
	  XtUnmanageChild(d->priAction);
	  XtUnmanageChild(d->thenTo);
	  XtVaSetValues(d->thenClause, XmNrightAttachment, XmATTACH_NONE, 0);
  }
  d->thenClauseSelected = w;
}

static void 
fe_mailfilt_buildWhereOpt(MWContext *context, Dimension *width, 
					   	  Dimension *height, int num, 
						  MSG_SearchAttribute attrib)
{
  fe_mailfilt_data *d = FILTER_DATA(context);
  Cardinal ac;
  Arg      av[10];
  Visual   *v = 0;
  Colormap cmap = 0;
  Cardinal depth =0;
  Widget dummy;
  Widget popupW;
  MSG_SearchMenuItem menu[20];
  uint16 maxItems = 20;
  int i, numChildren;
  WidgetList childrenList;

  /** MOTIF SUCKS **/

  XtVaGetValues(CONTEXT_WIDGET(context),
				XtNvisual, &v, XtNcolormap, &cmap, XtNdepth, &depth, 0);

  if (d->whereOptPopup[num]) {
	XtVaGetValues(d->whereOptPopup[num], XmNchildren, &childrenList,
                  XmNnumChildren, &numChildren, 0);
  	for ( i = 0; i < numChildren; i++ ) {
		XtDestroyWidget(childrenList[i]);
  	}
  }

  popupW = d->whereOptPopup[num];

  /* make the option menu for where */
  /* get what's needed in the option menu from backend */
  MSG_GetOperatorsForAttribute(scopeMailFolder, attrib, menu, &maxItems);

  /* we save the first widget returned always */
  dummy = fe_mailfilt_make_opPopup(popupW, menu, maxItems, width,
                                   height, num+1, fe_mailfilt_whereOpt_cb,
                                   context);
  XtVaSetValues(d->whereOpt[num], XmNmenuHistory, dummy, NULL);
  d->whereOptPopup[num] = popupW;
  d->whereOptSelected[num] = dummy;
}




static void
fe_mailfilt_setRulesParams(MWContext *context, int num,
  					       MSG_SearchAttribute attrib,
  					       MSG_SearchOperator op,
  					       MSG_SearchValue value)
{
  fe_mailfilt_data *d = FILTER_DATA(context);
  fe_mailfilt_userData *userData;
  int numChildren, i;
  WidgetList childrenList;

  XtVaGetValues(d->scopeOptPopup[num], XmNchildren, &childrenList,
                XmNnumChildren, &numChildren, 0);
  for ( i = 0; i < numChildren; i++ ) {
	XtVaGetValues(childrenList[i], XmNuserData, &userData, 0);
	if (attrib == (MSG_SearchAttribute) userData->attrib) {
	  	XtVaSetValues(d->scopeOpt[num], XmNmenuHistory, childrenList[i], NULL);
		break;
    }
  }
  fe_mailfilt_scopeOpt_cb(childrenList[i], (XtPointer) context, NULL);

  XtVaGetValues(d->whereOptPopup[num], XmNchildren, &childrenList,
                XmNnumChildren, &numChildren, 0);
  for ( i = 0; i < numChildren; i++ ) {
	XtVaGetValues(childrenList[i], XmNuserData, &userData, 0);
	if (op == (MSG_SearchOperator) userData->attrib) {
	  	XtVaSetValues(d->whereOpt[num], XmNmenuHistory, childrenList[i], NULL);
		break;
    }
  }
  fe_mailfilt_whereOpt_cb(childrenList[i], (XtPointer) context, NULL);
  
  switch(attrib) {
	case attribDate:
		break;
	case attribMsgStatus:
		break;
	case attribPriority:
  		XtVaGetValues(d->priLevelPopup[num], XmNchildren, &childrenList,
                      XmNnumChildren, &numChildren, 0);
  		for ( i = 0; i < numChildren; i++ ) {
			XtVaGetValues(childrenList[i], XmNuserData, &userData, 0);
			if (value.u.priority == (MSG_PRIORITY) userData->attrib) {
	  			XtVaSetValues(d->priLevel[num], 
							  XmNmenuHistory, childrenList[i], NULL);
				break;
			}
		}
		break;
	default:
		XtVaSetValues(d->scopeText[num], XmNvalue, value.u.string, NULL);
		break;
  }
}


static void
fe_mailfilt_setActionParams(MWContext *context,
							MSG_RuleActionType type,
						    void *value)
{
  fe_mailfilt_data *d = FILTER_DATA(context);
  fe_mailfilt_userData *userData;
  int numChildren, i;
  WidgetList childrenList;

  XtVaGetValues(d->thenClausePopup, XmNchildren, &childrenList,
                XmNnumChildren, &numChildren, 0);
  for ( i = 0; i < numChildren; i++ ) {
	XtVaGetValues(childrenList[i], XmNuserData, &userData, 0);
	if (type == (MSG_RuleActionType) userData->attrib) {
	  	XtVaSetValues(d->thenClause, XmNmenuHistory, childrenList[i], NULL);
		break;
    }
  }

  fe_mailfilt_thenClause_cb(childrenList[i], (XtPointer) context, NULL);

  if (type == acMoveToFolder) {
  } else if (type == acChangePriority) {
  	XtVaGetValues(d->priActionPopup, XmNchildren, &childrenList,
                  XmNnumChildren, &numChildren, 0);
  	for ( i = 0; i < numChildren; i++ ) {
		XtVaGetValues(childrenList[i], XmNuserData, &userData, 0);
		if ((MSG_PRIORITY) value == (MSG_PRIORITY) userData->attrib) {
	  		XtVaSetValues(d->priAction, XmNmenuHistory, childrenList[i], NULL);
			break;
    	}
  	}
  }

}



static void
fe_mailfilt_priLevel_cb(Widget w, XtPointer closure, XtPointer calldata)
{
  MWContext* context = (MWContext *) closure;
  fe_mailfilt_data *d = FILTER_DATA(context);
  fe_mailfilt_userData *userData;
  int num;
  XtVaGetValues(w, XmNuserData, &userData, 0);
  num = userData->row - 1;
  d->priLevelSelected[num] = w;
}


static void
fe_mailfilt_thenTo_cb(Widget w, XtPointer closure, XtPointer calldata)
{
  MWContext* context = (MWContext *) closure;
  fe_mailfilt_data *d = FILTER_DATA(context);
  d->thenToSelected = w;
}




static Widget
fe_mailfilt_make_actPopup(Widget popupW, Dimension *width, Dimension *height,	
                          int row, XtCallbackProc cb, MWContext *context) 
{
  XmString xmStr;
  char *buttonLabel;
  Widget btn, returnBtn;
  Arg	av[30];
  Cardinal ac;
  int j = 0;
  uint16 maxItems;
  fe_mailfilt_userData *userData;  
  MSG_RuleMenuItem menu[20];

  maxItems = 20;
  MSG_GetRuleActionMenuItems(filterInbox, menu, &maxItems);
 
  while(j < maxItems) {
    j++;	
	buttonLabel = (char *) malloc(strlen(menu[j-1].name)+1);
	strcpy(buttonLabel, menu[j-1].name);
    xmStr = XmStringCreateLtoR(buttonLabel, XmSTRING_DEFAULT_CHARSET);

	userData = XP_NEW_ZAP(fe_mailfilt_userData);
    userData->row = row;
    userData->attrib = menu[j-1].attrib;
    ac = 0;
    XtSetArg(av[ac], XmNuserData, userData); ac++;
    XtSetArg(av[ac], XmNlabelString, xmStr); ac++;
    btn = XmCreatePushButtonGadget(popupW, "operatorBtn", av, ac);
    XtAddCallback(btn, XmNactivateCallback, cb, context);
	
    fe_mailfilt_get_option_size(popupW, btn, width, height);
    XtManageChild(btn);
    free(buttonLabel);
    XtFree(xmStr);
	if (j==1) returnBtn = btn;
  }
  return returnBtn;
}



static Widget
fe_mailfilt_make_folderlist(Widget popupW, char **menudesc, 
                          Dimension *width, Dimension *height,	
                          int row, XtCallbackProc cb, MWContext *context) 
{}



/* this function returns the first button that is created which
 * by default shows on the option menu */

static Widget
fe_mailfilt_make_attribPopup(Widget popupW, Dimension *width, 
							 Dimension *height,	int row, 
							 XtCallbackProc cb, MWContext *context) 
{
  XmString xmStr;
  char *buttonLabel;
  Widget btn, returnBtn;
  Arg	av[30];
  Cardinal ac;
  int j = 0;
  uint16 i = 0;
  MSG_SearchMenuItem menu[20]; 
  fe_mailfilt_userData *userData;  

  i = 20; 
  MSG_GetAttributesForScope(scopeMailFolder, menu, &i);
  while(j < i) {
    j++;	
	buttonLabel = (char *) malloc(strlen(menu[j-1].name)+1);
	strcpy(buttonLabel, menu[j-1].name);
    xmStr = XmStringCreateLtoR(buttonLabel, XmSTRING_DEFAULT_CHARSET);

	userData = XP_NEW_ZAP(fe_mailfilt_userData);
    userData->row = row;
    userData->attrib = menu[j-1].attrib;
    ac = 0;
    XtSetArg(av[ac], XmNuserData, userData); ac++;
    XtSetArg(av[ac], XmNlabelString, xmStr); ac++;
    btn = XmCreatePushButtonGadget(popupW, "operatorBtn", av, ac);
    XtAddCallback(btn, XmNactivateCallback, cb, context);
	
    fe_mailfilt_get_option_size(popupW, btn, width, height);
    XtManageChild(btn);
    free(buttonLabel);
    XtFree(xmStr);
	if (j==1) returnBtn = btn;
  }
  return returnBtn;
}


/* this function returns the first button that is created which
 * by default shows on the option menu */

static Widget
fe_mailfilt_makeopt_priority(Widget popupW, MSG_PRIORITY *menudesc, 
                             Dimension *width, Dimension *height,	
                             int row, XtCallbackProc cb, MWContext *context) 
{
  XmString xmStr;
  char *buttonLabel;
  Widget btn;
  Arg	av[30];
  Cardinal ac;
  int j = 0;
  uint16 i = 0;
  MSG_RuleMenuItem menu[20]; 
  Widget returnBtn;
  fe_mailfilt_data *d = FILTER_DATA(context);
  fe_mailfilt_userData *userData;  

 
  while(*menudesc != 99) {
	menu[i].attrib = *menudesc;
	i++;
	menudesc++;
  }

  while(j < i) {
	j++;
	MSG_GetPriorityName((MSG_PRIORITY)menu[j-1].attrib,
						menu[j-1].name,32);
	buttonLabel = (char *) malloc(strlen(menu[j-1].name)+1);
	strcpy(buttonLabel, menu[j-1].name);
    xmStr = XmStringCreateLtoR(buttonLabel, XmSTRING_DEFAULT_CHARSET);

	
	userData = XP_NEW_ZAP(fe_mailfilt_userData);
    userData->row = row;
    userData->attrib = menu[j-1].attrib;
    ac = 0;
    XtSetArg(av[ac], XmNuserData, userData); ac++;
    XtSetArg(av[ac], XmNlabelString, xmStr); ac++;
    btn = XmCreatePushButtonGadget(popupW, "operatorBtn", av, ac);
    XtAddCallback(btn, XmNactivateCallback, cb, context);
	if (menu[j-1].attrib == MSG_HighPriority) d->highBtn = btn;
	else if (menu[j-1].attrib == MSG_LowPriority) d->lowBtn = btn;
	else if (menu[j-1].attrib == MSG_NoPriority) d->noneBtn = btn;
	
    fe_mailfilt_get_option_size(popupW, btn, width, height);
    XtManageChild(btn);
    free(buttonLabel);
    XtFree(xmStr);
	if (j==1) returnBtn = btn;
  }
  return returnBtn;
}



static
void fe_mailfilt_makeRules(Widget rowcol, int fake_num, 
                           fe_mailfilt_data *d, MWContext *context) 
{
  int num = fake_num-1;
  Arg	av[30];
  Cardinal ac;
  Widget popupW;
  Widget dummy;
  char name[128];
  Dimension width, height;
  fe_mailfilt_userData *userData;
  MSG_SearchAttribute attrib;
  uint16 maxItems=16;
  MSG_SearchMenuItem menu[16]; 
 
  sprintf(name,"formContainer%d",num);
  ac = 0;
  d->content[num] = XmCreateForm(rowcol, name, av, ac);
  ac = 0;
  d->strip[num] = XmCreateForm(d->content[num], "rulesForm", av, ac );

  /* build the label */
  if (num == 0)
  	d->rulesLabel[num] = XmCreateLabelGadget(d->content[num], 
						 "rulesLabel1", av, ac);
  else
  	d->rulesLabel[num] = XmCreateLabelGadget(d->content[num], 
	 					 "rulesLabel", av, ac);
 
  /* make the option menu for scope */ 
  d->scopeOpt[num] = fe_mailfilt_make_option_menu(context, d->strip[num],
                                                  "rulesScopeOpt", &popupW);
  dummy = fe_mailfilt_make_attribPopup(popupW, &width, &height, num+1, 
									   fe_mailfilt_scopeOpt_cb, context);
  d->scopeOptPopup[num] = popupW;
  /* we save the first widget returned always */
  /* later we use this widget to get the correct attribute */
  d->scopeOptSelected[num] = dummy;

  /* another label */ 
  ac = 0;
  d->whereLabel[num] = XmCreateLabelGadget(d->strip[num], "whereLabel", av, ac);

  /* get what's needed in the option menu from backend */
  XtVaGetValues(d->scopeOptSelected[num], XmNuserData, &userData, 0);
  attrib = userData->attrib;
  popupW = 0;
  d->whereOpt[num] = fe_mailfilt_make_option_menu(context, d->strip[num],
                                                  "rulesWhereOpt", &popupW);
  d->whereOptPopup[num] = popupW;
  fe_mailfilt_buildWhereOpt(context, &width, &height, num, attrib);

  ac = 0;
  XtSetArg (av[ac], XmNwidth, 120); ac++;
  d->scopeText[num] = XmCreateTextField(d->strip[num], "rulesText", av, ac);

  /* here is the priority level option menu */  
  popupW=0;
  d->priLevel[num] = fe_mailfilt_make_option_menu(context, d->strip[num],
                                                  "priorityLevel", &popupW);
  dummy = fe_mailfilt_makeopt_priority(popupW, priorityActionMenu, &width, 
									   &height, num+1, fe_mailfilt_priLevel_cb,
									   context);
  d->priLevelPopup[num] = popupW;
  d->priLevelSelected[num] = dummy;

  /* geometry */  
  XtVaSetValues(d->rulesLabel[num],
                XmNalignment, XmALIGNMENT_END,
                XmNtopAttachment, XmATTACH_FORM,
                XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
                XmNbottomWidget, d->strip[num],
                XmNleftAttachment, XmATTACH_FORM,
                XmNrightAttachment, XmATTACH_NONE,
                0);
  
  XtVaSetValues(d->scopeOpt[num],
                XmNtopAttachment, XmATTACH_FORM,
                XmNbottomAttachment, XmATTACH_FORM,
                XmNleftAttachment, XmATTACH_FORM,
                0);
  
  XtVaSetValues(d->whereLabel[num],
                XmNalignment, XmALIGNMENT_BEGINNING,
                XmNtopAttachment, XmATTACH_FORM,
                XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
                XmNbottomWidget, d->scopeOpt[num],
                XmNleftAttachment, XmATTACH_WIDGET,
                XmNleftWidget, d->scopeOpt[num],
                XmNheight, (d->scopeOpt[num])->core.height,
                0);

  XtVaSetValues(d->whereOpt[num],
                XmNtopAttachment, XmATTACH_FORM,
                XmNbottomAttachment, XmATTACH_FORM,
                XmNleftAttachment, XmATTACH_WIDGET,
                XmNleftWidget, d->whereLabel[num],
								0);

  XtVaSetValues(d->scopeText[num],
                XmNtopAttachment, XmATTACH_FORM,
                XmNbottomAttachment, XmATTACH_NONE,
                XmNleftAttachment, XmATTACH_WIDGET,
                XmNleftWidget, d->whereOpt[num],
                XmNrightAttachment, XmATTACH_FORM,
				0);
  
  XtVaSetValues(d->strip[num],
                XmNtopAttachment, XmATTACH_FORM,
                XmNbottomAttachment, XmATTACH_FORM,
                XmNleftAttachment, XmATTACH_FORM,
                XmNrightAttachment, XmATTACH_FORM,
                0);

  XtManageChild(d->rulesLabel[num]);
  XtManageChild(d->scopeOpt[num]);
  XtManageChild(d->whereLabel[num]);
  XtManageChild(d->whereOpt[num]);
  XtManageChild(d->scopeText[num]);
  XtManageChild(d->strip[num]);
  XtManageChild(d->content[num]);
}


static void
fe_mailfilt_setRulesGeo(Dimension width, fe_mailfilt_data *d)
{
  int i;
  for (i=0; i<d->stripCount; i++) {
  	XtVaSetValues(d->rulesLabel[i], XmNwidth, width, 0);
	XtVaSetValues(d->strip[i], XmNleftOffset, width, 0);
  }
}




static void
fe_mailfilt_addRow_cb(Widget w, XtPointer closure, XtPointer call_data)
{
  MWContext* context = (MWContext *) closure;
  Dimension width;
  fe_mailfilt_data *d = FILTER_DATA(context);
  if (d->stripCount < 5) {
	d->stripCount++;
	fe_mailfilt_makeRules(d->rulesRC, d->stripCount, d, context);
    /* set the rules geometry to be uniform */
	fe_mailfilt_setRulesGeo(d->despwidth, d);
  }
}


static void
fe_mailfilt_delRow_cb(Widget w, XtPointer closure, XtPointer call_data)
{
  MWContext* context = (MWContext *) closure;
  fe_mailfilt_data *d = FILTER_DATA(context);
  if (d->stripCount>1) {
	int num = d->stripCount-1;
	XtUnmanageChild(d->content[num]);
	XtDestroyWidget(d->content[num]);
	XtDestroyWidget(d->strip[num]);
	XtDestroyWidget(d->scopeText[num]);
	XtDestroyWidget(d->rulesLabel[num]);
	XtDestroyWidget(d->scopeOpt[num]);
	XtDestroyWidget(d->whereOpt[num]);
	XtDestroyWidget(d->whereLabel[num]);
	d->stripCount--;
  }
}



static void
fe_mailfilt_displayData(MWContext *context)
{
  fe_mailfilt_data *d = FILTER_DATA(context);
  MSG_Filter *f;
  char *text;
  int32 numTerms;
  int i;
  XP_Bool enabled;
  MSG_SearchAttribute attrib;
  MSG_SearchOperator op;
  MSG_SearchValue value;
  MSG_RuleActionType type;
  MSG_Rule *rule;
  void *value2;

  MSG_GetFilterAt(d->filterlist, (MSG_FilterIndex) d->curPos, &f);
  MSG_GetFilterName(f, &text); 
  XtVaSetValues(d->filterName, XmNvalue, text, NULL);
  MSG_GetFilterDesc(f, &text); 
  XtVaSetValues(d->despField, XmNvalue, text, NULL);

  MSG_GetFilterRule(f, &rule);
  MSG_RuleGetNumTerms(rule, &numTerms);
  XP_ASSERT(numTerms > 0 && numTerms < 6);
  
  for (i = 0; i < numTerms; i++) {
	if (d->stripCount <= i) {
		d->stripCount++;
		fe_mailfilt_makeRules(d->rulesRC, d->stripCount, d, context);
    	/* set the rules geometry to be uniform */
		fe_mailfilt_setRulesGeo(d->despwidth, d);
	}
	MSG_RuleGetTerm(rule, i, &attrib, &op, &value);
	fe_mailfilt_setRulesParams(context, i, attrib, op, value);
  }

  if (i < d->stripCount) {
	for(i; i < d->stripCount; i++) {
		XtUnmanageChild(d->content[i]);
		XtDestroyWidget(d->content[i]);
		XtDestroyWidget(d->strip[i]);
		XtDestroyWidget(d->scopeText[i]);
		XtDestroyWidget(d->rulesLabel[i]);
		XtDestroyWidget(d->scopeOpt[i]);
		XtDestroyWidget(d->whereOpt[i]);
		XtDestroyWidget(d->whereLabel[i]);
		d->stripCount--;
	}
  }

  MSG_RuleGetAction(rule, &type, &value2);
  fe_mailfilt_setActionParams(context, type, value2);
 
  MSG_IsFilterEnabled(f, &enabled);  
  if (enabled) {
	XtVaSetValues(d->filterOnBtn, XmNset, True, NULL);
	XtVaSetValues(d->filterOffBtn, XmNset, False, NULL);
  }
  else {
	XtVaSetValues(d->filterOffBtn, XmNset, True, NULL);
	XtVaSetValues(d->filterOnBtn, XmNset, False, NULL);
  }

	
}


static void
fe_mailfilt_turnOnOff(Widget w, XtPointer closure, XtPointer calldata)
{
  MWContext* context = (MWContext *) closure;
  fe_mailfilt_data *d = FILTER_DATA(context);
  fe_mailfilt_userData *userData;

  XtVaGetValues(w, XmNuserData, &userData, NULL);
  switch(userData->attrib) {
	case feFilterOn:
		d->curFilterOn = True;
		break;
	case feFilterOff:
		d->curFilterOn = False;
		break;
	default:
		XP_ASSERT(0);
		break;
  }	
}




/* this is a long function - lots of stuff for a fairly complicated widget */

static void
fe_mailfilt_edit(MWContext *context, XP_Bool isNew)
{
  Widget dialog = NULL;
  Widget dummy;
  Arg	av[30];
  Cardinal ac;
  Visual *v = 0;
  Colormap cmap = 0;
  Cardinal depth = 0;
  Dimension width, height;
  int i;
  fe_mailfilt_userData *userData;
  
  Widget mainw, content, cancelbtn, okbtn, btnform;
  Widget btn, popupW, thenClause, thenTo, thenLabel;
  Widget commandGroup, lessbtn, morebtn;
  Widget filterName, filterLabel, despLabel, despField, statusRadioBox;
  Widget statusOff, statusOn, statusLabel;
  
  fe_mailfilt_data *d = FILTER_DATA(context);

  if (d->editDialog == NULL) {
  	mainw = CONTEXT_WIDGET(context);	
  
  	XtVaGetValues (mainw, XtNvisual, &v, XtNcolormap, &cmap, 
				   XtNdepth, &depth, 0);
  
  	ac = 0;
  	XtSetArg(av[ac], XmNvisual, v); ac++;
  	XtSetArg(av[ac], XmNdepth, depth); ac++;
  	XtSetArg(av[ac], XmNcolormap, cmap); ac++;
  	XtSetArg(av[ac], XmNallowShellResize, True); ac++;
  	XtSetArg(av[ac], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL); ac++;
  	XtSetArg(av[ac], XmNautoUnmanage, False); ac++;
  	XtSetArg(av[ac], XmNdeleteResponse, XmUNMAP); ac++;
  	d->editDialog = dialog = 
		XmCreatePromptDialog(mainw,"editFilterDialog",av,ac);
  	XtUnmanageChild (XmSelectionBoxGetChild (dialog, XmDIALOG_TEXT));
  	XtUnmanageChild (XmSelectionBoxGetChild (dialog, XmDIALOG_SELECTION_LABEL));
  	XtUnmanageChild (XmSelectionBoxGetChild (dialog, XmDIALOG_HELP_BUTTON));
  	XtUnmanageChild (XmSelectionBoxGetChild (dialog, XmDIALOG_APPLY_BUTTON));
  	XtUnmanageChild (XmSelectionBoxGetChild (dialog, XmDIALOG_OK_BUTTON));
  	XtUnmanageChild (XmSelectionBoxGetChild (dialog, XmDIALOG_CANCEL_BUTTON));
  	XtUnmanageChild (XmSelectionBoxGetChild (dialog, XmDIALOG_SEPARATOR));
    XtAddCallback(d->editDialog, XmNdestroyCallback, 
				  fe_mailfilt_edit_destroy_cb, context);
  	
  	ac = 0;
  	XtSetArg (av [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
  	XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  	XtSetArg (av [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
  	XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  	content= XmCreateForm (dialog, "editContainer", av, ac);
  	
  	ac = 0;
  	filterLabel = XmCreateLabelGadget(content, "filterLabel", av, ac);
  	
  	ac = 0;
  	XtSetArg (av [ac], XmNcolumns, 15); ac++;
  	d->filterName = filterName = XmCreateTextField(content,"filterName",av,ac);
  	
  	ac = 0;
  	XtSetArg (av [ac], XmNorientation, XmVERTICAL); ac++;
  	d->rulesRC = XmCreateRowColumn(content, "rulesRC", av, ac);
  	
  	ac = 0;
  	d->commandGroup = commandGroup = XmCreateForm(content, 
												  "commandGrp", av, ac );
  	
  	ac = 0;
  	morebtn = XmCreatePushButton(commandGroup, "more", av, ac);
  	XtAddCallback(morebtn, XmNactivateCallback, fe_mailfilt_addRow_cb, context);
  	
  	lessbtn = XmCreatePushButton(commandGroup, "fewer", av, ac);
  	XtAddCallback(lessbtn, XmNactivateCallback, fe_mailfilt_delRow_cb, context);
  	
  	XtVaSetValues(morebtn,
                	XmNtopAttachment, XmATTACH_FORM,
                	XmNbottomAttachment, XmATTACH_FORM,
                	XmNleftAttachment, XmATTACH_FORM,
                	XmNrightAttachment, XmATTACH_NONE,
                	0);
  	
  	XtVaSetValues(lessbtn,
                	XmNtopAttachment, XmATTACH_FORM,
                	XmNbottomAttachment, XmATTACH_FORM,
                	XmNleftAttachment, XmATTACH_WIDGET,
                	XmNleftWidget, morebtn,
                	XmNrightAttachment, XmATTACH_NONE,
                	0);
  	
  	XtManageChild(morebtn);
  	XtManageChild(lessbtn);
  	
  	XtVaSetValues(filterLabel,
                	XmNalignment, XmALIGNMENT_END,
                	XmNtopAttachment, XmATTACH_FORM,
                	XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
                	XmNbottomWidget, filterName,
                	XmNleftAttachment, XmATTACH_FORM,
                	XmNrightAttachment, XmATTACH_NONE,
                	0);
  	
  	XtVaSetValues(filterName,
                	XmNtopAttachment, XmATTACH_FORM,
                	XmNbottomAttachment, XmATTACH_NONE,
                	XmNleftAttachment, XmATTACH_FORM,
                	XmNrightAttachment, XmATTACH_NONE,
                	0);
  	
  	XtVaSetValues(d->rulesRC,
                	XmNtopAttachment, XmATTACH_WIDGET,
					XmNtopWidget, filterName,
                	XmNleftAttachment, XmATTACH_FORM,
                	XmNrightAttachment, XmATTACH_FORM,
                	0);
  	
  	XtVaSetValues(commandGroup,
                	XmNnoResize, True,
                	XmNtopAttachment, XmATTACH_WIDGET,
					XmNtopWidget, d->rulesRC,
                	XmNtopOffset, 5,
                	XmNbottomAttachment, XmATTACH_NONE,
                	XmNleftAttachment, XmATTACH_FORM,
                	XmNrightAttachment, XmATTACH_FORM,
                	0);
  	
  	fe_mailfilt_makeRules(d->rulesRC, 1, d, context);
  	d->stripCount=1;
  	
  	XtManageChild(d->rulesRC);
  	XtManageChild(commandGroup);
  	XtManageChild(filterName);
  	XtManageChild(filterLabel);
  	
  	ac = 0;
  	thenLabel = XmCreateLabelGadget(content, "thenLabel", av, ac);


    /* create the clause option menu */  	
  	ac = 0;
  	popupW=0;
  	thenClause = d->thenClause = 
		fe_mailfilt_make_option_menu(context, content, "thenClause", &popupW);
  	dummy = fe_mailfilt_make_actPopup(popupW, &width, &height, 
									  0, fe_mailfilt_thenClause_cb, context);
	d->thenClausePopup = popupW;
    d->thenClauseSelected = dummy;


 	/* create the to option menu */  	
	/* which is a list of folders */
  	ac = 0;
  	popupW=0;
  	thenTo = d->thenTo = 
		fe_mailfilt_make_option_menu(context, content, "thenTo", &popupW);
  	dummy = fe_mailfilt_make_folderlist(popupW, actionOptMenu, &width, &height,
										0, fe_mailfilt_thenTo_cb, context);
	d->thenToPopup = popupW;
    d->thenToSelected = dummy;

	/* this is the priority action menu */
	/* list of priority destinations */
  	ac = 0;
  	popupW=0;
  	d->priAction = fe_mailfilt_make_option_menu(context, content, 
												"priAction", &popupW);
  	dummy = fe_mailfilt_makeopt_priority(popupW, priorityActionMenu, &width, 
									     &height, 0, 
										 fe_mailfilt_priLevel_cb, context);
	d->priActionPopup = popupW;
    d->priActionSelected = dummy;
  	
  	
  	XtVaSetValues(thenLabel,
                	XmNalignment, XmALIGNMENT_END,
					XmNtopAttachment, XmATTACH_WIDGET,
					XmNtopWidget, commandGroup,
                	XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
                	XmNbottomWidget, thenClause,
                	XmNleftAttachment, XmATTACH_FORM,
                	0);
  	XtVaSetValues(thenClause,
                	XmNtopAttachment, XmATTACH_WIDGET,
					XmNtopWidget, commandGroup,
                	XmNbottomAttachment, XmATTACH_NONE,
                	XmNleftAttachment, XmATTACH_FORM,
                	0);
  	XtVaSetValues(thenTo,
                	XmNtopAttachment, XmATTACH_WIDGET,
					XmNtopWidget, commandGroup,
                	XmNbottomAttachment, XmATTACH_NONE,
                	XmNleftAttachment, XmATTACH_WIDGET,
					XmNleftWidget, thenClause,
                	XmNrightAttachment, XmATTACH_NONE,
                	0);
  	
  	XtManageChild(thenLabel);
  	XtManageChild(thenClause);
  	XtManageChild(thenTo);
  	
  	ac = 0;
  	despLabel = XmCreateLabelGadget(content, "despLabel", av, ac);
  	
  	ac = 0;
  	d->despField = despField = XmCreateText(content, "despField", av, ac);
  	
  	
  	XtVaSetValues(despLabel,
                	XmNalignment, XmALIGNMENT_END,
					XmNtopAttachment, XmATTACH_WIDGET,
					XmNtopWidget, thenLabel,
                	XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET,
                	XmNbottomWidget, despField,
                	XmNleftAttachment, XmATTACH_FORM,
                	XmNrightAttachment, XmATTACH_NONE,
                	0);
  	XtVaSetValues(despField,
                	XmNtopAttachment, XmATTACH_WIDGET,
					XmNtopWidget, thenClause,
                	XmNbottomAttachment, XmATTACH_NONE,
                	XmNleftAttachment, XmATTACH_FORM,
                	XmNrightAttachment, XmATTACH_FORM,
                	0);
  	
  	XtManageChild(despField);
  	XtManageChild(despLabel);
  	
  	ac = 0;
  	XtSetArg (av [ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
  	XtSetArg (av [ac], XmNtopWidget, despField); ac++;
  	XtSetArg (av [ac], XmNleftAttachment, XmATTACH_NONE); ac++;
  	XtSetArg (av [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
  	XtSetArg (av [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
  	btnform = XmCreateForm(content, "btnForm", av, ac);
  	ac = 0;
  	okbtn = XmCreatePushButton(btnform, "okbtn", av, ac);
  	cancelbtn = XmCreatePushButton(btnform, "cancelbtn", av, ac);
  	statusLabel = XmCreateLabelGadget(btnform, "statusLabel", av, ac);
 	
  	XtAddCallback(cancelbtn, XmNactivateCallback, 
					fe_mailfilt_editclose_cb, context);
 	
  	ac = 0;
  	XtSetArg (av [ac], XmNorientation, XmHORIZONTAL); ac++;
  	statusRadioBox = XmCreateRadioBox(btnform, "radioBox", av, ac);
  	

	userData = XP_NEW_ZAP(fe_mailfilt_userData);
    userData->attrib = feFilterOn;
  	d->filterOnBtn = statusOn = 
		XtVaCreateManagedWidget("on", xmToggleButtonGadgetClass, 
								statusRadioBox, NULL);
  	XtVaSetValues(statusOn, XmNuserData, userData, 0);
	XtAddCallback(statusOn, XmNvalueChangedCallback, fe_mailfilt_turnOnOff,
				  context);


	userData = XP_NEW_ZAP(fe_mailfilt_userData);
    userData->attrib = feFilterOff;
  	d->filterOffBtn = statusOff = 
		XtVaCreateManagedWidget("off", xmToggleButtonGadgetClass, 
                               	statusRadioBox, NULL);
  	XtVaSetValues(statusOff, XmNuserData, userData, 0);
	XtAddCallback(statusOff, XmNvalueChangedCallback, fe_mailfilt_turnOnOff,
				  context);



  	
  	XtVaSetValues(okbtn,
					XmNtopAttachment, XmATTACH_FORM,
                	XmNbottomAttachment, XmATTACH_FORM,
                	XmNleftAttachment, XmATTACH_WIDGET,
                	XmNleftWidget, statusRadioBox,
                	0);
  	XtVaSetValues(cancelbtn,
                	XmNtopAttachment, XmATTACH_FORM,
                	XmNbottomAttachment, XmATTACH_FORM,
                	XmNleftAttachment, XmATTACH_WIDGET,
					XmNleftWidget, okbtn,
                	XmNrightAttachment, XmATTACH_FORM,
                	0);
  	XtVaSetValues(statusRadioBox,
                	XmNtopAttachment, XmATTACH_FORM,
                	XmNbottomAttachment, XmATTACH_FORM,
                	XmNrightOffset, 20,
                	XmNleftAttachment, XmATTACH_WIDGET,
					XmNleftWidget, statusLabel,
                	0);
  	XtVaSetValues(statusLabel,
                	XmNtopAttachment, XmATTACH_FORM,
                	XmNbottomAttachment, XmATTACH_FORM,
                	XmNleftAttachment, XmATTACH_NONE,
                	0);
  	XtManageChild(okbtn);
  	XtManageChild(cancelbtn);
  	XtManageChild(statusLabel);
  	XtManageChild(statusRadioBox);
  	XtManageChild(btnform);
  	
  	XtVaGetValues(despLabel, XmNwidth, &width, 0);
  	XtVaSetValues(thenLabel, XmNwidth, width, 0 );
  	XtVaSetValues(despLabel, XmNwidth, width, 0 );
  	XtVaSetValues(filterName, XmNleftOffset, width, 0);
  	XtVaSetValues(commandGroup, XmNleftOffset, width, 0);
  	XtVaSetValues(thenClause, XmNleftOffset, width, 0);
  	XtVaSetValues(despField, XmNleftOffset, width, 0);
  	
  	fe_mailfilt_setRulesGeo(width, d);
	d->despwidth = width;
	d->editOkbtn = okbtn;
  	XtManageChild(content);
  }
  if (d->editDialog) {
	if (isNew) {
		XtRemoveAllCallbacks(d->editOkbtn, XmNactivateCallback);
  		XtAddCallback(d->editOkbtn, XmNactivateCallback, 
				  	  fe_mailfilt_newok_cb, context);
	} else {
		fe_mailfilt_displayData(context);
		XtRemoveAllCallbacks(d->editOkbtn, XmNactivateCallback);
  		XtAddCallback(d->editOkbtn, XmNactivateCallback, 
				  	  fe_mailfilt_editok_cb, context);
	}
	XtManageChild(d->editDialog);
 	XtPopup (XtParent(d->editDialog), XtGrabNone);
  }
} 
		
static void
fe_mailfilt_newfilter_cb(Widget w, XtPointer closure, XtPointer calldata)
{
	fe_mailfilt_edit((MWContext *) closure, True);
}

static void
fe_mailfilt_editfilter_cb(Widget w, XtPointer closure, XtPointer calldata)
{
	fe_mailfilt_edit((MWContext *) closure, False);
}		
	
static void
fe_mailfilt_del_cb(Widget w, XtPointer closure, XtPointer calldata)
{
  MWContext* context = (MWContext *) closure;
  fe_mailfilt_data *d = FILTER_DATA(context);
  MSG_Filter *f = 0;
  int32 count=0;
  int i;
  int *rowPos;
  
  count = XmLGridGetSelectedRowCount(d->filterOutline);
  if (count) {
	MSG_Filter *f;
	rowPos = malloc (sizeof(int) * count);
	if (XmLGridGetSelectedRows(d->filterOutline, rowPos, count)!=-1) {
	  MSG_GetFilterAt(d->filterlist,*(rowPos),&f);
	  MSG_RemoveFilterAt(d->filterlist,*(rowPos));
	  MSG_DestroyFilter(f);
	  MSG_GetFilterCount(d->filterlist, &count);
	  fe_OutlineChange(d->filterOutline, 0, count, count);
      if (count > 0) {
		XtVaSetValues(d->upBtn, XmNsensitive, True, 0);
		XtVaSetValues(d->downBtn, XmNsensitive, True, 0);
		XtVaSetValues(d->deletebtn, XmNsensitive, True, 0);
		XtVaSetValues(d->editbtn, XmNsensitive, True, 0);
  	  } else {
		XtVaSetValues(d->upBtn, XmNsensitive, False, 0);
		XtVaSetValues(d->downBtn, XmNsensitive, False, 0);
		XtVaSetValues(d->deletebtn, XmNsensitive, False, 0);
		XtVaSetValues(d->editbtn, XmNsensitive, False, 0);
  	  }
	
  	  if (count > 0) {
  		count = XmLGridGetSelectedRowCount(d->filterOutline);
  		rowPos = malloc (sizeof(int) * count);
  		if (XmLGridGetSelectedRows(d->filterOutline, rowPos, count)!=-1) {
  			d->curPos = *rowPos;
		}
  	  } else {
		d->curPos = 0;
  	  }
	}
  }
  free((char*)rowPos);
}


static Boolean
fe_mailfilt_datafunc(Widget widget, void* closure, int row, 
					 fe_OutlineDesc* data, int tag)
{
  MWContext* context = (MWContext*) closure;
  fe_mailfilt_data *d = FILTER_DATA(context);
  MSG_Filter *f = 0;
  char *name = 0;
  char *status = 0;
  char *locale;
  char *order;
  XP_Bool enabled;

  XP_ASSERT(d != NULL);
  if (!d->filterlist) 
    return False;
  
  MSG_GetFilterAt(d->filterlist, (MSG_FilterIndex) row, &f);
  if (!f) 
	return False;
  data->flippy = FE_OUTLINE_Folded;
  data->icon = FE_OUTLINE_ClosedList;
  data->tag = XmFONTLIST_DEFAULT_TAG;
  
  data->type[0] = FE_OUTLINE_String;

  order = (char *) malloc(sizeof(char)*4);  
  sprintf(order, "%d", row+1);
  MSG_GetFilterName(f, &name);
  MSG_IsFilterEnabled(f, &enabled);  

  locale = fe_ConvertToLocaleEncoding
    (INTL_DefaultWinCharSetID(NULL), order);
  PR_snprintf(order, sizeof(order), "%s", locale);
  if ((char *) locale != order)
    {
      XP_FREE(locale);
    }
  data->str[0] = order;
  
  locale = fe_ConvertToLocaleEncoding
    (INTL_DefaultWinCharSetID(NULL), name);
  PR_snprintf(name, sizeof(name), "%s", locale);
  if ((char *) locale != name)
    {
      XP_FREE(locale);
    }
  data->str[1] = name;

  status = malloc(4*sizeof(char));
  if (enabled) {
	strcpy(status,"yes");	
  } else {
	strcpy(status,"no");	
  }
  locale = fe_ConvertToLocaleEncoding
    (INTL_DefaultWinCharSetID(NULL), status);
  PR_snprintf(status, sizeof(status), "%s", locale);
  if ((char *) locale != status)
    {
      XP_FREE(locale);
    }
  data->str[2] = status;

  return True;
}


static void
fe_mailfilt_clickfunc(Widget widget, void* closure, int row, int column,
					  char* header, int button, int clicks,
					  Boolean shift, Boolean ctrl, int tag)
{
  MWContext* context = (MWContext*) closure;
  fe_mailfilt_data *d = FILTER_DATA(context);
  int32 count=0;
  int *rowPos;
  
  MSG_GetFilterCount(d->filterlist, &count);
  if (count > 0) {
	XtVaSetValues(d->upBtn, XmNsensitive, True, 0);
	XtVaSetValues(d->downBtn, XmNsensitive, True, 0);
	XtVaSetValues(d->deletebtn, XmNsensitive, True, 0);
	XtVaSetValues(d->editbtn, XmNsensitive, True, 0);
  } else {
	XtVaSetValues(d->upBtn, XmNsensitive, False, 0);
	XtVaSetValues(d->downBtn, XmNsensitive, False, 0);
	XtVaSetValues(d->deletebtn, XmNsensitive, False, 0);
	XtVaSetValues(d->editbtn, XmNsensitive, False, 0);
  }

  count = XmLGridGetSelectedRowCount(d->filterOutline);
  if (count > 0) {
  	rowPos = malloc (sizeof(int) * count);
  	if (XmLGridGetSelectedRows(d->filterOutline, rowPos, count)!=-1) {
		MSG_Filter *f;
		char *text;
  		d->curPos = *rowPos;
  		MSG_GetFilterAt(d->filterlist, (MSG_FilterIndex) d->curPos, &f);
		MSG_GetFilterDesc(f, &text);
		XtVaSetValues(d->mainDespField, XmNvalue, text, NULL);
	}
  } else {
	d->curPos = 0;
  }

  if (clicks == 2) {
	fe_mailfilt_edit(context, False);
  }
}


static void
fe_mailfilt_iconfunc(Widget widget, void* closure, int row, int tag)
{
  MWContext* context = (MWContext*) closure;
}


static void
fe_mailfilt_close_cb(Widget widget, XtPointer closure, XtPointer call_data)
{
  MWContext* context = (MWContext*) closure;
  fe_mailfilt_data *d = FILTER_DATA(context);
  XP_ASSERT(d != NULL);
  MSG_CloseFilterList(d->filterlist);
  d->filterlist = NULL;
  XtUnmanageChild(d->filterDialog);
}

static void
fe_mailfilt_destroy_cb(Widget widget, XtPointer closure, XtPointer call_data)
{
  MWContext* context = (MWContext*) closure;
  fe_mailfilt_data *d = FILTER_DATA(context);
  fe_mailfilt_close_cb(widget, closure, call_data);
  free(d);
  FILTER_DATA(context) = 0;
}


static void
fe_mailfilt_up_cb(Widget widget, XtPointer closure, XtPointer call_data)
{
  MWContext* context = (MWContext*) closure;
  fe_mailfilt_data *d = FILTER_DATA(context);
  MSG_Filter *f;
  int32 count;

  if (d->curPos > 0) {
  	MSG_MoveFilterAt(d->filterlist, (MSG_FilterIndex) d->curPos, filterUp);
	d->curPos--;
    XmLGridSelectRow(d->filterOutline, d->curPos, True);
	MSG_GetFilterCount(d->filterlist, &count);
  	fe_OutlineChange(d->filterOutline, 0, count, count);
  }	
}


static void
fe_mailfilt_down_cb(Widget widget, XtPointer closure, XtPointer call_data)
{
  MWContext* context = (MWContext*) closure;
  fe_mailfilt_data *d = FILTER_DATA(context);
  MSG_Filter *f;
  int32 filterCount;

  MSG_GetFilterCount(d->filterlist, &filterCount);

  if (d->curPos < filterCount-1) {
  	MSG_MoveFilterAt(d->filterlist, (MSG_FilterIndex) d->curPos, filterDown);
	d->curPos++;
    XmLGridSelectRow(d->filterOutline, d->curPos, True);
	MSG_GetFilterCount(d->filterlist, &filterCount);
  	fe_OutlineChange(d->filterOutline, 0, filterCount, filterCount);
  }
}


static void
fe_mailfilt_ok_cb(Widget widget, XtPointer closure, XtPointer call_data)
{
  MWContext* context = (MWContext*) closure;
  
  fe_mailfilt_close_cb(widget, closure, call_data);
}


void fe_mailfilter_cb(Widget w, XtPointer closure, XtPointer call_data)
{
  fe_mailfilt_data *d;
  MWContext *context = (MWContext*) closure;
  static char* columnStupidity = NULL;
  static int columnwidths[] = {10, 10, 40, 5};
  int ac;
  Arg av[20];
  Widget mainw = 0;
  Widget dummy = 0; /* da place holda */
  Widget orderLabel = 0;
  Widget dialog = 0;
  Widget orderBox = 0;
  Widget btnbox = 0;
  Widget text = 0;
  Widget logbtn = 0;
  Widget newbtn = 0;
  Widget editbtn = 0;
  Widget deletebtn = 0;
  Widget javabtn = 0;
  Widget okbtn = 0;
  Widget cancelbtn = 0;
  Widget sep = 0;
  Visual *v = 0;
  Colormap cmap = 0;
  Cardinal depth = 0;
  int count;
  
  d = FILTER_DATA(context);
  if (!d) {
	
    d = FILTER_DATA(context) = XP_NEW_ZAP(fe_mailfilt_data);

    d->filterlist = NULL;
	d->editDialog = NULL;
	d->curPos = 0;
    XtVaGetValues(CONTEXT_WIDGET(context), XtNvisual, &v,
				  XtNcolormap, &cmap, XtNdepth, &depth, 0);
    
    ac = 0;
    XtSetArg (av[ac], XmNvisual, v); ac++;
    XtSetArg (av[ac], XmNdepth, depth); ac++;
    XtSetArg (av[ac], XmNcolormap, cmap); ac++;
    XtSetArg (av[ac], XmNallowShellResize, True); ac++;
    XtSetArg (av[ac], XmNdeleteResponse, XmUNMAP); ac++;
    XtSetArg (av[ac], XmNautoUnmanage, False); ac++;
    XtSetArg (av[ac], XmNdialogStyle, 
			  XmDIALOG_PRIMARY_APPLICATION_MODAL); ac++;
	d->filterDialog = XmCreatePromptDialog(CONTEXT_WIDGET(context), 
										   "filterDialog", av, ac);
	
	dialog = d->filterDialog;   /* too much typing */
	
	fe_UnmanageChild_safe(XmSelectionBoxGetChild (dialog, XmDIALOG_SEPARATOR));
	fe_UnmanageChild_safe(XmSelectionBoxGetChild (dialog, XmDIALOG_TEXT));
	fe_UnmanageChild_safe(XmSelectionBoxGetChild (dialog, 
												  XmDIALOG_HELP_BUTTON));
	fe_UnmanageChild_safe(XmSelectionBoxGetChild (dialog, 
												  XmDIALOG_OK_BUTTON));
	fe_UnmanageChild_safe(XmSelectionBoxGetChild (dialog, 
												  XmDIALOG_CANCEL_BUTTON));
	fe_UnmanageChild_safe(XmSelectionBoxGetChild (dialog, 
												  XmDIALOG_SELECTION_LABEL));
			  
    XtAddCallback(d->filterDialog, XmNdestroyCallback, 
				  fe_mailfilt_destroy_cb, context);

    ac = 0;
    XtSetArg (av[ac], XmNwidth, 500); ac++;
    XtSetArg (av[ac], XmNheight, 300); ac++;
    mainw = XmCreateForm(dialog, "form", av, ac);
	
    ac = 0;
    XtSetArg (av[ac], XmNorientation, XmVERTICAL); ac++;
    orderBox = XmCreateRowColumn(mainw, "orderBox", av, ac);
	
    orderLabel = XtVaCreateManagedWidget ("orderLabel",
										  xmLabelGadgetClass, orderBox,
										  XmNalignment, XmALIGNMENT_BEGINNING, 
										  NULL);
    d->upBtn = XtVaCreateManagedWidget ("upArrow",
							 			xmArrowButtonGadgetClass, orderBox,
							 			XmNarrowDirection, XmARROW_UP,
							 			NULL);
	XtAddCallback(d->upBtn,XmNactivateCallback,fe_mailfilt_up_cb,context);

    d->downBtn = XtVaCreateManagedWidget ("downArrow",
							 			  xmArrowButtonGadgetClass, orderBox,
							 			  XmNarrowDirection, XmARROW_DOWN,
							 			  NULL);
	XtAddCallback(d->downBtn,XmNactivateCallback,fe_mailfilt_down_cb,context);
	
    ac = 0;
    d->filterOutline = fe_GridCreate(context, mainw, "list", av, ac,
									 0, 3, columnwidths, 
									 fe_mailfilt_datafunc,
									 fe_mailfilt_clickfunc, 
									 fe_mailfilt_iconfunc, 
									 context,
									 /* benjie - need to change this */
									 FE_DND_BOOKMARK, &columnStupidity,
									 False, False);
    fe_OutlineSetHeaders(d->filterOutline, mailFilterHeaders);  
    XtVaSetValues(d->filterOutline, 
				  XmNshowHideButton, True,
				  XmNselectionPolicy, XmSELECT_SINGLE_ROW,
				  0);
	
    ac = 0;
    dummy = XtVaCreateManagedWidget("btnrowcol", 
									xmRowColumnWidgetClass, mainw,
									XmNorientation, XmVERTICAL,
									NULL);
    newbtn = XtVaCreateWidget("newFilter", 
							  xmPushButtonGadgetClass, dummy,
							  NULL);
    editbtn = XtVaCreateWidget("editFilter",
							   xmPushButtonGadgetClass, dummy,
							   NULL);
	d->editbtn = editbtn;
    deletebtn = XtVaCreateWidget("delFilter",
								 xmPushButtonGadgetClass, dummy,
								 NULL);
	d->deletebtn = deletebtn;
    sep = XtVaCreateWidget("separator",
						   xmSeparatorGadgetClass, dummy,
						   NULL);
    javabtn = XtVaCreateWidget("javaScript",
							   xmPushButtonGadgetClass, dummy,
							   NULL);
    text = XtVaCreateWidget("text",
							xmTextWidgetClass, mainw,
							XmNheight, 100,
							XmNeditable, False,
							NULL);
    logbtn = XtVaCreateWidget("logbtn",
							  xmToggleButtonWidgetClass, mainw,
							  NULL);
    okbtn = XtVaCreateWidget("okbtn",
							 xmPushButtonGadgetClass, mainw,
							 NULL);
    cancelbtn = XtVaCreateWidget("cancelbtn",
								 xmPushButtonGadgetClass, mainw,
								 NULL);
	
    XtManageChild(text);
    XtManageChild(logbtn);
    XtManageChild(cancelbtn);
    XtManageChild(okbtn);
	
    XtAddCallback(cancelbtn, XmNactivateCallback, 
				  fe_mailfilt_close_cb, context);
    XtAddCallback(okbtn, XmNactivateCallback, 
				  fe_mailfilt_ok_cb, context);
    XtAddCallback(newbtn, XmNactivateCallback,
				  fe_mailfilt_newfilter_cb, context);
    XtAddCallback(editbtn, XmNactivateCallback,
				  fe_mailfilt_editfilter_cb, context);
    XtAddCallback(deletebtn, XmNactivateCallback,
				  fe_mailfilt_del_cb, context);
	
	
    XtManageChild(dummy);
    XtManageChild(newbtn);
    XtManageChild(editbtn);
    XtManageChild(deletebtn);
    XtManageChild(sep);
    XtManageChild(javabtn);
    XtManageChild(orderBox);
    XtManageChild (d->filterOutline);
	
    XtVaSetValues(logbtn,
				  XmNtopAttachment, XmATTACH_NONE,
				  XmNleftAttachment, XmATTACH_FORM,
				  XmNbottomAttachment, XmATTACH_FORM,
				  0);
    XtVaSetValues(okbtn,
				  XmNtopAttachment, XmATTACH_NONE,
				  XmNleftAttachment, XmATTACH_NONE,
				  XmNrightAttachment, XmATTACH_WIDGET,
				  XmNrightWidget, cancelbtn,
				  XmNbottomAttachment, XmATTACH_FORM,
				  XmNwidth, cancelbtn->core.width,
				  0);
    XtVaSetValues(cancelbtn,
				  XmNtopAttachment, XmATTACH_NONE,
				  XmNrightAttachment, XmATTACH_FORM,
				  XmNbottomAttachment, XmATTACH_FORM,
				  0);
    XtVaSetValues(text,
				  XmNtopAttachment, XmATTACH_NONE,
				  XmNleftAttachment, XmATTACH_FORM,
				  XmNrightAttachment, XmATTACH_FORM,
				  XmNbottomAttachment, XmATTACH_WIDGET,
				  XmNbottomWidget, okbtn,
				  0);
    XtVaSetValues(dummy,
				  XmNtopAttachment, XmATTACH_FORM,
				  XmNleftAttachment, XmATTACH_NONE,
				  XmNrightAttachment, XmATTACH_FORM,
				  XmNbottomAttachment, XmATTACH_NONE,
				  0);
    XtVaSetValues(d->filterOutline,
				  XmNtopAttachment, XmATTACH_FORM,
				  XmNleftAttachment, XmATTACH_FORM,
				  XmNleftOffset, orderLabel->core.width + 14,
				  XmNrightAttachment, XmATTACH_WIDGET,
				  /* XmNrightOffset, deletebtn->core.width + 14, */
				  XmNrightWidget, dummy,
				  XmNbottomAttachment, XmATTACH_WIDGET,
				  XmNbottomWidget, text,
				  0);
    XtVaSetValues(orderBox,
				  XmNtopAttachment, XmATTACH_NONE, 
				  XmNleftAttachment, XmATTACH_FORM,
				  XmNrightAttachment, XmATTACH_NONE,
				  XmNbottomAttachment, XmATTACH_WIDGET,
				  XmNbottomWidget, text,
				  0);
	d->mainDespField = text;	
	XtVaSetValues(d->upBtn, XmNsensitive, False, 0);
	XtVaSetValues(d->downBtn, XmNsensitive, False, 0);
	XtVaSetValues(d->deletebtn, XmNsensitive, False, 0);
	XtVaSetValues(d->editbtn, XmNsensitive, False, 0);
    XtManageChild (mainw);
    
    /* don't put translations for this because we don't want many of
     * the capabilities */
	
    /* fe_HackTranslations (context, dialog);  */
    
    /* need to have this here to add the action overriden by HackTranslations
       back to the hide/unhide btn for Grid widget */
	
    XmLGridInstallHideButtonTranslations(d->filterOutline); 
  }
  
  if (d->filterDialog) {
	
    MSG_Filter *f;
	int32 count=0;
	
    /* the first argument is an enum, don't know why it isn't capped or
       something to make it obvious...... backend stuff - bc */
    MSG_OpenFilterList(filterInbox, &(d->filterlist));
	MSG_GetFilterCount(d->filterlist, &count);
  	fe_OutlineChange(d->filterOutline, 0, count, count);
	
    XtManageChild(d->filterDialog);
    XtPopup (XtParent(d->filterDialog), XtGrabNone);
  }
}

void 
fe_mailfilt_detail_pop(MWContext *context)
{
}