📄 codearea.c
字号:
modified=TRUE; if(insertmode) //insert mode { if(totalcol+1<CODE_QUANTUM) { for(i=0;i<totalcol-curcol;i++) { page->data[line][totalcol-i]=page->data[line][totalcol-i-1]; } page->data[line][curcol]=COLOR_PAIR(GetColor())|key; totalcol++; maxcol=(maxcol>totalcol)?(maxcol):(totalcol); if(tempx+1>=GetWidth()) { offcol++; ShowPage(offcol*TABSIZE); wmove(basewin,tempy,tempx-TABSIZE+1); } else { ShowLine(page->data[line],curcol,GetWidth()-tempx,tempy,tempx); wmove(basewin,tempy,tempx+1); } curcol++; ret = UPDATE_STATUS; } } else //replace mode { if(curcol+1<CODE_QUANTUM) { if(curcol+1>totalcol) //new character { totalcol++; maxcol=(maxcol>totalcol)?(maxcol):(totalcol); } if(tempx+1>=GetWidth()) { offcol++; page->data[line][curcol]=COLOR_PAIR(GetColor())|key; ShowPage(offcol*TABSIZE); wmove(basewin,tempy,tempx-TABSIZE+1); } else { page->data[line][curcol]=COLOR_PAIR(GetColor())|key; waddch(basewin,COLOR_PAIR(GetColor())|key); } curcol++; ret = UPDATE_STATUS; } } break; } return ret;}void CodeArea::DestroyCodeArea(){ Trim(); DestroyBaseWindow();}int CodeArea::Active(int item){ if(active!=TRUE) { active=TRUE; } return active;}int CodeArea::Active(){ if (active!=TRUE) { active=TRUE; } if(insertmode) curs_set(1); else curs_set(2); ShowPage(); //wmove(basewin,currow,curcol); return active;}int CodeArea::IsActive(){ return active;}int CodeArea::LostActive(){ if(active!=FALSE) { active=FALSE; } curs_set(0); return active;}int CodeArea::GetCurCol(){ return curcol;}int CodeArea::GetCurRow(){ return currow;}int CodeArea::GetTotalRow(){ return totalrow;}int CodeArea::GetMaxCol(){ return maxcol;}int CodeArea::Trim(){ PageList next, dptr; next=NULL; dptr=pagelist->next; for (;dptr && dptr!=pagelist;dptr = next) { next=dptr->next; FreePage(dptr); } FreePage(pagelist); return 0;}PageList CodeArea::AllocPage(){ int i; PageList page=NULL; if ((page=(PageList)malloc(sizeof(Page)))==NULL) goto nomem_page; page->quantum=CODE_QUANTUM; page->qset=CODE_QSET; page->data=NULL; page->next=NULL; page->prev=NULL; if ( (page->data=(chtype **)malloc(sizeof(chtype *)*CODE_QSET)) ==NULL) goto nomem_data; memset(page->data, 0, sizeof(chtype *)*CODE_QSET); for(i=0;i<CODE_QSET;i++) { page->data[i]=(chtype*)malloc(sizeof(chtype *)*CODE_QUANTUM); if( page->data[i] ==NULL) goto nomem_qset; memset(page->data[i], 0, sizeof(chtype *)*CODE_QUANTUM); } goto success;nomem_qset: while(i>0) { if(page->data[i-1]) free(page->data[i-1]); i--; } free(page->data); page->data=NULL;nomem_data: free(page); page=NULL;nomem_page: return page;success: return page;}void CodeArea::InsertPage(PageList prev,PageList newpage){ PageList next=prev->next; prev->next=newpage; newpage->prev=prev; next->prev=newpage; newpage->next=next;}void CodeArea::FreePage(PageList page){ int i=0; PageList prev,next; prev=page->prev; next=page->next; if (page->data) { for (i = 0; i <CODE_QSET; i++) if (page->data[i]) free(page->data[i]); free(page->data); page->data=NULL; } if(page!=page->prev || page!=page->next) { prev->next=next; next->prev=prev; if(page==pagelist) { pagelist=next; } } free(page); page=NULL;}void CodeArea::ShowPage(){ int y,x; getyx(basewin,y,x); if ( (currow-y)<0) {printf("\n%d %d %d",currow,y,currow-y);exit(1);} ShowPage(NULL,(currow-y)%CODE_QSET,CODE_QSET,offcol*TABSIZE,GetWidth(),0,0); wmove(basewin,y,x);}void CodeArea::ShowPage(int offcols){ int y,x; getyx(basewin,y,x); if ( (currow-y)<0 ) {endwin();printf("\n%d %d %d",currow,y,currow-y);exit(1);} ShowPage(NULL,(currow-y)%CODE_QSET,CODE_QSET,offcols,GetWidth(),0,0); wmove(basewin,y,x);}void CodeArea::ShowPage(PageList page,int beginline,int lines,int begincol,int cols,int y,int x){ int i, j; int line=beginline%CODE_QSET; int endcol=begincol + cols; int begrow=y; offline=line; if(page==NULL) page=beginpage; else beginpage=page; for (i = 0; i < lines; i++) { wmove (basewin, begrow, x); for (j = begincol; j < endcol; j++) { if(j<CODE_QUANTUM && page->data[line][j]!='\0') waddch (basewin,page->data[line][j]); else waddch (basewin,COLOR_PAIR(GetColor())|' '); } line++; begrow++; if(line>=CODE_QSET) { if(page->next!=pagelist) { page=page->next; } else { draw_box (begrow,0,GetHeight()-begrow,GetWidth(),COLOR_PAIR(GetColor())|' ',COLOR_PAIR(GetColor())); break; } line=0; } }}void CodeArea::ShowLine(chtype *line, int beginpos, int chars, int row, int col){ int i=0; for(i=0;i<chars;i++) { if(beginpos+i<totalcol && line[beginpos+i]!='\0') mvwaddch(basewin,row,col,line[beginpos+i]); else mvwaddch(basewin,row,col,COLOR_PAIR(GetColor())|' '); col++; } wrefresh(basewin);}//line:base on 0void CodeArea::ShiftLinesDown(PageList pg,int line,int shift){ PageList source=pagelist->prev; PageList target=NULL; int pages=(int)(totalrow/GetHeight())+1; int lines=0; int j=0; //shifted pages int i=0;//; int rows=totalrow; while(source!=pg) { lines=rows-(pages-1)*CODE_QSET; rows=rows-lines; while(lines>0) { j=(int)( (lines-1+shift)/CODE_QSET );//shift no.j line(start from 0) target=source; while(j>0) { target=target->next; j--; } for(j=0;j<CODE_QUANTUM;j++) target->data[(lines+shift-1)%CODE_QSET][j]=source->data[lines-1][j]; lines--; } source=source->prev; pages--; } if(source==pg) { i=rows-(pages-1)*CODE_QSET; lines=i-line-1; while(lines>0) { j=(int)( (i-1+shift)/CODE_QSET ); target=source; while(j>0) { target=target->next; j--; } for(j=0;j<CODE_QUANTUM;j++) target->data[(i-1+shift)%CODE_QSET][j]=source->data[i-1][j]; lines--; i--; } }}void CodeArea::ShiftLinesUp(PageList pg,int line,int shift){ PageList source=pg; PageList target=NULL; int pageno=(int)(line/CODE_QSET)+1; int pages=(int)((totalrow-1)/CODE_QSET)+1; int frees=0; int lines=0; int k=0; int j=0; int i=0; if(line%CODE_QSET==0) goto skip; line=(line)%CODE_QSET; lines=(pageno<pages)?(CODE_QSET-line):(totalrow-(pageno-1)*CODE_QSET-line); while(lines>0) { j=line-shift; target=source; while(j<0) { target=target->prev; j=j+CODE_QSET; } for(k=0;k<CODE_QUANTUM;k++) { target->data[j][k]=source->data[line][k]; source->data[line][k]='\0'; } line++; lines--; } pageno++; source=source->next;skip: while(source!=pagelist) { lines=(pageno<pages)?(CODE_QSET):(totalrow-(pageno-1)*CODE_QSET); for(i=0;i<lines;i++) { j=i-shift; target=source; while(j<0) { target=target->prev; j=j+CODE_QSET; } for(k=0;k<CODE_QUANTUM;k++) { target->data[j][k]=source->data[i][k]; source->data[i][k]='\0'; } } source=source->next; pageno++; } frees=(int)((totalrow-1)/CODE_QSET) - (int)((totalrow-1-shift)/CODE_QSET); if( frees>0 )//need to free some pages { for(i=0;i<frees;i++) { if(pagelist->prev==beginpage) beginpage=pagelist->prev->prev; FreePage(pagelist->prev); } } source=pagelist->prev; shift=(totalrow-shift)%CODE_QSET; if (shift==0)//shift==0 means beginpage points to a whole page goto over; for(i=shift;i<CODE_QSET;i++) for(j=0;j<CODE_QUANTUM;j++) source->data[i][j]='\0';over: return;}void CodeArea::CopyLineDown(chtype *source,int begin,int len,chtype *target,int tarbeg,int shift,int clearup){ int i=0; int line=currow%CODE_QSET; int pages=(int)(shift/CODE_QSET); PageList pg=LocatePage(NULL,currow); if(source==NULL) source=LocatePage(NULL,currow)->data[line]; if(target==NULL) { while(pages>0) { pg=pg->next; pages--; } if((line+shift%CODE_QSET)>=CODE_QSET) target=pg->next->data[(line+shift)%CODE_QSET]; else target=pg->data[(line+shift)%CODE_QSET]; } if(begin>=CODE_QUANTUM) goto err; if(begin+len>=CODE_QUANTUM) goto err; if(target==NULL || source==NULL) goto err; for(i=0;i<(CODE_QUANTUM-tarbeg-1);i++) { if(i<len) { target[tarbeg+i]=source[begin+i]; if(clearup==TRUE) source[begin+i]='\0'; } else target[tarbeg+i]='\0'; }err: return; }void CodeArea::CopyLineUp(chtype *source,int begin,int len,chtype *target,int tarbeg,int shift,int clearup){ int i=0; int line=currow%CODE_QSET; int pages=(int)(shift/CODE_QSET); PageList pg=LocatePage(NULL,currow); if(source==NULL) source=LocatePage(NULL,currow)->data[line]; if(target==NULL) { while(pages>0) { pg=pg->prev; pages--; } if( line-shift%CODE_QSET <0 ) target=pg->prev->data[(line-shift+(pages+1)*CODE_QSET)%CODE_QSET]; else target=pg->data[(line-shift%CODE_QSET)%CODE_QSET]; } if(begin>=CODE_QUANTUM) goto err; if(begin+len>=CODE_QUANTUM) goto err; if(target==NULL || source==NULL) goto err; for(i=0;i<(CODE_QUANTUM-tarbeg-1);i++) { if(i<len) { target[tarbeg+i]=source[begin+i]; if(clearup==TRUE) source[begin+i]='\0'; } else target[tarbeg+i]='\0'; }err: return; }PageList CodeArea::LocatePage(PageList page,int row){ int pg=(int)(row/CODE_QSET); if(page==NULL) page=beginpage; else beginpage=page; while(pg>curpage) { page=page->next; pg--; } while(pg<curpage) { page=page->prev; pg++; } return page; }int CodeArea::GetCurColWidth(PageList page,int line){ int j=0; page=LocatePage(page,line); line=line % CODE_QSET; while(page->data[line][j]!='\0') { if(page->data[line][j]=='\t') j=j+TABSIZE; else j=j+1; } return (j<CODE_QUANTUM)?(j):(CODE_QUANTUM-1);}void CodeArea::linecolor(chtype *line){ int i, k,pos=0; int wordbegin,wordend; int color=GetColor(); char a[MAXIDLEN + 1]; char ch=line[pos]; char prech;again: wordbegin=0; wordend=0; while(ch==' ' && pos+1<CODE_QUANTUM) { line[pos]=line[pos]|COLOR_PAIR(GetColor()); pos++; ch=line[pos]; } if(pos+1>=CODE_QUANTUM || ch=='\0') goto over; if (multiremark) { if(ch=='*') { line[pos]=line[pos]|COLOR_PAIR(COLOR_GREEN_BLUE); GETCH(pos); if(ch=='/') { line[pos]=line[pos]|COLOR_PAIR(COLOR_GREEN_BLUE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -