initial checkin
authorClaus Gittinger <cg@exept.de>
Sat, 08 Dec 2001 01:36:21 +0100
changeset 1536 fa0601a87d6e
parent 1535 a9fcabccabb3
child 1537 364eabac0aec
initial checkin
FlyByHelp.st
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FlyByHelp.st	Sat Dec 08 01:36:21 2001 +0100
@@ -0,0 +1,242 @@
+"{ Package: 'stx:libview2' }"
+
+ActiveHelp subclass:#FlyByHelp
+	instanceVariableNames:'currentFrame currentView currentHelpView showProcess closeProcess'
+	classVariableNames:'DelayTime ShowTime TheOneAndOnlyHelpListener'
+	poolDictionaries:''
+	category:'Interface-Help'
+!
+
+
+!FlyByHelp class methodsFor:'initialization'!
+
+initialize
+    "set default delay & help-display times"
+
+    ShowTime := 15.
+    DelayTime := 0.25.
+
+    "
+     FlyByHelp initialize
+    "
+
+    "Modified: 27.4.1996 / 15:07:27 / cg"
+! !
+
+!FlyByHelp class methodsFor:'start & stop'!
+
+start
+    "start activeHelp for all apps"
+
+    TheOneAndOnlyHelpListener isNil ifTrue:[
+        TheOneAndOnlyHelpListener := self new.
+    ].
+    TheOneAndOnlyHelpListener listenForAll
+
+    "
+     FlyByHelpHelp start
+    "
+! !
+
+!FlyByHelp methodsFor:'private'!
+
+helpTextFromModel:aModel view:aView at:aPointOrNil 
+    "helper: ask aModel for its helpText."
+
+    |text|
+
+    aPointOrNil notNil ifTrue:[
+        (aModel respondsTo:#flyByHelpTextFor:at:) ifTrue:[
+            text := aModel flyByHelpTextFor:aView at:aPointOrNil.
+        ].
+    ].
+    text isNil ifTrue:[
+        (aModel respondsTo:#flyByHelpTextFor:) ifTrue:[
+            text := aModel flyByHelpTextFor:aView.
+        ].
+    ].
+    ^ text
+!
+
+helpTextFromView:aView at:aPointOrNil 
+    "helper: ask aView for its helpText."
+
+    |text|
+
+    aPointOrNil notNil ifTrue:[
+        (aView respondsTo:#flyByHelpTextAt:) ifTrue:[
+            text := aView flyByHelpTextAt:aPointOrNil.
+        ].
+    ].
+    text isNil ifTrue:[
+        (aView respondsTo:#flyByHelpText) ifTrue:[
+            text := aView flyByHelpText.
+        ].
+    ].
+    ^ text.
+!
+
+hideIfPointerLeft:aView
+    "hide help, if the pointer is not in aView"
+
+    |whereOnScreen|
+
+    currentFrame notNil ifTrue:[
+        whereOnScreen := aView graphicsDevice pointerPosition.
+
+        (currentFrame notNil
+        and:[(currentFrame insetBy:1@1) containsPoint:whereOnScreen]) ifFalse:[
+            self hideHelp.
+        ].
+    ].
+
+    "Modified: 28.5.1996 / 20:18:28 / cg"
+!
+
+initiateHelpFor:aView at:aPointOrNil now:showItNow
+    "ask aView for helpText, passing x/y coordinates;
+     start a timeout process to display this helpText after some delay;
+     Normally used internally, but can also be used by widgets to force 
+     re-negotiation of the displayed helpText 
+     (for example in a menu, when the selection changes)"
+
+    |text|
+
+    (self interestedIn:aView) ifFalse:[
+        ^ self
+    ].
+
+    text := self helpTextFor:aView at:aPointOrNil.
+    lastHelpText = text ifTrue:[
+        ^ self
+    ].
+
+    text size > 0 ifTrue:[
+        (showItNow not and:[DelayTime > 0]) ifTrue:[
+            self stopHelpDisplayProcess.
+            showProcess := [
+                    Delay waitForSeconds:DelayTime.
+                    showProcess := nil.
+                    self showHelp:text for:aView
+            ] forkAt:(Processor userSchedulingPriority + 1).
+        ] ifFalse:[
+            self showHelp:text for:aView
+        ]
+    ].
+!
+
+interestedIn:aView
+    "return true, if I am interested in aView (either listeningForAll,
+     or in my list of apps)"
+
+    aView isNil ifTrue:[^ false].
+    aView topView == currentHelpView ifTrue:[^ false].
+
+    ^ super interestedIn:aView
+! !
+
+!FlyByHelp methodsFor:'show / hide help'!
+
+hideHelp
+    "hide the help text"
+
+    |p|
+
+    self stopHelpDisplayProcess.
+
+    currentHelpView notNil ifTrue:[
+        [
+            currentHelpView destroy.
+            currentHelpView := nil.
+            currentView := nil.
+        ] valueUninterruptably
+    ].
+    currentFrame := nil.
+    closeProcess notNil ifTrue:[
+        p := closeProcess. closeProcess := nil.
+        p terminate.
+    ]
+
+    "Modified: 28.6.1997 / 14:03:50 / cg"
+!
+
+showHelp:aHelpText for:view
+    "show the help text for aView"
+
+    |org p v dev|
+
+    view == currentView ifTrue:[
+        lastHelpText = aHelpText ifTrue:[
+            ^ self
+        ]
+    ].
+
+    lastHelpText := aHelpText.
+
+    closeProcess notNil ifTrue:[
+        p := closeProcess. closeProcess := nil.
+        p terminate.
+    ].
+    currentHelpView notNil ifTrue:[
+        self hideHelp
+    ].
+
+    org := view originRelativeTo:nil.
+    currentFrame := org extent:view extent.
+    org :=org + (view extent // 2).
+
+    v := ActiveHelpView for:aHelpText withCRs.
+
+    dev := view graphicsDevice.
+    org := dev pointerPosition.
+    org := org + (10@10).
+    (org x + v width) > dev width ifTrue:[
+        org := (org x - v width) @ org y
+    ].
+    (org y + v height) > dev height ifTrue:[
+        org := org x @ (org y - v height).
+    ].
+
+    v origin:org.
+"/    currentHelpView open.
+    v realize.
+    v enableButtonMotionEvents.
+    v enableMotionEvents.
+    currentHelpView := v.
+
+    currentView := view.
+    closeProcess := [
+        [
+            (Delay forSeconds:ShowTime) wait.
+            [
+                currentHelpView notNil ifTrue:[
+                    currentHelpView destroy.
+                    currentHelpView := nil.
+                ]
+            ] valueUninterruptably
+        ] valueOnUnwindDo:[
+            closeProcess := nil.
+        ].
+    ] forkAt:(Processor userSchedulingPriority + 1).
+
+    "Modified: 31.8.1995 / 19:20:45 / claus"
+    "Modified: 28.6.1997 / 14:45:15 / cg"
+!
+
+stopHelpDisplayProcess
+    |p|
+
+    showProcess notNil ifTrue:[
+        p := showProcess. showProcess := nil.
+        p terminate.
+    ].
+
+    "Created: 28.6.1997 / 14:03:17 / cg"
+! !
+
+!FlyByHelp class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /cvs/stx/stx/libview2/FlyByHelp.st,v 1.1 2001-12-08 00:36:21 cg Exp $'
+! !
+FlyByHelp initialize!