[comp.sys.mac] Linked Lists in Hypercard

chuq%plaid@Sun.COM (Chuq Von Rospach) (10/21/87)

Since there's been a number of requests for this, here is a Script Report
version of the buttons I use to implement doubly linked lists in Hypercard.
This is somewhat primitive, as you'll see, but it works. 

There are two backgrounds. The first background is the primary list, and the
second background is the list of linked cards attached to a single card from
the first background. The first background has two hidden fields:
ListEditions and NumEditions. The former is the pointer to the head of the
linked list for that card, the latter the number of cards ni the linked
list.

The second background has two fields, "Next Title" and "Prev Title".
Insertion and movement around the double linked list should be relatively
simple to understand from the code (if you've ever worked with Double linked
lists. Thank Ghod for Knuth....)

Anyway, I don't know how much polishing I"m going to do to this code, as I"m
redesigning the modality out of the stack (Hypercard is wonderful, since it
is so EASY to prototype I don't mind throwing away stuff). But I expect to
use this stuff later, and I'm sure someone else can use it now, so I thought
I'd post it... Enjoy!

[Editorial side comment: Why design away modality?

o Modality makes the menubar useless, especially clover-{prev,first,next,last}
	because HC's concepts of those become useless.

o HC Sorting becomes useless.

o inserting, sorting and (especially) deleting cards becomes a royal pain.
	HC WANTS you to write modeless stacks (for good reason, I might
	add).

Anyway, what I'm doing is replacing all this double-linked list complexity
with a single field on the stack. The field will be placed with a value that
identifies the card (in my case, an author/title pair as a text string) with
an appended card number: "anthony-vale of the vole-01". From there, you can
sort by the field, and everything will line up. Buttons to move to the
next/prev card in a given background handles staying within a background
type, and you can use another button to go to the first card of the
background type (this form allows infinite backgrounds without requiring
infinite sets of double linked lists!) you want simply by manipulating the
value of that field and going to it. So I'm zapping a lot of complexity and
getting a stack that does the same thing (perhaps more!) while not
overriding Hypercard. 

Isn't prototyping wonderful?]



SCRIPTS FOR STACK: Book Index
======================================================
 
** BACKGROUND #1: Book Background ************************************
on openStack
  -- hide message box
  -- hide menuBar
  pass openStack
end openStack
 
** BKGND #1, BUTTON #1: Browse Editions ************************************
on mouseUp
  if field listEditions is empty then
    answer "No list of editions to browse"
    exit mouseUp
  end if
  push card
  go to field listEditions
end mouseUp
 
** BKGND #1, BUTTON #10: New Title ************************************
on mouseUp
  set lockscreen to true
  put id of this card into oldcard
  put background field "next title" into nextLink
  domenu "New Card"
  put id of this card into newcard
  put oldcard into background field "Prev Title"
  put nextLink into background field "Next Title"
  go to oldcard
  put newcard into background field "Next Title"
  go to newcard
  global bookType
  put "Novel" into bookType
  set hilight of background button NovelButton to true
  set hilight of background button AnthButton to false
  set hilight of background button CollButton to false
  set hilight of background button NonButton to false
  set hilight of background button bwbutton to false
  set hilight of background button clgbutton to false
  set hilight of background button otherbutton to false
  put empty into listEditions
  put "0" into numEditions
  set visible of background button "Browse Editions" to false
  set lockscreen to false
end mouseUp
 
** BKGND #1, BUTTON #14: New Edition ************************************
on mouseUp
  set lockscreen to true
  put the id of this card into oldcard
  push card
  go to background "Edition Background"
  doMenu "New card"
  put the id of this card into newcard
  go to oldcard
  set visible of background button "browse editions" to true
  if field "listEditions" is empty then
    put newcard into field listEditions
    put 1 into field numEditions
    go to newcard
    put empty into field "listPrev"
    put empty into field "listNext"
  else
    add 1 to field "numEditions"
    put field numEditions into numEditions
    put field listEditions into listOfCards
    put newcard into field "listEditions"
    go to listOfCards
    put newcard into field "listPrev"
    go to newcard
    put empty into field "listPrev"
    put listOfCards into field "listNext"
  end if
  visual effect dissolve very slowly
  set lockscreen to false
end mouseUp
 
** BKGND #1, BUTTON #15: Prev Title ************************************
on mouseUp
  go to previous card of this background
end mouseUp
 
** BKGND #1, BUTTON #16: Next Title ************************************
on mouseUp
  go to next card of this background
end mouseUp
 
** BACKGROUND #2: Edition Background ************************************
on openCard
  if field listPrev is empty then
    set visible of background button 2 to false
  else
    set visible of background button 2 to true
  end if
  if field listNext is empty then
    set visible of background button 3 to false
  else
    set visible of background button 3 to true
  end if
end openCard

** BKGND #2, BUTTON #1: New Button ************************************
on mouseUp
  pop card
end mouseUp
 
** BKGND #2, BUTTON #2: prevButton ************************************
on mouseUp
  if field listPrev is empty then
    answer "no previous edition in list"
    exit mouseUp
  end if
  go to field listPrev
end mouseUp
 
** BKGND #2, BUTTON #3: nextButton ************************************
on mouseUp
  if field listNext is empty then
    answer "no previous edition in list"
    exit mouseUp
  end if
  go to field listNext
end mouseUp
 
Chuq Von Rospach					chuq@sun.COM
Editor, OtherRealms					Delphi: CHUQ