Help with drill-down script

Emmett Gray film2 at handheldfilm.com
Mon Jun 21 10:17:41 EDT 2010


Sorry for the long post. I've now got the last of 
my currently-in-use HC stacks running in Rev, so 
I'm finally retiring HC/Sheepshaver. This last 
stack was huge, a labor of love for 20 years. 
It's an address book whose feature set has not 
been matched by a commercial application.

Anyway, there's one feature: the first card is an 
index of all the cards in the stack. In HC, all 
you need to do is start typing and as you add 
letters, the selected line changes to reflect 
what you've typed. When you get to what you want, 
you hit return and that takes you to the 
respective card.

Anyway, it's not working in Rev. What happens is, 
it selects the first line with the first letter 
you type, but stalls there. Then, if you hit 
return, it does nothing, just sits there. And if 
you wait and start over, it doesn't respond. to 
that either, the original selection remains. You 
have to clear that selection to get it to start 
over.

I don' have any idea what to do.

The relevant field properties in Rev are shared 
text, lock text, vertical scroll bar, list 
behavior.

Here's the HC script:

on keyDown theKey -- this is for selecting & 
scrolling the index fields & the notes field & 
the inform field
   global keyBuff, keyTime, indexLine, keywait, 
activeField --there are both white and yellow 
pages
   --White pages is "Index", yellow pages is "Yndex"
   if theKey is in "abcdefghijklmnopqrstuvwxyz" 
then --user typed something to respond to
     if the selectedField is empty then -- no 
cursor in a field, otherwise enter text in a field
       if the visible of fld  activeField is true 
then --make sure we're looking at the proper field
         if the visible of the message is false 
then -- so it's available when needed
           put activeField into theFld
           select line 0 of fld theFld
           put 0 into item 1 of indexLine
           put the ticks into theTime
           if theTime - keyTime < keyWait then put theKey after keyBuff
           --keyWait is how long to wait before 
discarding the buffer and starting over
           else put theKey into keyBuff
           put theTime into keyTime
           get findIndexLetter(keyBuff, theFld)
           if it = 0 then
             put "abcdefghijklmnopqrstuvwxyzz" 
into theAlph -- extra z because looking for next 
char
             put offset(theKey,theAlph) into numTries
             repeat with x =  numTries + 1 to number of chars of theAlph
               get findIndexLetter((char numTries - x of theAlph), theFld)
               if it > 0 then
                 exit repeat
               end if
             end repeat
             if it = 0 then
               repeat with x = -1 to numTries - 1
                 get findIndexLetter((char numTries - x of theAlph), theFld)
                 if it > 0 then
                   exit repeat
                 end if
               end repeat
             end if
           end if
           set scroll of fld theFld to it * (textHeight of fld theFld)
           if number of lines of fld theFld - it < 22 then
             select line it of fld theFld
             put it into item 1 of indexLine
             put theFld into item 2 of indexLine
           end if
           keyDown numToChar(31)
         else
           pass keyDown
         end if
       else
         pass keyDown
       end if
     else
       pass keyDown
     end if
   else -- not an alpha character
     get charToNum(theKey)
     if (space & it & space) is not in " 11 12 30 
31 " then -- pageup & pagedown, up & down arrows
       if it = 1 then go card 1 --home key
       else pass keyDown -- not trapped key so get out
     else --trapped key, proceed
       if the number of this card = 1 then
         if the selectedField is not empty then
           pass keyDown --conditions not met, get out
         else
           if the visible of fld "inform" is false 
then --another field that might be showing instead
             if it = 11 or it = 30 then
               if the optionKey is not down and it = 30 then
                 grabLine -1, activeField
               else
                 selectNot
                 set scroll of fld activeField to 
scroll of fld activeField - 252
               end if
             else if it = 12 or it = 31 then
               if the optionKey is not down and it = 31 then
                 grabLine 1, activeField
               else
                 selectNot
                 set scroll of fld activeField to 
scroll of fld activeField + 252
               end if
             end if
           else --inform field is showing, not the 
index so do something else, not relevant to this 
post
             if it = 11 then drag from 460,52 to 
460,51-- vals for "notes", change to scroll method
             else
               drag from 460,213 to 460,214
             end if
           end if
         end if
       else -- not card 1
         -- the index field is normally hidden 
except on card 1 but   can be show on any card
         if the selectedField is not empty then -- 
13 is lookup;1 (last name),2,3,4,5 (sift),8 
(category)
           if (the visible of fld " Index " is 
false and the visible of fld " Yndex " is false) 
then
              -- scroll notes, see below too
             if it = 11 then set scroll of fld 
"Notes" to scroll of fld "Notes" - 182
             else if it = 12 then  set scroll of 
fld "Notes" to scroll of fld "Notes" + 182
             else pass keyDown -- it's not page up or down
           end if
         else
           if (the visible of fld " Index " is 
true or the visible of fld " Yndex " is true) then
             if the visible of fld " Index " is 
true then put " Index " into theFld
             else put " Yndex " into theFld
             if it = 11 or it = 30 then
               if the optionKey is not down and it = 30 then
                 grabLine -1, theFld
               else
                 selectNot
                 set scroll of fld theFld to scroll of fld theFld - 252
               end if
             else if it = 12 or it = 31 then
               if the optionKey is not down and it = 31 then
                 grabLine 1, theFld
               else
                 selectNot
                 set scroll of fld theFld to scroll of fld theFld + 252
               end if
             else -- get out, index showing and no valid key
               pass keyDown
             end if
           else -- Notes field showing; had to do 
this twice to enable scrolling with cursor in a 
field
             if it = 11 then
               set scroll of fld "Notes" to scroll of fld "Notes" - 182
             else if it = 12 then  set scroll of 
fld "Notes" to scroll of fld "Notes" + 182
             else pass keyDown
           end if
         end if
       end if
     end if
   end if
end keyDown

function findIndexLetter theKey, theFld -- 
returns line of theKey or of first found 
letter(s) of theKey
   get number of lines in char 1 to (offset(return 
& theKey, fld theFld)) of fld theFld
   if (it = 0) then if (number of chars of theKey > 1) then
     repeat with x =  (number of chars of theKey - 1) down to 1
       get number of lines in char 1 to 
(offset(return & (char 1 to x of theKey), fld 
theFld)) of fld theFld
       if it > 0 then exit repeat
     end repeat
   end if
   return it
end findIndexLetter


on grabLine upOrDown, newFld
   global indexLine
   put item 1 of indexLine into theLine
   put item 2 of indexLine into theFld
   if newFld ‚ theFld then
     select line 0 of fld theFld -- deselect other fld
     put 0 into theLine
   end if
   put newFld into theFld
   put scroll of fld theFld into theScroll
   if theScroll mod 12 ‚ 0 then -- take care of last page with bogus scroll
     repeat until theScroll mod 12 = 0
       add -1 to theScroll
     end repeat
     set the scroll of fld theFld to theScroll
   end if
   if theLine < 1 then
     put scroll of fld theFld into theScroll
     put theScroll/12 + 1 into theLine
   else
     if not (theLine = number of lines of fld theFld  and upOrDown = 1) then
       add upOrDown to theLine
     end if
   end if
   if theLine = 1 then add 1 to theLine
   select line (theLine) of fld theFld
   if  (scroll of fld theFld)/12 „ theLine then
     set scroll of fld theFld to round(theLine * 12) - 264 --scroll up one page
   end if
   put theLine into item 1 of indexLine
   put theFld into item 2 of indexLine
end grabLine

on returnKey
   global indexLine
   if the optionKey is not down and the visible of fld "inform" is false then
     get item 1 of indexLine
     selectNot
     if it >1 then
       if item 2 of indexLine  is " Index "
       then
         go card it
       else
         goToHeading (line it of fld " Yndex ") 
--Heading is a yellow page category
       end if
     else
       if the visible of cd btn 1 is true then
         click at the loc of btn "proceed"
       else pass returnKey
     end if
   else pass returnKey
end returnKey

on selectNot
   global indexLine
   select line 0 of fld (item 2 of indexLine)
   put 0 into item 1 of indexLine
end selectNo

Thanks for reading this far. And since you did, I 
can't resist mentioning some of the features of 
this stack:
1) Smart synchronization: if the copy at the 
office gets a new email address and the same 
person at home gets a new cell phone number, both 
are kept and the card is flagged and put in a 
list. You can deal with it later, like when you 
next go to that card which shows the dates of 
both new entries, or go through the list if you 
want
2) Parsing of clipboard data, from v-cards, email 
signatures and the like, when making new entries.
3) A "Business" checkbox which then alphabetizes 
business names phone-book style, ignoring and 
initial "The" etc.
4) Auto-capitalization; you don't have to hit the 
shift key when entering names. It's smart, knows 
about "de" and "von" etc.
5) One-click or keystroke phone dialing, via a 
modem, Skype out, or Skype-to-Skype (if there's a 
Skype name in the Notes field).
6) Envelope printing of 4 different  custom styles (size, return address)
7) Sifting to create subsets (Christmas card 
lists, European contacts, email addresses, etc.) 
for export in CSV or tab-delimited format
8) Smart printing of Filofax-style pages (no 
entry broken over a page; print one side, turn 
the stack over and print again, all comes out in 
proper order)
9) Ability to change the spelling or 
capitalization of a name, then automatically 
moved to where it belongs as needed, and have the 
corresponding Yellow or White pages version 
auto-updated.
10) Hidden "Filed as" field to override the 
default alphabetization, useful for names like 
"van Beethoven" - filed under v or b?
11) URL launching (grabs the first or selected 
email or web address) and file/app launching such 
as Word templates,  with the appropriate info 
(name and address) in the clipboard
12) Unlimited delete and restore of cards (until you quit).
13) Name conflict resolution: If you have a John 
Smith entry, and make a new John Smith card, you 
get an alert that he's there already. You can 
delete the new one, the old one, or keep both
14) A database of national and international area 
codes so if you have an unknown phone number you 
can see where it's probably located
15) And of course it relies on HC/Rev's brilliant 
"Find" so you can for example type a first name 
and a state abbreviation or city name to find 
someone whose last name you don't remember, but 
you know where they live
16) Customizable abbreviations expanded on 
address data entry: ny expands to New York, NY 
and de expands to Germany, but only if followed 
by a space (or nothing) and must be the first 
characters of the last line in the address field.
17) Phone numbers corrected to be in a standard 
form (dots & parentheses replaced by dashes). US 
numbers get 1- in front, other countries get 
their country code - you can use the 
abbreviations used in the Address field such as 
de for Germany to enter the proper country code 
so you don't have to remember it.
There's more but I'll stop now...



More information about the Use-livecode mailing list