/* Delete lines inside scroll region. */ void grid_view_delete_lines_region(struct grid *gd, u_int rlower, u_int py, u_int ny) { u_int ny2; GRID_DEBUG(gd, "rlower=%u, py=%u, ny=%u", rlower, py, ny); rlower = grid_view_y(gd, rlower); py = grid_view_y(gd, py); ny2 = rlower + 1 - py - ny; grid_move_lines(gd, py, py + ny, ny2); grid_clear(gd, 0, py + ny2, gd->sx, ny - ny2); }
/* Insert characters. */ void grid_view_insert_cells(struct grid *gd, u_int px, u_int py, u_int nx) { u_int sx; px = grid_view_x(gd, px); py = grid_view_y(gd, py); sx = grid_view_x(gd, gd->sx); if (px == sx - 1) grid_clear(gd, px, py, 1, 1); else grid_move_cells(gd, px + nx, px, py, sx - px - nx); }
void test_grid() { Grid grid; grid_initialize(&grid); grid_set_size(&grid, (GridXY){ 16, 16 }); grid_set_capacity(&grid, 16); grid_clear(&grid); int item = 44; grid_put(&grid, (GridXY){ 8, 8 }, &item); grid_put(&grid, (GridXY){ 8, 8 }, &item); grid_iterate_items(&grid, (GridXY){ 8, 8 }, NULL, assert_int_44); assert(assert_int_44_count == 2); grid_iterate_items(&grid, (GridXY){ 7, 8 }, NULL, assert_int_44); assert(assert_int_44_count == 2); grid_deinitialize(&grid); }
static LRESULT CALLBACK grid_proc(HWND win, UINT msg, WPARAM wp, LPARAM lp) { grid_t* grid = (grid_t*) GetWindowLongPtr(win, 0); switch(msg) { case WM_PAINT: return generic_paint(win, grid->no_redraw, (grid->style & MC_GS_DOUBLEBUFFER), grid_paint, grid); case WM_PRINTCLIENT: return generic_printclient(win, (HDC) wp, grid_paint, grid); case WM_NCPAINT: return generic_ncpaint(win, grid->theme_listview, (HRGN) wp); case WM_ERASEBKGND: return generic_erasebkgnd(win, grid->theme_listview, (HDC) wp); case MC_GM_GETTABLE: return (LRESULT) grid->table; case MC_GM_SETTABLE: return (grid_set_table(grid, (table_t*) lp) == 0 ? TRUE : FALSE); case MC_GM_GETCOLUMNCOUNT: return grid->col_count; case MC_GM_GETROWCOUNT: return grid->row_count; case MC_GM_RESIZE: return (grid_resize_table(grid, LOWORD(wp), HIWORD(wp)) == 0 ? TRUE : FALSE); case MC_GM_CLEAR: return (grid_clear(grid, wp) == 0 ? TRUE : FALSE); case MC_GM_SETCELLW: case MC_GM_SETCELLA: return (grid_set_cell(grid, LOWORD(wp), HIWORD(wp), (MC_TABLECELL*)lp, (msg == MC_GM_SETCELLW)) == 0 ? TRUE : FALSE); case MC_GM_GETCELLW: case MC_GM_GETCELLA: return (grid_get_cell(grid, LOWORD(wp), HIWORD(wp), (MC_TABLECELL*)lp, (msg == MC_GM_GETCELLW)) == 0 ? TRUE : FALSE); case MC_GM_SETGEOMETRY: return (grid_set_geometry(grid, (MC_GGEOMETRY*)lp, TRUE) == 0 ? TRUE : FALSE); case MC_GM_GETGEOMETRY: return (grid_get_geometry(grid, (MC_GGEOMETRY*)lp) == 0 ? TRUE : FALSE); case MC_GM_REDRAWCELLS: return (grid_redraw_cells(grid, LOWORD(wp), HIWORD(wp), LOWORD(lp), LOWORD(lp)) == 0 ? TRUE : FALSE); case MC_GM_SETCOLUMNWIDTH: return (grid_set_col_width(grid, wp, LOWORD(lp)) == 0 ? TRUE : FALSE); case MC_GM_GETCOLUMNWIDTH: return grid_get_col_width(grid, wp); case MC_GM_SETROWHEIGHT: return (grid_set_row_height(grid, wp, LOWORD(lp)) == 0 ? TRUE : FALSE); case MC_GM_GETROWHEIGHT: return grid_get_row_height(grid, wp); case WM_SETREDRAW: grid->no_redraw = !wp; return 0; case WM_VSCROLL: case WM_HSCROLL: grid_scroll(grid, (msg == WM_VSCROLL), LOWORD(wp), 1); return 0; case WM_MOUSEWHEEL: case WM_MOUSEHWHEEL: grid_mouse_wheel(grid, (msg == WM_MOUSEWHEEL), (int)(SHORT)HIWORD(wp)); return 0; case WM_SIZE: if(!grid->no_redraw) { int old_scroll_x = grid->scroll_x; int old_scroll_y = grid->scroll_y; grid_setup_scrollbars(grid, FALSE); if(grid->scroll_x != old_scroll_x || grid->scroll_y != old_scroll_y) InvalidateRect(win, NULL, TRUE); } return 0; case WM_GETFONT: return (LRESULT) grid->font; case WM_SETFONT: grid->font = (HFONT) wp; if((BOOL) lp && !grid->no_redraw) InvalidateRect(win, NULL, TRUE); return 0; case WM_STYLECHANGED: if(wp == GWL_STYLE) grid_style_changed(grid, (STYLESTRUCT*) lp); break; case WM_THEMECHANGED: grid_close_theme(grid); grid_open_theme(grid); if(!grid->no_redraw) RedrawWindow(win, NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_ERASE); return 0; case WM_SYSCOLORCHANGE: if(!grid->no_redraw) RedrawWindow(win, NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_ERASE); return 0; case WM_NOTIFYFORMAT: if(lp == NF_REQUERY) grid_notify_format(grid); return (grid->unicode_notifications ? NFR_UNICODE : NFR_ANSI); case CCM_SETUNICODEFORMAT: { BOOL old = grid->unicode_notifications; grid->unicode_notifications = (wp != 0); return old; } case CCM_GETUNICODEFORMAT: return grid->unicode_notifications; case CCM_SETNOTIFYWINDOW: { HWND old = grid->notify_win; grid->notify_win = (wp ? (HWND) wp : GetAncestor(win, GA_PARENT)); return (LRESULT) old; } case CCM_SETWINDOWTHEME: mcSetWindowTheme(win, (const WCHAR*) lp, NULL); return 0; case WM_NCCREATE: grid = grid_nccreate(win, (CREATESTRUCT*)lp); if(MC_ERR(grid == NULL)) return FALSE; SetWindowLongPtr(win, 0, (LONG_PTR)grid); return TRUE; case WM_CREATE: return (grid_create(grid) == 0 ? 0 : -1); case WM_DESTROY: grid_destroy(grid); return 0; case WM_NCDESTROY: if(grid) grid_ncdestroy(grid); return 0; } return DefWindowProc(win, msg, wp, lp); }