P/C Scripts for Scrolling Fields

Date: Mon, 02 Jun 1997 11:36:47 +0200
From: Bernat Comerma 
Subject: Cool parent script for easily handle scrolling fields

-- Parent script "scrollStuff" for easily handle scroll Fields
-- by Bernat Comerma
--
-- Parms:
--    Field to scroll, Groove member, Slide Bar member
-- Handlers:
--    hGetSpriteOfMember(whichMember)
-- Methods (Public):
--    mScroll ( me, [CursorType])
--         When the user drags the scroll bar, the text scrolls up or down.
--        This method should be invoked from the slide bar script
--    mScrollLine (me, UpOrDown)
--         Invoked from a button script
--    mDelete(me)
--        Destructor (resets all puppets)

property  pField, pGroove, pSlideBar
property pTop, pBot, pSlideBarSprite, pTopScroll
property pVisibleArea

on new me, prmField, prmGroove, prmSlideBar, prmChangeHeight
  set pField = prmField
  set pGroove = prmGroove
  set pSlideBar = prmSlideBar
  set pSlideBarSprite = hGetSpriteOfMember(pSlideBar)
  set the scrollTop of member pField = 0
  set tSprite = hGetSpriteOfMember(pField)
  set pVisibleArea = the height of sprite tSprite / the lineHeight of
member pField
  if the lineCount of member pField > pVisibleArea then
    puppetSprite pSlideBarSprite, TRUE
    set tPercenVisible = (pVisibleArea * 100) / the lineCount of member pField
    set tSprite = hGetSpriteOfMember(pGroove)
    set pTop = the top of Sprite tSprite
    if prmChangeHeight then
      set tHeight = ((the bottom of sprite tSprite - pTop) * tPercenVisible) / 100
      if tHeight > 5 then set the height of sprite pSlideBarSprite = tHeight
      else set the height of sprite pSlideBarSprite = 5
    end if
    set pBot = the bottom of Sprite tSprite - the height of sprite pSlideBarSprite
    set pTopScroll = (the lineCount of member pFieldÂ
                            * the lineHeight of member pField)Â
                            - (the lineHeight of member pField *
pVisibleArea)
  else
    set the visible of sprite pSlideBarSprite to FALSE
  end if
  return me
end

on mScroll me, prmCursorType
  -- When the user drags the scroll bar, the text scrolls up or down
  -- This method should be invoked from the slide bar script

  if not voidP(prmCursorType) then
    set tCursor = the cursor of sprite pSlideBarSprite
    set the cursor of sprite pSlideBarSprite = prmCursorType
  end if
  set tDistance = the mouseV - the locV of sprite pSlideBarSprite
  repeat while the mouseDown
    if the mouseH < (the locH of sprite pSlideBarSprite - 20)Â
    or the mouseH > (the locH of sprite  pSlideBarSpriteÂ
                            + the width of sprite  pSlideBarSprite + 20)
then
      set the locV of sprite pSlideBarSprite to pTop
      set the scrollTop of member pField = 0
      updateStage
      next repeat
    end if
    set tMouseV = the mouseV - tDistance
    case TRUE of
      (tMouseV < pTop):  set tMouseV = pTop
      (tMouseV > pBot):   set tMouseV = pBot
    end case
    set tPercen = (float(tMouseV - pTop) / (pBot - pTop)) * 100
    set the locV of sprite pSlideBarSprite to tMouseV
    set tScrollTop = ((tPercen * (the lineCount of member pField - pVisibleArea)) / 100)Â
                   * the lineHeight of member pField
    if tScrollTop > pTopScroll then
      set the scrollTop of member pField = pTopScroll
    else
      set the scrollTop of member pField = tScrollTop
    end if
    updateStage
  end repeat
  set the scrollTop of member pField = the scrollTop of member pFieldÂ
    - (the scrollTop of member pField  mod the lineHeight of member pField)
  if not voidP(prmCursorType) then
    set the cursor of sprite pSlideBarSprite = tCursor
  end if
end

on mDelete me
  if the visible of sprite pSlideBarSprite = FALSE then
    set the visible of sprite pSlideBarSprite to TRUE
  else
    puppetSprite pSlideBarSprite, FALSE
    updateStage
  end if
end

on mScrollLine me, prmUpDown
  if the visible of sprite pSlideBarSprite = FALSE then return
  if prmUpDown = 1 then
    if not (the scrollTop of member pField < pTopScroll) then return
    set tPercen = (((the scrollTop of member pField + the lineHeight of member pField)Â
                        / the lineHeight of member pField) * 100)Â
                        / (the lineCount of member pField - pVisibleArea)
  else
    set tPercen = ((the scrollTop of member pField / the lineHeight of member pField) * 100)Â
                        / (the lineCount of member pField - pVisibleArea)
  end if
  scrollByLine member pField, prmUpDown
  set the locV of sprite pSlideBarSprite to (pTop + ((tPercen * (pBot - pTop)) / 100))
  updateStage
end

HANDLERS

on hGetLastVoidSprite
  global version

  if value(char 1 of version) < 6 then set tLastSprite = 48
  else set tLastSprite = 120
  repeat with j = tLastSprite down to 1
    if not (the memberNum of sprite j) then return j
  end repeat
end hGetLastVoidSprite

on hGetSpriteOfMember whichMember
  -- Std hadler that returns the current sprite where and specified
member is located
  global version

  if value(char 1 of version) < 6 then set tLastSprite = 48
  else set tLastSprite = 120
  repeat with j = 1 to tLastSprite
    if the member of sprite j = member whichMember then return j
  end repeat
  return 0
end hGetSpriteOfMember