/*                        Copyright (c) 1988 Bellcore
**                            All Rights Reserved
**       Permission is granted to copy or use this program, EXCEPT that it
**       may not be sold for profit, the copyright notice must be reproduced
**       on copies, and credit should be given to Bellcore where it is due.
**       BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
*/


#ifndef lint
static char rcsid[]= "$Header$";
#endif

#ifdef MGR

#include "misc.h"
#include "line.h"
#include "token.h"
#include "/usr/public/pkg/mgr/include/term.h"
#include "/usr/public/pkg/mgr/include/restart.h"

#define OTHER		0
#define ON_DEBUG	1
#define OFF_DEBUG	2
#define DO_QUIT		3
#define DO_PAGE		4
#define NEW_PREC	5


#define NROW	60
#define NCOL	80

int isdiff[MAXTOKENS];	/* flag showing if a token pair was shown different*/

int comwin,wina, winb;	/* location to store window numbers */
int fontx,fonty;	/* size of the font in pixels */

int debug =0;


int firsttoken = 0;	/* index of first token pair being displayed */
int tokencnt;		/* count of the number of token pairs being displayed */

int
V_visual(flags)
int flags;
{

	int moretodo = 1;	/* flag to clear when we're finished */

	messup();

	m_selectwin(comwin);
	m_setmode(W_ACTIVATE);

	showpages(comroutine,flags);

	do
	{
		switch(getinput())
		{
			case ON_DEBUG:
				debug = 0;
				break;
			case OFF_DEBUG:
				debug = 1;
				break;
			case DO_QUIT:
				moretodo = 0;
				break;
			case DO_PAGE:
				if((firsttoken+tokencnt>= K_gettmax(0))||
				   (firsttoken+tokencnt>= K_gettmax(1)))
				{
					m_selectwin(comwin);
					m_printstr("\007this is the last page\n");
					break;
				}
				firsttoken += tokencnt;
				showpages(comroutine,flags);
				break;
			case NEW_PREC:
				updatepages(comroutine,flags);
				break;
			case OTHER:
				break;
			default :
				Z_fatal("bad value in main switch");
				
		}
	} while (moretodo);

	V_cleanup();
	return(0);
}

getinput()
{
	char ibuf[Z_LINELEN];	/* input buffer */
	char *ptr;

	m_selectwin(comwin);
	m_setmode(W_ACTIVATE);
	switch (m_getchar())
	{
		case 't':
			m_gets(ibuf);
			/*
			**	skip the 'tol'
			*/
			ptr = ibuf;
			S_nextword(&ptr);
			T_setdef(ptr);
			return(NEW_PREC);
		case 'q':
			return(DO_QUIT);
		case 'd':
			return(OFF_DEBUG);
		case 'D':
			return(ON_DEBUG);
		case 'm':
			return(DO_PAGE);
		default:
			return(OTHER);
	}
	
}

showpages(comroutine,flags)
int (*comroutine)();
int flags;
{
	int i;
		m_selectwin(wina);
		m_clear();
		m_selectwin(winb);
		m_clear();
		showlines();

		for(i=firsttoken;i<tokencnt+firsttoken; i++)
		{
			isdiff[i] = 0;
		}
		updatepages(comroutine,flags);
}

updatepages(comroutine,flags)
int (*comroutine)();
int flags;
{
	int i;

	for(i=firsttoken;i<tokencnt+firsttoken; i++)
	{
		if (isdiff[i])
		{

			if (0 == X_com(i,i,flags))
			{
				m_selectwin(wina);
				un_highlight(0,K_gettoken(0,i),K_getline(K_gettoken(0,firsttoken)));
				m_selectwin(winb);
				un_highlight(1,K_gettoken(1,i),K_getline(K_gettoken(1,firsttoken)));
				isdiff[i] = 0;
			}
		}
		else
		{
			if (0 != X_com(i,i,flags))
			{
				m_selectwin(wina);
				highlight(0,K_gettoken(0,i),K_getline(K_gettoken(0,firsttoken)));
				m_selectwin(winb);
				highlight(1,K_gettoken(1,i),K_getline(K_gettoken(1,firsttoken)));
				isdiff[i] = 1;
			}
		}
	}
}

un_highlight(file,ptr,firstline)
int file;
K_token ptr;
int firstline;
{
	highlight(file,ptr,firstline);
}

/*
**	argument expressed in terms of token lines
*/
highlight(file,ptr,firstline)
int file;
K_token ptr;
int firstline;
{
	int startx = K_getpos(ptr)*fontx;
	int starty = (L_tl2cl(file,K_getline(ptr))-L_tl2cl(file,firstline))*fonty;

	int sizex = fontx*strlen(K_gettext(ptr));
	int sizey = fonty;
	m_bitwrite(startx,starty,sizex,sizey);
}

showlines()
{
	int Alinecnt = 0;
	int Blinecnt = 0;

	int Atfirstline = K_getline(K_gettoken(0,firsttoken));
	int Btfirstline = K_getline(K_gettoken(1,firsttoken));
	int Afirstline =  L_tl2cl(0,K_getline(K_gettoken(0,firsttoken)));
	int Bfirstline =  L_tl2cl(1,K_getline(K_gettoken(1,firsttoken)));
	int Anexttoken = L_getindex(0,Atfirstline);
	int Bnexttoken = L_getindex(1,Btfirstline);
	int i;
	/*
	**	first print the lines on the screen
	*/
	for(i=0;i < NROW;i++)
	{
		if(Afirstline+i < L_getclmax(0))
		{
			m_selectwin(wina);
			showline(0,Afirstline+i,i);
			Alinecnt++;
		}

		if(Bfirstline+i < L_getclmax(1))
		{
			m_selectwin(winb);
			showline(1,Bfirstline+i,i);
			Blinecnt++;
		}
	}
	/*
	**	now figure out how many tokens we actually printed
	*/
	for(i=Atfirstline;Anexttoken<K_gettmax(0) && L_tl2cl(0,i) < Afirstline+Alinecnt;i++)
	{
			Anexttoken += L_getcount(0,i);
	}

	for(i=Btfirstline;Bnexttoken<K_gettmax(1) && L_tl2cl(1,i) < Bfirstline+Blinecnt;i++)
	{
			Bnexttoken += L_getcount(1,i);
	}
	tokencnt = MIN(Anexttoken,Bnexttoken) - firsttoken;

	/*
	**	draw a line through any tokens that come before the first
	**		token that is being compared
	*/
	if (L_getindex(0,Atfirstline) != firsttoken)
	{
		m_selectwin(wina);
		for(i=L_getindex(0,Atfirstline);i<firsttoken;i++)
		{
			drawline(K_gettoken(0,i),0);
		}
	}

	if (L_getindex(1,Btfirstline) != firsttoken)
	{
		m_selectwin(winb);

		for(i=L_getindex(1,Btfirstline);i<firsttoken;i++)
		{
			drawline(K_gettoken(1,i),0);
		}
/*
m_line(Bt[Bindex[Bfirstline]]->pos*fontx,fonty/2,(Bt[firsttoken]->pos*fontx)-2,fonty/2);
*/
	}

	if (Anexttoken > Bnexttoken)
	{
		m_selectwin(wina);
		for(i=Bnexttoken;i<Anexttoken;i++)
		{
			drawline(K_gettoken(0,i),L_tl2cl(0,K_getline(K_gettoken(0,i)))-Afirstline);
		}
	}

	if (Anexttoken < Bnexttoken)
	{
		m_selectwin(winb);
		for(i=Anexttoken;i<Bnexttoken;i++)
		{
			drawline(K_gettoken(1,i),L_tl2cl(1,K_getline(K_gettoken(1,i)))-Bfirstline);
		}
	}

}

/*
**	line is given in conten line
*/
drawline(ptr,line)
K_token ptr;
int line;
{
		m_line(K_getpos(ptr)*fontx,
			(line*fonty)+fonty/2,
			(K_getpos(ptr)+strlen(K_gettext(ptr)))*fontx,
			(line*fonty)+fonty/2);
}

/*
**	takes arguments in terms of content lines
*/
showline(file,index,row)
int file;
int index;
int row;
{
	static char tmp[Z_LINELEN];
	m_move(0,row);
	stripnl(tmp,L_getcline(file,index));
	m_printstr(tmp);
}

stripnl(to,from)
char *to,*from;
{
	while ((*from != '\n') && (*from != '\0'))
	{
		*to++ = *from++;
	}
	*to = '\0';
}

static int didscr = 0;

messup()
{
	int col, row;
	int dum1,dum2,dum3,border;

	m_setup(W_FLUSH|W_DEBUG);
	m_push(P_EVENT|P_FLAGS|P_POSITION);
	get_param(&dum1,&dum2,&dum3,&border);
	didscr = 1;
	comwin =  m_makewindow(192,50,732,116);
	wina = m_makewindow(0,218,570,670);
	m_selectwin(wina);
	m_font(2);
	get_font(&fontx,&fonty);
	m_shapewindow(0,218,NCOL*fontx+(2*border),NROW*fonty+(2*border));

	get_colrow(&col,&row);
	if ((col != NCOL) || (row != NROW))
	{
		Z_fatal("bad window size");
	}
	m_func(B_INVERT);
	m_setmode(W_ABS);

	winb = m_makewindow(580,218,570,670);
	m_selectwin(winb);
	m_font(2);
	get_font(&fontx,&fonty);
	m_shapewindow(580,218,NCOL*fontx+(2*border),NROW*fonty+(2*border));

	get_colrow(&col,&row);
	if ((col != NCOL) || (row != NROW))
	{
		Z_fatal("bad window size");
	}
	m_func(B_INVERT);
	m_setmode(W_ABS);

	m_selectwin(comwin);
	m_clear();
	m_setmode(W_ABS);
	m_setmode(W_ACTIVATE);
}

V_cleanup()
{
	if (didscr)
	{
		m_destroywin(wina);
		m_destroywin(winb);
		m_destroywin(comwin);
		m_popall();
		m_setecho();
		(void) fclose(m_termin);
		(void) fclose(m_termout);
	}
}

#else

#include "misc.h"
/*
**	dummy code for systems that don't have
**	the mgr window manager installed
*/
int
V_visual(d)
int d;
{
	Z_fatal("visual mode is not available on this machine\n");
	return(-d);	/* boiler plate */
}

void
V_cleanup()
{
}

#endif
