ValModel.st
author claus
Wed, 10 May 1995 04:26:18 +0200
changeset 71 5b34cd877517
parent 70 2ab6538e2643
child 73 7b95459b18a6
permissions -rw-r--r--
.

'From Smalltalk/X, Version:2.10.5 on 9-may-1995 at 12:03:02 pm'!

Model subclass:#ValueModel
	 instanceVariableNames:'accepted interrest'
	 classVariableNames:''
	 poolDictionaries:''
	 category:'Interface-Support-Models'
!

!ValueModel class methodsFor:'documentation'!

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.
"
!

version
"
$Header: /cvs/stx/stx/libview2/Attic/ValModel.st,v 1.6 1995-05-10 02:26:18 claus Exp $
"
!

documentation
"
    abstract superclass for ValueHolders and Adaptors.
    It does not itself know how and where the value is stored,
    but knows about interrested objects (which get informed, whenever
    the value changes) and keeps track if the value was ever accepted.

    Notice: this class was implemented using protocol information
    from alpha testers - it may not be complete or compatible to
    the corresponding ST-80 class. If you encounter any incompatibilities,
    please forward a note to the ST/X team.

    subclasses must redefine: #setValue: and #value
    (and optionally redefine #value:)
"
! !

!ValueModel class methodsFor:'instance creation'!

new
    ^ (super new) initialize
! !

!ValueModel methodsFor:'change notification'!

notifyChange:aSymbol
    interrest notNil ifTrue:[
	interrest keysAndValuesDo:[:someone :selector |
	    someone perform:selector
	].
    ].
    self changed:aSymbol
! !

!ValueModel methodsFor:'accessing'!

value:anObject
    |oldValue|

    oldValue := self value.
    self setValue:anObject.
    anObject ~= oldValue ifTrue:[
	self notifyChange:#value
    ]
!

accepted
    ^ accepted
!

accept
    accepted := true
!

value 
    self subclassResponsibility
!

setValue:newValue 
    self subclassResponsibility
! !

!ValueModel methodsFor:'initialization'!

initialize
    accepted := false
! !

!ValueModel methodsFor:'interrest'!

retractInterrestFor:someone
    "release interrest i.e. do no longer send changeMsg to changeReceiver
     iff someone is the changeReceiver.
     This can be used to (temporarily) turn off information sends,
     to break endless cycles (if two values change each other)"

    interrest notNil ifTrue:[
	interrest removeKey:someone ifAbsent:nil
    ]
!

onChangeSend:selector to:someone
    "add an interrest, arranging that
     a message with selector will be sent to someone 
     when my value changes."

    interrest isNil ifTrue:[
	interrest := IdentityDictionary new
    ].
    interrest at:someone put:selector
! !