I think colored pluggable lists should get into the image. I think we could use those in lots of projects, I've seen at least 3 independent implementations of it, and anyway, I really want it ;-)
And if it's too big a change to get into the image, it should be a SM package, so I can depend on it as soon as we implement depedencies...
Daniel Vainsencher
Masashi Umezawa umejava@mars.dti.ne.jp wrote:
This is a multi-part message in MIME format.
--Boundary_(ID_ypGspb+Ulcz08ltRBqgWfA) Content-type: text/plain; charset=iso-2022-jp Content-transfer-encoding: 7BIT
Hi,
----- Original Message ----- From: "Nevin Pratt" nevin@smalltalkpro.com To: squeak-dev@lists.squeakfoundation.org Sent: Tuesday, October 29, 2002 6:02 AM Subject: Diff between two change sets
Is there any way to get Squeak to show the diffs between two change sets?
Try the attached MergeBrowser. It can read two changeSets and display one merged view. First file-in 'ColoredPluggableListMorph.cs' and then 'MergeBrowser.cs'.
From the FileList, select the 'browse diff code' menu.
This tool is used daily for our project - NetMorph. Maybe useful.
Cheers,
[:masashi | ^umezawa]
--Boundary_(ID_ypGspb+Ulcz08ltRBqgWfA) Content-type: application/octet-stream; name=ColoredPluggableListMorph.cs Content-transfer-encoding: quoted-printable Content-disposition: attachment; filename=ColoredPluggableListMorph.cs
'From Squeak 3.2 of 11 July 2002 [latest update: #4917] on 7 August 2002 = at 7:24:34 pm'!=0D"Change Set: Colored PluggableListMorph=0DDate: 7 = August 2002=0DAuthor: Masashi Umezawa=0D=0DHighlight/unhighlight color = support for PluggableListMorph.=0D=0DBy setting = #getHighlightColorSelector and #getUnhighlightColorSelector, you can = customize highlight/unhighlight colors of = PluggableListMorph.=0D=0D"!=0D=0DScrollPane subclass: = #PluggableListMorph=0D instanceVariableNames: 'list selectedMorph = selection getListSelector getIndexSelector setIndexSelector = keystrokeActionSelector autoDeselect font lastKeystrokeTime = lastKeystrokes lastClickTime doubleClickSelector potentialDropMorph = getUnhighlightColorSelector getHighlightColorSelector '=0D = classVariableNames: ''=0D poolDictionaries: ''=0D category: = 'Morphic-Windows'!=0D=0D!PluggableListMorph methodsFor: 'accessing' = stamp: 'MU 6/13/2002 13:59'!=0DgetHighlightColorSelector: aSymbol=0D = getHighlightColorSelector :=3D aSymbol! !=0D=0D!PluggableListMorph = methodsFor: 'accessing' stamp: 'MU 6/13/2002 = 13:59'!=0DgetUnhighlightColorSelector: aSymbol=0D = getUnhighlightColorSelector :=3D aSymbol! !=0D=0D!PluggableListMorph = methodsFor: 'drawing' stamp: 'MU 6/13/2002 = 13:43'!=0DhighlightSelection=0D selectedMorph ifNotNil: [selectedMorph = color: self highlightSelectionColor; changed]! = !=0D=0D!PluggableListMorph methodsFor: 'drawing' stamp: 'MU 6/13/2002 = 13:43'!=0DunhighlightSelection=0D selectedMorph ifNotNil: [selectedMorph = color: self unhighlightSelectionColor; changed]! = !=0D=0D!PluggableListMorph methodsFor: 'selection' stamp: 'MU 6/13/2002 = 15:02'!=0DhighlightSelectionColor=0D ^ getHighlightColorSelector = isNil=0D ifTrue: [Color red]=0D ifFalse: [self model perform: = getHighlightColorSelector with: selection]! !=0D=0D!PluggableListMorph = methodsFor: 'selection' stamp: 'MU 6/13/2002 = 15:02'!=0DunhighlightSelectionColor=0D ^ getUnhighlightColorSelector = isNil=0D ifTrue: [Color black]=0D ifFalse: [self model perform: = getUnhighlightColorSelector with: selection]! !=0D=0DScrollPane = subclass: #PluggableListMorph=0D instanceVariableNames: 'list = selectedMorph selection getListSelector getIndexSelector = setIndexSelector keystrokeActionSelector autoDeselect font = lastKeystrokeTime lastKeystrokes lastClickTime doubleClickSelector = potentialDropMorph getHighlightColorSelector getUnhighlightColorSelector = '=0D classVariableNames: ''=0D poolDictionaries: ''=0D category: = 'Morphic-Windows'!=0D=
--Boundary_(ID_ypGspb+Ulcz08ltRBqgWfA) Content-type: application/octet-stream; name=MergeBrowser.cs Content-transfer-encoding: quoted-printable Content-disposition: attachment; filename=MergeBrowser.cs
'From Squeak3.2gamma of 15 January 2002 [latest update: #4857] on 10 = July 2002 at 6:26:15 pm'!=0D"Change Set: MergeBrowser=0DDate: 27 June = 2002=0DAuthor: Masashi Umezawa=0D=0DMerging support for = FileContentsBrowser.=0D=0DBy using FileMergeContentsBrowser, you can = easily integrate two changeSets without filing-in = them.=0D=0DFileContentsBrowser is colored, so you can quickly detect = conflicts. It can also extract conlicted parts from two changeSets and = write them to other file. =0D =0DPrerequisites: #('Colored = PluggableListMorph')=0D"!=0D=0DFileContentsBrowser subclass: = #FileMergeContentsBrowser=0D instanceVariableNames: 'otherPackage '=0D = classVariableNames: ''=0D poolDictionaries: ''=0D category: 'Tools-File = Contents Browser'!=0DFileMergeContentsBrowser class=0D = instanceVariableNames: ''!=0DObject subclass: #PseudoClass=0D = instanceVariableNames: 'name definition organization source metaClass = classDefinitionMergeStatus methodFileInStatusDict methodMergeStatusDict = isClassDefinitionFileIn isClassCommentFileIn classCommentMergeStatus = '=0D classVariableNames: ''=0D poolDictionaries: ''=0D category: = 'Tools-File Contents Browser'!=0D=0D!FileList methodsFor: 'file list = menu' stamp: 'MU 6/26/2002 17:25'!=0DitemsForFileEnding: suffix=0D | = labels lines selectors |=0D labels _ OrderedCollection new.=0D lines _ = OrderedCollection new.=0D selectors _ OrderedCollection new.=0D (suffix = =3D 'bmp') | (suffix =3D 'gif') | (suffix =3D 'jpg') | (suffix =3D = 'form') | (suffix =3D '*') | (suffix =3D 'png') ifTrue:=0D [labels = addAll: #('open image in a window' 'read image into ImageImports' 'open = image as background').=0D selectors addAll: #(openImageInWindow = importImage openAsBackground)].=0D (suffix =3D 'morph') | (suffix =3D = 'morphs') | (suffix =3D 'sp') | (suffix =3D '*') ifTrue:=0D [labels = add: 'load as morph'.=0D selectors add: #openMorphFromFile.=0D labels = add: 'load as project'.=0D selectors add: #openProjectFromFile].=0D = (suffix =3D 'mdl') ifTrue:=0D [labels add: 'load into Wonderland'.=0D = selectors add: #openModelintoAlice].=0D (suffix =3D 'extseg') | (suffix = =3D 'project') | (suffix =3D 'pr') ifTrue:=0D [labels add: 'load as = project'.=0D selectors add: #openProjectFromFile].=0D (suffix =3D 'bo') = | (suffix =3D '*') ifTrue:[=0D labels add: 'load as book'.=0D = selectors add: #openBookFromFile].=0D (suffix =3D 'mid') | (suffix =3D = '*') ifTrue:=0D [labels add: 'play midi file'.=0D selectors add: = #playMidiFile].=0D (suffix =3D 'movie') | (suffix =3D '*') ifTrue:=0D = [labels add: 'open as movie'.=0D selectors add: #openAsMovie].=0D = (suffix =3D 'st') | (suffix =3D 'cs') | (suffix =3D '*') ifTrue:=0D = [suffix =3D '*' ifTrue: [lines add: labels size].=0D labels addAll: = #('fileIn' 'file into new change set' 'browse changes' 'browse code' = 'browse diff code' 'remove line feeds' 'broadcast as update').=0D lines = add: labels size - 1.=0D selectors addAll: #(fileInSelection = fileIntoNewChangeSet browseChanges browseFile browseDiffFile = removeLinefeeds putUpdate)].=0D (suffix =3D 'swf') | (suffix =3D '*') = ifTrue:[=0D labels add:'open as Flash'.=0D selectors add: = #openAsFlash].=0D (suffix =3D 'ttf') | (suffix =3D '*') ifTrue:[=0D = labels add: 'open true type font'.=0D selectors add: #openAsTTF].=0D = (suffix =3D 'gz') | (suffix =3D '*') ifTrue:[=0D labels addAll: #('view = decompressed' 'decompress to file').=0D selectors addAll: = #(viewGZipContents saveGZipContents)].=0D (suffix =3D '3ds') | (suffix = =3D '*') ifTrue:[=0D labels add: 'Open 3DS file'.=0D selectors add: = #open3DSFile].=0D (suffix =3D 'tape') | (suffix =3D '*') ifTrue:=0D = [labels add: 'open for playback'.=0D selectors add: = #openTapeFromFile].=0D (suffix =3D 'wrl') | (suffix =3D '*') ifTrue:=0D = [labels add: 'open in Wonderland'.=0D selectors add: #openVRMLFile].=0D = (suffix =3D 'htm') | (suffix =3D 'html') ifTrue:=0D [labels add: 'open = in browser'.=0D selectors add: #openInBrowser].=0D (suffix =3D 'zip') | = (suffix =3D '*') ifTrue:=0D [labels add: 'open archive viewer'.=0D = selectors add: #openArchiveViewer].=0D (suffix =3D '*') ifTrue:=0D = [labels addAll: #('generate HTML').=0D lines add: labels size - 1.=0D = selectors addAll: #(renderFile)].=0D (suffix =3D CRDictionary = fileNameSuffix) ifTrue:=0D [labels add: 'load Genie Gesture = Dictionary'.=0D selectors add: #loadCRDictionary].=0D (suffix =3D = CRDisplayProperties fileNameSuffix) ifTrue:=0D [labels add: 'load Genie = Display Properties'.=0D selectors add: #loadCRDisplayProperties].=0D ^ = Array with: labels with: lines with: selectors! !=0D=0D!FileList = methodsFor: 'menu messages' stamp: 'MU 6/26/2002 = 17:39'!=0DbrowseDiffFile=0D=0D | aResult otherName |=0D (aResult :=3D = StandardFileMenu oldFileFrom: directory) printString.=0D otherName :=3D = (aResult directory fullNameFor: aResult name).=0D =0D = FileMergeContentsBrowser browseFile: self fullName with: otherName! = !=0D=0D=0D!FileMergeContentsBrowser methodsFor: 'accessing' stamp: = 'kuri-t 6/4/2002 15:13'!=0DotherPackage=0D otherPackage isNil ifTrue: = [otherPackage :=3D self buildOtherPackage].=0D ^ otherPackage! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'accessing' stamp: 'kuri-t = 6/4/2002 14:33'!=0DotherPackage: aValue=0D=0D otherPackage :=3D aValue! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'accessing' stamp: 'kuri-t = 6/12/2002 14:38'!=0DselectedPackage=0D | selectedPkg |=0D selectedPkg = :=3D super selectedPackage.=0D ^ selectedPkg isNil=0D ifTrue: [self = systemCategoryListIndex: 1.=0D super selectedPackage]=0D ifFalse: = [selectedPkg]! !=0D=0D!FileMergeContentsBrowser methodsFor: 'interface = opening' stamp: 'kuri-t 6/5/2002 18:41'!=0DopenBrowserOnOtherPackage=0D = self class browseFile: self otherPackage fullPackageName with: self = selectedPackage fullPackageName! !=0D=0D!FileMergeContentsBrowser = methodsFor: 'actions' stamp: 'kuri-t 6/5/2002 = 18:35'!=0DotherPackageName=0D ^self otherPackage packageName! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'actions' stamp: 'kuri-t = 6/5/2002 18:43'!=0DpackageName=0D ^self selectedPackage packageName! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'actions' stamp: 'MU = 6/25/2002 19:00'!=0Dreset=0D self packageFilename: self selectedPackage = fullPackageName otherPackageFilename: self otherPackage = fullPackageName.=0D self systemCategoryListIndex: 1.=0D self changed: = #classList.=0D ! !=0D=0D!FileMergeContentsBrowser methodsFor: 'actions' = stamp: 'kuri-t 7/2/2002 19:11'!=0DswapMessageWithOther=0D | messageName = otherClassOrMetaClass originalMessage otherMessage |=0D messageName :=3D = self selectedMessageName=0D ifNil: [^ self].=0D otherClassOrMetaClass = :=3D self otherPseudoClassOf: self selectedClassOrMetaClass.=0D = otherClassOrMetaClass isNil=0D ifFalse: [originalMessage :=3D self = selectedClassOrMetaClass sourceCode=0D at: messageName=0D = ifAbsent: [].=0D otherMessage :=3D otherClassOrMetaClass sourceCode=0D = at: messageName=0D ifAbsent: [^self inform: 'Cannot = swap!!'].=0D self selectedClassOrMetaClass sourceCode at: messageName = put: otherMessage.=0D otherClassOrMetaClass sourceCode at: messageName = put: originalMessage].=0D self changed: #contents.! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'private' stamp: 'MU = 6/21/2002 11:58'!=0DbuildOtherPackage=0D | aResult |=0D (aResult :=3D = StandardFileMenu oldFile) printString.=0D ^FilePackage fromFileNamed: = (aResult directory fullNameFor: aResult name).=0D ! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'private' stamp: 'kuri-t = 6/4/2002 19:03'!=0DotherPseudoClassOf: pseudoClass =0D ^pseudoClass = isMetaClass=0D ifTrue: [(self otherPackage classes values collect: = [:each | each metaClass]) =0D detect: [:pMetaClass | pMetaClass name = =3D pseudoClass name]=0D ifNone: []]=0D ifFalse: [self otherPackage = classes=0D at: pseudoClass name=0D ifAbsent: []]! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'private' stamp: 'MU = 6/26/2002 19:07'!=0DsharedFileDirectory=0D ^FileDirectory on: = (FileDirectory dirPathFor: self selectedPackage fullPackageName)! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'merging' stamp: 'kuri-t = 6/12/2002 16:57'!=0DmergeAll=0D self mergeClassesWithOtherPackage! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'merging' stamp: 'kuri-t = 6/18/2002 16:24'!=0DmergeClassesWithOtherPackage=0D | selectedPkg = movingKeys |=0D self okToChange=0D ifFalse: [^ self].=0D selectedPkg = :=3D self selectedPackage.=0D selectedPkg isNil=0D ifTrue: [^ self].=0D = Cursor wait=0D showWhile: [selectedPkg classes=0D do: [:theClass | = =0D | otherPseudoClass | =0D otherPseudoClass :=3D self = otherPseudoClassOf: theClass.=0D theClass mergeWith: = otherPseudoClass.=0D (otherPseudoClass notNil=0D and: = [otherPseudoClass hasChanges not])=0D ifTrue: [self otherPackage = removeClass: theClass]].=0D movingKeys :=3D self otherPackage classes = keys=0D reject: [:eachKey | selectedPkg classes includesKey: = eachKey].=0D movingKeys=0D do: [:eachKey | =0D | migrated | =0D = migrated :=3D self otherPackage classes at: eachKey.=0D = selectedPkg addClass: migrated.=0D migrated = setClassMergeStatusMigrated.=0D migrated = setAllMessagesMergeStatusMigrated.=0D self otherPackage classes = removeKey: eachKey]].=0D self classListIndex: 0.=0D self changed: = #classList! !=0D=0D!FileMergeContentsBrowser methodsFor: 'merging' = stamp: 'MU 6/21/2002 11:58'!=0DmergeMessageCategoriesWithOtherPackage=0D = | theClass otherPseudoClass |=0D self okToChange ifFalse: [^self].=0D = theClass :=3D self selectedClass.=0D theClass isNil ifTrue: [^self].=0D = otherPseudoClass :=3D self otherPseudoClassOf: theClass.=0D = otherPseudoClass isNil ifTrue: [^self].=0D Cursor wait showWhile:=0D = [theClass mergeMessages: theClass selectors with: otherPseudoClass.=0D = theClass metaClass mergeMessages: theClass metaClass selectors with: = otherPseudoClass].=0D self messageCategoryListIndex: 0.=0D self changed: = #messageCategoryList.! !=0D=0D!FileMergeContentsBrowser methodsFor: = 'merging' stamp: 'kuri-t 6/5/2002 = 17:10'!=0DmergeMessagesWithOtherPackage=0D | theClass cat = otherPseudoClass |=0D self okToChange ifFalse:[^self].=0D theClass :=3D = self selectedClassOrMetaClass.=0D theClass isNil ifTrue:[^self].=0D = otherPseudoClass :=3D self otherPseudoClassOf: theClass.=0D = otherPseudoClass isNil ifTrue: [^self].=0D cat :=3D self = selectedMessageCategoryName.=0D cat isNil ifTrue:[^self].=0D Cursor wait = showWhile:[=0D theClass mergeMessages: (theClass organization = listAtCategoryNamed: cat) with: otherPseudoClass.=0D ].=0D self = messageListIndex: 0.=0D self changed: #messageList.! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'menus' stamp: 'MU = 6/26/2002 16:06'!=0DclassListMenu: aMenu=0D=0D ^ aMenu =0D = labels:=0D'definition=0Dcomment=0Dbrowse full (b)=0Dclass refs = (N)=0DfileIn=0DfileInOther=0DfileInDefinition=0DfileInOtherDefinition=0Df= ileInComment=0DfileInOtherComment=0DfileOut=0Drename...=0Dremove=0Dmerge = with other...'=0D lines: #(2 4 10 11 13)=0D selections: #(editClass = editComment browseMethodFull browseClassRefs fileInClass = fileInOtherClass fileInClassDefinition fileInOtherClassDefinition = fileInClassComment fileInOtherClassComment fileOutClass renameClass = removeClass mergeMessageCategoriesWithOtherPackage)! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'menus' stamp: 'kuri-t = 6/5/2002 17:10'!=0DmessageCategoryMenu: aMenu=0D=0D ^ aMenu =0D = labels:=0D'fileIn=0DfileOut=0Dreorganize=0Dadd = item...=0Drename...=0Dremove=0Dmerge with other...'=0D lines: #(2 3 = 6)=0D selections: #(fileInMessageCategories fileOutMessageCategories = editMessageCategories addCategory renameCategory removeMessageCategory = mergeMessagesWithOtherPackage)! !=0D=0D!FileMergeContentsBrowser = methodsFor: 'menus' stamp: 'MU 6/21/2002 16:27'!=0DmessageListMenu: = aMenu=0D=0D ^ aMenu =0D = labels:=0D'fileIn=0DfileInOther=0DfileOut=0DfileOutOther=0Dswap=0Dsenders= (n)=0Dimplementors (m)=0Dmethod inheritance (h)=0Dremove'=0D lines: = #(4 5)=0D selections: #(fileInMessage fileInOtherMessage fileOutMessage = fileOutOtherMessage swapMessageWithOther=0DbrowseSenders = browseImplementors methodHierarchy =0DremoveMessage).! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'menus' stamp: 'MU = 6/26/2002 17:00'!=0DpackageListMenu: aMenu=0D ^ aMenu =0D = labels:=0D'find class... (f)=0Dmerge with other...=0Dreset=0Dopen = other...=0DfileIn=0DfileIn not conflicted=0Dfile into new = changeset=0Dfile into new changeset not conflicted=0DfileOut=0DfileOut = conflicted only=0DfileOut not conflicted=0D'=0D lines: #(1 4 8)=0D = selections: #(findClass mergeClassesWithOtherPackage reset = openBrowserOnOtherPackage fileInPackage fileInNotConflicted = fileIntoNewChangeSet fileIntoNewChangeSetNotConflicted fileOutPackage = fileOutConflicted fileOutNotConflicted )! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'infoView' stamp: 'MU = 6/26/2002 17:42'!=0DextraInfo=0D ^ (self=0D methodDiffFor: (self = selectedClassOrMetaClass sourceCodeAt: self selectedMessageName)=0D = class: self selectedClass=0D selector: self selectedMessageName=0D = meta: self metaClassIndicated) asText unembellished=0D ifTrue: [' - = identical']=0D ifFalse: [' - #CONFLICTED#']! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'infoView' stamp: 'mu = 7/4/2002 12:33'!=0DinfoViewContents=0D | theClass |=0D editSelection = =3D=3D #newClass=0D ifTrue: [^ self packageInfo: self = selectedPackage].=0D self selectedClass isNil=0D ifTrue: [^ ''].=0D = theClass :=3D self otherPseudoClassOf: self selectedClass.=0D = editSelection =3D=3D #editClass=0D ifTrue: [self = selectedClassOrMetaClass mergeStatus =3D=3D #original ifTrue: [^'Class = exists original package'].=0D self selectedClassOrMetaClass = mergeStatus =3D=3D #migrated ifTrue: [^'Class was migrated from the = other package'].=0D self selectedClassOrMetaClass mergeStatus =3D=3D = #conflicted ifTrue: [^'#CONFLICTS# in the class or methods'].].=0D = editSelection =3D=3D #editMessage=0D ifFalse: [^ ''].=0D (theClass = notNil=0D and: [self classMessagesIndicated])=0D ifTrue: [theClass = :=3D theClass metaClass].=0D ^ (theClass notNil=0D and: [theClass = includesSelector: self selectedMessageName])=0D ifTrue: ['Method also = exists in the other package' , self extraInfo]=0D ifFalse: [(self = selectedClassOrMetaClass methodMergeStatusAt: self = selectedMessageName)=0D =3D=3D #migrated=0D ifTrue: ['Method was = migrated from the other package']=0D ifFalse: ['Method exists in = original package']]! !=0D=0D!FileMergeContentsBrowser methodsFor: = 'infoView' stamp: 'kuri-t 6/4/2002 16:16'!=0DpackageInfo: p=0D | = nClasses newClasses oldClasses |=0D p isNil ifTrue:[^''].=0D nClasses = :=3D newClasses :=3D oldClasses :=3D 0.=0D p classes do:[:cls|=0D = nClasses :=3D nClasses + 1.=0D ((self otherPseudoClassOf: cls) = notNil)=0D ifTrue:[oldClasses :=3D oldClasses + 1]=0D = ifFalse:[newClasses :=3D newClasses + 1]].=0D ^nClasses printString,' = classes (', newClasses printString, ' new / ', oldClasses printString, ' = modified)'! !=0D=0D!FileMergeContentsBrowser methodsFor: 'diffs' stamp: = 'MU 6/26/2002 17:44'!=0DmethodDiffFor: aString class: aPseudoClass = selector: selector meta: meta =0D "Answer the diff between the current = copy of the given class/selector/meta for the string provided"=0D=0D | = theClass source |=0D theClass :=3D self otherPseudoClassOf: = aPseudoClass.=0D theClass isNil ifTrue: [^aString copy].=0D meta=0D = ifTrue: [theClass :=3D theClass metaClass].=0D (theClass = includesSelector: selector)=0D ifFalse: [^ aString copy].=0D source = :=3D theClass sourceCodeAt: selector.=0D ^ Cursor wait=0D showWhile: = [TextDiffBuilder buildDisplayPatchFrom: source to: aString inClass: = theClass prettyDiffs: self showingPrettyDiffs]! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'diffs' stamp: 'kuri-t = 7/2/2002 18:51'!=0DmodifiedClassDefinition=0D | pClass old new diff = oClass |=0D pClass :=3D self selectedClassOrMetaClass.=0D pClass isNil = ifTrue: [^ nil].=0D pClass hasDefinition ifFalse:[^pClass = definition].=0D oClass :=3D self otherPseudoClassOf: self = selectedClass.=0D oClass isNil ifTrue:[^pClass definition].=0D self = metaClassIndicated ifTrue:[ oClass :=3D oClass metaClass].=0D old :=3D = oClass hasDefinition ifTrue: [oClass definition] ifFalse:[^pClass = definition].=0D new :=3D pClass definition.=0D Cursor wait = showWhile:[=0D diff :=3D ClassDiffBuilder buildDisplayPatchFrom: old = to: new=0D ].=0D ^diff! !=0D=0D!FileMergeContentsBrowser methodsFor: = 'other' stamp: 'kuri-t 6/4/2002 16:31'!=0DlabelString=0D "Answer the = string for the window title"=0D=0D ^ self class name, ': ', (self = selectedSystemCategoryName ifNil: ['']), '/', self otherPackage = packageName! !=0D=0D!FileMergeContentsBrowser methodsFor: = 'initialize-release' stamp: 'mu 7/4/2002 16:11'!=0DhighlightClassList: = list with: morphList=0D list=0D with: morphList=0D do: [:item :morph | = | cls | cls :=3D (self selectedPackage classAt: item).=0D self = classMessagesIndicated ifTrue: [cls :=3D cls metaClass].=0D cls = mergeStatus =3D=3D #conflicted ifTrue: [morph color: self class = conflictedColor].=0D cls mergeStatus =3D=3D #migrated ifTrue: [morph = color: self class migratedColor].=0D cls mergeStatus =3D=3D #original = ifTrue: [morph color: self class originalColor]]! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'initialize-release' stamp: = 'kuri-t 6/13/2002 15:24'!=0DhighlightMessageList: list with: = morphList=0D | selClass |=0D selClass :=3D self selectedClass.=0D self = classMessagesIndicated ifTrue: [selClass :=3D selClass metaClass].=0D = list=0D with: morphList=0D do: [:item :morph | | methodStatus | = methodStatus :=3D selClass methodMergeStatusAt: item. =0D = methodStatus =3D=3D #conflicted ifTrue: [morph color: self class = conflictedColor].=0D methodStatus =3D=3D #migrated ifTrue: [morph = color: self class migratedColor].=0D methodStatus =3D=3D #original = ifTrue: [morph color: self class originalColor]]! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'initialize-release' stamp: = 'kuri-t 6/7/2002 14:05'!=0DpackageFilename: aFilename = otherPackageFilename: otherFilename =0D | packageDict organizer package = |=0D packageDict :=3D Dictionary new.=0D organizer :=3D SystemOrganizer = defaultList: Array new.=0D package :=3D FilePackage fromFileNamed: = aFilename.=0D otherPackage :=3D FilePackage fromFileNamed: = otherFilename.=0D packageDict at: package packageName put: package.=0D = organizer classifyAll: package classes keys under: package = packageName.=0D self systemOrganizer: organizer.=0D self packages: = packageDict.=0D self otherPackage: otherPackage! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'view creation' stamp: = 'kuri-t 6/13/2002 15:02'!=0DbuildMorphicClassList=0D | morph |=0D morph = :=3D super buildMorphicClassList.=0D morph getUnhighlightColorSelector: = #classMergeStatusColor:.=0D ^morph! !=0D=0D!FileMergeContentsBrowser = methodsFor: 'view creation' stamp: 'kuri-t 6/13/2002 = 15:02'!=0DbuildMorphicMessageList=0D | messageListMorph |=0D = messageListMorph :=3D PluggableListMorph=0D on: self=0D list: = #messageList=0D selected: #messageListIndex=0D changeSelected: = #messageListIndex:=0D menu: #messageListMenu:=0D keystroke: = #messageListKey:from:.=0D messageListMorph setProperty: = #highlightSelector toValue: #highlightMessageList:with:.=0D = messageListMorph getUnhighlightColorSelector: = #messageMergeStatusColor:.=0D ^ messageListMorph! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'view creation' stamp: = 'kuri-t 6/13/2002 16:32'!=0DclassMergeStatusColor: selection=0D | status = selClass |=0D selClass :=3D self selectedPackage classAt: selection = ifAbsent: [].=0D selClass isNil ifTrue: [^self class originalColor].=0D = self classMessagesIndicated ifTrue: [selClass :=3D selClass = metaClass].=0D status :=3D selClass mergeStatus.=0D status =3D=3D = #conflicted ifTrue:[^self class conflictedColor].=0D status =3D=3D = #migrated ifTrue:[^self class migratedColor].=0D ^self class = originalColor! !=0D=0D!FileMergeContentsBrowser methodsFor: 'view = creation' stamp: 'kuri-t 6/13/2002 15:27'!=0DmessageMergeStatusColor: = selection=0D | status selClass |=0D self selectedClassName isNil ifTrue: = [^self class originalColor].=0D selClass :=3D self selectedPackage = classAt: self selectedClassName.=0D self classMessagesIndicated ifTrue: = [selClass :=3D selClass metaClass].=0D status :=3D selClass = methodMergeStatusAt: selection.=0D status =3D=3D #conflicted = ifTrue:[^self class conflictedColor].=0D status =3D=3D #migrated = ifTrue:[^self class migratedColor].=0D ^self class originalColor! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'view creation' stamp: 'MU = 6/21/2002 12:00'!=0DopenAsMorph=0D "Create a pluggable version of all = the views for a Browser, including views and controllers."=0D | window = aListExtent next mySingletonList |=0D window :=3D (SystemWindow = labelled: 'later') model: self.=0D self packages size =3D 1=0D ifTrue: = [=0D aListExtent :=3D 0.333333 @ 0.34.=0D self = systemCategoryListIndex: 1.=0D mySingletonList :=3D PluggableListMorph = on: self list: #systemCategorySingleton=0D selected: #indexIsOne = changeSelected: #indexIsOne:=0D menu: #packageListMenu:=0D = keystroke: #packageListKey:from:.=0D mySingletonList = hideScrollBarIndefinitely.=0D window addMorph: mySingletonList frame: = (0@0 extent: 1.0@0.06).=0D next :=3D 0@0.06]=0D ifFalse: [=0D = aListExtent :=3D 0.25 @ 0.4.=0D window addMorph: (PluggableListMorph = on: self list: #systemCategoryList=0D selected: = #systemCategoryListIndex changeSelected: #systemCategoryListIndex:=0D = menu: #packageListMenu:=0D keystroke: #packageListKey:from:)=0D = frame: (0@0 extent: aListExtent).=0D next :=3D aListExtent x @ = 0].=0D=0D self addClassAndSwitchesTo: window at: (next extent: = aListExtent) plus: 0.=0D=0D next :=3D next + (aListExtent x @ 0).=0D = window addMorph: (PluggableListMorph on: self list: = #messageCategoryList=0D selected: #messageCategoryListIndex = changeSelected: #messageCategoryListIndex:=0D menu: = #messageCategoryMenu:)=0D frame: (next extent: aListExtent).=0D next = :=3D next + (aListExtent x @ 0).=0D =0D window addMorph: self = buildMorphicMessageList=0D frame: (next extent: aListExtent).=0D=0D = self addLowerPanesTo: window at: (0@0.4 corner: 1@1) with: nil.=0D ^ = window=0D! !=0D=0D!FileMergeContentsBrowser methodsFor: 'fileIn/fileOut' = stamp: 'MU 6/26/2002 17:08'!=0DfileInClass=0D super fileInClass.=0D self = changed: #classList! !=0D=0D!FileMergeContentsBrowser methodsFor: = 'fileIn/fileOut' stamp: 'MU 6/26/2002 17:06'!=0DfileInClassComment=0D = Cursor read showWhile:[=0D self selectedClass fileInComment.=0D ].=0D = self changed: #classList! !=0D=0D!FileMergeContentsBrowser methodsFor: = 'fileIn/fileOut' stamp: 'MU 6/26/2002 17:06'!=0DfileInClassDefinition=0D = Cursor read showWhile:[=0D self selectedClass fileInDefinition.=0D = ].=0D self changed: #classList! !=0D=0D!FileMergeContentsBrowser = methodsFor: 'fileIn/fileOut' stamp: 'kuri-t 7/2/2002 = 18:26'!=0DfileInNotConflicted=0D Cursor read showWhile:[=0D self = selectedPackage fileInNotConflicted.=0D ].=0D self changed: #classList! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'fileIn/fileOut' stamp: 'MU = 6/26/2002 17:06'!=0DfileInOtherClass=0D Cursor read showWhile:[ | = otherClass |=0D otherClass :=3D self otherPseudoClassOf: self = selectedClass.=0D otherClass isNil ifFalse: [otherClass fileIn].=0D = ].=0D self changed: #classList! !=0D=0D!FileMergeContentsBrowser = methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 = 17:06'!=0DfileInOtherClassComment=0D Cursor read showWhile:[ | = otherClass |=0D otherClass :=3D self otherPseudoClassOf: self = selectedClass.=0D otherClass isNil ifFalse: [otherClass = fileInComment].=0D ].=0D self changed: #classList! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'fileIn/fileOut' stamp: 'MU = 6/26/2002 17:06'!=0DfileInOtherClassDefinition=0D Cursor read = showWhile:[ | otherClass |=0D otherClass :=3D self otherPseudoClassOf: = self selectedClass.=0D otherClass isNil ifFalse: [otherClass = fileInDefinitionOnly].=0D ].=0D self changed: #classList! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'fileIn/fileOut' stamp: 'MU = 6/21/2002 16:24'!=0DfileInOtherMessage=0D | otherClassOrMetaClass |=0D = self selectedMessageName=0D ifNil: [^ self].=0D Cursor read=0D = showWhile: [otherClassOrMetaClass :=3D self otherPseudoClassOf: self = selectedClassOrMetaClass.=0D otherClassOrMetaClass isNil=0D = ifFalse: [otherClassOrMetaClass fileInMethod: self = selectedMessageName]]! !=0D=0D!FileMergeContentsBrowser methodsFor: = 'fileIn/fileOut' stamp: 'MU 6/25/2002 19:02'!=0DfileInPackage=0D super = fileInPackage.=0D self changed: #classList! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'fileIn/fileOut' stamp: 'MU = 6/26/2002 17:10'!=0DfileIntoNewChangeSetNotConflicted=0D=0D | package = changeSet |=0D (package :=3D self selectedPackage) ifNil: [^ self = beep].=0D changeSet :=3D ChangeSorter newChangeSet: package = packageName.=0D Smalltalk newChanges: changeSet.=0D self = fileInPackageNotConflicted=0D ! !=0D=0D!FileMergeContentsBrowser = methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 = 18:27'!=0DfileOutConflicted=0D Cursor write=0D showWhile: [| fileStream = | =0D fileStream :=3D self sharedFileDirectory forceNewFileNamed: self = selectedPackage shortPackageName , ' x ' , self otherPackage = shortPackageName , ' Conflicts.cs'.=0D self selectedPackage = fileOutConflictedOn: fileStream.=0D fileStream cr; cr.=0D self = otherPackage fileOutConflictedOn: fileStream]! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'fileIn/fileOut' stamp: 'MU = 6/26/2002 19:24'!=0DfileOutMessage=0D self selectedMessageName=0D = ifNil: [^ self].=0D Cursor write=0D showWhile: [| fileStream | =0D = fileStream :=3D self sharedFileDirectory forceNewFileNamed: self = selectedMessageName , '.st'.=0D self selectedClassOrMetaClass=0D = fileOutMethods: (Array with: self selectedMessageName)=0D on: = fileStream]! !=0D=0D!FileMergeContentsBrowser methodsFor: = 'fileIn/fileOut' stamp: 'MU 6/26/2002 18:27'!=0DfileOutNotConflicted=0D = Cursor write=0D showWhile: [| fileStream | =0D fileStream :=3D self = sharedFileDirectory forceNewFileNamed: self selectedPackage = shortPackageName , ' x ' , self otherPackage shortPackageName , ' = NotConflicts.cs'.=0D self selectedPackage fileOutNotConflictedOn: = fileStream.=0D fileStream cr; cr.=0D self otherPackage = fileOutNotConflictedOn: fileStream]! !=0D=0D!FileMergeContentsBrowser = methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 = 19:20'!=0DfileOutOtherMessage=0D | otherClassOrMetaClass |=0D self = selectedMessageName=0D ifNil: [^ self].=0D Cursor write=0D showWhile: = [otherClassOrMetaClass :=3D self otherPseudoClassOf: self = selectedClassOrMetaClass.=0D otherClassOrMetaClass isNil=0D = ifFalse: [| fileStream | =0D fileStream :=3D self = sharedFileDirectory forceNewFileNamed: self selectedMessageName , ' = Other.st'.=0D otherClassOrMetaClass=0D fileOutMethods: (Array = with: self selectedMessageName)=0D on: fileStream]]! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'class list' stamp: 'MU = 6/25/2002 18:59'!=0DclassList=0D | originalList selectedPkg clsList |=0D = originalList :=3D super classList.=0D selectedPkg :=3D self = selectedPackage.=0D clsList :=3D originalList=0D collect: [:each | = (selectedPkg classAt: each) isClassDefinitionFileIn=0D ifTrue: = [each asText addAttribute: TextEmphasis struckOut]=0D ifFalse: = [each]].=0D clsList :=3D clsList=0D collect: [:each | (selectedPkg = classAt: each) isClassCommentFileIn=0D ifTrue: [each asText = addAttribute: TextEmphasis italic]=0D ifFalse: [each]].=0D ^ = clsList! !=0D=0D!FileMergeContentsBrowser methodsFor: 'code pane' stamp: = 'MU 6/25/2002 19:32'!=0Dcontents=0D | cont |=0D cont :=3D super = contents.=0D editSelection =3D=3D #editComment=0D ifTrue: [| theClass = comment otherClass otherClassComment | =0D (theClass :=3D self = selectedClass)=0D ifNil: [^ ''].=0D comment :=3D theClass = comment.=0D otherClass :=3D self otherPseudoClassOf: theClass.=0D = otherClassComment :=3D otherClass isNil=0D ifTrue: [^ comment]=0D = ifFalse: [otherClass comment].=0D cont :=3D (TextDiffBuilder from: = otherClassComment to: comment) buildDisplayPatch].=0D ^ cont! = !=0D=0D!FileMergeContentsBrowser methodsFor: 'message list' stamp: 'MU = 6/25/2002 19:12'!=0DmessageList=0D | msgList selectedClassOrMetaClass = originalList |=0D originalList :=3D super messageList.=0D self = selectedClass isNil ifTrue: [^originalList].=0D selectedClassOrMetaClass = :=3D self selectedClassOrMetaClass.=0D msgList :=3D originalList=0D = collect: [:sele | (selectedClassOrMetaClass methodFileInStatusAt: = sele)=0D ifTrue: [sele asText addAttribute: TextEmphasis = struckOut;=0D addAttribute: TextEmphasis italic;=0D = yourself]=0D ifFalse: [sele]].=0D ^ msgList! = !=0D=0D=0D!FileMergeContentsBrowser class methodsFor: 'instance = creation' stamp: 'MU 7/3/2002 16:28'!=0DbrowseFile: aFilename with: = otherFilename =0D | browser |=0D Cursor wait=0D showWhile: [browser = :=3D self new packageFilename: aFilename otherPackageFilename: = otherFilename.=0D self openBrowserView: browser createViews label: = self name , ': ' , browser packageName , '/' , browser = otherPackageName.=0D browser mergeAll]! = !=0D=0D!FileMergeContentsBrowser class methodsFor: 'instance creation' = stamp: 'kuri-t 6/12/2002 14:39'!=0DfileNamed: aFilename with: = otherFilename =0D ^self new packageFilename: aFilename = otherPackageFilename: otherFilename.! !=0D=0D!FileMergeContentsBrowser = class methodsFor: 'window color' stamp: 'kuri-t 6/7/2002 = 13:57'!=0DwindowColorSpecification=0D "Answer a WindowColorSpec object = that declares my preference"=0D ^ WindowColorSpec=0D classSymbol: self = name=0D wording: 'File Merge Contents Browser'=0D brightColor: = (Color=0D r: 0.977=0D g: 0.963=0D b: 0.923)=0D pastelColor: = #paleTan=0D helpMessage: 'Lets you view the contents of a file as code, = in a browser-like tool.'! !=0D=0D!FileMergeContentsBrowser class = methodsFor: 'constants' stamp: 'kuri-t 6/13/2002 = 15:10'!=0DconflictedColor=0D ^Color magenta! = !=0D=0D!FileMergeContentsBrowser class methodsFor: 'constants' stamp: = 'kuri-t 6/13/2002 14:36'!=0DmigratedColor=0D ^Color blue! = !=0D=0D!FileMergeContentsBrowser class methodsFor: 'constants' stamp: = 'kuri-t 6/13/2002 14:36'!=0DoriginalColor=0D ^Color black! = !=0D=0D=0D!FilePackage methodsFor: 'accessing' stamp: 'kuri-t 6/13/2002 = 16:31'!=0DclassAt: className ifAbsent: aBlock=0D ^self classes at: = className ifAbsent: aBlock! !=0D=0D!FilePackage methodsFor: 'accessing' = stamp: 'MU 6/26/2002 15:52'!=0DshortPackageName=0D ^FileDirectory = baseNameFor: self packageName=0D=0D=0D! !=0D=0D!FilePackage methodsFor: = 'fileIn/fileOut' stamp: 'MU 6/26/2002 16:59'!=0DfileInNotConflicted=0D | = doitsMark |=0D doitsMark :=3D 1.=0D doIts isEmpty ifFalse: [doitsMark = :=3D self askForDoits].=0D doitsMark =3D 4 ifTrue: [^ nil].=0D doitsMark = =3D 2 ifTrue: [self fileInDoits].=0D self superclassOrder=0D do: [:cls = | cls hasDefinition=0D ifTrue: [cls = fileInDefinitionOnlyNotConflicted]].=0D classes=0D do: [:cls | =0D = cls hasComment=0D ifTrue: [cls fileInCommentNotConflicted].=0D cls = fileInMethodsNotConflicted.=0D cls hasMetaclass=0D ifTrue: [cls = metaClass fileInNotConflicted]].=0D doitsMark =3D 3 ifTrue: [self = fileInDoits]! !=0D=0D!FilePackage methodsFor: 'fileIn/fileOut' stamp: = 'MU 6/26/2002 17:01'!=0DfileOutConflicted=0D | fileName stream |=0D = fileName :=3D FillInTheBlank request: 'Enter the file name' = initialAnswer:''.=0D stream :=3D FileStream newFileNamed: fileName.=0D = self fileOutConflictedOn: stream! !=0D=0D!FilePackage methodsFor: = 'fileIn/fileOut' stamp: 'MU 6/26/2002 17:01'!=0DfileOutConflictedOn: = aStream=0D self superclassOrder do:[:each | each fileOutConflictedOn: = aStream].=0D ! !=0D=0D!FilePackage methodsFor: 'fileIn/fileOut' stamp: = 'MU 6/26/2002 17:03'!=0DfileOutNotConflicted=0D | fileName stream |=0D = fileName :=3D FillInTheBlank request: 'Enter the file name' = initialAnswer:''.=0D stream :=3D FileStream newFileNamed: fileName.=0D = self fileOutNotConflictedOn: stream! !=0D=0D!FilePackage methodsFor: = 'fileIn/fileOut' stamp: 'MU 6/26/2002 17:01'!=0DfileOutNotConflictedOn: = aStream=0D self superclassOrder do:[:each | each fileOutNotConflictedOn: = aStream].=0D ! !=0D=0D!FilePackage methodsFor: 'actions' stamp: 'kuri-t = 6/18/2002 16:24'!=0DaddClass: aClass=0D self classes at: aClass name = put: aClass.=0D classOrder add: aClass.! !=0D=0D!FilePackage methodsFor: = 'superclass ordering' stamp: 'MU 6/21/2002 = 12:31'!=0DallSuperPseudoClassNamesOf: aPseudoClass =0D | pseudoCls = isMeta allSuperClassNames completed allClasses |=0D pseudoCls :=3D = aPseudoClass.=0D isMeta :=3D aPseudoClass isMetaClass.=0D = allSuperClassNames :=3D OrderedCollection new.=0D completed :=3D = false.=0D allClasses :=3D classes values.=0D [completed]=0D whileFalse: = [| superCls | =0D superCls :=3D allClasses=0D detect: [:each | = each name =3D pseudoCls parsedSuperPseudoClassName]=0D ifNone: = [].=0D superCls isNil=0D ifTrue: [completed :=3D true]=0D = ifFalse: [allSuperClassNames addFirst: superCls name.=0D pseudoCls = :=3D superCls]].=0D isMeta=0D ifTrue: [allSuperClassNames addFirst: = #'Object class']=0D ifFalse: [allSuperClassNames addFirst: #Object].=0D = ^ allSuperClassNames! !=0D=0D!FilePackage methodsFor: 'superclass = ordering' stamp: 'MU 6/21/2002 12:31'!=0DallSuperPseudoClassesOf: = aPseudoClass =0D | names allClasses allSuperClasses |=0D names :=3D self = allSuperPseudoClassNamesOf: aPseudoClass.=0D allClasses :=3D classes = values.=0D allSuperClasses :=3D OrderedCollection new.=0D names =0D do: = [:eachName | =0D | superClass | =0D (eachName =3D 'Object' or: = [eachName =3D 'Object class'])=0D ifTrue: [allSuperClasses=0D = add: (PseudoClass new name: eachName)].=0D superClass :=3D = allClasses=0D detect: [:cls | cls name =3D eachName]=0D = ifNone: [].=0D superClass isNil=0D ifFalse: [allSuperClasses add: = superClass]].=0D ^ allSuperClasses! !=0D=0D!FilePackage methodsFor: = 'superclass ordering' stamp: 'MU 6/21/2002 12:30'!=0DdoWeFileOut: aClass = given: aSet cache: cache =0D "Weird but copied from ChangeSet"=0D | = aClassAllSuperclasses aClassSoleInstanceAllSuperclasses |=0D = aClassAllSuperclasses :=3D cache=0D at: aClass=0D ifAbsent: [cache = at: aClass put: (self allSuperPseudoClassesOf: aClass) asArray].=0D = (aSet includesAnyOf: aClassAllSuperclasses)=0D ifTrue: [^ false].=0D = aClass isMetaClass=0D ifFalse: [^ true].=0D (aSet=0D includes: (self = soleInstanceOf: aClass))=0D ifTrue: [^ false].=0D = aClassSoleInstanceAllSuperclasses :=3D cache=0D at: (self = soleInstanceOf: aClass)=0D ifAbsent: [cache at: aClass soleInstance = put: (self=0D allSuperPseudoClassesOf: (self soleInstanceOf: = aClass)) asArray].=0D (aSet includesAnyOf: = aClassSoleInstanceAllSuperclasses)=0D ifTrue: [^ false].=0D ^ true! = !=0D=0D!FilePackage methodsFor: 'superclass ordering' stamp: 'MU = 6/21/2002 12:31'!=0DsoleInstanceOf: aPseudoClass =0D ^ classes values=0D = detect: [:each | each name =3D aPseudoClass soleInstanceName]=0D = ifNone: []! !=0D=0D!FilePackage methodsFor: 'superclass ordering' stamp: = 'MU 6/25/2002 17:15'!=0DsuperclassOrder=0D ^self superclassOrder: = classes values! !=0D=0D!FilePackage methodsFor: 'superclass ordering' = stamp: 'MU 6/21/2002 12:30'!=0DsuperclassOrder: klasses =0D | all list = aClass inclusionSet aClassIndex cache |=0D list :=3D klasses copy.=0D = "list is indexable"=0D inclusionSet :=3D list asSet.=0D cache :=3D = Dictionary new.=0D all :=3D OrderedCollection new: list size.=0D list = size=0D timesRepeat: [aClassIndex :=3D list=0D findFirst: [:one | = one isNil not=0D and: [self=0D doWeFileOut: one=0D = given: inclusionSet=0D cache: cache]].=0D aClass :=3D list = at: aClassIndex.=0D all addLast: aClass.=0D inclusionSet remove: = aClass.=0D list at: aClassIndex put: nil].=0D ^ all! = !=0D=0D=0D!PseudoClass methodsFor: 'accessing' stamp: 'kuri-t 6/17/2002 = 15:32'!=0DclassCommentMergeStatus=0D ^ classCommentMergeStatus! = !=0D=0D!PseudoClass methodsFor: 'accessing' stamp: 'kuri-t 6/17/2002 = 15:32'!=0DclassCommentMergeStatus: statusSymbol=0D = classCommentMergeStatus :=3D statusSymbol! !=0D=0D!PseudoClass = methodsFor: 'accessing' stamp: 'kuri-t 6/17/2002 = 15:31'!=0DclassDefinitionMergeStatus=0D ^ classDefinitionMergeStatus! = !=0D=0D!PseudoClass methodsFor: 'accessing' stamp: 'kuri-t 6/17/2002 = 15:31'!=0DclassDefinitionMergeStatus: statusSymbol=0D = classDefinitionMergeStatus :=3D statusSymbol! !=0D=0D!PseudoClass = methodsFor: 'accessing' stamp: 'MU 6/25/2002 = 14:45'!=0DisClassCommentFileIn=0D isClassCommentFileIn isNil ifTrue: = [isClassCommentFileIn :=3D false].=0D ^isClassCommentFileIn! = !=0D=0D!PseudoClass methodsFor: 'accessing' stamp: 'MU 6/25/2002 = 14:39'!=0DisClassCommentFileIn: anObject=0D isClassCommentFileIn :=3D = anObject! !=0D=0D!PseudoClass methodsFor: 'accessing' stamp: 'MU = 6/25/2002 14:45'!=0DisClassDefinitionFileIn=0D isClassDefinitionFileIn = isNil ifTrue: [isClassDefinitionFileIn :=3D false].=0D = ^isClassDefinitionFileIn! !=0D=0D!PseudoClass methodsFor: 'accessing' = stamp: 'MU 6/25/2002 14:39'!=0DisClassDefinitionFileIn: anObject=0D = isClassDefinitionFileIn :=3D anObject! !=0D=0D!PseudoClass methodsFor: = 'accessing' stamp: 'MU 6/25/2002 14:40'!=0DmethodFileInStatusDict=0D = methodFileInStatusDict isNil=0D ifTrue: [methodFileInStatusDict :=3D = Dictionary new].=0D ^ methodFileInStatusDict! !=0D=0D!PseudoClass = methodsFor: 'accessing' stamp: 'kuri-t 6/11/2002 = 17:09'!=0DmethodMergeStatusDict=0D methodMergeStatusDict isNil=0D = ifTrue: [methodMergeStatusDict :=3D Dictionary new].=0D ^ = methodMergeStatusDict! !=0D=0D!PseudoClass methodsFor: 'accessing' = stamp: 'MU 6/20/2002 17:17'!=0DparsedSuperPseudoClassName=0D | clsName = |=0D self hasDefinition ifFalse: [^nil].=0D clsName :=3D (self = definition readStream upTo: Character space) asSymbol.=0D ^clsName! = !=0D=0D!PseudoClass methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 = 16:19'!=0DfileInComment=0D self exists ifFalse:[^self = classNotDefined].=0D self hasComment ifTrue: [self realClass = classComment: self comment.=0D self isClassCommentFileIn: true=0D ]! = !=0D=0D!PseudoClass methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 = 16:56'!=0DfileInCommentNotConflicted=0D (self classCommentMergeStatus = =3D=3D #conflicted) ifTrue: [^ self].=0D self fileInComment! = !=0D=0D!PseudoClass methodsFor: 'fileIn/fileOut' stamp: 'MU 6/25/2002 = 15:39'!=0DfileInDefinition=0D (self=0D makeSureSuperClassExists: = (definition copyUpTo: Character space))=0D ifFalse: [^ self].=0D self = hasDefinition=0D ifTrue: [Transcript cr; show: 'Defining ' , self = name.=0D self evaluate: self definition.=0D self = isClassDefinitionFileIn: true].=0D self exists=0D ifFalse: [^ self].=0D = self hasComment=0D ifTrue: [self realClass classComment: self = comment.=0D self isClassCommentFileIn: true]! !=0D=0D!PseudoClass = methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 = 16:24'!=0DfileInDefinitionOnly=0D "file-in ##definition only##"=0D self = hasDefinition=0D ifFalse: [^ self].=0D (self=0D = makeSureSuperClassExists: (definition copyUpTo: Character space))=0D = ifFalse: [^ self].=0D Transcript cr; show: 'Defining ' , self name.=0D = self evaluate: self definition.=0D self isClassDefinitionFileIn: true! = !=0D=0D!PseudoClass methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 = 16:57'!=0DfileInDefinitionOnlyNotConflicted=0D "file-in ##definition = only##"=0D (self classDefinitionMergeStatus =3D=3D #conflicted) ifTrue: = [^ self].=0D self fileInDefinitionOnly! !=0D=0D!PseudoClass methodsFor: = 'fileIn/fileOut' stamp: 'MU 6/25/2002 14:46'!=0DfileInMethods: = aCollection=0D "FileIn all methods with selectors taken from = aCollection"=0D | theClass cat |=0D self exists ifFalse:[^self = classNotDefined].=0D theClass :=3D self realClass.=0D aCollection = do:[:sel|=0D cat :=3D self organization categoryOfElement: sel.=0D cat = =3D self removedCategoryName ifFalse:[=0D theClass =0D compile: = (self sourceCodeAt: sel) =0D classified: cat=0D withStamp: (self = stampAt: sel)=0D notifying: nil.=0D self methodFileInStatusDict at: = sel put: true.=0D ].=0D ].! !=0D=0D!PseudoClass methodsFor: = 'fileIn/fileOut' stamp: 'MU 6/26/2002 = 16:57'!=0DfileInMethodsNotConflicted=0D ^self = fileInMethodsNotConflicted: self selectors! !=0D=0D!PseudoClass = methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 = 16:57'!=0DfileInMethodsNotConflicted: aCollection =0D | selectors |=0D = selectors :=3D aCollection=0D reject: [:sel | (self = methodMergeStatusAt: sel)=0D =3D=3D #conflicted].=0D self = fileInMethods: selectors! !=0D=0D!PseudoClass methodsFor: = 'fileIn/fileOut' stamp: 'MU 6/26/2002 16:58'!=0DfileInNotConflicted=0D = self hasDefinition ifTrue: [self fileInDefinitionOnlyNotConflicted].=0D = self hasComment ifTrue: [self fileInCommentNotConflicted].=0D self = fileInMethodsNotConflicted.=0D metaClass ifNotNil:[metaClass = fileInNotConflicted].=0D self needsInitialize ifTrue:[=0D self = evaluate: self name,' initialize'.=0D ].! !=0D=0D!PseudoClass = methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 = 17:02'!=0DfileOutConflicted=0D | f |=0D f :=3D (FileStream newFileNamed: = self name,'---conflicts.st').=0D self fileOutConflictedOn: f.! = !=0D=0D!PseudoClass methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 = 17:02'!=0DfileOutConflictedOn: aStream =0D | methods |=0D (self = hasDefinition=0D and: [self classDefinitionMergeStatus =3D=3D = #conflicted])=0D ifTrue: [aStream nextChunkPut: self definition;=0D = cr].=0D (self hasComment=0D and: [self classCommentMergeStatus =3D=3D = #conflicted])=0D ifTrue: [aStream cr.=0D self organization = commentRemoteStr fileOutOn: aStream].=0D methods :=3D OrderedCollection = new.=0D self methodMergeStatusDict=0D keysAndValuesDo: [:key :value | = value =3D=3D #conflicted=0D ifTrue: [methods add: key]].=0D self = fileOutMethods: methods on: aStream.=0D self hasMetaclass=0D ifTrue: = [self metaClass fileOutConflictedOn: aStream]! !=0D=0D!PseudoClass = methodsFor: 'fileIn/fileOut' stamp: 'MU 6/26/2002 = 17:03'!=0DfileOutNotConflicted=0D | f |=0D f :=3D (FileStream = newFileNamed: self name,'---notConflicts.st').=0D self = fileOutNotConflictedOn: f.! !=0D=0D!PseudoClass methodsFor: = 'fileIn/fileOut' stamp: 'MU 6/26/2002 17:03'!=0DfileOutNotConflictedOn: = aStream =0D | methods |=0D (self hasDefinition=0D and: [self = classDefinitionMergeStatus ~=3D #conflicted])=0D ifTrue: [aStream = nextChunkPut: self definition;=0D cr].=0D (self hasComment=0D and: = [self classCommentMergeStatus ~=3D #conflicted])=0D ifTrue: [aStream = cr.=0D self organization commentRemoteStr fileOutOn: aStream].=0D = methods :=3D OrderedCollection new.=0D self methodMergeStatusDict=0D = keysAndValuesDo: [:key :value | value ~=3D #conflicted=0D ifTrue: = [methods add: key]].=0D self fileOutMethods: methods on: aStream.=0D = self hasMetaclass=0D ifTrue: [self metaClass fileOutNotConflictedOn: = aStream]! !=0D=0D!PseudoClass methodsFor: 'methods' stamp: 'MU 6/25/2002 = 15:41'!=0DmethodFileInStatusAt: selector=0D ^ self = methodFileInStatusDict at: selector ifAbsent:[false]! = !=0D=0D!PseudoClass methodsFor: 'methods' stamp: 'kuri-t 6/12/2002 = 19:00'!=0DmethodMergeStatusAt: selector=0D ^ self methodMergeStatusDict = at: selector ifAbsent:[]! !=0D=0D!PseudoClass methodsFor: 'methods' = stamp: 'kuri-t 6/7/2002 16:28'!=0DmethodMergeStatusAt: selector put: = statusSymbol=0D ^ self methodMergeStatusDict at: selector put: = statusSymbol! !=0D=0D!PseudoClass methodsFor: 'methods' stamp: 'kuri-t = 6/4/2002 15:31'!=0DsourceCodeAt: sel ifAbsent: aBlock=0D | src |=0D src = :=3D self sourceCode at: sel ifAbsent:[].=0D src isNil ifFalse: [^src = string].=0D ^aBlock value! !=0D=0D!PseudoClass methodsFor: 'printing' = stamp: 'MU 6/21/2002 12:05'!=0DprintOn: aStream=0D super printOn: = aStream.=0D aStream space; nextPutAll: self name.=0D ! = !=0D=0D!PseudoClass methodsFor: 'testing method dictionary' stamp: = 'kuri-t 6/4/2002 15:47'!=0DincludesSelector: aSymbol=0D ^self selectors = includes: aSymbol! !=0D=0D!PseudoClass methodsFor: 'merging' stamp: 'MU = 6/26/2002 19:13'!=0DmergeMessages: selectors with: otherPseudoClass =0D = | addedKeys |=0D otherPseudoClass isNil=0D ifTrue: [^ self].=0D = addedKeys :=3D otherPseudoClass selectors removeAllFoundIn: = selectors;=0D yourself.=0D addedKeys=0D do: [:addedKey | =0D | = methodChange | =0D methodChange :=3D otherPseudoClass sourceCode at: = addedKey.=0D methodChange isText=0D ifFalse: [self addMethodChange: = methodChange.=0D self methodMergeStatusAt: addedKey put: = #migrated.=0D otherPseudoClass removeMethod: methodChange = methodSelector]].=0D selectors=0D do: [:sel | =0D | otherMethod | =0D = otherMethod :=3D otherPseudoClass=0D sourceCodeAt: sel=0D = ifAbsent: [].=0D otherMethod isNil=0D ifFalse: [(self sourceCodeAt: = sel)=0D =3D otherMethod asString=0D ifTrue: [otherPseudoClass = removeMethod: sel]=0D ifFalse: [self methodMergeStatusAt: sel put: = #conflicted.=0D otherPseudoClass methodMergeStatusAt: sel put: = #conflicted]]].=0D otherPseudoClass organization removeEmptyCategories! = !=0D=0D!PseudoClass methodsFor: 'merging' stamp: 'kuri-t 6/5/2002 = 16:08'!=0DmergeMessagesWith: otherPseudoClass =0D ^self mergeMessages: = self selectors with: otherPseudoClass ! !=0D=0D!PseudoClass methodsFor: = 'merging' stamp: 'MU 6/26/2002 15:28'!=0DmergeStatus=0D | status |=0D = status :=3D Set new.=0D self methodMergeStatusDict=0D valuesDo: [:each = | status add: each].=0D self classDefinitionMergeStatus isNil=0D = ifFalse: [status add: self classDefinitionMergeStatus].=0D self = classCommentMergeStatus isNil=0D ifFalse: [status add: self = classCommentMergeStatus].=0D (status includes: #conflicted) ifTrue: [^ = #conflicted].=0D (status includes: #migrated) ifTrue: [^ #migrated].=0D = ^ #original! !=0D=0D!PseudoClass methodsFor: 'merging' stamp: 'kuri-t = 6/14/2002 16:39'!=0DmergeWith: theOtherPseudoClass =0D = theOtherPseudoClass isNil=0D ifTrue: [^ self].=0D self = mergeMessagesWith: theOtherPseudoClass.=0D (self hasDefinition=0D and: = [self definition =3D theOtherPseudoClass definition])=0D ifTrue: = [theOtherPseudoClass definition: nil].=0D (self hasComment=0D and: = [self comment asString =3D theOtherPseudoClass comment asString])=0D = ifTrue: [theOtherPseudoClass classComment: nil].=0D (theOtherPseudoClass = hasComment=0D and: [self hasComment not])=0D ifTrue: [self = commentString: theOtherPseudoClass comment asString. =0D = theOtherPseudoClass classComment: nil].=0D self = setClassMergeStatusUsing: theOtherPseudoClass.=0D metaClass isNil=0D = ifFalse: [metaClass mergeWith: theOtherPseudoClass metaClass]! = !=0D=0D!PseudoClass methodsFor: 'merging' stamp: 'kuri-t 6/11/2002 = 19:01'!=0DsetAllMessagesMergeStatusMigrated=0D self sourceCode=0D = keysAndValuesDo: [:key :value | self methodMergeStatusDict at: key put: = #migrated].=0D metaClass isNil=0D ifFalse: [self metaClass = setAllMessagesMergeStatusMigrated]! !=0D=0D!PseudoClass methodsFor: = 'merging' stamp: 'kuri-t 6/17/2002 = 16:43'!=0DsetClassMergeStatusMigrated=0D self hasDefinition=0D ifTrue: = [self classDefinitionMergeStatus: #migrated].=0D self hasComment=0D = ifTrue: [self classCommentMergeStatus: #migrated].=0D self = hasMetaclass=0D ifTrue: [self metaClass hasDefinition=0D ifTrue: = [self metaClass classDefinitionMergeStatus: #migrated]]! = !=0D=0D!PseudoClass methodsFor: 'merging' stamp: 'MU 6/26/2002 = 15:34'!=0DsetClassMergeStatusUsing: theOtherPseudoClass =0D | = otherDefinition otherComment |=0D self hasDefinition=0D ifTrue: = [theOtherPseudoClass hasDefinition=0D ifTrue: [otherDefinition :=3D = theOtherPseudoClass definition.=0D self definition =3D = otherDefinition=0D ifFalse: [self classDefinitionMergeStatus: = #conflicted.=0D theOtherPseudoClass classDefinitionMergeStatus: = #conflicted]]]=0D ifFalse: [theOtherPseudoClass hasDefinition=0D = ifTrue: [self classDefinitionMergeStatus: #migrated]].=0D = theOtherPseudoClass hasComment=0D ifTrue: [self hasComment=0D = ifTrue: [otherComment :=3D theOtherPseudoClass comment.=0D self = comment =3D otherComment=0D ifFalse: [self classCommentMergeStatus: = #conflicted.=0D theOtherPseudoClass classDefinitionMergeStatus: = #conflicted]]=0D ifFalse: [self classCommentMergeStatus: #migrated]]! = !=0D=0D!PseudoClass methodsFor: 'comparing' stamp: 'kuri-t 6/18/2002 = 17:54'!=0D<=3D aPsudoClass=0D =0D ^self name <=3D aPsudoClass name! = !=0D=0D!PseudoClass methodsFor: 'comparing' stamp: 'kuri-t 6/18/2002 = 17:54'!=0D=3D aPsudoClass=0D =0D ^self name =3D aPsudoClass name! = !=0D=0D=0D!PseudoMetaclass methodsFor: 'accessing' stamp: 'MU 6/20/2002 = 17:18'!=0DparsedSuperPseudoClassName=0D | clsName |=0D self = hasDefinition ifFalse: [^nil].=0D clsName :=3D (self definition = readStream upTo: Character space) asSymbol.=0D ^clsName, ' class'! = !=0D=0D!PseudoMetaclass methodsFor: 'accessing' stamp: 'kuri-t 6/18/2002 = 17:25'!=0DsoleInstance=0D ^ super realClass class soleInstance! = !=0D=0D!PseudoMetaclass methodsFor: 'accessing' stamp: 'MU 6/20/2002 = 17:57'!=0DsoleInstanceName=0D | clsName |=0D clsName :=3D (self name = readStream upTo: Character space) asSymbol.=0D ^clsName! !=0D=0DObject = subclass: #PseudoClass=0D instanceVariableNames: 'name definition = organization source metaClass classDefinitionMergeStatus = classCommentMergeStatus methodMergeStatusDict isClassDefinitionFileIn = isClassCommentFileIn methodFileInStatusDict '=0D classVariableNames: = ''=0D poolDictionaries: ''=0D category: 'Tools-File Contents Browser'!=0D=
--Boundary_(ID_ypGspb+Ulcz08ltRBqgWfA)--
squeak-dev@lists.squeakfoundation.org