static bool WndCursorLeftCheck( a_window *wnd ) { int col; wnd_line_piece line; if( _Isnt( wnd, WSW_CHAR_CURSOR )|| !WndHasCurrent( wnd ) || wnd->current.col == 0 ) { if( !WndTabLeft( wnd, false ) ) return( false ); wnd->current.col = WND_MAX_COL; WndSetCurrCol( wnd ); WndCurrVisible( wnd ); WndDirtyCurrChar( wnd ); return( true ); } else { WndGetLine( wnd, wnd->current.row, wnd->current.piece, &line ); WndDirtyCurrChar( wnd ); col = wnd->current.col; wnd->current.col = WndPrevCharCol( line.text, wnd->current.col ); WndSetCurrCol( wnd ); WndCurrVisible( wnd ); WndDirtyCurrChar( wnd ); return( col != wnd->current.col ); } }
static bool WndCursorRightCheck( a_window *wnd ) { wnd_line_piece line; int col; bool got; got = WndGetLine( wnd, wnd->current.row, wnd->current.piece, &line ); if( _Isnt( wnd, WSW_CHAR_CURSOR ) || !WndHasCurrent( wnd ) || !got || wnd->current.col + 1 >= line.length ) { return( WndTabRight( wnd, false ) ); } else { WndDirtyCurrChar( wnd ); col = wnd->current.col; wnd->current.col += GUICharLen( line.text[wnd->current.col] ); WndSetCurrCol( wnd ); WndCurrVisible( wnd ); WndDirtyCurrChar( wnd ); return( col != wnd->current.col ); } }
static a_window *WndCreateWithStructBody( wnd_create_struct *info, gui_create_info *init ) { a_window *wnd; gui_window *gui; char buff[256]; int size; if( info->title == NULL ) { buff[0] = '\0'; } else { // might be clobbered by create strcpy( buff, info->title ); } if( info->title != NULL ) strcpy( buff, info->title ); // might be clobbered by create size = sizeof( *wnd ) + ( WndMaxDirtyRects - 1 ) * sizeof( wnd->dirty ); // wnd = WndAlloc( size ); if( wnd == NULL ) { WndFree( info->extra ); WndNoMemory(); } memset( wnd, 0, size ); wnd->u.button_down.row = (char)-1; wnd->gui = NULL; wnd->info = info->info; wnd->wndclass = info->wndclass; wnd->extra = info->extra; wnd->title_size = info->title_size; wnd->rows = 1; // just so it's not zero in init code WndNoSelect( wnd ); WndNoCurrent( wnd ); WndSetCurrCol( wnd ); WndNullPopItem( wnd ); wnd->dirtyrects= 0; // wndnoselect changes this! wnd->vscroll_pending = 0; wnd->hscroll_pending = -1; wnd->keypiece = WND_NO_PIECE; wnd->switches = WSW_SELECT_IN_TABSTOP | WSW_MUST_CLICK_ON_PIECE | WSW_ALLOW_POPUP | WSW_SEARCH_WRAP | WSW_HIGHLIGHT_CURRENT | WSW_ONLY_MODIFY_TABSTOP | WSW_MENU_ACCURATE_ROW; if( info->rect.width == 0 || info->rect.height == 0 ) { init->rect.x = 0; init->rect.y = 0; init->rect.width = WndMax.x; init->rect.height = WndMax.y; } else { init->rect.x = info->rect.x; init->rect.y = info->rect.y; init->rect.width = info->rect.width; init->rect.height = info->rect.height; } init->scroll = info->scroll; init->style = info->style; init->style |= GUI_VSCROLL_EVENTS; init->style &= ~GUI_HSCROLL_EVENTS; init->title = ( info->title == NULL ) ? NULL : ""; if( WndMain != NULL ) { init->style |= GUI_VISIBLE; init->parent = WndMain->gui; init->num_menus = 0; init->menu = NULL; } else { init->style &= ~GUI_VISIBLE; init->scroll = GUI_NOSCROLL; init->num_menus = WndNumMenus; init->menu = WndMainMenu; init->parent = NULL; } if( init->style & GUI_POPUP ) { init->parent = NULL; } init->num_attrs = WndNumColours; init->colours = info->colour; init->call_back = WndMainEventProc; init->extra = wnd; _Set( wnd, WSW_ACTIVE ); gui = GUICreateWindow( init ); if( gui == NULL ) { WndFree( info->extra ); WndFree( wnd ); WndNoMemory(); return( NULL ); } else { if( buff[0] != '\0' ) { WndSetTitle( wnd, buff ); } } ++NumWindows; return( wnd ); }
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 ); }