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 $'
! !