SubCanvas.st
author ca
Wed, 15 Oct 1997 12:31:52 +0200
changeset 557 7cf5f021983d
parent 554 c32ed45bfc6e
child 609 ad75d5f13ca1
permissions -rw-r--r--
add method: #updateFromChannels

ScrollableView subclass:#SubCanvas
	instanceVariableNames:'builder spec client clientHolder specHolder'
	classVariableNames:''
	poolDictionaries:''
	category:'Views-Basic'
!


!SubCanvas methodsFor:'accessing'!

builder
    "return the value of the instance variable 'builder' (automatically generated)"

    ^ builder!

client
    "return the value of the instance variable 'client' (automatically generated)"

    ^ client!

client:anApplicationModel
    "release existing components and generate new components from
     the applications windowSpec."

    ^ self client:anApplicationModel spec:#windowSpec
!

client:anApplication spec:aWindowSpecOrSelector
    "release existing components and generate new components from
     the applications windowSpec."

    |aBuilder|

    (anApplication notNil and:[anApplication respondsTo:#builder]) ifTrue:[
        aBuilder := anApplication builder
    ] ifFalse:[
        aBuilder := UIBuilder new
    ].
  ^ self client:anApplication spec:aWindowSpecOrSelector builder:aBuilder
!

client:anApplication spec:aWindowSpecOrSpecSymbol builder:aBuilder
    "release existing components and generate new components from
     the given windowSpec, using the given builder."

    builder  := aBuilder.
    spec     := aWindowSpecOrSpecSymbol.

    "/ check for master application
    (anApplication notNil and:[anApplication masterApplication isNil]) ifTrue:[
        client := nil.
        client := self application.
        client ~~ anApplication ifTrue:[
            anApplication masterApplication:client
        ]
    ].
    client := anApplication.
    self rebuild.
  ^ builder
!

spec
    "return the value of the instance variable 'spec' (automatically generated)"

    ^ spec!

spec:something
    "set the value of the instance variable 'spec' (automatically generated)"

    spec := something.
    self rebuild.
! !

!SubCanvas methodsFor:'accessing channels'!

clientHolder
    ^ clientHolder
!

clientHolder:aValueHolder

    clientHolder notNil ifTrue:[
        clientHolder removeDependent:self
    ].
    (clientHolder := aValueHolder) notNil ifTrue:[
        clientHolder addDependent:self
    ].
    self updateFromChannels
!

specHolder
    ^ specHolder
!

specHolder:aValueHolder

    specHolder notNil ifTrue:[
        specHolder removeDependent:self
    ].
    (specHolder := aValueHolder) notNil ifTrue:[
        specHolder addDependent:self
    ].
    self updateFromChannels
! !

!SubCanvas methodsFor:'building'!

rebuild
    "rebuild
    "
    |win|

    scrolledView notNil ifTrue:[
        scrolledView destroySubViews
    ].

    spec notNil ifTrue:[
        (win := spec) isSymbol ifTrue:[
            client isNil ifTrue:[
                ^ self
            ].
            (win := client class interfaceSpecFor:spec) isNil ifTrue:[
                ^ self
            ]
        ].
        builder isNil ifTrue:[
            builder := UIBuilder new
        ].
        builder buildFromSpec:win in:scrolledView.

        self realized ifTrue:[
            scrolledView realizeAllSubViews
        ]
    ]
!

releaseAllComponents
    scrolledView destroySubViews.
    builder := nil.
    spec    := nil.
    client  := nil.
! !

!SubCanvas methodsFor:'change & update'!

update:something with:aParameter from:changedObject
    "one of my models changed its value
    "
    (changedObject == clientHolder or:[changedObject == specHolder]) ifTrue:[
        self updateFromChannels
    ] ifFalse:[
        super update:something with:aParameter from:changedObject.
    ]

!

updateFromChannels
    "update canvas from channel
    "
    |client spec|

    clientHolder isNil ifTrue:[
        client := self application
    ] ifFalse:[
        client := clientHolder value
    ].

    specHolder isNil ifTrue:[
        spec := #windowSpec
    ] ifFalse:[
        spec := specHolder value
    ].
    (client notNil and:[spec notNil]) ifTrue:[
        self client:client spec:spec
    ] ifFalse:[
        self client:nil
    ]


! !

!SubCanvas methodsFor:'initialization'!

initialize
    super initialize.
    self scrolledView:View new.
    spec := #windowSpec.
! !

!SubCanvas methodsFor:'queries'!

application
    "return the application, under which this view was opened,
    "

    client notNil ifTrue:[
        ^ client
    ].
    ^ super application

! !

!SubCanvas class methodsFor:'documentation'!

version
    ^ '$Header: /cvs/stx/stx/libwidg2/SubCanvas.st,v 1.5 1997-10-15 10:31:52 ca Exp $'
! !