VOID RedrawArea(UWORD startx, struct line_node *startline, UWORD stopx, struct line_node *stopline, struct InstData *data) { struct pos_info pos1, pos2; LONG line_nr1 = LineToVisual(startline, data) - 1; LONG line_nr2 = LineToVisual(stopline, data) - 1; ENTER(); OffsetToLines(startx, startline, &pos1, data); if(stopx >= stopline->line.Length) stopx = stopline->line.Length-1; OffsetToLines(stopx, stopline, &pos2, data); if((line_nr1 += pos1.lines-1) < 0) line_nr1 = 0; if((line_nr2 += pos2.lines-1) >= data->maxlines) line_nr2 = data->maxlines-1; if(line_nr1 <= line_nr2) { DumpText(data->visual_y+line_nr1, line_nr1, line_nr2+1, TRUE, data); } LEAVE(); }
/*---------------------* * Split line into two * *---------------------*/ BOOL SplitLine(LONG x, struct line_node *line, BOOL move_crsr, struct UserAction *buffer, struct InstData *data) { struct line_node *newline; struct line_node *next; struct pos_info pos; LONG line_nr, lines; ULONG c; UWORD crsr_x = data->CPos_X; struct line_node *crsr_l = data->actualline; ENTER(); OffsetToLines(x, line, &pos, data); lines = pos.lines; next = line->next; if((newline = AllocLine(data)) != NULL) { UWORD *styles = line->line.Styles; UWORD *newstyles = NULL; UWORD *colors = line->line.Colors; UWORD *newcolors = NULL; data->HasChanged = TRUE; Init_LineNode(newline, line, line->line.Contents+x, data); newline->line.Color = line->line.Color; newline->line.Flow = line->line.Flow; newline->line.Separator = line->line.Separator; if(buffer != NULL) { newline->line.Color = buffer->del.style; newline->line.Flow = buffer->del.flow; newline->line.Separator = buffer->del.separator; } if(styles != NULL) { LONG style = 0; LONG length = 0; UWORD *ostyles; while(*styles++ <= x+1) { if(*styles > 0xff) style &= *styles++; else style |= *styles++; } styles--; ostyles = styles; while(*(styles+length) != EOS) length += 2; length = (length*2) + 16; if((newstyles = MyAllocPooled(data->mypool, length)) != NULL) { UWORD *nstyles = newstyles; if(isFlagSet(style, BOLD)) { *nstyles++ = 1; *nstyles++ = BOLD; } if(isFlagSet(style, ITALIC)) { *nstyles++ = 1; *nstyles++ = ITALIC; } if(isFlagSet(style, UNDERLINE)) { *nstyles++ = 1; *nstyles++ = UNDERLINE; } while(*styles != EOS) { *nstyles++ = (*styles++) - x; *nstyles++ = *styles++; } *nstyles = EOS; } if(isFlagSet(style, BOLD)) { *ostyles++ = x+1; *ostyles++ = ~BOLD; } if(isFlagSet(style, ITALIC)) { *ostyles++ = x+1; *ostyles++ = ~ITALIC; } if(isFlagSet(style, UNDERLINE)) { *ostyles++ = x+1; *ostyles++ = ~UNDERLINE; } if(x != 0) ostyles = line->line.Styles; *ostyles = EOS; } newline->line.Styles = newstyles; if(colors != NULL) { UWORD color = GetColor(x, line); UWORD length = 0; UWORD *ocolors; while(*colors <= x+1) { colors += 2; } ocolors = colors; while(*(colors+length) != 0xffff) length += 2; length = (length*2) + 16; if((newcolors = MyAllocPooled(data->mypool, length)) != NULL) { UWORD *ncolors = newcolors; if(color && *colors-x != 1) { *ncolors++ = 1; *ncolors++ = color; } while(*colors != 0xffff) { *ncolors++ = (*colors++) - x; *ncolors++ = *colors++; } *ncolors = 0xffff; } if(x != 0) ocolors = line->line.Colors; *ocolors = 0xffff; } newline->line.Colors = newcolors; newline->next = next; if(next != NULL) next->previous = newline; *(line->line.Contents+x) = '\n'; *(line->line.Contents+x+1) = '\0'; line->line.Length = x+1; /*------------------*/ c = line->visual; line->visual = VisualHeight(line, data); CompressLine(line, data); line_nr = LineToVisual(line, data) + line->visual - 1; if(line_nr < 0) line_nr = 0; if(move_crsr) { data->CPos_X = 0; data->actualline = data->actualline->next; } if(x == 0) { line->line.Color = 0; line->line.Separator = 0; if(!(line->previous && line->previous->line.Flow == line->line.Flow)) { line->line.Flow = MUIV_TextEditor_Flow_Left; } if(line_nr != data->maxlines) { data->totallines += 1; if(data->fastbackground) { if(line_nr) { ScrollDown(line_nr-1, 1, data); PrintLine(0, line, line_nr, FALSE, data); } else { ScrollDown(line_nr, 1, data); } } else DumpText(data->visual_y+line_nr-1, line_nr-1, data->maxlines, TRUE, data); } else { data->visual_y++; data->totallines += 1; if(isFlagClear(data->flags, FLG_Quiet)) { struct Hook *oldhook; oldhook = InstallLayerHook(data->rport->Layer, LAYERS_NOBACKFILL); ScrollRasterBF(data->rport, 0, data->height, data->xpos, data->ypos, data->xpos + data->innerwidth - 1, (data->ypos + ((data->maxlines-1) * data->height)) - 1); InstallLayerHook(data->rport->Layer, oldhook); PrintLine(0, line, data->maxlines-1, FALSE, data); if(!data->fastbackground) { DumpText(data->visual_y+data->maxlines-1, data->maxlines-1, data->maxlines, TRUE, data); } } } RETURN(TRUE); return(TRUE); } if(x == (LONG)(line->line.Length + newline->line.Length - 2)) { data->totallines += 1; if(buffer == NULL) { line->next->line.Color = 0; line->next->line.Separator = 0; } SetCursor(crsr_x, crsr_l, FALSE, data); if(line_nr < data->maxlines) { if(data->fastbackground) { ScrollDown(line_nr, 1, data); if(line_nr+1 <= data->maxlines) PrintLine(0, line->next, line_nr+1, FALSE, data); } else DumpText(data->visual_y+line_nr, line_nr, data->maxlines, TRUE, data); } RETURN(TRUE); return(TRUE); } x = line->line.Length; OffsetToLines(x-1, line, &pos, data); if(((ULONG)(line->visual + line->next->visual) >= c) && (line->visual == lines)) { if((ULONG)(line->visual + line->next->visual) > c) data->totallines += 1; PrintLine(pos.bytes, line, line_nr, TRUE, data); if((line_nr+line->next->visual-1 < data->maxlines) && ((ULONG)(line->visual + line->next->visual) > c)) { ScrollDown(line_nr+line->next->visual-1, 1, data); } } else { PrintLine((x-1)-pos.x, line, line_nr, TRUE, data); if((line_nr < data->maxlines) && ((ULONG)(line->visual + line->next->visual) < c)) { data->totallines -= 1; ScrollUp(line_nr, 1, data); } } /*------------------*/ line = line->next; line_nr++; c = 0; while((c < line->line.Length) && (line_nr <= data->maxlines)) c = c + PrintLine(c, line, line_nr++, TRUE, data); /* Her printes !HELE! den nye linie, burde optimeres! */ RETURN(TRUE); return (TRUE); } else { RETURN(FALSE); return (FALSE); } }