/*

Copyright (c) 1990,1991,1992 Steven Smith at the Harvard Genome Laboratory.
All rights reserved.
*/

#include <xview/font.h>
#include <xview/scrollbar.h>
#include <xview/xview.h>

#define TRUTH 1
#define JUSTICE 2
#define BEAUTY 3

/*
*	Edit modes
*/

#define INSERT 0
#define CHECK 1

/*
*	Cursor directions
*/
#define RIGHT 1
#define LEFT 0
#define UP 0
#define DOWN 1

#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif

#define GBUFSIZ 512
#define MAX_NA_DISPLAY_WIDTH 1024
#define MAX_NA_DISPLAY_HEIGHT 1024
#define MAX_STARTUP_CANVAS_HEIGHT 512
#define grey_height 8
#define grey_width 8

/*
*	Definable dialog types
*/
#define	TEXTFIELD	0x1
#define SLIDER		0x2
#define CHOOSER		0x3
#define CHOICE_MENU	0x4
#define CHOICE_LIST	0x5

/*
*	File Formats
*/
#define GDE		0x100
#define GENBANK		0x101
#define NA_FLAT		0x102
#define COLORMASK	0x103
#define STATUS_FILE	0x104

/*
*	Protection bits
*/

#define	PROT_BASE_CHANGES 	0x1	/* Allow base changes */
#define PROT_GREY_SPACE		0x2	/* Allow greyspace modification */
#define PROT_WHITE_SPACE	0x4	/* Allow whitespace modification */
#define PROT_TRANSLATION 	0x8	/* Allow translation  */
#define PROT_REORIENTATION	0x10	/* Allow reorientation */


/*
*	File loading methods (must be 'OR/AND' able)
*/

#define NONE		0x0
#define	DESTROY		0x1
#define LOAD		0x2
#define SAVE		0x4
#define SELECTED	0x8
#define ALL			0x10
#define SELECT_REGION	0x20
#define SELECT_ONE	0x30

/*
*	Sequence DISPLAY Types
*/
#define NASEQ_ALIGN	0x201
#define NASEQ		0x202

/*
*	Sequence Data Types
*/
#define DNA			0x300
#define RNA			0x301
#define TEXT		0x302
#define MASK		0x303
#define PROTEIN		0x304
/*
*	extended sequence attributes (true/false)
*/

#define IS_5_TO_3	0x01	/* 5prime to 3 prime */
#define IS_3_TO_5	0x02	/* 3 prime to 5 prime */
#define IS_CIRCULAR	0x04	/* circular dna		*/
#define IS_PRIMARY	0x10	/* on the primary strand */
#define	IS_SECONDARY	0x20	/* on the secondary strand */
#define IS_MODIFIED	0x40	/* modification flag */
#define IS_ORIG_PRIMARY 0x80	/* Original sequence was primary */
#define IS_ORIG_SECONDARY 0x100	/* Original sequence was secondary */
#define IS_ORIG_5_TO_3	0x200	/* Original sequence was 5_to_3 */
#define IS_ORIG_3_TO_5	0x400	/* Original sequence was 3_to_5 */

#ifdef HGL 
#define DEFAULT_X_ATTR  0
#else 
#define DEFAULT_X_ATTR  IS_5_TO_3+IS_PRIMARY;
#endif

/*
*	Other display attributed
*/
#define INVERTED 1
#define VSCROLL_LOCK 2
#define KEYCLICKS 4
#define GDE_MESSAGE_PANEL 8

/*
*	Coloring Methods
*/
#define COLOR_MONO 	0x40	/* no color, simple black and white */
#define COLOR_LOOKUP	0x41	/* Use a simple value->color lookup */
#define COLOR_ALN_MASK 	0x42	/* The alignment has a column by column color
				mask associated with it */
#define COLOR_SEQ_MASK	0x43	/* Each sequence has a color mask*/
#define COLOR_STRAND	0x44	/* Color based on original strandedness*/


/*
*	Data types
*/

typedef struct
{
	int *valu;
} NumList;


typedef struct
{
	struct
	{
		int yy;
		int mm;
		int dd;
		int hr;
		int mn;
		int sc;
	} origin,modify;
} TimeStamp;

typedef unsigned char NA_Base;

typedef struct
{
	char *name;
	int type;
	NumList *list;
	int listlen;
	int maxlen;
} GMask;


typedef struct NA_SeqStruct
{
	char id[80];			/* sequence id (ACCESSION)*/
	char seq_name[80];		/* Sequence name (ORGANISM) */
	char short_name[32];		/* Name (LOCUS) */
	char barcode[80];
	char contig[80];
	char membrane[80];
	char description[80];		/* Description (DEFINITION)*/
	char authority[80];		/* Author (or creator) */
	char *comments;			/* Stuff we can't parse */
	int comments_len, comments_maxlen;

	NA_Base *sequence;		/* List of bases */
	TimeStamp t_stamp;		/* Time stamp of origin/modification */
	Mask *mask;			/* List of masks(analysis/display) */
	int offset;			/* offset into alignment (left white)
						space	*/
	int seqlen;			/* Number of elements in sequence[] */
	int seqmaxlen;			/* Size sequence[] (for mem alloc) */
	unsigned int protect;		/* Protection mask */
	int attr;			/* Extended attributes */
	int groupid;			/* group id */
	int *col_lut;			/* character to color LUT */
	struct NA_SeqStruct *groupb;	/* Group link backward */
	struct NA_SeqStruct *groupf;	/* Group link forward */
	int *cmask;			/* color mask */
	int selected;			/* Selection flag */
	int subselected;		/* Sub selection flag */
	int format;			/* default file format */
	int elementtype;		/* what type of data are being aligned*/
	char *baggage;			/* unformatted comments*/
	int baggage_len,
	    baggage_maxlen;
	int *tmatrix;			/* translation matrix (code->char) */
	int *rmatrix;			/* reverse translation matrix
						(char->code)*/
} NA_Sequence;

typedef struct
{
	char *id;			/* Alignment ID */
	char *description;		/* Description of the alignment*/
	char *authority;		/* Who generated the alignment*/
	int *cmask;			/* color mask */
	int cmask_offset;			/* color mask offset */
	int cmask_len;			/* color mask length */
	int ref;			/* reference sequence */
	int numelements;		/* number of data elements */
	int maxnumelements;		/* maximum number of data elements */
	int nummasks;			/* number of masks */
	int maxlen;			/* Maximum length of alignment */
	int rel_offset;			/* add this to every sequence offset */
					/* to orient it back to 0 */
	Mask *mask;			/* masks */
	NA_Sequence *element;		/* alignment elements */
	int numgroups;			/* number of groups */
	NA_Sequence **group;		/* link to array of pointers into
					   each group */
	char *na_ddata;			/* display data */ 
	int format;			/* default file format */
	char *selection_mask;		/* Sub sequence selection mask */
	int selection_mask_len;		/* Sub selection mask length */
	int min_subselect;		/* Leftmost coord of selection mask */
} NA_Alignment;


typedef struct
{
	int font_dx;			/* width of a character in this font*/
	int font_dy;			/* height of a character in this font*/
	int wid,ht;			/* width and height of edit win (in
					   characters */
	int top_seq;			/* Top sequence index shown */
	int lft_pos;			/* Leftmost column (in alignment
					   position coords) */
	int color_type;			/* Method of manipulating colors
					   (See above) */
	int depth;			/* number of color bits available */
	int num_colors;			/* Actual number of colors used */
	int *palette;			/* palette for display */
	int *col_lut;			/* character to color LUT */
	int black,white;		/* color indicies for blk,wht */
	int cursor_x,cursor_y;		/* Current cursor positions */
	int position;			/* Current position minus whitespace */
	int *jumptbl;			/* the jump table for fast access
					   into the sequence data */
	int jtsize;			/* its length */
	NA_Alignment *aln;		/* Pointer to the actual data set
					   (the alignment */
	Xv_font font;			/* The default font */
	Canvas seq_can,nam_can;		/* ties to the canvas for screen
					   updates. */
	Window seq_x,nam_x;		/* X versions of the above */
	int use_repeat;			/* Number keys set repeat count*/

} NA_DisplayData;


#define getcmask(a,b) (b < ((a)->offset))?0:((a)->cmask[(b-(a)->offset)])

#include "functions.h"
