From VisualWorks®, 7.6 of February 8, 2008 on March 3, 2008 at 9:42:58 pm (Dialog confirm: 'You are filing-in a Parcel source file!\\While this is possible it will not have\the same effect as loading the parcel.\None of the Parcel''s prerequisites will\be loaded and none of its load actions\will be performed.\\Are you sure you want to file-in?' withCRs) ifFalse: [self error: 'Parcel file-in abandoned. Choose terminate or close.'] <class> <name>ChangeEditor</name> <environment>Tools</environment> <super>UI.ApplicationModel</super> <private>false</private> none source classList methodList destinationList text changeType classRemove classRename classComment classOrganize mode menus <imports></imports> <category>Tools-Changes</category> <attributes> <package>Tools-Changes</package> </attributes> </class> <class> <name>AbstractChangeList</name> <environment>Tools</environment> <super>UI.ApplicationModel</super> <private>false</private> none value listName changes selectionIndex list filter removed filterList filterKey changeDict checkSystem fieldList selectionInList verticalConflicts differencesMode classesDistinct menuBar menus <imports> XML.MalformedSignal </imports> <category>Tools-Changes</category> <attributes> <package>Tools-Changes</package> </attributes> </class> <comment> Tools.AbstractChangeList
Class AbstractChangeList is the abstract superclass for applications that manage a sequence of Change objects. These Change objects are taken from a number of source files and/or the system itself. It can perform numerous useful operations on these change objects such as - various conflict analyses on its changes, comparing external code against the system, or identifying conflicts amongst a set of sources - organizing a set fo changes for producing a file-out - crash recovery, by reading in the unsaved changes from the changes file Instance Variables: value <String> the text of the currently selected change, or an empty string listName <String> label for browser, the set of files that have been read changes <List of: Change> the underlying collection of changes selectionIndex <Integer> currently selected change, or 0 if none list <List of: Change> filtered collection of changes filter <BlockClosure> filter predicate to select which changes are displayed in the list removed <Set> changes marked for removal from the list (displayed struck-out in the list) filterList <(Array of: Symbol) | nil> filters (messages to Change) that are used to select subsets of the changes to display in the list. filterKey <Change> the change supplying the key value(s) for the filter(s) changeDict <Dictionary from: Symbol to: (OrderedCollection of: Change)> cross-index for conflict detection checkSystem <Symbol | nil> symbol specifying whether conflicts are checked against the system or internally amongst the current sequence of changes. If nil, conflicts are checked amongst the receiver's changes. Otherwise changes are checked against the corresponding system code. In this case, checkSystem is #exact for a textual check or #code for a code check (which ignores comments). fieldList <nil | (Array of: Symbol)> individual field options selectionInList <SelectionInList> UI wrapper for list used to control entry redisplay etc. verticalConflicts <Boolean> variable which decides the layout of the text and conflict views. If verticalConflicts is true then these views are side-by-side, and if false, these views are top-by-bottom. differencesMode <Symbol> either #code for comparing changes code token by code token, ignoring comments, or #exact for comparing changes textually, including comments classesDistinct <Boolean> variable controlling matching via the 'class' button and 'Find class...' dialog. If classesDistinct is true then class matching is "exact". If false then class and metaclass changes are equivalent and included. classesDistinct is initially false. menuBar <Menu> the menu bar. Class Variables: ChangeListYellowButtonMenu <Menu> the ChangeList's Operate pop-up menu EmphasizeDifferences <Boolean> if true then entries in the list that are the same as the system are shown in italics, and those that are different are emboldened. If false, then all entries are in normal face. DifferencesMode <Symbol> Default value for differencesMode above. VerticalConflicts <Boolean> default value of verticalConflicts above
</comment> <class> <name>OverrideList</name> <environment>Tools</environment> <super>Tools.AbstractChangeList</super> <private>false</private> none <imports></imports> <category>Tools-Changes</category> <attributes> <package>Tools-Changes</package> </attributes> </class> <class> <name>MiniChangeSetManager</name> <environment>Tools</environment> <super>UI.ApplicationModel</super> <private>false</private> none labelHolder <imports></imports> <category>Tools-Changes</category> <attributes> <package>Tools-Changes</package> </attributes> </class> <comment> Tools.MiniChangeSetManager
MiniChangeSetManager is the application model of the tiny one-line application intended for the launcher's status bar. It displays the currently selected change set, allows one to change the change set, and do basic connection information management. Instance Variables: labelHolder <AspectAdaptor> on the current change set holder in the ChangeSet class, displaying its #displayString property in the application.
</comment> <class> <name>ChangeList</name> <environment>Tools</environment> <super>Tools.AbstractChangeList</super> <private>false</private> none <imports></imports> <category>Tools-Changes</category> <attributes> <package>Tools-Changes</package> </attributes> </class> <comment> Tools.ChangeList
Class ChangeList manages a sequence of Change objects taken from a number of source files or the system itself.
</comment> <class> <name>ChangeSetManager</name> <environment>Tools</environment> <super>UI.ApplicationModel</super> <private>false</private> none listModel listMenu menuBar currentSetIcon <imports></imports> <category>Tools-Changes</category> <attributes> <package>Tools-Changes</package> </attributes> </class> <comment> Tools.ChangeSetManager
ChangeSetManager is the application for managing the current list of change sets held by the NamedChangedSet class. Instance Variables: listModel <SelectionInList> UI widget on the list of change sets listMenu <ValueHolder on: Menu> value holder for the list menu menuBar <Menu> the menu bar menu currentSetIcon <Image> The icon used be the dataset to indicate the current change set.
</comment> <name>DifferencesMode</name> <environment>Tools.AbstractChangeList</environment> <private>false</private> <constant>false</constant> <category>As yet unclassified</category> <initializer>#exact</initializer> <attributes> <package>Tools-Changes</package> </attributes> <name>EmphasizeDifferences</name> <environment>Tools.AbstractChangeList</environment> <private>false</private> <constant>false</constant> <category>As yet unclassified</category> <initializer>false</initializer> <attributes> <package>Tools-Changes</package> </attributes> <name>VerticalConflicts</name> <environment>Tools.AbstractChangeList</environment> <private>false</private> <constant>false</constant> <category>As yet unclassified</category> <initializer>true</initializer> <attributes> <package>Tools-Changes</package> </attributes> <methods> Tools.ChangeEditor <category>initialize-release</category>
initialize classList := SelectionInList new. methodList := SelectionInList new. menus := Dictionary new. destinationList := SelectionInList with: (self changeSetClass changeSetList). text := String new asValue. changeType := nil asValue. classRemove := false asValue. classRename := false asValue. classComment := false asValue. classOrganize := false asValue. mode := #none. classList selectionIndexHolder onChangeSend: #setMethodList to: self. methodList selectionIndexHolder onChangeSend: #setTextAndFlags to: self. destinationList selectionIndexHolder onChangeSend: #setTextAndFlags to: self. changeType onChangeSend: #changedChangeType to: self. classComment onChangeSend: #changedClassComment to: self. classOrganize onChangeSend: #changedClassOrganize to: self. self sourceHolder: self changeSetManager current asValue.
sourceHolder: aSourceHolder source notNil ifTrue: [source retractInterestsFor: aSourceHolder]. source := aSourceHolder. source onChangeSend: #changedSource to: self. self changedSource
</methods> <methods> Tools.ChangeEditor <category>aspects</category>
changeType ^changeType
classComment ^classComment
classList ^classList
classOrganize ^classOrganize
classRemove ^classRemove
classRename ^classRename
destinationList ^destinationList
methodList ^methodList
text ^text
</methods> <methods> Tools.ChangeEditor <category>actions</category>
acceptText: aTextEditorController "If we're displaying a change set's comment, then update the comment." | string | self className notNil ifTrue: [aTextEditorController view flash. ^false]. self destination isNil ifTrue: [(string := aTextEditorController text string) ~= self computeText string ifTrue: [source value comment: (string size > 0 ifTrue: [string])]] ifFalse: [self editDoits]. text value: self computeText. ^true
browseClass | class | (class := self currentSource classNamed: self className) isBehavior ifTrue: [SmalltalkWorkbench browseClass: class] ifFalse: [Screen default ringBell]
copyAllClasses classList list do: [:eachClass | self currentSource copy: eachClass to: self destination].
copyClass (self className isNil or: [self destination isNil]) ifTrue: [^nil]. self currentSource copy: self className to: self destination
copyMethod (self method isNil or: [self destination isNil]) ifTrue: [^nil]. self currentSource copy: self className method: self method to: self destination
editDoits | stream doIts | stream := text value readStream. doIts := OrderedCollection new. [stream atEnd] whileFalse: [(doIts addLast: stream nextChunk) isEmpty ifTrue: [doIts removeLast]]. self destination doIts: doIts
forgetClass | theName theChangeSet | (theName := self className) isNil ifTrue: [^nil]. ((theChangeSet := self currentSource) representsComponent: theName) ifTrue: [theChangeSet removeAllChangesForComponent: theName] ifFalse: [theChangeSet forget: theName]. self setClassList
forgetComponentChange: aComponentChange in: componentName self currentSource forgetComponentChange: aComponentChange in: componentName. self setClassList
forgetMethod self method isNil ifTrue: [^nil]. ( self currentSource representsComponent: self className ) ifTrue: [ ^self forgetComponentChange: self method in: self className ]. self currentSource removeSelectorChanges: self method class: self selectedClass. (self currentSource listOfClasses includes: self className) ifTrue: [self setMethodList] ifFalse: [self setClassList]
moveAllClasses classList list do: [:eachClass | self currentSource copy: eachClass to: self destination. self currentSource forget: eachClass]. self setClassList
moveClass (self className isNil or: [self destination isNil]) ifTrue: [^nil]. self currentSource copy: self className to: self destination. self currentSource forget: self className. self setClassList
moveMethod | theMethod theSource theName | ((theMethod := self method) isNil or: [self destination isNil]) ifTrue: [^nil]. (theSource := self currentSource) copy: (theName := self className) method: theMethod to: self destination. (theSource representsComponent: theName) ifTrue: [theSource removeComponentChange: theMethod] ifFalse: [theSource removeSelectorChanges: theMethod class: self selectedClass]. (theSource methodChangesAt: self className) isEmpty ifTrue: [self setClassList] ifFalse: [self setMethodList]
spawnMethod | class definition | self method isNil ifTrue: [^nil]. ((class := self currentSource classNamed: self className) isBehavior and: [class includesSelector: self method asSymbol]) ifTrue: [definition := MethodDefinition class: class selector: self method asSymbol. MethodCollector new openListBrowserOn: (Array with: definition) label: ((#CurrentDefinitionOf1s << #dialogs >> 'Current Definition of <1s>') expandMacrosWith: definition simpleDisplayString)] ifFalse: [Screen default ringBell]
updateClasses self setClassList
</methods> <methods> Tools.ChangeEditor <category>menus</category>
classMenu ^[self getClassMenu]
getClassMenu self className isNil ifTrue: [^nil]. ^(self destination isNil or: [self destination == self currentSource]) ifTrue: [self shortClassMenu] ifFalse:[self longClassMenu]
getMethodMenu self method isNil ifTrue: [^nil]. ^(self destination isNil or: [self destination == self currentSource]) ifTrue: [self shortMethodMenu] ifFalse: [self longMethodMenu]
longClassMenu ^menus at: #longClassMenu ifAbsentPut: [ Menu labelArray: (OrderedCollection new add: (#Browse << #menus >> 'Browse'); add: (#Move << #menus >> 'Move'); add: (#Copy << #menus >> 'Copy'); add: (#Forget << #menus >> 'Forget'); add: (#MoveAll << #menus >> 'Move All'); add: (#CopyAll << #menus >> 'Copy All'); add: (#Update << #menus >> 'Update'); asArray) lines: #(1 4 6) values: #(#browseClass #moveClass #copyClass #forgetClass #moveAllClasses #copyAllClasses #updateClasses)]
longMethodMenu ^menus at: #longMethodMenu ifAbsentPut: [ Menu labelArray: (Array with: (#Spawn << #menus >> 'Spawn') with: (#Move << #menus >> 'Move') with: (#Copy << #menus >> 'Copy') with: (#Forget << #menus >> 'Forget')) values: #(spawnMethod moveMethod copyMethod forgetMethod)]
methodMenu ^[self getMethodMenu]
shortClassMenu ^menus at: #shortClassMenu ifAbsentPut: [ Menu labelArray: (Array with: (#Browse << #menus >> 'Browse') with: (#Forget << #menus >> 'Forget') with: (#Update << #menus >> 'Update')) lines: #(1 2) values: #(#browseClass #forgetClass #updateClasses)]
shortMethodMenu ^menus at: #shortMethodMenu ifAbsentPut: [ Menu labelArray: (Array with: (#Spawn << #menus >> 'Spawn') with: (#Forget << #menus >> 'Forget')) values: #(spawnMethod forgetMethod)]
</methods> <methods> Tools.ChangeEditor <category>events</category>
noticeOfWindowClose: aWindow source retractInterestsFor: self. "Quick hack:" ChangeSetManager allInstances do: [:lwp| lwp removeDependent: self]
</methods> <methods> Tools.ChangeEditor <category>updating</category>
updateRequest "We don't want updates if change set comments are being edited." ^text changeRequest
</methods> <methods> Tools.ChangeEditor <category>private</category>
allInvisible builder == nil ifTrue: [^self]. #(rbadd rbchange rbremove classRemove classRename classComment classOrganize) do: [:s | (builder componentAt: s) beInvisible]
basicChangeTypeFor: types (types includes: #add) ifTrue: [^#add]. (types includes: #change) ifTrue: [^#change]. ^nil
changedChangeType self isInTransition ifTrue: [^self]. mode == #method ifTrue: [self currentSource changeTypeFor: self className method: self method put: changeType value. ^self]
changedClassComment self isInTransition ifTrue: [^self]. classComment value ifTrue: [self currentSource atClass: self selectedClass add: #comment] ifFalse: [self currentSource atClass: self selectedClass remove: #comment]
changedClassOrganize self isInTransition ifTrue: [^self]. classOrganize value ifTrue: [self currentSource atClass: self selectedClass add: #reorganize ] ifFalse: [self currentSource atClass: self selectedClass remove: #reorganize ]
changedSource self setWindowLabel. self setClassList
changeSetClass ^NamedChangeSet
changeSetManager ^ChangeSetManager
className ^classList selection
classSetVisible builder == nil ifTrue: [^self]. #(rbremove ) do: [:s | (builder componentAt: s) beInvisible]. #(rbadd rbchange classRemove classRename classComment classOrganize) do: [:s | (builder componentAt: s) beVisible].
classSetVisible: aType builder == nil ifTrue: [^self]. #(rbadd rbchange) do: [:s | (builder componentAt: s) isEnabled: false]. #(rbremove ) do: [:s | (builder componentAt: s) beInvisible]. #(classComment classOrganize) do: [:s | (builder componentAt: s) isEnabled: aType ~~ #add]. #(rbadd rbchange classRemove classRename classComment classOrganize) do: [:s | (builder componentAt: s) beVisible].
computeListOfClasses self currentSource isNil ifTrue: [^List new]. ^self currentSource listOfClasses
computeListOfMethods self currentSource isNil ifTrue: [^List new]. ^self currentSource listOfMethodsForClassNamed: (classList selection)
computeText "Return the text to be displayed in the text pane." self className isNil ifTrue: [^self destination isNil ifTrue: [self textForChangeSet] ifFalse: [self textForDestination]]. self method isNil ifTrue: [^self textForClass]. ^self textForMethod
currentSource ^source value
destination ^destinationList selection
isInTransition ^mode == #transition
method ^methodList selection
methodSetVisible builder == nil ifTrue: [^self]. #(rbadd rbchange) do: [:s | (builder componentAt: s) isEnabled: true]. #(classRemove classRename classComment classOrganize) do: [:s | (builder componentAt: s) beInvisible]. #(rbadd rbchange rbremove ) do: [:s | (builder componentAt: s) beVisible]
postOpenWith: aBuilder self setWindowLabel. self setTextAndFlags
selectedClass ^self currentSource classNamed: self className
setClassList "Recompute the class list. Try and maintain the selection index if possible." | selectionIndex thisSelection previousSelection newList | (newList := self computeListOfClasses) = classList list ifTrue: [^self]. (selectionIndex := classList selectionIndex) >= 1 ifTrue: [ thisSelection := classList list at: selectionIndex. selectionIndex > 1 ifTrue: [ previousSelection := classList list at: selectionIndex - 1]]. classList list: newList. (classList list includes: thisSelection) ifTrue: [classList selection: thisSelection] ifFalse: [ (classList list includes: previousSelection) ifTrue: [ classList selectionIndex: (selectionIndex min: classList list size)]]
setMethodList methodList list: self computeListOfMethods. self setTextAndFlags
setTextAndFlags | types | mode := #transition. text value: self computeText. ( self currentSource representsComponent: self className ) ifTrue: [ ^self setTextAndFlagsForComponent ]. self method notNil ifTrue: [self methodSetVisible. changeType value: (self currentSource changeTypeFor: self className method: self method). mode := #method] ifFalse: [self className notNil ifTrue: [types := self currentSource changeTypesFor: self className. changeType value: (self basicChangeTypeFor: types). self classSetVisible: changeType value. classRemove value: (self currentSource hasRemovesFor: self className). classRename value: (types includes: #rename). classComment value: (types includes: #comment). classOrganize value: (types includes: #reorganize). mode := #class] ifFalse: [self allInvisible. changeType value: nil. mode := #none]].
setTextAndFlagsForComponent self method notNil ifTrue: [ self methodSetVisible. changeType value: ( self method changeSetChange ). mode := #method ]
setWindowLabel builder notNil ifTrue: [builder window label: (self currentSource notNil ifTrue: [#ChangeSetEditorOn1s << #dialogs >> 'Change Set Editor on <1s>' expandMacrosWith: self currentSource name asString] ifFalse: [#ChangeSetEditor << #dialogs >> 'Change Set Editor'])]
textForChangeSet | comment | ^(comment := source value comment) isNil ifTrue: [ source value isEmpty ifTrue: [source value printString] ifFalse: [(#ThisChangeSetHasNoComment << #dialogs >> 'This ChangeSet has no comment') asString]] ifFalse: [ (comment size > 0 and: [comment first = $"]) ifTrue: [comment := comment copyFrom: 2 to: comment size]. (comment size > 0 and: [comment last = $"]) ifTrue: [comment := comment copyFrom: 1 to: comment size - 1]. comment]
textForClass ^String new
textForDestination ^self destination doIts asText
textForMethod "Answer the text for the currently selected change, which may be a component change instead of a method." ( self currentSource representsComponent: self className ) ifTrue: [ ^self method description ]. ^(self currentSource changeTypeFor: self className method: self method) = #remove ifTrue: ['remove' asText] ifFalse: [| class | (class := self currentSource classNamed: self className) isNil ifTrue: [((#sourcesUnavailableNoClass << #dialogs >> 'source unavailable because <1s> has been removed or renamed.') expandMacrosWith: self className)] ifFalse: [(class includesSelector: self method) ifTrue: [class sourceMethodAt: self method] ifFalse: [((#sourcesUnavailableNoMethod << #dialogs >> 'source unavailable because <1s> is no longer a method.') expandMacrosWith: self method)]]]
</methods> <methods> Tools.AbstractChangeList <category>menu messages</category>
check self getWriteFilenameWithPrompt: (#TypeNameOfFileToWriteConflicts << #dialogs >> 'Type name of file on which to write conflicts') do: [:aFilename || aFile | aFile := (aFilename withEncoding: #Source) writeStream. [Cursor execute showWhile: [self checkWithSystem: false]. self reportConflictsOn: aFile] ensure: [aFile close]]
checkWithSystem self getWriteFilenameWithPrompt: (#TypeNameOfFileToWriteConflicts << #dialogs >> 'Type name of file on which to write conflicts') do: [:aFilename || aFile | aFile := (aFilename withEncoding: #Source) writeStream. [Cursor execute showWhile: [self checkWithSystem: true]. self reportConflictsOn: aFile] ensure: [aFile close]]
copyView "Create and schedule a list browser containing only the displayed items that are not marked for removal. Accessed by choosing the menu command clone." self filterCopy open
doAll self doFrom: 1
doFromHere "Replay from the current selection to the end. If there is no current selection, replay from the top." self doFrom: (1 max: self listIndex)
doThis "Replay the current selection." Notice show: #ReplayingChangesDots << #dialogs >> 'Replaying Changes...' while: [selectionIndex > 0 ifTrue: [self doThis: selectionIndex]]
fileIn "File-in changes from file(s)." self checkSystem: false; scanFilename
fileInDifferences "The fileIn menu item has been selected. File-in changes from file(s) that differ in effect to code in the system." self checkSystem: #code; scanFilename
fileInSourceDifferences "The fileIn menu item has been selected. File-in changes from file(s) that differ in any way to code in the system." self checkSystem: #exact; scanFilename
fileOut self anyToFileOut ifFalse: [^Dialog warn: (#NoEntriesToFileOut << #dialogs >> 'No entries to file out.')]. self getWriteFilenameWithPrompt: (#TypeNameOfFileForWriting << #dialogs >> 'type name of file for writing') do: [:aFilename | | sfm | sfm := SourceCodeStream write: aFilename. [self fileOutOn: sfm] ensure: [sfm close]]
findClass "Prompt and search for all changes of a given class. Select these changes" | message | message := classesDistinct ifTrue: [#className] ifFalse: [#nonMetaClassName]. self find: message prompt: #class filter: #className
findProtocol "Prompt and search for all changes of a given type. Select these changes" self find: #category prompt: #protocol filter: #category
findSelector "Prompt and search for all changes of a given selector. Select these changes" self find: #selector prompt: #selector filter: #selector
findType "Prompt and search for all changes of a given type. Select these changes" self find: #type prompt: (#ChangeType << #dialogs >> 'change type') asString filter: #type
spawnBrowserOnSelection "Create and schedule a browser or workspace on the selection. Ask the change to open a browser on its system version and if it declines open up a workspace on its text." | change txt | selectionIndex > 0 ifFalse: [^self]. change := list at: selectionIndex. change browseSystemVersionIfExists ifFalse: [ ( txt := change text ) == nil ifTrue: [ ^Dialog warn: (#NothingToSpawn << #dialogs >> 'Nothing to spawn') ]. ComposedTextView open: ( ValueHolder with: txt ) label: change name ].
spawnChangesContainingString "Spawn a ChangeList on those changes that textually contain (or match) a given string." | matches | matches := self selectMatching: (#Spawn << #labels >> 'Spawn') asString fromRemoved: false. matches key isEmpty ifTrue: [^self]. matches value isEmpty ifTrue: [^Dialog warn: (#None << #dialogs >> 'None')]. (self class new listName: '(', self listName, ' ', matches key, ')' changes: matches value removed: Set new) open
</methods> <methods> Tools.AbstractChangeList <category>menu messages-removing</category>
exchangeRemoved "Exchange the sets of removed and unremoved changes." | addToRemoved removeFromRemoved oldSelection | selectionIndex > 0 ifTrue: [ oldSelection := list at: selectionIndex]. addToRemoved := list copyEmpty: list size. removeFromRemoved := list copyEmpty: list size. list do: [:change| ((removed includes: change) ifTrue: [removeFromRemoved] ifFalse: [addToRemoved]) add: change]. removed removeAll: removeFromRemoved; addAll: addToRemoved. oldSelection ~~ nil ifTrue: [ selectionIndex := list indexOf: oldSelection ifAbsent: [0]]. self redisplayList
forgetAll "Forget all changes marked for removal, including those not displayed in the list.." changes := changes reject: [:c | removed includes: c]. removed := IdentitySet new. self updateList. self makeChangesVisible
forgetSelection "Forget the selected change that is marked for removal." | toBeForgotten | toBeForgotten := self selection. (removed includes: toBeForgotten) ifFalse: [^nil]. changes remove: toBeForgotten. removed remove: toBeForgotten. self updateList. self makeChangesVisible
forgetThese "Forget changes marked for removal that are currently being displayed." | toBeForgotten | toBeForgotten := (list select: [:c| removed includes: c]) asSet. changes := changes reject: [:c| toBeForgotten includes: c]. removed removeAll: toBeForgotten. self updateList. self makeChangesVisible
removeAll removed addAll: list. self redisplayList
removeAllAbove "Remove all changes above the currently selected change." selectionIndex > 1 ifTrue: [removed addAll: (list copyFrom: 1 to: selectionIndex - 1). self redisplayList]
removeAllBelow "Remove all changes above the currently selected change." (selectionIndex > 0 and: [selectionIndex < list size]) ifTrue: [removed addAll: (list copyFrom: selectionIndex + 1 to: list size). self redisplayList]
removeChangesContainingString "Remove those changes that textually contain (or match) a given string." removed addAll: (self selectMatching: (#Remove << #labels >> 'Remove') asString fromRemoved: false) value. self redisplayList
removeClassesNotInSystem "Remove those changes that have no class in the system." Cursor execute showWhile: [removed addAll: (list select: [:change| change isClassRelated and: [(removed includes: change) not and: [change classObject isNil]]])]. self redisplayList
removeConflictsInList "Remove all changes in the list that conflict with other changes in the list (even if they're duplicates)" | sortedList | Cursor wait showWhile: [ "Sort associations keyed by index to keep the sort stable." sortedList := ((1 to: list size) collect: [:index| index -> (list at: index)]) asSortedCollection: [:a1 :a2| | c1 c2 | c1 := a1 value. c2 := a2 value. c1 checkingName < c2 checkingName or: [c1 checkingName = c2 checkingName and: [a1 key <= a2 key]]]]. Cursor execute showWhile: [ | candidates | candidates := Set new. 1 to: sortedList size do: [:index| | change changeName sameChangeIndex sameChange | change := (sortedList at: index) value. (removed includes: change) ifFalse: [ changeName := change checkingName. sameChangeIndex := index. [((sameChangeIndex := sameChangeIndex + 1) between: 1 and: sortedList size) and: [(sameChange := (sortedList at: sameChangeIndex) value) checkingName = changeName]] whileTrue: [ candidates add: sameChange; add: change]]]. removed addAll: candidates]. self redisplayList
removeConflictsWithSystem "Remove those changes that differ in effect to the system's versions." checkSystem := #code. Cursor execute showWhile: [ removed addAll: (list select: [:change| (removed includes: change) not and: [(change sameAsSystem: self) not]])]. self redisplayList
removeDuplicates "Remove any duplicate changes in the list to leave only one version of each change. If the left-shift is down then remove duplicates later in the list, otherwise remove duplicates earlier in the list." | sortedList reverse | reverse := InputState default shiftDown. Cursor wait showWhile: [ "Sort associations keyed by index to keep the sort stable." sortedList := ((1 to: list size) collect: [:index| index -> (list at: index)]) asSortedCollection: [:a1 :a2| | c1 c2 | c1 := a1 value. c2 := a2 value. c1 class name < c2 class name or: [c1 class name = c2 class name and: [c1 checkingName < c2 checkingName or: [c1 checkingName = c2 checkingName and: [a1 key <= a2 key]]]]]]. Cursor execute showWhile: [ | candidates start end delta | candidates := Set new. reverse ifTrue: ["Go through the list forwards to preferentially remove later changes." start := 1. end := sortedList size. delta := 1] ifFalse: ["Go through the list backwards to preferentially remove earlier changes." start := sortedList size. end := 1. delta := -1]. start to: end by: delta do: [:index| | change changeName changeText sameChangeIndex sameChange | change := (sortedList at: index) value. (removed includes: change) ifFalse: [ changeName := change checkingName. sameChangeIndex := index. [((sameChangeIndex := sameChangeIndex + delta) between: 1 and: sortedList size) and: [(sameChange := (sortedList at: sameChangeIndex) value) checkingName = changeName]] whileTrue: [ "Cache change text to avoid going to the file system to get it more than once." changeText isNil ifTrue: [changeText := change text]. changeText = sameChange text ifTrue: [ candidates add: sameChange]]]]. removed addAll: candidates]. self redisplayList
removeItem "Remove the currently selected change." selectionIndex > 0 ifTrue: [removed add: (list at: selectionIndex). self updateListSelection: selectionIndex]
removeMethodsNotInSystem "Remove those method changes that have no corresponding method in the system." Cursor execute showWhile: [ removed addAll: (list select: [:change| change isMethodRelated and: [(removed includes: change) not and: [change hasVersionInSystem not]]])]. self redisplayList
removeOldVersions "Remove any conflicting changes earlier in the list to leave only the latest version of each change. If leftShift is pressed remove later changes to leave only the earliest change." | sortedList reverse | reverse := InputState default shiftDown. Cursor wait showWhile: [ "Sort associations keyed by index to keep the sort stable." sortedList := ((1 to: list size) collect: [:index| index -> (list at: index)]) asSortedCollection: [:a1 :a2| | c1 c2 | c1 := a1 value. c2 := a2 value. c1 checkingName < c2 checkingName or: [c1 checkingName = c2 checkingName and: [a1 key <= a2 key]]]]. Cursor execute showWhile: [ | candidates start end delta | candidates := Set new. reverse ifTrue: ["Go through the list forwards to preferentially remove later changes." start := 1. end := sortedList size. delta := 1] ifFalse: ["Go through the list backwards to preferentially remove earlier changes." start := sortedList size. end := 1. delta := -1]. start to: end by: delta do: [:index| | change changeName sameChangeIndex sameChange | change := (sortedList at: index) value. (removed includes: change) ifFalse: [ changeName := change checkingName. sameChangeIndex := index. [((sameChangeIndex := sameChangeIndex + delta) between: 1 and: sortedList size) and: [(sameChange := (sortedList at: sameChangeIndex) value) checkingName = changeName]] whileTrue: [ candidates add: sameChange]]]. removed addAll: candidates]. self redisplayList
removeSameAsSystem "Remove those changes that are the same in effect as the system." checkSystem := #code. Cursor execute showWhile: [ removed addAll: (list select: [:change| (removed includes: change) not and: [change sameAsSystem: self]])]. self redisplayList
removeSameSourceAsSystem "Remove those changes that are exactly the same as the system." checkSystem := #exact. Cursor execute showWhile: [ removed addAll: (list select: [:change| (removed includes: change) not and: [change sameAsSystem: self]])]. self redisplayList
removeSourceConflictsWithSystem "Remove those changes that differ at all to the system's versions." checkSystem := #exact. Cursor execute showWhile: [ removed addAll: (list select: [:change| (removed includes: change) not and: [(change sameAsSystem: self) not and: [change hasVersionInSystem]]])]. self redisplayList
restoreAll list do: [:change | removed remove: change ifAbsent: []]. self redisplayList
restoreChangesContainingString "Restore those changes that textually contain (or match) a given string." (self selectMatching: (#Restore << #labels >> 'Restore') asString fromRemoved: true) value do: [:aChange| removed remove: aChange ifAbsent: nil]. self redisplayList
restoreItem "Un-remove the currently selected change." selectionIndex > 0 ifTrue: [removed remove: (list at: selectionIndex) ifAbsent: []. self updateListSelection: selectionIndex]
</methods> <methods> Tools.AbstractChangeList <category>drag and drop</category>
addChangeSetFromBrowserDrag: aChangeSet atIndex: index "Add all the changes in a ChangeSet that were built-up as a result of a browser drag. Return the effect of the drag." Cursor wait showWhile: [| changeList | changeList := self class new. aChangeSet addChangesToChangeList: changeList. index <= list size ifTrue: [changes addAll: changeList changes beforeIndex: (index > 0 ifTrue: [changes indexOf: (list at: index)] ifFalse: [1]). list addAll: changeList changes beforeIndex: (index max: 1)] ifFalse: [changes addAllLast: changeList changes. list addAllLast: changeList changes]]. self updateList. self updateSelection: (index min: list size). ^#dragEffectCopy
canAcceptDropFrom: aDC "Answer true if a drop can occur in the change list. Accept drops from change lists and browsers" | appl | ^((appl := aDC data contextApplicationType) = #vw_changes) or: [appl = #vw_browser]
doDrag: aController "Drag the currently selected change. Include all available information so that the drop target can use whatever it needs." | data change selIdx | data := DragDropData new. data key: #change. data contextWindow: self builder window. data contextWidget: aController. data contextApplication: self; contextApplicationType: #vw_changes. data clientData: (change := list at: (selIdx := selectionIndex)). (DragDropManager withDropSource: DropSource new withData: data) doDragDrop == #dropEffectMove ifTrue: [changes remove: change. removed remove: change ifAbsent: []. self updateList. self updateSelection: (selIdx min: list size)]
doDropFromBrowserDrag: aDragContext "A drop has occurred on the change list of a change browser from a browser. Add the dragged class from the browser and insert it in the receiver's list. The behaviour is modified via the alt or shift keys. If alt is down then expand the drag into all relevant changes. E.g. By default, dragging a class into the list adds the class definition only, but if the alt is down then the entire class gets added. If shift is down the add removals of the corresponding entities. e.g. shift-dragging a class adds a class removal change." | dict index mode category meta class protocol selector changeSet | dict := aDragContext data clientData. index := aDragContext dropTarget clientData at: #effectiveTargetIndex. meta := dict at: #meta ifAbsent: [false]. ((dict includesKey: #class) and: [class := (dict at: #class) asQualifiedReference value. meta]) ifTrue: [class := class class]. "Make a ChangeSet to hold the changes that will get added" changeSet := ChangeSet new. (selector := dict at: #selector ifAbsent: []) notNil ifTrue: ["shift implies reverse-the-sense, so instead of adding a method definition change we add a method remove change." aDragContext shiftDown ifTrue: [changeSet removeSelector: selector class: class] ifFalse: [changeSet addSelector: selector class: class]. ^self addChangeSetFromBrowserDrag: changeSet atIndex: index]. (protocol := dict at: #protocol ifAbsent: []) notNil ifTrue: [(class organization listAtCategoryNamed: protocol) do: [:sel| aDragContext shiftDown ifTrue: [changeSet removeSelector: sel class: class] ifFalse: [changeSet addSelector: sel class: class]]. ^self addChangeSetFromBrowserDrag: changeSet atIndex: index]. "If the browser has told us about its text mode we can be more specific in a class drag. e.g. copy comment or organisation" mode := dict at: #textMode ifAbsent: []. class notNil ifTrue: ["alt implies add everything. It overrides shift." aDragContext altDown ifTrue: [mode == #hierarchy ifTrue: [class allSuperclasses, class withAllSubclasses do: [:sc| changeSet addClass: sc]] ifFalse: [changeSet addClass: class]] ifFalse: [ aDragContext shiftDown ifTrue: [ mode == #hierarchy ifTrue: [ class allSuperclasses, class withAllSubclasses do: [:sc| changeSet removeClass: sc]] ifFalse: [changeSet removeClass: class]] ifFalse: [ mode == #comment ifTrue: [changeSet commentClass: class] ifFalse: [ mode == #protocols ifTrue: [changeSet reorganizeClass: class] ifFalse: [ mode == #hierarchy ifTrue: [ class allSuperclasses, class withAllSubclasses do: [:sc| changeSet changeClass: sc]] ifFalse: [changeSet changeClass: class]]]]]. ^self addChangeSetFromBrowserDrag: changeSet atIndex: index]. (category := dict at: #category ifAbsent: []) notNil ifTrue: [mode == #categories ifTrue: [(dict at: #environment) reorganize] ifFalse: [((dict at: #environment) organization listAtCategoryNamed: category) do: [:cn| | clss | clss := (dict at: #environment) at: cn. meta ifTrue: [clss := clss class]. aDragContext altDown ifTrue: [changeSet addClass: clss] ifFalse: [ aDragContext shiftDown ifTrue: [changeSet removeClass: clss] ifFalse: [changeSet changeClass: clss]]]]. ^self addChangeSetFromBrowserDrag: changeSet atIndex: index]. ^#dragEffectNone
doDropFromChangeListDrag: aDragContext "A drop has occurred on the change list of a change browser from another change browser. Remove the change from the other change browser and insert it in the receiver's list." | change sourceIndex effectiveTargetIndex view destIndex | change := aDragContext data clientData. effectiveTargetIndex := aDragContext dropTarget clientData at: #effectiveTargetIndex. (aDragContext data contextApplication == self) ifTrue: ["Dropping in the receiver itself. We need to map the list target and drop indices from the displayed list to the underlying list of changes and move the change in the underlying list of changes. First find out where the target really is." effectiveTargetIndex := (view := (self builder componentAt: #listView) widget) elementIndexFor: view controller sensor cursorPoint. "Find out where the dragged change is in the underlying list of changes." sourceIndex := changes indexOf: change. "Find out where the target change is in the underlying list of changes. The list can't be empty because it was dragged from." destIndex := changes indexOf: (list at: ((effectiveTargetIndex min: list size) max: 1)). "If the effectiveTargetIndex is the same as the sourceIndex, do nothing" effectiveTargetIndex == sourceIndex ifTrue: [^#dropEffectNone]. changes removeAtIndex: sourceIndex. (destIndex >= sourceIndex) ifTrue: [destIndex > changes size ifTrue: [changes addLast: change] ifFalse: [changes add: change beforeIndex: destIndex ]] ifFalse: [changes add: change beforeIndex: destIndex]. self updateList. self updateSelection: (effectiveTargetIndex min: list size). ^#dropEffectNone]. effectiveTargetIndex <= list size ifTrue: [changes add: change beforeIndex: (effectiveTargetIndex > 0 ifTrue: [changes indexOf: (list at: effectiveTargetIndex)] ifFalse: [1]). list add: change beforeIndex: (effectiveTargetIndex max: 1)] ifFalse: [changes addLast: change. list addLast: change]. self updateList. self updateSelection: (effectiveTargetIndex min: list size). ^aDragContext ctrlDown ifTrue: [#dropEffectCopy] ifFalse: [#dropEffectMove]
dragEnter: aDragContext "A drag has entered the class list of a change browser. If the receiver is happy to accept a drag from the target the fill-in the appropriate data and answer that dragging should continue." (self canAcceptDropFrom: aDragContext) ifFalse: [^#dropEffectNone]. aDragContext dropTarget clientData: self initialDropState. ^#dropEffectMove
dragLeave: aDragContext "A drag has left the change list of a change browser. If the drag contains a change, we must restore the state of the list." (self canAcceptDropFrom: aDragContext) ifFalse: [^#dropEffectNone]. self restoreListStateFrom: aDragContext dropTarget clientData. aDragContext dropTarget clientData: nil. ^#dropEffectNone
dragOver: aDragContext "A drag is over the change list of a change list." | dict view ctrl | ^(self canAcceptDropFrom: aDragContext) ifTrue: [ dict := aDragContext dropTarget clientData. ctrl := (view := (self builder componentAt: #listView) widget) controller. dict at: #effectiveTargetIndex put: (view elementIndexFor: ctrl sensor cursorPoint). self showDropFeedbackForList: #listView in: aDragContext. #dropEffectMove] ifFalse: [#dropEffectNone]
drop: aDragContext "A drop has occurred on the change list of a change browser. If the drop is a change then insert it into the list. If the drop is from a browser add a corresponding change." (self canAcceptDropFrom: aDragContext) ifFalse: [^#dropEffectNone]. "If there are changes to the text, prompt before discarding them" self changeRequest ifFalse: [^#dropEffectNone]. (aDragContext data contextApplicationType = #vw_changes) ifTrue: [^self doDropFromChangeListDrag: aDragContext]. (aDragContext data contextApplicationType = #vw_browser) ifTrue: [^self doDropFromBrowserDrag: aDragContext]. ^#dropEffectNone
initialDropState "Answer the initial state of the list when a drag has begun within its bounds. The state will be used to re-establish the appearance of the list when a drag leaves." | dict view ctrl | ctrl := (view := (self builder componentAt: #listView) widget) controller. dict := IdentityDictionary new. dict at: #ctrl put: ctrl. dict at: #targetIndex put: view targetIndex. dict at: #effectiveTargetIndex put: (view elementIndexFor: ctrl sensor cursorPoint). dict at: #hasFocus put: ctrl view hasFocus. ctrl view hasFocus: true. ^dict
restoreListStateFrom: aDictionary "Reset the state of the change list when a drag has left its bounds." | ctrl | ctrl := aDictionary at: #ctrl. ctrl view targetIndex: (aDictionary at: #targetIndex). ctrl view hasFocus: (aDictionary at: #hasFocus)
showDropFeedbackForList: aSymbol in: aDragContext "Track the mouse with the target index while dragging in the list named aSymbol." | wrap | wrap := self builder componentAt: aSymbol. wrap isNil ifFalse: [wrap widget showDropFeedbackIn: aDragContext allowScrolling: true]
wantToDrag: listController "Answer true if the receiver wants to initiate a drag." ^list size > 0
</methods> <methods> Tools.AbstractChangeList <category>menus</category>
changeListMenu "Return the menu to use for the ChangeList." ^menus at: #changeListMenu ifAbsentPut: [| menu | menu := self class changeListMenu. menu augmentFrom: self class to: AbstractChangeList menuName: #changeListMenu for: self. menu]
changeListMenuHolder ^[self changeListMenu]
existingTextMenu "Answer a minimal Menu for the existing text pane." ^menus at: #existingTextMenu ifAbsentPut: [Menu labelArray: (Array with: (#Find << #dialogs >> 'Find...') with: (#Copy << #dialogs >> 'Copy') with: (#DoIt << #dialogs >> 'Do it') with: (#Cancel << #dialogs >> 'Cancel')) values: #(#find #copySelection #doIt #cancel)]
existingTextMenuHolder ^[self existingTextMenu]
textMenu "Answer a minimal Menu for the text pane." ^menus at: #textMenu ifAbsentPut: [self buildTextMenu]
textMenuHolder ^[self textMenu]
</methods> <methods> Tools.AbstractChangeList <category>private</category>
addFilter: aSymbol "Add a specific filter to the current set of filters. This is one of #fileName, #category, #changeType, #className (or #nonMetaClassName), #selector, or #values. #className is really selected on the basis of classesDistinct. If classesDistinct then we use #className, otherwise #nonMetaClassName." | theSymbol filterKeyValue oldFilter | theSymbol := (aSymbol == #className and: [classesDistinct not]) ifTrue: [#nonMetaClassName] ifFalse: [aSymbol]. filterKeyValue := filterKey perform: theSymbol. filter isNil ifTrue: [filter := [:change | (change perform: theSymbol) = filterKeyValue]] ifFalse: [oldFilter := filter. filter := [:change | (change perform: theSymbol) = filterKeyValue and: [oldFilter value: change]]]
changes "Return the receiver's changes. This is to assist in the implementation of drag and drop." ^changes
displayDifferences: aSymbol "Flip the receiver's conflict view mode." DifferencesMode := differencesMode := aSymbol. self setMenuState. self updateSelection: selectionIndex
doFrom: firstIndex "replay all the changes from the supplied index. Reset selection each time through the loop, so that if an error occurs, the selection is left at the item which caused it." Notice show: #ReplayingChangesDots << #dialogs >> 'Replaying Changes...' while: [ | listView | firstIndex = self listIndex ifTrue: [self toggleListIndex: firstIndex]. listView := (builder componentAt: #listView) widget. firstIndex to: list size do: [:index | (self hasRemoved: index) ifFalse: [self toggleListIndex: index. self updateSelection: index. listView makeVisible: index. (list at: index) fileIn]]]
fieldMessage: aMenuSelector "Toggle a field." | index | index := self fieldTemplates first indexOf: aMenuSelector. self switchField: index perform: (self fieldTemplates last at: index)
fieldTemplates ^self subclassResponsibility
filterMessage: aMenuSelector "Toggle a filter." | index | index := self filterTemplates first indexOf: aMenuSelector. self switchFilter: index perform: (self filterTemplates last at: index)
filterTemplates ^self subclassResponsibility
find: aspect prompt: promptName filter: filterSymbol "Search for all changes whose aspect (selector, className fileName etc) which match a user-supplied pattern string. Select those changes by switching on the relevant filter. If the user presses the shift-key _always_ use a menu." | aString filterIndex aspectNames aspectName bestScore closest | filterIndex := self validFilters indexOf: filterSymbol ifAbsent: [self error: (#invalidChangeFilter << #dialogs >> 'invalid change filter')]. ( aString := self findPrompt: promptName ) == nil ifTrue: [ ^false ]. aspectNames := Set new. ((aString includes: $*) or: [aString includes: $#]) ifTrue: [ aspectNames := self wildcardListFor: aspect prompt: promptName input: aString. aspectNames isEmpty ifTrue: [ ^self ]. ( closest := Dialog choose: ((#Which1s << #dialogs >> 'Which <1s>?') expandMacrosWith: promptName) fromList: (aspectNames := aspectNames asSortedCollection) values: aspectNames lines: 32 cancel: [] for: self interfaceWindow) isNil ifTrue: [ ^self ]. closest = (' ', (#none << #dialogs >> '(none)') asString) ifTrue: [closest := ''] ] ifFalse: [ 1 to: changes size do: [:i| (aspectName := (changes at: i) perform: aspect) isNil ifTrue: [aspectName := 'nil'] ifFalse: [aspectName isString ifFalse: [aspectName := aspectName name]]. (aString sameAs: aspectName) ifTrue: [ 1 to: filterList size do: [:index| "Turn off all existing filter buttons" (filterList at: index) notNil ifTrue: [ filterList at: index put: nil. self changed: #filter with: index]]. list := changes. selectionIndex := i. filterList := #(). "Turn on button to filter for matching change" ^self switchFilter: filterIndex perform: aspect] ifFalse: [aspectNames add: aspectName]]. bestScore := 0. aspectNames do: [:name | | score | (score := name spellAgainst: aString) > bestScore ifTrue: [bestScore := score. closest := name]]. closest == nil ifTrue: [^Dialog warn: ((#ErrorNotCorrectable << #dialogs >> '<1s> not found, and couldn''t correct') expandMacrosWith: aString)]. (Dialog choose: ((#correctTo1s << #dialogs >> 'correct to <1s> ?') expandMacrosWith: (closest contractTo: 25)) labels: (Array with: (#OK << #dialogs >> 'OK') with: (#Cancel << #dialogs >> 'Cancel')) values: #(#ok #cancel) default: #ok for: self interfaceWindow) = #cancel ifTrue: [^self]]. 1 to: changes size do: [:i| (aspectName := (changes at: i) perform: aspect) isNil ifTrue: [aspectName := 'nil'] ifFalse: [aspectName isString ifFalse: [aspectName := aspectName name]]. (closest sameAs: aspectName) ifTrue: [ 1 to: filterList size do: [:index| "Turn off all existing filter buttons" (filterList at: index) notNil ifTrue: [ filterList at: index put: nil. self changed: #filter with: index]]. list := changes. selectionIndex := i. filterList := #(). "Turn on button to filter for matching change" ^self switchFilter: filterIndex perform: aspect]]
findLast: aString in: aStream "Return the position in the stream of the end of the last occurrence of aString (presumably a snapshot message)" | firstChar endPosition position count index lastEnd | firstChar := aString first. aStream setToEnd. position := aStream position. lastEnd := nil. [endPosition := position. lastEnd == nil and: [(position := endPosition - 5000 max: 0) < endPosition]] whileTrue: [aStream position: position. count := endPosition - position. [count > 0] whileTrue: [count := count - 1. aStream next = firstChar ifTrue: [index := 2. [index <= aString size and: [(aString at: index) = aStream next]] whileTrue: [index := index + 1]. index > aString size ifTrue: [lastEnd := aStream position] ifFalse: [aStream position: endPosition - count]]]]. ^lastEnd
findPrompt: promptName "Answer a search criteria for an aspect or nil if canceled" | aString | self changeRequest ifFalse: [ ^nil ]. aString := InputState default shiftDown ifTrue: [ '*' ] ifFalse: [ Dialog request: ((#FindWhich1s << #dialogs >> 'Find which <1s>?') expandMacrosWith: promptName) initialAnswer: '*' ]. ^aString isEmpty ifTrue: [ nil ] ifFalse: [ aString ].
getWriteFilenameWithPrompt: promptString do: actionBlock "Find out the file name of a file to write to using the Filename utility that prompts for existing files." | fileName | [fileName := Dialog requestNewFileName: promptString default: ParagraphEditor currentSelection. fileName isEmpty or: [(self includesFileName: fileName) ifTrue: [Dialog warn: ((#SourceFileStillInUse << #dialogs >> '<1s> cannot be used because<n>it holds the source of some or all entries.<n>Please try again.') expandMacrosWith: fileName). false] ifFalse: [true]]] whileFalse. fileName isEmpty ifFalse: [Cursor write showWhile: [actionBlock value: fileName asFilename]]
hasFilter: index "Answer whether one of the receiver's filters is set to on." ^index <= filterList size and: [(filterList at: index) notNil]
hasRemoved: index "Answer whether the item at position index has been marked for removal. Answer false if position index is outside the boundaries of the receiver's list." ^index > 0 and: [index <= list size and: [removed includes: (list at: index)]]
interfaceWindow builder == nil ifTrue: [^nil]. ^builder window
listEntryForChange: aChange "Return the string to display in the list for the supplied change. This depends on the showing filters." | name v | name := nil. 1 to: (fieldList size min: 2) do: [:i| "fieldList also contains conflicts, must avoid sending this to changes." | f | nil == (f := fieldList at: i) ifFalse: [ v := aChange perform: f. v size > 0 ifTrue: [ nil == name ifTrue: [name := WriteStream on: (String new: 50)]. name nextPut: $(; nextPutAll: v; nextPutAll: ') ']]]. ^EmphasizeDifferences ifTrue: [ (nil == name ifTrue: [aChange name] ifFalse: [name nextPutAll: aChange name. name contents]) asText emphasizeAllWith: ((aChange sameAsSystem: self) ifTrue: [#italic] ifFalse: [#bold])] ifFalse: [ nil == name ifTrue: [aChange name] ifFalse: [name nextPutAll: aChange name. name contents]]
listName: aString changes: aChangeCollection removed: aSet "Initialize the receiver with the given title, changes and removed set." listName := aString. changes addAll: aChangeCollection. list addAll: aChangeCollection. removed addAll: aSet. self updateList
makeChangesVisible "Attempt to make at least one chnage visible; assuming that all changes are filtered out." | filters | filters := self filterTemplates first. filters size to: 1 by: -1 do: [:i| list isEmpty ifFalse: [^self]. (self hasFilter: i) ifTrue: [self filterMessage: (filters at: i)]]
queryParcel "Let the user select a Parcel from a list and return the name of the parcel." | names parcel | names := Parcel parcelNames asSortedCollection. parcel := Dialog choose: (#DisplayWhichParcelQ << #dialogs >> 'Display which Parcel?') fromList: names values: names lines: 20 cancel: [nil]. ^parcel
rebuildMenu menuBar notNil ifTrue: [self rebuildMenu: menuBar with: self class menuBar augmentTo: AbstractChangeList]
redisplayList "Redisplay the list unless the interface is not actually open." builder notNil ifTrue: [(builder componentAt: #listView) widget invalidate]
scanFilename: aFilename "Scan the file/directory name specified. If aFilename is a directory, then scan all the files in it." Transcript cr; show: ((#Scanning1s << #dialogs >> 'Scanning <1s>') expandMacrosWith: aFilename asString). aFilename isDirectory ifTrue: [ aFilename directoryContents asSortedStrings do: [:each | self scanFilename: (aFilename construct: each)]] ifFalse: [ | stream | stream := (aFilename withEncoding: #Source) readStream. [self scanFile: stream] ensure: [stream close]]
selectionIndexChange self toggleListIndex: selectionInList selectionIndex
selectMatching: promptPrefix fromRemoved: aBoolean "Return an association of string to list where the list contains all unremoved changes which match a string." | string | string := Dialog request: ((#{RxParser} isDefined ifTrue: [#x1sChangesContainingRegexp << #dialogs >> '<1s> changes containing regexp'] ifFalse: [#x1sChangesContainingString << #dialogs >> '<1s> changes containing string']) expandMacrosWith: promptPrefix). string isEmpty ifTrue: [^string -> List new]. Cursor execute showWhile: [| re | ^string -> (#{RxParser} isDefined ifTrue: [re := string asRegex. list select: [ :change | change text ~~ nil and: [ (aBoolean = (removed includes: change) and: [re search: change text])]]] ifFalse: [string first = $* ifFalse: [string := '*', string]. string last = $* ifFalse: [string := string, '*']. list select: [ :change | change text ~~ nil and: [ (aBoolean = (removed includes: change) and: [string match: change text])]]])]
setLabel "Set the selected change label." | label | builder isNil ifTrue: [^self]. nil == (label := builder componentAt: #changeLabel) ifTrue: [^self]. label label: (Label with: (self labelFor: #changeLabel) asText allBold attributes: (TextAttributes styleNamed: #small)). self showingConflicts ifFalse: [^self]. nil == (label := builder componentAt: #imageLabel) ifTrue: [^self]. label label: (Label with: (self labelFor: #imageLabel) asText allBold attributes: (TextAttributes styleNamed: #small))
setMenuState "Set up all our toggleable menu items." | filters fields | filters := self filterTemplates first. filters do: [:f| (menuBar atNameKey: f) indication: ((self hasFilter: (filters indexOf: f)))]. fields := self fieldTemplates first. fields do: [:f| (menuBar atNameKey: f) indication: ((self showingField: (fields indexOf: f)))]. (menuBar atNameKey: #viewConflictsVertically) indication: (verticalConflicts). (menuBar atNameKey: #viewConflictsHorizontally) indication: (verticalConflicts not). (menuBar atNameKey: #highlightSourceDifferences) indication: ((#code == differencesMode) not). (menuBar atNameKey: #highlightCodeDifferences) indication: (#code == differencesMode). (menuBar atNameKey: #lineEndsTreated) indication: (Change normalizeLineEnds). (menuBar atNameKey: #lineEndsRaw) indication: (Change normalizeLineEnds not). (menuBar atNameKey: #toggleListEmphasis) indication: (EmphasizeDifferences). (menuBar atNameKey: #toggleTypesIncludeSame) indication: (MethodDefinitionChange typesIncludeSame). (menuBar atNameKey: #groupClassAndMetaclass) indication: classesDistinct not. (menuBar atNameKey: #ungroupClassAndMetaclass) indication: classesDistinct
setValue: aValue value := aValue
showingConflicts "Return true of the receiver is also displaying conflicts." ^fieldList size >= 3 and: [(fieldList at: 3) notNil]
showingField: index ^index <= fieldList size and: [(fieldList at: index) notNil]
switchField: index perform: aSymbol "Handle the show button panel. Handle show conflicts specially because its done by an extra view, not by the list of changes." | tempSelectionIndex | self changeRequest ifFalse: [^false]. index > fieldList size ifTrue: [ fieldList := fieldList , (Array new: index - fieldList size)]. fieldList at: index put: ((fieldList at: index) isNil ifTrue: [aSymbol]). self setMenuState. (aSymbol == #conflicts) ifTrue: [builder notNil ifTrue: [(builder componentAt: #textCanvas) widget client: self spec: ((self showingField: 3) ifTrue: [VerticalConflicts ifTrue: [#verticalDifferencesText] ifFalse: [#horizontalDifferencesText]] ifFalse: [#standardText]) builder: builder]. "This to bludgeon way around TextView update bug which is to not update text if only its emphasis has changed (which it does when we switch on & off the conflict text. So simply deselect & reselect." tempSelectionIndex := selectionIndex. self toggleListIndex: tempSelectionIndex; toggleListIndex: tempSelectionIndex; updateSelection: tempSelectionIndex] ifFalse: [self changed: #field with: index. self updateList]
switchFilter: index perform: aSymbol "Set the action aSymbol to be the action associated with the filter denoted by index (the position in the list of filters)." self changeRequest ifFalse: [^false]. index > filterList size ifTrue: [filterList := filterList , (Array new: index - filterList size)]. (filterList at: index) isNil ifTrue: [selectionIndex > 0 ifTrue: [filterKey := list at: selectionIndex. filterList at: index put: aSymbol]] ifFalse: [filterList at: index put: nil]. self changed: #filter with: index. self updateList
updateList "Update the current list by recomputing the displayed list from the underlying list. Note that we do so lazily to display the visible part of the new list quicker. Each actual list entry is calculated in the selectionInList's visualBlocks created in the receiver's postBuildWith: method." Cursor execute showWhile: [ | oldChange newIndex | selectionIndex > 0 ifTrue: [oldChange := list at: selectionIndex]. filter := nil. filterList do: [:aSymbol | aSymbol notNil ifTrue: [self addFilter: aSymbol]]. filter isNil ifTrue: [filter := [:change | true]. list := changes copy] ifFalse: [list := changes select: filter]. newIndex := oldChange == nil ifTrue: [0] ifFalse: [list indexOf: oldChange]. "Simply set the selectionInList's list to be the empty list. This speeds up redisplay at the cost of slightly slower scrolling." selectionInList list: (List withSize: list size). self updateSelection: newIndex]
updateListSelection: newIndex "Ensure that the list entry selection at newIndex is updated and redisplayed. Do not bother to update the text selection. This is for toggling the removed status on a list item." (selectionIndex between: 1 and: selectionInList list size) ifTrue: [selectionInList list at: selectionIndex put: (self listEntryForChange: (list at: selectionIndex))]
updateSelection: newIndex "Ensure that the selection at newIndex is updated and redisplayed." self deselect. selectionInList selectionIndex: newIndex. self updateListSelection: newIndex
validFilters "Answer an array of valid filters" ^self filterTemplates last
viewConflictsVertically: aBoolean "Flip the receiver's conflict view and set the class variable." VerticalConflicts := verticalConflicts := aBoolean. self showingConflicts ifTrue: [self fieldMessage: #showConflicts. self fieldMessage: #showConflicts]. self setMenuState
wildcardListFor: aspect prompt: promptName input: aString "Answer a list of strings for an aspect that exists in the list." | aspectName aspectNames | aspectNames := Set new. 1 to: changes size do: [ :i | ( aspectName := ( changes at: i ) perform: aspect ) size = 0 ifTrue: [ aspectNames add: (' ', (#none << #dialogs >> '(none)') asString) ] ifFalse: [ aspectName isString ifFalse: [ aspectName := aspectName name ]. (( aspectName size = 0 or: [ aString match: aspectName ] ) or: [(aspectName includes: $.) and: ['*.', aString match: aspectName]]) ifTrue: [ aspectNames add: aspectName asString ] ] ]. aspectNames isEmpty ifTrue: [ Dialog warn: ((#noMatching1s << #dialogs >> 'no matching <1s>') expandMacrosWith: promptName) ]. ^aspectNames.
</methods> <methods> Tools.AbstractChangeList <category>interface opening</category>
postBuildWith: aBuilder "Ensure that a) the relevant wrappers are used for the list of changes, and b) the scroll-bar for the change text view is on the left if conflicts are being shown, and the layout is vertical." | component | listName size > 0 ifTrue: [builder window label: listName]. (component := aBuilder componentAt: #listView) notNil ifTrue: [component widget selectedVisualBlock: [:view :index | | rw tx | "If the entry is empty then compute it." nil == (view sequence at: index) ifTrue: [view sequence at: index put: (self listEntryForChange: (list at: index))]. tx := view displayStringAt: index. rw := ((self hasRemoved: index) ifTrue: [StrikeOutWrapper] ifFalse: [ReversingWrapper]) on: (Label with: tx attributes: view textStyle offset: 2@0). rw reverse setValue: true. BoundedWrapper on: rw]; visualBlock: [:view :index | | tx lb | "If the entry is empty then compute it." nil == (view sequence at: index) ifTrue: [view sequence at: index put: (self listEntryForChange: (list at: index))]. tx := view displayStringAt: index. lb := Label with: tx attributes: view textStyle offset: 2@0. (self hasRemoved: index) ifTrue: [lb := StrikeOutWrapper on: lb. lb reverse setValue: false]. BoundedWrapper on: lb]]. (component := aBuilder componentAt: #textView) notNil ifTrue: [(verticalConflicts and: [self showingConflicts]) ifTrue: [component decorator useLocalEdgeDecorationPolicy. component decorator edgeDecorationPolicy inset: 0. component decorator edgeDecorationPolicy verticalScrollBarOnRight: false]. component widget controller autoAccept: false]
postOpenWith: aBuilder "Ensure we get window events so we update the toggleable menuBar options on each enter." aBuilder window application: self; sendWindowEvents: #(enter exit close). (aBuilder componentAt: #textCanvas) widget client: self spec: ((self showingField: 3) ifTrue: [VerticalConflicts ifTrue: [#verticalDifferencesText] ifFalse: [#horizontalDifferencesText]] ifFalse: [#standardText]).
preBuildWith: aBuilder "Hook-up the builder to our menu." builder menuAt: #menuBar put: menuBar. self setMenuState
windowEvent: anAssociation from: anApplicationWindow "Handle window events to build the menu bar and to ask Change to close any open files at appropriate times." | type | type := anAssociation key. #enter == type ifTrue: [self setMenuState]. #close == type ifTrue: [Change closeOpenFiles]
</methods> <methods> Tools.AbstractChangeList <category>menu bar actions</category>
groupClassAndMetaclass "Ingore the distinction between class & metaclass changes." classesDistinct ifTrue: [classesDistinct := false. self setMenuState. (filterList includes: #className) ifTrue: [self updateList]]
highlightCodeDifferences "Set code conflict display." self displayDifferences: #code
highlightSourceDifferences "Set source conflict display." self displayDifferences: #exact
lineEndsRaw "Set line-ends not to be normalized by changes." Change normalizeLineEnds: false. self updateSelection: selectionIndex. self setMenuState
lineEndsTreated "Set line-ends to be normalized by changes." Change normalizeLineEnds: true. self updateSelection: selectionIndex. self setMenuState
toggleClassFilter self filterMessage: #filterByClass
toggleListEmphasis "Toggle the emphasis of list items." EmphasizeDifferences := EmphasizeDifferences not. self setMenuState. self updateList
togglePackageFilter self filterMessage: #filterByPackage
toggleParcelFilter self filterMessage: #filterByParcel
toggleProtocolFilter self filterMessage: #filterByProtocol
toggleSameFilter self filterMessage: #filterBySame
toggleSelectorFilter self filterMessage: #filterBySelector
toggleShowConflicts self fieldMessage: #showConflicts
toggleShowProtocol self fieldMessage: #showProtocol
toggleTypeFilter self filterMessage: #filterByType
toggleTypesIncludeSame "Toggle the naming of MethodDefinitionChanges." MethodDefinitionChange typesIncludeSame: MethodDefinitionChange typesIncludeSame not. self setMenuState. self updateList
ungroupClassAndMetaclass "Recognize the distinction between class & metaclass changes." classesDistinct ifFalse: [classesDistinct := true. self setMenuState. (filterList includes: #className) ifTrue: [self updateList]]
viewConflictsHorizontally "Set conflicts to be viewn horizontally." self viewConflictsVertically: false
viewConflictsVertically "Set conflicts to be viewn vertically." self viewConflictsVertically: true
</methods> <methods> Tools.AbstractChangeList <category>accessing</category>
conflictTextFor: anItem "Answer the text to display in the conflict text window. Default is the system version of the selected item." ^anItem systemText
existingText "Answer a Text corresponding to the current version of the change (method or class) in the system." | change src conflictText originalText sysCat different | selectionIndex <= 0 ifTrue: [ ^self blankText ]. "Take a copy of both texts to ensure the emphasis in the text itself is not modified by the comparison." ( originalText := self selectionText ) isNil ifTrue: [ originalText := '' ]. originalText := originalText copy asText. ( conflictText := self noConflictTextFor: ( change := self selection ) ) == nil ifFalse: [ self setValue: originalText. self changed: #value. ^conflictText ]. src := ( change cleanSourceFrom: ( self conflictTextFor: change ) ) copy asText. different := (differencesMode == #exact or: [ change isCommentChange ] ) ifTrue: [ DiffList compare: src with: originalText ] ifFalse: [ [ [ DiffList compareTokensIn: src with: originalText ] on: Scanner errorSignal do: [ :ex| "Retry parsing as C" ex errorString = (#UnknownCharacter << #dialogs >> 'Unknown character') ifFalse: [ex pass]. DiffList compareCTokensIn: src with: originalText ] ] on: Object messageNotUnderstoodSignal do: [ :ex| "Just compare the texts if no CScanner." ex parameter selector ~~ #new ifTrue: [ ex pass ]. DiffList compare: src with: originalText ] ]. self setValue: originalText. self changed: #value. ^different ifTrue: [ src ] ifFalse: [ ( ( change isMethodRelated and: [ change category ~= ( sysCat := change systemCategory ) ] ) ifTrue: [ ((#protocol1s << #dialogs >> 'protocol <1s>') expandMacrosWith: (sysCat isNil ifTrue: [ClassOrganizer defaultProtocol] ifFalse: [sysCat])) ] ifFalse: [ (#NoConflict << #dialogs >> 'no conflict') asString ] ) asText emphasizeAllWith: #italic ]
filterCopy "Answer a list of all the items not marked for removal." ^self class new listName: '(', self listName, ')' changes: list removed: (list select: [:c | removed includes: c])
listName "Answer the label for a browser on the receiver. The default is Change List." listName size = 0 ifTrue: [^(#ChangeList << #labels >> 'Change List') asString] ifFalse: [^listName]
listName: aString "Set the receiver's listName" listName := aString. builder notNil ifTrue: [builder window label: aString]
noConflictTextFor: anItem "Answer a Text corresponding to the conflicting text of the selected item in the system. This is in fact, the reason why there is no text to compare to. Answer nil if okay to compare." ^self subclassResponsibility
selection "Answer the currently selected item, or nil if none." ^selectionIndex > 0 ifTrue: [ list at: selectionIndex ]
selectionText "Answer the text of the item currently selected, or nil if none." ^selectionIndex > 0 ifTrue: [ self selection text ]
showConflicts: aBoolean "Enable or disable the conflict display." self showingConflicts ~= aBoolean ifTrue: [self fieldMessage: #showConflicts]
value ^value
value: aValue "The receiver's text for the currently selected change (if any) has changed. Update the text view, and update the change's text." | thisChange newChange | value := aValue. self changed: #value. (value size > 0 and: [selectionIndex > 0]) ifTrue: [thisChange := list at: selectionIndex. thisChange text ~= value asString ifTrue: [ "Since this ChangeList may share changes with others (via spawning or Drag+Drop), copy the change to ensure the change in text doesn't affect anything else." newChange := thisChange copy. newChange text: value asString. list at: selectionIndex put: (changes at: (changes indexOf: thisChange) put: newChange). self updateSelection: selectionIndex]]
</methods> <methods> Tools.AbstractChangeList <category>aspects</category>
changeTypeFilterAdaptor | index | index := self checkBoxNumberFor: #type. ^(PluggableAdaptor on: self) getBlock: [:m | m hasFilter: index] putBlock: [:m :v | m switchFilter: index perform: #type] updateBlock: [:m :a :p | a == #filter and: [p = index]]
checkBoxNumberFor: anAspect ^self validFilters indexOf: anAspect ifAbsent: [ self error: (#InvalidFilter << #dialogs >> 'Invalid filter') ].
classNameFilterAdaptor | index | index := self checkBoxNumberFor: #className. ^(PluggableAdaptor on: self) getBlock: [:m | m hasFilter: index] putBlock: [:m :v | m switchFilter: index perform: #className] updateBlock: [:m :a :p | a == #filter and: [p = index]]
existingTextAdaptor ^(PluggableAdaptor on: self) getBlock: [:m | m existingText] putBlock: [:m :v | ] updateBlock: [:m :a :p | a == #existingText]
labelFor: aKey "Return a label for the existingText view." | change protocol | selectionIndex > 0 ifTrue: [change := list at: selectionIndex. (aKey == #imageLabel and: [change isMethodRelated and: [(protocol := change systemCategory) notNil]]) ifTrue: [^((#SelectedChange1s << #dialogs >> 'Selected change (<1s>)') expandMacrosWith: protocol)]. aKey == #changeLabel ifTrue: [^((#Selection1s << #dialogs >> 'Selection (<1s>)') expandMacrosWith: (change fileName contractTo: 30))]]. aKey == #imageLabel ifTrue: [^(#SystemVersion << #dialogs >> 'System version')]. aKey == #changeLabel ifTrue: [^(#SelectedChange << #dialogs >> 'Selected change')]. ^nil
packageFilterAdaptor | index | index := self checkBoxNumberFor: #packageName. ^( PluggableAdaptor on: self ) getBlock: [ :m | m hasFilter: index ] putBlock: [ :m :v | m switchFilter: index perform: #packageName ] updateBlock: [ :m :a :p | a == #filter and: [ p = index ] ]
parcelFilterAdaptor | index | index := self checkBoxNumberFor: #parcelName. ^( PluggableAdaptor on: self ) getBlock: [ :m | m hasFilter: index ] putBlock: [ :m :v | m switchFilter: index perform: #parcelName ] updateBlock: [ :m :a :p | a == #filter and: [ p = index ] ]
protocolFilterAdaptor | index | index := self checkBoxNumberFor: #category. ^(PluggableAdaptor on: self) getBlock: [:m | m hasFilter: index] putBlock: [:m :v | m switchFilter: index perform: #category] updateBlock: [:m :a :p | a == #filter and: [p = index]]
selectionInList ^selectionInList
selectorFilterAdaptor | index | index := self checkBoxNumberFor: #selector. ^(PluggableAdaptor on: self) getBlock: [:m | m hasFilter: index] putBlock: [:m :v | m switchFilter: index perform: #selector] updateBlock: [:m :a :p | a == #filter and: [p = index]]
valueHolder "Answer the receiver. The receiver is the value holder for a change's text." ^self
valuesFilterAdaptor | index | index := self checkBoxNumberFor: #values. ^(PluggableAdaptor on: self) getBlock: [:m | m hasFilter: index] putBlock: [:m :v | m switchFilter: index perform: #values] updateBlock: [:m :a :p | a == #filter and: [p = index]]
</methods> <methods> Tools.AbstractChangeList <category>initialize-release</category>
initialize "Initialize the receiver's instance variables." super initialize. self setValue: ''. listName := ''. changes := List new. list := List new. selectionIndex := 0. filter := [:change | true]. removed := IdentitySet new. filterList := #(). fieldList := #(). verticalConflicts := VerticalConflicts. differencesMode := DifferencesMode. classesDistinct := false. selectionInList := SelectionInList with: list. selectionInList selectionIndexHolder onChangeSend: #selectionIndexChange to: self. menuBar := self class menuBar. menuBar augmentFrom: self class to: AbstractChangeList menuName: #menuBar for: self. menus := Dictionary new.
openOn: aSequenceOfChanges "Open up the receiver on the given set of changes." changes := aSequenceOfChanges asList. self updateList. self open
</methods> <methods> Tools.AbstractChangeList <category>doIt/accept/explain</category>
doItReceiver "Return a suitable doItReceiver for doIts in the text view. For consistency with the Browser return the non-meta class of a change if valid, or nil otherwise." ^selectionIndex > 0 ifTrue: [(list at: selectionIndex) nonMetaClassName asQualifiedReference valueOrDo: []] ifFalse: []
format: aText from: aController "Format the text. Have the controller replace its contents with the new Text, or nil if the format operation was unsuccessful." | selectedClass aCompiler newText change node | selectedClass := (change := list at: selectionIndex) classObject. "For formatting any class will do." selectedClass isNil ifTrue: [selectedClass := Object]. change isCommentChange ifTrue: [newText := selectedClass formatComment: aText] ifFalse: [aCompiler := selectedClass compilerClass new. node := aCompiler parse: aText in: selectedClass notifying: aController. node notNil ifTrue: [newText := node formattedCode]. (newText notNil and: [change isClassDefinitionChange]) ifTrue: [newText := newText asText makeSelectorBoldIn: selectedClass]]. newText notNil ifTrue: [aController selectFrom: 1 to: aController text size; deselect; replaceSelectionWith: newText asText; selectAt: 1] ifFalse: [aController view flash]
</methods> <methods> Tools.AbstractChangeList <category>checking</category>
checkSystem "Answer whether the receiver (as a conflict checker) is also checking with system." ^checkSystem notNil
checkSystem: aBooleanOrSymbol "Set the checking mode to allow the filtering of changes on filing in. Unlike checkWithSystem: do not do any checking. Return the previous checking mode." | oldMode | oldMode := checkSystem. checkSystem := aBooleanOrSymbol isSymbol ifTrue: [differencesMode := aBooleanOrSymbol] "use #code or #exact checking" ifFalse: [aBooleanOrSymbol ifTrue: [#code]]. ^oldMode
checkSystemMethod "Answer how the receiver (as a conflict checker) is checking with system." ^checkSystem isNil ifTrue: [differencesMode] ifFalse: [checkSystem]
checkWithSystem: aBooleanOrSymbol "Produce the conflict list for the list of changes. If aBoolean is true, then also check with the system. After the conflict list is reproduced then checking-reporting methods can be called." changeDict := Dictionary new. self checkSystem: aBooleanOrSymbol. list do: [:change | (removed includes: change) ifFalse: [ change checkWith: self]]
</methods> <methods> Tools.AbstractChangeList <category>selecting</category>
blankText self setValue: '' asText. self changed: #value. ^'' asText
deselect "Deselect the current selection (if any) and display a null text." selectionInList selectionIndex: ( selectionIndex := 0 ). self blankText
listIndex "Answer the position of the current selection." ^selectionIndex
toggleListIndex: anInteger "If the item at position anInteger is selected, deselect it, or vice versa. The flow of control for viewing the selected change's value is a little convoluted. If conflicts are not being shown then the change's text will be redisplayed if #value is changed. If conflicts are being showing then change #existingText, which causes self existingText to happen, and within existingText the receiver's value is changed. This means that the currently selected change's text isn't displayed twice if conflicts are being shown (first undifferentiated, immediately after differentiated), and we eliminate a horrible hack to do with changing the change's text by appending a space to get the highlighted version to be displayed." selectionIndex = anInteger ifTrue: [self deselect] ifFalse: [selectionIndex := anInteger. self showingConflicts ifFalse: [ self setValue: self selectionText ] ]. self changed: #listIndex. self showingConflicts ifTrue: [self changed: #existingText] ifFalse: [self changed: #value]. self setLabel
toggleRemoveForListController: aController "On double-click toggle the removed status of the current list entry." | targetIndex selection | (targetIndex := aController view targetIndex) = 0 ifTrue: [^self]. (removed includes: (selection := list at: targetIndex)) ifTrue: [removed remove: selection] ifFalse: [removed add: selection]. self updateListSelection: targetIndex
</methods> <methods> Tools.AbstractChangeList <category>fileIn/Out</category>
anyToFileOut "Answer a boolean, true if there are non-removed entries, false if there are none" list isEmpty ifTrue: [^false]. list do: [:next | (removed includes: next) ifFalse: [^true]]. ^false
doThis: listIndex "Replay the change at listIndex in the list and update the entry." (list at: listIndex) fileIn. self updateSelection: listIndex
fileOutOn: aSourceCodeStream list do: [:next | (removed includes: next) ifFalse: [next fileOutOn: aSourceCodeStream]]. aSourceCodeStream checkMethodChunkClass: nil protocol: nil
includesFileName: aString "Answer true if any of the non-removed changes in the list is from a file named aString." list do: [:change | (removed includes: change) ifFalse: [change fileName = aString ifTrue: [^true]]]. ^false
scanFile: aFileStream "Obtain changes from aFileStream. Depending on the checkSystem mode either read in all changes, or only changes which differ in source or code." (aFileStream isExternalStream and: [aFileStream fileName hasSourceExtension]) ifTrue: [aFileStream lineEndTransparent]. Cursor read showWhile: [[ChangeScanner new scanFile: aFileStream do: [:change | (nil == checkSystem or: [(change sameAsSystem: self) not]) ifTrue: [changes add: change]]] ensure: [aFileStream close]]. listName isEmpty ifTrue: [listName := aFileStream isExternalStream ifTrue: [aFileStream name] ifFalse: [(#someLocalStream << #dialogs >> 'some local stream') asString]] ifFalse: [('*...' match: listName) ifFalse: [listName := listName, ' ...']]. self updateList
scanFilename "Prompt for the name of an existing file to scan." | selections | selections := Dialog requestFileName: (#NameOfFileToScanQ << #dialogs >> 'Name of file(s) to scan?') default: ParagraphEditor currentSelection version: #multipleOld ifFail: [^self]. selections isCharacters ifTrue: [self scanFilename: selections asFilename] ifFalse: [selections asSortedCollection do: [:each | self scanFilename: each asFilename]]
</methods> <methods> Tools.AbstractChangeList <category>checking-change</category>
addChange: aChange "Add a change to the receiver's collection of changes for ChangeSet adding." changes add: aChange
changesAt: changeName ^changeDict at: changeName ifAbsent: [#()]
changesAt: changeName add: aChange (changeDict at: changeName ifAbsent: [changeDict at: changeName put: OrderedCollection new]) add: aChange
equalWithoutComments: text1 and: text2 | stream1 stream2 t | stream1 := ReadStream on: text1. stream2 := ReadStream on: text2. [(t := self nextNonComment: stream1) = (self nextNonComment: stream2)] whileTrue: [t == nil ifTrue: [^true]]. ^false
</methods> <methods> Tools.AbstractChangeList <category>private-checking</category>
finishReportOn: aStream "report conflicts among the changes" | noConflicts additions addedClassNames | (noConflicts := aStream isEmpty) ifTrue: [Transcript cr; show: (#NoConflicts << #dialogs >> '*** no conflicts ***'). aStream nextChunkPut: '"', (#NoConflicts << #dialogs >> '*** no conflicts ***') asString, '"'; cr]. "Compute all the additions. Eliminate redundant additions, i.e. if a new class is defined, just report the class, not its comment, methods etc, etc" addedClassNames := Set new. changeDict do: [:changeCollection| (changeCollection size = 1 and: [changeCollection first isClassDefinitionChange]) ifTrue: [addedClassNames add: changeCollection first className]]. additions := Dictionary new. changeDict do: [:changeCollection| changeCollection size = 1 ifTrue: [ (additions at: changeCollection first fileName ifAbsent: [additions at: changeCollection first fileName put: OrderedCollection new]) addLast: changeCollection first]]. additions size > 0 ifTrue: [noConflicts ifTrue: [Transcript show: (#ButThereAreAdditions << #dialogs >> ' (but there are additions)')]. additions keysAndValuesDo: [:fileName :changeCollection| aStream nextChunkPut: ((#AdditionsFrom1s << #dialogs >> '"Additions from <1s>"') expandMacrosWith: fileName); cr; cr. (changeCollection asSortedCollection: [:ca :cb| ca class name < cb class name or: [ca class == cb class and: [ca className <= cb className]]]) do: [:aChange| (aChange isClassDefinitionChange or: [(addedClassNames includes: aChange className) not]) ifTrue: [self tabText: aChange name on: aStream]]]]. ^aStream close
identifySubset: contendors name: change on: reportStream "Report conflicts among the changes--if all of the changes are textually identical, there are no conflicts, so don't do a report" | matched | matched := true. 1 to: contendors size - 1 do: [:i | | firstText | matched ifTrue: [ firstText := (contendors at: i) text. i + 1 to: contendors size do: [:j | | secondText | secondText := (contendors at: j) text. matched := matched and: [firstText = secondText]]]]. matched ifFalse: [ | oldText | reportStream cr; nextChunkPut: ((#ConflictC1s << #dialogs >> '"*** conflict: <1s> ***"') expandMacrosWith: change); cr. oldText := '...'. contendors do: [:contender | oldText := self writeContender: contender on: reportStream oldText: oldText]]
nextNonComment: sourceStream "Return the next item from the sourceStream (assumed not atEnd), carefully ignoring comments and separators." | char sepr | sepr := false. [char := sourceStream peek. char == nil ifTrue: [^nil]. char == $$ ifTrue: [sourceStream next. ^sourceStream next]. "catch chars/strings" char == $' ifTrue: [^String readFrom: sourceStream]. char == $" ifTrue: [sourceStream next; skipThrough: $". sepr := true] ifFalse: [char isSeparator ifTrue: [sourceStream skipSeparators. sepr := true] ifFalse: [sepr ifTrue: [^Character space]. sourceStream next. ^char]]] repeat
reportChangesOn: reportStream "Report conflicts among the changes" | contendors | changeDict keys asSortedStrings do: [:change | contendors := changeDict at: change. contendors size > 1 ifTrue: [ self identifySubset: contendors name: change on: reportStream]]
reportConflictsOn: aStream "Report conflicts among the changes" self reportChangesOn: aStream. self finishReportOn: aStream
tabText: text on: aStream "report conflicts among the changes" | cr previous terminator | cr := Character cr. terminator := $!. previous := cr. text do: [:char | char = cr ifFalse: [previous = cr ifTrue: [aStream tab]]. aStream nextPut: (previous := char). char = terminator ifTrue: [aStream nextPut: char]]. aStream nextPut: terminator; cr
writeContender: source on: aStream oldText: oldText "Write out the change and answer the code of the source past the initial comment (for further comparisons)." | text method endComment code | aStream cr; nextChunkPut: ((#FileC1s << #dialogs >> '"File: <1s>"') expandMacrosWith: source fileName); cr. text := source text. (source isKindOf: MethodDefinitionChange) ifFalse: [self tabText: text on: aStream. ^oldText]. method := ReadStream on: text. method skipSeparators; skipThrough: Character cr; skipSeparators. "skip header" (method peekFor: $") ifTrue: [method skipThrough: $"; skipSeparators]. endComment := method position. code := method upToEnd. (self equalWithoutComments: code and: oldText) ifTrue: [method reset. aStream cr; nextPutAll: (method next: endComment); nextPutAll: (#SameCodeExceptComments << #dialogs >> '[SAME CODE AS ABOVE; COMMENT OR FORMAT DIFFERS]') asString; cr] ifFalse: [aStream cr; nextChunkPut: text; cr]. ^code
</methods> <methods> Tools.AbstractChangeList <category>testing</category>
isEmpty "Answer if the receiver has no changes." ^changes isEmpty
notEmpty "Answer if the receiver has changes." ^changes notEmpty
</methods> <methods> Tools.AbstractChangeList <category>private-menus</category>
buildTextMenu | menu | menu := Menu labelList: (Array with: (Array with: #Accept << #dialogs >> 'Accept') with: (Array with: #DoIt << #dialogs >> 'Do it' with: #PrintIt << #dialogs >> 'Print it' with: #InspectIt << #dialogs >> 'Inspect it' with: #DebugIt << #dialogs >> 'Debug it')) , ParagraphEditor editGroupLabels , (Array with: (Array with: #ChangeTextStyle << #dialogs >> 'Change Text Style') with: (Array with: #Format << #dialogs >> 'Format' with: #Cancel << #dialogs >> 'Cancel')) values: #(#accept #doIt #printIt #inspectIt #debugIt) , ParagraphEditor editGroupSelectors , #(#changeTextStyle #format:from: #cancel). (menu menuItemWithValue: #accept) shortcutKeyCharacter: $S; shortcutModifiers: 2. #(doIt printIt inspectIt debugIt cut paste) with: #($D $P $Q $B $X $V) do: [:each :eachKey | (menu menuItemWithValue: each) labelImage: (ToolbarIconLibrary visualFor: each); shortcutKeyCharacter: eachKey; shortcutModifiers: 2]. (menu menuItemWithValue: #copySelection) labelImage: (ToolbarIconLibrary visualFor: #copy); shortcutKeyCharacter: $C; shortcutModifiers: 2. ^menu
hasItems "Used for dynamically updating menus." "Do I have any items that are displayed currently?" ^changes isEmpty not
hasItemsDisplayed "Used for dynamically updating menus." "Do I have any items that are displayed currently?" ^list isEmpty not
hasRemovedItems "Used for dynamically updating menus." ^removed isEmpty not
hasRemovedItemsDisplayed "Used for dynamically updating menus. Do I have any 'removed' items that are displayed currently?" ^self hasRemovedItems and: [list contains: [:ea | removed includes: ea]]
hasRemovedSelection "Used for dynamically updating menus." ^self hasSelection and: [removed includes: self selection]
hasSelection "Used for dynamically updating menus." ^self selection notNil
hasUnremovedItemsDisplayed "Used for dynamically updating menus." "Do I have any items that are displayed currently but haven't been removed?" ^self hasItemsDisplayed and: [list anySatisfy: [:ea | (removed includes: ea) not]]
hasUnremovedSelection "Used for dynamically updating menus." ^self hasSelection and: [(removed includes: self selection) not]
</methods> <methods> Tools.AbstractChangeList class <category>resources</category>
changeListMenu ^self subclassResponsibility
menuBar ^self subclassResponsibility
</methods> <methods> Tools.AbstractChangeList class <category>initialize</category>
instanceMethodsChanged "A Menu has changed. Update all open ChangeList menuBars." Screen default allScheduledWindowsDo: [:each | (each model isKindOf: self) ifTrue: [each model rebuildMenu]]
</methods> <methods> Tools.OverrideList <category>aspects</category>
labelFor: aKey "Return a label for the existingText view." | over protocol | selectionIndex > 0 ifTrue: [ over := list at: selectionIndex. ( aKey == #imageLabel and: [ over isMethodRelated and: [ ( protocol := over systemCategory ) notNil ] ] ) ifTrue: [ ^((#SystemVersion1s << #dialogs >> 'System version (<1s>)') expandMacrosWith: protocol) ]. ]. aKey == #imageLabel ifTrue: [ ^(#SystemVersion << #dialogs >> 'System version') ]. aKey == #changeLabel ifTrue: [ ^selectionIndex > 0 ifTrue: [ ((#From1s << #dialogs >> 'From <1s>') expandMacrosWith: over componentString) ] ifFalse: [ (#SelectedOverride << #dialogs >> 'Selected Override') ] ]. ^nil
</methods> <methods> Tools.OverrideList <category>menu messages</category>
findPackage "Prompt and search for all changes of a given package. Select these changes" self find: #packageName prompt: #package filter: #packageName
findParcel "Prompt and search for all changes of a given parcel. Select these changes" self find: #parcelName prompt: #parcel filter: #parcelName
getOverrides changes := Override overrideList asList. self updateList
getPackage "Add a given Package's changes to the change list. Should be hidden if Store not loaded." | selectedPackage overrides registry | registry := #{Store.Registry} valueOrDo: [^self]. (selectedPackage := self queryForPackage: registry) isNil ifTrue: [^self]. overrides := selectedPackage overrides. overrides isEmpty ifTrue: [^Dialog warn: ((#IsHasNotBeenOverridden << #dialogs >> '<1s> has not been overridden.') expandMacrosWith: selectedPackage name)]. changes addAll: (Override sortOverridesForLoading: overrides). self updateList
getParcel "Add a given Parcel's changes to the change list." | parcelName overrides | (parcelName := self queryParcel) isNil ifTrue: [^self]. overrides := (Parcel parcelNamed: parcelName) overrides. overrides isEmpty ifTrue: [^Dialog warn: ((#IsHasNotBeenOverridden << #dialogs >> '<1s> has not been overridden.') expandMacrosWith: parcelName)]. changes addAll: (Override sortOverridesForLoading: overrides). self updateList
purgeSelection selectionIndex == 0 ifTrue: [ ^Dialog warn: (#NoSelection << #dialogs >> 'No selection') ]. list := Array with: ( changes at: selectionIndex ). ( self purgeWarning: list ) ifTrue: [ self purge: list ].
purgeThese "Removes the removed overrides from the system" | toBeForgotten | removed isEmpty ifTrue: [ ^Dialog warn: (#NoOverridesHaveBeenMarked << #dialogs >> 'No overrides have been marked') ]. ( self purgeWarning: removed ) ifFalse: [ ^self ]. toBeForgotten := removed. removed := IdentitySet new. changes := changes reject: [ :over | toBeForgotten includes: over ]. self purge: toBeForgotten.
</methods> <methods> Tools.OverrideList <category>private</category>
fieldTemplates "return the templates for the fields (show file etc)" ^#( #( showComponent showProtocol showConflicts ) #( componentString category conflicts))
filterTemplates "return the templates for the filters" ^#( #( filterByParcel filterByPackage filterByType filterByClass filterByProtocol filterBySelector filterBySame ) #( parcelName packageName type className category selector values))
getWriteFilenameWithPrompt: promptString do: actionBlock "Find out the file name of a file to write to using the Filename utility that prompts for existing files." | fileName | fileName := Dialog requestNewFileName: promptString default: ParagraphEditor currentSelection. fileName isEmpty ifFalse: [ Cursor write showWhile: [ actionBlock value: fileName asFilename ] ]
purge: overrides overrides do: [ :override | changes remove: override ifAbsent: [ ]. removed remove: override ifAbsent: [ ]. override purge. selectionIndex := 0. self updateList. self makeChangesVisible ].
purgeWarning: overrides "Display a warning before purging overrides." | classes namespaces | classes := overrides select: [ :o | o isForClass ]. namespaces := overrides select: [ :o | o isForNameSpace ]. ( Dialog confirm: (#PurgingOverridesWarning << #dialogs >> ' Purged overrides will be removed from<n>their components and cannot be restored.<nttt>Continiue?') expandMacros ) ifFalse: [ ^false ]. classes isEmpty ifFalse: [ ( Dialog confirm: (#PurgingClassOverridesWarning << #dialogs >> 'Purging class overrides may invalidate methods or shared variables<n>owned by that class that are still in these components.<ntttt>Continue?') expandMacros ) ifFalse: [ ^false ]. ]. namespaces isEmpty ifFalse: [ ( Dialog confirm: (#PurgingNameSpaceOverridesWarning << #dialogs >> 'Purging namespaces overrides may invalidate<n>any contents remaining in the components.<nttt>Continue?') expandMacros ) ifFalse: [ ^false ]. ]. ^true
queryForPackage: registry "Let the user select a Package from a list. Return the selected package or nil if one was not selected." | packages | packages := registry allPackages asSortedCollection: [:a :b | a name < b name]. ^Dialog choose: (#DisplayWhichPackage << #dialogs >> 'Display which Package?') fromList: (packages collect: [:each | each name]) values: packages lines: 20 cancel: [nil]
</methods> <methods> Tools.OverrideList <category>accessing</category>
listName "Answer the label for a browser on the receiver. The default is Change List." listName size = 0 ifTrue: [^(#OverrideList << #labels >> 'Override List') asString] ifFalse: [^listName]
noConflictTextFor: over "Answer a Text corresponding to the conflicting text of the selected item in the system. This is in fact, the reason why there is no text to compare to. Answer nil if okay to compare." | conflictText | over targetObject == nil ifTrue: [ conflictText := ((#x1sNotInSystem << #dialogs >> '<1s> not in system') expandMacrosWith: over classDescription) asText emphasizeAllWith: #italic] ifFalse: [ ( self conflictTextFor: over ) == nil ifTrue: [ conflictText := (( over hasVersionInSystem ifTrue: [ (#x1sSourceNotAvailable << #dialogs >> '<1s> source not available') ] ifFalse: [ (#x1sNotInSystem << #dialogs >> '<1s> not in system') ] ) expandMacrosWith: over classDescription) asText emphasizeAllWith: #italic ]. ]. over isSameAsImage ifTrue: [ conflictText := (#NoConflict << #dialogs >> 'no conflict') asText emphasizeAllWith: #italic ]. ^conflictText
</methods> <methods> Tools.OverrideList <category>initialize-release</category>
openOn: aSequenceOfChanges "Open up the receiver on the given set of changes." changes := ( Override sortOverridesForLoading: aSequenceOfChanges ) asList. self updateList. self open
</methods> <methods> Tools.OverrideList <category>interface opening</category>
postOpenWith: aBuilder | hidden | super postOpenWith: aBuilder. hidden := #{Store} isDefined not. (menuBar atNameKey: #findPackage) hidden: hidden. (menuBar atNameKey: #filterByPackage) hidden: hidden. (menuBar atNameKey: #getPackage) hidden: hidden. (self wrapperAt: #packageFilter) isEnabled: hidden not
</methods> <methods> Tools.OverrideList <category>menu bar actions</category>
toggleShowComponent self fieldMessage: #showComponent
</methods> <methods> Tools.OverrideList <category>fileIn/Out</category>
includesFileName: aString "Answer true if any of the non-removed changes in the list is from a file named aString." ^false
</methods> <methods> Tools.MiniChangeSetManager <category>actions</category>
browseChanges ChangeSetManager browseChangedMethodsIn: self current
createChangeSet ChangeSetManager createChangeSet
editChangeSet ChangeEditor new sourceHolder: ChangeSet currentChangeSetHolder; open
fileInChanges ChangeSetManager fileIntoChangeSet: self current
fileIntoNewChangeSets ChangeSetManager fileIntoNewChangeSets
fileOutAll ChangeSetManager fileOutAllChangeSets: NamedChangeSet changeSetList
fileOutChanges ChangeSetManager fileOutChangeSet: self current
forgetChanges ChangeSetManager forgetChangesIn: self current
generateImportScript ChangeSetManager writeImportScriptFor: self current
generateRemovalScript ChangeSetManager writeRemovalScriptFor: self current
inspectChangeSet self current inspect
openChangeSetManager ChangeSetManager open
removeChangeSet ChangeSetManager removeChangeSet: self current
removeChangesFromSystem ChangeSetManager removeFromSystemChangesIn: self current
renameChangeSet ChangeSetManager renameChangeSet: self current. self updateLabel
</methods> <methods> Tools.MiniChangeSetManager <category>private</category>
current ^ChangeSet current
installLabelController | controller | controller := ControllerWithSelectMenu new. controller selectMenuHolder: [self changeSetSelectionMenu]; menuHolder: [self changeSetContextMenu]; performer: self. (self widgetAt: #label) controller: controller
updateLabel self builder notNil ifTrue: [(self widgetAt: #label) updateDisplayContents]
</methods> <methods> Tools.MiniChangeSetManager <category>initialize-release</category>
initialize super initialize. labelHolder := (AspectAdaptor forAspect: #displayString) subjectChannel: ChangeSet currentChangeSetHolder. ChangeSet addDependent: self. NamedChangeSet changeSetList addDependent: self
postBuildWith: aBuilder self installLabelController
preBuildWith: aBuilder super preBuildWith: aBuilder. aBuilder visualAt: #changeSetIcon put: (ToolbarIconLibrary visualFor: #edit)
release super release. ChangeSet removeDependent: self. NamedChangeSet changeSetList removeDependent: self. labelHolder release
</methods> <methods> Tools.MiniChangeSetManager <category>menu building</category>
changeSetContextMenu | menu | menu := self class changeSetContextMenu. menu augmentFrom: self class to: MiniChangeSetManager menuName: #changeSetContextMenu for: self. ^menu
changeSetSelectionMenu | menu current | menu := Menu new. current := self current. NamedChangeSet changeSetList do: [:each | | item | item := MenuItem labeled: each displayString. item value: [:controller | ChangeSet current: each]. each = current ifTrue: [item beOn]. menu addItem: item]. menu addLine; addItem: ((MenuItem labeled: #NewChangeSetDots << #menus >> 'New Change Set...') value: [:controller | self createChangeSet]). ^menu
</methods> <methods> Tools.MiniChangeSetManager <category>aspects</category>
labelHolder "This method was generated by UIDefiner. Any edits made here may be lost whenever methods are automatically defined. The initialization provided below may have been preempted by an initialize method." ^labelHolder isNil ifTrue: [labelHolder := String new asValue] ifFalse: [labelHolder]
</methods> <methods> Tools.MiniChangeSetManager <category>notifications</category>
update: aspectSymbol with: parameterObject from: originatorObject ^(originatorObject == ChangeSet or: [originatorObject == NamedChangeSet changeSetList]) ifTrue: [self updateLabel] ifFalse: [super update: aspectSymbol with: parameterObject from: originatorObject]
</methods> <methods> Tools.ChangeList <category>accessing</category>
noConflictTextFor: change "Answer a Text corresponding to the conflicting text of the selected item in the system. This is in fact, the reason why there is no text to compare to. Answer nil if okay to compare." change targetObject == nil ifTrue: [ ^change isClassRelated ifTrue: [ (#ClassNotInSystem << #dialogs >> 'class not in system') asText emphasizeAllWith: #italic ] ifFalse: [ '' asText ] ]. ( ( self conflictTextFor: change ) == nil and: [ change isMethodRelated ] ) ifTrue: [ ^( change hasVersionInSystem ifTrue: [ (#MethodSourceNotAvailable << #dialogs >> 'method source not available') ] ifFalse: [ (#MethodNotInSystem << #dialogs >> 'method not in system') ] ) asText emphasizeAllWith: #italic ]. ^nil
recoverFile: aFileStream "Recover all the changes from a .changes file since one of the last snapshots. The user is given a list of snapshots to pick from." | positions position| positions := SourceFileManager find: self snapshotsToGoBack lastSnapshotsIn: aFileStream. positions isEmpty ifTrue: [position := 0] ifFalse: [position := self pickPositionAmong: positions in: aFileStream. position isNil ifTrue: [^self]]. aFileStream position: position. self checkSystem: false. self scanFile: aFileStream
recoverLastFromFile: aFileStream "Recover all the changes from a .changes file since the last snapshot." | position | position := SourceFileManager findLastSnapshotIn: aFileStream. aFileStream position: (position ifNil: [0]). self checkSystem: false. self scanFile: aFileStream
</methods> <methods> Tools.ChangeList <category>aspects</category>
changeTypeFilterAdaptor ^(PluggableAdaptor on: self) getBlock: [:m | m hasFilter: 2] putBlock: [:m :v | m switchFilter: 2 perform: #type] updateBlock: [:m :a :p | a == #filter and: [p = 2]]
fileFilterAdaptor ^(PluggableAdaptor on: self) getBlock: [:m | m hasFilter: 1] putBlock: [:m :v | m switchFilter:1 perform: #fileName] updateBlock: [:m :a :p | a == #filter and: [p = 1]]
</methods> <methods> Tools.ChangeList <category>fileIn/Out</category>
scanFile: aFileStream "Obtain changes from aFileStream. Depending on the checkSystem mode either read in all changes, or only changes which differ in source or code." (aFileStream isExternalStream and: [aFileStream fileName hasSourceExtension]) ifTrue: [aFileStream lineEndTransparent]. Cursor read showWhile: [[ChangeScanner new scanFile: aFileStream do: [:change | (nil == checkSystem or: [(change sameAsSystem: self) not]) ifTrue: [changes add: change]]] ensure: [aFileStream close]]. listName isEmpty ifTrue: [listName := aFileStream isExternalStream ifTrue: [aFileStream name] ifFalse: [(#someLocalStream << #dialogs >> 'some local stream') asString]] ifFalse: [('*...' match: listName) ifFalse: [listName := listName, ' ...']]. self updateList
</methods> <methods> Tools.ChangeList <category>doIt/accept/explain</category>
doItReceiver "Return a suitable doItReceiver for doIts in the text view." ^selectionIndex > 0 ifTrue: [ ( list at: selectionIndex) doItReceiver ] ifFalse: [ ]
</methods> <methods> Tools.ChangeList <category>menu messages</category>
addOriginals "Add to the list versions of all changes in the list that are also found in the sources files." | changeNames sfm | "Collect all changes based on their checking names (to make look-up more efficient)." changeNames := Set new: changes size. changes do: [:change| (removed includes: change) ifFalse: [changeNames add: change checkingName]]. (sfm := SourceFileManager default) fileIndicesDo: [:fileIndex| | file originals | fileIndex ~= sfm changesIndex ifTrue: [file := (sfm nameStringAt: fileIndex) asLogicalFileSpecification readStream. file lineEndConvention: (sfm fileAt: fileIndex) lineEndConvention. Transcript cr; show: ((#Scanning1s << #dialogs >> 'Scanning <1s>') expandMacrosWith: file name asString). originals := OrderedCollection new: list size. Cursor read showWhile: [ChangeScanner new scanFile: file do: [:change| (changeNames includes: change checkingName) ifTrue: [originals addLast: change. "The following speeds things up but prevents one seeing e.g. overrides in later source files." "originals size = changes size ifTrue: [changes addAllLast: originals. ^self updateList]"]]]. originals size > 0 ifTrue: [changes addAllLast: originals. self updateList]]]
addSystemConflicts "Add to the list system versions of all messages in the list that conflict with the system." | conflicts | checkSystem := #exact. conflicts := OrderedCollection new: list size. list do: [:change| | systemVersion | (change hasVersionInSystem and: [change sameAsSystem: self]) ifFalse: [nil ~~ (systemVersion := change systemVersion) ifTrue: [conflicts addLast: systemVersion]]]. changes addAllLast: conflicts. self updateList
findFile "Prompt and search for all changes in a given file. Select these changes" self find: #fileName prompt: #fileName filter: #fileName
findSelector "Prompt and search for all changes of a given selector. Select these changes" self find: #selector prompt: #selector filter: #selector
getAllChanges "Add all the changes in the system to the receiver." | sfm | sfm := SourceFileManager default. Cursor execute showWhile: [ | changedClasses | changedClasses := Set new. ChangeSet withAllSubclasses do: [:csc| csc allInstancesDo: [:cs| changedClasses addAll: cs changedClassDefinitions]]. SystemUtils allBehaviorsDo: [:class| (changedClasses includes: class) ifTrue: [self addChange: (class isMeta ifTrue: [ClassOtherChange new className: class fullName; type: #'inst vars for'; yourself] ifFalse: [ClassDefinitionChange new className: class fullName; yourself])]. (class organization hasNoComment not and: [(sfm fileIndexFor: class organization commentKey) = sfm changesIndex]) ifTrue: [self addChange: (ClassDocumentationChange new className: class fullName; yourself)]. class selectorsAndMethodsDo: [:s :m| sfm changesIndex = (sfm fileIndexFor: m sourcePointer) ifTrue: [self addChange: (MethodDefinitionChange new className: class fullName; selector: s; category: (class whichCategoryIncludesSelector: s); yourself)]]]]. self updateList
getChanges "Add the current project's changes to the change list." Cursor execute showWhile: [ChangeSet current addChangesToChangeList: self]. self updateList
getParcel "Add a given Parcel's changes to the change list." | parcelName | parcelName := self queryParcel. nil == parcelName ifTrue: [^self]. Cursor execute showWhile: [(Parcel parcelNamed: parcelName) addChangesToChangeList: self]. self updateList
helpAbout AboutVisualWorksDialog open
helpChangeList SmalltalkWorkbench openHelpBook: 'VisualWorks Tools' topic: 'Change List'
helpChangesAndChangeSets SmalltalkWorkbench openHelpBook: 'Development with VisualWorks' topic: 'Changes and Change Sets'
recover "Recover changes since one of the last snapshots from the changes file. The user is given a list of snapshots to pick from." Cursor read showWhile: [self recoverFile: SourceFileManager default targetFile]. builder window label: self listName
recoverLast "Recover changes since the last snapshot from the changes file." Cursor read showWhile: [self recoverLastFromFile: SourceFileManager default targetFile]. builder window label: self listName
spawnConvergeScriptToSystem "Spawn a new ChangeList containing changes necessary to convert the code in the receiver's changes to that of the current system. The method assumes that the current ChangeList contains complete code for one or more classes from some other system which differs from this system. One wants to compute the set of changes to file-in to the other system to make it the same as the current system. E.g. imagine one wanted to file-in this ChangeList and Change classes into a system without it. One would file-out the ChangeList and Change classes in the deficient system, use this method in this system, and file-in the resulting script into the deficient system." self spawnConvergeScriptToSystem: #exact
spawnConvergeScriptToSystem: codeOrExactSymbol "Spawn a new ChangeList containing changes necessary to convert the code in the receiver's changes to that of the current system. The method assumes that the current ChangeList contains complete code for one or more classes from some other system which differs from this system. One wants to compute the set of changes to file-in to the other system to make it the same as the current system. E.g. imagine one wanted to file-in this ChangeList and Change classes into a system without it. One would file-out the ChangeList and Change classes in the deficient system, use this method in this system, and file-in the resulting script into the deficient system." | changeList methodDefinitions | methodDefinitions := Dictionary new. list do: [:c| | index | c isDefinition ifTrue: ["Collect methodDefinitions for later use." c isMethodRelated ifTrue: [(methodDefinitions at: c className ifAbsentPut: [Set new]) add: c selector]] ifFalse: [((removed includes: c) not and: [c trivial not]) ifTrue: [(index := list indexOf: c) ~= selectionIndex ifTrue: [self updateSelection: index]. (builder componentAt: #listView) widget makeVisible: index. ^Dialog warn: (#ChangesIncludeSomethingBad << #dialogs >> 'Changes contain non-definitional changes (e.g. this change). Please remove all such changes before trying again.')]]]. Cursor wait showWhile: [changeList := self class open window model]. "This algorithm is a naive first-cut. One thing it doesn't do is prevent undeclared inst vars. Since one goal of script generation is to keep the filing-in system maximally functional during file-in one should probably do class declarations as follows. First, construct a definition with the union of both class definitions instance & class variables. Then include method changes. Then append the desired class definition. This isn't implemented yet." checkSystem := codeOrExactSymbol. Cursor execute showWhile: [| removedClasses | removedClasses := Dictionary new. list do: [:c| ((removedClasses includesKey: c nonMetaClassName) or: [c sameAsSystem: self]) ifFalse: [c hasVersionInSystem ifTrue: [changeList addChange: c systemVersion] ifFalse: [c isClassDefinitionChange ifTrue: [removedClasses at: c nonMetaClassName put: c] ifFalse: [changeList addChange: c versionToRemove]]]. "Ensure we add all methods not implemented in these changes." (c isClassDefinitionChange and: [(removedClasses includesKey: c nonMetaClassName) not]) ifTrue: [(Array with: c classObject instanceBehavior with: c classObject classBehavior) do: [:class| | className implementedSelectors | className := class fullName. implementedSelectors := methodDefinitions at: className ifAbsent: [Set new]. class selectors do: [:sel| (implementedSelectors includes: sel) ifFalse: [changeList addChange: (MethodDefinitionChange new className: className; selector: sel; category: (class whichCategoryIncludesSelector: sel); yourself)]]]]]. "Should be done in reverse superclass order, which should be reverse file-out order." removedClasses do: [:c| changeList add: c versionToRemove]]. changeList updateList
</methods> <methods> Tools.ChangeList <category>menu messages-removing</category>
addChangesToCurrentChangeSet "Remove from the current change set those changes that correspond to the currently listed changes." [Cursor execute showWhile: [ list do: [:change| (removed includes: change) ifFalse: [change addToCurrentChangeSet]]]] on: Object errorSignal do: [:ex| | index | (ex originator isKindOf: Change) ifTrue: [selectionIndex ~= (index := list indexOf: ex originator) ifTrue: [self updateSelection: index]. (builder componentAt: #listView) widget makeVisible: selectionIndex]. ex pass]
removeChangesFromCurrentChangeSet "Remove from the current change set those changes that correspond to the currently listed changes." [Cursor execute showWhile: [list do: [:change| (removed includes: change) ifFalse: [change removeFromCurrentChangeSet]]]] on: Object errorSignal do: [:ex| | index | (ex originator isKindOf: Change) ifTrue: [selectionIndex ~= (index := list indexOf: ex originator) ifTrue: [self updateSelection: index]. (builder componentAt: #listView) widget makeVisible: selectionIndex]. ex pass]
</methods> <methods> Tools.ChangeList <category>menu bar actions</category>
toggleFileFilter self filterMessage: #filterByFile
toggleShowFile self fieldMessage: #showFile
</methods> <methods> Tools.ChangeList <category>checking</category>
checkSystem: aBooleanOrSymbol "Set the checking mode to allow the filtering of changes on filing in. Unlike checkWithSystem: do not do any checking. Return the previous checking mode." | oldMode | oldMode := checkSystem. checkSystem := aBooleanOrSymbol isSymbol ifTrue: [differencesMode := aBooleanOrSymbol] "use #code or #exact checking" ifFalse: [aBooleanOrSymbol ifTrue: [#code]]. ^oldMode
</methods> <methods> Tools.ChangeList <category>private</category>
fieldTemplates "return the templates for the fields (show file etc)" ^#( #( showFile showProtocol showConflicts ) #( fileName category conflicts))
filterTemplates "return the templates for the filters" ^#( #( filterByFile filterByType filterByClass filterByProtocol filterBySelector filterBySame ) #( fileName type className category selector values))
getWriteFilenameWithPrompt: promptString do: actionBlock "Find out the file name of a file to write to using the Filename utility that prompts for existing files." | fileName | [fileName := Dialog requestNewFileName: promptString default: ParagraphEditor currentSelection. fileName isEmpty or: [(self includesFileName: fileName) ifTrue: [Dialog warn: ((#SourceFileStillInUse << #dialogs >> '<1s> cannot be used because<n>it holds the source of some or all entries.<n>Please try again.') expandMacrosWith: fileName). false] ifFalse: [true]]] whileFalse. fileName isEmpty ifFalse: [Cursor write showWhile: [actionBlock value: fileName asFilename]]
makeChangesVisible "Attempt to make at least one chnage visible; assuming that all changes are filtered out." | filters | filters := self filterTemplates first. filters size to: 1 by: -1 do: [:i| list isEmpty ifFalse: [^self]. (self hasFilter: i) ifTrue: [self filterMessage: (filters at: i)]]
pickPositionAmong: aCollection in: aFileStream "aCollection is a collection of snapshot marker positions in 'aFileStream' open on the changes file. Open a dialog to let the user pick one and return it. Return nil if cancelled. If there were fewer entries in aCollection than normally selected, include the file beginning into choices. " | positions labels beginningOfChangesFileMessage recoverLastNMessage | beginningOfChangesFileMessage := #beginningOfChangeFile << #dialogs >> 'Beginning of the changes file'. recoverLastNMessage := #recoverLastNMessage << #dialogs >> 'Recover going as far back as:'. positions := OrderedCollection new. labels := OrderedCollection new. aCollection do: [:markerLocation | | comment | comment := self snapshotLabelAfter: markerLocation in: aFileStream. comment notNil ifTrue: [positions add: markerLocation. labels add: comment]]. aCollection size < self snapshotsToGoBack ifTrue: [positions add: 0. labels add: beginningOfChangesFileMessage asString]. positions isEmpty ifTrue: [^nil]. ^Dialog choose: recoverLastNMessage fromList: labels values: positions lines: 8 cancel: [nil]
redisplayList "Redisplay the list unless the interface is not actually open." builder notNil ifTrue: [(builder componentAt: #listView) widget invalidate]
scanFilename: aFilename "Scan the file/directory name specified. If aFilename is a directory, then scan all the files in it." Transcript cr; show: ((#Scanning1s << #dialogs >> 'Scanning <1s>') expandMacrosWith: aFilename asString). aFilename isDirectory ifTrue: [ aFilename directoryContents asSortedStrings do: [:each | self scanFilename: (aFilename construct: each)]] ifFalse: [ | stream | stream := (aFilename withEncoding: #Source) readStream. [self scanFile: stream] ensure: [stream close]]
snapshotLabelAfter: position in: aFileStream "aFileStream is expected to be a stream on the changes file. Find a snapshot label following the 'position' and return the timestamp part of it. Return nil if there are problems finding a label. 'position' is expected to point at a snapshot marker." | comment descr date time | aFileStream position: position. aFileStream through: $". aFileStream position - position > 50 ifTrue: [^nil]. comment := aFileStream upTo: $". ^(('#(*)' match: comment) and: [(descr := Object readFrom: comment readStream) class == Array and: [descr size = 3 and: [descr allSatisfy: [:s | s isString]]]]) ifTrue: [date := Date readFrom: (descr at: 2) readStream. time := Time readFrom: (descr at: 3) readStream. #snapShotCreated << #dialogs >> '<1s> created at <2p> <3p>' expandMacrosWith: descr first with: date with: time] ifFalse: [nil]
snapshotsToGoBack "The number of snapshots the Recover Last Changes action goes back in the changes file." ^8
</methods> <methods> Tools.ChangeList class <category>instance creation</category>
openOnFileNamed: aFilenameOrString |cl | cl := self new. cl scanFile: (aFilenameOrString asFilename withEncoding: #Source ) readStream. cl open
</methods> <methods> Tools.ChangeSetManager <category>events</category>
noticeOfWindowClose: aWindow super noticeOfWindowClose: aWindow. self release
windowEvent: anEvent from: aWindow "Override to catch events on which we should re-install the interface." super windowEvent: anEvent from: aWindow. (anEvent key == #newGraphicsDevice or: [anEvent key == #reopen]) ifTrue: [self reInstallInterface]
</methods> <methods> Tools.ChangeSetManager <category>actions</category>
browseChangedMethods "Launch a method browser for all the changes in the change set." self class browseChangedMethodsIn: self currentPackage
browseImplementors "Browse implementors of a particular message from code in the selected change set, or in all change sets, if none is selected." | symbol theList title | symbol := SmalltalkWorkbench promptForSelector: (#findImplementorsOfWhat << #dialogs >> 'Find implementors of what?') for: builder window. symbol isNil ifTrue: [^self]. self listModel selection isNil ifTrue: [title := (#implementorsOfXWithinChangeSets << #labels >> 'Implementors of <1s> within change sets') expandMacrosWith: symbol storeString. theList := OrderedCollection new: 100. listModel list do: [:cs| theList addAll: ((cs implementorsOf: symbol) collect: [:md| md extraText: ((#selectorXinChangeSetY << #labels >> '<tt>-- in <1s>') expandMacrosWith: cs name). md])]] ifFalse: [title := (#referencesToXWithinY << #labels >> 'References to <1s> within <2s>') expandMacrosWith: symbol storeString with: self currentPackage name. theList := self currentPackage implementorsOf: symbol]. theList isEmpty ifTrue: [^Dialog warn: (#nobody << #dialogs >> 'Nobody')]. MethodCollector new openListBrowserOn: theList label: title initialSelection: (symbol isSymbol ifTrue: [symbol] ifFalse: [symbol storeString])
browseSenders "Browse senders of a particular message from code in the selected change set, or in all change sets, if none is selected." | symbol literal theList title | symbol := SmalltalkWorkbench promptForSelector: (#findReferencesToWhat << #dialogs >> 'Find references to what?') for: builder window. symbol isNil ifTrue: [^self]. literal := Smalltalk bindingFor: symbol. literal == nil ifTrue: [literal := symbol]. self listModel selection isNil ifTrue: [title := (#referencesToXWithinChangeSets << #labels >> 'References to <1s> within change sets') expandMacrosWith: symbol storeString. theList := OrderedCollection new: 100. listModel list do: [:cs| theList addAll: ((cs sendersOf: literal) collect: [:md | md extraText: ((#selectorXinChangeSetY << #labels >> '<tt>-- in <1s>') expandMacrosWith: cs name). md])]] ifFalse: [title := (#referencesToXWithinY << #labels >> 'References to <1s> within <2s>') expandMacrosWith: symbol storeString with: self currentPackage name. theList := self currentPackage sendersOf: literal]. theList isEmpty ifTrue: [^Dialog warn: (#nobody << #dialogs >>'Nobody')]. MethodCollector new openListBrowserOn: theList label: title initialSelection: (symbol isSymbol ifTrue: [symbol] ifFalse: [symbol storeString])
changeSetBeCurrent self listModel selectionDo: [:selection | ChangeSet current: selection]
deleteChangeSet self class removeChangeSet: self currentPackage
editChangeSet | cs | self changeSetBeCurrent. cs := ChangeEditor new. cs sourceHolder: ChangeSet currentChangeSetHolder. self addDependent: cs. cs open
emptyChangeSet self class forgetChangesIn: self currentPackage. self refreshSelection
expungeCurrentProjectFromSystem self class removeFromSystemChangesIn: self currentPackage.
fileInFrom "Read in some code." self class fileIntoChangeSet: self currentPackage
fileOutAllChangeSets self class fileOutAllChangeSets: listModel list. self refreshSelections
fileOutChangeSet self class fileOutChangeSet: self currentPackage. self refreshSelection
findClass "Select the next project in the list referring to class." | nameString className | nameString := Dialog request: (#findChangeSetReferringToClass << #dialogs >> 'Find change set referring to class:'). nameString isEmpty ifTrue: [^self]. ((className := Symbol findInterned: nameString) notNil and: [ className asQualifiedReference isDefined ]) ifFalse: [className := (Smalltalk allClassNames inject: 0->nil into: [:choice :name| choice max: (nameString spellAgainst: name) -> name]) value]. className isNil ifFalse: [className := className asString. "ChangeSets store class names as strings, not symbols" listModel selectionIndex + 1 to: listModel list size do: [:csi| ((listModel list at: csi) refersToClassNamed: className) ifTrue: [^listModel selectionIndex: csi]]]. Dialog warn: ((#noChangeSetsReferToClassX << #dialogs >> 'No ChangeSets refer to class <1s>') expandMacrosWith: className)
findSelector "Select the next project in the list referring to selector." | response selector | response := Dialog request: (#findChangeSetReferringToSelector << #dialogs >> 'Find change set referring to selector:'). response isEmpty ifTrue: [^self]. ((selector := Symbol findInterned: response) isNil and: [(selector := Symbol correctMessage: response) isNil]) ifTrue: [^self]. listModel selectionIndex + 1 to: listModel list size do: [:csi| ((listModel list at: csi) refersToSelector: selector) ifTrue: [^listModel selectionIndex: csi]]. ^Dialog warn: ((#noChangeSetsReferToSelectorX << #dialogs >> 'No ChangeSets refer to selector <1p>') expandMacrosWith: selector)
helpAbout AboutVisualWorksDialog open
helpChangesAndChangeSets SmalltalkWorkbench openHelpBook: 'Development with VisualWorks' topic: 'Changes and Change Sets'
helpChangeSetBrowser SmalltalkWorkbench openHelpBook: 'VisualWorks Tools' topic: 'Change Set Browser'
importChangeSets self class fileIntoNewChangeSets
importScript self class writeImportScriptFor: self currentPackage. self refreshSelection
inspectChangeSet self currentPackage inspect
newChangeSet self class createChangeSet
removeScript self class writeRemovalScriptFor: self currentPackage. self refreshSelection
renameChangeSet | current | current := self currentPackage. self class renameChangeSet: current. self listModel selection: current. self refreshSelection
</methods> <methods> Tools.ChangeSetManager <category>private</category>
currentChangeSetIcon ^currentSetIcon ifNil: [currentSetIcon := ToolbarIconLibrary visualFor: #edit]
currentPackage ^self listModel selection
listMenu self updateListMenu. ^listMenu
menuBar menuBar := self class menuBar. menuBar isNil ifTrue: [^Menu new]. [menuBar augmentFrom: self class to: ChangeSetManager menuName: #menuBar for: self] on: Object errorSignal do: [:ex | ex return]. ^menuBar
rebuildMenuBar menuBar notNil ifTrue: [self rebuildMenu: menuBar with: self menuBar augmentTo: ChangeSetManager]
refreshSelection self listModel list changed: #at: with: self listModel selectionIndex
refreshSelections | list | list := self listModel list. 1 to: list size do: [:index| list changed: #at: with: index]
reInstallInterface "Install the receiver's user interface again. Keep the same window. This happens when changing projects, restarting, and look and feel changes. Note that this code is a simple rewrite of that in VisualLauncher's reInstallInterface, except for the additional maintennance of changeSetList's dependents and it's ValueModel's dependents." | spec window listWidget | (listWidget := builder componentAt: #listModel) notNil ifTrue: [| theSequenceView | (builder composite components includes: listWidget) ifTrue: [builder composite removeComponent: listWidget]. theSequenceView := listWidget widget. NamedChangeSet changeSetList removeDependent: theSequenceView. theSequenceView model removeDependent: theSequenceView. listModel selectionIndexHolder removeDependent: theSequenceView]. window := builder window. window component release. "event dispatcher has to be reset so that it doesn't hold on to old objects, such as keyboardProcessor, etc" window controller reInstallEventDispatcher. builder := UIBuilder new. builder setWindow: window. builder source: self. spec := self class interfaceSpecFor: #windowSpec. self preBuildWith: builder. builder add: spec. self postBuildWith: builder. builder doFinalHookup. self postOpenWith: builder. ^builder
statusColumnSpec ^ArbitraryViewSpec new source: #statusColumnVisual:; flags: 0
statusColumnVisual: isCurrent ^isCurrent ifTrue: [self currentChangeSetIcon] ifFalse: [VisualPart new]
</methods> <methods> Tools.ChangeSetManager <category>aspects</category>
currentChangeSetHolder ^nil asValue
listModel ^listModel
</methods> <methods> Tools.ChangeSetManager <category>updating</category>
changeSetSelected "The current change set selection has changed independently from us. The whole view needs updating to reflect reality." (self widgetAt: #listModel) ifNotNil: [:list | list invalidate]
update: aspectSymbol with: parameterObject from: originatorObject ^originatorObject == ChangeSet ifTrue: [self updateCurrentChangeSetEntry] ifFalse: [super update: aspectSymbol with: parameterObject from: originatorObject]
updateCurrentChangeSetEntry | index | self builder notNil ifTrue: [index := self listModel list indexOf: ChangeSet current. index ~= 0 ifTrue: [(self widgetAt: #listModel) updateAt: index]]
updateListMenu | menu | menu := self class listMenu. menu augmentFrom: self class to: ChangeSetManager menuName: #listMenu for: self. listMenu value: menu
</methods> <methods> Tools.ChangeSetManager <category>initialize-release</category>
initialize listModel := SelectionInList with: NamedChangeSet changeSetList. self listModel selection: ChangeSet current. ChangeSet currentChangeSetHolder onChangeSend: #changeSetSelected to: self. ChangeSet addDependent: self. listMenu := nil asValue
postBuildWith: aBuilder | descriptors | super postBuildWith: aBuilder. builder window application: self; sendWindowEvents: #(#newGraphicsDevice #reopen). descriptors := (self widgetAt: #listModel) columnDescriptors. descriptors first rendererSpec: self statusColumnSpec
release super release. ChangeSet currentChangeSetHolder retractInterestsFor: self. ChangeSet removeDependent: self
</methods> <methods> Tools.ChangeSetManager <category>testing</category>
isChangeSetSelected ^self listModel selectionIndex ~= 0
</methods> <methods> Tools.ChangeSetManager class <category>utilities</category>
browseChangedMethodsIn: aChangeSet "Create a browser on the changed message list." | changes | changes := aChangeSet changedMessageList. changes := changes, (aChangeSet changedObjects select: [:each | each isBindingReference]) asSortedCollection asArray. MethodCollector new openListBrowserOn: changes label: ((#ChangedMethodsInChangeSet << #dialogs >> 'Changed Methods in Change Set <1s>') expandMacrosWith: self current name asString)
createChangeSet | newSetName newSet | newSetName := NamedChangeSet requestUniqueName: (#createChangeSetNamed << #dialogs >> 'Create change set named:') initial: '' ifCancel: [^self]. newSet := NamedChangeSet withName: newSetName asSymbol. NamedChangeSet addChangeSet: newSet. ChangeSet current: newSet
fileIntoChangeSet: aChangeSet "Read in some code." | filename | filename := Dialog requestFileName: (#PleaseTypeAFileNameC << #dialogs >> 'Please type a file name:') default: ChangeSet current name, '.st' version: #mustBeOld ifFail: ['']. filename isEmpty ifTrue: [ ^self ]. Notice show: (#FilingInN1S << #dialogs >> 'Filing in<n><1s>' expandMacrosWith: filename asString) while: [ | source | source := (filename asFilename withEncoding: #Source) readStream. [aChangeSet fileInFrom: source] ensure: [source close]]
fileIntoNewChangeSets | selections | selections := Dialog requestFileName: (#NameOfFilesToImport << #dialogs >> 'Name of file(s) to import?') default: ParagraphEditor currentSelection version: #multipleOld ifFail: [^self]. "At least the win32 native dialog returns the sequence in a screwy order. Sorted order is at least consistent and workable." (selections isCharacters ifTrue: [Array with: selections] ifFalse: [selections asSortedCollection]) do: [:file | Cursor read showWhile: [| changeSetName | changeSetName := self changeSetNameFor: file asFilename. [changeSetName ~= 'Default' or: [Dialog confirm: (#OKToUseDefault << #dialogs >> 'Are you sure you want to use Default<n>as the target ChangeSet?') expandMacros]] whileFalse: [changeSetName := Dialog request: (#NewNameForChangeSet << #dialogs >> 'Please supply a new name for the ChangeSet')]. self importChangeSetFrom: file asFilename named: changeSetName]]
fileOutAllChangeSets: aCollection | directory stream | directory := Dialog requestDirectoryName: (#FileOutDirectoryForChangeSets << #dialogs >> 'File out projects on which directory?') default: (#projects << #dialogs >> 'projects') asString. directory isEmpty ifTrue: [^self]. (directory := directory asFilename) exists ifTrue: [directory isDirectory ifFalse: [^Dialog warn: ((#FileIsNotADirectory << #dialogs >> '<1s> exists but is not a directory') expandMacrosWith: directory asString)]] ifFalse: [directory makeDirectory]. aCollection do: [:each | | fileName | fileName := directory constructString: (Filename filterFilename: (each name copyWithout: Character space), Filename changeExtension). stream := SourceCodeStream write: fileName. Cursor write showWhile: [[each fileOutOn: stream] ensure: [stream close]]]
fileOutChangeSet: aChangeSet | fileName oldSeparator | fileName := aChangeSet lastFileOutName. (fileName isNil or: [(fileName := fileName asString) isEmpty]) ifTrue: [fileName := aChangeSet name asString, '.st']. oldSeparator := (fileName includes: UnixFilename separator) ifTrue: [UnixFilename separator] ifFalse: [(fileName includes: PCFilename separator) ifTrue: [PCFilename separator] ifFalse: [(fileName includes: MacFilename separator) ifTrue: [MacFilename separator] ifFalse: [nil]]]. fileName replaceAll: oldSeparator with: Filename separator. fileName := fileName asFilename. fileName := fileName directory construct: (fileName tail copyWithout: Character space). fileName := Dialog requestNewFileName: #FileOutAsFileNamed << #dialogs >> 'File out as file named' default: fileName. fileName isEmpty ifTrue: [^self]. Cursor write showWhile: [| stream | stream := SourceCodeStream write: fileName. [aChangeSet fileOutOn: stream] ensure: [stream close]]
forgetChangesIn: aChangeSet (Dialog confirm: (#emptyThisChangeSet << #dialogs >> 'Empty this change set?')) ifTrue: [aChangeSet initialize]
removeChangeSet: aChangeSet aChangeSet name = #Default ifTrue: [ ^Dialog warn: #defaultChangeSetCannotBeRemoved << #dialogs >> 'Default change set cannot be removed.' ]. aChangeSet isEmpty ifFalse: [(Dialog confirm: #changeSetNotEmptyAreYouSure << #dialogs >> 'This change set is not empty. Are you sure you want to remove it?') ifFalse: [^self]]. aChangeSet = ChangeSet current ifTrue: [ChangeSet current: NamedChangeSet default]. NamedChangeSet removeChangeSet: aChangeSet
removeFromSystemChangesIn: aChangeSet "Remove the changes the change set contains." (Dialog confirm: #allMethodsAndClassesWillBeRemovedAreYouSure << #dialogs >> 'All methods and classes in this change set will be removed from the image. Are you sure?') ifFalse: [^self]. (Dialog confirm: #areYouReallyReallySure << #dialogs >> 'Are you really really sure?') ifFalse: [^self]. aChangeSet sendTheInfidelToParadise
renameChangeSet: aChangeSet | oldName newName | oldName := aChangeSet name. newName := NamedChangeSet requestUniqueName: #renameChangeSetTo << #dialogs >> 'Rename change set to:' initial: oldName ifCancel: [^self]. aChangeSet name: newName asSymbol. oldName = #Default ifTrue: [NamedChangeSet addChangeSet: (NamedChangeSet withName: #Default)] ifFalse: [NamedChangeSet sortChangeSetList]
writeImportScriptFor: aChangeSet | fileName oldSeparator stream | fileName := aChangeSet name asString, '.ip'. oldSeparator := (fileName includes: UnixFilename separator) ifTrue: [ UnixFilename separator ] ifFalse: [ (fileName includes: PCFilename separator) ifTrue: [ PCFilename separator ] ifFalse: [ (fileName includes: MacFilename separator) ifTrue: [ MacFilename separator ] ifFalse: [ nil ] ] ]. fileName replaceAll: oldSeparator with: Filename separator. fileName := fileName copyWithout: Character space. fileName := Dialog requestNewFileName: (#importScriptAsFileNamed << #dialogs >> 'import script as file named') default: fileName. fileName isEmpty ifTrue: [^self]. stream := (fileName asFilename withEncoding: #Source) writeStream. [aChangeSet writeImportScriptOn: stream] ensure: [stream close]
writeRemovalScriptFor: aChangeSet | fileName oldSeparator stream | fileName := aChangeSet name asString, '.rm'. oldSeparator := (fileName includes: UnixFilename separator) ifTrue: [ UnixFilename separator ] ifFalse: [ (fileName includes: PCFilename separator) ifTrue: [ PCFilename separator ] ifFalse: [ (fileName includes: MacFilename separator) ifTrue: [ MacFilename separator ] ifFalse: [ nil ] ] ]. fileName replaceAll: oldSeparator with: Filename separator. fileName := fileName copyWithout: Character space. fileName := Dialog requestNewFileName: (#FileForRemovalScript << #dialogs >> 'write removal script as file named') default: fileName. fileName isEmpty ifTrue: [^self]. stream := (fileName asFilename withEncoding: #Source) writeStream. [aChangeSet writeRemovalScriptOn: stream] ensure: [stream close]
</methods> <methods> Tools.ChangeSetManager class <category>class initialization</category>
instanceMethodsChanged "A Menu has changed. Update all open Launcher menuBars." Screen default allScheduledControllersDo: [:ctrlr | (ctrlr model isKindOf: self) ifTrue: [ctrlr model rebuildMenuBar; updateListMenu]]
</methods> <methods> Tools.ChangeSetManager class <category>current set access</category>
current "Obsolete" ^ChangeSet current
newChanges: aChangeSet "Obsolete" ChangeSet current: aChangeSet
noChanges "Reset the current change set." "self noChanges" ChangeSetManager current initialize
</methods> <methods> Tools.ChangeSetManager class <category>interface opening</category>
open "Override to use the currently-open manager, if one exists." ^self raiseSingleInstance ifNil: [super open]
</methods> <methods> Tools.ChangeSetManager class <category>private</category>
changeSetNameFor: aFilename | stream | stream := aFilename readStream. ^[| pattern changeSetName | pattern := 'Changes in change set '. ((stream skipToAll: pattern) isNil or: [(stream skip: pattern size). (changeSetName := stream upToAll: ' --') isNil]) ifTrue: [^aFilename tail copyReplaceAll: aFilename extension with: '']. changeSetName] ensure: [stream close]
importChangeSetFrom: aFilename named: aString | nameSymbol changeSet stream | ((nameSymbol := Symbol findInterned: aString) isNil or: [(changeSet := NamedChangeSet lookup: nameSymbol) isNil]) ifTrue: [changeSet := NamedChangeSet withName: aString asSymbol. NamedChangeSet addChangeSet: changeSet]. stream := (aFilename asFilename withEncoding: #Source) readStream. Notice show: (#FilingInN1S << #dialogs >> 'Filing in<n><1s>' expandMacrosWith: aFilename asString) while: [[changeSet fileInFrom: stream] ensure: [stream close]]
</methods> <methods> Kernel.Override <category>change list support</category>
browseSystemVersionIfExists "Open a browser on the system version of this override if possible. Answer if it was possible." self hasVersionInSystem ifFalse: [ ^false ]. self browseSystemVersion. ^true
</methods> <methods> Kernel.Change <category>checking</category>
addToCurrentChangeSet "Add the receiver's corresponding entry in the current ChangeSet (if it exists)." ^self subclassResponsibility
</methods> <methods> Kernel.Change <category>source code</category>
browseSystemVersionIfExists "Open a browser on the system version of this change if possible. Answer if it was possible. By default its not possible." ^false
</methods> <methods> Kernel.Change <category>checking</category>
checkWith: aConflictChecker "Add the receiver to aConflictChecker's set of potential conflicts so it can later compare related changes for conflicts. If aConflictChecker is checking against the system and the receiver conflicts with the system then also add the corresponding system version of the receiver so the checker can spot the conflict between the receiver and the system." self trivial ifFalse: [aConflictChecker changesAt: self checkingName add: self. (aConflictChecker checkSystem and: [self hasVersionInSystem and: [(self sameAsSystem: aConflictChecker) not]]) ifTrue: [aConflictChecker changesAt: self checkingName add: self systemVersion]]
</methods> <methods> Kernel.ClassDefinitionChange <category>checking</category>
addToCurrentChangeSet "Add the receiver's corresponding entry in the current ChangeSet (if it exists)." ChangeSet changeClass: self validTargetObject
</methods> <methods> Kernel.ClassDefinitionChange <category>source code</category>
browseSystemVersionIfExists "Open a browser on the system version of this change if possible. Answer if it was possible. By default its not possible." self hasVersionInSystem ifFalse: [^false]. self isSharedVariableDefinition ifTrue: [SmalltalkWorkbench browseBindingReference: self targetObject] ifFalse: [SmalltalkWorkbench browseClass: self classObject]. ^true
</methods> <methods> Kernel.OtherChange <category>checking</category>
addToCurrentChangeSet "Add the receiver's corresponding entry in the current ChangeSets (if it exists)." ChangeSet addDoIt: self text
</methods> <methods> Kernel.ClassCommentChange <category>source code</category>
browseSystemVersionIfExists "Open a browser on the system version of this change if possible. Answer if it was possible. By default its not possible." ^self hasVersionInSystem and: [SmalltalkWorkbench browseClass: self classObject. true]
</methods> <methods> Kernel.MethodChange <category>checking</category>
addToCurrentChangeSet "Add the receiver's corresponding entry in the current ChangeSet (if it exists)." self isCommentChange ifTrue: [ChangeSet changeSelector: self selector class: self validClassObject protocol: self category] ifFalse: [ChangeSet changeSelector: selector class: self validClassObject]
</methods> <methods> Kernel.MethodChange <category>source code</category>
browseSystemVersionIfExists "Open a browser on the system version of this method change if possible. Answer if it was possible." ^self hasVersionInSystem and: [MethodCollector new openListBrowserOn: (Array with: (MethodDefinition class: self classObject selector: selector)) label: (#CurrentDefinition << #labels >> 'Current Definition'). true]
</methods> <methods> Kernel.ClassOtherChange <category>checking</category>
addToCurrentChangeSet "Add the receiver's corresponding entry in the current ChangeSet (if it exists)." type == #'class initialize' ifTrue: [^self]. type == #'class inst vars for' ifTrue: [^ChangeSet changeClass: self validClassObject]. type == #'class remove' ifTrue: [^ChangeSet addClass: self validTargetObject]. type == #'class comment' ifTrue: [^ChangeSet commentClass: self validTargetObject]. type == #'class reorganize' ifTrue: [^ChangeSet reorganizeClass: self validTargetObject]. self error: (#OperationNotImplemented << #dialogs >> 'operation not implemented')
</methods> <methods> Kernel.ClassOtherChange <category>source code</category>
browseSystemVersionIfExists "Open a browser on the system version of this change if possible. Answer if it was possible. By default its not possible." self hasVersionInSystem ifFalse: [^false]. (type == #'class inst vars for' or: [type == #'class reorganize']) ifTrue: ["In olden times a class reorg would cause the browser to open in ``edit all'' mode, but the new browser doesn't support such a notion." SmalltalkWorkbench browseClass: self classObject. ^true]. ^false
</methods> <methods> Kernel.UnknownChange <category>checking</category>
addToCurrentChangeSet "Add the receiver's corresponding entry in the current ChangeSets (if it exists)." ^self
</methods> <methods> Kernel.ComponentChange <category>checking</category>
addToCurrentChangeSet "Add the receiver's corresponding entry in the current ChangeSet (if it exists)." ChangeSet current addComponentChange: self
</methods> <methods> Tools.ChangeEditor class <category>interface specs</category>
windowSpec "UIPainter new openOnClass: self andSelector: #windowSpec" <resource: #canvas> ^#(#FullSpec #window: #(#WindowSpec #label: #(#{Kernel.UserMessage} #key: #ChangeSet #defaultString: 'Change Set' #catalogID: #labels) #bounds: #(#Rectangle 413 187 770 527 ) ) #component: #(#SpecCollection #collection: #( #(#TextEditorSpec #layout: #(#LayoutFrame 0 0 0 0.333333 0 1 -50 1 ) #model: #text #callbacksSpec: #(#UIEventCallbackSubSpec #valueChangeSelector: #acceptText: ) ) #(#SequenceViewSpec #layout: #(#LayoutFrame 0 0 0 0 0 0.333333 0 0.333333 ) #model: #classList #menu: #classMenu ) #(#SequenceViewSpec #layout: #(#LayoutFrame 0 0.333333 0 0 0 0.666666 0 0.333333 ) #model: #methodList #menu: #methodMenu ) #(#SequenceViewSpec #layout: #(#LayoutFrame 0 0.666666 0 0 0 1 0 0.333333 ) #model: #destinationList ) #(#RadioButtonSpec #layout: #(#LayoutOrigin 5 0 -47 1 ) #name: #rbadd #flags: 16 #model: #changeType #label: #(#{Kernel.UserMessage} #key: #add #defaultString: 'add' #catalogID: #labels) #select: #add ) #(#RadioButtonSpec #layout: #(#LayoutOrigin 60 0 -47 1 ) #name: #rbchange #flags: 16 #model: #changeType #label: #(#{Kernel.UserMessage} #key: #change #defaultString: 'change' #catalogID: #labels) #select: #change ) #(#RadioButtonSpec #layout: #(#LayoutOrigin 134 0 -47 1 ) #name: #rbremove #flags: 16 #model: #changeType #label: #(#{Kernel.UserMessage} #key: #remove #defaultString: 'remove' #catalogID: #labels) #select: #remove ) #(#CheckBoxSpec #layout: #(#LayoutOrigin 139 0 -25 1 ) #name: #classComment #flags: 16 #model: #classComment #label: #(#{Kernel.UserMessage} #key: #comment #defaultString: 'comment' #catalogID: #labels) ) #(#CheckBoxSpec #layout: #(#LayoutOrigin 4 0 -25 1 ) #name: #classRename #flags: 48 #model: #classRename #label: #(#{Kernel.UserMessage} #key: #rename #defaultString: 'rename' #catalogID: #labels) ) #(#CheckBoxSpec #layout: #(#LayoutOrigin 71 0 -25 1 ) #name: #classRemove #flags: 48 #model: #classRemove #label: #(#{Kernel.UserMessage} #key: #remove #defaultString: 'remove' #catalogID: #labels) ) #(#CheckBoxSpec #layout: #(#LayoutOrigin 214 0 -25 1 ) #name: #classOrganize #flags: 16 #model: #classOrganize #label: #(#{Kernel.UserMessage} #key: #organize #defaultString: 'organize' #catalogID: #labels) ) ) ) )
</methods> <methods> Tools.AbstractChangeList class <category>interface specs</category>
horizontalDifferencesText "UIPainter new openOnClass: self andSelector: #horizontalDifferencesText" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #HorizontalDifferences #defaultString: 'Horizontal Differences' #catalogID: #labels) #bounds: #(#{Graphics.Rectangle} 512 288 903 768 ) ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 18 0 0 1 -2 0.5 ) #name: #textView #model: #valueHolder #menu: #textMenuHolder #tabRequiresControl: true ) #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 18 0.5 0 1 0 1 ) #name: #existingTextView #model: #existingTextAdaptor #menu: #existingTextMenuHolder #tabRequiresControl: true ) #(#{UI.ResizingSplitterSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 -2 0.5 0 1 1 0.5 ) #name: #ResizingSplitter1 #horizontal: true #minAboveSize: 30 #minBelowSize: 30 #aboveWidgets: 'textView' #belowWidgets: 'existingTextView imageLabel' ) #(#{UI.LabelSpec} #layout: #(#{Core.Point} 0 -4 ) #name: #changeLabel #label: #changeLabel #style: #small ) #(#{UI.LabelSpec} #layout: #(#{Graphics.LayoutOrigin} 0 0 0 0.491667 ) #name: #imageLabel #label: #imageLabel #style: #small ) ) ) )
standardText "UIPainter new openOnClass: self andSelector: #standardText" <resource: #canvas> ^#(#FullSpec #window: #(#WindowSpec #label: #(#{Kernel.UserMessage} #key: #StandardText #defaultString: 'Standard Text' #catalogID: #labels) #bounds: #(#Rectangle 0 0 391 480 ) ) #component: #(#SpecCollection #collection: #( #(#TextEditorSpec #layout: #(#LayoutFrame 0 0 0 0 0 1 0 1 ) #name: #textView #model: #valueHolder #menu: #textMenuHolder ) ) ) )
verticalDifferencesText "UIPainter new openOnClass: self andSelector: #verticalDifferencesText" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #VerticalDifferences #defaultString: 'Vertical Differences' #catalogID: #labels) #bounds: #(#{Graphics.Rectangle} 512 288 903 768 ) #isEventDriven: true ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 18 0 -2 0.5 0 1 ) #name: #textView #model: #valueHolder #menu: #textMenuHolder #tabRequiresControl: true ) #(#{UI.TextEditorSpec} #layout: #(#{Graphics.LayoutFrame} 1 0.5 18 0 0 1 0 1 ) #name: #existingTextView #model: #existingTextAdaptor #menu: #existingTextMenuHolder #tabRequiresControl: true ) #(#{UI.ResizingSplitterSpec} #layout: #(#{Graphics.LayoutFrame} -2 0.5 0 0 1 0.5 0 1 ) #name: #ResizingSplitter1 #horizontal: false #minAboveSize: 30 #minBelowSize: 30 #aboveWidgets: 'textView changeLabel' #belowWidgets: 'existingTextView imageLabel' ) #(#{UI.LabelSpec} #layout: #(#{Core.Point} 0 -4 ) #name: #changeLabel #label: #changeLabel #style: #small ) #(#{UI.LabelSpec} #layout: #(#{Graphics.LayoutOrigin} 0 0.5 -4 0 ) #name: #imageLabel #label: #imageLabel #style: #small ) ) ) )
</methods> <methods> Tools.OverrideList class <category>resources</category>
changeListMenu "MenuEditor new openOnClass: self andSelector: #changeListMenu" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #FileInOut #defaultString: '&File In/Out' #catalogID: #menus) #nameKey: #fileMenu #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #WriteFileDot #defaultString: '&Write File...' #catalogID: #menus) #value: #fileOut #enablementSelector: #anyToFileOut ) ) #(1 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Re_playAll #defaultString: 'Re&play All' #catalogID: #menus) #nameKey: #replayAllMenu #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #FromHere #defaultString: 'From &Here' #catalogID: #menus) #value: #doFromHere #enablementSelector: #hasSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #FromTheTop #defaultString: 'From the &Top' #catalogID: #menus) #value: #doAll #enablementSelector: #hasItemsDisplayed ) ) #(2 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RemoveAll #defaultString: 'Re&move All' #catalogID: #menus) #value: #removeAll #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_SpawnAll #defaultString: '&Spawn All' #catalogID: #menus) #value: #copyView #enablementSelector: #hasItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Re_storeMarked #defaultString: 'Re&store Marked' #catalogID: #menus) #value: #restoreAll #enablementSelector: #hasRemovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_ForgetMarked #defaultString: '&Forget Marked' #catalogID: #menus) #value: #forgetThese #enablementSelector: #hasRemovedSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #R_eplay #defaultString: 'R&eplay' #catalogID: #menus) #value: #doThis #enablementSelector: #hasSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Rem_ove #defaultString: 'Rem&ove' #catalogID: #menus) #value: #removeItem #enablementSelector: #hasUnremovedSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Res_tore #defaultString: 'Res&tore' #catalogID: #menus) #value: #restoreItem #enablementSelector: #hasRemovedSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #For_get #defaultString: 'For&get' #catalogID: #menus) #value: #forgetSelection #enablementSelector: #hasRemovedSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Spa_wn #defaultString: 'Spa&wn' #catalogID: #menus) #value: #spawnBrowserOnSelection #enablementSelector: #hasSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Conflicts #defaultString: '&Conflicts' #catalogID: #menus) #nameKey: #conflictsMenu #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Save_ConflictsAsDot #defaultString: 'Save &Conflicts As...' #catalogID: #menus) #value: #check ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SaveConflictsWith_SystemAsDot #defaultString: 'Save Conflicts with &System As...' #catalogID: #menus) #value: #checkWithSystem ) ) #(2 ) nil ) ) ) #(1 3 2 5 1 ) nil ) decodeAsLiteralArray
menuBar "Tools.MenuEditor new openOnClass: self andSelector: #menuBar" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_File #defaultString: '&File' #catalogID: #menus ) #nameKey: #file #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #DisplaySystemOverrides #defaultString: 'Display &System Overrides' #catalogID: #menus ) #value: #getOverrides ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #DisplayPar_celDot #defaultString: 'Display Par&cel...' #catalogID: #menus ) #value: #getParcel ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #DisplayPackageDot #defaultString: 'Display &Package...' #catalogID: #menus ) #nameKey: #getPackage #value: #getPackage #hidden: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #WriteFileDot #defaultString: '&Write File...' #catalogID: #menus ) #value: #fileOut #enablementSelector: #anyToFileOut ) ) #(3 1 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Replay #defaultString: '&Replay' #catalogID: #menus ) #nameKey: #replay #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Selection #defaultString: '&Selection' #catalogID: #menus ) #value: #doThis #enablementSelector: #hasSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #AllFromTheTop #defaultString: 'All from the &Top' #catalogID: #menus ) #value: #doAll #enablementSelector: #hasItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #AllFromHereDown #defaultString: 'All from here &Down' #catalogID: #menus ) #value: #doFromHere #enablementSelector: #hasSelection ) ) #(1 2 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Re_move #defaultString: 'Re&move' #catalogID: #menus ) #nameKey: #remove #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Selection #defaultString: '&Selection' #catalogID: #menus ) #value: #removeItem #enablementSelector: #hasSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #A_ll #defaultString: 'A&ll' #catalogID: #menus ) #value: #removeAll #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #AllAbove #defaultString: 'All &Above' #catalogID: #menus ) #value: #removeAllAbove #enablementSelector: #hasSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #AllBelow #defaultString: 'All &Below' #catalogID: #menus ) #value: #removeAllBelow #enablementSelector: #hasSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ExchangeRemoved #defaultString: 'E&xchange Removed' #catalogID: #menus ) #value: #exchangeRemoved #enablementSelector: #hasItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SameCodeAsSystem #defaultString: 'Same &Code as System' #catalogID: #menus ) #value: #removeSameAsSystem #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SameSourceAsSystem #defaultString: 'Same &Source as System' #catalogID: #menus ) #value: #removeSameSourceAsSystem #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #DifferentCodeToSystem #defaultString: 'Different C&ode to System' #catalogID: #menus ) #value: #removeConflictsWithSystem #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #DifferentSourceToSystem #defaultString: 'Different So&urce to System' #catalogID: #menus ) #value: #removeSourceConflictsWithSystem #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #CodeForClassesNotInSystem #defaultString: 'Code for Classes &not in System' #catalogID: #menus ) #value: #removeClassesNotInSystem #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #MethodsNotInSystem #defaultString: '&Methods not in System' #catalogID: #menus ) #value: #removeMethodsNotInSystem #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #OldVersions #defaultString: 'Old &Versions' #catalogID: #menus ) #value: #removeOldVersions #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ExactDuplicates #defaultString: 'Exact &Duplicates' #catalogID: #menus ) #value: #removeDuplicates #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Con_flicts #defaultString: 'Con&flicts' #catalogID: #menus ) #value: #removeConflictsInList #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ChangesWithTextDot #defaultString: 'Changes with &Text ...' #catalogID: #menus ) #value: #removeChangesContainingString #enablementSelector: #hasRemovedItemsDisplayed ) ) #(4 1 2 2 2 3 1 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Fo_rget #defaultString: 'Fo&rget' #catalogID: #menus ) #nameKey: #forget #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ForgetSelection #defaultString: 'Forget &Selection' #catalogID: #menus ) #value: #forgetSelection #enablementSelector: #hasRemovedSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Forget_Marked #defaultString: 'Forget &Marked' #catalogID: #menus ) #value: #forgetThese #enablementSelector: #hasRemovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ForgetAllMarked #defaultString: 'Forget &All Marked' #catalogID: #menus ) #value: #forgetAll #enablementSelector: #hasRemovedItems ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #PurgeMarked #defaultString: '&Purge Marked' #catalogID: #menus ) #nameKey: #purgeThese #value: #purgeThese #enablementSelector: #hasRemovedItems ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #PurgeSelection #defaultString: 'P&urge Selection' #catalogID: #menus ) #nameKey: #purgeSelection #value: #purgeSelection #enablementSelector: #hasRemovedSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RestoreSelection #defaultString: '&Restore Selection' #catalogID: #menus ) #value: #restoreItem #enablementSelector: #hasRemovedSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RestoreAll #defaultString: 'R&estore All' #catalogID: #menus ) #value: #restoreAll #enablementSelector: #hasRemovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RestoreChangesWithText #defaultString: 'Restore Changes with &Text' #catalogID: #menus ) #value: #restoreChangesContainingString #enablementSelector: #hasRemovedItemsDisplayed ) ) #(3 2 3 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Fi_nd #defaultString: 'Fi&nd' #catalogID: #menus ) #nameKey: #find #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Pa_rcelDot #defaultString: 'Pa&rcel ...' #catalogID: #menus ) #value: #findParcel ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #PackageDot #defaultString: 'Pac&kage...' #catalogID: #menus ) #nameKey: #findPackage #value: #findPackage #hidden: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #T_ypeDot #defaultString: 'T&ype ...' #catalogID: #menus ) #value: #findType ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ClassDot #defaultString: '&Class ...' #catalogID: #menus ) #value: #findClass ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ProtocolDot #defaultString: '&Protocol ...' #catalogID: #menus ) #value: #findProtocol ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SelectorDot #defaultString: '&Selector ...' #catalogID: #menus ) #value: #findSelector ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SpawnSelection #defaultString: 'Spa&wn Selection' #catalogID: #menus ) #value: #spawnBrowserOnSelection #enablementSelector: #hasSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Spawn_All #defaultString: 'Spawn &All' #catalogID: #menus ) #value: #copyView #enablementSelector: #hasItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SpawnOverridesWithTextDot #defaultString: 'Spawn Overrides with &Text...' #catalogID: #menus ) #value: #spawnChangesContainingString #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ClassMatching #defaultString: 'Class &Matching' #catalogID: #menus ) #nameKey: #classMatching #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #InstanceAndClass #defaultString: '&Instance and Class' #catalogID: #menus ) #nameKey: #groupClassAndMetaclass #value: #groupClassAndMetaclass #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SelectedClassOnly #defaultString: 'Selected Class &Only' #catalogID: #menus ) #nameKey: #ungroupClassAndMetaclass #value: #ungroupClassAndMetaclass #indication: true ) ) #(2 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SameParcel #defaultString: 'Same Parcel' #catalogID: #menus ) #nameKey: #filterByParcel #value: #toggleParcelFilter #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SamePackage #defaultString: 'Same Package' #catalogID: #menus ) #nameKey: #filterByPackage #value: #togglePackageFilter #indication: true #hidden: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SameType #defaultString: 'Same Type' #catalogID: #menus ) #nameKey: #filterByType #value: #toggleTypeFilter #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SameClass #defaultString: 'Same Class' #catalogID: #menus ) #nameKey: #filterByClass #value: #toggleClassFilter #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SameProtocol #defaultString: 'Same Protocol' #catalogID: #menus ) #nameKey: #filterByProtocol #value: #toggleProtocolFilter #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SameSelector #defaultString: 'Same Selector' #catalogID: #menus ) #nameKey: #filterBySelector #value: #toggleSelectorFilter #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SameOverride #defaultString: 'Same Override' #catalogID: #menus ) #nameKey: #filterBySame #value: #toggleSameFilter #indication: true ) ) #(6 3 1 7 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Show #defaultString: '&Show' #catalogID: #menus ) #nameKey: #show #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ShowCodeComponents #defaultString: 'Show C&ode Components' #catalogID: #menus ) #nameKey: #showComponent #value: #toggleShowComponent #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ShowProtocol #defaultString: 'Show &Protocol' #catalogID: #menus ) #nameKey: #showProtocol #value: #toggleShowProtocol #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ShowConflicts #defaultString: 'Show &Conflicts' #catalogID: #menus ) #nameKey: #showConflicts #value: #toggleShowConflicts #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Co_nflicts #defaultString: 'Co&nflicts' #catalogID: #menus ) #nameKey: #showConflicts #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #VerticalView #defaultString: '&Vertical View' #catalogID: #menus ) #nameKey: #viewConflictsVertically #value: #viewConflictsVertically #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #HorizontalView #defaultString: '&Horizontal View' #catalogID: #menus ) #nameKey: #viewConflictsHorizontally #value: #viewConflictsHorizontally #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SourceDifferences #defaultString: '&Source Differences' #catalogID: #menus ) #nameKey: #highlightSourceDifferences #value: #highlightSourceDifferences #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #CodeDifferences #defaultString: 'Co&de Differences' #catalogID: #menus ) #nameKey: #highlightCodeDifferences #value: #highlightCodeDifferences #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #EmphasizeInList #defaultString: '&Emphasize in List' #catalogID: #menus ) #nameKey: #toggleListEmphasis #value: #toggleListEmphasis ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #IndicateSameMethods #defaultString: '&Indicate Same Methods' #catalogID: #menus ) #nameKey: #toggleTypesIncludeSame #value: #toggleTypesIncludeSame ) ) #(2 2 2 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #LineEndTreatment #defaultString: '&Line End Treatment' #catalogID: #menus ) #nameKey: #lineEndTreatment #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #AsInFile #defaultString: '&As in File' #catalogID: #menus ) #nameKey: #lineEndsRaw #value: #lineEndsRaw #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_ConvertedToCRs #defaultString: '&Converted to CRs' #catalogID: #menus ) #nameKey: #lineEndsTreated #value: #lineEndsTreated #indication: true ) ) #(2 ) nil ) ) ) #(3 2 ) nil ) ) ) #(6 ) nil ) decodeAsLiteralArray
</methods> <methods> Tools.OverrideList class <category>interface specs</category>
windowSpec "UIPainter new openOnClass: self andSelector: #windowSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #OverrideList #defaultString: 'Override List' #catalogID: #labels) #min: #(#{Core.Point} 300 400 ) #bounds: #(#{Graphics.Rectangle} 576 364 1006 864 ) #flags: 4 #menu: #menuBar #isEventDriven: true ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.SequenceViewSpec} #properties: #(#{UI.PropertyListDictionary} #dragOkSelector #wantToDrag: #dragEnterSelector #dragEnter: #dragOverSelector #dragOver: #dragStartSelector #doDrag: #dropSelector #drop: #dragExitSelector #dragLeave: ) #layout: #(#{Graphics.LayoutFrame} 2 0 2 0 -102 1 177 0 ) #name: #listView #model: #selectionInList #callbacksSpec: #(#{UI.UIEventCallbackSubSpec} #doubleClickSelector: #toggleRemoveForListController: #requestValueChangeSelector: #changeRequest ) #menu: #changeListMenuHolder ) #(#{UI.SubCanvasSpec} #layout: #(#{Graphics.LayoutFrame} 1 0 179 0 -2 1 -2 1 ) #name: #textCanvas #flags: 0 #minorKey: #standardText ) #(#{UI.CompositeSpecCollection} #collection: #( #(#{UI.CheckBoxSpec} #layout: #(#{Core.Point} 0 0 ) #model: #parcelFilterAdaptor #label: #(#{Kernel.UserMessage} #key: #parcel #defaultString: 'parcel' #catalogID: #labels) ) #(#{UI.CheckBoxSpec} #layout: #(#{Core.Point} 0 25 ) #name: #packageFilter #flags: 32 #model: #packageFilterAdaptor #label: #(#{Kernel.UserMessage} #key: #package #defaultString: 'package' #catalogID: #labels) ) #(#{UI.CheckBoxSpec} #layout: #(#{Core.Point} 0 50 ) #model: #changeTypeFilterAdaptor #label: #(#{Kernel.UserMessage} #key: #type #defaultString: 'type' #catalogID: #labels) ) #(#{UI.CheckBoxSpec} #layout: #(#{Core.Point} 0 75 ) #model: #classNameFilterAdaptor #label: #(#{Kernel.UserMessage} #key: #class #defaultString: 'class' #catalogID: #labels) ) #(#{UI.CheckBoxSpec} #layout: #(#{Core.Point} 0 100 ) #model: #protocolFilterAdaptor #label: #(#{Kernel.UserMessage} #key: #protocol #defaultString: 'protocol' #catalogID: #labels) ) #(#{UI.CheckBoxSpec} #layout: #(#{Core.Point} 0 125 ) #model: #selectorFilterAdaptor #label: #(#{Kernel.UserMessage} #key: #selector #defaultString: 'selector' #catalogID: #labels) ) #(#{UI.CheckBoxSpec} #layout: #(#{Core.Point} 0 150 ) #model: #valuesFilterAdaptor #label: #(#{Kernel.UserMessage} #key: #same #defaultString: 'same' #catalogID: #labels) ) ) #compositeSpec: #(#{UI.CompositeSpec} #layout: #(#{Graphics.LayoutFrame} -100 1 2 0 -2 1 177 0 ) #flags: 8 ) ) ) ) )
</methods> <methods> Tools.MiniChangeSetManager class <category>interface specs</category>
windowSpec "Tools.UIPainter new openOnClass: self andSelector: #windowSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #UnlabeledCanvas #defaultString: 'Unlabeled Canvas' #catalogID: #labels) #bounds: #(#{Graphics.Rectangle} 512 384 712 584 ) ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.LabelSpec} #properties: #(#{UI.PropertyListDictionary} #labelFromApplication true ) #layout: #(#{Graphics.Rectangle} 0 -1 22 24 ) #name: #changeSetIcon #label: #changeSetIcon #hasCharacterOrientedLabel: false ) #(#{UI.InputFieldSpec} #layout: #(#{Graphics.LayoutFrame} 20 0 0 0 0 1 21 0 ) #name: #label #flags: 0 #model: #labelHolder #helpText: #(#{Kernel.UserMessage} #key: #ChangeSetLabel #defaultString: 'Change sets. Left-click to select, right-click to manage.' #catalogID: #labels) #isReadOnly: true ) ) ) )
</methods> <methods> Tools.MiniChangeSetManager class <category>resources</category>
changeSetContextMenu "Tools.MenuEditor new openOnClass: self andSelector: #changeSetContextMenu" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_NewDot #defaultString: '&New...' #catalogID: #menus) #nameKey: #createChangeSet #value: #createChangeSet ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Edit #defaultString: '&Edit' #catalogID: #menus) #nameKey: #editChangeSet #value: #editChangeSet ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Inspect #defaultString: '&Inspect' #catalogID: #menus) #nameKey: #inspectChangeSet #value: #inspectChangeSet #labelImage: #(#{UI.ResourceRetriever} #{Tools.ToolbarIconLibrary} #inspect ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_BrowseMethods #defaultString: '&Browse Methods' #catalogID: #menus) #nameKey: #browseChanges #value: #browseChanges ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_RenameDot #defaultString: '&Rename...' #catalogID: #menus) #nameKey: #renameChangeSet #value: #renameChangeSet ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Remove #defaultString: 'Remove' #catalogID: #menus) #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_ForgetChanges #defaultString: '&Forget Changes...' #catalogID: #menus) #nameKey: #forgetChanges #value: #forgetChanges ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_RemoveChangeSet #defaultString: '&Remove Change Set...' #catalogID: #menus) #nameKey: #removeChangeSet #value: #removeChangeSet #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #delete ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RemoveChangedCode1 #defaultString: 'Remove Changed Code from &System...' #catalogID: #menus) #nameKey: #removeChangesFromSystem #value: #removeChangesFromSystem ) ) #(3 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #File #defaultString: 'File' #catalogID: #menus) #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_FileInDot #defaultString: '&File In...' #catalogID: #menus) #nameKey: #fileInChanges #value: #fileInChanges #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #fileIn ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #FileInto_New #defaultString: 'File into &New...' #catalogID: #menus) #nameKey: #fileIntoNewChangeSets #value: #fileIntoNewChangeSets ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #File_Out #defaultString: 'File &Out...' #catalogID: #menus) #nameKey: #fileOutChanges #value: #fileOutChanges #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #fileSave ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #FileOut_All #defaultString: 'File out &All...' #catalogID: #menus) #nameKey: #fileOutAll #value: #fileOutAll ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Write_ImportScript #defaultString: 'Write &Import Script...' #catalogID: #menus) #nameKey: #generateImportScript #value: #generateImportScript ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Write_RemovalScript #defaultString: 'Write &Removal Script...' #catalogID: #menus) #nameKey: #generateRemovalScript #value: #generateRemovalScript ) ) #(2 2 2 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_OpenChangeSetManager #defaultString: '&Open Change Set Manager' #catalogID: #menus) #nameKey: #openChangeSetManager #value: #openChangeSetManager #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #edit ) ) ) #(1 5 1 1 ) nil ) decodeAsLiteralArray
</methods> <methods> Tools.ChangeList <category>menu messages</category>
functionsSubmenu <submenu: #(#Functions #menus 'Functions') nameKey: #functionsSubmenu menu: #(#menuBar) position: 10.075>
relocateToNameSpace <menuItem: #(#RelocateToNamespace #menus 'Relocate To Namespace') nameKey: nil menu: #(#menuBar #functionsSubmenu) position: 10.01> | nameSpaceName | nameSpaceName := Dialog request: (#RlctToWhchNmSpc << #dialogs >> 'Relocate to which name space?') initialAnswer: (#NameSpace << #labels >> 'NameSpace') asString. nameSpaceName isEmpty ifTrue: [^self]. list do: [:change| (removed includes: change) ifFalse: [change relocateTo: nameSpaceName]]. self updateList
</methods> <methods> Tools.ChangeList class <category>interface specs</category>
windowSpec "UIPainter new openOnClass: self andSelector: #windowSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #ChangeList #defaultString: 'Change List' #catalogID: #labels) #min: #(#{Core.Point} 300 400 ) #bounds: #(#{Graphics.Rectangle} 512 268 942 768 ) #flags: 4 #menu: #menuBar #isEventDriven: true ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.SequenceViewSpec} #properties: #(#{UI.PropertyListDictionary} #dragOkSelector #wantToDrag: #dragEnterSelector #dragEnter: #dragOverSelector #dragOver: #dragStartSelector #doDrag: #dropSelector #drop: #dragExitSelector #dragLeave: ) #layout: #(#{Graphics.LayoutFrame} 0 0 0 0 -100 1 150 0 ) #name: #listView #model: #selectionInList #callbacksSpec: #(#{UI.UIEventCallbackSubSpec} #doubleClickSelector: #toggleRemoveForListController: #requestValueChangeSelector: #changeRequest ) #menu: #changeListMenuHolder ) #(#{UI.CompositeSpecCollection} #collection: #( #(#{UI.CheckBoxSpec} #layout: #(#{Core.Point} 4 0 ) #model: #fileFilterAdaptor #label: #(#{Kernel.UserMessage} #key: #file #defaultString: 'file' #catalogID: #labels) ) #(#{UI.CheckBoxSpec} #layout: #(#{Core.Point} 4 25 ) #model: #changeTypeFilterAdaptor #label: #(#{Kernel.UserMessage} #key: #type #defaultString: 'type' #catalogID: #labels) ) #(#{UI.CheckBoxSpec} #layout: #(#{Core.Point} 4 50 ) #model: #classNameFilterAdaptor #label: #(#{Kernel.UserMessage} #key: #class #defaultString: 'class' #catalogID: #labels) ) #(#{UI.CheckBoxSpec} #layout: #(#{Core.Point} 4 75 ) #model: #protocolFilterAdaptor #label: #(#{Kernel.UserMessage} #key: #protocol #defaultString: 'protocol' #catalogID: #labels) ) #(#{UI.CheckBoxSpec} #layout: #(#{Core.Point} 4 100 ) #model: #selectorFilterAdaptor #label: #(#{Kernel.UserMessage} #key: #selector #defaultString: 'selector' #catalogID: #labels) ) #(#{UI.CheckBoxSpec} #layout: #(#{Core.Point} 4 125 ) #model: #valuesFilterAdaptor #label: #(#{Kernel.UserMessage} #key: #same #defaultString: 'same' #catalogID: #labels) ) ) #compositeSpec: #(#{UI.CompositeSpec} #layout: #(#{Graphics.LayoutFrame} -100 1 0 0 0 1 150 0 ) #name: #filters #flags: 8 ) ) #(#{UI.ResizingSplitterSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 150 0 0 1 153 0 ) #name: #ResizingSplitter1 #horizontal: true #minAboveSize: 150 #minBelowSize: 25 #aboveWidgets: 'listView filters' #belowWidgets: 'textCanvas' ) #(#{UI.SubCanvasSpec} #layout: #(#{Graphics.LayoutFrame} 0 0 153 0 0 1 0 1 ) #name: #textCanvas #flags: 0 #minorKey: #standardText ) ) ) )
</methods> <methods> Tools.ChangeList class <category>resources</category>
changeListMenu "Tools.MenuEditor new openOnClass: self andSelector: #changeListMenu" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #FileInOut #defaultString: '&File In/Out' #catalogID: #menus ) #nameKey: #fileMenu #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ReadFilesDot #defaultString: '&Read File(s)...' #catalogID: #menus ) #value: #fileIn ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RecoverLastChanges #defaultString: 'Recover &Last Changes' #catalogID: #menus ) #value: #recoverLast ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Display_SystemChanges #defaultString: 'Display &System Changes' #catalogID: #menus ) #value: #getChanges ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #WriteFileDot #defaultString: '&Write File...' #catalogID: #menus ) #value: #fileOut #enablementSelector: #anyToFileOut ) ) #(3 1 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Re_playAll #defaultString: 'Re&play All' #catalogID: #menus ) #nameKey: #replayAllMenu #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #FromHere #defaultString: 'From &Here' #catalogID: #menus ) #value: #doFromHere #enablementSelector: #hasSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #FromTheTop #defaultString: 'From the &Top' #catalogID: #menus ) #value: #doAll #enablementSelector: #hasItemsDisplayed ) ) #(2 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RemoveAll #defaultString: 'Re&move All' #catalogID: #menus ) #value: #removeAll #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_SpawnAll #defaultString: '&Spawn All' #catalogID: #menus ) #value: #copyView #enablementSelector: #hasItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_RestoreMarked #defaultString: '&Restore Marked' #catalogID: #menus ) #value: #restoreAll #enablementSelector: #hasRemovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_ForgetMarked #defaultString: '&Forget Marked' #catalogID: #menus ) #value: #forgetThese #enablementSelector: #hasRemovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #R_eplay #defaultString: 'R&eplay' #catalogID: #menus ) #value: #doThis #enablementSelector: #hasSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Rem_ove #defaultString: 'Rem&ove' #catalogID: #menus ) #value: #removeItem #enablementSelector: #hasUnremovedSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Res_tore #defaultString: 'Res&tore' #catalogID: #menus ) #value: #restoreItem #enablementSelector: #hasRemovedSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Forget #defaultString: '&Forget' #catalogID: #menus ) #value: #forgetSelection #enablementSelector: #hasRemovedSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Spa_wn #defaultString: 'Spa&wn' #catalogID: #menus ) #value: #spawnBrowserOnSelection #enablementSelector: #hasSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Conflicts #defaultString: '&Conflicts' #catalogID: #menus ) #nameKey: #conflictsMenu #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Save_ConflictsAsDot #defaultString: 'Save &Conflicts As...' #catalogID: #menus ) #value: #check ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SaveConflictsWith_SystemAsDot #defaultString: 'Save Conflicts with &System As...' #catalogID: #menus ) #value: #checkWithSystem ) ) #(2 ) nil ) ) ) #(1 3 2 5 1 ) nil ) decodeAsLiteralArray
menuBar "Tools.MenuEditor new openOnClass: self andSelector: #menuBar" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_File #defaultString: '&File' #catalogID: #menus ) #nameKey: #file #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ReadFilesDot #defaultString: '&Read File(s)...' #catalogID: #menus ) #value: #fileIn ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ReadDifferentSourceFromFilesDot #defaultString: 'Read Different &Source from File(s)...' #catalogID: #menus ) #value: #fileInSourceDifferences ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ReadDifferentCodeFromFilesDot #defaultString: 'Read Different &Code from File(s)...' #catalogID: #menus ) #value: #fileInDifferences ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RecoverLastChanges #defaultString: 'Recover &Last Changes' #catalogID: #menus ) #value: #recoverLast ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RecoverC_hangesDots #defaultString: 'Recover C&hanges...' #catalogID: #menus ) #value: #recover ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #DisplayS_ystemChanges #defaultString: 'Display S&ystem Changes' #catalogID: #menus ) #value: #getChanges ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #DisplayAllSystemChanges #defaultString: 'Display &All System Changes' #catalogID: #menus ) #value: #getAllChanges ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Display_ParcelDot #defaultString: 'Display &Parcel...' #catalogID: #menus ) #value: #getParcel ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #WriteFileDot #defaultString: '&Write File...' #catalogID: #menus ) #value: #fileOut #enablementSelector: #anyToFileOut ) ) #(1 2 4 1 1 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Replay #defaultString: '&Replay' #catalogID: #menus ) #nameKey: #replay #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Selection #defaultString: '&Selection' #catalogID: #menus ) #value: #doThis #enablementSelector: #hasSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #AllFromTheTop #defaultString: 'All from the &Top' #catalogID: #menus ) #value: #doAll #enablementSelector: #hasItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #AllFromHereDown #defaultString: 'All from here &Down' #catalogID: #menus ) #value: #doFromHere #enablementSelector: #hasSelection ) ) #(1 2 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Re_move #defaultString: 'Re&move' #catalogID: #menus ) #nameKey: #remove #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Selection #defaultString: '&Selection' #catalogID: #menus ) #value: #removeItem #enablementSelector: #hasSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #A_ll #defaultString: 'A&ll' #catalogID: #menus ) #value: #removeAll #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #AllAbove #defaultString: 'All &Above' #catalogID: #menus ) #value: #removeAllAbove #enablementSelector: #hasSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #AllBelow #defaultString: 'All &Below' #catalogID: #menus ) #value: #removeAllBelow #enablementSelector: #hasSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ExchangeRemoved #defaultString: 'E&xchange Removed' #catalogID: #menus ) #value: #exchangeRemoved #enablementSelector: #hasItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SameCodeAsSystem #defaultString: 'Same &Code as System' #catalogID: #menus ) #value: #removeSameAsSystem #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SameSourceAsSystem #defaultString: 'Same &Source as System' #catalogID: #menus ) #value: #removeSameSourceAsSystem #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #DifferentCodeToSystem #defaultString: 'Different C&ode to System' #catalogID: #menus ) #value: #removeConflictsWithSystem #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #DifferentSourceToSystem #defaultString: 'Different So&urce to System' #catalogID: #menus ) #value: #removeSourceConflictsWithSystem #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #CodeForClassesNotInSystem #defaultString: 'Code for Classes &not in System' #catalogID: #menus ) #value: #removeClassesNotInSystem #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #MethodsNotInSystem #defaultString: '&Methods not in System' #catalogID: #menus ) #value: #removeMethodsNotInSystem #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #OldVersions #defaultString: 'Old &Versions' #catalogID: #menus ) #value: #removeOldVersions #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ExactDuplicates #defaultString: 'Exact &Duplicates' #catalogID: #menus ) #value: #removeDuplicates #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Con_flicts #defaultString: 'Con&flicts' #catalogID: #menus ) #value: #removeConflictsInList #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ChangesWithTextDot #defaultString: 'Changes with &Text ...' #catalogID: #menus ) #value: #removeChangesContainingString #enablementSelector: #hasRemovedItemsDisplayed ) ) #(4 1 2 2 2 3 1 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #For_get #defaultString: 'For&get' #catalogID: #menus ) #nameKey: #forget #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ForgetSelection #defaultString: 'Forget &Selection' #catalogID: #menus ) #value: #forgetSelection #enablementSelector: #hasRemovedSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Forget_Marked #defaultString: 'Forget &Marked' #catalogID: #menus ) #value: #forgetThese #enablementSelector: #hasRemovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ForgetAllMarked #defaultString: 'Forget &All Marked' #catalogID: #menus ) #value: #forgetAll #enablementSelector: #hasRemovedItems ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RestoreSelection #defaultString: '&Restore Selection' #catalogID: #menus ) #value: #restoreItem #enablementSelector: #hasRemovedSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RestoreAll #defaultString: 'R&estore All' #catalogID: #menus ) #value: #restoreAll #enablementSelector: #hasRemovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RestoreChangesWithTextDot #defaultString: 'Restore Changes with &Text...' #catalogID: #menus ) #value: #restoreChangesContainingString #enablementSelector: #hasRemovedItemsDisplayed ) ) #(3 3 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Fi_nd #defaultString: 'Fi&nd' #catalogID: #menus ) #nameKey: #find #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #FileDot #defaultString: '&File ...' #catalogID: #menus ) #value: #findFile ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_TypeDot #defaultString: '&Type ...' #catalogID: #menus ) #value: #findType ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ClassDot #defaultString: '&Class ...' #catalogID: #menus ) #value: #findClass ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ProtocolDot #defaultString: '&Protocol ...' #catalogID: #menus ) #value: #findProtocol ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SelectorDot #defaultString: '&Selector ...' #catalogID: #menus ) #value: #findSelector ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SpawnSelection #defaultString: 'Spa&wn Selection' #catalogID: #menus ) #value: #spawnBrowserOnSelection #enablementSelector: #hasSelection ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Spawn_All #defaultString: 'Spawn &All' #catalogID: #menus ) #value: #copyView #enablementSelector: #hasItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SpawnChangesWithTextDot #defaultString: 'Spawn Changes with &Text ...' #catalogID: #menus ) #value: #spawnChangesContainingString #enablementSelector: #hasUnremovedItemsDisplayed ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ClassMatching #defaultString: 'Class &Matching' #catalogID: #menus ) #nameKey: #classMatching #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #InstanceAndClass #defaultString: '&Instance and Class' #catalogID: #menus ) #nameKey: #groupClassAndMetaclass #value: #groupClassAndMetaclass #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SelectedClassOnly #defaultString: 'Selected Class &Only' #catalogID: #menus ) #nameKey: #ungroupClassAndMetaclass #value: #ungroupClassAndMetaclass #indication: true ) ) #(2 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SameFile #defaultString: 'Same File' #catalogID: #menus ) #nameKey: #filterByFile #value: #toggleFileFilter #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SameType #defaultString: 'Same Type' #catalogID: #menus ) #nameKey: #filterByType #value: #toggleTypeFilter #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SameClass #defaultString: 'Same Class' #catalogID: #menus ) #nameKey: #filterByClass #value: #toggleClassFilter #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SameProtocol #defaultString: 'Same Protocol' #catalogID: #menus ) #nameKey: #filterByProtocol #value: #toggleProtocolFilter #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SameSelector #defaultString: 'Same Selector' #catalogID: #menus ) #nameKey: #filterBySelector #value: #toggleSelectorFilter #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SameChange #defaultString: 'Same Change' #catalogID: #menus ) #nameKey: #filterBySame #value: #toggleSameFilter #indication: true ) ) #(5 3 1 6 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Conflicts #defaultString: '&Conflicts' #catalogID: #menus ) #nameKey: #conflicts #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_SaveConflictsAsDot #defaultString: '&Save Conflicts As...' #catalogID: #menus ) #value: #check ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Save_ConflictsWithSystemAsDot #defaultString: 'Save &Conflicts with System As...' #catalogID: #menus ) #value: #checkWithSystem ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RemoveConflicts #defaultString: '&Remove Conflicts' #catalogID: #menus ) #value: #removeConflictsInList ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RemoveConflictsWithSystem #defaultString: 'Remove Conflicts &with System' #catalogID: #menus ) #value: #removeConflictsWithSystem ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #AddSystemConflicts #defaultString: '&Add System Conflicts' #catalogID: #menus ) #value: #addSystemConflicts ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #AddOriginalVersions #defaultString: 'Add &Original Versions' #catalogID: #menus ) #value: #addOriginals ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #AddToChangeSet #defaultString: 'A&dd to Change Set' #catalogID: #menus ) #value: #addChangesToCurrentChangeSet ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RemoveFromChangeSet #defaultString: 'Remove &from Change Set' #catalogID: #menus ) #value: #removeChangesFromCurrentChangeSet ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #BuildScriptToSystem #defaultString: '&Build Script to System' #catalogID: #menus ) #value: #spawnConvergeScriptToSystem ) ) #(2 2 2 3 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Show #defaultString: '&Show' #catalogID: #menus ) #nameKey: #show #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ShowFile #defaultString: 'Show &File' #catalogID: #menus ) #nameKey: #showFile #value: #toggleShowFile #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ShowProtocol #defaultString: 'Show &Protocol' #catalogID: #menus ) #nameKey: #showProtocol #value: #toggleShowProtocol #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #ShowConflicts #defaultString: 'Show &Conflicts' #catalogID: #menus ) #nameKey: #showConflicts #value: #toggleShowConflicts #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Co_nflicts #defaultString: 'Co&nflicts' #catalogID: #menus ) #nameKey: #showConflicts #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #VerticalView #defaultString: '&Vertical View' #catalogID: #menus ) #nameKey: #viewConflictsVertically #value: #viewConflictsVertically #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #HorizontalView #defaultString: '&Horizontal View' #catalogID: #menus ) #nameKey: #viewConflictsHorizontally #value: #viewConflictsHorizontally #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #SourceDifferences #defaultString: '&Source Differences' #catalogID: #menus ) #nameKey: #highlightSourceDifferences #value: #highlightSourceDifferences #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #CodeDifferences #defaultString: 'Co&de Differences' #catalogID: #menus ) #nameKey: #highlightCodeDifferences #value: #highlightCodeDifferences #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #EmphasizeInList #defaultString: '&Emphasize in List' #catalogID: #menus ) #nameKey: #toggleListEmphasis #value: #toggleListEmphasis ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #IndicateSameMethods #defaultString: '&Indicate Same Methods' #catalogID: #menus ) #nameKey: #toggleTypesIncludeSame #value: #toggleTypesIncludeSame ) ) #(2 2 2 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #LineEndTreatment #defaultString: '&Line End Treatment' #catalogID: #menus ) #nameKey: #lineEndTreatment #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #AsInFile #defaultString: '&As in File' #catalogID: #menus ) #nameKey: #lineEndsRaw #value: #lineEndsRaw #indication: true ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #C_onvertedToCRs #defaultString: 'C&onverted to CRs' #catalogID: #menus ) #nameKey: #lineEndsTreated #value: #lineEndsTreated #indication: true ) ) #(2 ) nil ) ) ) #(3 2 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Help #defaultString: '&Help' #catalogID: #menus ) #nameKey: #help #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_ChangeList #defaultString: '&Change List' #catalogID: #menus ) #value: #helpChangeList #shortcutKeyCharacter: #F1 #shortcutModifiers: 0 #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #help ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #C_hangesAndChangeSets #defaultString: 'C&hanges and Change Sets' #catalogID: #menus ) #value: #helpChangesAndChangeSets ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_AboutVisualWorksDot #defaultString: '&About VisualWorks...' #catalogID: #menus ) #value: #helpAbout ) ) #(2 1 ) nil ) ) ) #(8 ) nil ) decodeAsLiteralArray
</methods> <methods> Tools.ChangeSetManager class <category>interface specs</category>
windowSpec "Tools.UIPainter new openOnClass: self andSelector: #windowSpec" <resource: #canvas> ^#(#{UI.FullSpec} #window: #(#{UI.WindowSpec} #label: #(#{Kernel.UserMessage} #key: #ChangeSets #defaultString: 'Change Sets' #catalogID: #labels) #min: #(#{Core.Point} 200 100 ) #max: #(#{Core.Point} 1024 768 ) #bounds: #(#{Graphics.Rectangle} 516 372 916 732 ) #flags: 4 #menu: #menuBar #isEventDriven: true ) #component: #(#{UI.SpecCollection} #collection: #( #(#{UI.DataSetSpec} #properties: #(#{UI.PropertyListDictionary} #showHorizontalLines false #allowColumnResizing true #rowSize 22 #showVerticalLines false #allowColumnReordering false ) #layout: #(#{Graphics.LayoutFrame} 0 0 0 0 0 1 0 1 ) #name: #listModel #flags: 13 #model: #listModel #callbacksSpec: #(#{UI.UIEventCallbackSubSpec} #doubleClickSelector: #changeSetBeCurrent ) #menu: #listMenu #columns: #( #(#{UI.DataSetColumnSpec} #properties: #(#{UI.PropertyListDictionary} #allowSorting false #labelFromApplication false ) #model: #'currentChangeSetHolder isCurrent' #labelIsImage: false #width: 22 #rendererType: #Text #editorType: #None #noScroll: false ) #(#{UI.DataSetColumnSpec} #properties: #(#{UI.PropertyListDictionary} #labelFromApplication false #allowSorting false #allowResizing true ) #model: #'currentChangeSetHolder labelForNameColumn' #label: #(#{Kernel.UserMessage} #key: #Name #defaultString: 'Name' #catalogID: #labels) #labelIsImage: false #width: 200 #rendererType: #Text #editorType: #None #noScroll: false ) #(#{UI.DataSetColumnSpec} #properties: #(#{UI.PropertyListDictionary} #labelFromApplication false #allowSorting false #allowResizing true ) #model: #'currentChangeSetHolder changedClassCount' #label: #(#{Kernel.UserMessage} #key: #Classes #defaultString: 'Classes' #catalogID: #labels) #labelIsImage: false #width: 70 #rendererType: #Text #editorType: #None #type: #number #noScroll: false ) #(#{UI.DataSetColumnSpec} #properties: #(#{UI.PropertyListDictionary} #labelFromApplication false #allowSorting false #allowResizing true ) #model: #'currentChangeSetHolder changedMethodCount' #label: #(#{Kernel.UserMessage} #key: #Methods #defaultString: 'Methods' #catalogID: #labels) #labelIsImage: false #width: 70 #rendererType: #Text #editorType: #None #type: #number #noScroll: false ) ) #labelsAsButtons: true ) ) ) )
</methods> <methods> Tools.ChangeSetManager class <category>resources</category>
listMenu "Tools.MenuEditor new openOnClass: self andSelector: #listMenu" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_NewDot #defaultString: '&New...' #catalogID: #menus) #value: #newChangeSet ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Make_Current #defaultString: 'Make &Current' #catalogID: #menus) #nameKey: #changeSetBeCurrent #value: #changeSetBeCurrent #enablementSelector: #isChangeSetSelected #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #edit ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Edit #defaultString: '&Edit' #catalogID: #menus) #value: #editChangeSet #enablementSelector: #isChangeSetSelected ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Inspect #defaultString: '&Inspect' #catalogID: #menus) #value: #inspectChangeSet #enablementSelector: #isChangeSetSelected #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #inspect ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_BrowseMethods #defaultString: '&Browse Methods' #catalogID: #menus) #value: #browseChangedMethods #enablementSelector: #isChangeSetSelected ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_RenameDot #defaultString: '&Rename...' #catalogID: #menus) #value: #renameChangeSet #enablementSelector: #isChangeSetSelected ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Re_move #defaultString: 'Re&move' #catalogID: #menus) #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_ForgetChanges #defaultString: '&Forget Changes...' #catalogID: #menus) #nameKey: #emptyChangeSet #value: #emptyChangeSet #enablementSelector: #isChangeSetSelected ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Re_moveChangeSet #defaultString: 'Re&move Change Set...' #catalogID: #menus) #value: #deleteChangeSet #enablementSelector: #isChangeSetSelected #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #delete ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RemoveChangedCode #defaultString: 'Remove Changed &Code from System...' #catalogID: #menus) #value: #expungeCurrentProjectFromSystem #enablementSelector: #isChangeSetSelected ) ) #(3 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_File #defaultString: '&File' #catalogID: #menus) #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #File_In #defaultString: 'File &In...' #catalogID: #menus) #value: #fileInFrom #enablementSelector: #isChangeSetSelected #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #fileIn ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #FileInto_New #defaultString: 'File into &New...' #catalogID: #menus) #value: #importChangeSets ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #File_Out #defaultString: 'File &Out...' #catalogID: #menus) #value: #fileOutChangeSet #enablementSelector: #isChangeSetSelected #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #fileSave ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #FileOutA_ll #defaultString: 'File out A&ll...' #catalogID: #menus) #value: #fileOutAllChangeSets ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #WriteI_mportScript #defaultString: 'Write I&mport Script...' #catalogID: #menus) #value: #importScript #enablementSelector: #isChangeSetSelected ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Write_RemovalScript #defaultString: 'Write &Removal Script...' #catalogID: #menus) #value: #removeScript #enablementSelector: #isChangeSetSelected ) ) #(2 2 2 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Fi_nd #defaultString: 'Fi&nd' #catalogID: #menus) #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Class #defaultString: '&Class...' #catalogID: #menus) #value: #findClass #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #findClass ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Selector #defaultString: '&Selector...' #catalogID: #menus) #value: #findSelector #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #findSelector ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Se_ndersDot #defaultString: 'Se&nders...' #catalogID: #menus) #value: #browseSenders #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #selectorReferences ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #I_mplementors #defaultString: 'I&mplementors...' #catalogID: #menus) #value: #browseImplementors #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #selectorImplementors ) ) ) #(2 2 ) nil ) ) ) #(1 1 5 2 ) nil ) decodeAsLiteralArray
menuBar "Tools.MenuEditor new openOnClass: self andSelector: #menuBar" <resource: #menu> ^#(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_File #defaultString: '&File' #catalogID: #menus) #nameKey: #fileSubmenu #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #File_In #defaultString: 'File &In...' #catalogID: #menus) #value: #fileInFrom #enablementSelector: #isChangeSetSelected #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #fileIn ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #FileInto_New #defaultString: 'File into &New...' #catalogID: #menus) #value: #importChangeSets ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #File_Out #defaultString: 'File &Out...' #catalogID: #menus) #value: #fileOutChangeSet #enablementSelector: #isChangeSetSelected #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #fileSave ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #FileOut_All #defaultString: 'File out &All...' #catalogID: #menus) #value: #fileOutAllChangeSets ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #WriteI_mportScript #defaultString: 'Write I&mport Script...' #catalogID: #menus) #value: #importScript #enablementSelector: #isChangeSetSelected ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Write_RemovalScript #defaultString: 'Write &Removal Script...' #catalogID: #menus) #value: #removeScript #enablementSelector: #isChangeSetSelected ) ) #(2 2 2 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Set #defaultString: '&Set' #catalogID: #menus) #nameKey: #setSubmenu #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_NewDot #defaultString: '&New...' #catalogID: #menus) #value: #newChangeSet ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Make_Current #defaultString: 'Make &Current' #catalogID: #menus) #nameKey: #changeSetBeCurrent #value: #changeSetBeCurrent #enablementSelector: #isChangeSetSelected #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #edit ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Edit #defaultString: '&Edit' #catalogID: #menus) #value: #editChangeSet #enablementSelector: #isChangeSetSelected ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Inspect #defaultString: '&Inspect' #catalogID: #menus) #value: #inspectChangeSet #enablementSelector: #isChangeSetSelected #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #inspect ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_BrowseMethods #defaultString: '&Browse Methods' #catalogID: #menus) #value: #browseChangedMethods #enablementSelector: #isChangeSetSelected ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Re_nameDot #defaultString: 'Re&name...' #catalogID: #menus) #value: #renameChangeSet #enablementSelector: #isChangeSetSelected ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_ForgetChanges #defaultString: '&Forget Changes...' #catalogID: #menus) #value: #emptyChangeSet #enablementSelector: #isChangeSetSelected ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Re_moveDot #defaultString: 'Re&move...' #catalogID: #menus) #value: #deleteChangeSet #enablementSelector: #isChangeSetSelected #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #delete ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #RemoveChangedCode #defaultString: 'Remove Changed &Code from System...' #catalogID: #menus) #value: #expungeCurrentProjectFromSystem #enablementSelector: #isChangeSetSelected ) ) #(1 1 4 3 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Fi_nd #defaultString: 'Fi&nd' #catalogID: #menus) #nameKey: #findSubmenu #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Class #defaultString: '&Class...' #catalogID: #menus) #value: #findClass #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #findClass ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Selector #defaultString: '&Selector...' #catalogID: #menus) #value: #findSelector #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #findSelector ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #Se_ndersDot #defaultString: 'Se&nders...' #catalogID: #menus) #value: #browseSenders #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #selectorReferences ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #I_mplementors #defaultString: 'I&mplementors...' #catalogID: #menus) #value: #browseImplementors #labelImage: #(#{UI.ResourceRetriever} #{ToolbarIconLibrary} #selectorImplementors ) ) ) #(2 2 ) nil ) ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_Help #defaultString: '&Help' #catalogID: #menus) #nameKey: #helpSubmenu #submenu: #(#{UI.Menu} #( #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_ChangeSetManager #defaultString: '&Change Set Manager' #catalogID: #menus) #value: #helpChangeSetBrowser ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #C_hangesAndChangeSets #defaultString: 'C&hanges and Change Sets' #catalogID: #menus) #value: #helpChangesAndChangeSets ) #(#{UI.MenuItem} #rawLabel: #(#{Kernel.UserMessage} #key: #_AboutVisualWorksDot #defaultString: '&About VisualWorks...' #catalogID: #menus) #value: #helpAbout ) ) #(2 1 ) nil ) ) ) #(4 ) nil ) decodeAsLiteralArray
</methods> <methods> Tools.VisualLauncherToolDock <category>component definitions</category>
miniChangeSetManager <component: 10 class: #{Tools.MiniChangeSetManager} spec: #windowSpec> ^self newTool: Tools.MiniChangeSetManager
</methods> <methods> Tools.VisualLauncher <category>actions</category>
browseSystemOverrides <menuItem: #(#browseSystemOverrides #menus 'Browse &System Overrides') icon: nil nameKey: nil menu: #(#menuBar #system changes) position: 30.04> OverrideList new openOn: Override overrideList
changesOpenChangeList <menuItem: #(#_ChangeList #menus '&Change List') icon: nil nameKey: nil shortcutKeyCharacter: #F7 shortcutModifiers: 0 menu: #(#menuBar tools) position: 9.02> self openApplicationForClassNamed: #{ChangeList}
changesOpenChangeSets <menuItem: #(#openChangeSets #menus 'Change &Sets') icon: nil nameKey: nil shortcutKeyCharacter: #F4 shortcutModifiers: 0 menu: #(#menuBar system changes) position: 10.001> self openApplicationForClassNamed: #{ChangeSetManager}
openOverrideList <menuItem: #(#openOverrideList #menus 'Open &Override List') icon: nil nameKey: nil menu: #(#menuBar #system changes) position: 30.02> OverrideList open
</methods> "Imported Classes:" self error: 'Attempting to file-in parcel imports. Choose terminate or close' <class> <name>Override</name> <environment>Kernel</environment> <super>Core.Object</super> <private>false</private> none sources definition <imports></imports> <category>System-Overrides</category> <attributes> <package>System-Overrides</package> </attributes> </class> <class> <name>Change</name> <environment>Kernel</environment> <super>Core.Object</super> <private>false</private> none sourceCode manager name <imports></imports> <category>System-Changes</category> <attributes> <package>System-Changes</package> </attributes> </class> <class> <name>ApplicationModel</name> <environment>UI</environment> <super>UI.Model</super> <private>false</private> none builder uiSession eventHandlers savedWindowInformation <imports></imports> <category>UIBuilder-Framework</category> <attributes> <package>UIBuilder-Framework</package> </attributes> </class> <class> <name>VisualLauncherToolDock</name> <environment>Tools</environment> <super>UI.ApplicationModel</super> <private>false</private> none tools <imports></imports> <category>Tools-Misc</category> <attributes> <package>Tools-Misc</package> </attributes> </class> <class> <name>MethodChange</name> <environment>Kernel</environment> <super>Kernel.ClassRelatedChange</super> <private>false</private> none selector category <imports></imports> <category>System-Changes</category> <attributes> <package>System-Changes</package> </attributes> </class> <class> <name>ClassOtherChange</name> <environment>Kernel</environment> <super>Kernel.ClassChange</super> <private>false</private> none type otherData <imports></imports> <category>System-Changes</category> <attributes> <package>System-Changes</package> </attributes> </class> <class> <name>OtherChange</name> <environment>Kernel</environment> <super>Kernel.Change</super> <private>false</private> none text type <imports></imports> <category>System-Changes</category> <attributes> <package>System-Changes</package> </attributes> </class> <class> <name>ClassCommentChange</name> <environment>Kernel</environment> <super>Kernel.ClassOtherChange</super> <private>false</private> none <imports></imports> <category>System-Changes</category> <attributes> <package>System-Changes</package> </attributes> </class> <class> <name>ComponentChange</name> <environment>Kernel</environment> <super>Kernel.Change</super> <private>false</private> none componentType componentName <imports></imports> <category>System-Code Component Changes</category> <attributes> <package>System-Code Component Changes</package> </attributes> </class> <class> <name>ClassDefinitionChange</name> <environment>Kernel</environment> <super>Kernel.ClassChange</super> <private>false</private> none superclassName nameSpaceName classType otherParameters <imports></imports> <category>System-Changes</category> <attributes> <package>System-Changes</package> </attributes> </class> <class> <name>UnknownChange</name> <environment>Kernel</environment> <super>Kernel.OtherChange</super> <private>false</private> none <imports></imports> <category>System-Changes</category> <attributes> <package>System-Changes</package> </attributes> </class> <class> <name>VisualLauncher</name> <environment>Tools</environment> <super>UI.ApplicationModel</super> <private>false</private> none menuBar toolBar textCollector toolDock <imports></imports> <category>Tools-Misc</category> <attributes> <package>Tools-Misc</package> </attributes> </class>