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