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 + -
显示快捷键?