<b>=============== Summary ===============</b><br>
<br>
Change Set: toolCodePane<br>
Date: 5 April 2022<br>
Author: Christoph Thiede<br>
<br>
Improves MVC compatibility for view accesses from model.<br>
<br>
* Moves up #someTextPaneWithSelector: & friends from StringHolder to Model and improves documentation on the antiidiomatic pattern they represent.<br>
* Fixes 'run to selection' & 'tally it' button in MVC debugger.<br>
* Improves MVC compatibility in Monticello save version dialog (still, showModally does not yet work, though.)<br>
<br>
<b>=============== Diff ===============</b><br>
<br>
<b>CodeHolder>>searchPane {categories & search pane} · ct 4/5/2022 20:19 (changed)</b><br>
searchPane<br>
"Answer the search pane associated with the receiver in its window, or nil if none. Morphic only"<br>
<br>
<s><font color="#0000FF">- ^ self textPaneWithSelector: #lastSearchString<br>
</font></s><font color="#FF0000">+ | pane |<br>
+ pane := self someTextPaneWithSelector: #lastSearchString.<br>
+ ^ pane isMorph ifTrue: [pane]</font><br>
<br>
<b>Debugger>>codePaneSelectionInterval {code pane} · ct 4/5/2022 19:50 (changed)</b><br>
codePaneSelectionInterval<br>
<br>
<s><font color="#0000FF">- ^ self codeTextMorph<br>
</font></s><font color="#FF0000">+ ^ self codeTextPane<br>
</font> ifNotNil: [:cp | cp selectionInterval]<br>
ifNil: [Interval from: 0 to: 0]<br>
<br>
<b>Debugger>>getSelectedText {tally support} · ct 4/5/2022 19:50 (changed)</b><br>
getSelectedText<br>
| m interval text |<br>
<s><font color="#0000FF">- m := self codeTextMorph ifNil: [^ ''].<br>
</font></s><font color="#FF0000">+ m := self codeTextPane ifNil: [^ ''].<br>
</font> interval := m selectionInterval.<br>
text := m text.<br>
^ text copyFrom: interval first to: interval last<br>
<br>
<br>
<b>Debugger>>tally {tally support} · ct 4/5/2022 19:46 (changed)</b><br>
tally<br>
<br>
<s><font color="#0000FF">- self codeTextMorph ifNotNil: [:o| o tallyIt] ifNil: [Beeper beep]<br>
</font></s><font color="#FF0000">+ self codeTextPane ifNotNil: [:o | o tallyIt] ifNil: [Beeper beep]<br>
</font><br>
<br>
<b>MCSaveVersionDialog>>accept {actions} · ct 4/5/2022 19:57 (changed)</b><br>
accept<br>
| logMessage logMessageWidget |<br>
self updateItems.<br>
<s><font color="#0000FF">- logMessage := (logMessageWidget := self findTextMorph: #logMessage) text asString.<br>
</font></s><font color="#FF0000">+ logMessage := (logMessageWidget := self someTextPaneWithSelector: #logMessage) text asString.<br>
</font> (logMessage isEmpty or: [logMessage beginsWith: 'empty log message'])<br>
ifTrue:<br>
<s><font color="#0000FF">- [(UIManager confirm: 'the log message is empty; are you sure you want to commit') ifFalse: [^ self]]<br>
</font></s><font color="#FF0000">+ [(Project uiManager confirm: 'the log message is empty; are you sure you want to commit') ifFalse: [^ self]]<br>
</font> ifFalse: [logMessageWidget accept].<br>
self answer: {<br>
<s><font color="#0000FF">- (self findTextMorph: #versionName) text asString.<br>
</font></s><font color="#FF0000">+ (self someTextPaneWithSelector: #versionName) text asString.<br>
</font> logMessage.<br>
ignore }<br>
<br>
<b>MCSaveVersionDialog>>okToClose {actions} · ct 4/5/2022 19:57 (changed)</b><br>
okToClose<br>
<s><font color="#0000FF">- ^ (self findTextMorph: #logMessage)<br>
</font></s><font color="#FF0000">+ ^ (self someTextPaneWithSelector: #logMessage)<br>
</font> ifNil: [true]<br>
ifNotNil:<br>
[:widget | widget canDiscardEdits or: [self confirm: 'Version notes are not saved.<br>
Is it OK to discard those notes?' translated]]<br>
<br>
<b>Model>>dependentTextPaneWithSelector: {*Tools-private} · ct 4/5/2022 19:42</b><br>
<font color="#FF0000">+ dependentTextPaneWithSelector: selector<br>
+ <br>
+ ^ self dependents detect:<br>
+ [:dependent | dependent isTextView and:<br>
+ [dependent getTextSelector == selector]]<br>
+ ifNone: [nil]</font><br>
<br>
<b>Model>>someTextPaneWithSelector: {*Tools} · ct 4/5/2022 20:17</b><br>
<font color="#FF0000">+ someTextPaneWithSelector: aSelector<br>
+ "Try to find the text pane for aSelector in my dependents or my window. Note that this is a hack only and violates the original idea of the model-view pattern. Usually, the communication should come from the view instead, e.g., via a pluggable selector."<br>
+ ^ (self dependentTextPaneWithSelector: aSelector)<br>
+ ifNil: [self textPaneWithSelector: aSelector]</font><br>
<br>
<b>Model>>textPaneWithSelector: {*Tools-private} · mt 4/12/2015 19:45</b><br>
<font color="#FF0000">+ textPaneWithSelector: aSelector<br>
+ "If, among my window's paneMorphs, there is a text pane defined with aSelector as its retriever, answer it, else answer nil"<br>
+ <br>
+ | aWindow |<br>
+ Smalltalk isMorphic ifFalse: [^ nil].<br>
+ ^ (aWindow := self containingWindow) ifNotNil:<br>
+ [aWindow paneMorphSatisfying:<br>
+ [:aMorph | (aMorph isKindOf: PluggableTextMorph) and:<br>
+ [aMorph getTextSelector == aSelector]]]</font><br>
<br>
<b>PluggableTextView>>tallyIt {as yet unclassified} · ct 4/5/2022 19:50</b><br>
<font color="#FF0000">+ tallyIt<br>
+ <br>
+ self controller tallyIt.</font><br>
<br>
<b>StringHolder>>codeTextMorph {*Tools} · ct 4/5/2022 20:16 (changed)</b><br>
codeTextMorph<br>
<s><font color="#0000FF">- <br>
- ^ self someTextPaneWithSelector: #contents<br>
</font></s><font color="#FF0000">+ "Find a Morphic text pane that displays the contents of the receiver. Note that this is a hack only and violates the original idea of the model-view pattern. Using this selector in your model will likely break compatibility with other UI frameworks such as MVC. Usually, the communication should come from the view instead, e.g., via a pluggable selector."<br>
+ <br>
+ | textPane |<br>
+ textPane := self codeTextPane.<br>
+ ^ textPane isMorph ifTrue: [textPane]</font><br>
<br>
<b>StringHolder>>codeTextPane {*Tools} · ct 4/5/2022 20:16</b><br>
<font color="#FF0000">+ codeTextPane<br>
+ "Find a text pane that displays the contents of the receiver. Note that this is a hack only and violates the original idea of the model-view pattern. Usually, the communication should come from the view instead, e.g., via a pluggable selector."<br>
+ <br>
+ ^ self someTextPaneWithSelector: #contents</font><br>
<br>
<b>StringHolder>>selectedInterval {*services-base} · ct 4/5/2022 19:46 (changed)</b><br>
selectedInterval<br>
<s><font color="#0000FF">- ^self codeTextMorph selectionInterval<br>
</font></s><font color="#FF0000">+ ^self codeTextPane selectionInterval</font><br>
<br>
<b>StringHolderView>>accept {controller access} · ct 4/5/2022 19:59</b><br>
<font color="#FF0000">+ accept<br>
+ <br>
+ ^ self controller accept</font><br>
<br>
<b>StringHolderView>>text {controller access} · ct 4/5/2022 19:56</b><br>
<font color="#FF0000">+ text<br>
+ <br>
+ ^ self displayContents text</font><br>
<br>
["toolCodePane.2.cs"]<br>
<br>
<font color="#808080">---<br>
</font><font color="#808080"><i>Sent from </i></font><font color="#808080"><i><a href="https://github.com/hpi-swa-lab/squeak-inbox-talk"><u><font color="#808080">Squeak Inbox Talk</font></u></a></i></font>