On Mon, Mar 2, 2015 at 11:59 PM, Sean P. DeNigris <sean@clipperadams.com> wrote:
Ben Coman wrote
> is there a standard way to pause
> code execution in the sender of #openWithSpec until the window is closed?

Something like
"model openDialogWithSpec okAction: [ self doNextThing ]"?


I'm not sure. A code example may help.�� The problem is we have... ��

AbstractNautilusUI >>renameClass
self okToChange ifFalse: [ ^ self ].
self selectedClass ifNil: [ ^ self ].
self basicRenameClass: self selectedClass theNonMetaClass.
self changed: #sourceCodeFrom:.

and 12 levels deep into #basicRenameClass:��
we have...

NautilusRefactoring>>internalPerformRefactorings:
�� �� ...
�� ����(ChangesBrowser changes: aCollectionRefactoring) openWithSpec��

which forks such that execution returns to perform the #changed: before you get a chance to click the <Ok> button.

So the problem is how to make it pause at #basicRenameClass: until the ChangesBrowser is closed (either ok cancel), such that #changed: is not executed before the changes are applied.�� The complication is the existing code operating on the ChangesBrowser <Ok> button, and the stack distance of #internalPerformRefactorings: from #renameClass.

I am thinking of some synchronisation like the following would be least impact...

NautilusRefactoring>>internalPerformRefactorings:
�� �� ...
�� ����(ChangesBrowser changes: aCollectionRefactoring)
�� �� �� �� �� ��openDialogWithSpec windowClosedAction: [ refactoringDoneSemaphore signal].
�� �� refactoringDoneSemaphore wait.

or maybe that could be pushed into SpecDialogWindow as a convenience method available to others.

cheers -ben