#include #include #include #include #include #include #include "menudefs.h" #include "defines.h" /* Copyright (c) 1989-1990, University of Illinois board of trustees. All rights reserved. Written by Steven Smith at the Center for Prokaryote Genome Analysis. Design and implementation guidance by Dr. Gary Olsen and Dr. Carl Woese. Copyright (c) 1990,1991,1992 Steven Smith at the Harvard Genome Laboratory. All rights reserved. */ NAEvents(win,event,arg) Xv_window win; Event *event; Notify_arg arg; { extern NA_Alignment *DataSet,*Clipboard; extern Canvas EditCan; extern DisplayAttr; NA_DisplayData *ddata; NA_Alignment *aln; NA_Sequence *this_seq; Display *dpy; GC gc; Xv_window view; NA_Base c,this_base; Scrollbar hsc,vsc; char *buf; extern int repeat_cnt,EditDir,BlockInput,SCALE; extern Frame frame; extern Panel_item left_foot,right_foot; extern EditMode; Window xwin; int i,j,k,x,y,cursorx,cursory,protection_violation,success=FALSE; int startx,endx,starty,endy,test_offscreen = FALSE,eventid; if(DataSet == NULL) return; for(j=0;jna_ddata); if(ddata == NULL) return; eventid = event_id(event); dpy = (Display *)xv_get(EditCan, XV_DISPLAY); xwin = (Window)xv_get(win,XV_XID); gc = DefaultGC(dpy,DefaultScreen(dpy)); cursorx = ddata->cursor_x; cursory = ddata->cursor_y; if (eventid == WIN_RESIZE) { if(EditCan) { hsc=(Scrollbar)xv_get(EditCan, OPENWIN_HORIZONTAL_SCROLLBAR, view); vsc=(Scrollbar)xv_get(EditCan, OPENWIN_VERTICAL_SCROLLBAR,view); if(hsc) xv_set(hsc,SCROLLBAR_VIEW_START,0,0); if(vsc) xv_set(vsc,SCROLLBAR_VIEW_START,0,0); } } /* * Highly interdependent with AUTO_SHRINK attribute * * The following an attempt to remove Warning messages on * split screen and loading of new data. */ if((event_is_down(event) || event_is_button(event)) && EditCan) { hsc=(Scrollbar)xv_get(EditCan,OPENWIN_HORIZONTAL_SCROLLBAR, view); vsc=(Scrollbar)xv_get(EditCan,OPENWIN_VERTICAL_SCROLLBAR,view); if(hsc) { startx = (int)xv_get(hsc,SCROLLBAR_VIEW_START)/SCALE; startx = (int)xv_get(hsc,SCROLLBAR_VIEW_START); endx = startx + (int)xv_get(hsc,SCROLLBAR_VIEW_LENGTH) *SCALE; } if(vsc) { starty = (int)xv_get(vsc,SCROLLBAR_VIEW_START); endy = starty + (int)xv_get(vsc,SCROLLBAR_VIEW_LENGTH); } if(!(hsc || vsc)) return; } if (eventid == LOC_WINENTER || (event_action(event) == ACTION_TAKE_FOCUS)) win_set_kbd_focus(win,xwin); else if(event_is_down(event) && event_action(event) == ACTION_COPY) { (void)EditCopy(win,event); } else if(event_is_down(event) && event_action(event) == ACTION_CUT) { (void)EditCut(win,event); } else if(event_is_down(event) && event_action(event) == ACTION_PASTE) { (void)EditPaste(win,event); } else if(event_is_button(event) && !BlockInput) { x=(event_x(event)/ddata->font_dx)*SCALE + startx; y=event_y(event)/ddata->font_dy + starty; y=MAX(0,MIN(y,aln->numelements - 1)); x=MAX(0,MIN(x,aln->maxlen)); if(event_is_down(event)&&(event_action(event)==ACTION_SELECT)) { repeat_cnt = 0; UnsetNACursor(ddata,EditCan,win,xwin,dpy,gc); ddata->cursor_x = x; ddata->cursor_y = y; ResetPos(ddata); SetNACursor(ddata,EditCan,win,xwin,dpy,gc); } if(event_is_up(event)&&(event_action(event)==ACTION_SELECT)) { SubSelect(aln,event_shift_is_down(event), ddata->cursor_x,ddata->cursor_y,x,y); SetNACursor(ddata,EditCan,win,xwin,dpy,gc); } else if(event_is_up(event) &&(event_action(event)==ACTION_ADJUST)) { SubSelect(aln,TRUE,ddata->cursor_x,ddata->cursor_y,x,y); SetNACursor(ddata,EditCan,win,xwin,dpy,gc); } } if(event_is_ascii(event) && event_is_down(event) && event_meta_is_down(event) && ((char)eventid == 'm' || (char)eventid == 'M') ) { EditMode = (EditMode==CHECK)?INSERT:CHECK; SetNACursor(ddata,EditCan,win,xwin,dpy,gc); } else if(event_is_ascii(event) && event_is_down(event) && event_meta_is_down(event) && (char)eventid == 'u' ) { (void)Ungroup(NULL,NULL); } else if(event_is_ascii(event) && event_is_down(event) && event_meta_is_down(event) && (char)eventid == 'g' ) { (void)Group(NULL,NULL); } else if(event_is_ascii(event) && event_is_down(event) && event_meta_is_down(event) && (char)eventid == 'i' ) { (void)ModAttr(NULL,NULL); } else if(event_is_ascii(event) && event_is_down(event) && event_meta_is_down(event) && (char)eventid == 'p' ) { (void)SetProtection(NULL,NULL); } else if(event_is_down(event) && event_is_ascii(event) && event_meta_is_down(event) && (char)eventid>'9') DoMeta((char)eventid); else if(event_is_down(event) && (event_is_ascii(event) || (char)eventid==0x7 || (char)eventid==0x7f) && !BlockInput) { if(DisplayAttr & KEYCLICKS) Keyclick(); /* * De-select the text */ SubSelect(aln,FALSE,0,0,0,0); if((char)eventid<='9' && (char)eventid>='0' && ddata->use_repeat && (aln->element[cursory].elementtype != MASK && aln->element[cursory].elementtype != TEXT || event_meta_is_down(event))) { repeat_cnt = repeat_cnt*10+eventid-'0'; if(repeat_cnt > 100000000) repeat_cnt = 0; SetNACursor(ddata,EditCan,win,xwin,dpy,gc); } else if((eventid ==0x7f || eventid == 0x8) && EditMode != CHECK) { int current_id = aln->element[cursory].groupid; protection_violation=FALSE; repeat_cnt = MAX(1,repeat_cnt); for(this_seq = &(aln->element[cursory]); this_seq != NULL; this_seq = this_seq->groupf) protection_violation |= DeleteViolate(aln,this_seq, repeat_cnt,cursorx); for(this_seq = &(aln->element[cursory]); this_seq != NULL;this_seq = this_seq->groupb) protection_violation |= DeleteViolate(aln,this_seq,repeat_cnt,cursorx); if(protection_violation == FALSE) { if(current_id == 0) success |= DeleteNA(aln,cursory, repeat_cnt, cursorx); else for(j=0;jnumelements;j++) if(aln->element[j].groupid == current_id) success|=DeleteNA(aln,j, repeat_cnt,cursorx); if(success) ddata->cursor_x -=repeat_cnt; test_offscreen = TRUE; NormalizeOffset(aln); } else { xv_set(frame,FRAME_RIGHT_FOOTER, "Cannot delete",0); xv_set(right_foot,PANEL_LABEL_STRING, "Cannot delete",0); xv_set(right_foot,PANEL_LABEL_STRING, "Cannot delete",0); Beep(); } repeat_cnt = 0; SetNACursor(ddata,EditCan,win,xwin,dpy,gc); } /* --------------------------------------------------------- */ /* Added by Scott Ferguson, Exxon Research & Engineering Co. */ /* --------------------------------------------------------- */ else if(EditMode == INSERT && (eventid == 11 || eventid == 12)) { /* The FETCH key grabs the nearest repeat_cnt bases to the right or left and moves them to where the cursor is without shifting the other parts of the alignment eventid = 11 (CNTRL 'k') means Fetch from the right eventid = 12 (CNTRL 'l') means Fetch from the left */ repeat_cnt = MAX(1,repeat_cnt); this_seq=&(aln->element[cursory]); for(;this_seq != NULL; this_seq = this_seq->groupf) if(this_seq != NULL) success = FetchNA(this_seq,eventid, repeat_cnt, cursorx, cursory); UnsetNACursor(ddata,EditCan,win,xwin,dpy,gc); if (success) if (eventid == 12) ddata->cursor_x += repeat_cnt; else ddata->cursor_x -= repeat_cnt; test_offscreen = TRUE; repeat_cnt = 0; SetNACursor(ddata,EditCan,win,xwin,dpy,gc); } /* ---------------END OF SEGMENT:--------------------------- */ /* Added by Scott Ferguson, Exxon Research & Engineering Co. */ /* --------------------------------------------------------- */ else if(EditMode == INSERT) { repeat_cnt = MAX(1,repeat_cnt); this_seq=&(aln->element[cursory]); c = (char)eventid; /* * remap "space" to "-" if AA sequence */ if(this_seq->elementtype == PROTEIN) if(c == ' ') c = '-'; buf = Calloc(sizeof(NA_Base),repeat_cnt); for(j=0;jgroupf != NULL; this_seq = this_seq->groupf) protection_violation |= InsertViolate(aln,this_seq,buf,cursorx, repeat_cnt); for(this_seq = &(aln->element[cursory]); this_seq->groupb != NULL; this_seq = this_seq->groupb) protection_violation |= InsertViolate(aln,this_seq,buf,cursorx, repeat_cnt); if(protection_violation == FALSE) { for(;this_seq != NULL; this_seq = this_seq->groupf) if(this_seq != NULL) success = InsertNA(this_seq,buf, repeat_cnt, cursorx, cursory); UnsetNACursor(ddata,EditCan,win,xwin,dpy,gc); if(success) ddata->cursor_x +=(repeat_cnt * EditDir); test_offscreen = TRUE; } else { xv_set(frame,FRAME_RIGHT_FOOTER, "Cannot insert",0); xv_set(right_foot,PANEL_LABEL_STRING, "Cannot delete",0); Beep(); } repeat_cnt = 0; SetNACursor(ddata,EditCan,win,xwin,dpy,gc); cfree(buf); } /* * Check mode */ else { printf("Eventid = %d\n",eventid); c = toupper((char)eventid); this_base = getelem(&(aln->element[cursory]),cursorx); if(aln->element[cursory].tmatrix) { this_base=aln->element[cursory]. tmatrix[(int)this_base]; } this_base = toupper(this_base); if(c==this_base) { UnsetNACursor(ddata,EditCan,win,xwin,dpy,gc); ddata->cursor_x++; test_offscreen = TRUE; ResetPos(ddata); SetNACursor(ddata,EditCan,win,xwin,dpy,gc); } else { Beep(); } } } else if(event_is_down(event)&& !BlockInput) { if (event_action(event) == ACTION_GO_COLUMN_BACKWARD) { if(DisplayAttr & KEYCLICKS) Keyclick(); repeat_cnt = MAX(1,repeat_cnt); UnsetNACursor(ddata,EditCan,win,xwin,dpy,gc); ddata->cursor_y = MAX(0,ddata->cursor_y-repeat_cnt); test_offscreen = TRUE; repeat_cnt = 0; ResetPos(ddata); SubSelect(aln,FALSE,0,0,0,0); SetNACursor(ddata,EditCan,win,xwin,dpy,gc); } else if (event_action(event) == ACTION_GO_COLUMN_FORWARD) { if(DisplayAttr & KEYCLICKS) Keyclick(); repeat_cnt = MAX(1,repeat_cnt); UnsetNACursor(ddata,EditCan,win,xwin,dpy,gc); ddata->cursor_y = MAX(0,MIN(aln->numelements - 1, ddata->cursor_y+repeat_cnt)); repeat_cnt = 0; test_offscreen = TRUE; ResetPos(ddata); SubSelect(aln,FALSE,0,0,0,0); SetNACursor(ddata,EditCan,win,xwin,dpy,gc); } else if (event_action(event) == ACTION_GO_CHAR_BACKWARD) { if(DisplayAttr & KEYCLICKS) Keyclick(); repeat_cnt = MAX(SCALE,repeat_cnt); UnsetNACursor(ddata,EditCan,win,xwin,dpy,gc); ddata->cursor_x = MAX(0,ddata->cursor_x-repeat_cnt); test_offscreen = TRUE; repeat_cnt = 0; ResetPos(ddata); SubSelect(aln,FALSE,0,0,0,0); SetNACursor(ddata,EditCan,win,xwin,dpy,gc); } else if (event_action(event) == ACTION_GO_CHAR_FORWARD) { if(DisplayAttr & KEYCLICKS) Keyclick(); repeat_cnt = MAX(SCALE,repeat_cnt); UnsetNACursor(ddata,EditCan,win,xwin,dpy,gc); ddata->cursor_x = MAX(0,MIN(aln->maxlen,ddata-> cursor_x + repeat_cnt)); test_offscreen = TRUE; repeat_cnt = 0; ResetPos(ddata); SubSelect(aln,FALSE,0,0,0,0); SetNACursor(ddata,EditCan,win,xwin,dpy,gc); } } if(((ddata->cursor_xcursor_x>endx-1)) && test_offscreen) { x = ddata->cursor_x-(endx-startx)/2; x = (MAX(0,MIN(x,aln->maxlen - (endx-startx)))); (void)JumpTo(view,x,starty); } if(((ddata->cursor_ycursor_y>endy-1)) && test_offscreen) { y = ddata->cursor_y-(endy-starty)/2; y = (MAX(0,MIN(y,aln->numelements - (endy-starty)))); (void)JumpTo(view,startx,y); } return; } /* Copyright (c) 1989-1990, University of Illinois board of trustees. All rights reserved. Written by Steven Smith at the Center for Prokaryote Genome Analysis. Design and implementation guidance by Dr. Gary Olsen and Dr. Carl Woese. Copyright (c) 1990,1991,1992 Steven Smith at the Harvard Genome Laboratory. All rights reserved. */ InsertViolate(aln,seq,insert,cursor_x,len) NA_Alignment *aln; NA_Sequence *seq; NA_Base *insert; int cursor_x,len; { int i,j,prot,violated = FALSE; prot = seq->protect; if(seq->rmatrix) for(i=0;irmatrix[insert[i]]; if((prot & PROT_BASE_CHANGES)==0) { if(seq->elementtype == DNA || seq->elementtype == RNA) { /* * if character is not '-' or 'N' then * protection is violated. */ for(j=0;jelementtype == PROTEIN) { for(j=0;jelementtype == MASK) { for(j=0;jelementtype == DNA || seq->elementtype == RNA) { /* * if character is '-' then * protection is violated. */ for(j=0;jelementtype == PROTEIN) { for(j=0;jelementtype == DNA || seq->elementtype == RNA) { for(j=0;jelementtype == PROTEIN) { for(j=0;jtmatrix) for(i=0;itmatrix[insert[i]]; return(violated); } InsertNA(seq,insert,len,pos) /* * return Success */ NA_Sequence *seq; NA_Base *insert; int len,pos; { int i,j,snum,x = pos+100; int curlen,maxlen,offset; extern NA_Alignment *DataSet; extern Frame frame; extern Panel_item left_foot,right_foot; extern Canvas EditCan; NA_DisplayData *NAdd; NA_Alignment *aln = (NA_Alignment*)DataSet; Xv_window win; Window xwin; Display *dpy; GC gc; if(seq->rmatrix) for(i=0;irmatrix[insert[i]]; dpy = (Display *)xv_get(EditCan, XV_DISPLAY); gc = DefaultGC(dpy,DefaultScreen(dpy)); NAdd =(NA_DisplayData*)aln->na_ddata; offset = seq->offset; curlen = seq->seqlen; maxlen = seq->seqmaxlen; if(seq->elementtype == MASK) for(i=0;i '9') insert[i] = '0'; /* * The current snum (sequence number) should be passed into this * routine. This means that the index into the alignment needs * to be included in the "sequence id." The following is a lookup * for the snum (slow). */ for(j = 0;j < aln->numelements;j++) if(&(aln->element[j]) == seq) { snum = j; j = aln->numelements; } if(pos > seq->seqlen+seq->offset) { xv_set(frame,FRAME_RIGHT_FOOTER, "Cannot insert beyond end",0); xv_set(right_foot,PANEL_LABEL_STRING, "Cannot insert beyond end",0); Beep(); if(seq->tmatrix) for(i=0;itmatrix[insert[i]]; return(FALSE); } if(seq->seqlen+len>=seq->seqmaxlen-1) { if(seq->sequence) { seq->sequence = (NA_Base*) Realloc(seq->sequence,(seq->seqlen+len+100)*sizeof(NA_Base)); seq->seqmaxlen = seq->seqlen+len+100; } else { seq->sequence = (NA_Base*) Calloc(sizeof(NA_Base),(seq->seqlen+len+100)); seq->seqmaxlen = seq->seqlen+len+100; } if(seq->cmask) { seq->cmask = (int*)Realloc(seq->cmask, seq->seqlen*sizeof(int)); } } /* * This forces space to be allocated upstream, and thus prevents * memory thrashing. Not a wonderful fix, but it will do for now... */ if(posoffset) putelem(seq,pos,'\0'); for(j=0;j<=seq->seqlen+seq->offset - pos+1;j++) { putelem(seq,seq->seqlen+len+seq->offset - j, getelem(seq,seq->offset+seq->seqlen - j)); if(seq->cmask) putcmask(seq,seq->seqlen+len+seq->offset-j, getcmask(seq,seq->seqlen+seq->offset - j)); } for(j=0;jcmask) putcmask(seq,pos+j,8); } seq->seqlen = seq->seqlen + len; aln->maxlen = MAX(aln->maxlen,seq->seqlen+1); RedrawAllNAViews(snum,pos); if(seq->tmatrix) for(i=0;itmatrix[insert[i]]; return(TRUE); } /*------------------------------------------------------------------------*/ /* Added by Scott Ferguson, Exxon Research & Engineering Co. */ /* In support of the "Fetch" key operation */ /*------------------------------------------------------------------------*/ /* dir = CNTRL 'k'(11), fetch left; dir = CNTRL 'l'(12), fetch right */ FetchNA(seq,dir,len,pos) /* * return Success */ NA_Sequence *seq; unsigned char dir; int len,pos; { extern Frame frame; extern Panel_item left_foot,right_foot; int i,j,snum,x = pos+100; int curlen,maxlen,offset; extern NA_Alignment *DataSet; extern Canvas EditCan; NA_DisplayData *NAdd; NA_Alignment *aln = (NA_Alignment*)DataSet; Xv_window win; Window xwin; Display *dpy; GC gc; NA_Base *scratch, tgap; int incr, nearest, *cscratch, tcmask; dpy = (Display *)xv_get(EditCan, XV_DISPLAY); gc = DefaultGC(dpy,DefaultScreen(dpy)); NAdd =(NA_DisplayData*)aln->na_ddata; offset = seq->offset; curlen = seq->seqlen; maxlen = seq->seqmaxlen; /* * The current snum (sequence number) should be passed into this * routine. This means that the index into the alignment needs * to be included in the "sequence id." The following is a lookup * for the snum (slow). */ for(j = 0;j < aln->numelements;j++) if(&(aln->element[j]) == seq) { snum = j; j = aln->numelements; } scratch = (NA_Base *) Calloc(sizeof(NA_Base),len); cscratch = (int *) Calloc(sizeof(int),len); if (dir == 12) { incr = 1; if (pos < offset) nearest = offset-pos; else nearest = 0; while (pos+nearest < seq->seqlen+seq->offset) { if (isagap(seq,pos+nearest)) nearest++; else break; } if (pos+nearest+len > seq->seqlen+seq->offset) { xv_set(frame,FRAME_RIGHT_FOOTER, "Cannot fetch beyond end",0); xv_set(right_foot,PANEL_LABEL_STRING, "Cannot fetch beyond end",0); Beep(); return(FALSE); } } else { if (pos >= offset + curlen) { xv_set(frame,FRAME_RIGHT_FOOTER, "Cannot fetch past end",0); xv_set(right_foot,PANEL_LABEL_STRING, "Cannot fetch past end",0); Beep(); return(FALSE); } incr = -1; nearest = 0; while (pos+nearest > seq->offset) { if (isagap(seq,pos+nearest)) nearest--; else break; } if (pos+nearest-len+1 < seq->offset) { xv_set(frame,FRAME_RIGHT_FOOTER, "Cannot fetch beyond beginning",0); xv_set(right_foot,PANEL_LABEL_STRING, "Cannot fetch beyond beginning",0); Beep(); return(FALSE); } } if (nearest == 0) { xv_set(frame,FRAME_RIGHT_FOOTER, "Base is not a Gap",0); xv_set(right_foot,PANEL_LABEL_STRING, "Base is not a Gap",0); Beep(); return(FALSE); /* this means we're not sitting on a gap */ } tgap = getelem(seq,pos); if (seq->cmask) tcmask = getcmask(seq,pos); for(j=0;jcmask) cscratch[j] = getcmask(seq,pos+j*incr+nearest); } for (j=0;jcmask) putcmask(seq,pos+j*incr+nearest,tcmask); } for (j=0;jcmask) putcmask(seq,pos+j*incr,cscratch[j]); } nearest = 0; while (isagap(seq,seq->offset+nearest)) nearest++; if (nearest != 0) { for (j=0;jseqlen-nearest;j++) { putelem(seq,seq->offset+j,getelem(seq,seq->offset+nearest+j)); if(seq->cmask) putcmask(seq,seq->offset+j, getcmask(seq,seq->offset+nearest+j)); } for (j=0;joffset+seq->seqlen-nearest+j,tgap); if(seq->cmask) putcmask(seq,seq->offset+j,tcmask); } seq->seqlen -= nearest; seq->offset += nearest; } if (dir == 12) RedrawAllNAViews(snum,MIN(pos,pos+nearest+(len-1)*incr)); else RedrawAllNAViews(snum,0); xv_set(frame,FRAME_RIGHT_FOOTER, "",0); xv_set(right_foot,PANEL_LABEL_STRING, "",0); free(cscratch); free(scratch); return(TRUE); } /*------------------------------------------------------------------------*/ /* End of lines added by S. R. Ferguson srfergu@erenj.com */ /* In support of the "Fetch" key operation */ /*------------------------------------------------------------------------*/ DeleteNA(aln,seqnum,len,offset) NA_Alignment *aln; int seqnum,len,offset; { int i,j,seqlen = aln->element[seqnum].seqlen+aln->element[seqnum].offset; extern Frame frame; extern Panel_item left_foot,right_foot; NA_Sequence *seq; seq = &(aln->element[seqnum]); if(offset > seq->offset+seq->seqlen) { xv_set(frame,FRAME_RIGHT_FOOTER, "Cannot delete beyond end",0); xv_set(right_foot,PANEL_LABEL_STRING, "Cannot delete beyond end",0); Beep(); return(FALSE); } if (len>offset) { xv_set(frame,FRAME_RIGHT_FOOTER, "Cannot delete beyond end",0); xv_set(right_foot,PANEL_LABEL_STRING, "Cannot delete beyond end",0); Beep(); return(FALSE); } for(j=offset-len;jelement[seqnum].cmask) putcmask(seq,j-seq->offset,getcmask(seq,j+seq->offset)); } aln->element[seqnum].seqlen = aln->element[seqnum].seqlen-len; RedrawAllNAViews(seqnum,offset-len); return(TRUE); } DeleteViolate(aln,this_seq,len,offset) NA_Alignment *aln; NA_Sequence* this_seq; int len,offset; { int i,j,prot,violated = FALSE; prot = this_seq->protect; if((prot & PROT_BASE_CHANGES)==0) { if(this_seq->elementtype == DNA || this_seq->elementtype == RNA) { for(j=offset-len;jelementtype == PROTEIN) { for(j=offset-len;jelementtype == MASK) for(j=offset-len;jsequence[j] != '0') violated = TRUE; } if((prot & PROT_WHITE_SPACE)==0) { if(this_seq->elementtype == DNA || this_seq->elementtype == RNA) { for(j=offset-len;jelementtype == PROTEIN) { for(j=offset-len;jelementtype == DNA || this_seq->elementtype == RNA) { for(j=offset-len;jelementtype == PROTEIN) { for(j=offset-len;joffset) || (offset > this_seq->seqlen + this_seq->offset)) violated = TRUE; */ if(len>offset) violated = TRUE; return(violated); } RedrawAllNAViews(seqnum,start) int seqnum,start; { extern NA_Alignment *DataSet; extern Canvas EditCan; extern int SCALE; NA_DisplayData *ddata; NA_Alignment *aln; NA_Sequence *this_seq; Scrollbar hsc,vsc; Display *dpy; GC gc; Xv_window win,view; Window xwin; int hstart,vstart,hend,j; if(DataSet == NULL) return; aln = (NA_Alignment*)DataSet; ddata = (NA_DisplayData*)(aln->na_ddata); if(ddata == NULL) return; dpy = (Display *)xv_get(EditCan, XV_DISPLAY); gc = DefaultGC(dpy,DefaultScreen(dpy)); for(j=0;j<(int)xv_get(EditCan,OPENWIN_NVIEWS);j++) { view = (Xv_window)xv_get(EditCan,OPENWIN_NTH_VIEW,j,0); win = xv_get(view,CANVAS_VIEW_PAINT_WINDOW); xwin = (Window)xv_get(win,XV_XID); hsc = (Scrollbar)xv_get(EditCan,OPENWIN_HORIZONTAL_SCROLLBAR, view); vsc = (Scrollbar)xv_get(EditCan,OPENWIN_VERTICAL_SCROLLBAR, view); hstart = xv_get(hsc,SCROLLBAR_VIEW_START); vstart = xv_get(vsc,SCROLLBAR_VIEW_START); hend = hstart + xv_get(hsc,SCROLLBAR_VIEW_LENGTH) * SCALE; if(start < hend) DrawNAColor(EditCan,ddata,xwin,hstart, vstart,seqnum, MAX(start,hstart),hend, dpy,gc,ddata->color_type,FALSE); } return; } ResetPos(ddata) NA_DisplayData *ddata; { NA_Base *seq; int j,total = 0,maxpos; NA_Sequence *elem; if(ddata == NULL) return; elem = &(ddata->aln->element[ddata->cursor_y]); if(elem->sequence == NULL) return; maxpos = MAX(0,MIN(ddata->cursor_x,elem->seqlen+elem->offset)); switch (elem->elementtype) { case DNA: case RNA: for(j=elem->offset;j<=maxpos;j++) if((getelem(elem,j) & 15) && !(getelem(elem,j) & 128)) total++; break; case PROTEIN: for(j=0;j<=maxpos;j++) if((getelem(elem,j) != ' ') && (getelem(elem,j) != '-') && (getelem(elem,j) != '~')) total++; break; case MASK: case TEXT: default: total = ddata->cursor_y; break; } ddata->position = total; return; } Beep() { #ifdef SUN4 FILE *audio; int j; audio = fopen("/dev/audio","w"); if (audio != NULL) for(j=0;j<20;j++) fprintf(audio,"zzzzz "); fclose(audio); #else fprintf(stderr,"%c",7); fflush(stderr); #endif return; } Keyclick() { #ifdef SUN4 FILE *audio; int j; audio = fopen("/dev/audio","w"); if (audio != NULL) for(j=0;j<10;j++) fprintf(audio,"zzzzzzzzzz "); fclose(audio); #else fprintf(stderr,"%c",7); fflush(stderr); #endif return; } putelem(a,b,c) NA_Sequence *a; int b; NA_Base c; { int j,newsize; NA_Base *temp; if(b>=(a->offset+a->seqmaxlen)) Warning("Putelem:insert beyond end of sequence space ignored"); else if(b >= (a->offset)) a->sequence[b-(a->offset)] = c; else { temp =(NA_Base*)Calloc(a->seqmaxlen+a->offset-b, sizeof(NA_Base)); switch (a->elementtype) { /* * Pad out with gap characters fron the point of insertion to the offset */ case MASK: for(j=b;joffset;j++) temp[j-b]='0'; break; case DNA: case RNA: for(j=b;joffset;j++) temp[j-b]='\0'; break; case PROTEIN: for(j=b;joffset;j++) temp[j-b]='-'; break; case TEXT: default: for(j=b;joffset;j++) temp[j-b]=' '; break; } for(j=0;jseqmaxlen;j++) temp[j+a->offset-b] = a->sequence[j]; Cfree(a->sequence); a->sequence = temp; a->seqlen += (a->offset - b); a->seqmaxlen +=(a->offset - b); a->offset = b; a->sequence[0] = c; } return; } putcmask(a,b,c) NA_Sequence *a; int b; int c; { int j,newsize; int *temp; if(b >= (a->offset) ) a->cmask[b-(a->offset)] = c; return; } getelem(a,b) NA_Sequence *a; int b; { if(a->seqlen == 0) return(-1); if(boffset || (b>a->offset+a->seqlen)) switch(a->elementtype) { case DNA: case RNA: return(0); case PROTEIN: case TEXT: return('~'); case MASK: return('0'); default: return('-'); } else return(a->sequence[b-a->offset]); } /*------Added by Scott Ferguson, Exxon Research & Engineering Co. ---------*/ isagap(a,b) NA_Sequence *a; int b; { int j,newsize; NA_Base *temp; if (b < a->offset) return(1); /* Check to see if base at given position is a gap */ switch (a->elementtype) { case MASK: if (a->sequence[b-a->offset] == '0') return(1); else return(0); case DNA: case RNA: if (a->sequence[b-a->offset] == '\0') return(1); else return(0); case PROTEIN: if (a->sequence[b-a->offset] == '-') return(1); else return(0); case TEXT: default: if (a->sequence[b-a->offset] == ' ') return(1); else return(0); } } /*-END:-Added by Scott Ferguson, Exxon Research & Engineering Co. ---------*/ SubSelect(aln,shift_down,x1,y1,x2,y2) NA_Alignment *aln; int shift_down,x1,y1,x2,y2; { int j; NA_Sequence *next_elem; if(aln == NULL) return; if(!shift_down) for(j=0;jnumelements;j++) if(aln->element[j].subselected == TRUE) { aln->element[j].subselected = FALSE; RedrawAllNAViews(j,aln->min_subselect); } if(x1==x2 && y1==y2) { if(!shift_down) { if(aln->selection_mask) for(j=0;jselection_mask_len;j++) aln->selection_mask[j] = '0'; return; } else x1 = aln->min_subselect; } if(x1>x2) { j=x1; x1=x2; x2=j; } if(y1>y2) { j=y1; y1=y2; y2=j; } if(aln->maxlen > aln->selection_mask_len) { if(aln->selection_mask != NULL) Cfree(aln->selection_mask); aln->selection_mask = (char*)Calloc(aln->maxlen,sizeof(char)); aln->selection_mask_len = aln->maxlen; } if(shift_down) { /* * Logical or select within the region */ for(j=x1;j<=x2;j++) aln->selection_mask[j] = '1'; /* * Logical or select across selected seqeunces */ for(j=y1;j<=y2;j++) { aln->element[j].subselected = TRUE; /* * Impose groups... */ for(next_elem= &(aln->element[j]); next_elem!=NULL; next_elem=next_elem->groupf) next_elem->subselected = TRUE; for(next_elem= &(aln->element[j]); next_elem!=NULL; next_elem=next_elem->groupb) next_elem->subselected = TRUE; } for(j=0;jnumelements;j++) if(aln->element[j].subselected) RedrawAllNAViews(j,MIN(x1,aln->min_subselect)); } else { for(j=0;jselection_mask_len;j++) if(j>x2 || jselection_mask[j] = '0'; else aln->selection_mask[j] = '1'; for(j=0;jnumelements;j++) aln->element[j].subselected = FALSE; for(j=0;jnumelements;j++) if(j<=y2 && j>=y1) { aln->element[j].subselected = TRUE; /* * Impose groups... */ for(next_elem= &(aln->element[j]); next_elem!=NULL; next_elem=next_elem->groupf) next_elem->subselected = TRUE; for(next_elem= &(aln->element[j]); next_elem!=NULL; next_elem=next_elem->groupb) next_elem->subselected = TRUE; } for(j=0;jnumelements;j++) if(aln->element[j].subselected == TRUE) RedrawAllNAViews(j,MIN(x1,aln->min_subselect)); } if(shift_down) aln->min_subselect = MIN(x1,aln->min_subselect); else aln->min_subselect = x1; return; }