static void FilePos( a_window *wnd, int pos ) { unsigned long range; file_window *file = WndFile( wnd ); if( pos < 0 ) pos = 0; if( file->viewhndl == NULL ) { if( pos+WndRows(wnd) > file->eof ) return; WndSetTop( wnd, pos ); return; } if( FReadLine( file->viewhndl, pos+WndRows(wnd), 0, TxtBuff, TXT_LEN ) < 0 ) { pos = FCurrLine( file->viewhndl ) - WndRows(wnd) - 1; if( pos < 0 ) { pos = 0; } } WndSetTop( wnd, pos ); if( pos >= file->rows ) { file->rows = pos+1; file->rows_offset = FLastOffset( file->viewhndl ); } if( file->rows == 0 ) file->rows = 1; if( file->rows_offset == 0 ) { range = file->size; } else { range = file->size * file->rows / file->rows_offset; } WndSetVScrollRange( wnd, range ); WndSetThumbPos( wnd, pos ); }
STATIC void setDisplay( a_window * wnd, sio_data * curr_sio, bool do_top ) /************************************************************************/ { curr_sio->curr_proc_row = -WND_MAX_ROW; curr_sio->curr_display_row = -WND_MAX_ROW; if( do_top ) { WndSetTop( wnd, 0 ); WndNewCurrent( wnd, 0, PIECE_DETAIL_NAME ); } WndDirty( wnd ); }
extern int W5Scroll( a_window *wnd, int lines ) { int old_top; int new_top; old_top = WndTop( wnd ); new_top = old_top + lines; if( new_top >= NUM_ROWS ) new_top = NUM_ROWS-1; if( new_top < 0 ) new_top = 0; WndSetTop( wnd, new_top ); WndSetVScrollRange( wnd, WndRows( wnd ) + NUM_ROWS - 1 ); WndSetThumbPos( wnd, new_top ); return( new_top - old_top ); }
STATIC int ssrcDetailLine( a_window *wnd, int row, bool multi_level ) /*******************************************************************/ { sio_data *curr_sio; wp_asmfile *asm_file; int top_line; curr_sio = WndExtra( wnd ); asm_file = WPAsmOpen( curr_sio, row+1, multi_level ); if( asm_file == NULL ) { return( row ); } curr_sio->level_open++; curr_sio->asm_file = asm_file; top_line = asm_file->entry_line - WndRows( wnd ) / 2; if( top_line >= 0 ) { WndSetTop( wnd, top_line ); } return( asm_file->entry_line ); }
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; } }