📄 xdisplay.c
字号:
SetPanelExtra(seq_panel.names,&data);
}
}
void correct_seq_bars(Boolean reset)
{
int maxcols,m1,m2;
panel_data data,data1;
if(aln_mode==PROFILEM)
{
GetPanelExtra(prf_panel[0].seqs,&data);
GetPanelExtra(prf_panel[1].seqs,&data1);
if(fixed_prf_scroll==TRUE)
{
Hide(data.hscrollbar);
m1=MAX(data.firstvcol,data1.firstvcol);
m2=MAX(data.ncols-data.firstvcol,data1.ncols-data1.firstvcol);
maxcols=m1+m2;
if(reset==TRUE)
{
data.firstvcol=0;
data1.firstvcol=0;
}
data.lockoffset= -MAX(data1.firstvcol-data.firstvcol,0);
data1.lockoffset= -MAX(data.firstvcol-data1.firstvcol,0);
correct_scrollbar(data1.hscrollbar,data1.vcols,maxcols,m1,TRUE);
}
else
{
Show(data.hscrollbar);
if(reset==TRUE)
{
data.firstvcol=0;
data1.firstvcol=0;
}
data.lockoffset=0;
data1.lockoffset=0;
correct_scrollbar(data.hscrollbar,data.vcols,data.ncols,data.firstvcol,reset);
correct_scrollbar(data1.hscrollbar,data1.vcols,data1.ncols,data.firstvcol,reset);
}
if(reset==TRUE)
{
data.firstvline=0;
data1.firstvline=0;
}
correct_scrollbar(data.vscrollbar,data.vseqs,data.nseqs,data.firstvline,reset);
correct_scrollbar(data1.vscrollbar,data1.vseqs,data1.nseqs,data.firstvline,reset);
SetPanelExtra(prf_panel[0].seqs,&data);
SetPanelExtra(prf_panel[1].seqs,&data1);
}
else
{
GetPanelExtra(seq_panel.seqs,&data);
if(reset==TRUE)
{
data.firstvcol=0;
data.firstvline=0;
}
correct_scrollbar(data.vscrollbar,data.vseqs,data.nseqs,data.firstvline,reset);
correct_scrollbar(data.hscrollbar,data.vcols,data.ncols,data.firstvcol,reset);
SetPanelExtra(seq_panel.seqs,&data);
}
}
static void correct_scrollbar(BaR b,int visible,int total,int value,Boolean reset)
{
int max;
if (b!=NULL)
{
if (visible > 0 && total > visible)
max=total-visible;
else
max=0;
if(reset==TRUE) CorrectBarValue(b,0);
CorrectBarPage(b,visible,visible);
CorrectBarValue(b,value);
CorrectBarMax(b,max);
}
}
void color_seqs(void)
{
panel_data data;
GetPanelExtra(seq_panel.seqs,&data);
if (data.nseqs == 0) return;
info("Coloring sequences...");
make_colormask(data);
DrawPanel(seq_panel.seqs);
info("Done.");
}
void color_prf1(void)
{
panel_data data;
GetPanelExtra(prf_panel[0].seqs,&data);
if (data.nseqs == 0) return;
make_colormask(data);
info("Coloring profile 1...");
DrawPanel(prf_panel[0].seqs);
info("Done.");
}
void color_prf2(void)
{
panel_data data;
GetPanelExtra(prf_panel[1].seqs,&data);
if (data.nseqs == 0) return;
make_colormask(data);
info("Coloring profile 2...");
DrawPanel(prf_panel[1].seqs);
info("Done.");
}
void remove_gap_pos(int fseq, int lseq,int prf_no)
{
int i,j,k,ngaps;
if (fseq>=lseq) return;
for (i=1;i<=seqlen_array[fseq];)
{
ngaps=0;
for (j=fseq;j<=lseq;j++)
if(seq_array[j][i]==gap_pos1 || seq_array[j][i]==gap_pos2) ngaps++;
if (ngaps==lseq-fseq+1)
{
for (j=fseq;j<=lseq;j++)
{
for(k=i+1;k<=seqlen_array[j]+1;k++)
seq_array[j][k-1]=seq_array[j][k];
seqlen_array[j]--;
}
if(prf_no==1 && sec_struct_mask1 != NULL)
for(k=i;k<=seqlen_array[fseq];k++)
sec_struct_mask1[k-1]=sec_struct_mask1[k];
if(prf_no==1 && gap_penalty_mask1 != NULL)
for(k=i;k<=seqlen_array[fseq];k++)
gap_penalty_mask1[k-1]=gap_penalty_mask1[k];
if(prf_no==2 && sec_struct_mask2 != NULL)
for(k=i;k<=seqlen_array[fseq];k++)
sec_struct_mask2[k-1]=sec_struct_mask2[k];
if(prf_no==2 && gap_penalty_mask2 != NULL)
for(k=i;k<=seqlen_array[fseq];k++)
gap_penalty_mask2[k-1]=gap_penalty_mask2[k];
if(seqlen_array[fseq]<=0) break;
}
else i++;
}
}
/* width and height passed here are in pixels */
static PaneL make_panel(int type,GrouP g,int width,int height,int firstseq,int nseqs)
{
int i,l,length=0;
PaneL p;
panel_data data;
data.type=type;
SelectFont(datafont);
data.lineheight=LineHeight();
data.charwidth=CharWidth('A');
if(type==NAMES)
{
/* find the maximum length of sequence name */
for (i=firstseq;i<=firstseq+nseqs-1;i++)
{
l = strlen(names[i]);
if (length < l) length = l;
}
data.vcols=width/data.charwidth - MARGIN*2 - DNUMBER;
}
else
{
for (i=firstseq;i<=firstseq+nseqs-1;i++)
if (length < seqlen_array[i]) length = seqlen_array[i];
data.vcols=width/data.charwidth - MARGIN*2;
}
data.lines=NULL;
data.nhead=0;
data.nfoot=0;
data.header=NULL;
data.footer=NULL;
data.consensus=NULL;
data.colormask=NULL;
data.vlines=(height-SCOREHEIGHT)/data.lineheight - MARGIN;
data.vseqs=data.vlines-data.nhead-data.nfoot;
data.nseqs=nseqs;
data.ncols=length;
data.firstseq=firstseq-1;
data.firstvline=0;
data.firstvcol=0;
data.lockoffset=0;
data.ascent=Ascent();
data.descent=Descent();
data.selected=NULL;
data.firstsel=-1;
data.lastsel=-1;
data.colscore=NULL;
data.seqweight=NULL;
data.subgroup=NULL;
data.residue_exception=NULL;
data.segment_exception=NULL;
data.vscrollbar=NULL;
data.hscrollbar=NULL;
p=AutonomousPanel(g, width, height, DrawPanel, NULL,NULL,sizeof(panel_data), NULL, NULL);
SetPanelExtra(p, &data);
return p;
}
void DrawPanel(PaneL p)
{
RecT r;
panel_data data;
int pixelwidth,pixelheight;
UseWindow(mainw);
Select(p);
if (fromvscroll==0 && fromhscroll==0)
{
ObjectRect(p,&r);
pixelwidth=r.right-r.left;
pixelheight=r.bottom-r.top;
SelectFont(datafont);
GetPanelExtra(p, &data);
data.lineheight=LineHeight();
data.charwidth=CharWidth('A');
if (data.type==NAMES)
data.vcols=pixelwidth/data.charwidth-MARGIN*2-DNUMBER;
else
data.vcols=pixelwidth/data.charwidth-MARGIN*2;
data.vlines=(pixelheight-SCOREHEIGHT)/data.lineheight - MARGIN;
data.vseqs=data.vlines-data.nhead-data.nfoot;
if(data.vseqs<0)data.vseqs=0;
if(data.vcols<0)data.vcols=0;
SetPanelExtra(p, &data);
/* draw the outside frame */
ObjectRect (p, &r);
Black();
FrameRect(&r);
InsetRect(&r,1,1);
black_on_white();
EraseRect(&r);
if(data.nseqs == 0) return;
}
/* draw the structure and gap penalty data */
/* draw the footer */
if (fromvscroll==0)
{
draw_header(p);
draw_footer(p);
draw_colscores(p);
}
/* draw the data lines */
if (data.type==NAMES)
draw_names(p);
else
draw_seqs(p);
}
void hscrollnames(BaR bar, int newval, int oldval)
{
PaneL p;
panel_data data;
p = active_panel.names;
GetPanelExtra(p, &data);
data.firstvcol = newval;
SetPanelExtra(p, &data);
Select(p);
if (data.vseqs<=0) return;
draw_names(p);
}
void vscrollnames(BaR bar, int newval, int oldval)
{
PaneL p;
panel_data data;
p = active_panel.names;
GetPanelExtra(p, &data);
data.firstvline = newval;
SetPanelExtra(p, &data);
Select(p);
if (data.vseqs<=0) return;
draw_names(p);
}
void vscrollseqs(BaR bar, int newval, int oldval)
{
PaneL p;
panel_data data;
RecT block,rect;
int l;
p = active_panel.seqs;
GetPanelExtra(p, &data);
l=data.firstvline;
data.firstvline = newval;
SetPanelExtra(p, &data);
Select(p);
if (data.vseqs<=0) return;
if (data.vseqs<3 || data.nseqs-l < data.vseqs)
{
fromvscroll=0;
draw_seqs(p);
return;
}
if (newval == oldval + 1) {
fromvscroll=1;
ObjectRect(p, &rect);
InsetRect(&rect,1,1);
block.top = rect.top+(data.nhead)*data.lineheight+data.descent+1;
block.bottom = block.top+(data.vseqs)*data.lineheight;
block.left=rect.left;
block.right=rect.right;
ScrollRect(&block, 0, -data.lineheight);
} else if (newval == oldval - 1) {
fromvscroll=-1;
ObjectRect(p, &rect);
InsetRect(&rect,1,1);
block.top = rect.top+(data.nhead)*data.lineheight+data.descent+1;
block.bottom = block.top+(data.vseqs)*data.lineheight;
block.left=rect.left;
block.right=rect.right;
ScrollRect(&block, 0, data.lineheight);
} else {
fromvscroll=0;
}
draw_seqs(p);
}
void hscrollseqs(BaR bar, int newval, int oldval)
{
PaneL p;
panel_data data;
RecT rect;
p = active_panel.seqs;
GetPanelExtra(p, &data);
data.firstvcol = newval+data.lockoffset;
SetPanelExtra(p, &data);
Select(p);
if (data.vcols<=0) return;
if (data.vcols<3)
{
fromhscroll=0;
draw_header(p);
draw_seqs(p);
draw_footer(p);
draw_colscores(p);
return;
}
if (newval == oldval + 1) {
fromhscroll=1;
ObjectRect(p, &rect);
InsetRect(&rect,1,1);
rect.left+=data.charwidth;
ScrollRect(&rect, -data.charwidth, 0);
} else if (newval == oldval - 1) {
fromhscroll=-1;
ObjectRect(p, &rect);
InsetRect(&rect,1,1);
rect.right=rect.left+(data.vcols+1)*data.charwidth;
ScrollRect(&rect, data.charwidth, 0);
} else {
fromhscroll=0;
}
draw_header(p);
draw_seqs(p);
draw_footer(p);
draw_colscores(p);
}
void draw_names(PaneL p)
{
int i,f,l;
panel_data data;
UseWindow(mainw);
Select(p);
GetPanelExtra(p,&data);
if(data.lines==NULL) return;
SelectFont(datafont);
if (fromvscroll==0)
{
f=data.firstvline;
l=data.firstvline+data.vseqs-1;
}
else if (fromvscroll==-1)
f=l=data.firstvline;
else
f=l=data.firstvline+data.vseqs-1;
if(l>=data.nseqs) l=data.nseqs-1;
for(i=f;i<=l;i++)
if (data.selected[i]==TRUE)
draw_nameline(p,i,i,HIGHLIGHT);
else
draw_nameline(p,i,i,NORMAL);
}
void draw_seqs(PaneL p)
{
int i,f,l,s,x,y,format;
int fs,ls;
panel_data data;
PoinT pt;
RecT r,block;
UseWindow(mainw);
Select(p);
GetPanelExtra(p,&data);
if(data.lines==NULL) return;
SelectFont(datafont);
black_on_white();
if (fromhscroll==-1)
{
f=data.firstvcol;
if ((f>=data.firstsel) && (f<=data.lastsel))
format=HIGHLIGHT;
else format=NORMAL;
draw_seqcol(p,f,format);
}
else if (fromhscroll==1)
{
f=data.firstvcol+data.vcols-1;
if ((f>=data.firstsel) && (f<=data.lastsel))
format=HIGHLIGHT;
else format=NORMAL;
draw_seqcol(p,f,format);
}
else
{
if (fromvscroll==-1)
{
f=l=data.firstvline;
}
else if (fromvscroll==1)
{
f=l=data.firstvline+data.vseqs-1;
}
else
{
f=data.firstvline;
l=data.firstvline+data.vseqs-1;
}
if(l>=data.nseqs) l=data.nseqs-1;
s=f-data.firstvline;
ObjectRect (p, &r);
InsetRect(&r,1,1);
data_colors();
block.top=r.top+((s+data.nhead)*data.lineheight)+data.descent+1;
block.bottom=block.top+(l-f+1)*data.lineheight;
block.left=r.left;
block.right=r.right;
EraseRect(&block);
if(data.nseqs == 0) return;
if(data.firstsel != -1)
{
if ((data.firstsel>=data.firstvcol && data.firstsel<data.firstvcol+data.vcols)||
(data.lastsel>=data.firstvcol && data.lastsel<data.firstvcol+data.vcols))
{
fs=data.firstsel-data.firstvcol;
if (fs<0) fs=0;
if (fs>=data.vcols) fs=data.vcols-1;
ls=data.lastsel-data.firstvcol;
if (ls<0) ls=0;
if (ls>=data.vcols) ls=data.vcols-1;
block.left=r.left+(fs+1)*data.charwidth;
block.right=r.left+(ls+2)*data.charwidth;
text_colors();
EraseRect(&block);
}
}
x=r.left+data.charwidth;
for(i=f;i<=l;i++)
{
y=block.top+(i-f+1)*data.lineheight-data.descent-1;
LoadPt(&pt,x,y);
draw_seqline(data,i,pt,data.firstvcol,data.firstvcol+data.vcols-1,NORMAL);
}
}
black_on_white();
fromvscroll=fromhscroll=0;
}
static void NameClick(PaneL panel, PoinT pt)
{
int i;
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].names,&data);
if(data.nseqs==0)
draw_seq_pointer(prf_panel[1].names,0,NORMAL);
for(i=0;i<data.nseqs;i++)
if (data.selected[i]==TRUE)
draw_nameline(prf_panel[1].names,i,i,NORMAL);
SetPanelExtra(prf_panel[1].names,&data);
}
else if(data.prf_no==2)
{
/* revert selected area in profile 1 to normal */
GetPanelExtra(prf_panel[0].names,&data);
if(data.nseqs==0)
draw_seq_pointer(prf_panel[0].names,0,NORMAL);
for(i=0;i<data.nseqs;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -