#ifndef _rulebrowserP_h_
#define _rulebrowserP_h_

						    
struct _rule_link_struct
 { AlRule rule;
   struct _rule_link_struct *previous;
   struct _rule_link_struct *next;
   int islocked;
   int isdeleted;
   int isediting;
   reid editor_id;
   long int y_position;
   int rule_number;
   Widget rule_box;
   Widget hand_button;         /* hand button to grab and move rule with */
   Widget num_label;
   Widget editor_gid;
   Widget state_label;
   Widget text_widget;
   char *text;
   int text_buffer_size;
 };

struct _AlRSBrowser_struct
 { 
   /* ------------------------------------------------ */
   /* top-most instance variables for rule set browser */
   /* ------------------------------------------------ */

   XtIntervalId errbox_intervalid; /* holds interval id of popped up errbox */
   char      *ruleset_name;
   AlRuleSet the_ruleset;
   int       number_of_open_ruleeditors;
   int       has_been_altered;    /* flags if the ruleset has been altered  */
   AlRuleLink *top_rule;          /* holds all the rules in the rule set    */
   AlRuleLink *last_rule;         /* last rulelink in linked list           */
   AlRuleLink *killring;          /* holds all the rules in the kill ring   */
   VOIDP_FUNCPTR exit_function;   /* to call when exiting the RuleSetEditor */
                                  /* function should expect an AlRSEditor,  */
                                  /* and an integer error code as arguments */
   /* Widgets */
   /* ------- */
   Widget    shell_widget;        /* Top Level shell of rule set browser    */
   Widget    rulebox_form;        /* Form in which all rules are displayed  */
   Widget    errbox;              /* popup widget for error messages        */
   Widget    errlabel;            /* label holding error message for errbox */

   /* Pixmaps */
   /* ------- */
   Pixmap empty_icon;             /* blank icon of needed color             */
   Pixmap new_icon;               /* icon to indicate rule is new           */
   Pixmap editor_icon;            /* icon to indicate rule is being edited  */
   Pixmap hand_icon;              /* user can grab this icon and move rule  */
   Pixmap menu_icon;              /* icon user clicks on to get pop-up menu */
   Pixmap deleted_icon;           /* icon to indicate rule has been deleted */

   /* general X info */
   /* -------------- */
   XtAppContext AppCont;      /* the Application's Context for this browser */
   Display *the_display;      /* display for this rule set browser's window */
   int the_screen;            /* screen for this rule set browser's window  */
   XmFontList fonts;          /* font list used for this application        */
 };


struct _AlRsb_callback
 { struct _rule_link_struct *rule_link;
   struct _AlRSBrowser_struct *the_rsbrowser;
   Widget menu;
   Widget button;
 };

/*********************************************************************/
#define ALRBWIDTH           21000     /* Rule Browser's total width */
#define ALRB_TITLE_HEIGHT    1000
#define ALRB_BUTTON_HEIGHT   1080
#define ALRAREA_HEIGHT       6000

#define ALRB_HEIGHT          1600 /* was 3000, before that it was 1200 */
#define ALRB_WIDTH          19000  /* was (ALRBWIDTH - 600) */
#define ALRB_SPACING         150
#define ALRB_TEXTLENGTH      255

static Arg      main_form_res[] =
 {  { XmNheight, (XtArgVal) (ALRB_TITLE_HEIGHT
			     + ALRB_BUTTON_HEIGHT + ALRAREA_HEIGHT)},
    { XmNwidth, (XtArgVal) ALRBWIDTH},      /* was 660 pixels */
    { XmNborderWidth, (XtArgVal) 100},
    { XmNhighlightOnEnter, (XtArgVal)TRUE},
    { XmNhighlightThickness, (XtArgVal)100},
    { XmNresizePolicy, (XtArgVal)XmRESIZE_ANY},
    { XmNallowOverlap, (XtArgVal)FALSE},
    { XmNshadowThickness, (XtArgVal)5},
    { XmNrubberPositioning, (XtArgVal)TRUE},
    { XmNhorizontalSpacing, (XtArgVal)0},
    { XmNverticalSpacing, (XtArgVal)0},
    { XmNunitType, (XtArgVal) Xm100TH_MILLIMETERS},   /* so popups work */
    { (char *)NULL, (XtArgVal)NULL}
 };

static Arg      title_bar_res[] =
 {  { XmNheight, (XtArgVal) ALRB_TITLE_HEIGHT},
    { XmNborderWidth, (XtArgVal) 0},
    { XmNhorizontalSpacing, (XtArgVal) 0},
    { XmNverticalSpacing, (XtArgVal) 0},
    { XmNresizePolicy, (XtArgVal) XmRESIZE_ANY},
    { XmNresizable, (XtArgVal) TRUE},
    { XmNtopAttachment, (XtArgVal) XmATTACH_FORM},
    { XmNleftAttachment, (XtArgVal) XmATTACH_FORM},
    { XmNrightAttachment, (XtArgVal) XmATTACH_FORM},
    { XmNunitType, (XtArgVal) Xm100TH_MILLIMETERS},
    { (char *) NULL, (XtArgVal) NULL}
 };

static Arg      gen_button_res[] =
 {  { XmNtopAttachment, (XtArgVal) XmATTACH_FORM},
    { XmNbottomAttachment, (XtArgVal) XmATTACH_FORM},
    { XmNresizable, (XtArgVal) FALSE},
    { XmNresizePolicy, (XtArgVal) XmRESIZE_ANY},
    { XmNborderWidth, (XtArgVal) 60},
    { XmNwidth, (XtArgVal) 3290},                   /* 3000}, */
    { XmNheight, (XtArgVal) ALRB_BUTTON_HEIGHT},
    { XmNshadowThickness, (XtArgVal) 150},
    { XmNtopOffset, (XtArgVal) 75},
    { XmNbottomOffset, (XtArgVal) 75},
    { XmNleftOffset, (XtArgVal) 150},
    { XmNrightOffset, (XtArgVal)150},
    { XmNunitType, (XtArgVal) Xm100TH_MILLIMETERS},   /* so popups work */
    { (char *)NULL, (XtArgVal) NULL}
 };

/* Scrolling region of the main window */
static Arg      rule_area_res[]=
 {  { XmNborderWidth, (XtArgVal) 50},
    { XmNresizePolicy, (XtArgVal) XmRESIZE_NONE},
    { XmNrightAttachment, (XtArgVal) XmATTACH_FORM},
    { XmNleftAttachment, (XtArgVal) XmATTACH_FORM},
    { XmNrightOffset, (XtArgVal) 150},
    { XmNleftOffset, (XtArgVal) 150},
    { XmNheight, (XtArgVal) ALRAREA_HEIGHT},
    { XmNunitType, (XtArgVal) Xm100TH_MILLIMETERS},
    { XmNresizable, (XtArgVal) FALSE},
    { XmNscrollingPolicy, (XtArgVal) XmAUTOMATIC},
    { XmNvisualPolicy, (XtArgVal) XmCONSTANT},
    { XmNscrollBarDisplayPolicy, (XtArgVal) XmAS_NEEDED},
    { XmNscrollBarPlacement, (XtArgVal) XmTOP_LEFT},
    { XmNupdateSliderSize, (XtArgVal) TRUE},
    { XmNspacing, (XtArgVal) 0},
    { (char *) NULL, (XtArgVal) NULL}
 };

/* Work Area of the above rule_area_res, in which all rules are placed */
static Arg      rule_working_area_res[]=
 {  { XmNtopAttachment, (XtArgVal) XmATTACH_FORM},
    { XmNbottomAttachment, (XtArgVal) XmATTACH_FORM},
    { XmNleftAttachment, (XtArgVal) XmATTACH_FORM},
    { XmNrightAttachment, (XtArgVal) XmATTACH_FORM},
    { XmNrightOffset, (XtArgVal) 50},
/*    { XmNwidth, (XtArgVal) ALRB_WIDTH + 500}, */    /* ??? */
/*    { XmNrubberPositioning, (XtArgVal) TRUE}, */
    { XmNhorizontalSpacing, (XtArgVal) 5},
    { XmNverticalSpacing, (XtArgVal) 5},
    { XmNpacking, (XtArgVal) XmPACK_NONE},
    { XmNresizable, (XtArgVal) True},
    { XmNresizePolicy, (XtArgVal)XmRESIZE_ANY},
    { XmNunitType, (XtArgVal) Xm100TH_MILLIMETERS},
    { XmNborderWidth, (XtArgVal) 50},

    { XmNorientation, (XtArgVal) XmVERTICAL},
    { XmNentryAlignment, (XtArgVal) XmALIGNMENT_BEGINNING},
    { XmNadjustLast, (XtArgVal) False},
    { XmNrowColumnType, (XtArgVal) XmWORK_AREA},
    { XmNheight, (XtArgVal) ALRB_HEIGHT},
    { XmNwidth, (XtArgVal) ALRB_WIDTH + 500}, 
    { XmNresizeHeight, (XtArgVal) True},
    { XmNresizeWidth, (XtArgVal) True},

    { (char *) NULL, (XtArgVal) NULL}
 };

/* Rule Box's (background form for a single rule) resources */
static Arg      rulebox_area_res[]=
 {  { XmNborderWidth, (XtArgVal) 80},
    { XmNorientation, (XtArgVal) XmHORIZONTAL},
    { XmNentryAlignment, (XtArgVal) XmALIGNMENT_BEGINNING},
    { XmNadjustLast, (XtArgVal) True},
    { XmNrowColumnType, (XtArgVal) XmWORK_AREA},
    { XmNheight, (XtArgVal) ALRB_HEIGHT},
    { XmNwidth, (XtArgVal) ALRB_WIDTH}, 
    { XmNresizeHeight, (XtArgVal) False},
    { XmNresizeWidth, (XtArgVal) False},
    { XmNtopAttachment, (XtArgVal) XmATTACH_POSITION},
    { XmNbottomAttachment, (XtArgVal) XmATTACH_NONE},
    { XmNleftAttachment, (XtArgVal) XmATTACH_FORM},
    { XmNrightAttachment, (XtArgVal) XmATTACH_FORM},
    { XmNleftOffset, (XtArgVal) 40},
    { XmNrightOffset, (XtArgVal) 40},
    { XmNunitType, (XtArgVal) Xm100TH_MILLIMETERS},
    { XmNresizable, (XtArgVal) False},
    { XmNresizePolicy, (XtArgVal) XmRESIZE_NONE},
    { (char *) NULL, (XtArgVal) NULL}
 };

/*
static Arg      rulebox_area_res[]=
 {  { XmNborderWidth, (XtArgVal) 80},
    { XmNheight, (XtArgVal) ALRB_HEIGHT},
    { XmNwidth, (XtArgVal) ALRB_WIDTH}, 
    { XmNtopAttachment, (XtArgVal) XmATTACH_POSITION},
    { XmNbottomAttachment, (XtArgVal) XmATTACH_NONE},
    { XmNleftAttachment, (XtArgVal) XmATTACH_FORM},
    { XmNrightAttachment, (XtArgVal) XmATTACH_FORM},
    { XmNleftOffset, (XtArgVal) 40},
    { XmNrightOffset, (XtArgVal) 40},
    { XmNunitType, (XtArgVal) Xm100TH_MILLIMETERS},
    { XmNresizable, (XtArgVal) FALSE},
    { XmNresizePolicy, (XtArgVal) XmRESIZE_NONE},
    { (char *) NULL, (XtArgVal) NULL}
 };
*/

static Arg      menu_button_res[] =
 {  { XmNresizable, (XtArgVal) True},
    { XmNresizePolicy, (XtArgVal) XmRESIZE_ANY},
/*
    { XmNborderWidth, (XtArgVal) 60},
    { XmNwidth, (XtArgVal) 1500},
    { XmNheight, (XtArgVal) ALRB_BUTTON_HEIGHT},
    { XmNshadowThickness, (XtArgVal) 150},
*/
    { XmNunitType, (XtArgVal) Xm100TH_MILLIMETERS},   /* so popups work */
    { (char *)NULL, (XtArgVal) NULL}
 };

/*********************************************************************/

#ifdef __STDC__

/*-------------------------------------------------------------------*/
/*--- Functions to Create, Alter, and Destroy an AlRuleLink Object --*/
/*-------------------------------------------------------------------*/
extern NORET AlRsb_delete_rule(AlRSBrowser *, AlRuleLink *);
extern AlRuleLink *AlRsb_add_rule(AlRSBrowser *, AlRule, int);
extern NORET AlRsb_lock_rule(AlRuleLink *);
extern NORET AlRsb_unlock_rule(AlRuleLink *);
extern AlRuleLink *AlRsb_get_next_rule(AlRuleLink *);
extern AlRuleLink *AlRsb_get_prev_rule(AlRuleLink *);
extern NORET AlRsb_set_next_rule(AlRuleLink *, AlRuleLink *);
extern NORET AlRsb_set_prev_rule(AlRuleLink *, AlRuleLink *);
extern AlRuleLink *AlRsb_get_rule(AlRSBrowser *, int);

/*-------------------------------------------------------------------*/
/*---- Functions to Alter the internals of an AlRSBroswer Object ----*/
/*-------------------------------------------------------------------*/
extern NORET AlRsb_errmsg2(char *, char *);
extern AlRuleLink *AlRsb_get_top_rule(AlRSBrowser *);
extern NORET AlRsb_set_top_rule(AlRSBrowser *, AlRuleLink *);
extern NORET AlRsb_addto_killring(AlRSBrowser *, AlRuleLink *);
extern NORET AlRsb_renumber_rules(AlRSBrowser *, AlRuleLink *);

/* Callbacks */
/* --------- */
extern void AlRsb_moveby_hand(Widget, caddr_t, caddr_t);

#else


/*-------------------------------------------------------------------*/
/*--- Functions to Create, Alter, and Destroy an AlRuleLink Object --*/
/*-------------------------------------------------------------------*/
extern NORET AlRsb_delete_rule();
extern AlRuleLink *AlRsb_add_rule();
extern NORET AlRsb_lock_rule();
extern NORET AlRsb_unlock_rule();
extern AlRuleLink *AlRsb_get_next_rule();
extern AlRuleLink *AlRsb_get_prev_rule();
extern NORET AlRsb_set_next_rule();
extern NORET AlRsb_set_prev_rule();
extern AlRuleLink *AlRsb_get_rule();

/*-------------------------------------------------------------------*/
/*---- Functions to Alter the internals of an AlRSBroswer Object ----*/
/*-------------------------------------------------------------------*/
extern NORET AlRsb_errmsg2();
extern AlRuleLink *AlRsb_get_top_rule();
extern NORET AlRsb_set_top_rule();
extern NORET AlRsb_addto_killring();
extern NORET AlRsb_renumber_rules();

/* Callbacks */
/* --------- */
extern void AlRsb_moveby_hand();


#endif          /* end of  #ifdef __STDC__  */

/*********************************************************************/

#endif  /* end of #ifndef _rulebrowserP_h_  :: DO NOT WRITE BELOW THIS LINE. */
