Dmitry Pavlov wrote at 07/09/2014 04:50 AM:
I have to do a simple spreadsheet editor and I wonder
whether Racket suits my needs. The main challenge
is that the spreadsheet editor should be able to edit
tables as big as 1000x1000 or 10000x100 cells.

For a million cells like that, when using any language and toolkit that I know of, I would probably implement it with a mix of manual drawing and using the occasional toolkit widgets in only small numbers at a time (only for actively editing of a single cell).

Fortunately, doing the drawing and mouse-click object picking for a grid is very easy to do efficiently and scalably, and doing it with scrollbars is only a little bit more arithmetic. (If it were 2D objects of arbitrary shape, position, and layering, then that would be harder to do scalably, and likely require fancy data structures to do fast, but simple spreadsheet-like grids are easy.)

I would first try it with a full redraw of the visible part of the grid at each repaint/expose event. If that flickered, I would add double-buffering to the full redraw. If there was still something slow (say, if your anti-aliased text drawing was unusually slow while scrolling or when redrawing on-the-fly while typing the edited contents of a cell), then I would look at delaying/coalescing updates, or simplifying the intermediate updates before getting to an idle update when the full detail is done. As an extreme last resort, I would look at doing partial (damage region) redraws to a double-buffer and block moves within the buffer for scrolling and window resizes, but this is more complicated and a likely source of hard-to-QA bugs. I doubt that you will need the extreme last resort, so it should be pretty straightforward.

For editing the contents of cells in this manually-drawn grid, you can put the GUI toolkit editing controls: * permanently in the enclosing GUI toolkit window (beside the grid, not over it),
* in a transient pop-up window of some kind, or
* transiently in-place over the grid (with pixel-exact position and geometry).

I think that this simple approach of a manually-drawn grid and minimal use of toolkit controls will be fast with even a million cells, without much programming difficulty.

Neil V.

____________________
 Racket Users list:
 http://lists.racket-lang.org/users

Reply via email to