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 ); }
extern bool SrcMoveDot( a_window *wnd, address addr ) { unsigned line; mod_handle mod; file_window *file; DIPHDL( cue, ch ); if( wnd == NULL ) return( FALSE ); file = WndFile( wnd ); if( file->mod == NO_MOD && !file->track ) return( FALSE ); if( IS_NIL_ADDR( addr ) ) { WndScrollAbs( wnd, 0 ); return( FALSE ); } DeAliasAddrMod( addr, &mod ); if( DeAliasAddrCue( mod, addr, ch ) == SR_NONE ) { if( LineCue( mod, 0, 0, 0, ch ) == SR_NONE ) return( FALSE ); } line = CueLine( ch ); if( mod != file->mod || CueFileId( ch ) != file->file_id ) { if( !file->track ) return( FALSE ); FileTrack( wnd, ch ); } --line; WndScrollAbs( wnd, line ); // WndMoveCurrent( wnd, line, PIECE_SOURCE ); FileSetDotAddr( wnd, addr ); FileSetTitle( wnd, CueMod( ch ) ); return( TRUE ); }
static void FileNotify( a_window *wnd, wnd_row row, int piece ) { file_window *file = WndFile( wnd ); address addr; piece = piece; addr = GetRowAddr( file, row, FALSE ); if( IS_NIL_ADDR( addr ) ) return; FileSetDotAddr( wnd, addr ); }
static void FilePosInit( a_window *wnd ) { file_window *file = WndFile( wnd ); if( file->viewhndl == NULL ) { file->size = 0; } else { file->size = FSize( file->viewhndl ); } WndSetThumbPercent( wnd, 0 ); }
static void FileSetDotAddr( a_window *wnd, address addr ) { file_window *file = WndFile( wnd ); if( AddrComp( file->dotaddr, addr ) == 0 ) return; file->dotaddr = addr; if( IS_NIL_ADDR( addr ) ) return; if( wnd == WndFindActive() ) { AsmMoveDot( file->asw, addr ); SetCodeDot( addr ); } }
bool FileOpenGadget( a_window *wnd, wnd_line_piece *line, mod_handle mod ) { a_window *curr; for( curr = WndNext( NULL ); curr != NULL; curr = WndNext( curr ) ) { if( WndClass( curr ) != WND_SOURCE ) continue; if( mod == WndFile( curr )->mod ) { if( line != NULL ) SetGadgetLine( wnd, line, GADGET_OPEN_SOURCE ); return( TRUE ); } } if( line != NULL ) SetGadgetLine( wnd, line, GADGET_CLOSED_SOURCE ); return( FALSE ); }
static void FileModify( a_window *wnd, int row, int piece ) { file_window *file = WndFile( wnd ); address addr; if( piece == PIECE_BREAK ) { addr = GetRowAddr( file, row, TRUE ); if( IS_NIL_ADDR( addr ) ) return; file->toggled_break = ( ( WndFlags & UP_BREAK_CHANGE ) == 0 ); ToggleBreak( addr ); WndRowDirty( wnd, row ); } else { WndFirstMenuItem( wnd, row, piece ); } }
extern void SrcNewAsmNotify( a_window *asw, mod_handle mod, bool track ) { file_window *file; a_window *wnd; for( wnd = WndNext( NULL ); wnd != NULL; wnd = WndNext( wnd ) ) { if( WndClass( wnd ) != WND_SOURCE ) continue; file = WndFile( wnd ); if( track != file->track ) continue; if( mod != file->mod ) continue; if( file->asw != NULL ) continue; AsmJoinSrc( asw, wnd ); SrcJoinAsm( wnd, asw ); break; } }
static void FileSetTitle( a_window *wnd, mod_handle mod ) { char *p; const char *image_name; file_window *file = WndFile( wnd ); if( file->track ) { p = StrCopy( ": ", StrCopy( LIT_DUI( WindowSource ), TxtBuff ) ); } else { p = TxtBuff; } if( file->viewhndl != NULL ) { p = StrCopy( SkipPathInfo( FGetName( file->viewhndl ), 0 ), p ); } else if( file->mod != NO_MOD ) { p += ModName( file->mod, p, TXT_LEN ); } image_name = ModImageName( mod ); if( image_name[0] != NULLCHAR ) { p = StrCopy( "(", StrCopy( " ", p ) ); p = StrCopy( ")", StrCopy( SkipPathInfo( image_name, OP_REMOTE ), p ) ); } WndSetTitle( wnd, TxtBuff ); }
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; }
void FileReset( a_window *wnd ) { file_window *file = WndFile( wnd ); file->active = NOT_ACTIVE; }
static bool FileGetLine( a_window *wnd, int row, int piece, wnd_line_piece *line ) { int len; file_window *file = WndFile( wnd ); address addr; brkp *bp; bool curr; DIPHDL( cue, ch ); line->text = LIT_ENG( Empty ); if( file->viewhndl == NULL && ModHasInfo( file->mod, HK_CUE ) != DS_OK ) { return( false ); } curr = ( row == file->active && ContextMod == file->mod ); switch( piece ) { case PIECE_BREAK: line->tabstop = false; if( row >= file->eof ) return( false ); if( file->mod == NO_MOD ) return( true ); addr = NilAddr; if( !WndDoingSearch ) { // too expensive addr = GetRowAddr( file, row, true ); } if( !IS_NIL_ADDR( addr ) ) { bp = FindBreakByLine( file->mod, file->file_id, row+1 ); FileBreakGadget( wnd, line, curr, bp ); } return( true ); case PIECE_SOURCE: line->text = TxtBuff; line->extent = WND_MAX_EXTEND; if( curr ) line->attr = WND_STANDOUT; if( file->mod != NO_MOD ) { line->indent = MaxGadgetLength; } if( file->viewhndl == NULL ) { Format( TxtBuff, LIT_DUI( No_Source_Line ), row+1 ); if( LineCue( file->mod, file->file_id, 0, 0, ch ) != SR_NONE ) { if( (CueAdjust( ch, -1, ch ) & DS_ERR) ) { file->eof = CueLine( ch ); } } return( true ); } len = FReadLine( file->viewhndl, row+1, 0, TxtBuff, MAX_LINE_LEN ); if( len < 0 ) { file->eof = row; return( false ); } if( len == MAX_LINE_LEN ) { StrCopy( " ...", TxtBuff + MAX_LINE_LEN ); } else { TxtBuff[len] = NULLCHAR; } if( row >= file->rows ) { file->rows = row + 1; file->rows_offset = FLastOffset( file->viewhndl ); } return( true ); default: return( false ); } }
static void FileMenuItem( a_window *wnd, gui_ctl_id id, int row, int piece ) { address addr; mod_handle mod; bool has_addr; bool has_popitem; file_window *file = WndFile( wnd ); piece=piece; addr = GetRowAddr( file, row, id != MENU_FILE_ASSEMBLY ); has_addr = !IS_NIL_ADDR( addr ); switch( id ) { case MENU_INITIALIZE: has_popitem = ( *WndPopItem( wnd ) != NULLCHAR ); if( has_popitem && !ScanSelectedExpr( WndPopItem( wnd ) ) ) { has_popitem = false; } WndMenuEnable( wnd, MENU_FILE_SHOW, true ); WndMenuEnable( wnd, MENU_FILE_SHOW_ADDRESS, true ); WndMenuEnable( wnd, MENU_FILE_SHOW_MODULE, true ); WndMenuEnable( wnd, MENU_FILE_FUNCTIONS, file->mod != NO_MOD ); WndMenuEnable( wnd, MENU_FILE_HOME, true ); addr = GetRowAddr( file, row, false ); WndMenuEnable( wnd, MENU_FILE_ASSEMBLY, !IS_NIL_ADDR( addr ) ); WndMenuEnable( wnd, MENU_FILE_WATCH, has_popitem ); WndMenuEnable( wnd, MENU_FILE_INSPECT, has_popitem ); WndMenuEnable( wnd, MENU_FILE_STEP_INTO, file->mod != NO_MOD && has_popitem ); WndMenuEnable( wnd, MENU_FILE_BREAK, has_popitem ); WndMenuEnable( wnd, MENU_FILE_RUN, has_addr ); WndMenuEnable( wnd, MENU_FILE_SKIP_TO_CURSOR, has_addr ); break; case MENU_FILE_RUN: GoToAddr( addr ); break; case MENU_FILE_SKIP_TO_CURSOR: SkipToAddr( addr ); break; case MENU_FILE_BREAK: BreakOnSelected( WndPopItem( wnd ) ); break; case MENU_FILE_HOME: GoHome(); break; case MENU_FILE_SHOW_MODULE: mod = file->mod; if( DlgModName( LIT_DUI( New_Module ), &mod ) ) { WndModInspect( mod ); } break; case MENU_FILE_SHOW_ADDRESS: if( DlgCodeAddr( LIT_DUI( New_Addr ), &addr ) ) { WndSrcInspect( addr ); } break; case MENU_FILE_STEP_INTO: StepIntoFunction( WndPopItem( wnd ) ); break; case MENU_FILE_INSPECT: WndInspect( WndPopItem( wnd ) ); break; case MENU_FILE_WATCH: WndVarInspect( WndPopItem( wnd ) ); break; case MENU_FILE_SEARCH: WndSaveToHistory( SrchHistory, WndPopItem( wnd ) ); DbgWndSearch( wnd, false, DlgSearch( wnd, SrchHistory ) ); break; case MENU_FILE_ASSEMBLY: AsmWndFind( file->asw, addr, file->track ); break; case MENU_FILE_LINE: GotoLine( wnd ); break; case MENU_FILE_FUNCTIONS: WndFuncInspect( file->mod ); break; } }
extern bool SrcIsTracking( a_window *wnd ) { return( WndFile( wnd )->track ); }
extern void SrcFreeAsm( a_window *wnd ) { if( wnd == NULL ) return; WndFile( wnd )->asw = NULL; }
extern void SrcJoinAsm( a_window *wnd, a_window *asw ) { WndFile( wnd )->asw = asw; }