|
| 1 | +" |
| 2 | +It represents a setting category page with setting sections and settings. The page was selected from `StSettingsCategoriesPresenter` and it matches a `StSettingsCategoryItemPresenter`. |
| 3 | +
|
| 4 | +" |
| 5 | +Class { |
| 6 | + #name : 'StSettingsDetailsPresenter', |
| 7 | + #superclass : 'StSettingsAbstractPresenter', |
| 8 | + #instVars : [ |
| 9 | + 'pageTitle', |
| 10 | + 'settingDocPresenter', |
| 11 | + 'settingDocLabel', |
| 12 | + 'notebook', |
| 13 | + 'settingTree' |
| 14 | + ], |
| 15 | + #category : 'NewTools-SettingsBrowser-UI', |
| 16 | + #package : 'NewTools-SettingsBrowser', |
| 17 | + #tag : 'UI' |
| 18 | +} |
| 19 | + |
| 20 | +{ #category : 'private' } |
| 21 | +StSettingsDetailsPresenter >> activePage [ |
| 22 | + |
| 23 | + | selectedPage | |
| 24 | + |
| 25 | + selectedPage := notebook selectedPage. |
| 26 | + selectedPage activePresenter |
| 27 | + ifNil: [ selectedPage retrievePresenter ]. |
| 28 | + ^ selectedPage activePresenter |
| 29 | +] |
| 30 | + |
| 31 | +{ #category : 'callbacks - tabs' } |
| 32 | +StSettingsDetailsPresenter >> addDefaultGeneralTabFrom: aStSettingNode [ |
| 33 | + "Private - Add General Settings default" |
| 34 | + |
| 35 | + | generalSettingNode | |
| 36 | + |
| 37 | + generalSettingNode := self newSettingNode. |
| 38 | + generalSettingNode item name: self generalTitle. |
| 39 | + generalSettingNode parentName: aStSettingNode name. |
| 40 | + notebook addPage: (SpNotebookPage new |
| 41 | + icon: (self iconNamed: #smallQuestion); |
| 42 | + presenterProvider: [ StSettingsNotebookPageContentPresenter on: generalSettingNode ]; |
| 43 | + title: self generalTitle; |
| 44 | + yourself). |
| 45 | +] |
| 46 | + |
| 47 | +{ #category : 'callbacks - tabs' } |
| 48 | +StSettingsDetailsPresenter >> addHeaderForSettingsWithoutParent: aSpNotebookPage [ |
| 49 | + "Private - We add a 'General' header (2nd level) for those nodes without parent other than the root" |
| 50 | + |
| 51 | + | generalSettingNode generalNodePresenter | |
| 52 | + |
| 53 | + generalSettingNode := self newGeneralSetting: aSpNotebookPage. |
| 54 | + generalNodePresenter := self |
| 55 | + newSectionNodePresenterFrom: generalSettingNode |
| 56 | + level: 2. |
| 57 | + self activePage |
| 58 | + add: generalNodePresenter |
| 59 | + expand: false |
| 60 | +] |
| 61 | + |
| 62 | +{ #category : 'callbacks - tabs' } |
| 63 | +StSettingsDetailsPresenter >> addSearchResultTabFrom: resultStSettingNodes [ |
| 64 | + "Private - Add a tab with search results from resultStSettingNodes in the receiver's notebook" |
| 65 | + |
| 66 | + | rootSearchResultNode rsSettingNodes rsRootResultNode | |
| 67 | + |
| 68 | + notebook hasPages ifTrue: [ notebook removeAll ]. |
| 69 | + |
| 70 | + rsSettingNodes := resultStSettingNodes copy asOrderedCollection. |
| 71 | + "Create a new settings tree with the results" |
| 72 | + rsRootResultNode := StSettingsTree new nodeList: rsSettingNodes; yourself. |
| 73 | + "Create a new parent node " |
| 74 | + rootSearchResultNode := self newSettingNode |
| 75 | + parentName: 'Results'; |
| 76 | + model: rsRootResultNode; |
| 77 | + yourself. |
| 78 | + |
| 79 | + "Set the model of each result node" |
| 80 | + rsSettingNodes do: [ : snc | |
| 81 | + snc |
| 82 | + parentName: rootSearchResultNode name; |
| 83 | + model: rsRootResultNode ]. |
| 84 | + |
| 85 | + notebook addPage: (self newResultPageOn: rootSearchResultNode). |
| 86 | + self selectFirstPage. |
| 87 | + |
| 88 | + |
| 89 | +] |
| 90 | + |
| 91 | +{ #category : 'callbacks - tabs' } |
| 92 | +StSettingsDetailsPresenter >> addTabsFrom: aStSettingNode [ |
| 93 | + |
| 94 | + aStSettingNode allChildren do: [ :aSettingNode | |
| 95 | + | nodePresenter | |
| 96 | + (nodePresenter := self |
| 97 | + instantiate: aSettingNode presenterClass |
| 98 | + on: aSettingNode) hasChildren |
| 99 | + ifTrue: [ |
| 100 | + nodePresenter sectionTitleStyle: self sectionTitleString. |
| 101 | + notebook addPage: (SpNotebookPage new |
| 102 | + icon: (self iconNamed: #smallQuestion); |
| 103 | + presenterProvider: [ StSettingsNotebookPageContentPresenter on: aSettingNode ]; |
| 104 | + title: aSettingNode label; |
| 105 | + yourself) ] ] |
| 106 | +] |
| 107 | + |
| 108 | +{ #category : 'initialization' } |
| 109 | +StSettingsDetailsPresenter >> defaultInputPort [ |
| 110 | + |
| 111 | + ^ SpModelPort newPresenter: self |
| 112 | + |
| 113 | +] |
| 114 | + |
| 115 | +{ #category : 'layout' } |
| 116 | +StSettingsDetailsPresenter >> defaultLayout [ |
| 117 | + |
| 118 | + ^ SpBoxLayout newTopToBottom |
| 119 | + add: pageTitle expand: false; |
| 120 | + add: (SpPanedLayout newVertical |
| 121 | + positionOfSlider: 0.85; |
| 122 | + add: notebook; |
| 123 | + add: (SpBoxLayout newTopToBottom |
| 124 | + spacing: 5; |
| 125 | + add: settingDocLabel expand: false; |
| 126 | + add: settingDocPresenter; |
| 127 | + yourself); |
| 128 | + yourself); |
| 129 | + yourself |
| 130 | +] |
| 131 | + |
| 132 | +{ #category : 'callbacks - tabs' } |
| 133 | +StSettingsDetailsPresenter >> generalTitle [ |
| 134 | + |
| 135 | + ^ 'General' |
| 136 | +] |
| 137 | + |
| 138 | +{ #category : 'initialization' } |
| 139 | +StSettingsDetailsPresenter >> initializePresenters [ |
| 140 | + |
| 141 | + pageTitle := self newLabel. |
| 142 | + notebook := self newNotebook |
| 143 | + whenSelectedPageChangedDo: [ :presenter | self updateSelectedPage: presenter ]; |
| 144 | + yourself. |
| 145 | + settingDocLabel := self newLabel |
| 146 | + addStyle: 'settingDocTitle'; |
| 147 | + yourself. |
| 148 | + settingDocPresenter := self newText |
| 149 | +] |
| 150 | + |
| 151 | +{ #category : 'callbacks - tabs' } |
| 152 | +StSettingsDetailsPresenter >> newGeneralSetting: aSpNotebookPage [ |
| 153 | + |
| 154 | + | currentParent generalSettingNode | |
| 155 | + |
| 156 | + currentParent := aSpNotebookPage activePresenter parentNode. |
| 157 | + generalSettingNode := StSettingNode with: PragmaSetting new. |
| 158 | + generalSettingNode item name: self generalTitle. |
| 159 | + generalSettingNode parentName: (currentParent ifNotNil: [ currentParent name ]). |
| 160 | + ^ generalSettingNode |
| 161 | +] |
| 162 | + |
| 163 | +{ #category : 'TOREMOVE' } |
| 164 | +StSettingsDetailsPresenter >> newResultPageOn: aStSettingNode [ |
| 165 | + |
| 166 | + ^ SpNotebookPage new |
| 167 | + icon: (self iconNamed: #smallQuestion); |
| 168 | + presenterProvider: [ self instantiate: StSettingsNotebookPageContentPresenter on: aStSettingNode ]; |
| 169 | + beCloseable; |
| 170 | + title: self resultsTitle; |
| 171 | + yourself |
| 172 | +] |
| 173 | + |
| 174 | +{ #category : 'callbacks' } |
| 175 | +StSettingsDetailsPresenter >> newSectionNodePresenterFrom: aSettingNode level: anInteger [ |
| 176 | + "Private - This is a temporary method until finding a proper solution for 'hand-wired' sections, since some settings declarations are not grouped" |
| 177 | + |
| 178 | + | nodePresenter | |
| 179 | + nodePresenter := self |
| 180 | + instantiate: StSettingSectionPresenter |
| 181 | + on: aSettingNode. |
| 182 | + nodePresenter sectionTitleStyle: self sectionTitleString , anInteger asString. |
| 183 | + ^ nodePresenter |
| 184 | +] |
| 185 | + |
| 186 | +{ #category : 'callbacks - tabs' } |
| 187 | +StSettingsDetailsPresenter >> newSettingNode [ |
| 188 | + |
| 189 | + ^ StSettingNode with: PragmaSetting new. |
| 190 | +] |
| 191 | + |
| 192 | +{ #category : 'initialization' } |
| 193 | +StSettingsDetailsPresenter >> notebook [ |
| 194 | + |
| 195 | + ^ notebook |
| 196 | + |
| 197 | +] |
| 198 | + |
| 199 | +{ #category : 'callbacks - tabs' } |
| 200 | +StSettingsDetailsPresenter >> resultsTitle [ |
| 201 | + |
| 202 | + ^ 'Results' |
| 203 | +] |
| 204 | + |
| 205 | +{ #category : 'callbacks' } |
| 206 | +StSettingsDetailsPresenter >> selectFirstPage [ |
| 207 | + |
| 208 | + self notebook selectPageIndex: 1. |
| 209 | + self updateSelectedPage: self notebook selectedPage. |
| 210 | +] |
| 211 | + |
| 212 | +{ #category : 'accessing - model' } |
| 213 | +StSettingsDetailsPresenter >> setModel: aNode [ |
| 214 | + "Private - Set the receiver's content iterating recursively starting from aNode" |
| 215 | + |
| 216 | + settingTree := aNode model childrenOf: aNode. |
| 217 | + pageTitle |
| 218 | + label: aNode label; |
| 219 | + addStyle: 'pageTitle'. |
| 220 | + notebook removeAll. |
| 221 | + self updatePages: aNode. |
| 222 | + |
| 223 | +] |
| 224 | + |
| 225 | +{ #category : 'callbacks - tabs' } |
| 226 | +StSettingsDetailsPresenter >> updatePages: aStSettingNode [ |
| 227 | + "Private - Recursively iterate aStSettingNode children using anInteger as 'level' indicator for title styling purposes" |
| 228 | + |
| 229 | + self addDefaultGeneralTabFrom: aStSettingNode. |
| 230 | + self addTabsFrom: aStSettingNode. |
| 231 | +] |
| 232 | + |
| 233 | +{ #category : 'callbacks' } |
| 234 | +StSettingsDetailsPresenter >> updatePresenterGeneralNodes: aCollection [ |
| 235 | + |
| 236 | + | nodePresenter | |
| 237 | + aCollection do: [ :settingNode | |
| 238 | + nodePresenter := self newNodePresenterFrom: settingNode level: 2. |
| 239 | + "Here the owner of each node presenter will be updated to a StSettingsNotebookPageContentPresenter" |
| 240 | + self activePage add: nodePresenter expand: false ] |
| 241 | +] |
| 242 | + |
| 243 | +{ #category : 'callbacks' } |
| 244 | +StSettingsDetailsPresenter >> updatePresenterTree: aStSettingNode level: anInteger [ |
| 245 | + "Private - Recursively iterate aStSettingNode children using anInteger as 'level' indicator for title styling purposes" |
| 246 | + |
| 247 | + aStSettingNode allChildren do: [ :aSettingNode | |
| 248 | + | nodePresenter | |
| 249 | + nodePresenter := self |
| 250 | + newNodePresenterFrom: aSettingNode |
| 251 | + level: anInteger. |
| 252 | + "The activePage here should be a StSettingsNotebookPageContentPresenter" |
| 253 | + self activePage add: nodePresenter expand: false. |
| 254 | + self updatePresenterTree: aSettingNode level: anInteger + 1 ]. |
| 255 | + |
| 256 | + |
| 257 | +] |
| 258 | + |
| 259 | +{ #category : 'callbacks - tabs' } |
| 260 | +StSettingsDetailsPresenter >> updateSelectedPage: aSpNotebookPage [ |
| 261 | + "Private - Update the receiver's notebook with aSpNotebookPage. The first time the notebook is opened, a #selectedPage event is triggered and aSpNotebookPage will be nil" |
| 262 | + |
| 263 | + aSpNotebookPage ifNotNil: [ |
| 264 | + aSpNotebookPage activePresenter ifNotNil: [ : activePresenter | activePresenter removeAll ]. |
| 265 | + self updateSelectedSpecialCases: aSpNotebookPage. |
| 266 | + self updateSelectedPageTree: aSpNotebookPage ] |
| 267 | +] |
| 268 | + |
| 269 | +{ #category : 'private' } |
| 270 | +StSettingsDetailsPresenter >> updateSelectedPageTree: aSpNotebookPage [ |
| 271 | + |
| 272 | + | updatedPage | |
| 273 | + |
| 274 | + updatedPage := aSpNotebookPage activePresenter |
| 275 | + ifNil: [ aSpNotebookPage retrievePresenter ] |
| 276 | + ifNotNil: [ aSpNotebookPage activePresenter ]. |
| 277 | + |
| 278 | + self updatePresenterTree: updatedPage parentNode level: 2 |
| 279 | +] |
| 280 | + |
| 281 | +{ #category : 'callbacks - tabs' } |
| 282 | +StSettingsDetailsPresenter >> updateSelectedSpecialCases: aSpNotebookPage [ |
| 283 | + "Do not add a 'General' header if we are already in the General tab" |
| 284 | + |
| 285 | + aSpNotebookPage title = self resultsTitle |
| 286 | + ifFalse: [ |
| 287 | + aSpNotebookPage title = self generalTitle |
| 288 | + ifFalse: [ self addHeaderForSettingsWithoutParent: aSpNotebookPage ] |
| 289 | + ifTrue: [ self updatePresenterGeneralNodes: (settingTree reject: [ : node | node hasChildren ]) ] ] |
| 290 | +] |
| 291 | + |
| 292 | +{ #category : 'callbacks' } |
| 293 | +StSettingsDetailsPresenter >> updateSetting: labelString helpText: settingHelpString [ |
| 294 | + |
| 295 | + settingDocLabel label: labelString. |
| 296 | + settingDocPresenter text: settingHelpString. |
| 297 | +] |
0 commit comments