'From Squeak3.1alpha of 5 February 2001 [latest update: #3740] on 27 February 2001 at 10:14:15 am'! "Change Set: syntax5 Date: 27 February 2001 Author: Bob Arning getting closer to Alan's latest omniuser appearance. disabled the change spacing button on universal scripts for now."! !BlockNode methodsFor: 'tiles' stamp: 'RAA 2/27/2001 09:48'! asMorphicCollectSyntaxIn: parent ^parent blockNodeCollect: self arguments: arguments statements: statements! ! !SyntaxMorph methodsFor: 'initialization' stamp: 'RAA 2/27/2001 09:19'! drawOn: aCanvas super drawOn: aCanvas. self isBlockNode ifFalse: [^self]. self specialBlockFormatting ifTrue: [^self]. self immediatelyBelowTheMethodNode ifTrue: [ aCanvas fillRectangle: (self topLeft + (0@-1) extent: self width@1) color: Color gray ] ifFalse: [ self specialBlockFormatting ifFalse: [ aCanvas fillRectangle: (self topLeft + (1@1) extent: 2@(self height-2)) color: Color gray. aCanvas fillRectangle: (self topLeft + (1@1) extent: 4@1) color: Color gray. aCanvas fillRectangle: (self bottomLeft + (1@-1) extent: 4@1) color: Color gray ]. ]. ! ! !SyntaxMorph methodsFor: 'layout' stamp: 'RAA 2/27/2001 09:58'! addNoiseString: aNoiseString emphasis: anInteger self noiseWordsAdded ifFalse: [^self]. ^(self addColumn: #keyword1 on: nil) layoutInset: 1; addMorphBack: ((self noiseStringMorph: aNoiseString) emphasis: anInteger) ! ! !SyntaxMorph methodsFor: 'layout' stamp: 'RAA 2/27/2001 09:03'! addUnaryRow: aStringLikeItem style: aSymbol | row sMorph modifiedString fontToUse | self flag: #emphasis:. "who needs it. who doesn't" (row _ self class row: #text on: nil) borderWidth: 1. modifiedString _ self substituteKeywordFor: aStringLikeItem. sMorph _ self addString: modifiedString. fontToUse _ self fontToUseForSpecialWord: modifiedString. sMorph font: fontToUse emphasis: 1; color: self colorForUnaries; setProperty: #syntacticallyCorrectContents toValue: aStringLikeItem. row addMorph: sMorph. self addMorphBack: row. ^row! ! !SyntaxMorph methodsFor: 'menus' stamp: 'RAA 2/27/2001 09:15'! addMorphBack: m "m setProperty: #howAdded toValue: thisContext longStack." ^super addMorphBack: m! ! !SyntaxMorph methodsFor: 'menus' stamp: 'RAA 2/27/2001 09:24'! addToken: aString type: aColorOrSymbol on: aNode | sMorph modifiedString noiseWord col | self flag: #emphasis:. "who needs it. who doesn't" col _ (self addRow: aColorOrSymbol on: aNode) layoutInset: 1. noiseWord _ [ :w | w ifNotNil: [ col addMorphBack: (self noiseStringMorph: w); addMorphBack: (self tokenVerticalSeparator) ]. ]. sMorph _ self addString: (modifiedString _ aString). self specialBlockFormatting ifTrue: [ (self shouldBeBrokenIntoWords: aColorOrSymbol) ifTrue: [ modifiedString _ self substituteKeywordFor: aString. sMorph setProperty: #syntacticallyCorrectContents toValue: aString; contents: modifiedString. ]. (#(keyword2 upArrow) includes: aColorOrSymbol) ifTrue: [ sMorph font: (self fontToUseForSpecialWord: modifiedString); color: (self colorForKeywords: aString and: modifiedString). ]. (#(keyword2 unary) includes: aColorOrSymbol) ifTrue: [ sMorph emphasis: 1. ]. aColorOrSymbol == #binary ifTrue: [sMorph color: self colorForBinaries]. ]. self alansTest1 ifTrue: [ aColorOrSymbol == #blockarg1 ifTrue: [ ]. (aColorOrSymbol == #variable or: [aColorOrSymbol == #tempVariable]) ifTrue: [ aString = 'self' ifTrue: [ sMorph setProperty: #wordyVariantOfSelf toValue: true. ]. noiseWord value: (self noiseWordBeforeVariableNode: aNode string: aString). ]. ]. col addMorphBack: sMorph. ^col! ! !SyntaxMorph methodsFor: 'menus' stamp: 'RAA 2/27/2001 09:22'! addTokenSpecialCase: aString type: aColorOrSymbol on: aNode | sMorph modifiedString noiseWord col | self flag: #emphasis:. "who needs it. who doesn't" noiseWord _ nil. sMorph _ self addString: aString. self specialBlockFormatting ifTrue: [ (aColorOrSymbol == #keyword2) ifTrue: [ modifiedString _ aString = 'if:' ifTrue: ['Test'] ifFalse: ['Yes']. sMorph font: (self fontToUseForSpecialWord: modifiedString) "emphasis: 1"; color: (self colorForKeywords: aString and: modifiedString); setProperty: #syntacticallyCorrectContents toValue: aString; contents: modifiedString. ]. ]. col _ (self addRow: aColorOrSymbol on: aNode) layoutInset: 1. noiseWord ifNotNil: [ col addMorphBack: (self noiseStringMorph: noiseWord); addMorphBack: (self transparentSpacerOfSize: 3@1) ]. col addMorphBack: sMorph. ^col! ! !SyntaxMorph methodsFor: 'node to morph' stamp: 'RAA 2/27/2001 08:50'! addTemporaries: temporaries | tempMorph outerMorph w2 | temporaries size > 0 ifFalse: [^self]. self alansTest1 ifFalse: [ tempMorph _ self addRow: #tempVariable on: (MethodTempsNode new). temporaries do: [:temp | temp asMorphicSyntaxIn: tempMorph ] separatedBy: [tempMorph addMorphBack: (tempMorph transparentSpacerOfSize: 4@4)]. ^self ]. outerMorph _ self addRow: #tempVariable on: nil. outerMorph setSpecialTempDeclarationFormat1. (outerMorph addToken: ' my ' type: #upArrow on: nil) setConditionalPartStyle. outerMorph addMorphBack: (w2 _ self noiseStringMorph: ' temps are '). w2 emphasis: 1. tempMorph _ outerMorph addRow: #tempVariable on: (MethodTempsNode new). tempMorph setSpecialTempDeclarationFormat2. temporaries do: [:temp | tempMorph addToken: temp name type: #tempVariableDeclaration on: temp] separatedBy: [tempMorph addMorphBack: self tokenVerticalSeparator]. ! ! !SyntaxMorph methodsFor: 'node to morph' stamp: 'RAA 2/27/2001 07:33'! addTemporaryControls | row stdSize | stdSize _ 8@8. row _ AlignmentMorph newRow color: Color transparent; hResizing: #shrinkWrap; vResizing: #shrinkWrap. self addMorph: row. { Morph new extent: stdSize; setBalloonText: 'Change the contrast'; on: #mouseUp send: #controlContrast2: to: self; on: #mouseMove send: #controlContrast2: to: self; on: #mouseDown send: #controlContrast2: to: self. "==== Morph new extent: stdSize; color: Color green; setBalloonText: 'Change basic spacing'; on: #mouseUp send: #controlSpacing2: to: self; on: #mouseMove send: #controlSpacing2: to: self; on: #mouseDown send: #controlSpacing2: to: self. ===" Morph new extent: stdSize; color: Color red; setBalloonText: 'Change basic style'; on: #mouseUp send: #changeBasicStyle to: self. } do: [ :each | row addMorphBack: each. row addMorphBack: (self transparentSpacerOfSize: stdSize). ]. ! ! !SyntaxMorph methodsFor: 'node to morph' stamp: 'RAA 2/27/2001 09:33'! alanKeywordMessage: aNode isAConditional: template key: key args: args | nodeWithNilReceiver column keywords row onlyOne | (key == #collect: and: [args first isKindOf: BlockNode]) ifTrue: [ ^self alanKeywordMessageCollect: aNode isAConditional: template key: key args: args ]. nodeWithNilReceiver _ aNode copy receiver: nil. template = 1 ifTrue: [ self listDirection: #topToBottom. ]. column _ self addColumn: #keyword1 on: nodeWithNilReceiver. keywords _ key keywords. onlyOne _ args size = 1. keywords with: (args first: keywords size) do: [:kwd :arg | template = 1 ifTrue: [ column addMorphBack: (column transparentSpacerOfSize: 3@3). ]. (row _ column addRow: #keyword2 on: nodeWithNilReceiver) borderWidth: 1; parseNode: (nodeWithNilReceiver as: (onlyOne ifTrue: [MessageNode] ifFalse: [MessagePartNode])); borderColor: row stdBorderColor. template = 1 ifTrue: [row addMorphBack: (row transparentSpacerOfSize: 20@6)]. key == #if:do: ifTrue: [ kwd = 'do:' ifTrue: [ row addMorphBack: (row transparentSpacerOfSize: 26@6). ] ifFalse: [ row addMorphBack: (row transparentSpacerOfSize: 10@6). ]. row addTokenSpecialCase: kwd type: #keyword2 on: KeyWordNode new. ] ifFalse: [ row addToken: kwd type: #keyword2 on: (onlyOne ifTrue: [SelectorNode new key: kwd code: nil "fill this in?"] ifFalse: [KeyWordNode new]). template = 0 ifTrue: [ "row addMorphBack: self tokenVerticalSeparator" ]. ]. (arg asMorphicSyntaxIn: row) setConditionalPartStyle. ]. onlyOne ifTrue: [ self replaceSubmorph: column by: row. column _ row. ]. false "template = 2" ifTrue: [ self setSpecialOuterTestFormat. ] ifFalse: [ column setSpecialOuterTestFormat. ]. ! ! !SyntaxMorph methodsFor: 'node to morph' stamp: 'RAA 2/27/2001 10:08'! alanKeywordMessageCollect: aNode isAConditional: template key: key args: args | nodeWithNilReceiver row kwdHolder | nodeWithNilReceiver _ aNode copy receiver: nil. (row _ self addRow: #keyword2 on: nodeWithNilReceiver) borderWidth: 1; parseNode: (nodeWithNilReceiver as: MessageNode); borderColor: row stdBorderColor. kwdHolder _ row addToken: key type: #keyword2 on: (SelectorNode new key: key code: nil "fill this in?"). kwdHolder firstSubmorph setProperty: #syntacticallyCorrectContents toValue: key asString; contents: ''. args first asMorphicCollectSyntaxIn: row. row setSpecialOuterTestFormat. ! ! !SyntaxMorph methodsFor: 'node to morph' stamp: 'RAA 2/27/2001 09:01'! alansMessageNode: aNode receiver: receiver selector: selector keywords: key arguments: args | row receiverMorph testAndReceiver anotherSelf wordyMorph template | template _ self alansTemplateStyleFor: key. receiver ifNotNil: ["i.e. not a cascade" anotherSelf _ self constructSelfVariant: receiver and: key. anotherSelf ifNotNil: [ wordyMorph _ self addString: anotherSelf. wordyMorph setProperty: #wordyVariantOfSelf toValue: true. self addMorph: wordyMorph. self layoutInset: 1. ^self ]. testAndReceiver _ self. template = 1 ifTrue: [ testAndReceiver _ self addRow: #keyword1 on: nil. self setSpecialOuterTestFormat. testAndReceiver addNoiseString: 'Test' ]. false "template = 2" ifTrue: [ testAndReceiver _ self addRow: #keyword1 on: nil. "self setSpecialOuterTestFormat." testAndReceiver addNoiseString: 'Repeat for' ]. receiverMorph _ receiver asMorphicSyntaxIn: testAndReceiver. template = 1 ifTrue: [receiverMorph setConditionalPartStyle]. ]. "unary mssages" args size = 0 ifTrue: [ row _ (self addUnaryRow: key style: #unary) layoutInset: 1. ^ row parseNode: selector ]. "binary messages" key last = $: ifFalse: [ ^self alanBinaryPostRcvr: aNode key: key args: args ]. "keyword messages" receiverMorph ifNotNil: [self setConditionalPartStyle]. self alanKeywordMessage: aNode isAConditional: template key: key args: args! ! !SyntaxMorph methodsFor: 'node to morph' stamp: 'RAA 2/27/2001 07:50'! assignmentNode: aNode variable: variable value: value | row v | row _ self addRow: #assignment on: aNode. v _ variable asMorphicSyntaxIn: row. self alansTest1 ifTrue: [v setConditionalPartStyle; layoutInset: 2]. row addToken: ' _ ' type: #assignment on: aNode. value asMorphicSyntaxIn: row. self alansTest1 ifTrue: [row setSpecialOuterTestFormat]. ^row ! ! !SyntaxMorph methodsFor: 'node to morph' stamp: 'RAA 2/27/2001 09:59'! blockNode: aNode arguments: arguments statements: statements | row column | column _ self addColumn: #block on: aNode. self alansTest1 ifTrue: [column setProperty: #deselectedBorderColor toValue: self lighterColor]. column layoutInset: (self alansTest1 ifTrue: [1] ifFalse: [2@-1]). aNode addCommentToMorph: column. arguments size > 0 ifTrue: [ row _ column addRow: #blockarg1 on: (BlockArgsNode new). row addNoiseString: self noiseBeforeBlockArg. arguments do: [:arg | row addToken: arg name type: #blockarg2 on: arg ] ]. statements do: [ :each | (each asMorphicSyntaxIn: column) borderWidth: 1. each addCommentToMorph: column ]. ^ column! ! !SyntaxMorph methodsFor: 'node to morph' stamp: 'RAA 2/27/2001 10:02'! blockNodeCollect: aNode arguments: arguments statements: statements | row column c2 r2 r3 | column _ self addColumn: #blockCollectOnly on: aNode. column layoutInset: (self alansTest1 ifTrue: [1] ifFalse: [2@-1]). aNode addCommentToMorph: column. arguments size > 0 ifTrue: [ row _ column addRow: #blockarg1 on: (BlockArgsNode new). row addNoiseString: 'collect using' emphasis: 1. r3 _ row addRow: #blockarg1b on: aNode. r3 setConditionalPartStyle. arguments do: [:arg | r3 addToken: arg name type: #blockarg2 on: arg ] ]. r2 _ column addRow: #block on: aNode. r2 addNoiseString: 'from' emphasis: 1. c2 _ r2 addColumn: #block on: aNode. statements do: [ :each | (each asMorphicSyntaxIn: c2) borderWidth: 1. each addCommentToMorph: c2 ]. ^ column! ! !SyntaxMorph methodsFor: 'node to morph' stamp: 'RAA 2/27/2001 08:46'! returnNode: aNode expression: expr | row w2 | row _ self addRow: #return on: aNode. self alansTest1 ifTrue: [ row setSpecialOuterTestFormat. (row addToken: ' my ' type: #upArrow on: aNode) setConditionalPartStyle. row "addMorphBack: (w1 _ self noiseStringMorph: 'my');" addMorphBack: (w2 _ self noiseStringMorph: ' reply is '). w2 emphasis: 1. ] ifFalse: [ row addToken: '^ ' type: #upArrow on: aNode. ]. expr asMorphicSyntaxIn: row. expr addCommentToMorph: row. ^row ! ! !SyntaxMorph methodsFor: 'alans styles' stamp: 'RAA 2/26/2001 23:24'! alansCurrentFontPreference ^nil "StrikeFont familyName: 'ComicBold' size: 16"! ! !SyntaxMorph methodsFor: 'alans styles' stamp: 'RAA 2/27/2001 08:44'! colorForBinaries ^Color black "(Color r: 0.333 g: 0.333 b: 0.333)"! ! !SyntaxMorph methodsFor: 'alans styles' stamp: 'RAA 2/27/2001 08:44'! colorForKeywords: original and: modified 1 = 1 ifTrue: [^Color black]. (#('ifTrue:' 'ifFalse:' 'Test' 'my') includes: original asString) ifTrue: [ ^Color black ]. (original size > 0 and: [original last = $:]) ifFalse: [ ^Color gray ]. ^(Color r: 0.333 g: 0.333 b: 0.333)! ! !SyntaxMorph methodsFor: 'alans styles' stamp: 'RAA 2/27/2001 08:44'! colorForUnaries 1 = 1 ifTrue: [^Color black]. ^(Color r: 0.666 g: 0.666 b: 0.666)! ! !SyntaxMorph methodsFor: 'alans styles' stamp: 'RAA 2/26/2001 23:20'! darkerColor ^(Color r: 1.0 g: 0.839 b: 0.613) "Color lightBrown lighter lighter." ! ! !SyntaxMorph methodsFor: 'alans styles' stamp: 'RAA 2/26/2001 23:23'! fontToUseForSpecialWord: aString ^(#('Yes' 'No' 'Test') includes: aString) ifTrue: [ (StrikeFont familyName: 'Helvetica' size: 14) ] ifFalse: [ nil "(StrikeFont familyName: 'ComicBold' size: 16)" ]! ! !SyntaxMorph methodsFor: 'alans styles' stamp: 'RAA 2/27/2001 08:43'! lighterColor ^(Color r: 0.935 g: 0.935 b: 0.935) "paleGreen lighter" ! ! !SyntaxMorph methodsFor: 'alans styles' stamp: 'RAA 2/26/2001 22:50'! setConditionalPartStyle self specialColor: self lighterColor andBorder: self darkerColor. self useRoundedCorners. self borderWidth: 1. ! ! !SyntaxMorph methodsFor: 'alans styles' stamp: 'RAA 2/27/2001 07:34'! setSpecialOuterTestFormat self specialColor: self darkerColor andBorder: self lighterColor. self useRoundedCorners. self layoutInset: 1. "self setProperty: #variableInsetSize toValue: 6." ! ! !SyntaxMorph methodsFor: 'alans styles' stamp: 'RAA 2/26/2001 22:50'! setSpecialTempDeclarationFormat1 "the outer template for temp defs" self specialColor: self darkerColor andBorder: self lighterColor. "self specialColor: (Color lightYellow) andBorder: (Color r: 0.581 g: 0.774 b: 0.903)." self useRoundedCorners. self layoutInset: 1. self cellPositioning: #center. "self setProperty: #variableInsetSize toValue: 6." ! ! !SyntaxMorph methodsFor: 'alans styles' stamp: 'RAA 2/26/2001 22:50'! setSpecialTempDeclarationFormat2 "the inner template for temp defs" self specialColor: self lighterColor andBorder: self darkerColor. "self specialColor: (Color r: 1.0 g: 1.0 b: 0.548) andBorder: (Color r: 0.581 g: 0.774 b: 0.903)." self useRoundedCorners. self layoutInset: 1. "self setProperty: #variableInsetSize toValue: 6." ! ! !SyntaxMorph methodsFor: 'alans styles' stamp: 'RAA 2/26/2001 23:01'! standardCellPositioning ^ self alansTest1 ifTrue: [#leftCenter] ifFalse: [#topLeft]! ! !SyntaxMorph methodsFor: 'alans styles' stamp: 'RAA 2/26/2001 22:57'! standardInset ^ self alansTest1 ifTrue: [1] ifFalse: [-1@-1]! ! !SyntaxMorph class methodsFor: 'as yet unclassified' stamp: 'RAA 2/26/2001 22:59'! column: aColor on: aParseNode | c color | color _ self translateColor: aColor. (c _ self newColumn) parseNode: aParseNode; layoutInset: c standardInset; hResizing: #shrinkWrap; vResizing: #shrinkWrap; color: color; borderWidth: 1; borderColor: c stdBorderColor; wrapCentering: #topLeft; cellPositioning: c standardCellPositioning. ^c ! ! !SyntaxMorph class methodsFor: 'as yet unclassified' stamp: 'RAA 2/26/2001 23:00'! row: aColor on: aParseNode | r color | color _ self translateColor: aColor. (r _ self newRow) parseNode: aParseNode; layoutInset: r standardInset; hResizing: #shrinkWrap; vResizing: #shrinkWrap; color: color; borderWidth: 1; borderColor: r stdBorderColor; wrapCentering: #topLeft; cellPositioning: r standardCellPositioning. ^r! ! !SyntaxMorph class methodsFor: 'as yet unclassified' stamp: 'RAA 2/26/2001 22:56'! standardInset ^ self alansTest1 ifTrue: [1] ifFalse: [-1@-1]! ! !SyntaxMorph class methodsFor: 'as yet unclassified' stamp: 'RAA 2/27/2001 07:44'! testClass: aClass andMethod: aSelector | tree source syn widget outer | source _ (aClass compiledMethodAt: aSelector) getSourceFromFile. tree _ Compiler new parse: source in: aClass notifying: nil. (syn _ tree asMorphicSyntaxUsing: SyntaxMorph) parsedInClass: aClass. widget _ syn inAScrollPane. widget color: Color transparent; setProperty: #hideUnneededScrollbars toValue: true; setProperty: #maxAutoFitSize toValue: 300@200. (outer _ AlignmentMorph newRow) hResizing: #shrinkWrap; vResizing: #shrinkWrap; borderWidth: 4; color: (Color r: 0.935 g: 0.935 b: 0.935); borderColor: Color gray; useRoundedCorners; addMorphBack: widget. syn finalAppearanceTweaks. SyntaxMorph setSizeAndMakeResizable: outer. outer openInWorld! ! SyntaxMorph removeSelector: #addSingleKeywordRow:style:! SyntaxMorph removeSelector: #brownishColor! SyntaxMorph removeSelector: #lightGreenishColor!