STATIC int srtnOpenDetail( sio_data *curr_sio, bool go_down ) /***********************************************************/ { a_window *wnd; wp_srcfile *src_file; int line; int top_line; wnd = curr_sio->sample_window; src_file = curr_sio->src_file; if( src_file == NULL ) { src_file = WPSourceOpen( curr_sio, true ); if( src_file == NULL ) { if( go_down ) { curr_sio->level_open = LEVEL_ROUTINE; line = ssrcDetailLine( wnd, 0, true ); if( curr_sio->level_open == LEVEL_ROUTINE ) { curr_sio->level_open = LEVEL_FILE; } return( line ); } curr_sio->level_open = LEVEL_FILE; return( 0 ); } } curr_sio->level_open = LEVEL_ROUTINE; line = src_file->samp_line; if( line < 1 ) { line = src_file->rtn_line; } top_line = line - 1 - WndRows( wnd ) / 2; if( top_line >= 0 ) { WndSetTop( wnd, top_line ); } return( line-1 ); }
static void WPZoomIn( a_window *wnd, int row ) /********************************************/ { sio_data *curr_sio; int detail_rows; int top_line; int old_level; int curr_line; bool multi_level; curr_sio = WndExtra( wnd ); if( row >= curr_sio->level_open && row < STATUS_ROW ) { Ring(); return; } if( row < curr_sio->level_open ) { curr_sio->level_open = row; WndSetTop( wnd, 0 ); gatherSort( curr_sio ); if( curr_sio->level_open == LEVEL_ROUTINE ) { curr_line = srtnOpenDetail( curr_sio, false ); } else { curr_line = WPGetRow( curr_sio ); } } else { row = row - STATUS_ROW - 1; curr_line = row; detail_rows = SampleNumRows( wnd ); if( detail_rows < row+1 ) { Ring(); return; } multi_level = false; for( ;; ) { old_level = curr_sio->level_open; curr_line = overviewDetailRtns[curr_sio->level_open]( wnd, row, multi_level ); if( old_level == curr_sio->level_open ) break; detail_rows = SampleNumRows( wnd ); if( detail_rows != 1 ) break; row = 0; multi_level = true; } } curr_sio->curr_proc_row = -WND_MAX_ROW; curr_sio->curr_display_row = -WND_MAX_ROW; detail_rows = SampleNumRows( wnd ); top_line = WndTop( wnd ); row = curr_line - top_line; if( row >= WndRows( wnd ) ) { top_line = curr_line - WndRows( wnd ) / 2; } if( row < 0 ) { top_line = curr_line; } if( detail_rows-top_line < WndRows( wnd ) ) { top_line = detail_rows - WndRows( wnd ); if( top_line < 0 ) { top_line = 0; } } WndSetTop( wnd, top_line ); WndNewCurrent( wnd, curr_line, PIECE_DETAIL_NAME ); WndDirty( wnd ); if( curr_sio->level_open < LEVEL_SOURCE && curr_sio->asm_file != NULL ) { WPAsmClose( curr_sio->asm_file ); curr_sio->asm_file = NULL; } if( curr_sio->level_open < LEVEL_ROUTINE && curr_sio->src_file != NULL ) { WPSourceClose( curr_sio->src_file ); curr_sio->src_file = NULL; } }
static void FileTrack( a_window *wnd, cue_handle *ch ) { unsigned active, old_active; unsigned end_line; int slack; file_window *file = WndFile( wnd ); mod_handle mod; cue_fileid id; wnd_row curr_row; int curr_piece; if( ch == NULL ) { mod = NO_MOD; id = 0; } else { mod = CueMod( ch ); id = CueFileId( ch ); } if( file->viewhndl == NULL || file->mod != mod || file->file_id != id ) { if( file->viewhndl != NULL ) { FDoneSource( file->viewhndl ); } file->mod = mod; file->file_id = id; FileSetDotAddr( wnd, GetCodeDot() ); if( file->mod == NO_MOD ) { file->viewhndl = NULL; } else { file->viewhndl = OpenSrcFile( ch ); } FileSetTitle( wnd, mod ); SeekToTheEnd( file ); file->eof = UINT_MAX; WndZapped( wnd ); FilePosInit( wnd ); file->active = NOT_ACTIVE; FilePos( wnd, 0 ); DbgUpdate( UP_OPEN_CHANGE ); } active = ActiveLine(); if( active != file->active ) { FileSetDotAddr( wnd, GetCodeDot() ); WndGetCurrent( wnd, &curr_row, &curr_piece ); WndNoCurrent( wnd ); if( curr_row != WND_NO_ROW ) { WndRowDirty( wnd, curr_row ); } } old_active = file->active; file->active = NOT_ACTIVE; slack = WndRows( wnd ) / 4; if( slack > 2 ) slack = 2; end_line = WndTop( wnd ) + WndRows( wnd ) - 1; if( old_active == NOT_ACTIVE || active > end_line ) { WndZapped( wnd ); WndScroll( wnd, active - slack - WndTop( wnd ) ); } else if( active > end_line - slack ) { WndRowDirtyImmed( wnd, old_active ); WndScroll( wnd, WndRows( wnd ) - 2 * slack ); } else if( active < WndTop( wnd ) ) { WndRowDirtyImmed( wnd, old_active ); WndScroll( wnd, active - WndTop( wnd ) - slack ); } else { WndRowDirty( wnd, old_active ); } WndNewCurrent( wnd, active, PIECE_SOURCE ); WndRowDirty( wnd, active ); file->active = active; }
extern bool WndSearch( a_window *wnd, bool from_top, int direction ) { wnd_line_piece line; regexp *rx; char *pos; char *endpos; bool wrap; int rows; bool rc; bool had_cache; char *not_found; char *top_of_window; char *end_of_window; char *search_wrapped; wnd_subpiece next_occurence; wnd_subpiece prev_occurence; wnd_subpiece curr; wnd_coord starting_pos; if( direction == 0 ) return( FALSE ); if( wnd == NULL ) return( FALSE ); if( wnd->searchitem == NULL ) return( FALSE ); rx = WndCompileRX( wnd->searchitem ); if( rx == NULL ) return( FALSE ); not_found = WndLoadString( LITERAL_Not_Found ); top_of_window = WndLoadString( LITERAL_Top_Of_Window ); end_of_window = WndLoadString( LITERAL_End_Of_Window ); search_wrapped = WndLoadString( LITERAL_Search_Wrapped ); wrap = FALSE; starting_pos.piece = 0; starting_pos.col = direction > 0 ? -1 : WND_MAX_COL; if( from_top ) { curr.row = 0; } else if( WndHasCurrent( wnd ) ) { curr.row = WndVirtualRow( wnd, wnd->current.row ); starting_pos.piece = wnd->current.piece; starting_pos.col = wnd->current.col; } else { curr.row = WndVirtualTop( wnd ); } starting_pos.row = curr.row; WndNextRow( wnd, WND_NO_ROW, WND_SAVE_ROW ); WndStatusText( "" ); WndDoingSearch = TRUE; had_cache = WndSetCache( wnd, FALSE ); for( ;; ) { if( curr.row < 0 ) { if( wrap ) { NotFound( wnd, rx, not_found ); rc = FALSE; goto done; } else if( _Is( wnd, WSW_SEARCH_WRAP ) ) { rows = WndNumRows( wnd ); if( rows == -1 ) { WndRepaint( wnd ); WndScrollAbs( wnd, -wnd->title_size ); rows = WndScrollAbs( wnd, WND_MAX_ROW ) + WndRows( wnd ); } curr.row = rows - 1; curr.col = 0; curr.piece = -1; wrap = TRUE; continue; } else { NotFound( wnd, rx, top_of_window ); rc = FALSE; goto done; } } next_occurence.col = -1; prev_occurence.col = -1; for( curr.piece = 0;; ++curr.piece ) { // look for both next and prev match if( !WndGetLineAbs( wnd, curr.row, curr.piece, &line ) ) { if( curr.piece != 0 ) break; if( wrap ) { NotFound( wnd, rx, not_found ); rc = FALSE; goto done; } else if( _Is( wnd, WSW_SEARCH_WRAP ) ) { curr.row = 0; curr.col = 0; curr.piece = -1; wrap = TRUE; continue; } else { NotFound( wnd, rx, end_of_window ); rc = FALSE; goto done; } } if( line.bitmap ) continue; pos = line.text; endpos = NULL; while( WndRXFind( rx, &pos, &endpos ) ) { curr.end = endpos - line.text; curr.col = pos - line.text; if( curr.piece < starting_pos.piece ) { prev_occurence = curr; } else if( curr.piece > starting_pos.piece ) { if( next_occurence.col == -1 ) { next_occurence = curr; } } else if( curr.col > starting_pos.col ) { if( next_occurence.col == -1 ) { next_occurence = curr; } } else if( curr.col < starting_pos.col ) { prev_occurence = curr; } ++pos; } } if( direction < 0 ) { next_occurence = prev_occurence; } if( next_occurence.col != -1 ) { WndDoingSearch = FALSE; WndKillCacheLines( wnd ); WndDirtyCurr( wnd ); WndNoSelect( wnd ); WndNoCurrent( wnd ); if( curr.row < WndVirtualTop( wnd ) ) { if( curr.row > wnd->rows / 2 ) { WndRepaint( wnd ); WndScrollAbs( wnd, curr.row - wnd->rows / 2 ); } else { WndRepaint( wnd ); WndScrollAbs( wnd, -wnd->title_size ); } } else if( curr.row >= WndVirtualBottom( wnd ) ) { WndRepaint( wnd ); WndScrollAbs( wnd, curr.row - wnd->rows / 2 ); } wnd->sel_start.row = WndScreenRow( wnd, curr.row ); wnd->sel_start.piece = next_occurence.piece; wnd->sel_start.col = next_occurence.col; wnd->sel_end = wnd->sel_start; wnd->sel_end.col = next_occurence.end - 1; wnd->current.col = wnd->sel_end.col; wnd->current = wnd->sel_start; WndSetCurrCol( wnd ); WndCurrVisible( wnd ); WndDirtyCurr( wnd ); WndFreeRX( rx ); if( wrap ) WndStatusText( search_wrapped ); rc = TRUE; goto done; } if( direction > 0 ) { if( wrap && curr.row > starting_pos.row ) { NotFound( wnd, rx, not_found ); rc = FALSE; goto done; } starting_pos.col = -1; starting_pos.piece = 0; curr.row = WndNextRow( wnd, curr.row, 1 ); } else { starting_pos.col = WND_MAX_COL; starting_pos.piece = WND_MAX_COL; curr.row = WndNextRow( wnd, curr.row, -1 ); } curr.piece = 0; } done:; WndSetCache( wnd, had_cache ); WndFree( not_found ); WndFree( top_of_window ); WndFree( end_of_window ); WndFree( search_wrapped ); return( rc ); }
static void Centre( a_window *wnd, unsigned line ) { WndZapped( wnd ); WndScroll( wnd, line - ( WndRows( wnd ) / 2 ) - WndTop( wnd ) ); }