dcsimg
LinkedIn
Twitter
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX


advertisement
 

Nano-Sheets: A Small But Mighty Spreadsheet Engine in REBOL  : Page 2

Even in today's big-computing environment, not everything useful has to be big. This article shows you how to build a tiny and basic—but powerful—GUI spreadsheet engine in REBOL, using fewer than 1500 bytes of code.


advertisement
Nano-Sheets—the Complete Code
Pinch yourself. Here it is—a fully functional, cross-platform GUI spreadsheet in one page of code.

   REBOL [Title: "Nano-Sheets"]
   
   csize: 100x20
   size: 8x16
   
   col-lbl: func [col] [form to char! 64 + col]
   cell-name: func [x y] [join col-lbl x y]
   mk-var: func [x y] [to lit-word! cell-name x y]
   
   sheet: copy [
      space 1x1 across
      style cell field csize edge none 
         with [formula: none]
         [enter face  compute  face/para/scroll: 0x0]
      style label text csize white black bold center
   ]
   
   repeat y 1 + size/y [
      repend sheet ['label (csize / 2x1)
         either 1 = y [""] [form y - 1]]
      repeat x size/x [
         append sheet compose/deep
         either 1 = y [
            [label (col-lbl x)]
         ][
            [cell with [var: (mk-var x y - 1)]]
         ]
      ]
      append sheet 'return
   ]
   
   enter: func [face /local data] [
      if empty? face/text [exit]
      set face/var face/text
      data: either #"=" = face/text/1 [ next face/text ][
         face/text
      ]
      if error? try [data: load data] [exit]
      if find [integer! decimal! money! time!
         date! tuple! pair!]   type?/word :data [
            set face/var data exit
      ]
      if face/text/1 = #"=" [face/formula: :data]
   ]
   
   compute: does [
      unfocus
      foreach cell cells [
         if cell/formula [
            if error? cell/text: try [do cell/formula] 
               [cell/text: "ERROR!"]
            set cell/var cell/text
            show cell
         ]
      ]
   ]
   
   lay: layout sheet
   cells: copy []
   foreach face lay/pane [
      if 'cell = face/style [   append cells face]
   ]
   focus first cells
   view lay 
The preceding code is the complete Nano-Sheets engine, in fewer than 1,500 bytes. If you ".rap" Nano-Sheets, it shrinks even further—down to 1,051 bytes. The ".rap" process compresses and protects code for professional projects.



Close Icon
Thanks for your registration, follow us on our social networks to keep up-to-date