Thanks, Richard!

Best,

Jerry Daniels
Watch tRev - The Movie
http://reveditor.com/trev-the-movie

On Sep 15, 2009, at 9:37 AM, Richard Gaskin wrote:

Tereza Snyder wrote:
> Some satisfaction might be obtained if, by clicking a parenthesis with
> a modifier key pressed, one could select all the text between it and
> its partner. Similarly, click the keyword "if" and all text to the
> matching "end if" is selected and vice-versa. Same for repeat and
> switch.

I like the way you think, Tereza. That strikes a perfect balance, providing the clarity Mark Wieder was looking for while keeping the script displayed as the whole block of text it is. I'll admit I have a few long handlers of my own where this will be very helpful. :)

I just added the code below to my own script editor, and I really like it. Thanks for the suggestion.


Jerry, I found that as sloppy as this code is it performs reasonably well as long as I store the top of the graphic "ControlSel" (for "Control Stucture Selection") in a property so I can update it during scrolling without having to recalculate the rect on the fly.

The code assumes you have a graphic named "ControlSel" below your transparent editor field (since my editor is a fork of MC's my editor field is named simply "Editor Field"). Here I use a color slightly darker than the light gray of the background color of the stack, but brighter colors may look good too.

If one of the BBEdit users here could send me a screenshot of how that app displays this that would be very helpful. It would also be good to know how they handle knowing what closure means for different languages (prefs settings?).

ShowControlSel is called from a CommandKeyDown handler (I used Cmd-J simply because it was available, but if you use a different one it would be good to know so I can change mine for consistency before I share it). When invoked it'll draw the "ControlSel" graphic at the bounds of the relevant block, i.e. if a handler it'll surround the whole handler, if a switch it'll do the switch, if "if" it'll do until the "end".

The ControlStructureClosureLine function is used in a few places in my editor, handy for finding the line offset where a handler or control structure closes. It's way sloppy in style (cleaning it up is on my to-do list after a long list of client features), but seems to work okay where I'm using it. With "if", "switch", and "repeat" it should account for nested control structures (please let me know if it fails to catch any).

You're welcome to use any of this that's helpful:



on ShowControlSel
 hide grc "ControlSel"
 put word 2 of the selectedLine into tLineNum
 put line tLineNum of fld "Editor Field" into tLine
 put ControlStructureClosureLine(tLineNum) into tClosingLineNum
 --
 put ((tLineNum-1) * the effective textHeight of \
     fld "Editor Field") + the top of fld "Editor Field" \
     + 2 into tTop
 put (tClosingLineNum * the effective textHeight of \
     fld "Editor Field") + the top of fld "Editor Field" \
     + 6 into tBottom -- 6 added for borders and margins
set the uTop of grc "ControlSel" to tTop -- used for updating during scroll
 set the rect of grc "ControlSel" to \
     the left of fld "Editor Field", \
     tTop - the vScroll of fld "Editor Field", \
     the right of fld "Editor Field", \
     tBottom- the vScroll of fld "Editor Field"
 show grc "ControlSel"
end ShowControlSel


function ControlStructureClosureLine tLineNum
 put line tLineNum to (the number of lines of fld "Editor Field") \
     of fld "Editor Field" into tScript
 put line 1 of tScript into tLine
 put word 1 of tLine into tToken
 if tToken is among the words of "if switch repeat" then
   put 0 into i
   put 0 into tNestedCount
   repeat for each line tLine in tScript
     add 1 to i
     if word 1 of tLine is tToken then
       add 1 to tNestedCount
     end if
     --
     if word 1 of tLine is "end" AND word 2 of tLine is tToken then
       subtract 1 from tNestedCount
       if tNestedCount = 0 then
         return i+tLineNum-1
       end if
     end if
   end repeat
   --
   -- If we got here we may have an "if" closed by "else" so:
   if tToken is "if" then
     put 0 into i
     repeat for each line tLine in tScript
       add 1 to i
       if word 1 of tLine = "else" then
         return i+tLineNum-1
       end if
     end repeat
     --
-- If we got this far perhaps the "if" dangles "then" on the next line:
     put 0 into i
     repeat for each line tLine in tScript
       add 1 to i
       if word 1 of tLine = "then" then
         return i+tLineNum-1
       end if
     end repeat
   end if
   --
 else
   -- Get whole handler?
if tToken is among the words of "on private command function getProp setProp" then if word 1 of tLine is "private" then put word 3 of tScript into tToken
     else put word 2 of tLine into tToken
     put 0 into i
     repeat for each line tLine in tScript
       add 1 to i
       if word 1 of tLine = "end" AND word 2 of tLine is tToken then
         return i+tLineNum-1
       end if
     end repeat
   end if
 end if -- closable token
 return tLineNum
end ControlStructureClosureLine



--
Richard Gaskin
Fourth World
Revolution training and consulting: http://www.fourthworld.com
Webzine for Rev developers: http://www.revjournal.com

_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution

_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution

Reply via email to