diff -r 6c14008722e9 -r 4cea2d4e9dbc UIPainter.st --- a/UIPainter.st Fri Jul 09 21:30:32 1999 +0200 +++ b/UIPainter.st Sat Jul 10 00:11:07 1999 +0200 @@ -689,165 +689,161 @@ ^ #(#FullSpec - #name: #windowSpec - #window: + #name: #windowSpec + #window: #(#WindowSpec - #label: 'GUI Painter' - #name: 'GUI Painter' - #layout: #(#LayoutFrame 220 0 200 0 827 0 722 0) - #min: #(#Point 560 460) - #max: #(#Point 1160 870) - #bounds: #(#Rectangle 220 200 828 723) - #menu: #menu - ) - #component: + #label: 'GUI Painter' + #name: 'GUI Painter' + #layout: #(#LayoutFrame 220 0 200 0 827 0 722 0) + #min: #(#Point 560 460) + #max: #(#Point 1160 870) + #bounds: #(#Rectangle 220 200 828 723) + #menu: #menu + ) + #component: #(#SpecCollection - #collection: #( - #(#MenuPanelSpec - #name: 'menuToolbarView' - #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 32 0) - #tabable: true - #menu: #menuToolbar - ) - #(#VariableHorizontalPanelSpec - #name: 'hpanel' - #layout: #(#LayoutFrame 0 0.0 34 0.0 0 1.0 -26 1.0) - #level: 1 - #handles: #(#Any 0.318868 1.0) - #component: - #(#SpecCollection - #collection: #( - #(#ArbitraryComponentSpec - #name: 'treeView' - #tabable: true - #menu: #menuEdit - #hasHorizontalScrollBar: true - #hasVerticalScrollBar: true - #miniScrollerHorizontal: true - #miniScrollerVertical: true - #hasBorder: false - #component: #treeView - ) - #(#ViewSpec - #name: 'specHolderView' - #borderWidth: 1 - #component: - #(#SpecCollection - #collection: #( - #(#MenuPanelSpec - #name: 'menuToolbar2View' - #layout: #(#LayoutFrame -1 0.0 -2 0 -1 1.0 30 0) - #enableChannel: #canMoveOrAlignSelection - #tabable: true - #menu: #menuToolbar2 - ) - #(#NoteBookViewSpec - #name: 'noteBook' - #layout: #(#LayoutFrame 0 0.0 34 0.0 0 1.0 -30 1.0) - #enableChannel: #enableChannel - #tabable: true - #model: #tabModel - #menu: #tabList - #canvas: #noteBookView - ) - #(#HorizontalPanelViewSpec - #name: 'horizontalPanelView1' - #layout: #(#LayoutFrame -163 1 -1 0 -35 1.0 28 0) - #horizontalLayout: #fit - #verticalLayout: #fit - #horizontalSpace: 0 - #verticalSpace: 0 - #component: - #(#SpecCollection - #collection: #( - #(#ArrowButtonSpec - #name: 'MoveLeftButton' - #activeHelpKey: #changePositionLeft - #tabable: true - #model: #moveSelectionLeft - #enableChannel: #canMoveOrAlignSelection - #isTriggerOnDown: true - #actionValue: '' - #direction: #left - #useDefaultExtent: true - ) - #(#ArrowButtonSpec - #name: 'MoveRightButton' - #activeHelpKey: #changePositionRight - #model: #moveSelectionRight - #enableChannel: #canMoveOrAlignSelection - #isTriggerOnDown: true - #actionValue: '' - #direction: #right - #useDefaultExtent: true - ) - #(#ArrowButtonSpec - #name: 'MoveDownButton' - #activeHelpKey: #changePositionDown - #model: #moveSelectionDown - #enableChannel: #canMoveOrAlignSelection - #isTriggerOnDown: true - #actionValue: '' - #direction: #down - #useDefaultExtent: true - ) - #(#ArrowButtonSpec - #name: 'MoveUpButton' - #activeHelpKey: #changePositionUp - #model: #moveSelectionUp - #enableChannel: #canMoveOrAlignSelection - #isTriggerOnDown: true - #actionValue: '' - #direction: #up - #useDefaultExtent: true - ) - ) + #collection: #( + #(#MenuPanelSpec + #name: 'menuToolbarView' + #layout: #(#LayoutFrame 0 0.0 0 0 0 1.0 32 0) + #tabable: true + #menu: #menuToolbar + ) + #(#VariableHorizontalPanelSpec + #name: 'hpanel' + #layout: #(#LayoutFrame 0 0.0 34 0.0 0 1.0 -26 1.0) + #level: 1 + #handles: #(#Any 0.318868 1.0) + #component: + #(#SpecCollection + #collection: #( + #(#ArbitraryComponentSpec + #name: 'treeView' + #tabable: true + #menu: #menuEdit + #hasHorizontalScrollBar: true + #hasVerticalScrollBar: true + #miniScrollerHorizontal: true + #miniScrollerVertical: true + #hasBorder: false + #component: #treeView + ) + #(#ViewSpec + #name: 'specHolderView' + #borderWidth: 1 + #component: + #(#SpecCollection + #collection: #( + #(#MenuPanelSpec + #name: 'menuToolbar2View' + #layout: #(#LayoutFrame -1 0.0 -2 0 -1 1.0 30 0) + #enableChannel: #canMoveOrAlignSelection + #tabable: true + #menu: #menuToolbar2 + ) + #(#NoteBookViewSpec + #name: 'noteBook' + #layout: #(#LayoutFrame 0 0.0 34 0.0 0 1.0 -30 1.0) + #enableChannel: #enableChannel + #tabable: true + #model: #tabModel + #menu: #tabList + #canvas: #noteBookView + ) + #(#HorizontalPanelViewSpec + #name: 'horizontalPanelView1' + #layout: #(#LayoutFrame -163 1 -1 0 -35 1.0 28 0) + #horizontalLayout: #fit + #verticalLayout: #fit + #horizontalSpace: 0 + #verticalSpace: 0 + #component: + #(#SpecCollection + #collection: #( + #(#ArrowButtonSpec + #name: 'MoveLeftButton' + #activeHelpKey: #changePositionLeft + #tabable: true + #model: #moveSelectionLeft + #enableChannel: #canMoveOrAlignSelection + #isTriggerOnDown: true + #direction: #left + #useDefaultExtent: true + ) + #(#ArrowButtonSpec + #name: 'MoveRightButton' + #activeHelpKey: #changePositionRight + #model: #moveSelectionRight + #enableChannel: #canMoveOrAlignSelection + #isTriggerOnDown: true + #direction: #right + #useDefaultExtent: true + ) + #(#ArrowButtonSpec + #name: 'MoveDownButton' + #activeHelpKey: #changePositionDown + #model: #moveSelectionDown + #enableChannel: #canMoveOrAlignSelection + #isTriggerOnDown: true + #direction: #down + #useDefaultExtent: true + ) + #(#ArrowButtonSpec + #name: 'MoveUpButton' + #activeHelpKey: #changePositionUp + #model: #moveSelectionUp + #enableChannel: #canMoveOrAlignSelection + #isTriggerOnDown: true + #direction: #up + #useDefaultExtent: true + ) + ) - ) - ) - #(#ActionButtonSpec - #label: 'helpIcon' - #name: 'openWidgetDocumentationButton' - #layout: #(#LayoutFrame -28 1 -1 0 0 1 28 0) - #activeHelpKey: #editOpenSpecDocumentation - #hasCharacterOrientedLabel: false - #model: #doOpenWidgetDocumentation - ) - #(#ActionButtonSpec - #label: 'Cancel' - #name: 'cancelButton' - #layout: #(#LayoutFrame 2 0 -26 1 -1 0.5 -2 1) - #activeHelpKey: #commitCancel - #tabable: true - #model: #cancel - #enableChannel: #modifiedChannel - ) - #(#ActionButtonSpec - #label: 'OK' - #name: 'acceptButton' - #layout: #(#LayoutFrame 1 0.5 -26 1 -2 1 -2 1) - #activeHelpKey: #commitOK - #tabable: true - #model: #accept - #enableChannel: #modifiedChannel - ) - ) + ) + ) + #(#ActionButtonSpec + #label: 'helpIcon' + #name: 'openWidgetDocumentationButton' + #layout: #(#LayoutFrame -28 1 -1 0 0 1 28 0) + #activeHelpKey: #editOpenSpecDocumentation + #hasCharacterOrientedLabel: false + #model: #doOpenWidgetDocumentation + ) + #(#ActionButtonSpec + #label: 'Cancel' + #name: 'cancelButton' + #layout: #(#LayoutFrame 2 0 -26 1 -1 0.5 -2 1) + #activeHelpKey: #commitCancel + #tabable: true + #model: #cancel + #enableChannel: #modifiedChannel + ) + #(#ActionButtonSpec + #label: 'OK' + #name: 'acceptButton' + #layout: #(#LayoutFrame 1 0.5 -26 1 -2 1 -2 1) + #activeHelpKey: #commitOK + #tabable: true + #model: #accept + #enableChannel: #modifiedChannel + ) + ) - ) - ) - ) + ) + ) + ) - ) - ) - #(#UISubSpecification - #name: 'infoBarSubSpec' - #layout: #(#LayoutFrame 0 0.0 -24 1 0 1.0 0 1.0) - #majorKey: #ToolApplicationModel - #minorKey: #windowSpecForInfoBar - ) - ) + ) + ) + #(#UISubSpecification + #name: 'infoBarSubSpec' + #layout: #(#LayoutFrame 0 0.0 -24 1 0 1.0 0 1.0) + #majorKey: #ToolApplicationModel + #minorKey: #windowSpecForInfoBar + ) + ) - ) + ) ) ! ! @@ -871,223 +867,223 @@ #(#Menu - #( - #(#MenuItem - #label: 'About' - #translateLabel: true - #activeHelpKey: #about - #labelImage: #(#ResourceRetriever nil #menuIcon) - #submenuChannel: #menuAbout - ) - #(#MenuItem - #label: 'File' - #translateLabel: true - #activeHelpKey: #file - #enabled: #enableChannel - #submenu: - #(#Menu + #( + #(#MenuItem + #label: 'About' + #translateLabel: true + #activeHelpKey: #about + #labelImage: #(#ResourceRetriever nil #menuIcon) + #submenuChannel: #menuAbout + ) + #(#MenuItem + #label: 'File' + #translateLabel: true + #activeHelpKey: #file + #enabled: #enableChannel + #submenu: + #(#Menu - #( - #(#MenuItem - #label: 'New' - #translateLabel: true - #value: #doNew - #activeHelpKey: #fileNew - ) - #(#MenuItem - #label: '-' - ) - #(#MenuItem - #label: 'Load...' - #translateLabel: true - #value: #doLoad - #activeHelpKey: #fileLoad - ) - #(#MenuItem - #label: 'Load Subspec...' - #translateLabel: true - #value: #doLoadSubspec - #activeHelpKey: #fileLoadSubspec - ) - #(#MenuItem - #label: '-' - ) - #(#MenuItem - #label: 'Save' - #translateLabel: true - #value: #doSave - #activeHelpKey: #fileSave - ) - #(#MenuItem - #label: 'Save As...' - #translateLabel: true - #value: #doSaveAs - #activeHelpKey: #fileSaveAs - ) - #(#MenuItem - #label: 'Define Class And Selector...' - #translateLabel: true - #value: #doDefineClassAndSelector - #activeHelpKey: #fileSaveAs - ) - #(#MenuItem - #label: '-' - ) - #(#MenuItem - #label: 'Pick A Window Spec...' - #translateLabel: true - #value: #doPickAView - #activeHelpKey: #filePickAnInterface - ) - #(#MenuItem - #label: '-' - ) - #(#MenuItem - #label: 'Show Window Spec' - #translateLabel: true - #value: #doWindowSpec - #activeHelpKey: #fileShowWindowSpec - ) - #(#MenuItem - #label: 'Browse Class' - #translateLabel: true - #value: #doBrowseClass - #activeHelpKey: #fileBrowseClass - #enabled: #hasSpecClass - ) - #(#MenuItem - #label: 'Browse Aspect Methods' - #translateLabel: true - #value: #doBrowseAspectMethods - #activeHelpKey: #fileBrowseAspectMethods - #enabled: #hasSpecClass - ) - #(#MenuItem - #label: '-' - ) - #(#MenuItem - #label: 'Exit' - #translateLabel: true - #value: #closeRequest - #activeHelpKey: #fileExit - ) - ) nil - nil - ) - ) - #(#MenuItem - #label: 'Edit' - #translateLabel: true - #activeHelpKey: #edit - #submenuChannel: #menuEdit - ) - #(#MenuItem - #label: 'Align' - #translateLabel: true - #activeHelpKey: #align - #submenuChannel: #menuAlign - ) - #(#MenuItem - #label: 'Generate' - #translateLabel: true - #activeHelpKey: #generate - #submenu: - #(#Menu + #( + #(#MenuItem + #label: 'New' + #translateLabel: true + #value: #doNew + #activeHelpKey: #fileNew + ) + #(#MenuItem + #label: '-' + ) + #(#MenuItem + #label: 'Load...' + #translateLabel: true + #value: #doLoad + #activeHelpKey: #fileLoad + ) + #(#MenuItem + #label: 'Load Subspec...' + #translateLabel: true + #value: #doLoadSubspec + #activeHelpKey: #fileLoadSubspec + ) + #(#MenuItem + #label: '-' + ) + #(#MenuItem + #label: 'Save' + #translateLabel: true + #value: #doSave + #activeHelpKey: #fileSave + ) + #(#MenuItem + #label: 'Save As...' + #translateLabel: true + #value: #doSaveAs + #activeHelpKey: #fileSaveAs + ) + #(#MenuItem + #label: 'Define Class And Selector...' + #translateLabel: true + #value: #doDefineClassAndSelector + #activeHelpKey: #fileSaveAs + ) + #(#MenuItem + #label: '-' + ) + #(#MenuItem + #label: 'Pick A Window Spec...' + #translateLabel: true + #value: #doPickAView + #activeHelpKey: #filePickAnInterface + ) + #(#MenuItem + #label: '-' + ) + #(#MenuItem + #label: 'Show Window Spec' + #translateLabel: true + #value: #doWindowSpec + #activeHelpKey: #fileShowWindowSpec + ) + #(#MenuItem + #label: 'Browse Class' + #translateLabel: true + #value: #doBrowseClass + #activeHelpKey: #fileBrowseClass + #enabled: #hasSpecClass + ) + #(#MenuItem + #label: 'Browse Aspect Methods' + #translateLabel: true + #value: #doBrowseAspectMethods + #activeHelpKey: #fileBrowseAspectMethods + #enabled: #hasSpecClass + ) + #(#MenuItem + #label: '-' + ) + #(#MenuItem + #label: 'Exit' + #translateLabel: true + #value: #closeRequest + #activeHelpKey: #fileExit + ) + ) nil + nil + ) + ) + #(#MenuItem + #label: 'Edit' + #translateLabel: true + #activeHelpKey: #edit + #submenuChannel: #menuEdit + ) + #(#MenuItem + #label: 'Align' + #translateLabel: true + #activeHelpKey: #align + #submenuChannel: #menuAlign + ) + #(#MenuItem + #label: 'Generate' + #translateLabel: true + #activeHelpKey: #generate + #submenu: + #(#Menu - #( - #(#MenuItem - #label: 'Aspect Methods' - #translateLabel: true - #value: #doGenerateAspectMethods - #activeHelpKey: #generateAspectMethods - #enabled: #hasSpecClass - ) - #(#MenuItem - #label: 'Menu Stub Methods' - #translateLabel: true - #value: #doGenerateMenuMethods - ) - #(#MenuItem - #label: '-' - ) - #(#MenuItem - #label: 'Hook Methods' - #translateLabel: true - #value: #doGenerateHookMethods - #activeHelpKey: #generateHookMethods - #enabled: #hasSpecClass - ) - ) nil - nil - ) - ) - #(#MenuItem - #label: 'Test' - #translateLabel: true - #activeHelpKey: #test - #submenu: - #(#Menu + #( + #(#MenuItem + #label: 'Aspect Methods' + #translateLabel: true + #value: #doGenerateAspectMethods + #activeHelpKey: #generateAspectMethods + #enabled: #hasSpecClass + ) + #(#MenuItem + #label: 'Menu Stub Methods' + #translateLabel: true + #value: #doGenerateMenuMethods + ) + #(#MenuItem + #label: '-' + ) + #(#MenuItem + #label: 'Hook Methods' + #translateLabel: true + #value: #doGenerateHookMethods + #activeHelpKey: #generateHookMethods + #enabled: #hasSpecClass + ) + ) nil + nil + ) + ) + #(#MenuItem + #label: 'Test' + #translateLabel: true + #activeHelpKey: #test + #submenu: + #(#Menu - #( - #(#MenuItem - #label: 'Start Application' - #translateLabel: true - #value: #doStartApplication - #activeHelpKey: #testStartApplication - ) - #(#MenuItem - #label: '-' - ) - #(#MenuItem - #label: 'Geometry Test Mode' - #translateLabel: true - #activeHelpKey: #testGeometryTestMode - #indication: #testMode: - ) - ) nil - nil - ) - ) - #(#MenuItem - #label: 'Settings' - #translateLabel: true - #activeHelpKey: #settings - #submenu: - #(#Menu + #( + #(#MenuItem + #label: 'Start Application' + #translateLabel: true + #value: #doStartApplication + #activeHelpKey: #testStartApplication + ) + #(#MenuItem + #label: '-' + ) + #(#MenuItem + #label: 'Geometry Test Mode' + #translateLabel: true + #activeHelpKey: #testGeometryTestMode + #indication: #testMode: + ) + ) nil + nil + ) + ) + #(#MenuItem + #label: 'Settings' + #translateLabel: true + #activeHelpKey: #settings + #submenu: + #(#Menu - #( - #(#MenuItem - #label: 'Canvas' - #translateLabel: true - #activeHelpKey: #settingsCanvas - #indication: #painterShown - ) - #(#MenuItem - #label: 'Gallery' - #translateLabel: true - #activeHelpKey: #settingsGallery - #indication: #galleryShown - ) - #(#MenuItem - #label: '-' - ) - #(#MenuItem - #label: 'Redefine Aspect Methods' - #translateLabel: true - #activeHelpKey: #settingsRedefineAspectMethods - #enabled: #hasSpecClass - #indication: #redefineAspectMethods: - ) - #(#MenuItem - #label: 'Aspects As Instances' - #translateLabel: true - #activeHelpKey: #settingsAspectsAsInstances - #enabled: #hasSpecClass - #indication: #generateAspectsAsInstanceVariables: - ) - #(#MenuItem - #label: '-' - ) + #( + #(#MenuItem + #label: 'Canvas' + #translateLabel: true + #activeHelpKey: #settingsCanvas + #indication: #painterShown + ) + #(#MenuItem + #label: 'Gallery' + #translateLabel: true + #activeHelpKey: #settingsGallery + #indication: #galleryShown + ) + #(#MenuItem + #label: '-' + ) + #(#MenuItem + #label: 'Redefine Aspect Methods' + #translateLabel: true + #activeHelpKey: #settingsRedefineAspectMethods + #enabled: #hasSpecClass + #indication: #redefineAspectMethods: + ) + #(#MenuItem + #label: 'Aspects As Instances' + #translateLabel: true + #activeHelpKey: #settingsAspectsAsInstances + #enabled: #hasSpecClass + #indication: #generateAspectsAsInstanceVariables: + ) + #(#MenuItem + #label: '-' + ) "/ #(#MenuItem "/ #label: 'Fonts' "/ #submenuChannel: #menuFont @@ -1095,103 +1091,103 @@ "/ #(#MenuItem "/ #label: '-' "/ ) - #(#MenuItem - #label: 'Undo Manager...' - #translateLabel: true - #value: #openUndoMenu - #activeHelpKey: #settingsUndoManager - #enabled: #hasUndoHistory - ) - #(#MenuItem - #label: 'Grid Manager...' - #translateLabel: true - #value: #doDefineGrid - #activeHelpKey: #settingsGridManager - ) - ) nil - nil - ) - ) - #(#MenuItem - #label: 'History' - #translateLabel: true - #activeHelpKey: #history - #submenuChannel: #menuHistory - ) - #(#MenuItem - #label: 'Help' - #translateLabel: true - #startGroup: #right - #activeHelpKey: #help - #submenu: - #(#Menu + #(#MenuItem + #label: 'Undo Manager...' + #translateLabel: true + #value: #openUndoMenu + #activeHelpKey: #settingsUndoManager + #enabled: #hasUndoHistory + ) + #(#MenuItem + #label: 'Grid Manager...' + #translateLabel: true + #value: #doDefineGrid + #activeHelpKey: #settingsGridManager + ) + ) nil + nil + ) + ) + #(#MenuItem + #label: 'History' + #translateLabel: true + #activeHelpKey: #history + #submenuChannel: #menuHistory + ) + #(#MenuItem + #label: 'Help' + #translateLabel: true + #startGroup: #right + #activeHelpKey: #help + #submenu: + #(#Menu - #( - #(#MenuItem - #label: 'Tutorial' - #translateLabel: true - #value: #openHTMLDocument: - #activeHelpKey: #helpTutorial - #argument: 'tools/uipainter/TOP.html' - ) - #(#MenuItem - #label: '-' - ) - #(#MenuItem - #label: 'Functions' - #translateLabel: true - #value: #openHTMLDocument: - #activeHelpKey: #helpFunctions - #argument: 'tools/uipainter/Functions.html' - ) - #(#MenuItem - #label: 'Examples' - #translateLabel: true - #value: #openHTMLDocument: - #activeHelpKey: #helpExamples - #argument: 'tools/uipainter/Examples.html' - ) - #(#MenuItem - #label: '-' - ) - #(#MenuItem - #label: 'Help Tool' - #translateLabel: true - #value: #openHTMLDocument: - #activeHelpKey: #helpHelpTool - #argument: 'tools/uipainter/HelpTool.html' - ) - #(#MenuItem - #label: 'Layout Tool' - #translateLabel: true - #value: #openHTMLDocument: - #activeHelpKey: #helpLayoutTool - #argument: 'tools/uipainter/LayoutTool.html' - ) - #(#MenuItem - #label: '-' - ) - #(#MenuItem - #label: 'Selected Widget' - #translateLabel: true - #value: #doOpenWidgetDocumentation - #activeHelpKey: #helpSelectedWidget - ) - #(#MenuItem - #label: '-' - ) - #(#MenuItem - #label: 'Show Help Texts' - #translateLabel: true - #activeHelpKey: #helpShowHelp - #indication: #showingHelp: - ) - ) nil - nil - ) - ) - ) nil - nil + #( + #(#MenuItem + #label: 'Tutorial' + #translateLabel: true + #value: #openHTMLDocument: + #activeHelpKey: #helpTutorial + #argument: 'tools/uipainter/TOP.html' + ) + #(#MenuItem + #label: '-' + ) + #(#MenuItem + #label: 'Functions' + #translateLabel: true + #value: #openHTMLDocument: + #activeHelpKey: #helpFunctions + #argument: 'tools/uipainter/Functions.html' + ) + #(#MenuItem + #label: 'Examples' + #translateLabel: true + #value: #openHTMLDocument: + #activeHelpKey: #helpExamples + #argument: 'tools/uipainter/Examples.html' + ) + #(#MenuItem + #label: '-' + ) + #(#MenuItem + #label: 'Help Tool' + #translateLabel: true + #value: #openHTMLDocument: + #activeHelpKey: #helpHelpTool + #argument: 'tools/uipainter/HelpTool.html' + ) + #(#MenuItem + #label: 'Layout Tool' + #translateLabel: true + #value: #openHTMLDocument: + #activeHelpKey: #helpLayoutTool + #argument: 'tools/uipainter/LayoutTool.html' + ) + #(#MenuItem + #label: '-' + ) + #(#MenuItem + #label: 'Selected Widget' + #translateLabel: true + #value: #doOpenWidgetDocumentation + #activeHelpKey: #helpSelectedWidget + ) + #(#MenuItem + #label: '-' + ) + #(#MenuItem + #label: 'Show Help Texts' + #translateLabel: true + #activeHelpKey: #helpShowHelp + #indication: #showingHelp: + ) + ) nil + nil + ) + ) + ) nil + nil ) "Modified: / 23.8.1998 / 16:09:22 / cg" @@ -1862,34 +1858,34 @@ |noteBook modifiedChannel helpTool layoutTool specTool| (noteBook := builder bindingAt:#noteBookView) isNil ifTrue:[ - noteBook := View new. - layoutTool := UILayoutTool new. - helpTool := UIHelpTool new. - helpTool buildFromClass:specClass. - specTool := UISpecificationTool new. - modifiedChannel := self modifiedChannel. - - layoutTool masterApplication:self. - specTool masterApplication:self. - helpTool masterApplication:self. - - layoutCanvas := SubCanvas origin:0.0@0.0 corner:1.0@1.0 in:noteBook. - helpCanvas := SubCanvas origin:0.0@0.0 corner:1.0@1.0 in:noteBook. - specCanvas := SubCanvas origin:0.0@0.0 corner:1.0@1.0 in:noteBook. - - layoutCanvas client:layoutTool. - helpCanvas client:helpTool. - specTool builder:(specCanvas client:specTool). - - layoutTool masterApplication:self. - specTool masterApplication:self. - helpTool masterApplication:self. - - layoutTool modifiedHolder:modifiedChannel. - helpTool modifiedHolder:modifiedChannel. - specTool modifiedHolder:modifiedChannel. - - builder aspectAt:#noteBookView put:noteBook. + noteBook := View new. + layoutTool := UILayoutTool new. + helpTool := UIHelpTool new. + helpTool buildFromClass:specClass. + specTool := UISpecificationTool new. + modifiedChannel := self modifiedChannel. + + layoutTool masterApplication:self. + specTool masterApplication:self. + helpTool masterApplication:self. + + layoutCanvas := SubCanvas origin:0.0@0.0 corner:1.0@1.0 in:noteBook. + helpCanvas := SubCanvas origin:0.0@0.0 corner:1.0@1.0 in:noteBook. + specCanvas := SubCanvas origin:0.0@0.0 corner:1.0@1.0 in:noteBook. + + layoutCanvas client:layoutTool. + helpCanvas client:helpTool. + specTool builder:(specCanvas client:specTool). + + layoutTool masterApplication:self. + specTool masterApplication:self. + helpTool masterApplication:self. + + layoutTool modifiedHolder:modifiedChannel. + helpTool modifiedHolder:modifiedChannel. + specTool modifiedHolder:modifiedChannel. + + builder aspectAt:#noteBookView put:noteBook. ]. ^ noteBook ! @@ -1956,13 +1952,13 @@ |cls loadedFromClass loadedFromSpec editor tableColumnsOrSelector| (cls := self resolveName:specClass) isNil ifTrue:[ - self askForSaving ifFalse: [^self]. - cls := self resolveName:specClass. + self askForSaving ifFalse: [^self]. + cls := self resolveName:specClass. ]. self modifiedChannel value ifTrue:[ - (self confirm:'Accept changes made to spec ?') ifTrue:[ - self accept - ] + (self confirm:'Accept changes made to spec ?') ifTrue:[ + self accept + ] ]. loadedFromSpec := loadedFromClass := false. @@ -1972,34 +1968,34 @@ editor rowClassName:(self specTool specification rowClassName). ((tableColumnsOrSelector := self specTool specification columnHolder) notNil and: [cls class implements: tableColumnsOrSelector]) ifTrue: [ - editor openModalOnClass: cls andSelector: tableColumnsOrSelector. - loadedFromClass := true. + editor openModalOnClass: cls andSelector: tableColumnsOrSelector. + loadedFromClass := true. ] ifFalse: [ - (tableColumnsOrSelector := self specTool specification columns) isNil ifTrue: [ - editor openModal - ] ifFalse: [ - editor openModalOnResourceSpec:tableColumnsOrSelector. - loadedFromSpec := true - ]. + (tableColumnsOrSelector := self specTool specification columns) isNil ifTrue: [ + editor openModal + ] ifFalse: [ + editor openModalOnResourceSpec:tableColumnsOrSelector. + loadedFromSpec := true + ]. ]. loadedFromClass ifTrue: [ - self specTool specification columns:nil. - self specTool specification rowClassName:nil. - self modifiedChannel value:true. - self accept. + self specTool specification columns:nil. + self specTool specification rowClassName:nil. + self modifiedChannel value:true. + self accept. ]. (loadedFromSpec not and: [editor hasSaved and:[editor specSelector ~= tableColumnsOrSelector]]) ifTrue:[ - self specTool specification columnHolder:editor specSelector. - self modifiedChannel value:true. - self accept. - ^self + self specTool specification columnHolder:editor specSelector. + self modifiedChannel value:true. + self accept. + ^self ]. loadedFromClass ifFalse: [ - self specTool specification columns:(editor columns). - self specTool specification rowClassName:(editor rowClassName). - self modifiedChannel value: editor modified. + self specTool specification columns:(editor columns). + self specTool specification rowClassName:(editor rowClassName). + self modifiedChannel value: editor modified. ]. @@ -2011,49 +2007,49 @@ |cls selectorOrMenu editor selectedSpec spec| (cls := self resolveName:specClass) isNil ifTrue:[ - self askForSaving ifFalse: [^self]. - cls := self resolveName:specClass. + self askForSaving ifFalse: [^self]. + cls := self resolveName:specClass. ]. cls notNil ifTrue:[ - spec := self specTool specification. - - self modifiedChannel value ifTrue:[ - (self confirm:'Accept changes made to spec ?') ifTrue:[ - self accept - ] - ]. - - (selectorOrMenu := spec menuSelector) notNil ifTrue:[ - selectorOrMenu := selectorOrMenu asSymbol - ] ifFalse:[ - "/ cg: q&d hack ... - - (selectedSpec := treeView propertySelected) notNil ifTrue:[ - Object errorSignal handle:[:ex | - selectorOrMenu := nil. - ] do:[ - selectorOrMenu := selectedSpec view asMenu. - ] - ]. - ]. - - editor := MenuEditor new. - editor masterApplication:self. - editor specClass: cls. - editor useHelpTool: self helpTool. - selectorOrMenu class ~~ Menu - ifTrue: [editor openModalOnClass:cls andSelector:selectorOrMenu] - ifFalse: [editor openModalOnMenu:selectorOrMenu]. - self helpTool updateList. + spec := self specTool specification. + + self modifiedChannel value ifTrue:[ + (self confirm:'Accept changes made to spec ?') ifTrue:[ + self accept + ] + ]. + + (selectorOrMenu := spec menuSelector) notNil ifTrue:[ + selectorOrMenu := selectorOrMenu asSymbol + ] ifFalse:[ + "/ cg: q&d hack ... + + (selectedSpec := treeView propertySelected) notNil ifTrue:[ + Object errorSignal handle:[:ex | + selectorOrMenu := nil. + ] do:[ + selectorOrMenu := selectedSpec view asMenu. + ] + ]. + ]. + + editor := MenuEditor new. + editor masterApplication:self. + editor specClass: cls. + editor useHelpTool: self helpTool. + selectorOrMenu class ~~ Menu + ifTrue: [editor openModalOnClass:cls andSelector:selectorOrMenu] + ifFalse: [editor openModalOnMenu:selectorOrMenu]. + self helpTool updateList. "/ editor specSelector ~= selectorOrMenu ifTrue:[ - editor hasSaved ifTrue:[ - spec menuSelector:editor specSelector. - self modifiedChannel value:true. - self accept + editor hasSaved ifTrue:[ + spec menuSelector:editor specSelector. + self modifiedChannel value:true. + self accept "/ ] - ]. + ]. ] "Modified: / 16.7.1998 / 18:16:42 / cg" @@ -2165,15 +2161,15 @@ |property spec| (property := treeView propertySelected) notNil ifTrue:[ - spec := property spec copy. - self specTool specification:spec. - self setViewInLayoutTool:(property view) spec:spec. - self modifiedChannel value:false + spec := property spec copy. + self specTool specification:spec. + self setViewInLayoutTool:(property view) spec:spec. + self modifiedChannel value:false ] ifFalse:[ - self layoutTool layoutView notNil ifTrue:[ - self modifiedChannel value:false. - self treeSelection - ] + self layoutTool layoutView notNil ifTrue:[ + self modifiedChannel value:false. + self treeSelection + ] ] ! @@ -2183,30 +2179,30 @@ |window| someObject == treeView model ifTrue:[ - (something == #selection - or:[something == #selectionIndex]) ifTrue:[self treeSelection]. + (something == #selection + or:[something == #selectionIndex]) ifTrue:[self treeSelection]. ^ self ]. someObject == self galleryShown ifTrue:[ - "/ galleryShown toggle changed - window := selectionPanel window. - (someObject value) ifTrue:[ - self raiseUIView:window - ] ifFalse:[ - self hideUIView:window - ]. + "/ galleryShown toggle changed + window := selectionPanel window. + (someObject value) ifTrue:[ + self raiseUIView:window + ] ifFalse:[ + self hideUIView:window + ]. ^ self ]. someObject == self painterShown ifTrue:[ - "/ canvasShown toggle changed - window := self painter topView. - (someObject value) ifTrue:[ - self raiseUIView:window - ] ifFalse:[ - self hideUIView:window - ]. + "/ canvasShown toggle changed + window := self painter topView. + (someObject value) ifTrue:[ + self raiseUIView:window + ] ifFalse:[ + self hideUIView:window + ]. ^ self ]. @@ -2227,18 +2223,18 @@ treeView notNil ifTrue: [ - treeSelection := treeView selection. - "/ the top-node cannot be cut, copied or pasted. - canCutOrCopy := treeSelection size >= 1 and:[treeSelection first ~~ 1]. - clipboard := self getSelection. - - clipboard isCollection ifTrue:[clipboard notEmpty ifTrue:[sel := clipboard first]] - ifFalse:[sel := clipboard]. - - canPaste := (sel isKindOf:UISpecification) and: - [treeSelection size = 1 - and:[treeSelection first == 1 - or: [self canPasteInto: treeView selectedNode contents view]]] + treeSelection := treeView selection. + "/ the top-node cannot be cut, copied or pasted. + canCutOrCopy := treeSelection size >= 1 and:[treeSelection first ~~ 1]. + clipboard := self getSelection. + + clipboard isCollection ifTrue:[clipboard notEmpty ifTrue:[sel := clipboard first]] + ifFalse:[sel := clipboard]. + + canPaste := (sel isKindOf:UISpecification) and: + [treeSelection size = 1 + and:[treeSelection first == 1 + or: [self canPasteInto: treeView selectedNode contents view]]] ]. self valueOfCanCut value: canCutOrCopy. @@ -2351,61 +2347,61 @@ cls := self resolveName:specClass. cls isNil ifTrue:[ - superclass := self resolveName:specSuperclass. - - superclass isNil ifTrue:[ - self warn:'No class named ' , specSuperclass , ' exists!!'. - ^ false. - ]. - - (self confirm:'Create class ' , specClass asBoldText, '?') ifTrue:[ - cls := superclass - subclass:(specClass asSymbol) - instanceVariableNames:'' - classVariableNames:'' - poolDictionaries:'' - category:'Applications'. - - cls name ~= specClass ifTrue:[ - self information:'Created new class is ' , cls name. - specClass := cls name - ]. - ^ true. - ]. - ^ false. + superclass := self resolveName:specSuperclass. + + superclass isNil ifTrue:[ + self warn:'No class named ' , specSuperclass , ' exists!!'. + ^ false. + ]. + + (self confirm:'Create class ' , specClass asBoldText, '?') ifTrue:[ + cls := superclass + subclass:(specClass asSymbol) + instanceVariableNames:'' + classVariableNames:'' + poolDictionaries:'' + category:'Applications'. + + cls name ~= specClass ifTrue:[ + self information:'Created new class is ' , cls name. + specClass := cls name + ]. + ^ true. + ]. + ^ false. ]. cls isBehavior ifFalse:[ - self warn:'A global named ' , specClass , ' exists, but it is no class.'. - ^ false. + self warn:'A global named ' , specClass , ' exists, but it is no class.'. + ^ false. ]. specSuperclass isBehavior ifFalse:[ - specSuperclass isEmpty ifFalse:[ - superclass := self resolveName:specSuperclass - ] ifTrue:[ - specSuperclass := nil. - ] + specSuperclass isEmpty ifFalse:[ + superclass := self resolveName:specSuperclass + ] ifTrue:[ + specSuperclass := nil. + ] ] ifTrue:[ - superclass := specSuperclass + superclass := specSuperclass ]. specSuperclass notNil ifTrue:[ - superclass isNil ifTrue:[ - self warn:'No class named ' , specSuperclass , ' exists!!'. - ^ false. - ]. - - (cls isSubclassOf:superclass) ifFalse:[ - self information:('A global named ' , specClass , ' exists,\' , - 'but is not a subclass of ' , superclass name , '.\\' , - 'Check and try again if that is not what you want.') withCRs. - ] + superclass isNil ifTrue:[ + self warn:'No class named ' , specSuperclass , ' exists!!'. + ^ false. + ]. + + (cls isSubclassOf:superclass) ifFalse:[ + self information:('A global named ' , specClass , ' exists,\' , + 'but is not a subclass of ' , superclass name , '.\\' , + 'Check and try again if that is not what you want.') withCRs. + ] ]. superclass isNil ifTrue:[ - cls notNil ifTrue:[ - specSuperclass := cls superclass name - ] + cls notNil ifTrue:[ + specSuperclass := cls superclass name + ] ]. ^ true @@ -2497,7 +2493,7 @@ |type| self painter topView == aView ifTrue:[ - type := #Extent + type := #Extent ]. self layoutTool layoutView:aView type:type spec:aSpec @@ -2634,62 +2630,62 @@ |view list spec slices size property tabComponent| self isModified ifTrue:[ - (self confirm:'Accept modifications in section ' , tabSelection printString asBoldText, '?') ifTrue:[ - self accept - ] + (self confirm:'Accept modifications in section ' , tabSelection printString asBoldText, '?') ifTrue:[ + self accept + ] ]. treeView isCanvasSelected ifTrue:[ - spec := treeView canvasSpec. - view := self painter topView. + spec := treeView canvasSpec. + view := self painter topView. ] ifFalse:[ - (property := treeView propertySelected) notNil ifTrue:[ - treeView canResizeSelectedWidget ifTrue:[ - view := property view. - ]. - spec := property spec copy. - ] + (property := treeView propertySelected) notNil ifTrue:[ + treeView canResizeSelectedWidget ifTrue:[ + view := property view. + ]. + spec := property spec copy. + ] ]. tabComponent := builder componentAt:#noteBook. self setViewInLayoutTool:view spec:spec. self specTool specification:spec. spec notNil ifTrue:[ - self helpTool helpKey:(spec activeHelpKey). - slices := spec class slices. - size := slices size. - - view notNil ifTrue:[ - self treeView isCanvasSelected - ifFalse: - [ - list := Array new:(size + 2). - list at:(size + 2) put:(UILayoutTool label). - ] - ifTrue: - [ - list := Array new:(size + 1). - list at:(size + 1) put:(UILayoutTool label). - ]. - ] ifFalse:[ - list := Array new:(size + 1). - ]. - - 1 to:size do:[:i| list at:i put:((slices at:i) first asString)]. - self treeView isCanvasSelected ifFalse: [list at:(size + 1) put:(UIHelpTool label)]. - - self tabList value:list. - self showHelp:spec class name for:self. - tabComponent enabled:true. - - (tabSelection := tabComponent selection) isNil ifTrue:[ - tabComponent setSelection:(tabSelection := list first) - ]. - self raiseTabView + self helpTool helpKey:(spec activeHelpKey). + slices := spec class slices. + size := slices size. + + view notNil ifTrue:[ + self treeView isCanvasSelected + ifFalse: + [ + list := Array new:(size + 2). + list at:(size + 2) put:(UILayoutTool label). + ] + ifTrue: + [ + list := Array new:(size + 1). + list at:(size + 1) put:(UILayoutTool label). + ]. + ] ifFalse:[ + list := Array new:(size + 1). + ]. + + 1 to:size do:[:i| list at:i put:((slices at:i) first asString)]. + self treeView isCanvasSelected ifFalse: [list at:(size + 1) put:(UIHelpTool label)]. + + self tabList value:list. + self showHelp:spec class name for:self. + tabComponent enabled:true. + + (tabSelection := tabComponent selection) isNil ifTrue:[ + tabComponent setSelection:(tabSelection := list first) + ]. + self raiseTabView ] ifFalse:[ - self helpTool helpKey:nil. - tabComponent enabled:false. - self defaultInfoLabel. + self helpTool helpKey:nil. + tabComponent enabled:false. + self defaultInfoLabel. ]. self modifiedChannel value:false. @@ -2806,24 +2802,24 @@ aspects := IdentityDictionary new. aspects at:#classNameChannel put:( - (specClass notNil ifTrue:[specClass] - ifFalse:['NewApplication']) asValue + (specClass notNil ifTrue:[specClass] + ifFalse:['NewApplication']) asValue ). specSuperclass isNil ifTrue:[ - specClass notNil ifTrue:[ - (cls := self resolveName:specClass) notNil ifTrue:[ - specSuperclass := cls superclass name. - ] - ] + specClass notNil ifTrue:[ + (cls := self resolveName:specClass) notNil ifTrue:[ + specSuperclass := cls superclass name. + ] + ] ]. aspects at:#superclassNameChannel put:( - (specSuperclass notNil ifTrue:[specSuperclass] - ifFalse:['ApplicationModel']) asValue + (specSuperclass notNil ifTrue:[specSuperclass] + ifFalse:['ApplicationModel']) asValue ). aspects at:#superclassNameDefaults put:#('ApplicationModel' 'SimpleDialog') asValue. aspects at:#methodNameChannel put:( - (specSelector notNil ifTrue:[specSelector asValue] - ifFalse:[#windowSpec]) asValue + (specSelector notNil ifTrue:[specSelector asValue] + ifFalse:[#windowSpec]) asValue ). "/ the canvas ... @@ -2907,7 +2903,7 @@ cls := specClass. cls isString ifTrue:[ - cls := Smalltalk at:(cls string asSymbol) + cls := Smalltalk at:(cls string asSymbol) ]. sel := specSelector. specSelector := nil. @@ -2925,11 +2921,11 @@ painter clear. cls notNil ifTrue:[ - self setClass:cls selector:sel. - - (cls respondsTo:sel) ifTrue:[ - painter setupFromSpec:(cls perform:sel). - ] + self setClass:cls selector:sel. + + (cls respondsTo:sel) ifTrue:[ + painter setupFromSpec:(cls perform:sel). + ] ]. treeView selection: #(1). @@ -2950,38 +2946,38 @@ spec := self specTool specification. self isLayoutToolSelected ifTrue:[ - layoutTool := self layoutTool. - - (layout := layoutTool layout) notNil ifTrue:[ - layoutTool layoutType == #Extent ifTrue:[ - layoutView := layoutTool layoutView. - - layoutView == painter topView ifTrue:[ - layoutView extent:layout - ] ifFalse:[ - spec useDefaultExtent:(layoutTool aspectFor:#useDefaultExtent) value. - spec useDefaultExtent ifTrue:[ - "/ temporarily unfreeze the widgets size - "/ (but remember, the old setting, which is actually - "/ controlled by the resizeForLabel attribute) - t := layoutView sizeFixed. - layoutView sizeFixed:false. - layout := layoutView preferredExtent. - layoutView sizeFixed:t. - ]. - painter setExtent:layout. - painter updateFromSpec:spec. - ] - ] ifFalse:[ - painter setLayout:layout - ] - ] + layoutTool := self layoutTool. + + (layout := layoutTool layout) notNil ifTrue:[ + layoutTool layoutType == #Extent ifTrue:[ + layoutView := layoutTool layoutView. + + layoutView == painter topView ifTrue:[ + layoutView extent:layout + ] ifFalse:[ + spec useDefaultExtent:(layoutTool aspectFor:#useDefaultExtent) value. + spec useDefaultExtent ifTrue:[ + "/ temporarily unfreeze the widgets size + "/ (but remember, the old setting, which is actually + "/ controlled by the resizeForLabel attribute) + t := layoutView sizeFixed. + layoutView sizeFixed:false. + layout := layoutView preferredExtent. + layoutView sizeFixed:t. + ]. + painter setExtent:layout. + painter updateFromSpec:spec. + ] + ] ifFalse:[ + painter setLayout:layout + ] + ] ] ifFalse:[ - self isHelpToolSelected ifTrue:[ - self helpTool accept. - spec activeHelpKey:self helpTool helpKey. - ]. - painter updateFromSpec:spec + self isHelpToolSelected ifTrue:[ + self helpTool accept. + spec activeHelpKey:self helpTool helpKey. + ]. + painter updateFromSpec:spec ]. modified := false. @@ -3026,25 +3022,25 @@ |spec key view| self isModified ifTrue:[ - (spec := self painter specForSelection) notNil ifTrue:[ - key := spec activeHelpKey. - ]. - self helpTool helpKey:key. - - treeView isCanvasSelected ifTrue: [ - spec := treeView canvasSpec. - ]. - self specTool specification:spec. - view := self layoutTool layoutView. - - self setViewInLayoutTool:view spec:spec. - spec class == DataSetSpec ifTrue:[ - view notNil ifTrue:[ - view columnDescriptors:(spec columns) - ] - ]. - self modifiedChannel value:false. - modified := false + (spec := self painter specForSelection) notNil ifTrue:[ + key := spec activeHelpKey. + ]. + self helpTool helpKey:key. + + treeView isCanvasSelected ifTrue: [ + spec := treeView canvasSpec. + ]. + self specTool specification:spec. + view := self layoutTool layoutView. + + self setViewInLayoutTool:view spec:spec. + spec class == DataSetSpec ifTrue:[ + view notNil ifTrue:[ + view columnDescriptors:(spec columns) + ] + ]. + self modifiedChannel value:false. + modified := false ] ! @@ -3147,7 +3143,7 @@ bindings at:#vspace put:((gridPara at:2) asValue). (self openDialogInterface:#dialogSpecForDefiningGridParameters withBindings:bindings) ifFalse:[ - ^ self + ^ self ]. hspace := (bindings at:#hspace) value ? 5. @@ -3336,12 +3332,12 @@ self askForSectionModification. self hasSpecClassAndSelector ifFalse:[ - self doDefineClassAndSelector isNil ifTrue: [^nil] + self doDefineClassAndSelector isNil ifTrue: [^nil] ]. (specClass notNil and: [(cls := Smalltalk at: specClass asSymbol) isClass]) ifFalse:[ - self warn:('Oops - cannot save - class not found: ' , specClass). - ^nil + self warn:('Oops - cannot save - class not found: ' , specClass). + ^nil ]. "/ specClass notNil ifTrue:[ @@ -3372,9 +3368,9 @@ painter := self painter. painter - className:specClass - superclassName:specSuperclass - selector:specSelector. + className:specClass + superclassName:specSuperclass + selector:specSelector. code := painter generateWindowSpecMethodSource withCRs. @@ -3389,7 +3385,7 @@ painter resetModification. (cls class implements: specSelector) ifTrue:[ - self addToHistory: (specClass, ' ', specSelector) -> #loadFromMessage:. + self addToHistory: (specClass, ' ', specSelector) -> #loadFromMessage:. ]. @@ -3428,25 +3424,25 @@ |cls application| self hasSpecClassAndSelector ifFalse:[ - self doSave isNil ifTrue: [^nil]. + self doSave isNil ifTrue: [^nil]. ] ifTrue: [ - self askForSectionModification. - (modified or: [self painter isModified or: [self helpTool modified]]) - ifTrue: - [ - ((YesNoBox title:'Window Spec was modified!!') - noText:'Cancel'; - yesText:'Save it and start'; - showAtPointer; - accepted) ifFalse: [^nil]. - self doSave isNil ifTrue: [^nil] - ] + self askForSectionModification. + (modified or: [self painter isModified or: [self helpTool modified]]) + ifTrue: + [ + ((YesNoBox title:'Window Spec was modified!!') + noText:'Cancel'; + yesText:'Save it and start'; + showAtPointer; + accepted) ifFalse: [^nil]. + self doSave isNil ifTrue: [^nil] + ] ]. cls := self resolveName:specClass. cls isNil ifTrue:[ - self warn:'Oops cannot start application - no class:' , specClass. - ^ nil + self warn:'Oops cannot start application - no class:' , specClass. + ^ nil ]. ((application := cls new) respondsTo:#openInterface:) ifFalse:[ ^ self warn:('The application does not respond to the ''openInterface:'' message.\\(maybe the spec is supposed to be used as subApplication/subCanvas)') withCRs. @@ -3637,8 +3633,8 @@ windowSpec := nil. self canvas subViews copy do:[:aView| - "/ care to not destroy the transparent input view - (aView isInputOnly) ifFalse:[aView destroy] + "/ care to not destroy the transparent input view + (aView isInputOnly) ifFalse:[aView destroy] ]. model root name: UIPainter defaultNameOfCanvas asBoldText. model removeAllOtherThanRoot. @@ -3670,12 +3666,12 @@ fullSpec name:specNameSymbol. fullSpec fromBuilder:(self canvas topView) - components:(SpecCollection new collection:aSpecArray). + components:(SpecCollection new collection:aSpecArray). windowSpec notNil ifTrue:[ - winSpec := fullSpec window. - winSpec copyValuesFromSpec:windowSpec. - winSpec name: winSpec label. + winSpec := fullSpec window. + winSpec copyValuesFromSpec:windowSpec. + winSpec name: winSpec label. ]. ^ fullSpec literalArrayEncoding.