📄 xdisplay.c
字号:
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <vibrant.h>
#include <document.h>
#include "clustalw.h"
#include "xmenu.h"
static void VscrollMulti(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval);
static void HscrollMultiN(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval);
static void HscrollMultiS(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval);
static void VscrollPrf1(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval);
static void HscrollPrf1N(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval);
static void HscrollPrf1S(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval);
static void VscrollPrf2(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval);
static void HscrollPrf2N(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval);
static void HscrollPrf2S(BaR bar, GraphiC p, Nlm_Int2 newval, Nlm_Int2 oldval);
static void NameClick(PaneL panel, PoinT pt);
static void NameDrag(PaneL panel, PoinT pt);
static void NameRelease(PaneL panel, PoinT pt);
static void SeqClick(PaneL panel, PoinT pt);
static void SeqDrag(PaneL panel, PoinT pt);
static void SeqRelease(PaneL panel, PoinT pt);
static void fit_seq_display(RecT wr,Boolean mv_message);
static void fit_prf_displays(RecT wr,int numseqs1,int numseqs2,Boolean mv_message);
static void vscrollnames(BaR bar, int newval, int oldval);
static void hscrollnames(BaR bar, int newval, int oldval);
static void vscrollseqs(BaR bar, int newval, int oldval);
static void hscrollseqs(BaR bar, int newval, int oldval);
static void correct_scrollbar(BaR b,int visible,int total,int value,Boolean reset);
static PaneL make_panel(int type,GrouP g,int width,int height,int firstline,int tlines);
static panel_data free_panel_data(panel_data data);
static panel_data alloc_name_data(panel_data data);
static panel_data alloc_seq_data(panel_data data);
extern sint max_names;
extern int mheader; /* maximum header lines */
extern int mfooter; /* maximum footer lines */
extern int max_plines; /* profile align display length */
extern int min_plines1; /* profile align display length */
extern int min_plines2; /* profile align display length */
extern int loffset,boffset,toffset;
extern int roffset;
extern int poffset;
extern Boolean aln_mode;
extern Boolean fixed_prf_scroll;
extern Boolean window_displayed;
extern PrompT message; /* used in temporary message window */
extern spanel seq_panel; /* data for multiple alignment area */
extern spanel prf_panel[]; /* data for profile alignment areas */
extern spanel active_panel; /* 'in-use' panel -scrolling,clicking etc. */
extern FonT datafont;
extern WindoW mainw;
extern GrouP seq_display,prf1_display,prf2_display;
extern int ncolors;
extern int inverted;
extern Boolean dnaflag;
extern sint nseqs;
extern sint profile1_nseqs;
extern sint output_order;
extern sint *output_index;
extern sint *seqlen_array;
extern char **seq_array;
extern char **names, **titles;
extern char *amino_acid_codes;
extern sint gap_pos1, gap_pos2;
extern char *gap_penalty_mask1,*gap_penalty_mask2;
extern char *sec_struct_mask1,*sec_struct_mask2;
extern sint struct_penalties1,struct_penalties2;
extern sint output_struct_penalties;
extern Boolean use_ss1, use_ss2;
extern char *explicit_par_file;
extern char *par_file;
extern char def_protpar_file[];
extern char def_dnapar_file[];
extern sint ncutseqs;
extern Boolean residue_exceptions;
extern Boolean segment_exceptions;
extern color color_lut[];
extern char *res_cat1[];
extern char *res_cat2[];
static range selected_seqs; /* sequences selected by clicking on names */
static range selected_res; /* residues selected by clicking on seqs */
static int fromvscroll,fromhscroll; /* set by scrolling functions,
used by DrawPanel, draw_names, draw_seqs */
void resize_multi_window(void)
{
RecT r;
ObjectRect(mainw,&r);
fit_seq_display(r,FALSE);
}
void resize_prf_window(int numseqs1,int numseqs2)
{
RecT r;
SelectFont(datafont);
stdCharWidth=CharWidth('A');
stdLineHeight=LineHeight();
if(numseqs1>max_plines)
numseqs1=max_plines;
else if(numseqs1<min_plines1)
numseqs1=min_plines1;
if(numseqs2>max_plines)
numseqs2=max_plines;
else if(numseqs2<min_plines2)
numseqs2=min_plines2;
ObjectRect(mainw,&r);
fit_prf_displays(r,numseqs1,numseqs2,FALSE);
}
static void fit_seq_display(RecT wr,Boolean mv_message)
{
int width,height,moffset;
RecT nr,sr,mr;
panel_data data;
ObjectRect(seq_panel.names,&nr);
ObjectRect(message,&mr);
moffset=mr.top-nr.bottom;
width=nr.right-nr.left;
height=wr.bottom-wr.top-boffset-toffset;
nr.top=toffset;
nr.left=loffset;
nr.bottom=nr.top+height;
nr.right=nr.left+width;
SetPosition(seq_panel.names,&nr);
GetPanelExtra(seq_panel.names,&data);
data.vlines=(height-SCOREHEIGHT)/data.lineheight - MARGIN;
data.vseqs=data.vlines-data.nhead-data.nfoot;
SetPanelExtra(seq_panel.names,&data);
sr.top=nr.top;
sr.left=nr.right;
sr.bottom=sr.top+height;
sr.right=wr.right-wr.left-roffset;
width=sr.right-sr.left;
SetPosition(seq_panel.seqs,&sr);
GetPanelExtra(seq_panel.seqs,&data);
data.vcols=width/data.charwidth - MARGIN*2;
data.vlines=(height-SCOREHEIGHT)/data.lineheight - MARGIN;
data.vseqs=data.vlines-data.nhead-data.nfoot;
SetPanelExtra(seq_panel.seqs,&data);
if(mv_message) {
height=mr.bottom-mr.top;
mr.top=nr.bottom+moffset;
mr.bottom=mr.top+height;
SetPosition(message,&mr);
}
position_scrollbars(seq_panel);
correct_name_bars(TRUE);
correct_seq_bars(TRUE);
}
static void fit_prf_displays(RecT wr,int numseqs1,int numseqs2,Boolean mv_message)
{
int width,height,moffset;
RecT mr,nr,sr;
panel_data data;
ObjectRect(prf_panel[1].names,&nr);
ObjectRect(message,&mr);
moffset=mr.top-nr.bottom;
ObjectRect(prf_panel[0].names,&nr);
width=nr.right-nr.left;
nr.top=toffset;
nr.left=loffset;
height=(wr.bottom-wr.top-boffset-toffset-poffset)*numseqs1/(numseqs1+numseqs2);
nr.bottom=nr.top+height;
nr.right=nr.left+width;
SetPosition(prf_panel[0].names,&nr);
GetPanelExtra(prf_panel[0].names,&data);
data.vlines=(height-SCOREHEIGHT)/data.lineheight - MARGIN;
data.vseqs=data.vlines-data.nhead-data.nfoot;
SetPanelExtra(prf_panel[0].names,&data);
sr.top=nr.top;
sr.left=nr.right;
sr.bottom=sr.top+height;
sr.right=wr.right-wr.left-roffset;
width=sr.right-sr.left;
SetPosition(prf_panel[0].seqs,&sr);
GetPanelExtra(prf_panel[0].seqs,&data);
data.vcols=width/data.charwidth - MARGIN*2;
data.vlines=(height-SCOREHEIGHT)/data.lineheight - MARGIN;
data.vseqs=data.vlines-data.nhead-data.nfoot;
SetPanelExtra(prf_panel[0].seqs,&data);
position_scrollbars(prf_panel[0]);
nr.top=nr.bottom+poffset;
height=(wr.bottom-wr.top-boffset-toffset-poffset)*numseqs2/(numseqs1+numseqs2);
nr.bottom=nr.top+height;
SetPosition(prf_panel[1].names,&nr);
GetPanelExtra(prf_panel[1].names,&data);
data.vlines=(height-SCOREHEIGHT)/data.lineheight - MARGIN;
data.vseqs=data.vlines-data.nhead-data.nfoot;
SetPanelExtra(prf_panel[1].names,&data);
sr.top=nr.top;
sr.bottom=sr.top+height;
SetPosition(prf_panel[1].seqs,&sr);
GetPanelExtra(prf_panel[1].seqs,&data);
data.vcols=width/data.charwidth - MARGIN*2;
data.vlines=(height-SCOREHEIGHT)/data.lineheight - MARGIN;
data.vseqs=data.vlines-data.nhead-data.nfoot;
SetPanelExtra(prf_panel[1].seqs,&data);
position_scrollbars(prf_panel[1]);
if(mv_message) {
height=mr.bottom-mr.top;
mr.top=nr.bottom+moffset;
mr.bottom=mr.top+height;
SetPosition(message,&mr);
}
correct_name_bars(TRUE);
correct_seq_bars(TRUE);
}
void ResizeWindowProc(WindoW w)
{
int numseqs1,numseqs2;
RecT wr;
panel_data data;
if(window_displayed==FALSE) return;
ObjectRect(w,&wr);
if (aln_mode==MULTIPLEM)
{
/* if the window is too small, hide everything */
if(wr.bottom-wr.top < toffset+boffset)
{
Hide(seq_display);
Hide(message);
return;
}
fit_seq_display(wr,TRUE);
Show(seq_display);
Show(message);
}
else
{
/* if the window is too small, hide everything */
if(wr.bottom-wr.top < toffset+boffset+2*poffset)
{
Hide(prf1_display);
Hide(prf2_display);
Hide(message);
return;
}
GetPanelExtra(prf_panel[0].names,&data);
numseqs1=data.nseqs;
if(numseqs1<min_plines1)numseqs1=min_plines1;
else if(numseqs1>max_plines)numseqs1=max_plines;
GetPanelExtra(prf_panel[1].names,&data);
numseqs2=data.nseqs;
if(numseqs2<min_plines2)numseqs2=min_plines2;
else if(numseqs2>max_plines)numseqs2=max_plines;
fit_prf_displays(wr,numseqs1,numseqs2,TRUE);
Show(prf1_display);
Show(prf2_display);
Show(message);
}
}
void position_scrollbars(spanel p)
{
int height;
RecT hr,vr,nr,sr;
panel_data data;
ObjectRect(p.names,&nr);
GetPanelExtra(p.names,&data);
ObjectRect(data.hscrollbar,&hr);
height=hr.bottom-hr.top;
LoadRect(&hr,nr.left,nr.bottom,nr.right,nr.bottom+height);
SetPosition(data.hscrollbar,&hr);
#ifdef WIN_MAC
AdjustPrnt(data.hscrollbar,&hr,FALSE);
#endif
ObjectRect(p.seqs,&sr);
GetPanelExtra(p.seqs,&data);
ObjectRect(data.hscrollbar,&hr);
height=hr.bottom-hr.top;
LoadRect(&hr,sr.left,sr.bottom,sr.right,sr.bottom+height);
SetPosition(data.hscrollbar,&hr);
#ifdef WIN_MAC
AdjustPrnt(data.hscrollbar,&hr,FALSE);
#endif
ObjectRect(data.vscrollbar,&vr);
LoadRect(&vr,vr.left,sr.top,vr.right,sr.bottom);
SetPosition(data.vscrollbar,&vr);
#ifdef WIN_MAC
AdjustPrnt(data.vscrollbar,&vr,FALSE);
#endif
}
void load_aln_data(spanel p,int fs,int ls,Boolean reset)
{
int i,j,slength=0;
int nhead;
sint val;
panel_data name_data,seq_data;
WatchCursor();
GetPanelExtra(p.names,&name_data);
GetPanelExtra(p.seqs,&seq_data);
name_data=free_panel_data(name_data);
seq_data=free_panel_data(seq_data);
SetPanelExtra(p.names,&name_data);
SetPanelExtra(p.seqs,&seq_data);
name_data.nseqs=ls-fs+1;
seq_data.nseqs=name_data.nseqs;
name_data.firstseq=fs;
seq_data.firstseq=fs;
/* find the maximum length of sequence */
for(i=fs;i<=ls;i++)
if (slength < seqlen_array[i+1]) slength = seqlen_array[i+1];
name_data.ncols=max_names;
seq_data.ncols=slength;
if (name_data.nseqs>0)
{
name_data=alloc_name_data(name_data);
seq_data=alloc_seq_data(seq_data);
for(i=fs;i<=ls;i++)
{
strncpy(name_data.lines[i-fs],names[i+1],MAXNAMES);
name_data.lines[i-fs][MAXNAMES]='\0';
for(j=0;j<seqlen_array[i+1];j++)
{
val = seq_array[i+1][j+1];
if((val == -3) || (val == 253))
break;
else if((val == gap_pos1) || (val == gap_pos2))
seq_data.lines[i-fs][j] = '-';
else {
seq_data.lines[i-fs][j] = amino_acid_codes[val];
}
}
for(j=seqlen_array[i+1];j<slength;j++)
seq_data.lines[i-fs][j] = ' ';
seq_data.lines[i-fs][j]='\0';
name_data.selected[i-fs]=FALSE;
}
make_consensus(seq_data,name_data.header[0],seq_data.header[0]);
nhead=make_struct_data(seq_data.prf_no,slength,name_data.header[1],seq_data.header[1]);
if (nhead==0)
nhead=make_gp_data(seq_data.prf_no,slength,name_data.header[1],seq_data.header[1]);
seq_data.nhead=name_data.nhead=nhead+1;
seq_data.nfoot=name_data.nfoot=1;
seq_data.consensus=NULL;
make_ruler(slength,name_data.footer[0],seq_data.footer[0]);
make_colscores(seq_data);
}
else
{
seq_data.ncols=name_data.ncols=0;
}
if(reset==TRUE)
{
name_data.firstvline=0;
name_data.firstvcol=0;
seq_data.firstvline=0;
seq_data.firstvcol=0;
}
name_data.vseqs=name_data.vlines-name_data.nhead-name_data.nfoot;
seq_data.vseqs=seq_data.vlines-seq_data.nhead-seq_data.nfoot;
if(seq_data.nseqs>0)
{
/* try to find the user's color parameter file */
if (explicit_par_file == NULL)
{
if (par_file != NULL)
ckfree(par_file);
if(dnaflag)
par_file=find_file(def_dnapar_file);
else
par_file=find_file(def_protpar_file);
}
init_color_parameters(par_file);
make_colormask(seq_data);
}
SetPanelExtra(p.names,&name_data);
SetPanelExtra(p.seqs,&seq_data);
ArrowCursor();
}
void load_aln(spanel p,int fs,int ls,Boolean reset)
{
load_aln_data(p,fs,ls,reset);
DrawPanel(p.names);
DrawPanel(p.seqs);
correct_name_bars(reset);
correct_seq_bars(reset);
}
static panel_data alloc_name_data(panel_data data)
{
int i;
data.lines=(char **)ckalloc((data.nseqs+1)*sizeof(char *));
data.colormask=NULL;
data.selected=(int *)ckalloc((data.nseqs+1)*sizeof(int));
for(i=0;i<data.nseqs;i++)
{
data.lines[i]=(char *)ckalloc((MAXNAMES+1)*sizeof(char));
strncpy(data.lines[i],names[i+1],MAXNAMES);
data.lines[i][MAXNAMES]='\0';
}
data.header=(char **)ckalloc((mheader+1)*sizeof(char *));
for(i=0;i<mheader;i++)
data.header[i]=(char *)ckalloc((MAXNAMES+1)*sizeof(char));
data.footer=(char **)ckalloc((mfooter+1)*sizeof(char *));
for(i=0;i<mfooter;i++)
data.footer[i]=(char *)ckalloc((MAXNAMES+1)*sizeof(char));
return(data);
}
static panel_data alloc_seq_data(panel_data data)
{
int i;
data.lines=(char **)ckalloc((data.nseqs+1)*sizeof(char *));
data.colormask=(char **)ckalloc((data.nseqs+1)*sizeof(char *));
data.firstsel=data.lastsel=-1;
for(i=0;i<data.nseqs;i++)
{
data.lines[i]=(char *)ckalloc((data.ncols+1)*sizeof(char));
data.colormask[i]=(char *)ckalloc((data.ncols+1)*sizeof(char));
}
data.selected=(int *)ckalloc((data.ncols+1)*sizeof(int));
for(i=0;i<data.ncols;i++)
data.selected[i]=FALSE;
data.header=(char **)ckalloc((mheader+1)*sizeof(char *));
for(i=0;i<mheader;i++)
data.header[i]=(char *)ckalloc((data.ncols+1)*sizeof(char));
data.colscore=(sint *)ckalloc((data.ncols+1)*sizeof(sint));
data.residue_exception=(Boolean **)ckalloc((data.nseqs+1)*sizeof(Boolean *));
for(i=0;i<data.nseqs;i++)
data.residue_exception[i]=(Boolean *)ckalloc((data.ncols+1)*sizeof(Boolean));
data.segment_exception=(short **)ckalloc((data.nseqs+1)*sizeof(short *));
for(i=0;i<data.nseqs;i++)
data.segment_exception[i]=(short *)ckalloc((data.ncols+1)*sizeof(short));
data.footer=(char **)ckalloc((mfooter+1)*sizeof(char *));
for(i=0;i<mfooter;i++)
data.footer[i]=(char *)ckalloc((data.ncols+1)*sizeof(char));
return(data);
}
void correct_name_bars(Boolean reset)
{
panel_data data,data1;
if(aln_mode==PROFILEM)
{
GetPanelExtra(prf_panel[0].names,&data);
GetPanelExtra(prf_panel[1].names,&data1);
if(reset==TRUE)
{
data.firstvcol=0;
data1.firstvcol=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,data1.firstvline,reset);
SetPanelExtra(prf_panel[0].names,&data);
SetPanelExtra(prf_panel[1].names,&data1);
}
else
{
GetPanelExtra(seq_panel.names,&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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -