/*---------------------* * 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); } }
// Scroll the icons void backdrop_scroll_objects(BackdropInfo *info,short off_x,short off_y) { // Lock window GetSemaphore(&info->window_lock,SEMF_EXCLUSIVE,0); // Window open? if (info->window) { short damage=0,clear=0; // Bounds-check the deltas if (off_x<0 && off_x<-RECTWIDTH(&info->size)) clear=1; else if (off_x>0 && off_x>RECTWIDTH(&info->size)) clear=1; else if (off_y<0 && off_y<-RECTHEIGHT(&info->size)) clear=1; else if (off_y>0 && off_y>RECTHEIGHT(&info->size)) clear=1; // Clear instead of scrolling? if (clear) { // Clear the whole window EraseRect( info->window->RPort, info->size.MinX, info->size.MinY, info->size.MaxX, info->size.MaxY); } // Scroll else { // Check for 39 if(((struct Library *)GfxBase)->lib_Version>=39) { // Scroll backdrop window ScrollRasterBF( info->window->RPort, off_x,off_y, info->size.MinX, info->size.MinY, info->size.MaxX, info->size.MaxY); } // No backfills else { // Scroll backdrop window ScrollRaster( info->window->RPort, off_x,off_y, info->size.MinX, info->size.MinY, info->size.MaxX, info->size.MaxY); } // Damaged simple-refresh? if (info->window->Flags&WFLG_SIMPLE_REFRESH && info->window->WLayer->Flags&LAYERREFRESH) { // Forbid #ifdef LOCKLAYER_OK LockScreenLayer(info->window->WScreen); #else Forbid(); #endif // Begin refreshing BeginRefresh(info->window); // Clear the new bits EraseRect( info->window->RPort, info->size.MinX, info->size.MinY, info->size.MaxX, info->size.MaxY); // End refreshing for the moment EndRefresh(info->window,FALSE); damage=1; } } // Got temporary region? if (info->temp_region) { struct Rectangle rect; // Get refresh region rect.MinX=(off_x==0)?info->size.MinX:((off_x>0)?info->size.MaxX-off_x:info->size.MinX); rect.MaxX=(off_x==0)?info->size.MaxX:((off_x>0)?info->size.MaxX:info->size.MinX-off_x); rect.MinY=(off_y==0)?info->size.MinY:((off_y>0)?info->size.MaxY-off_y:info->size.MinY); rect.MaxY=(off_y==0)?info->size.MaxY:((off_y>0)?info->size.MaxY:info->size.MinY-off_y); // Bounds check region if (rect.MinX<info->size.MinX) rect.MinX=info->size.MinX; if (rect.MinY<info->size.MinY) rect.MinY=info->size.MinY; if (rect.MaxX>info->size.MaxX) rect.MaxX=info->size.MaxX; if (rect.MaxY>info->size.MaxY) rect.MaxY=info->size.MaxY; // Add to damage list? if (damage) { // Or rectangle in OrRectRegion(info->window->WLayer->DamageList,&rect); } // Manually refresh else { // Set refresh region ClearRegion(info->temp_region); OrRectRegion(info->temp_region,&rect); // Install region InstallClipRegion(info->window->WLayer,info->temp_region); } } // Manual refresh? if (!damage) { // Refresh backdrop_show_objects(info,BDSF_NO_CLIP); // Remove clip region InstallClipRegion(info->window->WLayer,0); } // Automatic refresh else { // Lister? if (info->lister) lister_refresh_callback(IDCMP_REFRESHWINDOW,info->window,info->lister); // Other type else { struct IntuiMessage msg; // Fake IntuiMessage msg.Class=IDCMP_REFRESHWINDOW; // Handle refresh backdrop_idcmp(info,&msg,0); } // Enable multi-tasking #ifdef LOCKLAYER_OK UnlockScreenLayer(info->window->WScreen); #else Permit(); #endif } } // Unlock window FreeSemaphore(&info->window_lock); }