"
COPYRIGHT (c) 1995 by Claus Gittinger
All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
inclusion of the above copyright notice. This software may not
be provided or otherwise made available to, or used by, any
other person. No title to or ownership of the software is
hereby transferred.
"
'From Smalltalk/X, Version:2.10.5 on 26-mar-1995 at 10:19:20 am'!
EventListener subclass:#ActiveHelp
instanceVariableNames:'currentView currentHelpView currentFrame closeProcess'
classVariableNames:'ShowTime TheOneAndOnlyHelpListener'
poolDictionaries:''
category:'Interface-Help'
!
!ActiveHelp class methodsFor:'documentation'!
version
"
$Header: /cvs/stx/stx/libview2/ActiveHelp.st,v 1.1 1995-03-31 03:08:53 claus Exp $
"
!
documentation
"
The active help listener
"
!
copyright
"
COPYRIGHT (c) 1995 by Claus Gittinger
All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
inclusion of the above copyright notice. This software may not
be provided or otherwise made available to, or used by, any
other person. No title to or ownership of the software is
hereby transferred.
"
! !
!ActiveHelp class methodsFor:'initialization'!
initialize
ShowTime := 15
! !
!ActiveHelp class methodsFor:'startup'!
start
TheOneAndOnlyHelpListener isNil ifTrue:[
TheOneAndOnlyHelpListener := self new.
].
TheOneAndOnlyHelpListener listen
"
ActiveHelp start
"
!
stop
TheOneAndOnlyHelpListener notNil ifTrue:[
TheOneAndOnlyHelpListener unlisten.
].
"
ActiveHelp stop
"
!
release
self stop.
TheOneAndOnlyHelpListener := nil
"
ActiveHelp release
"
! !
!ActiveHelp methodsFor:'private'!
helpTextFor:aView atX:x y:y
|model text view org found v sv|
view := aView.
(model := aView model) notNil ifTrue:[
"/ model printNL.
(model respondsTo:#helpTextFor:at:) ifTrue:[
text := model helpTextFor:aView at:x@y.
text notNil ifTrue:[^ text].
].
(model respondsTo:#helpTextFor:) ifTrue:[
text := model helpTextFor:aView.
text notNil ifTrue:[^ text].
]
].
(aView respondsTo:#helpText) ifTrue:[
text := aView helpText.
text notNil ifTrue:[^ text].
].
"walk up the chain - maybe someone knows about its subview ..."
v := aView.
[(sv := v superView) notNil] whileTrue:[
(model := sv model) notNil ifTrue:[
(model respondsTo:#helpTextFor:at:) ifTrue:[
text := model helpTextFor:aView at:x@y.
text notNil ifTrue:[^ text].
].
(model respondsTo:#helpTextFor:) ifTrue:[
text := model helpTextFor:aView.
text notNil ifTrue:[^ text].
]
].
(sv respondsTo:#helpTextFor:) ifTrue:[
text := sv helpTextFor:aView.
text notNil ifTrue:[^ text].
text := sv helpTextFor:v.
text notNil ifTrue:[^ text].
].
v := sv.
].
(view class respondsTo:#helpText) ifTrue:[
text := view class helpText.
text notNil ifTrue:[^ text].
].
^ nil
!
hideIfPointerLeft:aView
|whereOnScreen|
whereOnScreen := aView device pointerPosition.
(currentFrame notNil
and:[(currentFrame insetBy:1@1) containsPoint:whereOnScreen]) ifFalse:[
self hideHelp.
currentView := nil
].
! !
!ActiveHelp methodsFor:'listening'!
buttonPress:state x:x y:y view:view
self hideHelp.
^ false
!
pointerEnter:state x:x y:y view:aView
|text|
self hideIfPointerLeft:aView.
aView topView == currentHelpView ifTrue:[
^ true
].
text := self helpTextFor:aView atX:x y:y.
text notNil ifTrue:[
self showHelp:text for:aView
].
^ false
!
pointerLeave:state view:view
self hideIfPointerLeft:view.
^ false
!
keyPress:state x:x y:y view:view
self hideHelp.
^ false
!
buttonMotion:state x:x y:y view:view
self hideIfPointerLeft:view.
^ false
! !
!ActiveHelp methodsFor:'show / hide help'!
hideHelp
currentHelpView notNil ifTrue:[
[
currentHelpView destroy.
currentHelpView := nil.
currentView := nil.
] valueUninterruptably
].
currentFrame := nil.
closeProcess notNil ifTrue:[
closeProcess terminate.
]
!
showHelp:aHelpText for:view
|org|
view == currentView ifTrue:[^ self].
currentHelpView notNil ifTrue:[
self hideHelp
].
org := view originRelativeTo:nil.
currentFrame := org extent:view extent.
org :=org + (view extent // 2).
org := view device pointerPosition.
currentHelpView := ActiveHelpView for:aHelpText withCRs.
currentHelpView origin:org.
"/ currentHelpView open.
currentHelpView realize.
currentHelpView enableButtonMotionEvents.
currentHelpView enableMotionEvents.
currentView := view.
closeProcess := [
Process terminateSignal handle:[:ex |
closeProcess := nil.
] do:[
(Delay forSeconds:ShowTime) wait.
[
currentHelpView notNil ifTrue:[
currentHelpView destroy.
currentHelpView := nil.
]
] valueUninterruptably
].
] forkAt:(Processor userSchedulingPriority + 1).
! !
ActiveHelp initialize!