extern void WndSelPopPiece( a_window *wnd, bool paint_immed ) { wnd_row row; wnd_coord *start; wnd_coord *end; int piece; int buff_size; char *ptr; int first; int len; wnd_line_piece line; _Clr( wnd, WSW_SELECTING ); _Clr( wnd, WSW_SELECTING_WITH_KEYBOARD ); WndSelEnds( wnd, &start, &end ); if( _Isnt( wnd, WSW_SUBWORD_SELECT ) || ( start->row == end->row && start->piece == end->piece && start->col == end->col ) ) { WndGetLine( wnd, start->row, start->piece, &line ); GoBackward( wnd, start, &line ); WndGetLine( wnd, end->row, end->piece, &line ); GoForward( wnd, end, &line ); if( end->row != start->row ) { GUIWndDirtyRow( wnd->gui, end->row ); GUIWndDirtyRow( wnd->gui, start->row ); } else if( paint_immed ) { GUIWndDirtyRow( wnd->gui, start->row ); } else { WndDirtyScreenRange( wnd, start, end->col ); } } buff_size = 0; for( row = start->row; row <= end->row; ++row ) { for( piece = 0; ; ++piece ) { if( !WndGetLine( wnd, row, piece, &line ) ) break; if( WndSelected( wnd, &line, row, piece, &first, &len ) ) { buff_size += len + 1; } } } WndFree( wnd->popitem ); wnd->popitem = WndMustAlloc( buff_size+2 ); ptr = wnd->popitem; for( row = start->row; row <= end->row; ++row ) { for( piece = 0; ; ++piece ) { if( !WndGetLine( wnd, row, piece, &line ) ) break; if( WndSelected( wnd, &line, row, piece, &first, &len ) ) { if( ptr != wnd->popitem ) *ptr++ = ' '; memcpy( ptr, line.text+first, len ); ptr += len; } } } *ptr = '\0'; }
bool WndSetCache( a_window *wnd, bool on ) { bool old; old = _Is( wnd, WSW_CACHE_LINES ); if( on ) { _Set( wnd, WSW_CACHE_LINES ); } else { _Clr( wnd, WSW_CACHE_LINES ); } return( old ); }
extern bool WndGetLine( a_window *wnd, int row, int piece, wnd_line_piece *line ) { int virtual_row; bool success; virtual_row = WndVirtualRow( wnd, row ); if( _Is( wnd, WSW_CACHE_LINES ) ) { if( FindCacheLine( wnd, virtual_row, piece, line ) ) return( TRUE ); } line->attr = WndPlainAttr; line->indent = 0; line->static_text = FALSE; line->tabstop = TRUE; line->hot = FALSE; line->extent = WND_NO_EXTEND; line->master_tabstop = FALSE; line->underline = FALSE; line->draw_bar = FALSE; line->vertical_line = FALSE; line->draw_hook = FALSE; line->draw_line_hook = FALSE; line->bitmap = FALSE; line->use_piece0_attr = FALSE; line->use_prev_attr = FALSE; line->use_key = TRUE; line->text = ""; line->hint = ""; if( virtual_row < -wnd->title_size ) return( FALSE ); if( row == wnd->u.button_down.row && piece == wnd->u.button_down.piece ) { _Set( wnd, WSW_ALTERNATE_BIT ); } success = wnd->info->getline( wnd, virtual_row, piece, line ); _Clr( wnd, WSW_ALTERNATE_BIT ); if( success ) { if( !(line->bitmap|line->vertical_line|line->draw_hook|line->draw_line_hook|line->draw_bar) ) { line->length = strlen( line->text ); } if( virtual_row > wnd->max_row ) wnd->max_row = virtual_row; } if( success ) { if( _Is( wnd, WSW_CACHE_LINES ) ) { SetCacheLine( wnd, virtual_row, piece, line ); } } return( success ); }
void WndForcePaint( a_window *wnd ) { _Set( wnd, WSW_NOT_TO_SCREEN ); if( wnd->max_indent == 0 ) WndPaintRows( wnd, 0, wnd->rows ); _Clr( wnd, WSW_NOT_TO_SCREEN ); }
void WndPaintDirt( a_window *wnd ) { int i; wnd_line_piece line; wnd_line_piece next_piece_line; gui_rect rect; wnd_dirt *dirt; gui_coord size; gui_coord half_char; a_window *next; // a_window *last; // last = NULL; for( wnd = WndNext( NULL ); wnd != NULL; wnd = next ) { next = WndNext( wnd ); if( wnd->vscroll_pending != 0 ) { if( wnd->hscroll_pending != -1 ) { _Set( wnd, WSW_REPAINT ); } if( _Is( wnd, WSW_REPAINT ) ) { if( wnd->hscroll_pending != -1 ) { GUIInitHScroll( wnd->gui, wnd->hscroll_pending ); } WndRepaint( wnd ); wnd->hscroll_pending = -1; wnd->vscroll_pending = 0; } else { for( i = 0; i < wnd->title_size; ++i ) { GUIDrawTextExtent( wnd->gui, " ", 1, i, 0, GUI_BACKGROUND, GUI_NO_COLUMN ); } GUIDoVScrollClip( wnd->gui, wnd->vscroll_pending, wnd->title_size, wnd->rows - 1 ); wnd->vscroll_pending = 0; } } if( _Is( wnd, WSW_REPAINT ) ) { _Clr( wnd, WSW_REPAINT ); WndKillCacheLines( wnd ); WndCheckCurrentValid( wnd ); GUIWndDirty( wnd->gui ); if( wnd->max_indent != 0 && wnd->width >= wnd->max_indent ) { GUISetHScroll( wnd->gui, 0 ); wnd->hscroll_pending = -1; GUISetHScrollRange( wnd->gui, wnd->max_indent ); } next = wnd; } else { for( i = 0; i < wnd->dirtyrects; ++i ) { dirt = &wnd->dirty[i]; if( dirt->row < 0 ) continue; if( dirt->row >= wnd->rows ) continue; if( dirt->piece == WND_NO_PIECE ) { if( !WndGetLine( wnd, dirt->row, 0, &line ) ) continue; GUIWndDirtyRow( wnd->gui, dirt->row ); } else { if( !WndGetLine( wnd, dirt->row, dirt->piece, &line ) ) continue; if( line.bitmap ) { GUIGetHotSpotSize( line.text[0], &size ); rect.x = line.indent; rect.y = dirt->row * wnd->max_char.y; rect.width = line.length; rect.height = size.y; } else if( dirt->col != WND_NO_COL ) { if( line.length == 0 ) line.text = " "; rect.x = line.indent; rect.x += GUIGetExtentX(wnd->gui, line.text, dirt->col); rect.y = dirt->row * wnd->max_char.y; rect.width = GUIGetExtentX( wnd->gui, line.text+dirt->col, dirt->end_col-dirt->col+GUICharLen( line.text[dirt->col] ) ); rect.height = wnd->max_char.y; } else if( line.extent == WND_MAX_EXTEND || line.master_tabstop ) { rect.width = 0; rect.height = 0; GUIWndDirtyRow( wnd->gui, dirt->row ); } else { rect.x = line.indent; if( WndGetLine( wnd, dirt->row, dirt->piece+1, &next_piece_line ) ) { if( next_piece_line.indent < line.indent ) { rect.width = WND_APPROX_SIZE; } else { rect.width = next_piece_line.indent - line.indent; } } else { rect.width = WND_APPROX_SIZE; } rect.y = dirt->row * wnd->max_char.y; rect.height = wnd->max_char.y; } /* begin kludge for Kerning problem */ if( rect.width != 0 || rect.height != 0 ) { half_char.x = WndAvgCharX( wnd ) / 2; half_char.y = 0; GUITruncToPixel( &half_char ); if( rect.x < half_char.x ) { rect.width += half_char.x + rect.x; rect.x = 0; } else { rect.x -= half_char.x; rect.width += half_char.x + half_char.x; } GUIWndDirtyRect( wnd->gui, &rect ); } } } } if( wnd->hscroll_pending != -1 ) { GUISetHScroll( wnd->gui, wnd->hscroll_pending ); wnd->hscroll_pending = -1; } wnd->dirtyrects = 0; WndSetThumb( wnd ); } }