diff --git a/src/ColorPicker/SpColorPickerPresenter.class.st b/src/ColorPicker/SpColorPickerPresenter.class.st index fe93a7ff3..65b937921 100644 --- a/src/ColorPicker/SpColorPickerPresenter.class.st +++ b/src/ColorPicker/SpColorPickerPresenter.class.st @@ -6,7 +6,9 @@ Class { #name : 'SpColorPickerPresenter', #superclass : 'SpPresenter', #instVars : [ - 'colorPickerPresenter' + 'colorPickerPresenter', + 'toolbar', + 'colorChangedBlock' ], #category : 'ColorPicker', #package : 'ColorPicker' @@ -25,15 +27,16 @@ SpColorPickerPresenter class >> open [ ^ (self newApplication: StPharoApplication current) open ] -{ #category : 'accessing' } -SpColorPickerPresenter >> color [ +{ #category : 'events' } +SpColorPickerPresenter >> colorChanged [ - ^ colorPickerPresenter color + colorChangedBlock ifNil: [ ^ self ]. + ^ colorChangedBlock value: colorPickerPresenter color ] { #category : 'layout' } SpColorPickerPresenter >> defaultLayout [ - + ^ SpBoxLayout newTopToBottom add: colorPickerPresenter; yourself @@ -42,7 +45,9 @@ SpColorPickerPresenter >> defaultLayout [ { #category : 'initialization' } SpColorPickerPresenter >> initializePresenters [ - colorPickerPresenter := self newColorPicker + colorPickerPresenter := self newColorPicker. + toolbar := self newToolbar. + self toolbarButtons do: [ :button | toolbar addItemRight: button ] ] { #category : 'initialization' } @@ -51,22 +56,28 @@ SpColorPickerPresenter >> toolbarButtons [ buttons := OrderedCollection new. buttons + add: (self newToolbarButton + label: 'Select'; + icon: (self iconNamed: #smallOk); + help: 'Select and close'; + action: [ self colorChanged. self delete ]; + yourself); add: (self newToolbarButton label: 'Cancel'; icon: (self iconNamed: #smallCancel); help: 'Cancel the color selection'; action: [ self delete ]; - yourself); - add: (self newToolbarButton - label: 'Select'; - icon: (self iconNamed: #smallOk); - help: 'Select and close'; - action: [ self delete ]; - yourself). + yourself). ^ buttons ] +{ #category : 'events' } +SpColorPickerPresenter >> whenColorChangedDo: aBlock [ + + colorChangedBlock := aBlock +] + { #category : 'initialization' } SpColorPickerPresenter >> windowIcon [ diff --git a/src/NewTools-Core/StPharoSettings.class.st b/src/NewTools-Core/StPharoSettings.class.st index e634baa5b..d8905a6ac 100644 --- a/src/NewTools-Core/StPharoSettings.class.st +++ b/src/NewTools-Core/StPharoSettings.class.st @@ -63,24 +63,24 @@ StPharoSettings class >> pharoAboutOn: aBuilder [ { #category : 'settings' } StPharoSettings class >> settingsOn: aBuilder [ - + (aBuilder setting: #codeShowLineNumbers) - parent: #tools; + parentName: #tools; order: 0; - default: self codeShowLineNumbers; + defaultValue: self codeShowLineNumbers; target: self; description: 'If code panels will display line numbers'; label: 'Show line numbers in code panels'. (aBuilder pickOne: #toolbarDisplayMode) - parent: #tools; + parentName: #tools; order: 1; - default: self toolbarDisplayMode; + defaultValue: self toolbarDisplayMode; target: self; domainValues: (SpToolbarDisplayMode all collect: [ :each | each label -> each ]); description: 'Toolbars will be displayed in icon+label, icon, or label mode.'; - label: 'Toolbar display mode' + label: 'Toolbar display mode' ] { #category : 'settings' } diff --git a/src/NewTools-Debugger/StDebugger.class.st b/src/NewTools-Debugger/StDebugger.class.st index 57e05a244..56d947842 100644 --- a/src/NewTools-Debugger/StDebugger.class.st +++ b/src/NewTools-Debugger/StDebugger.class.st @@ -186,13 +186,11 @@ StDebugger class >> debuggerLayoutSettingsOn: aBuilder [ (aBuilder pickOne: #configureLayout) - parent: #debugging; + parentName: #debugging; label: 'Debugger Layout'; target: StDebugger; - default: #beVerticalStackThenCode; - domainValues: - #( #beHorizontalCodeThenStack #beHorizontalStackThenCode - #beVerticalCodeThenStack #beVerticalStackThenCode ); + defaultValue: #beVerticalStackThenCode; + domainValues: #( #beHorizontalCodeThenStack #beHorizontalStackThenCode #beVerticalCodeThenStack #beVerticalStackThenCode ); description: '' ] @@ -277,13 +275,13 @@ StDebugger class >> settings [ StDebugger class >> stackColoringSettingOn: aBuilder [ - (aBuilder setting: #enableStackColoring) - label: 'Enable stack coloring'; - target: self; - parent: #debugging; - default: true; - description: - 'If enable, the debugger will highlight the elements of the stacks that are from the same class and same package as the selected context.'. + (aBuilder setting: #enableStackColoring) + label: 'Enable stack coloring'; + target: self; + parentName: #debugging; + defaultValue: true; + description: + 'If enable, the debugger will highlight the elements of the stacks that are from the same class and same package as the selected context.' ] { #category : 'accessing' } diff --git a/src/NewTools-Debugger/StDebuggerClientModel.class.st b/src/NewTools-Debugger/StDebuggerClientModel.class.st index bfc1723e5..8d508ce20 100644 --- a/src/NewTools-Debugger/StDebuggerClientModel.class.st +++ b/src/NewTools-Debugger/StDebuggerClientModel.class.st @@ -40,12 +40,13 @@ StDebuggerClientModel class >> shouldFilterStack: aBoolean [ { #category : 'settings' } StDebuggerClientModel class >> shouldFilterStackSettingsOn: aBuilder [ + (aBuilder setting: #shouldFilterStack) label: 'Filter the debugger stack'; target: self; - default: true; - parent: #debugging; + defaultValue: true; + parentName: #debugging; description: 'Defines if methods with pragma #debuggerCompleteToSender are filtered (hidden) in the debugger stack' ] diff --git a/src/NewTools-Debugger/StDebuggerExtensionSettings.class.st b/src/NewTools-Debugger/StDebuggerExtensionSettings.class.st index cf32f68d9..619c272dc 100644 --- a/src/NewTools-Debugger/StDebuggerExtensionSettings.class.st +++ b/src/NewTools-Debugger/StDebuggerExtensionSettings.class.st @@ -17,19 +17,18 @@ StDebuggerExtensionSettings class >> debuggerExtensionSettingsForClass: toolClas (aBuilder group: toolName asSymbol) label: toolName; - with: [ - (aBuilder setting: #showInDebugger) - label: 'Show in debugger'; - target: toolClass; - default: toolClass showInDebugger; - description: 'Activate the tool tab in the debugger right column.'. - (aBuilder pickOne: #displayOrder) - label: 'Position'; - target: toolClass; - default: toolClass defaultDisplayOrder; - domainValues: (1 to: 100) asArray; - description: - 'Position of the tool tab in the debugger right column.' ] + with: [ + (aBuilder setting: #showInDebugger) + label: 'Show in debugger'; + target: toolClass; + defaultValue: toolClass showInDebugger; + description: 'Activate the tool tab in the debugger right column.'. + (aBuilder pickOne: #displayOrder) + label: 'Position'; + target: toolClass; + defaultValue: toolClass defaultDisplayOrder; + domainValues: (1 to: 100) asArray; + description: 'Position of the tool tab in the debugger right column.' ] ] { #category : 'settings' } @@ -40,12 +39,8 @@ StDebuggerExtensionSettings class >> debuggerExtensionSettingsOn: aBuilder [ debuggerClass := StDebugger. (aBuilder group: #debuggerExtensions) label: 'Debugger Extensions'; - parent: #debugging; - description: - 'Tools that extend the StDebugger and appear in the right column of the debugger'; + parentName: #debugging; + description: 'Tools that extend the StDebugger and appear in the right column of the debugger'; with: [ - debuggerClass extensionToolsClasses do: [ :toolClass | - self - debuggerExtensionSettingsForClass: toolClass - builder: aBuilder ] ] + debuggerClass extensionToolsClasses do: [ :toolClass | self debuggerExtensionSettingsForClass: toolClass builder: aBuilder ] ] ] diff --git a/src/NewTools-Debugger/StDebuggerSettings.class.st b/src/NewTools-Debugger/StDebuggerSettings.class.st index b105a5326..36353042a 100644 --- a/src/NewTools-Debugger/StDebuggerSettings.class.st +++ b/src/NewTools-Debugger/StDebuggerSettings.class.st @@ -92,12 +92,13 @@ StDebuggerSettings class >> preserveWindowPosition: aBoolean [ { #category : 'initialization' } StDebuggerSettings class >> preserveWindowPositionAndExtentOn: aBuilder [ + - (aBuilder setting: #preserveWindowPosition) label: 'Preserve window position'; target: self; - parent: #debugging; - default: true; - description: 'If enabled, the debugger will preserve the last known window position, and it will open new debugger windows in that configuration'. + parentName: #debugging; + defaultValue: true; + description: + 'If enabled, the debugger will preserve the last known window position, and it will open new debugger windows in that configuration' ] diff --git a/src/NewTools-Epicea/EpSettings.class.st b/src/NewTools-Epicea/EpSettings.class.st index 22ae59d68..5516a9d32 100644 --- a/src/NewTools-Epicea/EpSettings.class.st +++ b/src/NewTools-Epicea/EpSettings.class.st @@ -15,8 +15,9 @@ EpSettings class >> groupSettingsOn: aBuilder [ (aBuilder group: #epicea) label: 'Epicea'; - description: 'Epicea is a tool that records code changes enriched with IDE events. Epicea extends and could replace the traditional .changes logging mechanism, where the recorded code changes are incomplete and are not properly reified and thus it can be difficult to recover lost code after an image crash.'; - parent: #tools + description: + 'Epicea is a tool that records code changes enriched with IDE events. Epicea extends and could replace the traditional .changes logging mechanism, where the recorded code changes are incomplete and are not properly reified and thus it can be difficult to recover lost code after an image crash.'; + parentName: #tools ] { #category : 'accessing' } @@ -37,9 +38,10 @@ EpSettings class >> lostEventsDetectorEnabledSettingOn: aBuilder [ (aBuilder setting: #lostEventsDetectorEnabled) label: 'Detect lost events on start-up'; - default: true; - description: 'Check if current Epicea log has events that were not applied in this image (useful for recovering changes when the image crashed)'; - parent: #epicea; + defaultValue: true; + description: + 'Check if current Epicea log has events that were not applied in this image (useful for recovering changes when the image crashed)'; + parentName: #epicea; target: self ] @@ -61,9 +63,10 @@ EpSettings class >> monitorEnabledSettingOn: aBuilder [ (aBuilder setting: #monitorEnabled) label: 'Monitor enabled'; - default: true; - description: 'The Epicea Monitor listens events in the system such as class added and method modified, and records them to the current Epicea log.'; - parent: #epicea; + defaultValue: true; + description: + 'The Epicea Monitor listens events in the system such as class added and method modified, and records them to the current Epicea log.'; + parentName: #epicea; target: self ] @@ -86,9 +89,9 @@ EpSettings class >> storeNameStrategySettingsOn: aBuilder [ (aBuilder pickOne: #storeNameStrategyClass) label: 'File Naming Strategy'; description: 'Choose how will be the Epicea logs named.'; - parent: #epicea; + parentName: #epicea; target: self; - default: OmTimeStampSuffixStrategy; + defaultValue: OmTimeStampSuffixStrategy; domainValues: OmSessionStoreNamingStrategy availableStrategies ] @@ -110,12 +113,13 @@ EpSettings class >> writingDeferDurationSettingOn: aBuilder [ (aBuilder setting: #writingDeferDuration) label: 'Writing defer duration'; - default: 250; - description: 'Time to wait before write. When Epicea listens new events, it does not write them immediately. Instead, the new events are buffered until there were not new events during the time specified by this setting. The goal is to optimize I/O operations by batching them. + defaultValue: 250; + description: + 'Time to wait before write. When Epicea listens new events, it does not write them immediately. Instead, the new events are buffered until there were not new events during the time specified by this setting. The goal is to optimize I/O operations by batching them. Consecuences of a high defer duration: - Pros: For example, when a project is loaded into the image, many events happen in a small window of time. - Cons: Code changes can be lost if the vm crashes.'; - parent: #epicea; + parentName: #epicea; target: self ] diff --git a/src/NewTools-FileBrowser/StFileBrowserSettings.class.st b/src/NewTools-FileBrowser/StFileBrowserSettings.class.st index 53dbf0dd6..c252ea79e 100644 --- a/src/NewTools-FileBrowser/StFileBrowserSettings.class.st +++ b/src/NewTools-FileBrowser/StFileBrowserSettings.class.st @@ -36,16 +36,15 @@ StFileBrowserSettings class >> defaultDirectory: aFileReference [ { #category : 'settings' } StFileBrowserSettings class >> defaultDirectoryOn: aBuilder [ - + (aBuilder setting: #defaultDirectory) - parent: #fileBrowser; + parentName: #fileBrowser; type: #FilePathEncoder; - default: self defaultDirectory; + defaultValue: self defaultDirectory; label: 'Default directory'; description: 'Set the default directory for opening the file browser and dialogs'; target: self - ] { #category : 'settings' } @@ -56,12 +55,12 @@ StFileBrowserSettings class >> defaultTerminalProgram [ { #category : 'settings' } StFileBrowserSettings class >> groupSettingsOn: aBuilder [ - + (aBuilder group: #fileBrowser) label: 'File Browser'; description: 'Settings for the File Browser'; - parent: #tools + parentName: #tools ] { #category : 'settings' } @@ -92,15 +91,15 @@ StFileBrowserSettings class >> macTerminalProgram: aString [ { #category : 'settings' } StFileBrowserSettings class >> macTerminalProgramOn: aBuilder [ - + (aBuilder setting: #macTerminalProgram) - parent: #fileBrowser; - default: String empty; + parentName: #fileBrowser; + defaultValue: String empty; label: 'Name of the MacOS terminal'; - description: 'Set the name of the MacOS terminal program to run when a shell terminal is requested. It is not necessary to specify the full path'; + description: + 'Set the name of the MacOS terminal program to run when a shell terminal is requested. It is not necessary to specify the full path'; target: self - ] { #category : 'settings' } @@ -122,7 +121,7 @@ StFileBrowserSettings class >> openOnLastDirectoryOn: aBuilder [ (aBuilder setting: #openOnLastDirectory) - parent: #fileBrowser; + parentName: #fileBrowser; label: 'Open on last visited directory'; description: 'Open a new instance on the last visited directory'; target: self @@ -145,15 +144,14 @@ StFileBrowserSettings class >> showAlwaysDefaultBookmarks: aBoolean [ { #category : 'settings' } StFileBrowserSettings class >> showAlwaysDefaultBookmarksOn: aBuilder [ - + (aBuilder setting: #showAlwaysDefaultBookmarks) - parent: #fileBrowser; - default: true; + parentName: #fileBrowser; + defaultValue: true; label: 'Show always default bookmarks'; description: 'If the global bookmarks are deleted, this setting ensures that dialogs will always preserve default bookmarks'; target: self - ] { #category : 'accessing' } @@ -173,8 +171,8 @@ StFileBrowserSettings class >> showHiddenFilesOn: aBuilder [ (aBuilder setting: #showHiddenFiles) - parent: #fileBrowser; - default: false; + parentName: #fileBrowser; + defaultValue: false; label: 'Show hidden files and folders'; description: 'If enabled, shows the hidden files and folders in the file browser.'; target: self @@ -196,15 +194,14 @@ StFileBrowserSettings class >> showPreview: aBoolean [ { #category : 'settings' } StFileBrowserSettings class >> showPreviewOn: aBuilder [ - + (aBuilder setting: #showPreview) - parent: #fileBrowser; - default: true; + parentName: #fileBrowser; + defaultValue: true; label: 'Enable preview'; description: 'File Browser will show a preview file presenter by default'; target: self - ] { #category : 'settings' } diff --git a/src/NewTools-Finder/StFinderSettings.class.st b/src/NewTools-Finder/StFinderSettings.class.st index 291a91405..81711a0fb 100644 --- a/src/NewTools-Finder/StFinderSettings.class.st +++ b/src/NewTools-Finder/StFinderSettings.class.st @@ -40,11 +40,11 @@ StFinderSettings class >> cleanResultsOnEmptyInput: aBoolean [ { #category : 'system settings' } StFinderSettings class >> cleanResultsOnEmptyInputOn: aBuilder [ + - (aBuilder setting: #cleanResultsOnEmptyInput) - parent: #finder; - default: false; + parentName: #finder; + defaultValue: false; label: 'Clean results on clean text input'; description: 'Clean results after text input is cleaned'; target: self @@ -67,12 +67,14 @@ StFinderSettings class >> evaluationTimeout: aNumber [ { #category : 'system settings' } StFinderSettings class >> evaluationTimeoutOn: aBuilder [ + (aBuilder setting: #evaluationTimeout) - parent: #finder; - default: 500; + parentName: #finder; + defaultValue: 500; label: 'Evaluation timeout'; - description: 'Maximum timeout delay for individual calls in Examples search. Expects an integer giving the number of miliseconds. + description: + 'Maximum timeout delay for individual calls in Examples search. Expects an integer giving the number of miliseconds. Setting a value of 0 will set the evaluation to run without timeout'; target: self @@ -102,10 +104,11 @@ StFinderSettings class >> expandResults: aBoolean [ { #category : 'system settings' } StFinderSettings class >> expandResultsOn: aBuilder [ + (aBuilder setting: #expandResults) - parent: #finder; - default: false; + parentName: #finder; + defaultValue: false; label: 'Expand all results by default'; description: 'All results with children will be expanded if true'; target: self @@ -113,12 +116,12 @@ StFinderSettings class >> expandResultsOn: aBuilder [ { #category : 'system settings' } StFinderSettings class >> groupSettingsOn: aBuilder [ - + (aBuilder group: #finder) label: 'Finder'; description: ''; - parent: #tools + parentName: #tools ] { #category : 'system settings' } @@ -160,10 +163,11 @@ StFinderSettings class >> logErrorsToFile: aBoolean [ { #category : 'system settings' } StFinderSettings class >> logErrorsToFileOn: aBuilder [ + (aBuilder setting: #logErrorsToFile) - parent: #finder; - default: false; + parentName: #finder; + defaultValue: false; label: 'Log errors to file'; description: 'Log evaluation errors in the examples search to a file'; target: self @@ -185,10 +189,11 @@ StFinderSettings class >> logErrorsToTranscript: aBoolean [ { #category : 'system settings' } StFinderSettings class >> logErrorsToTranscriptOn: aBuilder [ + (aBuilder setting: #logErrorsToTranscript) - parent: #finder; - default: false; + parentName: #finder; + defaultValue: false; label: 'Log errors to Transcript'; description: 'Log evaluation errors in the examples search to the Transcript'; target: self @@ -211,11 +216,11 @@ StFinderSettings class >> searchAsYouType: aBoolean [ { #category : 'system settings' } StFinderSettings class >> searchAsYouTypeOn: aBuilder [ + - (aBuilder setting: #searchAsYouType) - parent: #finder; - default: false; + parentName: #finder; + defaultValue: false; label: 'Search as you type'; description: 'Present results as you type'; target: self @@ -237,10 +242,11 @@ StFinderSettings class >> useCompletion: aBoolean [ { #category : 'system settings' } StFinderSettings class >> useCompletionOn: aBuilder [ + (aBuilder setting: #useCompletion) - parent: #finder; - default: false; + parentName: #finder; + defaultValue: false; label: 'Use completion'; description: 'Enable or disable autocompletion in finder text field as you type'; target: self diff --git a/src/NewTools-FontChooser/PragmaSetting.extension.st b/src/NewTools-FontChooser/Setting.extension.st similarity index 61% rename from src/NewTools-FontChooser/PragmaSetting.extension.st rename to src/NewTools-FontChooser/Setting.extension.st index 59eecbf15..979d53b9a 100644 --- a/src/NewTools-FontChooser/PragmaSetting.extension.st +++ b/src/NewTools-FontChooser/Setting.extension.st @@ -1,7 +1,8 @@ -Extension { #name : 'PragmaSetting' } +Extension { #name : 'Setting' } { #category : '*NewTools-FontChooser' } -PragmaSetting >> getFont [ +Setting >> getFont [ + "Let the user choose a new font value for the receiver" | chooser | chooser := FontChooser @@ -9,6 +10,5 @@ PragmaSetting >> getFont [ initialFont: self realValue onAcceptDo: [ :e | self realValue: e ]. - ^ chooser font. - + ^ chooser font ] diff --git a/src/NewTools-Inspector/StInspectorPresenter.class.st b/src/NewTools-Inspector/StInspectorPresenter.class.st index d980a226d..7874192c9 100644 --- a/src/NewTools-Inspector/StInspectorPresenter.class.st +++ b/src/NewTools-Inspector/StInspectorPresenter.class.st @@ -117,16 +117,16 @@ StInspectorPresenter class >> registerToolsOn: registry [ { #category : 'settings' } StInspectorPresenter class >> settingsOn: aBuilder [ - + (aBuilder group: #inspector) - parent: #tools; + parentName: #tools; label: 'Inspector'; description: 'Inspector'. - + (aBuilder setting: #inspectorDiveOnSingleClick) - parent: #inspector; - default: self inspectorDiveOnSingleClick; + parentName: #inspector; + defaultValue: self inspectorDiveOnSingleClick; target: self; description: 'Whether inspector will dive with single or double click'; label: 'Dive on single click' diff --git a/src/NewTools-Inspector/StObjectPrinter.class.st b/src/NewTools-Inspector/StObjectPrinter.class.st index b59344e8c..71a10af94 100644 --- a/src/NewTools-Inspector/StObjectPrinter.class.st +++ b/src/NewTools-Inspector/StObjectPrinter.class.st @@ -46,11 +46,11 @@ StObjectPrinter class >> displayStringLength: anInteger [ { #category : 'settings' } StObjectPrinter class >> settingsOn: aBuilder [ + - (aBuilder setting: #displayStringLength) - parent: #inspector; - default: 100; + parentName: #inspector; + defaultValue: 100; target: self; description: 'The length of the display string shown in the inspector'; label: 'Display String length in Collection' diff --git a/src/NewTools-ObjectTranscript/StObjectTranscriptPresenter.class.st b/src/NewTools-ObjectTranscript/StObjectTranscriptPresenter.class.st index 9a74274b6..b0458e8c8 100644 --- a/src/NewTools-ObjectTranscript/StObjectTranscriptPresenter.class.st +++ b/src/NewTools-ObjectTranscript/StObjectTranscriptPresenter.class.st @@ -113,11 +113,10 @@ StObjectTranscriptPresenter class >> registerToolsOn: registry [ StObjectTranscriptPresenter class >> settings: aBuilder [ - (aBuilder setting: #objectTranscript) - parent: #tools; + parentName: #tools; selector: #showInspector; - default: true; + defaultValue: true; label: 'Display the inspector part'; description: 'The object transcript supports the in place inspector of log entities. This preference enables it by default'; target: self diff --git a/src/NewTools-Playground/StPlaygroundPresenter.class.st b/src/NewTools-Playground/StPlaygroundPresenter.class.st index 38a0e35ec..f97d5df22 100644 --- a/src/NewTools-Playground/StPlaygroundPresenter.class.st +++ b/src/NewTools-Playground/StPlaygroundPresenter.class.st @@ -120,15 +120,15 @@ StPlaygroundPresenter class >> registerToolsOn: registry [ { #category : 'settings' } StPlaygroundPresenter class >> settingsOn: aBuilder [ - + (aBuilder setting: #cacheDirectory) - parent: #pharoSystem; + parentName: #pharoSystem; type: #Directory; - default: self defaultCacheDirectory; + defaultValue: self defaultCacheDirectory; target: StPlaygroundPresenter; description: 'The path to the local Playground cache that stores all Playground scripts in ph files'; - label: 'Local Playground cache directory'. + label: 'Local Playground cache directory' ] { #category : 'accessing' } diff --git a/src/NewTools-Pulse/StPulse.class.st b/src/NewTools-Pulse/StPulse.class.st index c4cc0e8dd..00891d59d 100644 --- a/src/NewTools-Pulse/StPulse.class.st +++ b/src/NewTools-Pulse/StPulse.class.st @@ -288,37 +288,37 @@ StPulse class >> resetSize [ { #category : 'settings' } StPulse class >> settingsOn: aBuilder [ - + (aBuilder group: #pulse) - parent: #tools; + parentName: #tools; label: 'Pulse'; target: self; description: 'Pulse configuration'. (aBuilder setting: #previewVisible) - parent: #pulse; - default: true; + parentName: #pulse; + defaultValue: true; target: self; description: 'Show the preview panel'; label: 'Show Preview Panel'. - + (aBuilder setting: #insertsSelection) - parent: #pulse; - default: false; + parentName: #pulse; + defaultValue: false; target: self; description: 'When opening pulse, insert the selected content into the search bar'; label: 'Inserts Selection'. - + (aBuilder button: #resetHistory) - parent: #pulse; + parentName: #pulse; target: self; description: 'Resets the history of environmment entries of Pulse'; label: 'Reset history'; buttonLabel: 'Reset'. - + (aBuilder button: #resetSize) - parent: #pulse; + parentName: #pulse; description: 'Resets the stored size of Pulse, which can be changed at any time and will be remembered'; label: 'Reset size'; buttonLabel: 'Reset' diff --git a/src/NewTools-SettingsBrowser-Tests/StSettingButtonPresenterItemTest.class.st b/src/NewTools-SettingsBrowser-Tests/StSettingButtonPresenterItemTest.class.st new file mode 100644 index 000000000..252861b85 --- /dev/null +++ b/src/NewTools-SettingsBrowser-Tests/StSettingButtonPresenterItemTest.class.st @@ -0,0 +1,69 @@ +" +I test StSettingButtonPresenterItem, the presenter of action settings. +" +Class { + #name : 'StSettingButtonPresenterItemTest', + #superclass : 'TestCase', + #instVars : [ + 'actionCount', + 'page', + 'item' + ], + #category : 'NewTools-SettingsBrowser-Tests', + #package : 'NewTools-SettingsBrowser-Tests' +} + +{ #category : 'helpers' } +StSettingButtonPresenterItemTest >> clickButton [ + + item setterPresenter click +] + +{ #category : 'helpers' } +StSettingButtonPresenterItemTest >> recordAction [ + "Action of the tested button" + + actionCount := actionCount + 1 +] + +{ #category : 'running' } +StSettingButtonPresenterItemTest >> setUp [ + + super setUp. + actionCount := 0. + page := StSettingDetailPresenter new. + item := (ActionSetting new + name: #recordAction; + target: self; + buttonLabel: 'Do'; + yourself) asSettingPresenterWithOwner: page +] + +{ #category : 'tests' } +StSettingButtonPresenterItemTest >> testClickPerformsTheAction [ + + self clickButton. + + self assert: actionCount equals: 1 +] + +{ #category : 'tests' } +StSettingButtonPresenterItemTest >> testClickRefreshesTheSettingsPage [ + + | refreshCount | + refreshCount := 0. + page announcer + when: StSettingModelChanged + do: [ refreshCount := refreshCount + 1 ] + for: self. + + self clickButton. + + self assert: refreshCount equals: 1 +] + +{ #category : 'tests' } +StSettingButtonPresenterItemTest >> testItemKnowsItsSettingsPage [ + + self assert: item pagePresenter identicalTo: page +] diff --git a/src/NewTools-SettingsBrowser-Tests/StSettingsBrowserTest.class.st b/src/NewTools-SettingsBrowser-Tests/StSettingsBrowserTest.class.st index 4960e67db..525a4ec01 100644 --- a/src/NewTools-SettingsBrowser-Tests/StSettingsBrowserTest.class.st +++ b/src/NewTools-SettingsBrowser-Tests/StSettingsBrowserTest.class.st @@ -96,6 +96,13 @@ StSettingsBrowserTest >> testNonEmptyCategoryNames [ ] +{ #category : 'tests' } +StSettingsBrowserTest >> testOpening [ + "Non-Regression Test related to https://pharo.manuscript.com/f/cases/16138" + + self openInstance +] + { #category : 'tests' } StSettingsBrowserTest >> testSimulateCategoryPopulation [ diff --git a/src/NewTools-SettingsBrowser-Tests/StSettingsTreeTest.class.st b/src/NewTools-SettingsBrowser-Tests/StSettingsTreeTest.class.st new file mode 100644 index 000000000..facf3a74a --- /dev/null +++ b/src/NewTools-SettingsBrowser-Tests/StSettingsTreeTest.class.st @@ -0,0 +1,76 @@ +" +I test StSettingsTree, the model of the settings browser. +" +Class { + #name : 'StSettingsTreeTest', + #superclass : 'TestCase', + #category : 'NewTools-SettingsBrowser-Tests', + #package : 'NewTools-SettingsBrowser-Tests' +} + +{ #category : 'helpers' } +StSettingsTreeTest >> nodeNamed: aSymbol label: aString order: aNumberOrNil [ + + ^ StSettingNode forSetting: (Setting new + name: aSymbol; + label: aString; + order: aNumberOrNil; + yourself) +] + +{ #category : 'tests' } +StSettingsTreeTest >> testChildrenOfGroupAreItsSettings [ + + | tree group | + tree := StSettingsTree new. + group := tree nodeList detect: [ :each | each name = #'Syntax Highlighting' ]. + + self + assertCollection: ((tree childrenOf: group) collect: [ :each | each name ]) + includesAll: #( #formatIncompleteIdentifiers #activeStyleTable #'Edit Custom Style' ) +] + +{ #category : 'tests' } +StSettingsTreeTest >> testChildrenWithoutOrderAreOrderedAroundOrderedChildren [ + + | group tree children | + group := SettingsGroup new + name: #group; + yourself. + tree := StSettingsTree new. + tree nodeList: ({ group } , (#( nil nil 5 nil 9 nil ) withIndexCollect: [ :order :index | + Setting new + name: ('setting' , index printString) asSymbol; + order: order; + parentGroup: group; + yourself ]) collect: [ :each | StSettingNode forSetting: each ]). + + children := tree childrenOf: tree nodeList first. + + self assert: (children collect: [ :each | each order ]) asArray equals: #( 3 4 5 6 9 10 ) +] + +{ #category : 'tests' } +StSettingsTreeTest >> testSortBlockSortsByOrderThenByLabel [ + + | nodes | + nodes := { + (self nodeNamed: #a label: 'a' order: 2). + (self nodeNamed: #b label: 'b' order: 1). + (self nodeNamed: #c label: 'z' order: nil). + (self nodeNamed: #d label: 'y' order: nil) }. + + self + assert: ((nodes asSortedCollection: StSettingsTree new sortBlock) collect: [ :each | each name ]) asArray + equals: #( #b #a #d #c ) +] + +{ #category : 'tests' } +StSettingsTreeTest >> testTreeRootsHaveNoParent [ + + | roots | + roots := StSettingsTree new treeRoots. + + self denyEmpty: roots. + self assert: (roots noneSatisfy: [ :each | each hasParent ]) +] diff --git a/src/NewTools-SettingsBrowser/AbstractSetting.extension.st b/src/NewTools-SettingsBrowser/AbstractSetting.extension.st new file mode 100644 index 000000000..c9aa1e425 --- /dev/null +++ b/src/NewTools-SettingsBrowser/AbstractSetting.extension.st @@ -0,0 +1,21 @@ +Extension { #name : 'AbstractSetting' } + +{ #category : '*NewTools-SettingsBrowser' } +AbstractSetting >> asPresenterOn: aPresenter [ + "Answer a for the receiver's setting type" + + ^ self asSettingPresenterWithOwner: aPresenter +] + +{ #category : '*NewTools-SettingsBrowser' } +AbstractSetting >> asSettingNode [ + + ^ StSettingNode forSetting: self +] + +{ #category : '*NewTools-SettingsBrowser' } +AbstractSetting >> asSettingPresenterWithOwner: aPresenter [ + "Answer an appropriate container for the receiver's value" + + self subclassResponsibility +] diff --git a/src/NewTools-SettingsBrowser/ActionSetting.extension.st b/src/NewTools-SettingsBrowser/ActionSetting.extension.st new file mode 100644 index 000000000..580b6eabc --- /dev/null +++ b/src/NewTools-SettingsBrowser/ActionSetting.extension.st @@ -0,0 +1,10 @@ +Extension { #name : 'ActionSetting' } + +{ #category : '*NewTools-SettingsBrowser' } +ActionSetting >> asSettingPresenterWithOwner: aPresenter [ + "Answer an appropriate for the receiver, shown on the settings page aPresenter" + + ^ (aPresenter instantiate: StSettingButtonPresenterItem on: self) + pagePresenter: aPresenter; + yourself +] diff --git a/src/NewTools-SettingsBrowser/ActionSettingDeclaration.extension.st b/src/NewTools-SettingsBrowser/ActionSettingDeclaration.extension.st deleted file mode 100644 index 4b2f72ea3..000000000 --- a/src/NewTools-SettingsBrowser/ActionSettingDeclaration.extension.st +++ /dev/null @@ -1,9 +0,0 @@ -Extension { #name : 'ActionSettingDeclaration' } - -{ #category : '*NewTools-SettingsBrowser' } -ActionSettingDeclaration >> asSettingPresenterWithOwner: aPresenter [ - "Answer an appropriate for the receiver" - - ^ aPresenter instantiate: StSettingButtonPresenterItem on: self - -] diff --git a/src/NewTools-SettingsBrowser/CmdShortcutActivation.extension.st b/src/NewTools-SettingsBrowser/CmdShortcutActivation.extension.st deleted file mode 100644 index b7a0aea05..000000000 --- a/src/NewTools-SettingsBrowser/CmdShortcutActivation.extension.st +++ /dev/null @@ -1,9 +0,0 @@ -Extension { #name : 'CmdShortcutActivation' } - -{ #category : '*NewTools-SettingsBrowser' } -CmdShortcutActivation >> asSettingPresenter: aDeclaration owner: aPresenter [ - - ^ (aPresenter instantiate: StSettingTextPresenterItem on: aDeclaration) - value: self keyCombination asString; - yourself -] diff --git a/src/NewTools-SettingsBrowser/Color.extension.st b/src/NewTools-SettingsBrowser/Color.extension.st index 975c33493..84b7c1bae 100644 --- a/src/NewTools-SettingsBrowser/Color.extension.st +++ b/src/NewTools-SettingsBrowser/Color.extension.st @@ -15,13 +15,7 @@ Color >> asSettingColorForm [ Color >> asSettingPresenter: aSettingDeclaration owner: aPresenter [ | settingPresenter colorValue | - colorValue := aSettingDeclaration targetSelector - ifNil: [ aSettingDeclaration realTarget perform: aSettingDeclaration name ] - ifNotNil: [ - | settingsTarget | - settingsTarget := aSettingDeclaration realTarget perform: aSettingDeclaration targetSelector. - settingsTarget perform: aSettingDeclaration getSelector ]. - + colorValue := aSettingDeclaration realValue. settingPresenter := (aPresenter instantiate: StSettingSHStyleButtonColorPresenterItem on: aSettingDeclaration). settingPresenter buttonAction: [ aSettingDeclaration getColorFor: settingPresenter ]; diff --git a/src/NewTools-SettingsBrowser/LogicalFont.extension.st b/src/NewTools-SettingsBrowser/LogicalFont.extension.st index 03200451a..a4c570231 100644 --- a/src/NewTools-SettingsBrowser/LogicalFont.extension.st +++ b/src/NewTools-SettingsBrowser/LogicalFont.extension.st @@ -5,7 +5,7 @@ LogicalFont >> asSettingPresenter: aSettingDeclaration owner: aPresenter [ | info currentFont | - currentFont := aSettingDeclaration target perform: aSettingDeclaration name. + currentFont := aSettingDeclaration settingReceiver perform: aSettingDeclaration name. info := String streamContents: [ :stream | stream << currentFont textStyleName; diff --git a/src/NewTools-SettingsBrowser/PickOneSettingDeclaration.extension.st b/src/NewTools-SettingsBrowser/PickOneSetting.extension.st similarity index 60% rename from src/NewTools-SettingsBrowser/PickOneSettingDeclaration.extension.st rename to src/NewTools-SettingsBrowser/PickOneSetting.extension.st index 366a95128..0c68f5141 100644 --- a/src/NewTools-SettingsBrowser/PickOneSettingDeclaration.extension.st +++ b/src/NewTools-SettingsBrowser/PickOneSetting.extension.st @@ -1,9 +1,8 @@ -Extension { #name : 'PickOneSettingDeclaration' } +Extension { #name : 'PickOneSetting' } { #category : '*NewTools-SettingsBrowser' } -PickOneSettingDeclaration >> asSettingPresenterWithOwner: aPresenter [ +PickOneSetting >> asSettingPresenterWithOwner: aPresenter [ "Answer an appropriate container for the receiver's value" ^ aPresenter instantiate: StSettingDropListPresenterItem on: self - ] diff --git a/src/NewTools-SettingsBrowser/PragmaSetting.extension.st b/src/NewTools-SettingsBrowser/PragmaSetting.extension.st deleted file mode 100644 index 6f0cb8a76..000000000 --- a/src/NewTools-SettingsBrowser/PragmaSetting.extension.st +++ /dev/null @@ -1,11 +0,0 @@ -Extension { #name : 'PragmaSetting' } - -{ #category : '*NewTools-SettingsBrowser' } -PragmaSetting >> asSettingPresenterWithOwner: aPresenter [ - "Answer an appropriate container for the receiver's value" - - ^ aPresenter newLabel - addStyle: 'settingLabel'; - label: self label; - yourself -] diff --git a/src/NewTools-SettingsBrowser/Setting.extension.st b/src/NewTools-SettingsBrowser/Setting.extension.st new file mode 100644 index 000000000..629eae099 --- /dev/null +++ b/src/NewTools-SettingsBrowser/Setting.extension.st @@ -0,0 +1,22 @@ +Extension { #name : 'Setting' } + +{ #category : '*NewTools-SettingsBrowser' } +Setting >> asSettingPresenterWithOwner: aPresenter [ + "Answer an appropriate container for the receiver's value" + + ^ self + ifPreconditionTrue: [ self realValue asSettingPresenter: self owner: aPresenter ] + ifFalse: [ SpNullPresenter owner: aPresenter ] +] + +{ #category : '*NewTools-SettingsBrowser' } +Setting >> getColorFor: aPresenter [ + | colorPickerPresenter | + + colorPickerPresenter := aPresenter instantiate: SpColorPickerPresenter on: self. + colorPickerPresenter + whenColorChangedDo: [ :color | + self realValue: color value. + aPresenter updateColor: color value ]; + open +] diff --git a/src/NewTools-SettingsBrowser/SettingDeclaration.extension.st b/src/NewTools-SettingsBrowser/SettingDeclaration.extension.st deleted file mode 100644 index 728d0aa10..000000000 --- a/src/NewTools-SettingsBrowser/SettingDeclaration.extension.st +++ /dev/null @@ -1,37 +0,0 @@ -Extension { #name : 'SettingDeclaration' } - -{ #category : '*NewTools-SettingsBrowser' } -SettingDeclaration >> asSettingPresenterWithOwner: aPresenter [ - "Answer an appropriate container for the receiver's value" - - ^ self precondition value - ifTrue: [ - self hasValue - ifTrue: [ self realValue asSettingPresenter: self owner: aPresenter ] - ifFalse: [ self default asSettingPresenter: self owner: aPresenter ] ] - ifFalse: [ SpNullPresenter owner: aPresenter ] -] - -{ #category : '*NewTools-SettingsBrowser' } -SettingDeclaration >> getColorFor: aPresenter [ - | colorPickerPresenter color changedAspect | - - colorPickerPresenter := aPresenter instantiate: SpColorPickerPresenter on: self. - (colorPickerPresenter asModalWindow - owner: aPresenter window; - open) - isOk - ifFalse: [ ^ self ]. - - color := colorPickerPresenter color. - "First we need to get the setter selector, then apply it" - "Some settings are built 'customized' configuring its setter in a different way than using #targetSelector (see #customSettingsOn:)" - self targetSelector - ifNil: [ - self realTarget perform: self name asMutator with: color. - changedAspect := self realTarget ] - ifNotNil: [ - changedAspect := self realTarget perform: self targetSelector. - changedAspect perform: self setSelector with: color ]. - aPresenter updateColor: color -] diff --git a/src/NewTools-SettingsBrowser/SettingsGroup.extension.st b/src/NewTools-SettingsBrowser/SettingsGroup.extension.st new file mode 100644 index 000000000..24b17fb7b --- /dev/null +++ b/src/NewTools-SettingsBrowser/SettingsGroup.extension.st @@ -0,0 +1,14 @@ +Extension { #name : 'SettingsGroup' } + +{ #category : '*NewTools-SettingsBrowser' } +SettingsGroup >> asSettingPresenterWithOwner: aPresenter [ + "Answer an appropriate container for the receiver's value" + + ^ self isActivable + ifTrue: [ self realValue asSettingPresenter: self owner: aPresenter ] + ifFalse: [ + aPresenter newLabel + addStyle: 'settingLabel'; + label: self label; + yourself ] +] diff --git a/src/NewTools-SettingsBrowser/StSettingBooleanPresenterItem.class.st b/src/NewTools-SettingsBrowser/StSettingBooleanPresenterItem.class.st index c2695c4ad..440affc2f 100644 --- a/src/NewTools-SettingsBrowser/StSettingBooleanPresenterItem.class.st +++ b/src/NewTools-SettingsBrowser/StSettingBooleanPresenterItem.class.st @@ -29,21 +29,7 @@ StSettingBooleanPresenterItem >> settingStyle [ StSettingBooleanPresenterItem >> updateSetting: aSettingDeclaration value: aBoolean [ "Private - Callback for updating aSettingDeclaration with the new receiver's selected item" - self model targetSelector - ifNil: [ - | modelTarget realTarget | - modelTarget := self model target. - realTarget := modelTarget isClass - ifTrue: [ modelTarget name ] - ifFalse: [ modelTarget ]. - (self class environment at: realTarget) - perform: self model setSelector - with: aBoolean ] - ifNotNil: [ - (self model target perform: self model targetSelector) - perform: self model setSelector - with: aBoolean ] - + aSettingDeclaration realValue: aBoolean ] { #category : 'accessing' } diff --git a/src/NewTools-SettingsBrowser/StSettingButtonPresenterItem.class.st b/src/NewTools-SettingsBrowser/StSettingButtonPresenterItem.class.st index 8dd853f34..2211858e2 100644 --- a/src/NewTools-SettingsBrowser/StSettingButtonPresenterItem.class.st +++ b/src/NewTools-SettingsBrowser/StSettingButtonPresenterItem.class.st @@ -13,15 +13,21 @@ Class { StSettingButtonPresenterItem >> initializePresenters [ (setterPresenter := self newButton) - label: self model actionLabel; - action: [ - self target - perform: self model name - withEnoughArguments: { setterPresenter } ]; + label: self model buttonLabel; + action: [ + self target perform: self model name. + self refreshSettingsPage ]; yourself. super initializePresenters ] +{ #category : 'updating' } +StSettingButtonPresenterItem >> refreshSettingsPage [ + "The action may have changed other settings: let the page showing the receiver display their new values" + + self pagePresenter ifNotNil: [ :page | page announcer announce: StSettingModelChanged ] +] + { #category : 'accessing' } StSettingButtonPresenterItem >> settingStyle [ diff --git a/src/NewTools-SettingsBrowser/StSettingDropListPresenterItem.class.st b/src/NewTools-SettingsBrowser/StSettingDropListPresenterItem.class.st index d694ba60c..eea3663ef 100644 --- a/src/NewTools-SettingsBrowser/StSettingDropListPresenterItem.class.st +++ b/src/NewTools-SettingsBrowser/StSettingDropListPresenterItem.class.st @@ -9,13 +9,14 @@ Class { { #category : 'initialization' } StSettingDropListPresenterItem >> initializePresenters [ + | indexOfCurrentValue | setterPresenter := self newDropList items: self model domainValues; - display: [ : item | item asString ]; - selectIndex: self model index; + display: [ :item | item name asString ]; whenSelectedItemChangedDo: [ :item | self updateSetting: item ]; - yourself. - + yourself. + indexOfCurrentValue := self model domainValues detectIndex: [ :each | each value = self model realValue ]. + setterPresenter selectIndex: indexOfCurrentValue. super initializePresenters ] @@ -26,19 +27,10 @@ StSettingDropListPresenterItem >> settingStyle [ ] { #category : 'initialization' } -StSettingDropListPresenterItem >> updateSetting: aSettingDeclaration [ +StSettingDropListPresenterItem >> updateSetting: aSettingItem [ "Private - Callback for updating aSettingDeclaration with the new receiver's selected item" - self model targetSelector - ifNil: [ - self model target - perform: self model setSelector - with: aSettingDeclaration default ] - ifNotNil: [ - (self model target perform: self model targetSelector) - perform: self model setSelector - with: aSettingDeclaration default ] - + aSettingItem beCurrentValue ] { #category : 'accessing' } diff --git a/src/NewTools-SettingsBrowser/StSettingMultipleDropListPresenterItem.class.st b/src/NewTools-SettingsBrowser/StSettingMultipleDropListPresenterItem.class.st index e5a5f80df..e9bf9aecd 100644 --- a/src/NewTools-SettingsBrowser/StSettingMultipleDropListPresenterItem.class.st +++ b/src/NewTools-SettingsBrowser/StSettingMultipleDropListPresenterItem.class.st @@ -15,7 +15,7 @@ Class { StSettingMultipleDropListPresenterItem >> initializePresenters [ | modelDefault | - modelDefault := self model default. + modelDefault := self model defaultValue. "modelDefault color ifNil: [ modelDefault color: Color transparent ]. colorSettingItemPresenter := modelDefault color diff --git a/src/NewTools-SettingsBrowser/StSettingNode.class.st b/src/NewTools-SettingsBrowser/StSettingNode.class.st index 24e13544b..ab329ba4c 100644 --- a/src/NewTools-SettingsBrowser/StSettingNode.class.st +++ b/src/NewTools-SettingsBrowser/StSettingNode.class.st @@ -1,17 +1,10 @@ -" -Represents a single setting - -" Class { #name : 'StSettingNode', #superclass : 'Object', #instVars : [ - 'declaration', - 'pragma', - 'parentName', - 'model', - 'matchBlock', - 'parentNode' + 'setting', + 'tree', + 'matchBlock' ], #category : 'NewTools-SettingsBrowser-Model', #package : 'NewTools-SettingsBrowser', @@ -19,119 +12,56 @@ Class { } { #category : 'instance creation' } -StSettingNode class >> with: aPragmaSetting [ +StSettingNode class >> forSetting: aSetting [ - ^ self new declaration: aPragmaSetting + ^ self new + setting: aSetting; + yourself ] { #category : 'accessing' } StSettingNode >> allChildren [ + "Answer a of the settings for which the receiver is set as parent" - ^ self model - ifNotNil: [ : m | m childrenOf: self ] + ^ tree + ifNotNil: [ :settingTree | settingTree childrenOf: self ] ifNil: [ OrderedCollection new ] ] { #category : 'converting' } -StSettingNode >> asPresenterOn: aPresenter [ - "Answer a for the receiver's setting type" - - ^ self declaration asSettingPresenterWithOwner: aPresenter -] - -{ #category : 'checking' } -StSettingNode >> checkForUnknownTarget [ - - self parentNode - ifNotNil: [:p | - self declarationTarget - ifNil: [ self declarationTarget: p declaration target ]. - self declaration targetSelector - ifNil: [ self declaration targetSelector: p declaration targetSelector ] ]. - self allChildren do: [: c | c checkForUnknownTarget ] +StSettingNode >> asPresenterOn: aPresenter [ + ^ setting asSettingPresenterWithOwner: aPresenter ] { #category : 'accessing' } -StSettingNode >> declaration [ - - ^ declaration -] - -{ #category : 'initialization' } -StSettingNode >> declaration: aPragmaSetting [ - - declaration := aPragmaSetting -] - -{ #category : 'private' } -StSettingNode >> declarationDescriptions [ - "Answer a of each one a word in the receiver's description" - - ^ self declaration description substrings collect: #asLowercase. -] - -{ #category : 'accessing' } -StSettingNode >> declarationTarget [ - - ^ self declaration target -] - -{ #category : 'accessing' } -StSettingNode >> declarationTarget: anObject [ - - self declaration target: anObject -] - -{ #category : 'private' } -StSettingNode >> description [ +StSettingNode >> description [ "Answer a representing an human-understandable description" - - ^ self declaration description -] -{ #category : 'private' } -StSettingNode >> descriptors [ - "Answer a of each representing a receiver's textual description or identifier" - - ^ (OrderedCollection withAll: self declarationDescriptions) - add: self label asLowercase; - yourself + ^ setting description ] { #category : 'testing' } StSettingNode >> hasChildren [ - - ^ self allChildren notEmpty + + ^ setting isGroup and: [ self allChildren isNotEmpty] ] { #category : 'testing' } -StSettingNode >> hasParent [ +StSettingNode >> hasParent [ - ^ parentName notNil -] - -{ #category : 'accessing' } -StSettingNode >> item [ - - ^ declaration + ^ setting hasParent ] { #category : 'accessing' } StSettingNode >> label [ - - ^ self declaration label -] - -{ #category : 'accessing' } -StSettingNode >> label: aString [ - - declaration label: aString. + + ^ setting label ] { #category : 'accessing' } StSettingNode >> level [ - + ^ self path size ] @@ -145,7 +75,7 @@ StSettingNode >> matchBlock [ substr asLowercase beginsWith: pattern asLowercase ] ] ] ] -{ #category : 'enumerating' } +{ #category : 'testing' } StSettingNode >> matches: aString [ "Recursive search the receiver for aString in its label" @@ -162,118 +92,67 @@ StSettingNode >> matches: aString [ ] { #category : 'accessing' } -StSettingNode >> model [ - - ^ model -] - -{ #category : 'accessing' } -StSettingNode >> model: aStSettingsTree [ - - model := aStSettingsTree +StSettingNode >> name [ + + ^ setting name ] { #category : 'accessing' } -StSettingNode >> name [ +StSettingNode >> nodeForGroup: aSettingGroup [ - ^ self declaration name + ^ tree nodeForSetting: aSettingGroup ] { #category : 'accessing' } StSettingNode >> order [ - - ^ self declaration order ifNil: [ 1 ] + ^ setting order ] { #category : 'accessing' } -StSettingNode >> order: anObject [ +StSettingNode >> order: anInteger [ - self declaration order: anObject + setting order: anInteger. ] { #category : 'accessing' } StSettingNode >> parentName [ - ^ parentName -] - -{ #category : 'accessing' } -StSettingNode >> parentName: aSymbol [ - parentName := aSymbol + + ^ setting parent ifNotNil: [ :group | group name ] ] { #category : 'accessing' } StSettingNode >> parentNode [ - - ^ self model nodeNamed: self parentName + + ^ setting parent ifNotNil: [ :group | self nodeForGroup: group ] ] { #category : 'accessing' } StSettingNode >> path [ - ^ self hasParent + ^ self hasParent ifTrue: [ self parentNode path, { self } ] ifFalse: [ { self } ] ] { #category : 'accessing' } -StSettingNode >> pragma [ - ^ pragma -] - -{ #category : 'initialization' } -StSettingNode >> pragma: aPragma [ - - pragma := aPragma -] - -{ #category : 'converting' } -StSettingNode >> presenterClass [ - - ^ self hasChildren - ifTrue: [ StSettingSectionPresenter ] - ifFalse: [ StSettingNodePresenter ] -] - -{ #category : 'printing' } -StSettingNode >> printOn: aStream [ - "Private - See superimplementor's comment" - - super printOn: aStream. - aStream - nextPutAll: ' ['; - nextPutAll: self parentName asString; - nextPutAll: '] '. - self declaration ifNotNil: [ : decl | decl printOn: aStream ]. - aStream - nextPutAll: ' ('; - nextPutAll: self allChildren size asString; - nextPutAll: ') ' - +StSettingNode >> setting [ + ^ setting ] { #category : 'accessing' } -StSettingNode >> realValue: anObject [ +StSettingNode >> setting: aSetting [ - self settingDeclaration realValue: anObject + setting := aSetting ] { #category : 'accessing' } StSettingNode >> settingDeclaration [ - - ^ declaration -] - -{ #category : 'printing' } -StSettingNode >> settingNodeIdentifier [ - ^ String streamContents: [ :aStream | - self settingNodeIdentifierOn: aStream ] + + ^ setting ] -{ #category : 'printing' } -StSettingNode >> settingNodeIdentifierOn: aWriteStream [ +{ #category : 'accessing' } +StSettingNode >> tree: aSettingTree [ - parentNode - ifNotNil: [ parentName settingNodeIdentifierOn: aWriteStream ] - ifNil: [ parentName ifNotNil: [ aWriteStream print: parentName ] ]. - aWriteStream print: self settingDeclaration name + tree := aSettingTree ] diff --git a/src/NewTools-SettingsBrowser/StSettingNodeBuilder.class.st b/src/NewTools-SettingsBrowser/StSettingNodeBuilder.class.st deleted file mode 100644 index e1ff8e4ba..000000000 --- a/src/NewTools-SettingsBrowser/StSettingNodeBuilder.class.st +++ /dev/null @@ -1,178 +0,0 @@ -" -Used to build nodes from the settings framework -" -Class { - #name : 'StSettingNodeBuilder', - #superclass : 'Object', - #instVars : [ - 'node', - 'builder', - 'callback' - ], - #category : 'NewTools-SettingsBrowser', - #package : 'NewTools-SettingsBrowser' -} - -{ #category : 'private - tree building' } -StSettingNodeBuilder >> asParentWhile: aBlock [ - builder parent: self while: aBlock -] - -{ #category : 'accessing' } -StSettingNodeBuilder >> builder: aTreeBuilder [ - builder := aTreeBuilder -] - -{ #category : 'accessing' } -StSettingNodeBuilder >> buttonLabel: aString [ - "Set the current's node declaration button label to aString" - - node item actionLabel: aString -] - -{ #category : 'accessing' } -StSettingNodeBuilder >> callback: aFullBlockClosure [ - - callback := aFullBlockClosure -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> default: anObject [ - node item default: anObject -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> description: aText [ - node item description: aText -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> dialog: aSymbol [ - node item dialog: aSymbol -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> domainValues: aCollection [ - node item domainValues: aCollection -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> getSelector: aSymbol [ - node item getSelector: aSymbol -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> ghostHelp: aString [ - node item ghostHelp: aString -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> icon: aForm [ - node item icon: aForm -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> iconName: aSymbol [ - self icon: (self iconNamed: aSymbol) -] - -{ #category : 'accessing' } -StSettingNodeBuilder >> isTransient: aBoolean [ - - node item isTransient: aBoolean -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> label: aString [ - node item label: aString -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> name [ - ^ node item name -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> name: aString [ - node item name: aString -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> noOrdering [ - node item noOrdering -] - -{ #category : 'accessing' } -StSettingNodeBuilder >> node [ - ^ node -] - -{ #category : 'accessing' } -StSettingNodeBuilder >> node: aSettingTreeNode [ - node := aSettingTreeNode -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> order: aNumber [ - node item order: aNumber -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> parent: aSymbol [ - node parentName: aSymbol -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> parentName [ - ^ node parentName -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> parentName: aSymbol [ - node parentName: aSymbol -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> precondition: aValuable [ - node item precondition: aValuable -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> range: anInterval [ - node item range: anInterval -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> script: aSymbol [ - node item script: aSymbol -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> selector: aSymbol [ - node item selector: aSymbol -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> setSelector: aSymbol [ - node item setSelector: aSymbol -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> target: anObject [ - node item target: anObject -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> targetSelector: aSelector [ - node item targetSelector: aSelector -] - -{ #category : 'declaration accessing' } -StSettingNodeBuilder >> type: anObject [ - node item type: anObject -] - -{ #category : 'tree building' } -StSettingNodeBuilder >> with: aBlock [ - self asParentWhile: aBlock -] diff --git a/src/NewTools-SettingsBrowser/StSettingTreeBuilder.class.st b/src/NewTools-SettingsBrowser/StSettingTreeBuilder.class.st deleted file mode 100644 index 3ae18797d..000000000 --- a/src/NewTools-SettingsBrowser/StSettingTreeBuilder.class.st +++ /dev/null @@ -1,94 +0,0 @@ -" -A builder for the settings tree -" -Class { - #name : 'StSettingTreeBuilder', - #superclass : 'Object', - #instVars : [ - 'nodeList', - 'currentParent', - 'currentPragma' - ], - #category : 'NewTools-SettingsBrowser-Model', - #package : 'NewTools-SettingsBrowser', - #tag : 'Model' -} - -{ #category : 'instance creation' } -StSettingTreeBuilder class >> acceptableKeywords: aCollectionOfRegExps [ - ^ self new acceptableKeywords: aCollectionOfRegExps -] - -{ #category : 'accessing' } -StSettingTreeBuilder >> buildPragma: aPragma [ - currentPragma := aPragma. - self perform: aPragma selector withArguments: aPragma arguments. - ^ nodeList -] - -{ #category : 'accessing - structure variables' } -StSettingTreeBuilder >> button: aSymbol [ - - ^ self nodeClass: ActionSettingDeclaration name: aSymbol -] - -{ #category : 'tree building' } -StSettingTreeBuilder >> group: aSymbol [ - ^ self nodeClass: PragmaSetting name: aSymbol -] - -{ #category : 'accessing' } -StSettingTreeBuilder >> nodeClass [ - - ^ StSettingNode -] - -{ #category : 'private - tree building' } -StSettingTreeBuilder >> nodeClass: aClass name: aSymbol [ - | node | - node := self nodeClass with: aClass new. - node item name: aSymbol. - node pragma: currentPragma. - node parentName: (currentParent ifNotNil: [currentParent name]). - self nodeList add: node. - ^ (StSettingNodeBuilder new) node: node; builder: self; yourself -] - -{ #category : 'accessing' } -StSettingTreeBuilder >> nodeList [ - ^ nodeList ifNil: [nodeList := OrderedCollection new] -] - -{ #category : 'private - tree building' } -StSettingTreeBuilder >> parent: aNode while: aBlock [ - | oldParent | - oldParent := currentParent. - currentParent := aNode. - aBlock value. - currentParent := oldParent -] - -{ #category : 'tree building' } -StSettingTreeBuilder >> pickOne: aSymbol [ - ^ self nodeClass: PickOneSettingDeclaration name: aSymbol -] - -{ #category : 'tree building' } -StSettingTreeBuilder >> range: aSymbol [ - ^ self nodeClass: RangeSettingDeclaration name: aSymbol -] - -{ #category : 'tree building' } -StSettingTreeBuilder >> setting: aSymbol [ - ^ self nodeClass: SettingDeclaration name: aSymbol -] - -{ #category : 'pragmas' } -StSettingTreeBuilder >> systemsettings [ - "Process a pragma" - - - currentPragma methodClass instanceSide - perform: currentPragma methodSelector - with: self -] diff --git a/src/NewTools-SettingsBrowser/StSettingsAbstractPresenter.class.st b/src/NewTools-SettingsBrowser/StSettingsAbstractPresenter.class.st index 4da011266..a8caaf4bd 100644 --- a/src/NewTools-SettingsBrowser/StSettingsAbstractPresenter.class.st +++ b/src/NewTools-SettingsBrowser/StSettingsAbstractPresenter.class.st @@ -190,18 +190,6 @@ StSettingsAbstractPresenter >> currentApplication [ ^ self application ] -{ #category : 'callbacks' } -StSettingsAbstractPresenter >> newNodePresenterFrom: aSettingNode level: anInteger [ - - | nodePresenter | - - nodePresenter := self - instantiate: aSettingNode presenterClass - on: aSettingNode. - nodePresenter sectionTitleStyle: self sectionTitleString , anInteger asString. - ^ nodePresenter -] - { #category : 'callbacks' } StSettingsAbstractPresenter >> sectionTitleString [ diff --git a/src/NewTools-SettingsBrowser/StSettingsBrowser.class.st b/src/NewTools-SettingsBrowser/StSettingsBrowser.class.st index 0fa22c82d..b7f033929 100644 --- a/src/NewTools-SettingsBrowser/StSettingsBrowser.class.st +++ b/src/NewTools-SettingsBrowser/StSettingsBrowser.class.st @@ -88,8 +88,8 @@ StSettingsBrowser >> defaultLayout [ { #category : 'initialization' } StSettingsBrowser >> exportSettings [ - self settingsTree persistence storeSettingNodes. - self inform: 'Settings were exported to ' , self settingsTree persistence fileReference fullName. + self settingsTree persistence storeSettings. + self inform: 'Settings were exported to ' , self settingsTree persistence settingsFile fullName. buttonBarPresenter enable ] @@ -118,16 +118,6 @@ StSettingsBrowser >> followPath: aStSettingNode in: aCollection [ ] -{ #category : 'initialization' } -StSettingsBrowser >> initialize [ - - super initialize. - self announcer - when: StSettingModelChanged - send: #resendChange: - to: self -] - { #category : 'initialization' } StSettingsBrowser >> initializeButtonBar [ @@ -145,7 +135,7 @@ StSettingsBrowser >> initializeButtonBar [ icon: (self application iconNamed: #save); label: 'Export'; help: 'Save settings into a file'; - action: [ self exportSettings ]; + action: [ self storeSettings ]; yourself); yourself ] @@ -184,7 +174,8 @@ StSettingsBrowser >> initializePresenters [ { #category : 'loading' } StSettingsBrowser >> loadSettings [ "Load the settings from the system settings file, if exists" - self settingsTree updateSettingNodes. + + self settingsTree persistence loadSettings. self inform: 'Settings loaded' ] @@ -194,12 +185,6 @@ StSettingsBrowser >> pagePresenter [ ^ detailsPresenter ] -{ #category : 'private' } -StSettingsBrowser >> resendChange: ann [ - - detailsPresenter announcer announce: ann -] - { #category : 'accessing' } StSettingsBrowser >> resetSearchResult [ @@ -230,12 +215,12 @@ StSettingsBrowser >> select: aString [ ] { #category : 'execution' } -StSettingsBrowser >> selectDialog: fileReferneces [ +StSettingsBrowser >> selectDialog: fileReferences [ ^ SpSelectDialog new title: 'Settings Browser Selector'; message: 'Select a Stored Settings File'; - items: fileReferneces; + items: fileReferences; display: [ :each | each basename ]; displayIcon: [ :each | self iconNamed: each systemIconName ]; openModal @@ -262,6 +247,14 @@ StSettingsBrowser >> sortNodes: aCollection [ ^ aCollection sorted: #order ascending, #label ascending ] +{ #category : 'storing' } +StSettingsBrowser >> storeSettings [ + + self settingsTree persistence storeSettings. + self inform: 'Settings were exported to ' , self settingsTree settingsFileReference fullName. + buttonBarPresenter enable +] + { #category : 'initialization' } StSettingsBrowser >> updatePresenter [ diff --git a/src/NewTools-SettingsBrowser/StSettingsTree.class.st b/src/NewTools-SettingsBrowser/StSettingsTree.class.st index 20ac06146..543927f6e 100644 --- a/src/NewTools-SettingsBrowser/StSettingsTree.class.st +++ b/src/NewTools-SettingsBrowser/StSettingsTree.class.st @@ -1,152 +1,71 @@ +" +I am the model of the settings browser: I build the settings declared with with a SettingsManager and wrap each of them in a StSettingNode. +" Class { #name : 'StSettingsTree', - #superclass : 'Model', + #superclass : 'Object', #instVars : [ - 'collector', - 'nodeList', - 'persistence' + 'manager', + 'nodeList' ], #category : 'NewTools-SettingsBrowser-Model', #package : 'NewTools-SettingsBrowser', #tag : 'Model' } -{ #category : 'opening' } -StSettingsTree class >> settingsKeywords [ - - ^ (Pragma allNamed: #systemsettings) collect: [: p | p method selector ] -] - { #category : 'accessing' } -StSettingsTree >> acceptableKeywords: keywords [ - self collector - selectors: keywords; - filter: [:prg | prg methodClass isMeta]. - nodeList := nil. - self collector reset -] - -{ #category : 'checking' } -StSettingsTree >> checkForUnknownParent [ - self unclassified - ifNotEmpty: [ :nodesWithUnknownParent | - | builder g | - builder := StSettingTreeBuilder new. - g := (builder group: #nodesWithUnknownParent) node. - self nodeList addFirst: g. - g model: self. - g item label: '*** Unclassified ***'. - g item icon: (self iconNamed: #smallDebug). - g item order: 0.0. - nodesWithUnknownParent - do: [ :node | node parentName: #nodesWithUnknownParent ] ] -] - -{ #category : 'checking' } -StSettingsTree >> checkForUnknownTarget [ - "check only root because other nodes with unknown target inherits it from its parent" - self settingTreeRoots do: [:node | node item target ifNil: [node item target: (node pragma ifNotNil: [:prg | prg methodClass instanceSide])]]. - self settingTreeRoots do: [:node | node checkForUnknownTarget] -] - -{ #category : 'querying' } StSettingsTree >> childrenOf: aNode [ - | children idx order | - "Get aNode children. Assign children order if one child has an order which is not nil" - children := self nodeList select: [ :p | p parentName = aNode settingDeclaration name ]. - children - detect: [ :n | n order isNotNil ] - ifFound: [ :firstWithOrder | - idx := children indexOf: firstWithOrder. - order := firstWithOrder order. - idx > 1 - ifTrue: [ - idx - 1 to: 1 do: [ :pos | - (children at: pos) order: order - 1. - order := order - 1 ] ]. - order := firstWithOrder order. - idx + 1 to: children size do: [ :pos | - (children at: pos) order ifNil: [ (children at: pos) order: order + 1 ] ifNotNil: [ order := (children at: pos) order ]. - order := order + 1 ] ]. - ^ children -] + "Answer the nodes of the settings of the group of aNode" -{ #category : 'accessing' } -StSettingsTree >> collector [ - ^ collector ifNil: [collector := PragmaCollector new] + | children | + children := self nodeList select: [ :each | each setting parent == aNode setting ]. + self completeOrdersOf: children. + ^ children ] -{ #category : 'querying' } -StSettingsTree >> deeplyDetect: aBlock [ - self settingTreeRoots - do: [:sub | (sub deeplyDetect: aBlock) - ifNotNil: [:found | ^ found]]. - ^ nil -] +{ #category : 'private' } +StSettingsTree >> completeOrdersOf: nodes [ + "Give an order to the nodes without one, so that they keep their position among the nodes with an order" -{ #category : 'querying' } -StSettingsTree >> deeplySelect: aBlock [ - ^ self deeplySelect: aBlock in: OrderedCollection new -] + | firstOrderedIndex | + firstOrderedIndex := nodes findFirst: [ :each | each order isNotNil ]. + firstOrderedIndex = 0 ifTrue: [ ^ self ]. -{ #category : 'querying' } -StSettingsTree >> deeplySelect: aBlock in: aCollection [ - self settingTreeRoots - do: [:aRoot | aRoot deeplySelect: aBlock in: aCollection]. - ^ aCollection + self orderNodesBefore: firstOrderedIndex in: nodes. + self orderUnorderedNodesAfter: firstOrderedIndex in: nodes ] { #category : 'accessing' } StSettingsTree >> defaultCategories [ "Answer a of representing the default main setting categories in the system" - ^ self treeRoots. -] - -{ #category : 'private - tree building' } -StSettingsTree >> emptyNodeNamed: aSymbol [ - (self nodeNamed: aSymbol) + ^ self treeRoots ] { #category : 'testing' } StSettingsTree >> hasSettingsFile [ - "Answer if a system settings file exists" - ^ self persistence hasSettingsFile -] - -{ #category : 'accessing' } -StSettingsTree >> itemSortBlock [ - ^ [:a :b | - ((a order isNotNil and: [b order isNotNil]) and: [a order ~= b order]) - ifTrue: [a order < b order] - ifFalse: [((a order isNil and: [b order isNil]) or: [a order = b order]) - ifTrue: [a label < b label] - ifFalse: [a order ifNil: [false] ifNotNil: [true]]]] + ^ manager isNotNil + and: [ manager settingsFile isNotNil + and: [ manager settingsFile exists ] ] ] { #category : 'instance creation' } StSettingsTree >> newSettingTreeBuilderNodes [ - "Walk over the receiver's pragmas. Build and answer a of , each one representing a specific setting" - | builder | - - builder := StSettingTreeBuilder new. - self pragmasDo: [ :p | builder buildPragma: p ]. - nodeList := builder nodeList. - nodeList do: [: n | n model: self ]. - self checkForUnknownParent. - self checkForUnknownTarget. + "Walk over the receiver's pragmas. Build and answer an of , each one representing a specific setting" + + manager := SettingsManager forPragmaNamed: #systemsettings. + manager useDefaultPreferencesFile. + + nodeList := manager settings collect: [ :setting | setting asSettingNode ]. + nodeList do: [: node | node tree: self ]. ^ nodeList ] -{ #category : 'instance creation' } -StSettingsTree >> newTreeHolder [ - "Set the receiver's collector to gather the system setting pragmas" +{ #category : 'accessing' } +StSettingsTree >> nodeForSetting: aSetting [ - ^ self - acceptableKeywords: { #systemsettings }; - nodeList: self nodeList; - yourself + ^ nodeList detect: [ :node | node setting == aSetting ] ] { #category : 'accessing' } @@ -161,24 +80,27 @@ StSettingsTree >> nodeList: aCollection [ nodeList := aCollection ] -{ #category : 'private - tree building' } -StSettingsTree >> nodeNamed: aSymbol [ - ^ self nodeNamed: aSymbol ifAbsent: [] +{ #category : 'private' } +StSettingsTree >> orderNodesBefore: anIndex in: nodes [ + "Each node before the one at anIndex gets the order of the node after it, minus 1" + + anIndex - 1 to: 1 by: -1 do: [ :index | + (nodes at: index) order: (nodes at: index + 1) order - 1 ] ] -{ #category : 'private - tree building' } -StSettingsTree >> nodeNamed: aSymbol ifAbsent: aBlock [ - ^ self nodeList detect: [:d | d settingDeclaration name = aSymbol] ifNone: aBlock +{ #category : 'private' } +StSettingsTree >> orderUnorderedNodesAfter: anIndex in: nodes [ + "Each node after the one at anIndex without an order gets the order of the node before it, plus 1" + + anIndex + 1 to: nodes size do: [ :index | + (nodes at: index) order ifNil: [ + (nodes at: index) order: (nodes at: index - 1) order + 1 ] ] ] { #category : 'accessing' } StSettingsTree >> persistence [ - ^ persistence ifNil: [ persistence := SystemSettingsPersistence settingTree: self ] -] -{ #category : 'querying' } -StSettingsTree >> pragmasDo: aBlock [ - ^ self collector do: aBlock + ^ manager ] { #category : 'private - queries' } @@ -190,66 +112,38 @@ StSettingsTree >> processSearch: aString [ as: Set ] -{ #category : 'instance creation' } -StSettingsTree >> retainedNodesFromList: aListOfNodes [ - | retained | - retained := OrderedCollection new. - aListOfNodes do: [:n | [n item precondition value ifTrue: [retained add: n]] on: Error do: [retained add: n]]. - ^ retained -] +{ #category : 'accessing' } +StSettingsTree >> settingsFileDirectory [ -{ #category : 'instance creation' } -StSettingsTree >> settingTreeRoots [ - ^ self retainedNodesFromList: ((self nodeList select: [:n | n parentName isNil]) asArray sort: self sortBlock) asOrderedCollection + ^ manager settingsFile parent ] { #category : 'testing' } StSettingsTree >> settingsFileReference [ "Answer a with the name of the file where settings are stored" - ^ self persistence fileReference -] - -{ #category : 'instance creation' } -StSettingsTree >> settingsKeywords [ - - ^ self class settingsKeywords + ^ manager settingsFile ] { #category : 'accessing' } StSettingsTree >> sortBlock [ - ^ [:a :b | self itemSortBlock value: a declaration value: b declaration ] -] + "Sort nodes by setting order, then by label. Nodes with an order come first" -{ #category : 'persistence' } -StSettingsTree >> storeSettingNodes [ - self persistence storeSettingNodes + ^ [ :a :b | + | orderA orderB | + orderA := a setting order. + orderB := b setting order. + (orderA isNotNil and: [ orderB isNotNil and: [ orderA ~= orderB ] ]) + ifTrue: [ orderA < orderB ] + ifFalse: [ + orderA = orderB + ifTrue: [ a setting label < b setting label ] + ifFalse: [ orderA isNotNil ] ] ] ] { #category : 'instance creation' } StSettingsTree >> treeRoots [ - "Answer a of representing the main setting categories in the system" - - ^ self newTreeHolder settingTreeRoots -] - -{ #category : 'querying' } -StSettingsTree >> unclassified [ - ^ self nodeList select: [:node | node parentName isNotNil and: [node parentNode isNil]] -] - -{ #category : 'accessing' } -StSettingsTree >> updateList [ - nodeList := nil -] - -{ #category : 'persistence' } -StSettingsTree >> updateSettingNodes [ - self persistence updateSettingNodes -] + "Answer an array of representing the main setting categories in the system" -{ #category : 'updating' } -StSettingsTree >> whenChangedSend: aSelector to: aTarget [ - self collector whenChangedSend: aSelector to: aTarget. - self collector whenResetSend: aSelector to: aTarget + ^ (self nodeList reject: #hasParent) asArray sort: self sortBlock ] diff --git a/src/NewTools-SettingsBrowser/SystemSettingsPersistence.extension.st b/src/NewTools-SettingsBrowser/SystemSettingsPersistence.extension.st deleted file mode 100644 index 2f53fd1a9..000000000 --- a/src/NewTools-SettingsBrowser/SystemSettingsPersistence.extension.st +++ /dev/null @@ -1,8 +0,0 @@ -Extension { #name : 'SystemSettingsPersistence' } - -{ #category : '*NewTools-SettingsBrowser' } -SystemSettingsPersistence >> hasSettingsFile [ - "Answer if the system settings file exists" - - ^ fileReference exists -] diff --git a/src/NewTools-Spotter-Extensions/SettingTree.extension.st b/src/NewTools-Spotter-Extensions/SettingTree.extension.st deleted file mode 100644 index 4a704b755..000000000 --- a/src/NewTools-Spotter-Extensions/SettingTree.extension.st +++ /dev/null @@ -1,11 +0,0 @@ -Extension { #name : 'SettingTree' } - -{ #category : '*NewTools-Spotter-Extensions' } -SettingTree >> spotterForSettingsFor: aStep [ - - aStep listProcessor - title: 'Settings'; - allCandidates: [ self nodeList ]; - itemName: [ :each | each spotterLabel ]; - filter: StFilterSubstring -] diff --git a/src/NewTools-Spotter-Extensions/SettingNode.extension.st b/src/NewTools-Spotter-Extensions/StSettingNode.extension.st similarity index 55% rename from src/NewTools-Spotter-Extensions/SettingNode.extension.st rename to src/NewTools-Spotter-Extensions/StSettingNode.extension.st index 38da4daa4..d72a068ae 100644 --- a/src/NewTools-Spotter-Extensions/SettingNode.extension.st +++ b/src/NewTools-Spotter-Extensions/StSettingNode.extension.st @@ -1,7 +1,7 @@ -Extension { #name : 'SettingNode' } +Extension { #name : 'StSettingNode' } { #category : '*NewTools-Spotter-Extensions' } -SettingNode >> spotterForSettingsFor: aStep [ +StSettingNode >> spotterForSettingsFor: aStep [ self allChildren isEmpty ifTrue: [ ^ self ]. aStep listProcessor @@ -12,9 +12,9 @@ SettingNode >> spotterForSettingsFor: aStep [ ] { #category : '*NewTools-Spotter-Extensions' } -SettingNode >> spotterLabel [ +StSettingNode >> spotterLabel [ - | label | - label := self settingDeclaration label. - ^ self parentNode ifNil: [ label ] ifNotNil: [ self parentNode spotterLabel , '/' , label ] + ^ self parentNode + ifNil: [ self label ] + ifNotNil: [ :parent | parent spotterLabel , '/' , self label ] ] diff --git a/src/NewTools-Spotter-Processors/StSpotterPragmaBasedProcessor.class.st b/src/NewTools-Spotter-Processors/StSpotterPragmaBasedProcessor.class.st index 07c09e69d..e302222a8 100644 --- a/src/NewTools-Spotter-Processors/StSpotterPragmaBasedProcessor.class.st +++ b/src/NewTools-Spotter-Processors/StSpotterPragmaBasedProcessor.class.st @@ -40,21 +40,21 @@ StSpotterPragmaBasedProcessor class >> defaultNestedItemsLimit: aValue [ { #category : 'accessing - defaults' } StSpotterPragmaBasedProcessor class >> settingsOn: aBuilder [ - + (aBuilder setting: #defaultItemsLimit) target: self; - parent: #spotter; + parentName: #spotter; label: 'Number of results per category'; - default: 25; + defaultValue: 25; order: 100; description: 'Number of results per category to show in Spotter'. - + (aBuilder setting: #defaultNestedItemsLimit) target: self; - parent: #spotter; + parentName: #spotter; label: 'Number of nested results per category'; - default: 2000; + defaultValue: 2000; order: 101; description: 'Number of total results per of category to show in Spotter' ] diff --git a/src/NewTools-Spotter-Processors/StSpotterProcessor.class.st b/src/NewTools-Spotter-Processors/StSpotterProcessor.class.st index f2af66b69..af3b34194 100644 --- a/src/NewTools-Spotter-Processors/StSpotterProcessor.class.st +++ b/src/NewTools-Spotter-Processors/StSpotterProcessor.class.st @@ -94,19 +94,17 @@ StSpotterProcessor class >> settingsDescription [ { #category : 'settings' } StSpotterProcessor class >> settingsOn: aBuilder [ - + (aBuilder group: #spotterProcessors) - parent: #spotter; + parentName: #spotter; label: 'Sources'; description: 'It configures the sources that are queried when using spotter'. - self allConcreteSubclasses - reject: [ :each | each hideInSettings ] - thenDo: [ :aProcessorClass | + self allConcreteSubclasses reject: [ :each | each hideInSettings ] thenDo: [ :aProcessorClass | (aBuilder setting: aProcessorClass name , '_enabled') - parent: #spotterProcessors; - default: aProcessorClass defaultEnabled; + parentName: #spotterProcessors; + defaultValue: aProcessorClass defaultEnabled; getSelector: #enabled; setSelector: #enabled:; target: aProcessorClass; diff --git a/src/NewTools-Spotter/StSpotter.class.st b/src/NewTools-Spotter/StSpotter.class.st index d6c1a89b2..03c1c9fec 100644 --- a/src/NewTools-Spotter/StSpotter.class.st +++ b/src/NewTools-Spotter/StSpotter.class.st @@ -243,33 +243,33 @@ StSpotter class >> resetHistory [ { #category : 'settings' } StSpotter class >> settingsOn: aBuilder [ - + (aBuilder group: #spotter) - parent: #tools; + parentName: #tools; label: 'Spotter'; description: 'Spotter configuration'. (aBuilder setting: #previewVisible) - parent: #spotter; - default: self isShowingPreview; + parentName: #spotter; + defaultValue: self isShowingPreview; target: self; description: 'If Spotter will show the preview panel on the right of spotter'; label: 'Show Preview Panel'. - + (aBuilder setting: #tipsVisible) - parent: #spotter; - default: self isShowingTips; + parentName: #spotter; + defaultValue: self isShowingTips; target: self; description: 'If Spotter will show the tips at the bottom of spotter'; label: 'Show Tips Panel'. - + (aBuilder setting: #insertsSelection) - parent: #spotter; - default: self insertsSelection; + parentName: #spotter; + defaultValue: self insertsSelection; target: self; description: 'When the Spotter is opened, automatically insert the selected text into the search field'; - label: 'Inserts Selection'. + label: 'Inserts Selection' ] { #category : 'accessing' } diff --git a/src/NewTools-WindowManager/SpClosedWindowListPresenter.class.st b/src/NewTools-WindowManager/SpClosedWindowListPresenter.class.st index 1562736a4..b9605ac8f 100644 --- a/src/NewTools-WindowManager/SpClosedWindowListPresenter.class.st +++ b/src/NewTools-WindowManager/SpClosedWindowListPresenter.class.st @@ -86,12 +86,11 @@ SpClosedWindowListPresenter class >> settingOn: aBuilder [ (aBuilder setting: #useHideForClose) - parent: #tools; + parentName: #tools; order: 1; target: self; selector: #enableCloseWindow; - description: - 'If closed windows will be stored in SpClosedWindowListPresenter'; + description: 'If closed windows will be stored in SpClosedWindowListPresenter'; label: 'Use last closed windows' ]