'10/3/99 3:17:02 am'! '# # This file is encoded in (so called) SHIFT-JIS, # line delimitor is CR. # Blue Button Enhancements More Goodies for VisualWorks 2.5, VisualWorks Non-Commercial 3.0a Copyleft 1999 NISHIHARA Satoshi Broken English description This goodies is a modification for VWNC3.0 from Mr. AOKI''s Blue Button Enhancements Goodies for VisualWorks 2.5 and VisualWave 1.0 Copyright (c) 1995-1998 AOKI Atsushi 1998/01/05 http://www.sra.co.jp/people/aoki/SmalltalkGoodies/VisualWorks/BBMenuEn.st http://www.sra.co.jp/people/aoki/SmalltalkGoodies/VisualWorks/BBMenuEn.txt Summary: This goodies adds a menu item "inspect" to blue button menu. It is useful to investigate the MVC or so. How to install: FileIn this goodies and makes a class "BlueButtonMenuEnhancements" in a category "Goodies-Enhancements". AND 1 methods is modified in a category "private" of the class "StandardSystemController". StandardSystemController>>blueButtonActivity If you using VisualWorks Non-Commercial 3.0a, 1 methods is modified in a category "event driven" of the class "ApplicationStandardSystemController". ApplicationStandardSystemController>>blueButtonPressedEvent: When you want to restore your image, please remove this class "BlueButtonMenuEnhancements" from your system, simply. Also a menu item "inspect" is removed automatically from blue button menu. How to use: When you install this goodies, it adds a menu item "inspect" to blue button menu automatically. ---------------------------------------------------------- m (NISHIHARA Satoshi) e-mail: mailto:nishis@zephyr.dti.ne.jp URL: http://www.zephyr.dti.ne.jp/~nishis/ ---------------------------------------------------------- '! Object subclass: #MoreBlueButtonMenuEnhancements instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Goodies-Misc'! Object subclass: #MoreBlueButtonMenuEnhancements instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Goodies-Misc'! MoreBlueButtonMenuEnhancements comment: '# # This file is encoded in (so called) SHIFT-JIS, # line delimitor is CR. # Blue Button Enhancements More Goodies for VisualWorks 2.5, VisualWorks Non-Commercial 3.0a Copyleft 1999 NISHIHARA Satoshi Broken English description This goodies is a modification for VWNC3.0 from Mr. AOKI''s Blue Button Enhancements Goodies for VisualWorks 2.5 and VisualWave 1.0 Copyright (c) 1995-1998 AOKI Atsushi 1998/01/05 http://www.sra.co.jp/people/aoki/SmalltalkGoodies/VisualWorks/BBMenuEn.st http://www.sra.co.jp/people/aoki/SmalltalkGoodies/VisualWorks/BBMenuEn.txt Summary: This goodies adds a menu item "inspect" to blue button menu. It is useful to investigate the MVC or so. How to install: FileIn this goodies and makes a class "BlueButtonMenuEnhancements" in a category "Goodies-Enhancements". AND 1 methods is modified in a category "private" of the class "StandardSystemController". StandardSystemController>>blueButtonActivity If you using VisualWorks Non-Commercial 3.0a, 1 methods is modified in a category "event driven" of the class "ApplicationStandardSystemController". ApplicationStandardSystemController>>blueButtonPressedEvent: When you want to restore your image, please remove this class "BlueButtonMenuEnhancements" from your system, simply. Also a menu item "inspect" is removed automatically from blue button menu. How to use: When you install this goodies, it adds a menu item "inspect" to blue button menu automatically. ---------------------------------------------------------- m (NISHIHARA Satoshi) e-mail: mailto:nishis@zephyr.dti.ne.jp URL: http://www.zephyr.dti.ne.jp/~nishis/ ---------------------------------------------------------- '! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! MoreBlueButtonMenuEnhancements class instanceVariableNames: 'enhancements '! !MoreBlueButtonMenuEnhancements class methodsFor: 'copyright'! copyright ^'Copyleft 1999 NISHIHARA Satoshi.'! system ^'Goodies'! version ^'001'! ! !MoreBlueButtonMenuEnhancements class methodsFor: 'class initialization'! induct "MoreBlueButtonMenuEnhancements induct." (ApplicationStandardSystemController new respondsTo: #blueButtonPressedEvent:) ifTrue: [self blueButtonActivityInStandardSystemController30. self blueButtonPressedEventInApplicationStandardSystemController] ifFalse: [self blueButtonActivityInStandardSystemController25]! initialize "MoreBlueButtonMenuEnhancements initialize." "self induct"! install "MoreBlueButtonMenuEnhancements install." | default done process count | Cursor normal show. default := false. done := false. process := [default := Dialog confirm: 'Do you want to enhance the blue button menu?' initialAnswer: default. default ifTrue: [self induct]. done := true] newProcess. process priority: Processor activeProcess priority + 0. process resume. count := 0. [done not and: [count < 10]] whileTrue: [count := count + 1. (Delay forSeconds: 1) wait]. process terminate. done ifFalse: [default ifTrue: [self induct]]! obsolete self uninduct. super obsolete! uninduct "MoreBlueButtonMenuEnhancements uninduct." | aClass aSelector | enhancements notNil ifTrue: [enhancements copy do: [:anArray | aClass := Compiler evaluate: (anArray at: 1) logged: false. aSelector := anArray at: 3. self uninstallEnhanceClass: aClass selector: aSelector]. enhancements := nil]! uninstall "MoreBlueButtonMenuEnhancements uninstall." self uninduct! ! !MoreBlueButtonMenuEnhancements class methodsFor: 'enhancements'! blueButtonActivityInStandardSystemController25 "MoreBlueButtonMenuEnhancements blueButtonActivityInStandardSystemController25." self installEnhanceClassName: #StandardSystemController protocol: 'private' code: 'blueButtonActivity | menu item choice | menu := ScheduledBlueButtonMenu. menu addItemGroup: (Array with: (item := MenuItem labeled: ''inspect'')) values: (Array with: #inspect). [choice := self trackMenu: menu at: self sensor globalCursorPoint centered: false] valueNowOrOnUnwindDo: [menu removeItem: item]. (choice = 0 or: [choice isNil]) ifTrue: [^self]. self perform: choice'! blueButtonActivityInStandardSystemController30 "MoreBlueButtonMenuEnhancements blueButtonActivityInStandardSystemController30." self installEnhanceClassName: #StandardSystemController protocol: 'private' code: 'blueButtonActivity | menu item choice | menu := self scheduledBlueButtonMenu. menu addItemGroup: (Array with: (item := MenuItem labeled: ''inspect'')) values: (Array with: #inspect). [choice := self trackMenu: menu at: self sensor globalCursorPoint centered: false] valueNowOrOnUnwindDo: [menu removeItem: item]. (choice = 0 or: [choice isNil]) ifTrue: [^self]. self perform: choice'! blueButtonPressedEventInApplicationStandardSystemController "MoreBlueButtonMenuEnhancements blueButtonPressedEventInApplicationStandardSystemController." self installEnhanceClassName: #ApplicationStandardSystemController protocol: 'event driven' code: 'blueButtonPressedEvent: event | menu item choice | "we are about to bring up a menu, unlock the event queue so that my window can process exposed and other window events" menu := self scheduledBlueButtonMenu. menu addItemGroup: (Array with: (item := MenuItem labeled: ''inspect'')) values: (Array with: #inspect). self sensor queueLocked: false. [choice := self trackMenu: menu at: event globalPoint centered: false] valueNowOrOnUnwindDo: [menu removeItem: item]. (choice = 0 or: [choice isNil]) ifTrue: [^self]. self perform: choice'! ! !MoreBlueButtonMenuEnhancements class methodsFor: 'saving'! save "MoreBlueButtonMenuEnhancements save." | encodingName fileName classCollection aStream | encodingName := #default. fileName := 'BBMenEn2.st'. classCollection := self saveClasses. aStream := (fileName asFilename withEncoding: encodingName) writeStream. [Cursor write showWhile: [| timeStamp | timeStamp := Date today shortPrintString , ' ' , Time now shortPrintString. aStream cr. aStream nextChunkPut: timeStamp printString. aStream cr; cr. (self comment isNil or: [self comment isEmpty]) ifFalse: [aStream nextChunkPut: self comment printString. aStream cr; cr]. classCollection do: [:aClass | aStream nextChunkPut: aClass definition. aStream cr; cr]. classCollection do: [:aClass | | sourceCodeStream | aStream nextPut: Character newPage. aStream cr. sourceCodeStream := SourceCodeStream on: aStream. aClass fileOutSourceOn: sourceCodeStream. aStream cr]]] valueNowOrOnUnwindDo: [aStream close]. ^classCollection! saveClasses "MoreBlueButtonMenuEnhancements saveClasses." | patternCollection classCollection | patternCollection := #('*BlueButtonMenuEnhancements*'). classCollection := Smalltalk organization superclassOrder: self category. classCollection := classCollection select: [:aClass | | string something | string := aClass name asString. something := patternCollection detect: [:it | it match: string] ifNone: [nil]. something notNil]. ^classCollection! ! !MoreBlueButtonMenuEnhancements class methodsFor: 'private'! installEnhanceClassName: aClassSymbol protocol: aProtocol code: aCode | aClass aSelector anArray oldCode aCategory | aClass := Smalltalk at: aClassSymbol ifAbsent: [nil]. aClass isBehavior ifFalse: [^self]. aSelector := Parser new parseSelector: aCode. aSelector isNil ifTrue: [^self]. enhancements isNil ifTrue: [enhancements := OrderedCollection new]. anArray := enhancements detect: [:array | | bool | bool := aClass name asString = (array at: 1). bool := bool and: [aSelector = (array at: 3)]. bool yourself] ifNone: [nil]. anArray isNil ifTrue: [(aClass includesSelector: aSelector) ifTrue: [oldCode := aClass sourceCodeAt: aSelector. aCategory := aClass organization categoryOfElement: aSelector. aCategory isNil ifTrue: [aCategory := #undefined]] ifFalse: [oldCode := nil. aCategory := aProtocol]. enhancements add: (Array with: aClass name asString with: aCategory asString with: aSelector with: oldCode)]. aClass compile: aCode classified: aProtocol! uninstallEnhanceClass: aClass selector: aSelector | anArray aProtocol oldCode | aClass isBehavior ifFalse: [^self]. (aSelector isKindOf: Symbol) ifFalse: [^self]. enhancements isNil ifTrue: [^self]. anArray := enhancements detect: [:array | | bool | bool := aClass name asString = (array at: 1). bool := bool and: [aSelector = (array at: 3)]. bool yourself] ifNone: [nil]. anArray isNil ifTrue: [^self]. aProtocol := anArray at: 2. oldCode := anArray at: 4. oldCode isNil ifTrue: ["remove method" aClass removeSelector: aSelector] ifFalse: ["restore method" aClass compile: oldCode classified: aProtocol]. enhancements remove: anArray! ! MoreBlueButtonMenuEnhancements initialize!