xdisplay.c

来自「是有关基因比对的经典算法的实现。这对于初学计算生物学的人是非常重要的算法。」· C语言 代码 · 共 2,192 行 · 第 1/4 页

C
2,192
字号
			if (data.selected[i]==TRUE)
				draw_nameline(prf_panel[0].names,i,i,NORMAL);
		SetPanelExtra(prf_panel[0].names,&data);
	}
	GetPanelExtra(panel,&data);
	Select(panel);
	ObjectRect(panel,&r);
	if (!shftKey)
	{
/* revert existing selected area to normal */
		for(i=0;i<data.nseqs;i++)
			if (data.selected[i]==TRUE)
				draw_nameline(panel,i,i,NORMAL);
	}

	selected_seqs.first = (pt.y - r.top-data.lineheight/2)/data.lineheight + data.firstvline-data.nhead;
	if (selected_seqs.first <0) selected_seqs.first=0;
	if (selected_seqs.first >=data.nseqs) selected_seqs.first=data.nseqs-1;
	if (selected_seqs.first==-1 && ncutseqs > 0)
	{
		selected_seqs.last=selected_seqs.first=0;
		draw_seq_pointer(panel,0,HIGHLIGHT);
	}
	else
	{
		selected_seqs.last=selected_seqs.first;
		draw_nameline(panel,selected_seqs.first,selected_seqs.last,HIGHLIGHT);
	}
	black_on_white();

}

static void NameDrag(PaneL panel, PoinT pt)
{
	panel_data data;
	RecT r;
	int s;

	GetPanelExtra(panel,&data);
	Select(panel);
	ObjectRect(panel,&r);
	s = (pt.y - r.top-data.lineheight/2)/data.lineheight + data.firstvline-data.nhead;
	if (s<0) s=0;
	if (s>=data.nseqs) s=data.nseqs-1;
	if (s==selected_seqs.first)
	{
		if (s!=selected_seqs.last)
		{
			draw_nameline(panel,selected_seqs.first,selected_seqs.last,NORMAL);
			draw_nameline(panel,selected_seqs.first,s,HIGHLIGHT);
		}
	}
	else if (s>selected_seqs.first)
	{
		if (s>selected_seqs.last)
			draw_nameline(panel,selected_seqs.last+1,s,HIGHLIGHT);
		else if (s<selected_seqs.last)
			draw_nameline(panel,s+1,selected_seqs.last,NORMAL);
	}
	else
	{
		if (s<selected_seqs.last)
			draw_nameline(panel,s,selected_seqs.last-1,HIGHLIGHT);
		else if (s>selected_seqs.last)
			draw_nameline(panel,selected_seqs.last,s-1,NORMAL);
	}
	selected_seqs.last=s;

	black_on_white();
}

static void NameRelease(PaneL panel, PoinT pt)
{
	int t;
	panel_data data;

	if (selected_seqs.first > selected_seqs.last)
	{
		t=selected_seqs.first;
		selected_seqs.first=selected_seqs.last;
		selected_seqs.last=t;
	}	
	active_panel.names = panel;
	GetPanelExtra(panel,&data);
	active_panel.seqs = data.index;

}

void draw_seq_pointer(PaneL panel,int seq,int format)
{
	RecT r,block;
	panel_data data;

	Select(panel);
	GetPanelExtra(panel,&data);

	ObjectRect(panel,&r);
	InsetRect(&r,1,1);
	block.top=r.top+((seq+data.nhead)*data.lineheight)+data.descent+1;
	block.bottom=block.top+data.lineheight;
	block.left=r.left;
	block.right=r.right;
	if (format==HIGHLIGHT)
		Black();
	else
		White();
	PaintRect(&block);

}

static void SeqClick(PaneL panel, PoinT pt)
{
	int s;
	int f,l;
	panel_data data;
	RecT r;

	GetPanelExtra(panel,&data);
	if(data.prf_no==1)
	{
/* revert selected area in profile 2 to normal */
		GetPanelExtra(prf_panel[1].seqs,&data);
		f=data.firstsel;
		l=data.lastsel;
		data.firstsel=-1;
		data.lastsel=-1;
		SetPanelExtra(prf_panel[1].seqs,&data);
		if (f != -1) highlight_seqrange(prf_panel[1].seqs,f,l,NORMAL);
	}
	else if(data.prf_no==2)
	{
/* revert selected area in profile 1 to normal */
		GetPanelExtra(prf_panel[0].seqs,&data);
		f=data.firstsel;
		l=data.lastsel;
		data.firstsel=-1;
		data.lastsel=-1;
		SetPanelExtra(prf_panel[0].seqs,&data);
		if (f != -1) highlight_seqrange(prf_panel[0].seqs,f,l,NORMAL);
	}
	GetPanelExtra(panel,&data);
	Select(panel);
	ObjectRect(panel,&r);

	s = (pt.x - r.left-data.charwidth)/data.charwidth + data.firstvcol;
	if (s <0) s=0;
	if (s<data.firstvcol) s=data.firstvcol;
	if (s >=data.ncols) s=data.ncols-1;
	if (s >=data.firstvcol+data.vcols) s=data.firstvcol+data.vcols-1;

	if (shftKey && data.firstsel != -1)
	{
		if (s>data.lastsel)
		{
			highlight_seqrange(panel,data.firstsel,s,HIGHLIGHT);
			data.lastsel=s;
		}
		else if (s<data.firstsel)
		{
			highlight_seqrange(panel,s,data.lastsel,HIGHLIGHT);
			data.firstsel=s;
		}
		else
		{
			highlight_seqrange(panel,s+1,data.lastsel,NORMAL);
			highlight_seqrange(panel,data.firstsel,s,HIGHLIGHT);
			data.lastsel=s;
		}
		selected_res.first=data.firstsel;
		selected_res.last=data.lastsel;
	}
	else
	{
/* revert existing selected area to normal */
		f=data.firstsel;
		l=data.lastsel;
		data.firstsel=-1;
		data.lastsel=-1;
		SetPanelExtra(panel,&data);
		if (f != -1) highlight_seqrange(panel,f,l,NORMAL);
		selected_res.first=selected_res.last=s;
		highlight_seqrange(panel,selected_res.first,selected_res.last,HIGHLIGHT);
		data.firstsel=selected_res.first;
		data.lastsel=selected_res.last;
	}

	SetPanelExtra(panel,&data);
	black_on_white();

}

static void SeqDrag(PaneL panel, PoinT pt)
{
	panel_data data;
	RecT r;
	int s;

	GetPanelExtra(panel,&data);
	Select(panel);
	ObjectRect(panel,&r);
	s = (pt.x - r.left-data.charwidth)/data.charwidth + data.firstvcol;
	if (s<0) s=0;
	if (s<data.firstvcol) s=data.firstvcol;
	if (s>=data.ncols) s=data.ncols-1;
	if (s >=data.firstvcol+data.vcols) s=data.firstvcol+data.vcols-1;
	if (s==selected_res.first)
	{
		if (s!=selected_res.last)
		{
			highlight_seqrange(panel,selected_res.first,selected_res.last,NORMAL);
			highlight_seqrange(panel,selected_res.first,s,HIGHLIGHT);
		}
	}
	else if (s>selected_res.first)
	{
		if (s>selected_res.last)
			highlight_seqrange(panel,selected_res.last+1,s,HIGHLIGHT);
		else if (s<selected_res.last)
			highlight_seqrange(panel,s+1,selected_res.last,NORMAL);
	}
	else
	{
		if (s<selected_res.last)
			highlight_seqrange(panel,s,selected_res.last-1,HIGHLIGHT);
		else if (s>selected_res.last)
			highlight_seqrange(panel,selected_res.last,s-1,NORMAL);
	}
	selected_res.last=s;

	black_on_white();
}

static void SeqRelease(PaneL panel, PoinT pt)
{
	int t;
	panel_data data;

        if (selected_res.first > selected_res.last)
        {
                t=selected_res.first;
                selected_res.first=selected_res.last;
                selected_res.last=t;
        }

	active_panel.seqs = panel;
	GetPanelExtra(panel,&data);
	active_panel.names = data.index;
	data.firstsel=selected_res.first;
	data.lastsel=selected_res.last;
	SetPanelExtra(panel,&data);

}

void draw_header(PaneL p)
{ 
	RecT  block,r;
	PoinT pt;
	int i, j, x, y;
	panel_data data;
	char *line;

	UseWindow(mainw);
	Select(p);
	SelectFont(datafont);
	GetPanelExtra(p, &data);
	if(data.nseqs == 0) return;
	if(data.header == NULL) return;
	if(data.vlines<data.nhead) return;
	if(data.vcols<=0) return;

	line=(char *)ckalloc((data.vcols+1) * sizeof(char));
	ObjectRect (p, &r);
	InsetRect(&r,1,1);
	block.top=r.top+data.descent/2;
	block.bottom=block.top+(data.nhead*data.lineheight);
	block.left=r.left;
	block.right=r.right;
	text_colors();
	EraseRect(&block);
	if (data.type==NAMES)
        	x=r.left+DNUMBER*data.charwidth;
	else
        	x=r.left+data.charwidth;
        y=r.top+data.lineheight-data.descent/2;
	for(i=0;i<data.nhead;i++)
	{
		for(j=data.firstvcol;j<data.firstvcol+data.vcols && j<data.ncols;j++)
			if(j>=0)
				line[j-data.firstvcol]=data.header[i][j];
			else
				line[j-data.firstvcol]=' ';
		line[j-data.firstvcol]='\0';
		LoadPt(&pt, x, y);
		SetPen(pt);
		PaintString(line);
		y+=data.lineheight;
	}
	black_on_white();
	ckfree(line);
} 

void draw_footer(PaneL p)
{ 
	RecT  block,r;
	PoinT pt;
	int i, j,x, y;
	panel_data data;
	char *line;

	UseWindow(mainw);
	Select(p);
	SelectFont(datafont);
	GetPanelExtra(p, &data);
	if(data.nseqs == 0) return;
	if(data.footer == NULL) return;
	if(data.vlines<data.nfoot) return;
	if(data.vcols<=0) return;

	line=(char *)ckalloc((data.vcols+1) * sizeof(char));
	ObjectRect (p, &r);
	InsetRect(&r,1,1);
	block.top=r.top+((data.vlines-data.nfoot)*data.lineheight)+data.descent+data.ascent/2;
	block.bottom=block.top+data.nfoot*data.lineheight;
	block.left=r.left;
	block.right=r.right;
	text_colors();
	EraseRect(&block);
	if(data.type==NAMES)
        	x=block.left+DNUMBER*data.charwidth;
	else
        	x=block.left+data.charwidth;
        y=block.top+data.lineheight-1;
	for(i=0;i<data.nfoot;i++)
	{
		for(j=data.firstvcol;j<data.firstvcol+data.vcols && j<data.ncols;j++)
			if(j>=0)
				line[j-data.firstvcol]=data.footer[i][j];
			else
				line[j-data.firstvcol]=' ';
		line[j-data.firstvcol]='\0';
		LoadPt(&pt, x, y);
		SetPen(pt);
		PaintString(line);
		y+=data.lineheight;
	}
	black_on_white();
	ckfree(line);
} 


void draw_nameline(PaneL p,int fseq,int lseq,int format)
{ 
	RecT  block,r;
	PoinT pt;
	int n,i, j, t, f,l,x, y,ix;
	panel_data data;
	char *line;

	Select(p);
	SelectFont(datafont);
	GetPanelExtra(p, &data);
	if(data.nseqs == 0) return;
	
	n=1;
	i=data.nseqs;
	for(;;)
	{
		i/=10;
		if(i==0) break;
		n++;
	}

	line=(char *)ckalloc((data.vcols+1) * sizeof(char));
	if (fseq > lseq)
	{
		t=fseq;
		fseq=lseq;
		lseq=t;
	}	
	if (format==HIGHLIGHT)
		for(i=fseq;i<=lseq;i++) data.selected[i]=TRUE;
	else
		for(i=fseq;i<=lseq;i++) data.selected[i]=FALSE;
	SetPanelExtra(p,&data);
	if (fseq<data.firstvline)
		fseq=data.firstvline;
	if (fseq>=data.firstvline+data.vseqs)
		fseq=data.firstvline+data.vseqs;
	if (lseq<data.firstvline)
		lseq=data.firstvline;
	if (lseq>=data.firstvline+data.vseqs)
		lseq=data.firstvline+data.vseqs-1;
	f=fseq-data.firstvline;
	l=lseq-data.firstvline;
	ObjectRect (p, &r);
	InsetRect(&r,1,1);
	block.top=r.top+((f+data.nhead)*data.lineheight)+data.descent+1;
	block.bottom=block.top+((l-f+1)*data.lineheight);
	block.left=r.left;
	block.right=r.right;
	if (format==HIGHLIGHT)
		white_on_black();
	else
		data_colors();
	EraseRect(&block);
        y=block.top+data.lineheight-data.descent-1;
	for(i=fseq;i<=lseq;i++)
	{
        	x=r.left+data.charwidth;
		sprintf(line,"%*d",n,i+1);
		LoadPt(&pt, x, y);
		SetPen(pt);
		Gray();
		PaintString(line);
		y+=data.lineheight;
	}
        y=block.top+data.lineheight-data.descent-1;
	for(i=fseq;i<=lseq;i++)
	{
		ix=output_index[i+1]-1;
        	x=r.left+DNUMBER*data.charwidth;
		for(j=0;j<data.vcols && j<data.ncols-data.firstvcol;j++)
			line[j]=data.lines[ix][j+data.firstvcol];
		line[j]='\0';
		LoadPt(&pt, x, y);
		SetPen(pt);
		if(format==HIGHLIGHT) White();
		else Black();
		PaintString(line);
		y+=data.lineheight;
	}
	black_on_white();
	ckfree(line);
} 

void draw_seqline(panel_data data,int seq,PoinT pt,int fcol,int lcol,int format)
{ 
	RecT r;
	int i, j, ix;
	char *line[MAXCOLORS+1];

	if(data.nseqs == 0) return;

/* draw colored character on white background */
	for(i=0;i<ncolors;i++)
	{
		line[i]=(char *)ckalloc((data.vcols+1) * sizeof(char));
		for(j=0;j<data.vcols;j++)
		line[i][j]=' ';
		line[i][j]='\0';
	}
	
	ix=output_index[seq+1]-1;
	
	r.top=pt.y-data.lineheight+data.descent+1;
	r.bottom=r.top+data.lineheight;
	for(j=fcol;j<=lcol && j<data.ncols;j++)
	{
		if(j>=0)
		{
		if(segment_exceptions && data.segment_exception[ix][j] > 0)
		{
			r.left=pt.x;
			r.right=r.left+data.charwidth;
			DkGray();
			PaintRect(&r);
			White();
		}
		else if(residue_exceptions && data.residue_exception[ix][j] == TRUE)
		{
			r.left=pt.x;
			r.right=r.left+data.charwidth;
		/*	LtGray(); */
			SelectColor(150,150,150);
			PaintRect(&r);
			White();
		}
		else
		{
                        if(inverted)
                        {
				if(format==HIGHLIGHT || (j>=data.firstsel && j<=data.lastsel))
					Black();
				else
				{
                                	r.left=pt.x;
#ifdef UNIX
                	                r.right=r.left+data.charwidth-1;
#else
                	                r.right=r.left+data.charwidth;
#endif
                                 	SetColor(color_lut[(int)data.colormask[ix][j]].val);
                       	         	PaintRect(&r);
                       	         	Black();
				}
                        }
                        else
                                SetColor(color_lut[(int)data.colormask[ix][j]].val);

		}
		SetPen(pt);
		PaintChar(data.lines[ix][j]);
		}
		pt.x+=data.charwidth;
	}
	for(i=0;i<ncolors;i++)
		ckfree(line[i]);
	Black();
} 

void draw_seqcol(PaneL p,int col,int format)
{ 
	RecT  block,r, r2;
	PoinT pt;
	int totseqs,i, c,x,y,ix;
	panel_data data;

	Select(p);
	SelectFont(datafont);
	GetPanelExtra(p, &data);
	if(data.nseqs == 0) return;
	if(data.ncols == 0) return;

	SetPanelExtra(p, &data);
	
	if (col<data.firstvcol)
		col=data.firstvcol;
	if (col>=data.firstvcol+data.vcols)
		col=data.firstvcol+data.vcols-1;
	c=col-data.firstvcol;
	totseqs=data.vseqs;
	if (totseqs>data.nseqs) totseqs=data.nseqs;
	ObjectRect (p, &r);
	InsetRect(&r,1,1);
	block.top=r.top+(data.nhead*data.lineheight)+data.descent+1;
	block.bottom=block.top+(totseqs)*data.lineheight;
	block.left=r.left+(c+1)*data.charwidth;
	block.right=block.left+data.charwidth;
        if (format==HIGHLIGHT)
                text_colors();
        else
                data_colors();
	EraseRect(&block);

	x=r.left+(c+1)*data.charwidth;
       	y=block.top+data.lineheight-data.descent-1;
	r2.left=x;
	r2.right=r2.left+data.charwidth;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?