ListSpecEditor.st
author ca
Mon, 09 Mar 1998 17:06:35 +0100
changeset 861 10bbb13fcb05
parent 843 855bc1495dd9
child 864 d1637e8e1be1
permissions -rw-r--r--
add more simple drag & drop functionality: support one icon for a set of drag objects

ToolApplicationModel subclass:#ListSpecEditor
	instanceVariableNames:'modified aspects specClass specSelector tabSelection hasSaved'
	classVariableNames:''
	poolDictionaries:''
	category:'Interface-Framework'
!

!ListSpecEditor class methodsFor:'documentation'!

documentation
"
    Abstract super class for the MenuEditor, DataSetBuilder, 
    HierarchicalListEditor, and the TabListEditor.

    [author:]
         Thomas Zwick
"
! !

!ListSpecEditor class methodsFor:'accessing'!

resourceType

    ^#list
! !

!ListSpecEditor class methodsFor:'aspects'!

aspects

    ^#()
! !

!ListSpecEditor methodsFor:'accessing'!

modified       

    ^modified
!

modified: aBoolean         

    modified := aBoolean
!

specClass

    ^specClass
!

specClass:aClass

    aClass isBehavior ifTrue:[specClass := aClass name]
                     ifFalse:[specClass := aClass]
!

specSelector

    ^specSelector

!

specSelector:aSelector

    specSelector := aSelector
! !

!ListSpecEditor methodsFor:'aspects'!

aspectFor:aKey
    "returns aspect for a key or nil"

    ^aspects at: aKey ifAbsent: [super aspectFor:aKey]

!

tabModel

    |holder|
    (holder := builder bindingAt:#tabModel) isNil ifTrue:[
        holder := AspectAdaptor new subject:self; forAspect:#tabSelection.
        builder aspectAt:#tabModel put:holder.
    ].
    ^ holder
!

valueOfEnableMovingIn

    ^builder booleanValueAspectFor: #valueOfEnableMovingIn



!

valueOfEnableMovingOut

    ^builder booleanValueAspectFor: #valueOfEnableMovingOut



!

valueOfEnableMovingUpOrDown

    ^builder booleanValueAspectFor: #valueOfEnableMovingUpOrDown




! !

!ListSpecEditor methodsFor:'change & update'!

update:something with:aParameter from:someObject
    "one of my aspects has changed; update modified channel"

    self valueOfEnablingCommitButtons value: true 

! !

!ListSpecEditor methodsFor:'help'!

defaultInfoLabel

    (specClass isSymbol and: [(Smalltalk at: specClass) isClass])
    ifTrue:
    [
        ^specClass, ' >> ', specSelector
    ].
    ^'No class defined'

! !

!ListSpecEditor methodsFor:'initialization'!

initialize

    super initialize.

    hasSaved := modified := false.
    aspects  := IdentityDictionary new.
    specSelector := self class resourceType.
    tabSelection := 0.

    self class aspects do:
    [:aKey|
        |holder|
        aspects at:aKey put: (holder := ValueHolder new).
        holder addDependent: self
    ].
! !

!ListSpecEditor methodsFor:'private'!

askForItemModification
    "ask for item modification"

    self valueOfEnablingCommitButtons value
    ifTrue:
    [          
        ((YesNoBox title:'List item was modified!!\Save it?\' withCRs)        
            noText:'No';
            yesText:'Yes';
            showAtPointer;
            accepted) 
        ifFalse: 
        [
            self valueOfEnablingCommitButtons value: false. 
            modified := false.
            ^true
        ].
        self accept
    ].
    ^true

!

askForListModification
    "ask for list modification
    "       
    modified
    ifTrue:
    [
        ((YesNoBox title: 'List was modified!!')        
            noText:'Cancel';
            yesText:'Waste it and proceed';
            showAtPointer;
            accepted) ifFalse: [^false].
        modified := false
    ].
    ^true
!

askForModification
    "ask in order for item and for list modification"

    ^self askForItemModification and: [self askForListModification]

!

resolveClassNamed
    "returns current class or nil"

    ^Smalltalk resolveName:specClass inClass:self class
!

resourceMessage: aString

    (aString notNil and: [self askForModification]) 
    ifTrue:
    [            
        |msg cls sel|
        msg := aString asCollectionOfWords.
        (msg size == 2 and:
        [(cls := self resolveName:(msg at:1)) notNil])
        ifTrue:
        [
            specClass := cls name.
            specSelector := (msg at: 2) asSymbol.
            ^true
        ]
    ].
    ^false
!

updateHistory

    |cls|             
    ((cls := self resolveClassNamed) notNil and: [cls class implements: specSelector])
    ifTrue:
    [
        |className message|
        specClass isClass  ifTrue: [className := specClass name].
        specClass isString ifTrue: [className := specClass].
        message := className, ' ', specSelector.
        self addToHistory: message -> #loadFromMessage:
    ]
! !

!ListSpecEditor methodsFor:'queries'!

didInstall
    "returns true if list has saved"

    ^hasSaved

!

hasSaved
    "returns true if list has saved"

    ^hasSaved

! !

!ListSpecEditor methodsFor:'selection'!

tabSelection
    "returns selected tab index or 0"

    ^tabSelection

! !

!ListSpecEditor methodsFor:'startup / release'!

closeRequest
    "close request"

    self askForModification ifTrue: [super closeRequest]

!

loadFromMessage:aString
    "load a spec from class and selector
    "
    (aString notNil and: [self askForModification]) 
    ifTrue:
    [            
        |msg cls sel|
        msg := aString asCollectionOfWords.
        (msg size == 2 and:
        [(cls := self resolveName:(msg at:1)) notNil and:
        [cls class implements: (sel := (msg at: 2) asSymbol)]])
        ifTrue:
        [
            specClass := cls name.
            specSelector := sel.
            self buildFromClass: specClass andSelector: specSelector.
            ^true
        ]
    ].
    ^false
!

openModalOnClass:aClass andSelector:aSelector

    specClass := aClass isClass ifTrue: [aClass name] ifFalse: [aClass].
    specSelector := (aSelector ? specSelector) asSymbol.
    super openInterfaceModal.

!

openOnClass:aClass andSelector:aSelector

    specClass := aClass isClass ifTrue: [aClass name] ifFalse: [aClass].
    specSelector := (aSelector ? specSelector) asSymbol.
    super openInterface.
    self buildFromClass:aClass andSelector:aSelector.
!

postBuildWith:builder

    super postBuildWith:builder.

    self buildFromClass: specClass andSelector: specSelector




! !

!ListSpecEditor methodsFor:'user actions'!

accept

    self valueOfEnablingCommitButtons value:false.
    modified := true
!

doBrowseClass
    "browse class of list spec"

    |cls|

    (cls := self resolveClassNamed) notNil 
        ifTrue: [SystemBrowser openInClass:cls class selector: specSelector] 
        ifFalse:[self information:'No class defined!!']
!

doEditImage

    |cls resourceClass resourceSelector imageResourceMessage readStream|

    cls := self resolveName: specClass.
    cls isNil ifTrue:[
        ^ self information:'No valid class defined!!'.
    ].
    (aspects at:#icon) value size > 0
        ifTrue:  [resourceSelector := (aspects at:#icon) value]
        ifFalse: [resourceSelector := #stxIcon].
    (aspects at:#retriever) value size > 0
        ifTrue:  [resourceClass := (aspects at:#retriever) value]
        ifFalse: [resourceClass := cls withAllSuperclasses detect: [:cls| cls class implements: resourceSelector] ifNone: [cls]].

    (imageResourceMessage := ImageEditor openModalOnClass: resourceClass andSelector: resourceSelector) notNil
    ifTrue:
    [
        readStream := imageResourceMessage readStream.
        resourceClass := (readStream upTo: $ ) asSymbol.
        resourceSelector := readStream upToEnd asSymbol.
        resourceClass size > 0 ifTrue: [(aspects at:#retriever) value: resourceClass].
        resourceSelector size > 0 ifTrue: [(aspects at:#icon) value: resourceSelector. self valueOfEnablingCommitButtons value: true]
    ]


!

doLoad

    self loadFromMessage: 
        (ResourceSelectionBrowser
            request: 'Load From Class'
            onSuperclass: nil
            andClass: specClass
            andSelector: specSelector
            withResourceTypes: (Array with: self class resourceType))
!

doSave

    self askForItemModification.

    (specClass isNil or:[specSelector isNil]) ifTrue:[
        self doSaveAs.
        ^false
    ].
    ^true
!

doSaveAs

    |resourceMessage|
    self askForItemModification.
    (resourceMessage := ResourceSelectionBrowser
            request: 'Save In Class'
            onSuperclass: #Object
            andClass: specClass
            andSelector: specSelector
            withResourceTypes: (Array with: self class resourceType)) notNil
    ifTrue:
    [  
        modified := false.
        (self resourceMessage: resourceMessage)
        ifTrue:
        [
            self doSave.
            self buildFromClass: specClass andSelector: specSelector.
            ^true
        ]
    ].
    ^false
! !

!ListSpecEditor class methodsFor:'documentation'!

version
    ^ '$Header: /cvs/stx/stx/libview2/Attic/ListSpecEditor.st,v 1.7 1998-02-17 15:27:20 tz Exp $'
! !