'From Squeak3.5 of ''11 April 2003'' [latest update: #5180] on 27 April 2003 at 6:13:08 pm'! "Change Set: skin-importer Date: 23 February 2003 Author: Stephan B. Wessels SM Name: Skins II Requires change sets: dialogs, importer-support and xpm-support. DO NOT EDIT THIS PREAMBLE MANUALLY. See ImportedSkin updateChangeSetPreambleForSkinImporter Date Update ------------- ----------------------------------------------------------------------------------- 20-apr-2003 Added prerequisite change set checking to preamble. 13-apr-2003 Factored creation of skin preferences. Added preference to show progress of skin being applied. Changed default preferences for skins. Fill in the blank and simple button morph skinned. 12-apr-2003-5 Show load progress while applying skin. New preference to manage setting of text highlight color. 12-apr-2003-4 Make auto setting of current skin to default to true. Scroll bar colors are set by optional values in theme file. 12-apr-2003-3 Fixed a recursion problem when loading from a project morph. 12-apr-2003-2 Added menu item to explicitly load a desktop background if available in the theme file. When setting text colors is permitted, make the highlight colors correct for the window when it becomes active. Check for undefined highlight colors. 12-apr-2003-1 Generalized the change set preamble maintenance code so that the bug report logic can also identify the versions of the related change sets. 12-apr-2003 Added features to make the project easier to maintain. This includes easier revision history/notes generation and tracking of known bugs. Bug reports via email. Fixed bug where dimensions of menu button was wrong. 10-apr-2003 Changed skin application so that a Preference decides if the latest applied skin becomes the curren skin. Added a menu item to manually set the skin applied to a window as the current skin. 08-apr-2003 First pass at supporting menu background forms. Incomplete. PluggableButtonMorphs in window are controlled by skin with a preference. SimpleButtonMorphs are also skinned. 07-apr-2003 Text pane colors supported (preliminary). Removed special class that was part of enhanced IRC client. Skins preferences added. Former single preference was moved from #windows preference category to new #skins category. Support for theme backgrounds added. Handle tiled backgrounds and centered morphs as backgrounds. Check first for image background, then background color theme setting. 06-apr-2003 Improved border color and window label management. Use assigned skin to set colors for balloon help. Use titlebar text colors for titlebar icons when no icons are specified in original theme. Moved postLoad logic to the class ImportedSkin. NOTE: Themes must be reloaded after change-set install. Clear skin parameters (and postLoad of change-set) also disables the auto-assign skins preference. DNU exceptions disable the auto skin preference first. Better management of themes that remove some key titlebar widgets. Added menu item to preload all themes in a folder. ListBox theme parameters are now applied for skinned windows. Menu titles support added. 05-apr-2003 Better management of overall skins removal. See ImportedSkin class>>clear. Continue to fill in skins parameters from the theme definition files. 04-apr-2003 Improved vertical positioning of string label in window title bar. Improved horizontal position when non-centered. Better handling of window label string when window is resized. Use theme definitions for window border color and size when no themed border frames are specified. Support for list box theme parameters. 03-apr-2003 System Window menu has name of applied theme. Removed unused instance variable from ImportedIceWMSkin. Added support for button colors defined in theme. Added skin menu items to SystemWindow custom morphic menu (red menu) since some themes disable the regular menu in the title bar. Use menu color parameters from the current skin if the automatic preference is true. 02-apr-2003 Initial release. FEATURES: This project is a rewrite of the Skins code written in 1998 for Squeak 2.7. This new version is known to work in Squeak 3.4, 3.5 and 3.6-beta. This new model attempts to accomplish a couple of goals that I saw as defects in the original skins model: - Use ""standard"" theme files from the open source Linux world. - Replace existing morphic components in the skinned window by finding them dynamically, not requiring special subclassed window code. -Provide a way to delete a theme and restore the window to it's original state. Key features include: Standard theme files from Ice Window Manager are supported. See http://themes.freshmeat.net for published theme files that work with Skins II. The standard menu in the System Window is enhanced to provide skins management for the system as well as for only that specific window. SystemWindow custom morphic menu (red menu) supports the same options. This was done because some IceWM theme definitions remove the menu from the window title bar. Parameters are available in the Preferences panel under #skins, providing explicit controls over elements that are active in a skinned window. The window title bar is skinned. The contents of list boxes is skinned. Pluggable buttons are skinned. Alignment panes and text panes are skinned. The World desktop can be defined by the skin. Menus are skinned. Balloon help is skinned. KNOWN BUGS: decorated buttons do not undecorate correctly same is true for removal of skin, decorated buttons remain skinned. color of text selection should be reset for each front-most window theme. Still broken. Related is that the current skin defines other behavior and the current should be reset each time another window is put in front. spacing gap with Notif2 on right side buttons " | prereqSMName continue cs prereqCSName prereqRevDateRqd | prereqCSName _ 'Dialogs-sbw'. prereqSMName _ 'FileList2 Dialogs Enhancement'. prereqRevDateRqd _ '15-apr-2003' asDate. continue _ (ChangeSorter respondsTo: #assurePrerequisiteChangeSetNamed:withSqueakMapName:revisionDate:) ifTrue: [ChangeSorter assurePrerequisiteChangeSetNamed: prereqCSName withSqueakMapName: prereqSMName revisionDate: prereqRevDateRqd] ifFalse: [cs _ ChangeSorter changeSetNamed: prereqCSName. cs isNil ifTrue: [(Object confirm: 'The package "' , prereqSMName , '" is not installed in your image. Do you want me to install it for you?. Please note that "' , prereqSMName , '" is required for the package you are about to install.') and: []. (Smalltalk at: #SMSqueakMap ifAbsent: []) ifNil: [Object error: 'You don''t have installed Squeakmap in your image']. Utilities informUser: 'Installing "' , prereqSMName , '"...' during: [(Smalltalk at: #SMSqueakMap) default installPackageNamed: prereqSMName]. true] ifFalse: [true]]. continue ifFalse: [Object error: 'Unable to load prerequisite package.']. prereqCSName _ 'importer-support'. prereqSMName _ 'Skins Importer Support'. prereqRevDateRqd _ '12-apr-2003' asDate. continue _ (ChangeSorter respondsTo: #assurePrerequisiteChangeSetNamed:withSqueakMapName:revisionDate:) ifTrue: [ChangeSorter assurePrerequisiteChangeSetNamed: prereqCSName withSqueakMapName: prereqSMName revisionDate: prereqRevDateRqd] ifFalse: [cs _ ChangeSorter changeSetNamed: prereqCSName. cs isNil ifTrue: [(Object confirm: 'The package "' , prereqSMName , '" is not installed in your image. Do you want me to install it for you?. Please note that "' , prereqSMName , '" is required for the package you are about to install.') and: []. (Smalltalk at: #SMSqueakMap ifAbsent: []) ifNil: [Object error: 'You don''t have installed Squeakmap in your image']. Utilities informUser: 'Installing "' , prereqSMName , '"...' during: [(Smalltalk at: #SMSqueakMap) default installPackageNamed: prereqSMName]. true] ifFalse: [true]]. continue ifFalse: [Object error: 'Unable to load prerequisite package.']. prereqCSName _ 'xpm-support'. prereqSMName _ 'XPM Support'. prereqRevDateRqd _ '08-apr-2003' asDate. continue _ (ChangeSorter respondsTo: #assurePrerequisiteChangeSetNamed:withSqueakMapName:revisionDate:) ifTrue: [ChangeSorter assurePrerequisiteChangeSetNamed: prereqCSName withSqueakMapName: prereqSMName revisionDate: prereqRevDateRqd] ifFalse: [cs _ ChangeSorter changeSetNamed: prereqCSName. cs isNil ifTrue: [(Object confirm: 'The package "' , prereqSMName , '" is not installed in your image. Do you want me to install it for you?. Please note that "' , prereqSMName , '" is required for the package you are about to install.') and: []. (Smalltalk at: #SMSqueakMap ifAbsent: []) ifNil: [Object error: 'You don''t have installed Squeakmap in your image']. Utilities informUser: 'Installing "' , prereqSMName , '"...' during: [(Smalltalk at: #SMSqueakMap) default installPackageNamed: prereqSMName]. true] ifFalse: [true]]. continue ifFalse: [Object error: 'Unable to load prerequisite package.']. ! Object subclass: #ImportedSkin instanceVariableNames: 'directory ' classVariableNames: 'Current SkinForms SkinParameters ' poolDictionaries: '' category: 'Skins-Support'! ImportedSkin subclass: #ImportedIceWMSkin instanceVariableNames: 'folderName ' classVariableNames: '' poolDictionaries: '' category: 'Skins-Support'! !ImportedIceWMSkin commentStamp: 'sbw 3/7/2003 20:15' prior: 0! 18k Centered: false Buttons Left: Buttons Right: Buttons Supported: xmirshd 708090-1.1 Centered: false Buttons Left: Buttons Right: Buttons Supported: xmir Absolute_I Centered: false Buttons Left: Buttons Right: xmi Buttons Supported: AbsoluteBlue Centered: true Buttons Left: Buttons Right: Buttons Supported: aesthete Centered: true Buttons Left: shr Buttons Right: xmi Buttons Supported: xmishr aeteria Centered: true Buttons Left: x Buttons Right: mi Buttons Supported: xmir aquablue Centered: false Buttons Left: x Buttons Right: s Buttons Supported: xmsir Athens Centered: false Buttons Left: Buttons Right: Buttons Supported: axxlite Centered: false Buttons Left: ir Buttons Right: xm Buttons Supported: xmir Beamer Centered: true Buttons Left: sr Buttons Right: xmi Buttons Supported: xmirs blueCrux Centered: false Buttons Left: s Buttons Right: xmi Buttons Supported: xmisrhd BlueSteelSlim Centered: false Buttons Left: x Buttons Right: smi Buttons Supported: xmis Breaker51 Centered: false Buttons Left: s Buttons Right: ximr Buttons Supported: ximrs BrushedMetal Centered: false Buttons Left: s Buttons Right: xmi Buttons Supported: chui Centered: false Buttons Left: Buttons Right: Buttons Supported: xmirsh Deathray Centered: false Buttons Left: Buttons Right: Buttons Supported: xmirhs E15 Centered: false Buttons Left: Buttons Right: Buttons Supported: Eazel Centered: true Buttons Left: Buttons Right: Buttons Supported: xmisrhd flourineDreams Centered: false Buttons Left: Buttons Right: Buttons Supported: Helix Centered: true Buttons Left: s Buttons Right: xmi Buttons Supported: liQuid Centered: false Buttons Left: Buttons Right: Buttons Supported: xmirsh MajesticOS12 Centered: true Buttons Left: i Buttons Right: x Buttons Supported: NeXT Centered: true Buttons Left: i Buttons Right: x Buttons Supported: PHOENIX Centered: true Buttons Left: shd Buttons Right: xmir Buttons Supported: xmirhsd shade3D Centered: false Buttons Left: Buttons Right: Buttons Supported: sortofaqua Centered: true Buttons Left: xim Buttons Right: r Buttons Supported: xmir Stone Centered: false Buttons Left: Buttons Right: Buttons Supported: xmihsr Thane Centered: false Buttons Left: s Buttons Right: xmi Buttons Supported: Urbicande Centered: true Buttons Left: Buttons Right: Buttons Supported: sxmir Whistling Centered: false Buttons Left: s Buttons Right: xmi Buttons Supported: sxim woodit Centered: false Buttons Left: s Buttons Right: xmi Buttons Supported: xmis xp-new Centered: false Buttons Left: Buttons Right: Buttons Supported: xrmis Title Buttons Supported Chars: dhimrsx d = ??? (used in PHOENIX) h = handle activate? (used in aesthete) i = iconize m = maximize r = roll up/down s = graphic x = close button ! Object subclass: #SkinApplicator instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Skins-Support'! SkinApplicator subclass: #IceWMSkinApplicator instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Skins-Support'! IconicButton subclass: #SkinnedIconicButton instanceVariableNames: 'activeForm inactiveForm altActiveForm altInactiveForm useAlt ' classVariableNames: '' poolDictionaries: '' category: 'Morphic-Widgets'! !ProtoObject methodsFor: 'system primitives' stamp: 'sbw 4/6/2003 12:25'! doesNotUnderstand: aMessage Preferences disable: #automaticApplicationOfSkins. (MessageNotUnderstood new message: aMessage) signal! ! !Object methodsFor: 'error handling' stamp: 'sbw 4/6/2003 12:12'! doesNotUnderstand: aMessage "Handle the fact that there was an attempt to send the given message to the receiver but the receiver does not understand this message (typically sent from the machine when a message is sent to the receiver and no method is defined for that selector)." "Testing: (3 activeProcess)" (Preferences autoAccessors and: [self tryToDefineVariableAccess: aMessage]) ifTrue: [^ aMessage sentTo: self]. Preferences disable: #automaticApplicationOfSkins. MessageNotUnderstood new message: aMessage; signal. ^ aMessage sentTo: self! ! !Object methodsFor: 'skins' stamp: 'sbw 4/3/2003 21:15'! skinToUse "Answers a skin or nil." | skin | Preferences automaticApplicationOfSkins ifTrue: [skin _ ImportedSkin current. skin isNil ifFalse: [skin isValid ifTrue: [^skin]]]. ^ nil! ! !CodeHolder methodsFor: 'controls' stamp: 'sbw 4/9/2003 12:17'! decorateForInheritance "Check to see if the currently-viewed method has a super send or an override, and if so, change screen feedback, unless the #decorateBrowserButtons says not to." | aColor aButton skin useSkin defaultColor selectedOnColor selectedOffColor strMorph decorated | (aButton _ self inheritanceButton) ifNil: [^ self]. skin _ self skinToUse. useSkin _ skin isNil not and: [Preferences skinButtons]. useSkin _ useSkin and: [selectedOnColor _ skin colorActiveButton. selectedOffColor _ skin colorNormalButton. selectedOnColor isNil not and: [selectedOffColor isNil not]]. defaultColor _ useSkin ifTrue: [aButton getModelState ifTrue: [selectedOnColor] ifFalse: [selectedOffColor]] ifFalse: [Color transparent]. decorated _ false. aColor _ ((currentCompiledMethod isKindOf: CompiledMethod) not or: [Preferences decorateBrowserButtons not]) ifTrue: [defaultColor] ifFalse: [decorated _ true. currentCompiledMethod sendsToSuper ifTrue: [self isThereAnOverride ifTrue: [Color blue muchLighter] ifFalse: [Color green muchLighter]] ifFalse: [self isThereAnOverride ifTrue: [Color tan lighter] ifFalse: [decorated _ false. defaultColor]]]. aButton offColor: aColor. strMorph _ aButton allMorphs detect: [:m | m isKindOf: StringMorph] ifNone: []. strMorph isNil ifFalse: [ decorated ifTrue: [strMorph color: Color black] ]! ! !Error methodsFor: 'exceptionDescription' stamp: 'sbw 4/6/2003 12:30'! defaultAction "The current computation is terminated. The cause of the error should be logged or reported to the user. If the program is operating in an interactive debugging environment the computation should be suspended and the debugger activated." Preferences disable: #automaticApplicationOfSkins. self isDevelopmentEnvironmentPresent ifTrue: [self devDefaultAction] ifFalse: [self runtimeDefaultAction]! ! !Form methodsFor: '*patternLoader' stamp: 'sbw 11/16/2002 11:24'! scaledToSizeUsingMaximum: newExtent | scale | newExtent = self extent ifTrue: [^ self]. scale _ newExtent x / self width max: newExtent y / self height. ^ self magnify: self boundingBox by: scale smoothing: 2! ! !Form class methodsFor: '*patternLoader' stamp: 'sbw 11/22/2002 16:52'! openImageCenteredOnBackground: image | sketch previous | sketch _ SketchMorph withForm: image. sketch setToAdhereToEdge: #center; name: 'worldBackgroundImage'; lock. previous _ self currentWorld submorphNamed: 'worldBackgroundImage'. previous isNil ifFalse: [previous delete]. sketch openInWorld. sketch goBehind! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 4/7/2003 19:52'! applyBackgroundImage ^self! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 4/7/2003 22:33'! applyBackgroundImage: aForm | previous | aForm isNil ifFalse: [World extent x / aForm extent x asFloat > 1.4 ifTrue: [previous _ World submorphNamed: 'worldBackgroundImage'. previous isNil ifFalse: [previous delete]. aForm setAsBackground] ifFalse: [Form openImageCenteredOnBackground: (aForm scaledToSizeUsingMaximum: self currentWorld extent)]]! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 4/1/2003 12:46'! createSkinHolders self class allSkinForms at: self internalSkinName put: Dictionary new. self class allSkinParameters at: self internalSkinName put: Dictionary new.! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 4/1/2003 07:41'! defineSkinForm: aForm at: aKey self skinForms at: aKey put: aForm! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 4/1/2003 18:15'! defineSkinParameters: aDict self isSkinLoaded ifFalse: [self createSkinHolders]. self class allSkinParameters at: self internalSkinName put: aDict! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 3/8/2003 11:35'! directory ^directory! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 3/8/2003 11:38'! directory: aDirectory directory _ aDirectory! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 4/1/2003 07:38'! folderName ^''! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 3/5/2003 20:12'! initialize ^ self! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 4/1/2003 18:34'! internalSkinName | stream tag | stream _ WriteStream on: ''. tag _ self class name. stream nextPutAll: tag. tag _ self folderName. tag isEmpty ifFalse: [stream nextPut: $.; nextPutAll: tag]. ^ stream contents! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 4/7/2003 20:20'! isBackgroundAlreadyLoaded (self class allSkinParameters includesKey: #backgroundAlreadyLoaded) ifFalse: [^ false]. ^ (self class allSkinParameters at: #backgroundAlreadyLoaded) = self internalSkinName! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 4/1/2003 12:26'! isSkinLoaded ^self class allSkinForms includesKey: self internalSkinName! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 4/3/2003 21:13'! isValid ^false! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 4/10/2003 20:12'! makeSkinCurrent self class current: self! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 4/12/2003 08:52'! reportABug self class reportABugForSkin: self! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 4/12/2003 15:50'! restoreOriginalTextPaneColors | dict | (self class allSkinParameters includesKey: #originalTextPaneColors) ifFalse: [^ nil]. dict _ self class allSkinParameters at: #originalTextPaneColors. Preferences textHighlightColor: (dict at: #textHighlightColor:). Preferences insertionPointColor: (dict at: #insertionPointColor:)! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 4/12/2003 15:50'! restoreOriginalTextPaneColorsPermanent self restoreOriginalTextPaneColors isNil ifFalse: [ self class allSkinParameters removeKey: #originalTextPaneColors]! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 4/6/2003 22:07'! saveOriginalTextPaneColors | dict | (self class allSkinParameters includesKey: #originalTextPaneColors) ifTrue: [^ self]. dict _ Dictionary new. dict at: #textHighlightColor: put: Preferences textHighlightColor copy. dict at: #insertionPointColor: put: Preferences insertionPointColor copy. self class allSkinParameters at: #originalTextPaneColors put: dict! ]style[(26 3 5 5 4 38 23 15 4 4 4 3 10 7 4 5 20 6 11 27 4 5 21 6 11 28 4 29 23 6 4)f1b,f1,f1cblue;i,f1,f1cmagenta;,f1,f1c000148000,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1c000148000,f1,f1cmagenta;,f1,f1cblue;i,f1,f1c000148000,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1c000148000,f1,f1cblue;i! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 4/7/2003 20:21'! setBackgroundAlreadyLoaded self class allSkinParameters at: #backgroundAlreadyLoaded put: self internalSkinName! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 4/1/2003 07:38'! skinDescription ^''! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 4/1/2003 12:43'! skinForms self isSkinLoaded ifFalse: [self createSkinHolders]. ^ self class allSkinForms at: self internalSkinName! ! !ImportedSkin methodsFor: 'as yet unclassified' stamp: 'sbw 4/12/2003 18:03'! skinParameters ^ self class allSkinParameters at: self internalSkinName ifAbsent: [Dictionary new]! ! !ImportedIceWMSkin methodsFor: 'diagnostics' stamp: 'sbw 3/18/2003 18:01'! drawAllSkinFormsOnDisplay "ImportedSkin current drawAllSkinFormsOnDisplay" | form form2 | ' ' , self skinDescription , ' ' displayAt: 0 @ 0. form _ self drawWindowWidgetsOnDisplayAt: 0 @ 16. form2 _ self drawTitleBarFormsOnDisplayAt: form width + 10 @ 16. ^self drawBorderFormsOnDisplayAt: (form width + 10)@(form2 height + 10 + 16)! ! !ImportedIceWMSkin methodsFor: 'diagnostics' stamp: 'sbw 3/18/2003 17:39'! drawBorderFormsOnDisplay "ImportedSkin current drawBorderFormsOnDisplay" ^ self drawBorderFormsOnDisplayAt: 0 @ 0! ! !ImportedIceWMSkin methodsFor: 'diagnostics' stamp: 'sbw 3/18/2003 17:57'! drawBorderFormsOnDisplayAt: aPoint "ImportedSkin current drawBorderFormsOnDisplay" | forms dims activeSymbols rowsList actualSymbol form extent backForm pad posn height max | self hasCorners ifFalse: [^ nil]. forms _ Dictionary new. dims _ Dictionary new. pad _ 6 @ 6. max _ 0@0. posn _ pad copy. activeSymbols _ #(#A #I ). rowsList _ #(#(#formFrameTL #formFrameT #formFrameTR) #(#formFrameL #formFrameR) #(#formFrameBL #formFrameB #formFrameBR) ). activeSymbols do: [:activeSymbol | rowsList do: [:row | height _ 0. row do: [:truncatedSymbol | actualSymbol _ (truncatedSymbol , activeSymbol) asSymbol. form _ self perform: actualSymbol. form isNil ifTrue: [^ nil]. height _ height max: form height. forms at: actualSymbol put: form. dims at: actualSymbol put: posn. posn _ posn + (form width + pad x @ 0). max _ (max x max: posn x)@(max y)]. posn _ pad x @ (posn y + pad y + height). max _ (max x)@(max y max: posn y)]]. extent _ max + pad. backForm _ Form extent: extent depth: Display depth. backForm fillColor: Color white. forms keysDo: [:each | posn _ dims at: each. form _ forms at: each. form displayOn: backForm at: posn]. ^ backForm displayAt: aPoint! ! !ImportedIceWMSkin methodsFor: 'diagnostics' stamp: 'sbw 3/16/2003 10:28'! drawTitleBarFormsOnDisplay "ImportedSkin current drawTitleBarFormsOnDisplay" ^self drawTitleBarFormsOnDisplayAt: 0 @ 0! ! !ImportedIceWMSkin methodsFor: 'diagnostics' stamp: 'sbw 3/16/2003 10:25'! drawTitleBarFormsOnDisplayAt: aPoint "ImportedSkin current drawTitleBarFormsOnDisplay" "AL (AS) AP (AT) AM (AB) AR" "IL (IS) IP (IT) IM (IB) IR" | yPos activeFormSelectors inactiveFormSelectors form extent max tall forms string backForm | yPos _ 10. activeFormSelectors _ #(#formAL #formAS #formAP #formAT #formAM #formAB #formAR ). inactiveFormSelectors _ #(#formIL #formIS #formIP #formIT #formIM #formIB #formIR ). max _ 0. tall _ 0. forms _ Dictionary new. 1 to: activeFormSelectors size do: [:index | form _ self perform: (activeFormSelectors at: index). form isNil ifFalse: [forms at: (activeFormSelectors at: index) put: form. max _ max max: form width. tall _ tall max: form height]. form _ self perform: (inactiveFormSelectors at: index). form isNil ifFalse: [forms at: (inactiveFormSelectors at: index) put: form. max _ max max: form width. tall _ tall max: form height]]. tall _ tall + 4. extent _ 30 + (2 * max) + 20 @ (10 + yPos + (activeFormSelectors size * tall)). backForm _ Form extent: extent depth: Display depth. backForm fillColor: Color white. 1 to: activeFormSelectors size do: [:index | form _ forms at: (activeFormSelectors at: index) ifAbsent: []. form isNil ifFalse: [form displayOn: backForm at: 10 @ yPos]. form _ forms at: (inactiveFormSelectors at: index) ifAbsent: []. form isNil ifFalse: [form displayOn: backForm at: 20 + max @ yPos]. string _ (activeFormSelectors at: index) asString. (string copyFrom: 6 to: string size) displayOn: backForm at: 34 + (2 * max) @ yPos. yPos _ yPos + tall]. ^backForm displayAt: aPoint! ! !ImportedIceWMSkin methodsFor: 'diagnostics' stamp: 'sbw 3/16/2003 10:28'! drawWindowWidgetsOnDisplay "ImportedSkin current drawWindowWidgetsOnDisplay" ^self drawWindowWidgetsOnDisplayAt: 10 @ 10! ! !ImportedIceWMSkin methodsFor: 'diagnostics' stamp: 'sbw 3/16/2003 10:27'! drawWindowWidgetsOnDisplayAt: aPoint "ImportedSkin current drawWindowWidgetsOnDisplay" | yPos activeFormSelectors inactiveFormSelectors form extent max forms string tall backForm | yPos _ 10. activeFormSelectors _ #(#formAClose #formAMenu #formAMaximum #formAMinimize #formAHide #formARestore #formARollDown #formARollUp ). inactiveFormSelectors _ #(#formIClose #formIMenu #formIMaximum #formIMinimize #formIHide #formIRestore #formIRollDown #formIRollUp ). max _ 0. tall _ 0. forms _ Dictionary new. 1 to: activeFormSelectors size do: [:index | form _ self perform: (activeFormSelectors at: index). form isNil ifFalse: [forms at: (activeFormSelectors at: index) put: form. max _ max max: form width. tall _ tall max: form height]. form _ self perform: (inactiveFormSelectors at: index). form isNil ifFalse: [forms at: (inactiveFormSelectors at: index) put: form. max _ max max: form width. tall _ tall max: form height]]. tall _ tall + 4. extent _ 30 + (2 * max) + 65 @ (10 + yPos + (activeFormSelectors size * tall)). backForm _ Form extent: extent depth: Display depth. backForm fillColor: Color white. 1 to: activeFormSelectors size do: [:index | form _ forms at: (activeFormSelectors at: index) ifAbsent: []. form isNil ifFalse: [form displayOn: backForm at: 10 @ yPos]. form _ forms at: (inactiveFormSelectors at: index) ifAbsent: []. form isNil ifFalse: [form displayOn: backForm at: 20 + max @ yPos]. string _ (activeFormSelectors at: index) asString. (string copyFrom: 6 to: string size) displayOn: backForm at: 34 + (2 * max) @ yPos. yPos _ yPos + tall]. ^ backForm displayAt: aPoint! ! !ImportedIceWMSkin methodsFor: 'diagnostics' stamp: 'sbw 3/17/2003 12:41'! skinErrorFound: aString ! ! !ImportedIceWMSkin methodsFor: 'accessing' stamp: 'sbw 3/6/2003 13:06'! folderName ^folderName ifNil: ['']! ! !ImportedIceWMSkin methodsFor: 'accessing' stamp: 'sbw 3/6/2003 13:06'! folderName: aString folderName _ aString! ! !ImportedIceWMSkin methodsFor: 'accessing' stamp: 'sbw 4/3/2003 21:13'! isValid ^true! ! !ImportedIceWMSkin methodsFor: 'accessing' stamp: 'sbw 4/1/2003 18:24'! parameters ^self skinParameters! ! !ImportedIceWMSkin methodsFor: 'parameters-backgrounds' stamp: 'sbw 4/7/2003 22:57'! applyBackgroundColor | colorChoice previous | colorChoice _ self colorDesktopBackground. colorChoice isNil ifTrue: [^ self]. previous _ World submorphNamed: 'worldBackgroundImage'. previous isNil ifFalse: [previous delete]. World color: colorChoice! ! !ImportedIceWMSkin methodsFor: 'parameters-backgrounds' stamp: 'sbw 4/12/2003 15:31'! applyBackgroundImage Preferences skinBackground ifFalse: [^ self]. self isBackgroundAlreadyLoaded ifTrue: [^ self]. self applyBackgroundImageFromFile isNil ifTrue: [self applyBackgroundColor]! ! !ImportedIceWMSkin methodsFor: 'parameters-backgrounds' stamp: 'sbw 4/12/2003 15:31'! applyBackgroundImageFromFile | fName | fName _ self desktopBackgroundImage. fName isNil ifTrue: [^ nil]. ^self applyBackgroundImageFromFileNamed: fName! ! !ImportedIceWMSkin methodsFor: 'parameters-backgrounds' stamp: 'sbw 4/12/2003 15:32'! applyBackgroundImageFromFileNamed: fName | path form | self directory isNil ifTrue: [^ nil]. (self directory fileExists: fName) ifFalse: [^ nil]. path _ self directory fullNameFor: fName. form _ Form fromFileNamed: path. self applyBackgroundImage: form. self setBackgroundAlreadyLoaded! ! !ImportedIceWMSkin methodsFor: 'parameters-backgrounds' stamp: 'sbw 4/7/2003 22:52'! colorDesktopBackground ^ self parameters at: 'DesktopBackgroundColor' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-backgrounds' stamp: 'sbw 4/5/2003 06:01'! colorDialog ^ self parameters at: 'ColorDialog' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-backgrounds' stamp: 'sbw 4/5/2003 06:02'! colorInput ^ self parameters at: 'ColorInput' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-backgrounds' stamp: 'sbw 4/6/2003 19:35'! colorInputSelection ^ self parameters at: 'ColorInputSelection' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-backgrounds' stamp: 'sbw 4/6/2003 19:36'! colorInputSelectionText ^ self parameters at: 'ColorInputSelectionText' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-backgrounds' stamp: 'sbw 4/5/2003 06:03'! colorInputText ^ self parameters at: 'ColorInputText' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-backgrounds' stamp: 'sbw 4/5/2003 06:04'! colorLabel ^ self parameters at: 'ColorLabel' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-backgrounds' stamp: 'sbw 4/5/2003 06:05'! colorLabelText ^ self parameters at: 'ColorLabelText' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-backgrounds' stamp: 'sbw 4/5/2003 06:05'! colorToolTip ^ self parameters at: 'ColorToolTip' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-backgrounds' stamp: 'sbw 4/5/2003 06:05'! colorToolTipText ^ self parameters at: 'ColorToolTipText' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-backgrounds' stamp: 'sbw 4/7/2003 22:21'! desktopBackgroundCenter ^ self parameters at: 'DesktopBackgroundCenter' ifAbsent: [0]! ! !ImportedIceWMSkin methodsFor: 'parameters-backgrounds' stamp: 'sbw 4/7/2003 19:54'! desktopBackgroundImage ^ self parameters at: 'DesktopBackgroundImage' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-backgrounds' stamp: 'sbw 4/12/2003 15:33'! hasBackgroundImage | fName | fName _ self desktopBackgroundImage. fName isNil ifTrue: [^false]. self directory isNil ifTrue: [^ false]. (self directory fileExists: fName) ifFalse: [^ false]. ^ true! ! !ImportedIceWMSkin methodsFor: 'parameters-backgrounds' stamp: 'sbw 4/7/2003 22:21'! isDesktopBackgroundCentered ^self desktopBackgroundCenter = 1! ! !ImportedIceWMSkin methodsFor: 'parameters-border sizes' stamp: 'sbw 3/18/2003 15:15'! borderSizeX ^ self parameters at: 'BorderSizeX' ifAbsent: [0]! ! !ImportedIceWMSkin methodsFor: 'parameters-border sizes' stamp: 'sbw 3/18/2003 15:15'! borderSizeY ^ self parameters at: 'BorderSizeY' ifAbsent: [0]! ! !ImportedIceWMSkin methodsFor: 'parameters-border sizes' stamp: 'sbw 4/4/2003 20:01'! colorActiveBorder ^ self parameters at: 'ColorActiveBorder' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-border sizes' stamp: 'sbw 4/4/2003 20:02'! colorNormalBorder ^ self parameters at: 'ColorNormalBorder' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-border sizes' stamp: 'sbw 3/18/2003 15:32'! cornerSizeX ^ self parameters at: 'CornerSizeX' ifAbsent: [0]! ! !ImportedIceWMSkin methodsFor: 'parameters-border sizes' stamp: 'sbw 3/18/2003 15:32'! cornerSizeY ^ self parameters at: 'CornerSizeY' ifAbsent: [0]! ! !ImportedIceWMSkin methodsFor: 'parameters-border sizes' stamp: 'sbw 4/5/2003 06:06'! dlgBorderSizeX ^ self parameters at: 'DlgBorderSizeX' ifAbsent: [0]! ! !ImportedIceWMSkin methodsFor: 'parameters-border sizes' stamp: 'sbw 4/5/2003 06:06'! dlgBorderSizeY ^ self parameters at: 'DlgBorderSizeY' ifAbsent: [0]! ! !ImportedIceWMSkin methodsFor: 'parameters-button' stamp: 'sbw 4/3/2003 07:08'! colorActiveButton ^ self parameters at: 'ColorActiveButton' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-button' stamp: 'sbw 4/3/2003 07:09'! colorActiveButtonText ^ self parameters at: 'ColorActiveButtonText' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-button' stamp: 'sbw 4/3/2003 07:09'! colorNormalButton ^ self parameters at: 'ColorNormalButton' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-button' stamp: 'sbw 4/3/2003 07:10'! colorNormalButtonText ^ self parameters at: 'ColorNormalButtonText' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-list box' stamp: 'sbw 4/6/2003 15:09'! colorListBox ^ self parameters at: 'ColorListBox' ifAbsent: [Color white]! ! !ImportedIceWMSkin methodsFor: 'parameters-list box' stamp: 'sbw 4/6/2003 15:09'! colorListBoxSelection ^ self parameters at: 'ColorListBoxSelection' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-list box' stamp: 'sbw 4/6/2003 12:48'! colorListBoxSelectionText ^ self parameters at: 'ColorListBoxSelectionText' ifAbsent: [Color red]! ! !ImportedIceWMSkin methodsFor: 'parameters-list box' stamp: 'sbw 4/6/2003 12:48'! colorListBoxText ^ self parameters at: 'ColorListBoxText' ifAbsent: [Color black]! ! !ImportedIceWMSkin methodsFor: 'parameters-menu' stamp: 'sbw 4/3/2003 12:11'! colorActiveMenuItem ^ self parameters at: 'ColorActiveMenuItem' ifAbsent: [nil]! ! !ImportedIceWMSkin methodsFor: 'parameters-menu' stamp: 'sbw 4/3/2003 12:11'! colorActiveMenuItemText ^ self parameters at: 'ColorActiveMenuItemText' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-menu' stamp: 'sbw 4/3/2003 12:13'! colorDisabledMenuItemText ^ self parameters at: 'ColorDisabledMenuItemText' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-menu' stamp: 'sbw 4/3/2003 12:12'! colorNormalMenu ^ self parameters at: 'ColorNormalMenu' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-menu' stamp: 'sbw 4/3/2003 12:12'! colorNormalMenuItemText ^ self parameters at: 'ColorNormalMenuItemText' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-menu' stamp: 'sbw 4/8/2003 19:01'! hasMenuForm ^self menuBackgroundForm isNil not! ! !ImportedIceWMSkin methodsFor: 'parameters-menu' stamp: 'sbw 4/8/2003 19:01'! menuBackgroundForm ^ self skinForms at: #menuBackground ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-meta' stamp: 'sbw 3/5/2003 23:26'! look ^ self parameters at: 'Look'! ! !ImportedIceWMSkin methodsFor: 'parameters-meta' stamp: 'sbw 3/5/2003 23:26'! skinAuthor ^ self parameters at: 'ThemeAuthor'! ! !ImportedIceWMSkin methodsFor: 'parameters-meta' stamp: 'sbw 3/6/2003 13:05'! skinDescription ^ self parameters at: 'ThemeDescription' ifAbsent: ['']! ! !ImportedIceWMSkin methodsFor: 'parameters-scroll bar' stamp: 'sbw 4/5/2003 06:07'! colorScrollBar ^ self parameters at: 'ColorScrollBar' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-scroll bar' stamp: 'sbw 4/5/2003 06:08'! colorScrollBarButton ^ self parameters at: 'ColorScrollBarButton' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-scroll bar' stamp: 'sbw 4/5/2003 06:08'! colorScrollBarButtonArrow ^ self parameters at: 'ColorScrollBarArrow' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'parameters-scroll bar' stamp: 'sbw 4/5/2003 06:08'! colorScrollBarSlider ^ self parameters at: 'ColorScrollBarSlider' ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 3/10/2003 19:41'! activeTitleBarFormToFit: width titleStringMorph: aStringMorph ^ self titleBarFormToFit: width titleStringMorph: aStringMorph active: true! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 3/10/2003 20:21'! addLeftEdgeTitleBarFormTo: result active: activeFlag | formL | formL _ activeFlag ifTrue: [self formAL] ifFalse: [self formIL]. formL isNil ifFalse: [formL displayOn: result at: 0 @ 0]. ! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 3/16/2003 21:45'! addLeftOfTitleBarFormTo: result titleStringMorph: aStringMorph active: activeFlag "AL (AS) AP (AT) AM (AB) AR" | formL startPos titleWidth endPos formP demandWidth formS repeatCount realWidth | realWidth _ result width. startPos _ 0. formL _ activeFlag ifTrue: [self formAL] ifFalse: [self formIL]. formL isNil ifFalse: [startPos _ formL width]. formP _ activeFlag ifTrue: [self formAP] ifFalse: [self formIP]. self titleBarCentered ifTrue: [titleWidth _ aStringMorph width. endPos _ (realWidth - titleWidth) // 2. formP isNil ifFalse: [endPos _ endPos - formP width]. demandWidth _ endPos - startPos. formS _ activeFlag ifTrue: [self formAS] ifFalse: [self formIS]. formS isNil ifFalse: [demandWidth > 0 ifTrue: [repeatCount _ demandWidth // formS width. repeatCount timesRepeat: [formS displayOn: result at: startPos @ 0. startPos _ startPos + formS width]. formS displayOn: result at: (endPos - formS width)@0]]. formP isNil ifFalse: [formP displayOn: result at: endPos @ 0]] ifFalse: [formP isNil ifFalse: [formP displayOn: result at: startPos @ 0]]! ]style[(25 6 19 12 9 10 3 28 3 79 4 9 3 6 9 8 3 1 3 5 3 10 14 4 23 4 11 5 19 8 3 5 10 5 3 10 14 4 23 4 11 4 29 10 3 12 11 6 4 9 3 11 4 1 5 5 21 6 3 6 3 5 12 11 3 6 3 8 5 5 3 10 16 4 25 4 13 5 21 11 3 1 16 11 3 11 4 5 15 11 24 5 12 6 5 8 3 1 11 8 3 8 3 5 75 5 21 5 12 6 5 6 3 1 15 5 21 5 12 6 5 8 3 1 2)f1b,f1cblue;b,f1b,f1cblue;b,f1b,f1cblue;b,f1,f1c148046000i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1c000184027,f1,f1cblue;i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1c000184027,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cblue;i,f1,f1c000184027,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1c000184027,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1c000184027,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1c000184027,f1! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 3/16/2003 15:37'! addRightEdgeTitleBarFormTo: result active: activeFlag | formR offset realWidth | realWidth _ result width. formR _ activeFlag ifTrue: [self formAR] ifFalse: [self formIR]. formR isNil ifFalse: [offset _ realWidth - formR width. formR displayOn: result at: offset @ 0]! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 3/16/2003 15:38'! addRightOfTitleBarFormTo: result titleStringMorph: aStringMorph active: activeFlag "AL (AS) AP (AT) AM (AB) AR" | titleWidth startPos formR endPos formM demandWidth formB offset repeatCount formL formP realWidth | realWidth _ result width. titleWidth _ aStringMorph width. self titleBarCentered ifTrue: [startPos _ realWidth + titleWidth // 2] ifFalse: [startPos _ titleWidth. formL _ activeFlag ifTrue: [self formAL] ifFalse: [self formIL]. formL isNil ifFalse: [startPos _ startPos + formL width]. formP _ activeFlag ifTrue: [self formAP] ifFalse: [self formIP]. formP isNil ifFalse: [startPos _ startPos + formP width]]. formR _ activeFlag ifTrue: [self formAR] ifFalse: [self formIR]. endPos _ formR isNil ifTrue: [realWidth] ifFalse: [realWidth - formR width]. formM _ activeFlag ifTrue: [self formAM] ifFalse: [self formIM]. formM isNil ifFalse: [startPos _ startPos + formM width]. demandWidth _ endPos - startPos. formB _ activeFlag ifTrue: [self formAB] ifFalse: [self formIB]. formB isNil ifFalse: [demandWidth > 0 ifTrue: [offset _ startPos copy. repeatCount _ demandWidth // formB width. repeatCount + 1 timesRepeat: [formB displayOn: result at: offset @ 0. offset _ offset + formB width]]]. formM isNil ifFalse: [formM displayOn: result at: startPos @ 0]! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 3/16/2003 08:34'! createFullWidthBackTitleBarFormToFit: width titleStringMorph: aStringMorph active: activeFlag | formT result fillCount offset realWidth | realWidth _ width. formT _ activeFlag ifTrue: [self formAT] ifFalse: [self formIT]. formT isNil ifTrue: [result _ Form extent: realWidth @ self titleBarHeight depth: Display depth. result fillColor: self colorNormalTitleBar] ifFalse: [result _ Form extent: realWidth @ self titleBarHeight depth: formT depth. result fillColor: Color transparent. fillCount _ realWidth // formT width. offset _ 0. fillCount timesRepeat: [formT displayOn: result at: offset @ 0. offset _ offset + formT width]. offset _ realWidth - formT width. formT displayOn: result at: offset @ 0]. ^ result! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 4/1/2003 07:26'! formAB ^ self skinForms at: #titleBarActiveRightRepeat ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 4/1/2003 07:26'! formAL ^ self skinForms at: #titleBarActiveLeft ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 4/1/2003 07:26'! formAM ^ self skinForms at: #titleBarActiveRightTitle ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 4/1/2003 07:26'! formAP ^ self skinForms at: #titleBarActiveLeftTitle ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 4/1/2003 07:26'! formAR ^ self skinForms at: #titleBarActiveRight ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 4/1/2003 07:27'! formAS ^ self skinForms at: #titleBarActiveLeftRepeat ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 4/1/2003 07:27'! formAT ^ self skinForms at: #titleBarActiveTitle ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 4/1/2003 07:28'! formIB ^ self skinForms at: #titleBarInactiveRightRepeat ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 4/1/2003 07:28'! formIL ^ self skinForms at: #titleBarInactiveLeft ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 4/1/2003 07:29'! formIM ^ self skinForms at: #titleBarInactiveRightTitle ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 4/1/2003 07:29'! formIP ^ self skinForms at: #titleBarInactiveLeftTitle ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 4/1/2003 07:29'! formIR ^ self skinForms at: #titleBarInactiveRight ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 4/1/2003 07:29'! formIS ^ self skinForms at: #titleBarInactiveLeftRepeat ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 4/1/2003 07:29'! formIT ^ self skinForms at: #titleBarInactiveTitle ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 3/10/2003 19:43'! inActiveTitleBarFormToFit: width titleStringMorph: aStringMorph ^ self titleBarFormToFit: width titleStringMorph: aStringMorph active: false! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 3/8/2003 11:26'! titleBarFormNames ^#( titleBarActiveLeft titleBarActiveLeftRepeat titleBarActiveLeftTitle titleBarActiveRight titleBarActiveRightRepeat titleBarActiveRightTitle titleBarActiveTitle titleBarInactiveLeft titleBarInactiveLeftRepeat titleBarInactiveLeftTitle titleBarInactiveRight titleBarInactiveRightRepeat titleBarInactiveRightTitle titleBarInactiveTitle)! ! !ImportedIceWMSkin methodsFor: 'title bar forms' stamp: 'sbw 3/16/2003 15:39'! titleBarFormToFit: width titleStringMorph: aStringMorph active: activeFlag "AL (AS) AP (AT) AM (AB) AR" "IL (IS) IP (IT) IM (IB) IR" | formT result realWidth | realWidth _ width. formT _ activeFlag ifTrue: [self formAT] ifFalse: [self formIT]. formT isNil ifTrue: [result _ Form extent: realWidth @ self titleBarHeight depth: Display depth. result fillColor: self colorNormalTitleBar] ifFalse: [result _ self createFullWidthBackTitleBarFormToFit: width titleStringMorph: aStringMorph active: activeFlag. self addLeftEdgeTitleBarFormTo: result active: activeFlag. self addLeftOfTitleBarFormTo: result titleStringMorph: aStringMorph active: activeFlag. self addRightOfTitleBarFormTo: result titleStringMorph: aStringMorph active: activeFlag. self addRightEdgeTitleBarFormTo: result active: activeFlag]. ^ result! ]style[(19 5 19 12 9 10 3 58 3 23 4 9 3 5 3 5 3 10 14 4 23 4 11 5 18 6 3 4 9 9 3 4 23 7 11 6 12 4 34 6 3 4 45 5 25 12 15 10 5 4 28 6 9 10 5 4 30 6 23 12 13 10 5 4 31 6 23 12 13 10 5 4 33 6 13 10 6 6)f1b,f1cblue;b,f1b,f1cblue;b,f1b,f1cblue;b,f1,f1c148046000i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 3/18/2003 06:44'! bottomBorderOfWidth: tgtWidth active: active | baseForm | baseForm _ active ifTrue: [self formFrameBA] ifFalse: [self formFrameBI]. ^self horizontalBorderOfWidth: tgtWidth usingForm: baseForm active: active ! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 4/1/2003 07:27'! formFrameBA ^ self skinForms at: #frameBottomActive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 4/1/2003 07:27'! formFrameBI ^ self skinForms at: #frameBottomInactive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 4/1/2003 07:27'! formFrameBLA ^ self skinForms at: #frameBottomLeftActive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 4/1/2003 07:27'! formFrameBLI ^ self skinForms at: #frameBottomLeftInactive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 4/1/2003 07:27'! formFrameBRA ^ self skinForms at: #frameBottomRightActive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 4/1/2003 07:27'! formFrameBRI ^ self skinForms at: #frameBottomRightInactive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 4/1/2003 07:27'! formFrameLA ^ self skinForms at: #frameLeftActive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 4/1/2003 07:28'! formFrameLI ^ self skinForms at: #frameLeftInactive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 4/1/2003 07:28'! formFrameRA ^ self skinForms at: #frameRightActive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 4/1/2003 07:28'! formFrameRI ^ self skinForms at: #frameRightInactive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 4/1/2003 07:28'! formFrameTA ^ self skinForms at: #frameTopActive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 4/1/2003 07:28'! formFrameTI ^ self skinForms at: #frameTopInactive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 4/1/2003 07:28'! formFrameTLA ^ self skinForms at: #frameTopLeftActive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 4/1/2003 07:28'! formFrameTLI ^ self skinForms at: #frameTopLeftInactive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 4/1/2003 07:28'! formFrameTRA ^ self skinForms at: #frameTopRightActive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 4/1/2003 07:28'! formFrameTRI ^ self skinForms at: #frameTopRightInactive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 3/18/2003 15:37'! hasBorders ^ self borderSizeX > 0 and: [self borderSizeY > 0]! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 3/18/2003 20:38'! hasCorners self formFrameTLA isNil ifTrue: [^false]. ^self cornerSizeX > 0 and: [self cornerSizeY > 0]! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 3/18/2003 06:44'! horizontalBorderOfWidth: tgtWidth usingForm: baseForm active: active | form offset delta count | form _ Form extent: tgtWidth @ baseForm height depth: baseForm depth. offset _ 0. delta _ baseForm width. count _ tgtWidth // delta. count timesRepeat: [baseForm displayOn: form at: offset @ 0. offset _ offset + delta]. offset _ tgtWidth - delta. baseForm displayOn: form at: offset @ 0. ^ form! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 3/18/2003 06:43'! leftBorderOfHeight: tgtHeight active: active | baseForm | baseForm _ active ifTrue: [self formFrameLA] ifFalse: [self formFrameLI]. ^self verticalBorderOfHeight: tgtHeight usingForm: baseForm active: active! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 3/18/2003 06:43'! rightBorderOfHeight: tgtHeight active: active | baseForm | baseForm _ active ifTrue: [self formFrameRA] ifFalse: [self formFrameRI]. ^self verticalBorderOfHeight: tgtHeight usingForm: baseForm active: active! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 3/18/2003 06:44'! topBorderOfWidth: tgtWidth active: active | baseForm | baseForm _ active ifTrue: [self formFrameTA] ifFalse: [self formFrameTI]. ^self horizontalBorderOfWidth: tgtWidth usingForm: baseForm active: active ! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 3/18/2003 06:42'! verticalBorderOfHeight: tgtHeight usingForm: baseForm active: active | form offset delta count | form _ Form extent: baseForm width @ tgtHeight depth: baseForm depth. offset _ 0. delta _ baseForm height. count _ tgtHeight // delta. count timesRepeat: [baseForm displayOn: form at: 0 @ offset. offset _ offset + delta]. offset _ tgtHeight - delta. baseForm displayOn: form at: 0 @ offset. ^ form! ! !ImportedIceWMSkin methodsFor: 'window frame' stamp: 'sbw 3/17/2003 22:17'! windowFrameNames ^ #(#frameTopLeftActive #frameTopActive #frameTopRightActive #frameRightActive #frameBottomRightActive #frameBottomActive #frameBottomLeftActive #frameLeftActive #frameTopLeftInactive #frameTopInactive #frameTopRightInactive #frameRightInactive #frameBottomRightInactive #frameBottomInactive #frameBottomLeftInactive #frameLeftInactive) ! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/5/2003 22:24'! createTitleBarWidgetAlternates self hasTitleBarWidgetClose ifFalse: [self createTitleBarWidgetAlternatesFrom: SystemWindow closeBoxImage baseName: 'Close']. self hasTitleBarWidgetApplicationMenu ifFalse: [self createTitleBarWidgetAlternatesFrom: (ScriptingSystem formAtKey: 'TinyMenu') baseName: 'Menu']. self hasTitleBarWidgetIconize ifFalse: [self createTitleBarWidgetAlternatesFrom: SystemWindow collapseBoxImage baseName: 'Collapse']. self hasTitleBarWidgetMaximize ifFalse: [self createTitleBarWidgetAlternatesFrom: (ScriptingSystem formAtKey: 'expandBox') baseName: 'Expand']! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/5/2003 22:40'! createTitleBarWidgetAlternatesFrom: orgForm baseName: baseName | actForm inactForm oldColor | oldColor _ (orgForm colorsUsed reject: [:clr | clr isTransparent]) last. actForm _ Form extent: orgForm extent depth: Display depth. orgForm displayOn: actForm. actForm mapColor: oldColor to: self colorActiveTitleBarText. self defineSkinForm: actForm at: ('altActive' , baseName) asSymbol. inactForm _ Form extent: orgForm extent depth: Display depth. orgForm displayOn: inactForm. inactForm mapColor: oldColor to: self colorNormalTitleBarText. self defineSkinForm: inactForm at: ('altInactive' , baseName) asSymbol! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/1/2003 07:26'! formAClose ^ self skinForms at: #windowCloseButtonActive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/1/2003 07:26'! formAHide ^ self skinForms at: #windowHideActive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/1/2003 07:26'! formAMaximum ^ self skinForms at: #windowMaximizeButtonActive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/17/2003 17:31'! formAMenu ^self formMenuFromKey: #windowMenuButtonActive! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/1/2003 07:26'! formAMinimize ^ self skinForms at: #windowMinimizeButtonActive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/1/2003 07:27'! formARestore ^ self skinForms at: #windowRestoreButtonActive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/1/2003 07:27'! formARollDown ^ self skinForms at: #windowRollDownButtonActive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/1/2003 07:27'! formARollUp ^ self skinForms at: #windowRollUpButtonActive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/5/2003 21:56'! formAltActiveClose ^ self skinForms at: #altActiveClose ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/5/2003 21:56'! formAltActiveCollapse ^ self skinForms at: #altActiveCollapse ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/5/2003 21:56'! formAltActiveExpand ^ self skinForms at: #altActiveExpand ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/5/2003 21:56'! formAltActiveMenu ^ self skinForms at: #altActiveMenu ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/5/2003 21:57'! formAltInactiveClose ^ self skinForms at: #altInactiveClose ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/5/2003 21:57'! formAltInactiveCollapse ^ self skinForms at: #altInactiveCollapse ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/5/2003 21:57'! formAltInactiveExpand ^ self skinForms at: #altInactiveExpand ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/5/2003 21:57'! formAltInactiveMenu ^ self skinForms at: #altInactiveMenu ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/1/2003 07:28'! formIClose ^ self skinForms at: #windowCloseButtonInactive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/1/2003 07:28'! formIHide ^ self skinForms at: #windowHideInactive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/1/2003 07:29'! formIMaximum ^ self skinForms at: #windowMaximizeButtonInactive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/17/2003 17:31'! formIMenu ^self formMenuFromKey: #windowMenuButtonInactive! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/1/2003 07:29'! formIMinimize ^ self skinForms at: #windowMinimizeButtonInactive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/1/2003 07:29'! formIRestore ^ self skinForms at: #windowRestoreButtonInactive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/1/2003 07:29'! formIRollDown ^ self skinForms at: #windowRollDownButtonInactive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/1/2003 07:29'! formIRollUp ^ self skinForms at: #windowRollUpButtonInactive ifAbsent: []! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/12/2003 11:01'! formMenuFromKey: key | form menuForm xPos yPos altForm tallerForm | form _ self skinForms at: key ifAbsent: []. form isNil ifFalse: [altForm _ self formAClose. altForm isNil ifFalse: [form height < altForm height ifTrue: [tallerForm _ Form extent: form width @ (altForm height) depth: form depth. form displayOn: tallerForm at: 0 @ 0. form displayOn: tallerForm at: 0 @ form height. form _ tallerForm]]. self showMenuButtonIcon ifTrue: [menuForm _ ScriptingSystem formAtKey: 'TinyMenu'. xPos _ form width - menuForm width // 2. yPos _ form height // 2 - menuForm height // 2. menuForm displayOn: form at: xPos @ yPos. yPos _ yPos + (form height // 2). menuForm displayOn: form at: xPos @ yPos]]. ^ form! ]style[(17 3 4 43 4 4 3 4 19 3 20 4 19 7 3 4 16 7 21 4 10 7 23 10 3 4 9 4 10 7 16 4 15 4 12 10 5 1 3 1 9 4 12 10 5 1 3 4 16 4 3 10 7 4 33 8 3 15 12 10 7 4 3 4 9 8 10 1 7 4 3 4 11 1 3 8 11 1 7 8 12 4 5 4 3 4 7 4 3 4 4 4 11 1 8 8 12 4 5 4 3 4 7 4)f1b,f1cblue;b,f1,f1cblue;i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1c000148000,f1,f1c000148000,f1,f1cblue;i,f1,f1cblue;i,f1,f1c000148000,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cmagenta;,f1,f1c000148000,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1c000148000,f1,f1cblue;i,f1,f1cblue;i,f1,f1c000148000,f1,f1cblue;i,f1,f1c000148000,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1c000148000,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/17/2003 12:42'! hasTitleBarWidget: char | set form | set _ Set new. set addAll: self titleButtonsSupported. set addAll: self titleButtonsLeft. set addAll: self titleButtonsRight. self showXButton ifTrue: [set add: self titleBarWidgetCloseKey]. set isEmpty ifFalse: [self titleBarMaximizeButton ifFalse: [form _ self formAMaximum. form isNil ifTrue: [set remove: self titleBarWidgetMaximizeKey] ifFalse: [self skinErrorFound: 'Definition asks to remove a widget "', self titleBarWidgetMaximizeKey printString, '" but actual form exists. Request ignored.'] ]]. ^ set includes: char! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/7/2003 21:02'! hasTitleBarWidgetApplicationMenu ^self hasTitleBarWidget: self titleBarWidgetApplicationMenuKey! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/7/2003 21:02'! hasTitleBarWidgetClose ^ self hasTitleBarWidget: self titleBarWidgetCloseKey! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/11/2003 21:19'! hasTitleBarWidgetHide ^ self hasTitleBarWidget: self titleBarWidgetHideKey! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/7/2003 21:03'! hasTitleBarWidgetIconize ^ self hasTitleBarWidget: self titleBarWidgetIconizeKey! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/7/2003 21:03'! hasTitleBarWidgetMaximize ^ self hasTitleBarWidget: self titleBarWidgetMaximizeKey! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/11/2003 21:28'! hasTitleBarWidgetRestore ^ self hasTitleBarWidget: self titleBarWidgetIconizeKey! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/11/2003 21:26'! hasTitleBarWidgetRollDown ^ self hasTitleBarWidget: self titleBarWidgetRollDownKey! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/7/2003 21:03'! hasTitleBarWidgetRollUpDown ^ self hasTitleBarWidget: self titleBarWidgetRollUpDownKey! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/15/2003 17:40'! idleWidgetFormFor: aSymbol | form hgt ext | form _ self perform: aSymbol. form ifNil:[^form]. hgt _ form height // 2. ext _ form width @ hgt. ^ form copy: (0 @ 0 extent: ext)! ]style[(19 7 4 13 4 4 3 4 10 7 24 3 3 4 11 1 3 3 3 4 9 3 5 4 10 1 3 1 9 3 1)f1b,f1cblue;b,f1,f1cblue;i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1c000184027,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1c000184027,f1,f1c000184027,f1,f1cblue;i,f1! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/12/2003 21:23'! pressedWidgetFormFor: aSymbol | form hgt ext | form _ self perform: aSymbol. hgt _ form height // 2. ext _ form width @ hgt. ^ form copy: (0 @ hgt extent: ext)! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/7/2003 20:51'! titleBarWidgetApplicationMenuKey ^ $s! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/17/2003 12:52'! titleBarWidgetApplicationMenuLayoutFrame "Priorities on left: close/menu/expand/collapse" "Priorities on right: menu/collapse/expand/close" | frame offset form | self hasTitleBarWidgetApplicationMenu ifFalse: [form _ self formAMenu. form == nil ifTrue: [^ nil]]. frame _ LayoutFrame new. self titleBarWidgetApplicationMenuOnLeft ifTrue: [offset _ self titleBarWidgetCloseOnLeft ifTrue: [self widthOfCloseBox] ifFalse: [0]. frame leftFraction: 0; leftOffset: offset; rightFraction: 0; rightOffset: 0] ifFalse: [offset _ self titleBarWidgetCloseOnRight ifTrue: [self widthOfCloseBox] ifFalse: [0]. offset _ self titleBarWidgetMaximumOnRight ifTrue: [offset + self widthOfExpandBox] ifFalse: [offset]. offset _ self titleBarWidgetRestoreOnRight ifTrue: [offset + self widthOfCollapseBox] ifFalse: [offset]. offset _ offset + self widthOfMenuBox. frame leftFraction: 1; leftOffset: offset negated; rightFraction: 1; rightOffset: 0]. frame topFraction: 0; topOffset: 0; bottomFraction: 1; bottomOffset: 0. ^ frame! ]style[(40 2 99 3 13 9 4 95 3 5 5 3 11 7 4 48 6 3 4 42 4 34 1 6 5 15 1 19 6 22 1 20 1 14 6 3 4 43 4 34 1 6 6 3 4 45 6 3 4 35 6 6 6 3 4 45 6 3 4 37 6 6 6 3 6 3 4 20 5 15 1 19 6 30 1 20 1 4 5 14 1 16 1 21 1 19 1 5 5)f1b,f1,f1c148046000i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1c000184027,f1,f1cblue;i,f1,f1c000184027,f1,f1cblue;i,f1,f1c000184027,f1,f1c000184027,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1c000184027,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1c000184027,f1,f1cblue;i,f1,f1c000184027,f1,f1c000184027,f1,f1cblue;i,f1,f1c000184027,f1,f1c000184027,f1,f1c000184027,f1,f1c000184027,f1,f1cblue;i! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/16/2003 22:32'! titleBarWidgetApplicationMenuOnLeft ^ self titleButtonsLeft includes: self titleBarWidgetApplicationMenuKey! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/16/2003 22:32'! titleBarWidgetApplicationMenuOnRight ^ self titleBarWidgetApplicationMenuOnLeft not! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/7/2003 20:51'! titleBarWidgetCloseKey ^ $x! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/17/2003 21:51'! titleBarWidgetCloseLayoutFrame "Priorities on left: close/menu/expand/collapse" "Priorities on right: menu/collapse/expand/close" | frame offset form | self hasTitleBarWidgetClose ifFalse: [form _ self formAClose. form == nil ifTrue: [^ nil]]. frame _ LayoutFrame new. self titleBarWidgetCloseOnLeft ifTrue: [frame leftFraction: 0; leftOffset: 0; rightFraction: 0; rightOffset: 0] ifFalse: [offset _ self widthOfCloseBox. frame leftFraction: 1; leftOffset: offset negated; rightFraction: 1; rightOffset: 0]. frame topFraction: 0; topOffset: 0; bottomFraction: 1; bottomOffset: 0. ^ frame! ]style[(30 2 99 3 13 9 4 86 4 4 5 3 11 7 4 38 5 15 1 19 1 22 1 20 1 14 6 3 4 21 5 15 1 19 6 30 1 20 1 4 5 14 1 16 1 21 1 19 1 5 5)f1b,f1,f1c148046000i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1cblue;i,f1,f1c000184027,f1,f1c000184027,f1,f1c000184027,f1,f1c000184027,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1c000184027,f1,f1cblue;i,f1,f1c000184027,f1,f1c000184027,f1,f1cblue;i,f1,f1c000184027,f1,f1c000184027,f1,f1c000184027,f1,f1c000184027,f1,f1cblue;i! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/16/2003 22:30'! titleBarWidgetCloseOnLeft ^self titleButtonsLeft includes: self titleBarWidgetCloseKey! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/16/2003 22:31'! titleBarWidgetCloseOnRight ^ self titleBarWidgetCloseOnLeft not! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/11/2003 21:19'! titleBarWidgetHideKey ^ $h! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/17/2003 06:42'! titleBarWidgetIconizeKey "This is for the collapse box" ^ $i! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/17/2003 06:41'! titleBarWidgetMaximizeKey "This is for the expand box" ^ $m! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/17/2003 20:27'! titleBarWidgetMaximizeLayoutFrame "This is for the expand box" "Priorities on left: close/menu/expand/collapse" "Priorities on right: menu/collapse/expand/close" | frame offset form | self hasTitleBarWidgetMaximize ifFalse: [form _ self formAMaximum. form == nil ifTrue: [^ nil]]. frame _ LayoutFrame new. self titleBarWidgetMaximumOnLeft ifTrue: [offset _ self titleBarWidgetCloseOnLeft ifTrue: [self widthOfCloseBox] ifFalse: [0]. offset _ self titleBarWidgetApplicationMenuOnLeft ifTrue: [offset + self widthOfMenuBox] ifFalse: [offset]. frame leftFraction: 0; leftOffset: offset; rightFraction: 0; rightOffset: 0] ifFalse: [offset _ self titleBarWidgetCloseOnRight ifTrue: [self widthOfCloseBox] ifFalse: [0]. offset _ offset + self widthOfExpandBox. frame leftFraction: 1; leftOffset: offset negated; rightFraction: 1; rightOffset: 0]. frame topFraction: 0; topOffset: 0; bottomFraction: 1; bottomOffset: 0. ^ frame! ]style[(33 2 129 3 13 9 4 91 4 4 5 3 11 7 4 40 6 3 4 42 4 34 1 6 6 3 4 52 6 3 4 33 6 6 5 15 1 19 6 22 1 20 1 14 6 3 4 43 4 34 1 6 6 3 6 3 4 22 5 15 1 19 6 30 1 20 1 4 5 14 1 16 1 21 1 19 1 5 5)f1b,f1,f1c148046000i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1c000184027,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cblue;i,f1,f1c000184027,f1,f1cblue;i,f1,f1c000184027,f1,f1c000184027,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1c000184027,f1,f1cblue;i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1c000184027,f1,f1cblue;i,f1,f1c000184027,f1,f1c000184027,f1,f1cblue;i,f1,f1c000184027,f1,f1c000184027,f1,f1c000184027,f1,f1c000184027,f1,f1cblue;i! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/17/2003 06:41'! titleBarWidgetMaximumOnLeft "This is for the expand box" ^ self titleButtonsLeft includes: self titleBarWidgetMaximizeKey! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/17/2003 06:41'! titleBarWidgetMaximumOnRight "This is for the expand box" ^ self titleBarWidgetMaximumOnLeft not! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/11/2003 21:17'! titleBarWidgetNames ^ #(#windowCloseButtonActive #windowCloseButtonInactive #windowMaximizeButtonActive #windowMaximizeButtonInactive #windowMenuButtonActive #windowMenuButtonInactive #windowMinimizeButtonActive #windowMinimizeButtonInactive #windowRestoreButtonActive #windowRestoreButtonInactive #windowRollUpButtonActive #windowRollUpButtonInactive #windowRollDownButtonActive #windowRollDownButtonInactive #windowHideActive #windowHideInactive)! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/17/2003 20:22'! titleBarWidgetRestoreLayoutFrame "This is for the collapse box" "Priorities on left: close/menu/expand/collapse" "Priorities on right: menu/collapse/expand/close" | frame offset form | self hasTitleBarWidgetRestore ifFalse: [form _ self formARestore. form == nil ifTrue: [^ nil]]. frame _ LayoutFrame new. self titleBarWidgetRestoreOnLeft ifTrue: [offset _ self titleBarWidgetCloseOnLeft ifTrue: [self widthOfCloseBox] ifFalse: [0]. offset _ self titleBarWidgetApplicationMenuOnLeft ifTrue: [offset + self widthOfMenuBox] ifFalse: [offset]. offset _ self titleBarWidgetMaximumOnLeft ifTrue: [offset + self widthOfExpandBox] ifFalse: [offset]. frame leftFraction: 0; leftOffset: offset; rightFraction: 0; rightOffset: 0] ifFalse: [offset _ self titleBarWidgetCloseOnRight ifTrue: [self widthOfCloseBox] ifFalse: [0]. offset _ self titleBarWidgetMaximumOnRight ifTrue: [offset + self widthOfExpandBox] ifFalse: [offset]. offset _ offset + self widthOfCollapseBox. frame leftFraction: 1; leftOffset: offset negated; rightFraction: 1; rightOffset: 0]. frame topFraction: 0; topOffset: 0; bottomFraction: 1; bottomOffset: 0. ^ frame! ]style[(32 2 131 3 13 9 4 90 4 4 5 3 11 7 4 40 6 3 4 42 4 34 1 6 6 3 4 52 6 3 4 33 6 6 6 3 4 44 6 3 4 35 6 6 5 15 1 19 6 22 1 20 1 14 6 3 4 43 4 34 1 6 6 3 4 45 6 3 4 35 6 6 6 3 6 3 4 24 5 15 1 19 6 30 1 20 1 4 5 14 1 16 1 21 1 19 1 5 5)f1b,f1,f1c148046000i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1c000184027,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cblue;i,f1,f1c000184027,f1,f1cblue;i,f1,f1c000184027,f1,f1c000184027,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cmagenta;,f1,f1c000184027,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1cblue;i,f1,f1cblue;i,f1,f1cmagenta;,f1,f1cblue;i,f1,f1c000184027,f1,f1cblue;i,f1,f1c000184027,f1,f1c000184027,f1,f1cblue;i,f1,f1c000184027,f1,f1c000184027,f1,f1c000184027,f1,f1c000184027,f1,f1cblue;i! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/17/2003 06:43'! titleBarWidgetRestoreOnLeft "This is for the collapse box" ^ self titleButtonsLeft includes: self titleBarWidgetIconizeKey! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/17/2003 06:43'! titleBarWidgetRestoreOnRight "This is for the collapse box" ^ self titleBarWidgetRestoreOnLeft not! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/11/2003 21:26'! titleBarWidgetRollDownKey ^ $d! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/7/2003 20:50'! titleBarWidgetRollUpDownKey ^ $r! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/17/2003 12:26'! widthOfCloseBox | form | form _ self formAClose. ^ form isNil ifTrue: [0] ifFalse: [form width]! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/17/2003 12:26'! widthOfCollapseBox | form | form _ self formAMinimize. ^ form isNil ifTrue: [form _ self formARestore. form isNil ifTrue: [0] ifFalse: [form width]] ifFalse: [form width]! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 4/6/2003 09:45'! widthOfControls ^self widthOfLeftControls + self widthOfRightControls! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/17/2003 12:26'! widthOfExpandBox | form | form _ self formAMaximum. ^ form isNil ifTrue: [0] ifFalse: [form width]! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/16/2003 22:50'! widthOfLeftControls | sum | sum _ 0. self titleBarWidgetApplicationMenuOnLeft ifTrue: [sum _ sum + self widthOfMenuBox]. self titleBarWidgetCloseOnLeft ifTrue: [sum _ sum + self widthOfCloseBox]. self titleBarWidgetMaximumOnLeft ifTrue: [sum _ sum + self widthOfCollapseBox]. self titleBarWidgetRestoreOnLeft ifTrue: [sum _ sum + self widthOfExpandBox]. ^ sum! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/17/2003 12:26'! widthOfMenuBox | form | form _ self formAMenu. ^ form isNil ifTrue: [0] ifFalse: [form width]! ! !ImportedIceWMSkin methodsFor: 'title bar widgets' stamp: 'sbw 3/16/2003 22:51'! widthOfRightControls | sum | sum _ 0. self titleBarWidgetApplicationMenuOnRight ifTrue: [sum _ sum + self widthOfMenuBox]. self titleBarWidgetCloseOnRight ifTrue: [sum _ sum + self widthOfCloseBox]. self titleBarWidgetMaximumOnRight ifTrue: [sum _ sum + self widthOfCollapseBox]. self titleBarWidgetRestoreOnRight ifTrue: [sum _ sum + self widthOfExpandBox]. ^ sum! ! !ImportedIceWMSkin methodsFor: 'parameters-title bar' stamp: 'sbw 3/7/2003 18:12'! colorActiveTitleBarShadow ^self parameters at: 'ColorActiveTitleBarShadow'! ! !ImportedIceWMSkin methodsFor: 'parameters-title bar' stamp: 'sbw 3/7/2003 18:12'! colorActiveTitleBarText ^ self parameters at: 'ColorActiveTitleBarText'! ! !ImportedIceWMSkin methodsFor: 'parameters-title bar' stamp: 'sbw 3/8/2003 18:44'! colorNormalTitleBar ^ self parameters at: 'ColorNormalTitleBar'! ! !ImportedIceWMSkin methodsFor: 'parameters-title bar' stamp: 'sbw 3/8/2003 22:11'! colorNormalTitleBarText ^ self parameters at: 'ColorNormalTitleBarText' ifAbsent: [Color black]! ]style[(23 4 4 16 49)f1b,f1,f1cmagenta;,f1,f1c000184027! ! !ImportedIceWMSkin methodsFor: 'parameters-title bar' stamp: 'sbw 3/17/2003 12:18'! showMenuButtonIcon ^ self parameters at: 'ShowMenuButtonIcon' ifAbsent: [true]! ! !ImportedIceWMSkin methodsFor: 'parameters-title bar' stamp: 'sbw 3/7/2003 21:10'! showXButton ^ self parameters at: 'ShowXButton' ifAbsent: [false]! ! !ImportedIceWMSkin methodsFor: 'parameters-title bar' stamp: 'sbw 3/7/2003 18:25'! titleBarCentered ^ self parameters at: 'TitleBarCentered' ifAbsent: [false]! ! !ImportedIceWMSkin methodsFor: 'parameters-title bar' stamp: 'sbw 4/6/2003 08:17'! titleBarHeight ^ self parameters at: 'TitleBarHeight' ifAbsent: [10]! ! !ImportedIceWMSkin methodsFor: 'parameters-title bar' stamp: 'sbw 3/7/2003 21:15'! titleBarMaximizeButton ^ self parameters at: 'TitleBarMaximizeButton' ifAbsent: [true]! ! !ImportedIceWMSkin methodsFor: 'parameters-title bar' stamp: 'sbw 3/17/2003 21:38'! titleButtonsLeft ^ self parameters at: 'TitleButtonsLeft' ifAbsent: ['s']! ! !ImportedIceWMSkin methodsFor: 'parameters-title bar' stamp: 'sbw 3/7/2003 18:24'! titleButtonsRight ^ self parameters at: 'TitleButtonsRight' ifAbsent: ['']! ! !ImportedIceWMSkin methodsFor: 'parameters-title bar' stamp: 'sbw 3/7/2003 18:30'! titleButtonsSupported | value posn | value _ self parameters at: 'TitleButtonsSupported' ifAbsent: ['']. value isEmpty ifFalse: [ (value includes: $") ifTrue: [ posn _ value indexOf: $". value _ value copyFrom: 1 to: (posn - 1) ] ]. ^value! ! !ImportedIceWMSkin methodsFor: 'load definition file' stamp: 'sbw 3/7/2003 21:14'! booleanParameterNames ^ #('ShowXButton' 'ShowMenuButtonIcon' 'TitleBarJustify' 'TaskBarDoubleHeight' 'TitleBarCentered' 'TaskBarShowWindowListMenu' 'TaskBarShowCPUStatus' 'TaskBarShowNetStatus' 'MenuMouseTracking' 'TaskBarClockLeds' 'DesktopBackgroundCenter' 'ShowXButton' 'TitleBarMaximizeButton')! ! !ImportedIceWMSkin methodsFor: 'load definition file' stamp: 'sbw 3/6/2003 12:59'! integerParameterNames ^ #('TitleBarHeight' 'BorderSizeX' 'BorderSizeY' 'CornerSizeX' 'CornerSizeY' 'DlgBorderSizeX' 'DlgBorderSizeY' )! ! !ImportedIceWMSkin methodsFor: 'load definition file' stamp: 'sbw 3/6/2003 04:41'! keyIsBooleanParameter: key ^self booleanParameterNames includes: key! ! !ImportedIceWMSkin methodsFor: 'load definition file' stamp: 'sbw 3/6/2003 13:13'! keyIsColorParameter: key ^ (key asUppercase beginsWith: 'COLOR') or: [key = 'DesktopBackgroundColor']! ! !ImportedIceWMSkin methodsFor: 'load definition file' stamp: 'sbw 3/6/2003 04:45'! keyIsFontNameParameter: key ^ key asUppercase endsWith: 'FONTNAME'! ! !ImportedIceWMSkin methodsFor: 'load definition file' stamp: 'sbw 3/6/2003 04:41'! keyIsIntegerParameter: key ^ self integerParameterNames includes: key! ! !ImportedIceWMSkin methodsFor: 'load definition file' stamp: 'sbw 4/8/2003 18:56'! loadForms self loadTitleBarForms. self loadWindowWidgetForms. self loadFrameForms. self loadMenuBackground! ! !ImportedIceWMSkin methodsFor: 'load definition file' stamp: 'sbw 4/1/2003 07:41'! loadFrameForms | list fName form path | list _ self windowFrameNames. list do: [:selector | fName _ self class perform: selector. (self directory fileExists: fName) ifTrue: [path _ self directory fullNameFor: fName. form _ Form fromFileNamed: path. self defineSkinForm: form at: selector]]! ! !ImportedIceWMSkin methodsFor: 'load definition file' stamp: 'sbw 4/8/2003 19:39'! loadMenuBackground | fName form path | fName _ self class menuBackground. (self directory fileExists: fName) ifTrue: [path _ self directory fullNameFor: fName. form _ Form fromFileNamed: path. self defineSkinForm: form at: #menuBackground]! ! !ImportedIceWMSkin methodsFor: 'load definition file' stamp: 'sbw 4/1/2003 18:35'! loadSkinFrom: aDirectory | fName path fStream contents paramDict | self directory: aDirectory. self folderName: aDirectory localName. self isSkinLoaded ifFalse: [fName _ self class defaultSkin. path _ aDirectory fullNameFor: fName. fStream _ CrLfFileStream readOnlyFileNamed: path. [contents _ fStream contentsOfEntireFile] ensure: [fStream close]. paramDict _ self parseDefaultContents: contents. self defineSkinParameters: paramDict. self loadForms]! ! !ImportedIceWMSkin methodsFor: 'load definition file' stamp: 'sbw 4/1/2003 07:42'! loadTitleBarForms | list fName form path | list _ self titleBarFormNames. list do: [:selector | fName _ self class perform: selector. (self directory fileExists: fName) ifTrue: [path _ self directory fullNameFor: fName. form _ Form fromFileNamed: path. self defineSkinForm: form at: selector]]! ! !ImportedIceWMSkin methodsFor: 'load definition file' stamp: 'sbw 4/5/2003 21:26'! loadWindowWidgetForms | list fName form path | list _ self titleBarWidgetNames. list do: [:selector | fName _ self class perform: selector. (self directory fileExists: fName) ifTrue: [path _ self directory fullNameFor: fName. form _ Form fromFileNamed: path. self defineSkinForm: form at: selector]]. self createTitleBarWidgetAlternates! ! !ImportedIceWMSkin methodsFor: 'load definition file' stamp: 'sbw 3/6/2003 04:08'! parameterColorForHexValue: value ^Color fromString: value.! ! !ImportedIceWMSkin methodsFor: 'load definition file' stamp: 'sbw 3/6/2003 04:03'! parameterColorForRGBValue: value | parts red green blue color | parts _ (value copyFrom: 5 to: value size) findTokens: $/. red _ Integer readFrom: (ReadStream on: parts first asUppercase) base: 16. green _ Integer readFrom: (ReadStream on: parts second asUppercase) base: 16. blue _ Integer readFrom: (ReadStream on: parts third asUppercase) base: 16. color _ Color r: red g: green b: blue range: 255. ^color! ! !ImportedIceWMSkin methodsFor: 'load definition file' stamp: 'sbw 4/1/2003 18:28'! parseDefaultContents: aString | rawLines lines line dict assoc | rawLines _ (ReadStream on: aString) asLines. lines _ OrderedCollection new. rawLines do: [:each | line _ each withBlanksTrimmed. line isEmpty ifFalse: [line first = $# ifFalse: [lines add: line]]]. dict _ Dictionary new. lines do: [:each | assoc _ self parseLineIntoParameter: each. dict at: assoc key put: assoc value]. self sweepThroughAndFixParameterColors: dict. self sweepThroughAndFixParameterBooleans: dict. self sweepThroughAndFixParameterIntegers: dict. self sweepThroughAndFixParameterFontNames: dict. ^ dict! ! !ImportedIceWMSkin methodsFor: 'load definition file' stamp: 'sbw 4/1/2003 18:26'! parseLineIntoParameter: aString | parts key value | parts _ aString findTokens: $=. key _ parts first withBlanksTrimmed. value _ parts last withBlanksTrimmed withoutQuoting. ^key -> value! ! !ImportedIceWMSkin methodsFor: 'load definition file' stamp: 'sbw 4/1/2003 18:27'! sweepThroughAndFixParameterBooleans: dict | value boolean | dict keysDo: [:key | (self keyIsBooleanParameter: key) ifTrue: [value _ dict at: key. boolean _ value = '1'. dict at: key put: boolean]]! ! !ImportedIceWMSkin methodsFor: 'load definition file' stamp: 'sbw 4/1/2003 18:27'! sweepThroughAndFixParameterColors: dict | value color | dict keysDo: [:key | (self keyIsColorParameter: key) ifTrue: [value _ dict at: key. color _ nil. (value beginsWith: 'rgb:') ifTrue: ["rgb:00/b0/84" color _ self parameterColorForRGBValue: value. dict at: key put: color]. color == nil ifTrue: [value isEmpty ifFalse: [value first = $# ifTrue: ["#FFCC00" color _ self parameterColorForHexValue: value. dict at: key put: color]]]. color == nil ifTrue: [value isEmpty ifFalse: [color _ self parameterColorForHexValue: '#' , value. dict at: key put: color]]]]! ! !ImportedIceWMSkin methodsFor: 'load definition file' stamp: 'sbw 4/1/2003 18:27'! sweepThroughAndFixParameterFontNames: dict | value | dict keysDo: [:key | (self keyIsFontNameParameter: key) ifTrue: ["Need to work out what to do about font specifications." value _ dict at: key]]! ! !ImportedIceWMSkin methodsFor: 'load definition file' stamp: 'sbw 4/1/2003 18:28'! sweepThroughAndFixParameterIntegers: dict | value | dict keysDo: [:key | (self keyIsIntegerParameter: key) ifTrue: [value _ dict at: key. dict at: key put: value asInteger]]! ! !ImportedIceWMSkin methodsFor: 'printing' stamp: 'sbw 3/6/2003 13:08'! printOn: aStream super printOn: aStream. aStream nextPutAll: ' '; nextPutAll: self folderName printString! ! !ImportedIceWMSkin methodsFor: 'process' stamp: 'sbw 3/8/2003 11:18'! applySkinToSystemWindow: window self class applicatorClass applySkin: self toSystemWindow: window! ! !ImportedIceWMSkin methodsFor: 'process' stamp: 'sbw 3/8/2003 15:59'! unApplySkinToSystemWindow: window self class applicatorClass unApplySkin: self toSystemWindow: window! ! !ImportedSkin class methodsFor: 'release notes - DO THIS' stamp: 'sbw 4/12/2003 11:36'! updateChangeSetPreambleForSkinImporter "ImportedSkin updateChangeSetPreambleForSkinImporter" "Do this whenever you are about to release a new change set." self installNewPreambleForChangeSetNamed: self primaryChangeSetName! ! !ImportedSkin class methodsFor: 'release notes - strings' stamp: 'sbw 4/13/2003 09:22'! bugs "ImportedSkin updateChangeSetPreambleForSkinImporter" ^ 'Skins II bugs --- decorated buttons do not undecorate correctly same is true for removal of skin, decorated buttons remain skinned. color of text selection should be reset for each front-most window theme. Still broken. Related is that the current skin defines other behavior and the current should be reset each time another window is put in front. spacing gap with Notif2 on right side buttons --- '! ! !ImportedSkin class methodsFor: 'release notes - strings' stamp: 'sbw 4/13/2003 09:22'! features "ImportedSkin updateChangeSetPreambleForSkinImporter" ^ 'Skins II features --- This project is a rewrite of the Skins code written in 1998 for Squeak 2.7. This new version is known to work in Squeak 3.4, 3.5 and 3.6-beta. This new model attempts to accomplish a couple of goals that I saw as defects in the original skins model: - Use "standard" theme files from the open source Linux world. - Replace existing morphic components in the skinned window by finding them dynamically, not requiring special subclassed window code. -Provide a way to delete a theme and restore the window to it''s original state. Key features include: Standard theme files from Ice Window Manager are supported. See http://themes.freshmeat.net for published theme files that work with Skins II. The standard menu in the System Window is enhanced to provide skins management for the system as well as for only that specific window. SystemWindow custom morphic menu (red menu) supports the same options. This was done because some IceWM theme definitions remove the menu from the window title bar. Parameters are available in the Preferences panel under #skins, providing explicit controls over elements that are active in a skinned window. The window title bar is skinned. The contents of list boxes is skinned. Pluggable buttons are skinned. Alignment panes and text panes are skinned. The World desktop can be defined by the skin. Menus are skinned. Balloon help is skinned. --- '! ! !ImportedSkin class methodsFor: 'release notes - strings' stamp: 'sbw 4/13/2003 11:34'! revisions "ImportedSkin updateChangeSetPreambleForSkinImporter" "" "Follow the format of latest revision at the top and keep the revision tag alone on the first line of content (between the --- lines). Break revision entries with an extra blank line at the end." ^ 'Skins II revisions --- 13-apr-2003 Factored creation of skin preferences. Added preference to show progress of skin being applied. Changed default preferences for skins. Fill in the blank and simple button morph skinned. 12-apr-2003-5 Show load progress while applying skin. New preference to manage setting of text highlight color. 12-apr-2003-4 Make auto setting of current skin to default to true. Scroll bar colors are set by optional values in theme file. 12-apr-2003-3 Fixed a recursion problem when loading from a project morph. 12-apr-2003-2 Added menu item to explicitly load a desktop background if available in the theme file. When setting text colors is permitted, make the highlight colors correct for the window when it becomes active. Check for undefined highlight colors. 12-apr-2003-1 Generalized the change set preamble maintenance code so that the bug report logic can also identify the versions of the related change sets. 12-apr-2003 Added features to make the project easier to maintain. This includes easier revision history/notes generation and tracking of known bugs. Bug reports via email. Fixed bug where dimensions of menu button was wrong. 10-apr-2003 Changed skin application so that a Preference decides if the latest applied skin becomes the curren skin. Added a menu item to manually set the skin applied to a window as the current skin. 08-apr-2003 First pass at supporting menu background forms. Incomplete. PluggableButtonMorphs in window are controlled by skin with a preference. SimpleButtonMorphs are also skinned. 07-apr-2003 Text pane colors supported (preliminary). Removed special class that was part of enhanced IRC client. Skins preferences added. Former single preference was moved from #windows preference category to new #skins category. Support for theme backgrounds added. Handle tiled backgrounds and centered morphs as backgrounds. Check first for image background, then background color theme setting. 06-apr-2003 Improved border color and window label management. Use assigned skin to set colors for balloon help. Use titlebar text colors for titlebar icons when no icons are specified in original theme. Moved postLoad logic to the class ImportedSkin. NOTE: Themes must be reloaded after change-set install. Clear skin parameters (and postLoad of change-set) also disables the auto-assign skins preference. DNU exceptions disable the auto skin preference first. Better management of themes that remove some key titlebar widgets. Added menu item to preload all themes in a folder. ListBox theme parameters are now applied for skinned windows. Menu titles support added. 05-apr-2003 Better management of overall skins removal. See ImportedSkin class>>clear. Continue to fill in skins parameters from the theme definition files. 04-apr-2003 Improved vertical positioning of string label in window title bar. Improved horizontal position when non-centered. Better handling of window label string when window is resized. Use theme definitions for window border color and size when no themed border frames are specified. Support for list box theme parameters. 03-apr-2003 System Window menu has name of applied theme. Removed unused instance variable from ImportedIceWMSkin. Added support for button colors defined in theme. Added skin menu items to SystemWindow custom morphic menu (red menu) since some themes disable the regular menu in the title bar. Use menu color parameters from the current skin if the automatic preference is true. 02-apr-2003 Initial release. --- '! ! !ImportedSkin class methodsFor: 'release notes - change set names' stamp: 'sbw 4/12/2003 11:34'! dialogsChangeSetName ^ 'Dialogs-sbw'! ! !ImportedSkin class methodsFor: 'release notes - change set names' stamp: 'sbw 4/12/2003 11:35'! primaryChangeSetName ^'skin-importer'! ! !ImportedSkin class methodsFor: 'release notes - change set names' stamp: 'sbw 4/12/2003 11:46'! supportChangeSetName ^ 'importer-support'! ! !ImportedSkin class methodsFor: 'release notes - change set names' stamp: 'sbw 4/12/2003 11:45'! xpmChangeSetName ^ 'xpm-support'! ! !ImportedSkin class methodsFor: 'release notes - tools' stamp: 'sbw 4/12/2003 08:26'! constructChangeSetPreambleString | sourceString stream | sourceString _ self constructChangeSetPreambleStringFromPieces. stream _ ReadWriteStream on: ''. sourceString do: [:char | stream nextPut: char. char = $" ifTrue: [stream nextPut: char]]. ^ stream contents! ! !ImportedSkin class methodsFor: 'release notes - tools' stamp: 'sbw 4/12/2003 11:29'! constructChangeSetPreambleStringFromPieces | stream string | stream _ WriteStream on: ''. stream nextPutAll: self headerForRevisionsSection. string _ self extractRevisions. string isNil ifTrue: [string _ self latestRevisionTag]. stream nextPutAll: string; cr. string _ self extractFeatures. string isNil ifFalse: [stream nextPutAll: 'FEATURES:'; cr; nextPutAll: string; cr]. string _ self extractBugs. string isNil ifFalse: [stream nextPutAll: 'KNOWN BUGS:'; cr; nextPutAll: string; cr]. ^ stream contents! ! !ImportedSkin class methodsFor: 'release notes - tools' stamp: 'sbw 4/12/2003 08:19'! extractBugs "ImportedSkin extractBugs" ^ self extractContentFrom: #bugs! ! !ImportedSkin class methodsFor: 'release notes - tools' stamp: 'sbw 4/12/2003 08:12'! extractContentFrom: symbol "ImportedSkin extractContentFrom: #revisions" | string stream tag lines output | string _ self perform: symbol. stream _ ReadStream on: string. tag _ stream nextLine; nextLine. tag asSymbol = symbol ifFalse: [^ nil]. tag _ stream nextLine. tag = '---' ifFalse: [^nil]. lines _ OrderedCollection new. [stream atEnd] whileFalse: [lines add: stream nextLine]. lines last = '---' ifFalse: [^nil]. lines removeLast. output _ WriteStream on: ''. lines do: [:each | output nextPutAll: each; cr]. ^output contents! ! !ImportedSkin class methodsFor: 'release notes - tools' stamp: 'sbw 4/12/2003 08:19'! extractFeatures "ImportedSkin extractFeatures" ^ self extractContentFrom: #features! ! !ImportedSkin class methodsFor: 'release notes - tools' stamp: 'sbw 4/12/2003 08:16'! extractRevisions "ImportedSkin extractRevisions" ^self extractContentFrom: #revisions! ! !ImportedSkin class methodsFor: 'release notes - tools' stamp: 'sbw 4/12/2003 11:27'! headerForRevisionsSection ^'Requires change sets: dialogs, importer-support and xpm-support. DO NOT EDIT THIS PREAMBLE MANUALLY. See ImportedSkin updateChangeSetPreambleForSkinImporter Date Update ------------- ----------------------------------------------------------------------------------- '! ! !ImportedSkin class methodsFor: 'release notes - tools' stamp: 'sbw 4/12/2003 08:33'! installNewPreambleForChangeSetNamed: aString | changeSet newContent | changeSet _ ChangeSorter changeSetNamed: aString. changeSet isNil ifTrue: [^ self inform: 'Change set "' , aString , '" not found.']. newContent _ self newPreambleForChangeSetNamed: aString . changeSet preambleString: newContent! ! !ImportedSkin class methodsFor: 'release notes - tools' stamp: 'sbw 4/12/2003 08:18'! latestRevisionTag "ImportedSkin latestRevisionTag" | content stream | content _ self extractContentFrom: #revisions. content isNil ifTrue: [^Date today printString]. stream _ ReadStream on: content. ^stream nextLine.! ! !ImportedSkin class methodsFor: 'release notes - tools' stamp: 'sbw 4/12/2003 11:27'! newPreambleForChangeSetNamed: aString | changeSet stream line originalPreamble | changeSet _ ChangeSorter changeSetNamed: aString. changeSet isNil ifTrue: [^ self inform: 'Change set "' , aString , '" not found.']. "Keep header lines from the original preamble text." originalPreamble _ changeSet preambleString. stream _ ReadWriteStream on: ''. 1 to: 4 do: [:index | line _ originalPreamble lineNumber: index. line isEmpty ifFalse: [stream nextPutAll: line]. stream cr]. "Add the new body of text." stream nextPutAll: self constructChangeSetPreambleString. "Close with a double quote." stream nextPut: $". ^ stream contents! ! !ImportedSkin class methodsFor: 'bug reporting' stamp: 'sbw 4/12/2003 09:13'! bugReportSubjectLine ^'Skins II bug report'! ! !ImportedSkin class methodsFor: 'bug reporting' stamp: 'sbw 4/12/2003 09:30'! buildMessage: aBugReportString forMailOutWithUser: userName | message | message _ MailMessage empty. message setField: 'from' toString: userName. message setField: 'to' toString: self emailAddressForBugReports. message setField: 'subject' toString: self bugReportSubjectLine. message body: (MIMEDocument contentType: 'text/plain' content: aBugReportString). ^ message! ! !ImportedSkin class methodsFor: 'bug reporting' stamp: 'sbw 4/12/2003 09:29'! emailAddressForBugReports ^'swessels@one.net'! ! !ImportedSkin class methodsFor: 'bug reporting' stamp: 'sbw 4/12/2003 09:19'! mailOutBugReport: aBugReportString | usingCeleste server userName message | usingCeleste _ (Smalltalk includesKey: #Celeste) and: [Celeste isSmtpServerSet]. usingCeleste ifTrue: [server _ Celeste smtpServer. userName _ Celeste userName] ifFalse: [server _ FillInTheBlank request: 'What is your mail server for outgoing mail?'. userName _ FillInTheBlank request: 'What is your email address?']. Cursor write showWhile: [message _ self buildMessage: aBugReportString forMailOutWithUser: userName]. usingCeleste ifTrue: [CelesteComposition openForCeleste: Celeste current initialText: message text] ifFalse: [AdHocComposition openForCeleste: server initialText: message text]. ! ! !ImportedSkin class methodsFor: 'bug reporting' stamp: 'sbw 4/12/2003 14:38'! reportABugForSkin: anImportedSkin " can be nil." "ImportedSkin reportABugForSkin: nil" | tag currentSkinName stream initials | tag _ anImportedSkin isNil ifTrue: ['undefined skin'] ifFalse: [anImportedSkin folderName]. currentSkinName _ self current isNil ifTrue: ['undefined current skin'] ifFalse: [self current folderName]. initials _ Utilities authorInitialsPerSe. stream _ WriteStream on: ''. stream nextPutAll: 'Report: '; nextPutAll: self bugReportSubjectLine; cr; nextPutAll: 'When: '; nextPutAll: Date today printString , ' ' , Time now printString; cr. self writeVersionDataOn: stream. stream nextPutAll: 'Current skin name: "' , currentSkinName , '"'; cr; nextPutAll: 'Active skin name: "' , tag , '"'; cr. initials isNil ifFalse: [stream nextPutAll: 'Initials: ' , initials; cr]. stream cr; nextPutAll: 'Comment:'; cr; nextPutAll: 'Put your comments or description here.'; cr; nextPutAll: 'Please leave the SUBJECT line of the email intact.'. self mailOutBugReport: stream contents! ! !ImportedSkin class methodsFor: 'bug reporting' stamp: 'sbw 4/12/2003 14:03'! writeVersionDataOn: strm | changeSetName changeSet revString | strm nextPutAll: 'VM: '; nextPutAll: Smalltalk vmVersion asString; cr; nextPutAll: 'Image: '; nextPutAll: Smalltalk version asString; nextPutAll: ' ['; nextPutAll: Smalltalk lastUpdateString asString; nextPutAll: ']'; cr; nextPutAll: 'Platform: '; nextPutAll: Smalltalk platformSubtype asString; nextPutAll: ' - '; nextPutAll: Smalltalk platformName asString; nextPutAll: ' ['; nextPutAll: Smalltalk osVersion asString; nextPutAll: ']'; cr. #(#dialogsChangeSetName #xpmChangeSetName #supportChangeSetName #primaryChangeSetName ) do: [:each | changeSetName _ self perform: each. changeSet _ ChangeSorter changeSetNamed: changeSetName. changeSet isNil ifFalse: [revString _ changeSet latestRevisionTag. strm nextPutAll: 'Change Set: "' , changeSetName , '" Revision: ' , (revString isNil ifTrue: ['unknown'] ifFalse: [revString]); cr]]! ! !ImportedSkin class methodsFor: 'as yet unclassified' stamp: 'sbw 4/1/2003 07:30'! allSkinForms SkinForms == nil ifTrue: [SkinForms _ Dictionary new]. ^ SkinForms! ! !ImportedSkin class methodsFor: 'as yet unclassified' stamp: 'sbw 4/1/2003 12:44'! allSkinParameters SkinParameters == nil ifTrue: [SkinParameters _ Dictionary new]. ^ SkinParameters! ! !ImportedSkin class methodsFor: 'as yet unclassified' stamp: 'sbw 4/6/2003 08:25'! clear "ImportedSkin clear" "Turn off the preference." Preferences disable: #automaticApplicationOfSkins. self removeAllAssignedSkins. Current _ nil. self resetSkinVariables! ! !ImportedSkin class methodsFor: 'as yet unclassified' stamp: 'sbw 3/5/2003 20:10'! current Current == nil ifTrue: [Current _ self new]. ^ Current! ! !ImportedSkin class methodsFor: 'as yet unclassified' stamp: 'sbw 3/8/2003 22:10'! current: skin ^Current _ skin! ! !ImportedSkin class methodsFor: 'as yet unclassified' stamp: 'sbw 3/16/2003 16:36'! initialize "ImportedSkin initialize." Smalltalk addToStartUpList: self. self startUp! ! !ImportedSkin class methodsFor: 'as yet unclassified' stamp: 'sbw 3/5/2003 20:18'! loadSkinFromList! ! !ImportedSkin class methodsFor: 'as yet unclassified' stamp: 'sbw 3/5/2003 20:10'! new ^ super new initialize! ! !ImportedSkin class methodsFor: 'as yet unclassified' stamp: 'sbw 4/7/2003 18:47'! postLoad "ImportedSkin postLoad" "Add preferences." self createPreferences. "Clear out existing definitions in case of change to structure." self clear! ! !ImportedSkin class methodsFor: 'as yet unclassified' stamp: 'sbw 4/5/2003 06:43'! removeAllAssignedSkins "ImportedSkin removeAllAssignedSkins" | skinClasses | skinClasses _ self allSubclasses. skinClasses add: self. skinClasses do: [:each | each allInstances do: [:inst | inst dependents do: [:dep | dep removeSkin]]]! ! !ImportedSkin class methodsFor: 'as yet unclassified' stamp: 'sbw 3/16/2003 16:32'! resetCurrentSkinsDirectory "ImportedSkin current class resetCurrentSkinsDirectory" self current directory: nil! ! !ImportedSkin class methodsFor: 'as yet unclassified' stamp: 'sbw 4/1/2003 07:43'! resetSkinForms "ImportedSkin resetSkinForms" SkinForms _ nil! ! !ImportedSkin class methodsFor: 'as yet unclassified' stamp: 'sbw 4/1/2003 12:44'! resetSkinParameters "ImportedSkin resetSkinParameters" SkinParameters _ nil! ! !ImportedSkin class methodsFor: 'as yet unclassified' stamp: 'sbw 4/1/2003 18:14'! resetSkinVariables "ImportedSkin resetSkinVariables" ImportedSkin resetSkinForms; resetSkinParameters! ! !ImportedSkin class methodsFor: 'as yet unclassified' stamp: 'sbw 3/16/2003 16:37'! startUp ^ self resetCurrentSkinsDirectory! ! !ImportedSkin class methodsFor: 'preferences' stamp: 'sbw 4/13/2003 09:19'! automaticApplicationOfSkinsPreference "ImportedSkin automaticApplicationOfSkinsPreference" Preferences addPreference: #automaticApplicationOfSkins categories: #(#skins ) default: true balloonHelp: 'If true, new system windows will have the current skin applied automatically as they are opened.'! ! !ImportedSkin class methodsFor: 'preferences' stamp: 'sbw 4/13/2003 09:29'! createPreferences "ImportedSkin createPreferences" self automaticApplicationOfSkinsPreference; showProgressOnSkinsPreference; skinBackgroundPreference; skinBalloonHelpPreference; skinButtonsPreference; skinDialogsPreference; skinListBoxesPreference; skinMenusPreference; skinMenusWithFormsPreference; skinSetsHighlightColorPreference; skinTextPanesPreference; windowSkinAutomaticallyBecomesCurrentPreference! ! !ImportedSkin class methodsFor: 'preferences' stamp: 'sbw 4/13/2003 09:17'! showProgressOnSkinsPreference "ImportedSkin showProgressOnSkinsPreference" Preferences addPreference: #showProgressOnSkins categories: #(#skins ) default: false balloonHelp: 'If true the windows will show load progress as a skin is applied.'! ! !ImportedSkin class methodsFor: 'preferences' stamp: 'sbw 4/13/2003 09:27'! skinBackgroundPreference "ImportedSkin skinBackgroundPreference" Preferences addPreference: #skinBackground categories: #(#skins ) default: false balloonHelp: 'If true (and automaticApplicationOfSkins is true), the World desktop will have the backdrop defined by the current skin applied (if it is present). This can be slow to load'! ! !ImportedSkin class methodsFor: 'preferences' stamp: 'sbw 4/13/2003 09:08'! skinBalloonHelpPreference "ImportedSkin skinBalloonHelpPreference" Preferences addPreference: #skinBalloonHelp categories: #(#skins ) default: true balloonHelp: 'If true (and automaticApplicationOfSkins is true), balloon help will have current skin applied.'! ! !ImportedSkin class methodsFor: 'preferences' stamp: 'sbw 4/13/2003 09:07'! skinButtonsPreference "ImportedSkin skinButtonsPreference" Preferences addPreference: #skinButtons categories: #(#skins ) default: true balloonHelp: 'If true (and automaticApplicationOfSkins is true), pluggable buttons will have current skin applied.'! ! !ImportedSkin class methodsFor: 'preferences' stamp: 'sbw 4/13/2003 09:29'! skinDialogsPreference "ImportedSkin skinDialogsPreference" Preferences addPreference: #skinDialogs categories: #(#skins ) default: true balloonHelp: 'If true (and automaticApplicationOfSkins is true), prompter windows will be skinned.'! ! !ImportedSkin class methodsFor: 'preferences' stamp: 'sbw 4/13/2003 09:07'! skinListBoxesPreference "ImportedSkin skinListBoxesPreference" Preferences addPreference: #skinListBoxes categories: #(#skins ) default: true balloonHelp: 'If true (and automaticApplicationOfSkins is true), list boxes will have current skin applied.'! ! !ImportedSkin class methodsFor: 'preferences' stamp: 'sbw 4/13/2003 09:07'! skinMenusPreference "ImportedSkin skinMenusPreference" Preferences addPreference: #skinMenus categories: #(#skins ) default: true balloonHelp: 'If true (and automaticApplicationOfSkins is true), menus will have current skin applied.'! ! !ImportedSkin class methodsFor: 'preferences' stamp: 'sbw 4/13/2003 09:20'! skinMenusWithFormsPreference "ImportedSkin skinMenusWithFormsPreference" Preferences addPreference: #skinMenusWithForms categories: #(#skins ) default: false balloonHelp: 'If true (and both skinMenus and automaticApplicationOfSkins are true), menus will have current skin forms applied as background.'! ! !ImportedSkin class methodsFor: 'preferences' stamp: 'sbw 4/13/2003 09:07'! skinSetsHighlightColorPreference "ImportedSkin skinSetsHighlightColorPreference" Preferences addPreference: #skinSetsHighlightColor categories: #(#skins ) default: false balloonHelp: 'If true (and both automaticApplicationOfSkins and skinTextPanes are true), text panes will set the highlight color from the skin definition file.'! ! !ImportedSkin class methodsFor: 'preferences' stamp: 'sbw 4/13/2003 09:20'! skinTextPanesPreference "ImportedSkin skinTextPanesPreference" Preferences addPreference: #skinTextPanes categories: #(#skins ) default: false balloonHelp: 'If true (and automaticApplicationOfSkins is true), text panes will have current skin applied.'! ! !ImportedSkin class methodsFor: 'preferences' stamp: 'sbw 4/13/2003 09:07'! windowSkinAutomaticallyBecomesCurrentPreference "ImportedSkin windowSkinAutomaticallyBecomesCurrentPreference" Preferences addPreference: #windowSkinAutomaticallyBecomesCurrent categories: #(#skins ) default: true balloonHelp: 'If true, the skin you apply to a window will become the "current" skin..'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 14:13'! defaultSkin ^'default.theme'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/17/2003 22:08'! frameBottomActive ^ 'frameAB.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/17/2003 22:11'! frameBottomInactive ^ 'frameIB.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/17/2003 22:08'! frameBottomLeftActive ^ 'frameABL.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/17/2003 22:09'! frameBottomLeftInactive ^ 'frameIBL.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/17/2003 22:08'! frameBottomRightActive ^ 'frameABR.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/17/2003 22:09'! frameBottomRightInactive ^ 'frameIBR.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/17/2003 22:08'! frameLeftActive ^ 'frameAL.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/17/2003 22:10'! frameLeftInactive ^ 'frameIL.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/17/2003 22:07'! frameRightActive ^ 'frameAR.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/17/2003 22:10'! frameRightInactive ^ 'frameIR.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/17/2003 22:07'! frameTopActive ^ 'frameAT.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/17/2003 22:10'! frameTopInactive ^ 'frameIT.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/17/2003 22:06'! frameTopLeftActive ^ 'frameATL.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/17/2003 22:06'! frameTopLeftInactive ^ 'frameITL.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/17/2003 22:07'! frameTopRightActive ^ 'frameATR.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/17/2003 22:10'! frameTopRightInactive ^ 'frameITR.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 4/8/2003 18:55'! menuBackground ^ 'menubg.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 18:08'! titleBarActiveLeft "AL (AS) AP (AT) AM (AB) AR" "Items can be absent, parenthesis means repeats." ^ 'titleAL.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 18:09'! titleBarActiveLeftRepeat "AL (AS) AP (AT) AM (AB) AR" "Items can be absent, parenthesis means repeats." ^ 'titleAS.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 18:09'! titleBarActiveLeftTitle "AL (AS) AP (AT) AM (AB) AR" "Items can be absent, parenthesis means repeats." ^ 'titleAP.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 18:10'! titleBarActiveRight "AL (AS) AP (AT) AM (AB) AR" "Items can be absent, parenthesis means repeats." ^ 'titleAR.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 18:10'! titleBarActiveRightRepeat "AL (AS) AP (AT) AM (AB) AR" "Items can be absent, parenthesis means repeats." ^ 'titleAB.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 18:10'! titleBarActiveRightTitle "AL (AS) AP (AT) AM (AB) AR" "Items can be absent, parenthesis means repeats." ^ 'titleAM.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 18:09'! titleBarActiveTitle "AL (AS) AP (AT) AM (AB) AR" "Items can be absent, parenthesis means repeats." ^ 'titleAT.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 18:11'! titleBarInactiveLeft "IL (IS) IP (IT) IM (IB) IR" "Items can be absent, parenthesis means repeats." ^ 'titleIL.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 18:11'! titleBarInactiveLeftRepeat "IL (IS) IP (IT) IM (IB) IR" "Items can be absent, parenthesis means repeats." ^ 'titleIS.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 18:12'! titleBarInactiveLeftTitle "IL (IS) IP (IT) IM (IB) IR" "Items can be absent, parenthesis means repeats." ^ 'titleIP.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 18:12'! titleBarInactiveRight "IL (IS) IP (IT) IM (IB) IR" "Items can be absent, parenthesis means repeats." ^ 'titleIR.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 18:13'! titleBarInactiveRightRepeat "IL (IS) IP (IT) IM (IB) IR" "Items can be absent, parenthesis means repeats." ^ 'titleIB.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 18:13'! titleBarInactiveRightTitle "IL (IS) IP (IT) IM (IB) IR" "Items can be absent, parenthesis means repeats." ^ 'titleIM.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 18:13'! titleBarInactiveTitle "IL (IS) IP (IT) IM (IB) IR" "Items can be absent, parenthesis means repeats." ^ 'titleIT.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 14:14'! windowCloseButtonActive ^'closeA.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 14:14'! windowCloseButtonInactive ^ 'closeI.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/11/2003 21:18'! windowHideActive ^ 'hideA.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/11/2003 21:18'! windowHideInactive ^ 'hideI.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 14:16'! windowMaximizeButtonActive ^ 'maximizeA.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 14:16'! windowMaximizeButtonInactive ^ 'maximizeI.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 14:17'! windowMenuButtonActive ^ 'menuButtonA.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 14:17'! windowMenuButtonInactive ^ 'menuButtonI.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 14:17'! windowMinimizeButtonActive ^ 'minimizeA.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 14:18'! windowMinimizeButtonInactive ^ 'minimizeI.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 14:18'! windowRestoreButtonActive ^ 'restoreA.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/4/2003 14:18'! windowRestoreButtonInactive ^ 'restoreI.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/11/2003 21:13'! windowRollDownButtonActive ^ 'rolldownA.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/11/2003 21:14'! windowRollDownButtonInactive ^ 'rolldownI.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/11/2003 21:14'! windowRollUpButtonActive ^ 'rollupA.xpm'! ! !ImportedIceWMSkin class methodsFor: 'file names' stamp: 'sbw 3/11/2003 21:14'! windowRollUpButtonInactive ^ 'rollupI.xpm'! ! !ImportedIceWMSkin class methodsFor: 'validation' stamp: 'sbw 3/5/2003 20:46'! isDirectoryValid: aDirectory ^ aDirectory fileNames includes: self defaultSkin! ! !ImportedIceWMSkin class methodsFor: 'private' stamp: 'sbw 3/7/2003 21:34'! applicatorClass ^IceWMSkinApplicator! ! !ImportedIceWMSkin class methodsFor: 'private' stamp: 'sbw 4/10/2003 20:26'! loadSkinFrom: aDirectory | theSkin | theSkin _ self new loadSkinFrom: aDirectory. Preferences windowSkinAutomaticallyBecomesCurrent ifTrue: [theSkin makeSkinCurrent]. ^ theSkin! ! !ImportedIceWMSkin class methodsFor: 'private' stamp: 'sbw 4/6/2003 09:35'! loadSkinFromListIn: aDirectory | folders validFolders which | folders _ aDirectory directoryNames. validFolders _ folders select: [:each | self isDirectoryValid: (aDirectory directoryNamed: each)]. validFolders isEmpty ifTrue: [self inform: 'No valid ' , self skinTypeName , ' skins found.'. ^ nil]. validFolders _ validFolders asSortedCollection: [:a :b | a asLowercase < b asLowercase]. which _ PopUpMenu withCaption: 'Select skin' chooseFrom: validFolders. which = 0 ifTrue: [^ nil]. ^ self loadSkinFrom: (aDirectory directoryNamed: (validFolders at: which))! ! !ImportedIceWMSkin class methodsFor: 'private' stamp: 'sbw 3/6/2003 13:14'! loadSkinsFrom: aDirectory | folders validFolders skins | folders _ aDirectory directoryNames. validFolders _ folders select: [:each | self isDirectoryValid: (aDirectory directoryNamed: each)]. validFolders isEmpty ifTrue: [^ self inform: 'No valid ' , self skinTypeName , ' skins found.']. skins _ validFolders collect: [:each | self loadSkinFrom: (aDirectory directoryNamed: each)]. ^skins! ! !ImportedIceWMSkin class methodsFor: 'private' stamp: 'sbw 3/6/2003 03:55'! skinTypeName ^'IceWM'! ! !ImportedIceWMSkin class methodsFor: 'API' stamp: 'sbw 3/12/2003 18:47'! getSkinFromList "ImportedIceWMSkin getSkinFromList" | inputDir aDir onceSet | onceSet _ false. aDir _ FileDirectory default. self current isNil ifFalse: [self current directory isNil ifFalse: [aDir _ self current directory containingDirectory. onceSet _ true]]. inputDir _ onceSet ifTrue: [self current directory containingDirectory] ifFalse: [FileList2 modalFolderSelector: aDir prompt: 'Please select ' , self skinTypeName , ' skins folder.']. inputDir isNil ifTrue: [^ nil]. ^ self loadSkinFromListIn: inputDir! ! !ImportedIceWMSkin class methodsFor: 'API' stamp: 'sbw 4/10/2003 20:26'! loadSkinFromList "ImportedIceWMSkin loadSkinFromList" | skin | skin _ self getSkinFromList. skin isNil ifTrue: [^ nil]. Preferences windowSkinAutomaticallyBecomesCurrent ifTrue: [skin makeSkinCurrent]. ^ skin! ! !ImportedIceWMSkin class methodsFor: 'API' stamp: 'sbw 4/6/2003 08:37'! loadSkins "ImportedIceWMSkin loadSkins" | inputDir | inputDir _ FileList2 modalFolderSelectorWithPrompt: 'Please select ' , self skinTypeName , ' skins folder.'. inputDir isNil ifTrue: [^ nil]. self loadSkinsFrom: inputDir. ! ! !Inspector class methodsFor: 'instance creation' stamp: 'sbw 4/6/2003 15:55'! openAsMorphOn: anObject withLabel: aLabel "(Inspector openAsMorphOn: SystemOrganization) openInMVC" | window inspector | inspector _ self inspect: anObject. window _ (SystemWindow labelled: aLabel) model: inspector. window addMorph: (PluggableListMorph new doubleClickSelector: #inspectSelection; on: inspector list: #fieldList selected: #selectionIndex changeSelected: #toggleIndex: menu: ((inspector isMemberOf: DictionaryInspector) ifTrue: [#dictionaryMenu:] ifFalse: [#fieldListMenu:]) keystroke: #inspectorKey:from:) frame: (0 @ 0 corner: self horizontalDividerProportion @ self verticalDividerProportion). window addMorph: (PluggableTextMorph on: inspector text: #contents accept: #accept: readSelection: #contentsSelection menu: #codePaneMenu:shifted:) frame: (self horizontalDividerProportion @ 0 corner: 1 @ self verticalDividerProportion). window addMorph: ((PluggableTextMorph on: inspector text: #trash accept: #trash: readSelection: #contentsSelection menu: #codePaneMenu:shifted:) askBeforeDiscardingEdits: false) frame: (0 @ self verticalDividerProportion corner: 1 @ 1). window setUpdatablePanesFrom: #(#fieldList ). window position: 16 @ 0. "Room for scroll bar." window automaticallyApplyCurrentSkin. ^ window! ! !Morph methodsFor: 'skins' stamp: 'sbw 4/9/2003 12:36'! isPluggableButtonMorph ^ false! ! !Morph methodsFor: 'skins' stamp: 'sbw 4/9/2003 12:35'! isSimpleButtonMorph ^ false! ! !Morph methodsFor: 'skins' stamp: 'sbw 4/8/2003 20:09'! topOwnerOfKind: aClass | next | next _ self owner. ^ (next isKindOf: aClass) ifTrue: [next topOwnerOfKind: aClass] ifFalse: [self]! ! !BalloonMorph methodsFor: 'initialization' stamp: 'sbw 4/7/2003 18:56'! popUpForHand: aHand "Pop up the receiver as balloon help for the given hand" | worldBounds skin useSkin balloonColorChoice balloonTextColorChoice tMorph | self lock. self fullBounds. skin _ self skinToUse. useSkin _ skin isNil not and: [Preferences skinBalloonHelp and: [balloonColorChoice _ skin colorToolTip. balloonColorChoice isNil not and: [balloonTextColorChoice _ skin colorToolTipText. balloonTextColorChoice isNil not]]]. tMorph _ self findA: TextMorph. tMorph isNil ifFalse: [useSkin ifTrue: [color _ balloonColorChoice. tMorph color: balloonTextColorChoice] ifFalse: [color _ self class balloonColor. tMorph color: Color black]]. "force layout" self setProperty: #morphicLayerNumber toValue: self morphicLayerNumber. aHand world addMorphFront: self. "So that if the translation below makes it overlap the receiver, it won't interfere with the rootMorphsAt: logic and hence cause flashing. Without this, flashing happens, believe me!!" ((worldBounds _ aHand world bounds) containsRect: self bounds) ifFalse: [self bounds: (self bounds translatedToBeWithin: worldBounds)]. aHand balloonHelp: self! ! !FillInTheBlankMorph methodsFor: 'initialization' stamp: 'sbw 4/13/2003 11:15'! setQuery: queryString initialAnswer: initialAnswer answerExtent: answerExtent acceptOnCR: acceptBoolean | query frame topOffset accept cancel buttonAreaHeight skin useSkin selectedColor selectedTextColor selectedActiveColor | skin _ self skinToUse. useSkin _ skin isNil not and: [Preferences skinDialogs]. response _ initialAnswer. done _ false. self removeAllMorphs. self layoutPolicy: ProportionalLayout new. query _ TextMorph new contents: queryString. query setNameTo: 'query'. useSkin ifTrue: [selectedColor _ skin colorLabelText. selectedColor isNil ifFalse: [query color: selectedColor]]. query lock. frame _ LayoutFrame new. frame topFraction: 0.0; topOffset: 2. frame leftFraction: 0.5; leftOffset: (query width // 2) negated. query layoutFrame: frame. self addMorph: query. topOffset _ query height + 4. accept _ SimpleButtonMorph new target: self; color: Color veryLightGray. accept label: 'Accept(s)'; actionSelector: #accept. useSkin ifTrue: [selectedColor _ skin colorNormalButton. selectedTextColor _ skin colorNormalButtonText. (selectedColor isNil not and: [selectedTextColor isNil not]) ifTrue: [accept setLabelToColor: selectedTextColor; recolor: selectedColor]]. accept setNameTo: 'accept'. frame _ LayoutFrame new. frame rightFraction: 0.5; rightOffset: -10; bottomFraction: 1.0; bottomOffset: -2. accept layoutFrame: frame. self addMorph: accept. cancel _ SimpleButtonMorph new target: self; color: Color veryLightGray. cancel label: 'Cancel(l)'; actionSelector: #cancel. useSkin ifTrue: [selectedColor _ skin colorNormalButton. selectedTextColor _ skin colorNormalButtonText. selectedActiveColor _ skin colorActiveButton. (selectedColor isNil not and: [selectedTextColor isNil not]) ifTrue: [cancel setLabelToColor: selectedTextColor; color: selectedColor. selectedActiveColor isNil ifFalse: [cancel oldColor: selectedActiveColor]]]. cancel setNameTo: 'cancel'. frame _ LayoutFrame new. frame leftFraction: 0.5; leftOffset: 10; bottomFraction: 1.0; bottomOffset: -2. cancel layoutFrame: frame. self addMorph: cancel. buttonAreaHeight _ (accept height max: cancel height) + 4. textPane _ PluggableTextMorph on: self text: #response accept: #response: readSelection: #selectionInterval menu: #codePaneMenu:shifted:. textPane extent: answerExtent. textPane hResizing: #spaceFill; vResizing: #spaceFill. textPane borderWidth: 2. textPane hasUnacceptedEdits: true. textPane acceptOnCR: acceptBoolean. textPane setNameTo: 'textPane'. useSkin ifTrue: [textPane color: Color white]. frame _ LayoutFrame new. frame leftFraction: 0.0; rightFraction: 1.0; topFraction: 0.0; topOffset: topOffset; bottomFraction: 1.0; bottomOffset: buttonAreaHeight negated. textPane layoutFrame: frame. self addMorph: textPane. self extent: (query extent x max: answerExtent x) + 4 @ (topOffset + answerExtent y + 4 + buttonAreaHeight)! ! !FillInTheBlankMorph methodsFor: 'skins' stamp: 'sbw 4/13/2003 09:42'! initializeSkinned | skin useSkin | skin _ self skinToUse. useSkin _ skin isNil not. useSkin ifTrue: [^self initializeSkinnedWith: skin]. ^ useSkin! ! !FillInTheBlankMorph methodsFor: 'skins' stamp: 'sbw 4/13/2003 10:01'! initializeSkinnedWith: aSkin | useSkin selectedColor | selectedColor _ aSkin colorDialog. useSkin _ selectedColor isNil not. useSkin ifTrue: [color _ selectedColor] ifFalse: [^ false]. borderWidth _ aSkin dlgBorderSizeX. selectedColor _ aSkin colorActiveBorder. selectedColor isNil ifFalse: [self borderColor: selectedColor]. self extent: 200 @ 70. responseUponCancel _ ''. ^ true! ! !FillInTheBlankMorph methodsFor: 'menu' stamp: 'sbw 4/13/2003 10:08'! initialize super initialize. Preferences roundedWindowCorners ifTrue: [self useRoundedCorners]. Preferences skinDialogs ifTrue: [self initializeSkinned ifTrue: [^ self]]. color _ Color white. borderWidth _ 2. self extent: 200 @ 70. responseUponCancel _ ''! ! !IndentingListItemMorph methodsFor: 'drawing' stamp: 'sbw 4/6/2003 17:31'! drawOn: aCanvas | tRect sRect columnRect columnScanner columnData columnLeft colorToUse | tRect _ self toggleRectangle. sRect _ bounds withLeft: tRect right + 3. self drawToggleOn: aCanvas in: tRect. colorToUse _ complexContents preferredColor ifNil: [self color]. (container columns isNil or: [(contents asString indexOf: Character tab) = 0]) ifTrue: [aCanvas drawString: contents asString in: sRect font: self fontToUse color: colorToUse] ifFalse: [columnLeft _ sRect left. columnScanner _ ReadStream on: contents asString. container columns do: [:width | columnRect _ columnLeft @ sRect top extent: width @ sRect height. columnData _ columnScanner upTo: Character tab. columnData isEmpty ifFalse: [aCanvas drawString: columnData in: columnRect font: self fontToUse color: colorToUse]. columnLeft _ columnRect right + 5]]! ! !IndentingListItemMorph methodsFor: 'drawing' stamp: 'sbw 4/7/2003 18:58'! highlight | skin useSkin colorChoice | complexContents highlightingColor ifNotNil: [skin _ self owner skinToUse. useSkin _ skin isNil not and: [Preferences skinListBoxes and: [colorChoice _ skin colorListBoxSelectionText. colorChoice isNil not]]. self color: (useSkin ifTrue: [colorChoice] ifFalse: [complexContents highlightingColor])]. self changed! ! !IndentingListItemMorph methodsFor: 'drawing' stamp: 'sbw 4/7/2003 18:58'! unhighlight | skin useSkin colorChoice | complexContents highlightingColor ifNotNil: [skin _ self owner skinToUse. useSkin _ skin isNil not and: [Preferences skinListBoxes and: [colorChoice _ skin colorListBoxText. colorChoice isNil not]]. self color: (useSkin ifTrue: [colorChoice] ifFalse: [Color black])]. self changed! ! !MenuItemMorph methodsFor: 'initialization' stamp: 'sbw 4/7/2003 18:59'! initialize | skin useSkin skinColorChoice | super initialize. bounds _ 0 @ 0 extent: 10 @ 10. skin _ self skinToUse. useSkin _ skin isNil not and: [Preferences skinMenus and: [skinColorChoice _ skin colorNormalMenuItemText. skinColorChoice isNil not]]. color _ useSkin ifTrue: [skinColorChoice] ifFalse: [Color black]. contents _ ''. hasFocus _ false. isEnabled _ true. subMenu _ nil. isSelected _ false. target _ nil. selector _ nil. arguments _ nil. font _ Preferences standardMenuFont. self hResizing: #spaceFill; vResizing: #shrinkWrap! ! !MenuItemMorph methodsFor: 'drawing' stamp: 'sbw 4/7/2003 18:58'! drawOn: aCanvas | sel