UserConfirmation.st
author Jan Vrany <jan.vrany@labware.com>
Wed, 22 Mar 2023 13:57:18 +0000
branchjv
changeset 25445 1623217d2268
parent 19948 be658f466bca
permissions -rw-r--r--
Cherry-picked OrderedCollection.st from 0b286fd51da7: * d4c86d7c0bfc: #TUNING by stefan, Stefan Vogel <sv@exept.de> * 692b6497a669: #DOCUMENTATION by stefan, Stefan Vogel <sv@exept.de> * d47bb2912953: #DOCUMENTATION by stefan, Stefan Vogel <sv@exept.de> * abb4316c6bff: #FEATURE by cg, Claus Gittinger <cg@exept.de> * 3a8fce0e8d11: #TUNING by stefan, Stefan Vogel <sv@exept.de> * 03d29bf8c5bb: #REFACTORING by stefan, Stefan Vogel <sv@exept.de> * cccc6c4abcfc: #REFACTORING by stefan, Stefan Vogel <sv@exept.de> * 35d957c7a840: #FEATURE by cg, Claus Gittinger <cg@exept.de> * 6b11890f5f2c: #OTHER by cg, Claus Gittinger <cg@exept.de> * abb6108fb06b: #FEATURE by cg, Claus Gittinger <cg@exept.de> * 2c4768bb2e89: #FEATURE by cg, Claus Gittinger <cg@exept.de> * 4029e964d0f1: #FEATURE by cg, Claus Gittinger <cg@exept.de> * ddcab3a9c2df: #OTHER by cg, Claus Gittinger <cg@exept.de> * 2213eb56e0c7: #REFACTORING by exept, Claus Gittinger <cg@exept.de> * 09ca874a6160: #REFACTORING by exept, Claus Gittinger <cg@exept.de> * 30b332af1f33: #BUGFIX by stefan, Stefan Vogel <sv@exept.de> * 779764ba117b: #REFACTORING by cg, Claus Gittinger <cg@exept.de> * b3d232a613c9: #BUGFIX by stefan, Stefan Vogel <sv@exept.de> * c417f7edaec1: #BUGFIX by stefan, Stefan Vogel <sv@exept.de> * 904b6538f379: #FEATURE by exept, Claus Gittinger <cg@exept.de> * c5887f03e01f: #REFACTORING by stefan, Stefan Vogel <sv@exept.de> * 8912d03aff48: #BUGFIX by exept, Claus Gittinger <cg@exept.de> * de5cd1dab4c3: #DOCUMENTATION by exept, Claus Gittinger <cg@exept.de> * 9bbd26603378: #OTHER by exept, Claus Gittinger <cg@exept.de> * c2c9dc110f42: #FEATURE by stefan, Stefan Vogel <sv@exept.de> * 81d123c6703d: #DOCUMENTATION by stefan, Stefan Vogel <sv@exept.de> * 8aadbb21458a: #BUGFIX by stefan, Stefan Vogel <sv@exept.de> * f210dbb8b2f6: #TUNING by stefan, Stefan Vogel <sv@exept.de> * c2c774fc53c0: #FEATURE by exept, Claus Gittinger <cg@exept.de> * b6f462670875: #DOCUMENTATION by exept, Claus Gittinger <cg@exept.de> * 27ae4021d5d6: #FEATURE by stefan, Stefan Vogel <sv@exept.de> * 10d9e9d85594: #TUNING by exept, Claus Gittinger <cg@exept.de> * 2653d855dcc7: #DOCUMENTATION by exept, Claus Gittinger <cg@exept.de> * 6ea1698a1a34: #FEATURE by stefan, Stefan Vogel <sv@exept.de> * 28762315e664: #OTHER by exept, Claus Gittinger <cg@exept.de> * 7142ea786f3e: #TUNING by stefan, Stefan Vogel <sv@exept.de> * 7875acb42b53: #BUGFIX by stefan, Stefan Vogel <sv@exept.de> * 163a0eebc97e: #BUGFIX by Maren, matilk

"
 COPYRIGHT (c) 2007 by eXept Software AG
	      All Rights Reserved

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.
"
"{ Package: 'stx:libbasic' }"

"{ NameSpace: Smalltalk }"

Notification subclass:#UserConfirmation
	instanceVariableNames:'canCancel defaultAnswerInDialog defaultAnswer'
	classVariableNames:''
	poolDictionaries:''
	category:'Kernel-Exceptions-Notifications'
!

!UserConfirmation class methodsFor:'documentation'!

copyright
"
 COPYRIGHT (c) 2007 by eXept Software AG
	      All Rights Reserved

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.
"
!

documentation
"
    This confirmation query is used when a user confirmation is required
    somewhere within a model's operation (i.e. in non-GUI code).
    Instead of directly asking via Dialog confirm... messages,
    this should be raised.
    Its default behavior is the same as the above dialog.
    However, the query can be caught and answered by an exceoptn (a query-) handler,
    to suppress these GUI interactions in situations, where they are not wanted.

    This is a much better approach to the alternatives:
	passing additional 'doConfirm' arguments down from the high level caller
	keeping the doConfirm settings in a passed down flag object
	keeping the flag in a global (very bad)
	keeping it in a class var (almost as bad)

    Notice: that's one of the nice consequences of proceedable exceptions.

    [authors:]
	Stefan Vogel
	Claus Gittinger

    [see also:]
	Query Notification Exception
"
! !

!UserConfirmation methodsFor:'accessing'!

aspect
    "the aspect the user is asked. Set this to a symbol.
     It can be used by a exception handler"

    ^ parameter
!

aspect:aSymbol
    "the aspect the user is asked. Set this to a symbol.
     It can be used by a exception handler"

    parameter := aSymbol
!

canCancel
    "answer true, if the user is allowed to press the cancel button
     in a confirmation dialog"

    ^ canCancel ? false
!

canCancel:something
    canCancel := something.
!

defaultAnswer
    "used to pass information from the raiser to the GUI dialog.
     Specifies, which answer of the three (yes/no/cancel) should be the return-key-default.
     If not specified, the cancel-key will be the default"

    ^ defaultAnswer
!

defaultAnswer:aBooleanOrNil
    "used to pass information from the raiser to the GUI dialog.
     Specifies, which answer of the three (yes/no/cancel) should be the return-key-default.
     If not specified, the cancel-key will be the default"

    defaultAnswer := aBooleanOrNil
! !

!UserConfirmation methodsFor:'default actions'!

defaultAction
    "Default action for confirmations: open a info box with description.
     If no GUI present, assume that the user pressed 'yes'"

    |text retVal retValText|

    text := self description.

    self hasDialog ifTrue:[
	self canCancel ifTrue:[
	    ^ Dialog confirmWithCancel:text default:defaultAnswer
	] ifFalse:[
	    ^ Dialog confirm:text default:defaultAnswer
	].
    ].

    "
     on systems without GUI, simply show
     the message on the Transcript and assume, that he would have typed 'yes' (or the defaultAnswer).
    "
    retVal := defaultAnswer notNil
		ifTrue:[ defaultAnswer ]
		ifFalse:[
		    self canCancel
			ifTrue:[ nil ]
			ifFalse:[ true ]].

    retValText := retVal isNil
		ifTrue:[ 'cancel' ]
		ifFalse:[
		    retVal
			ifTrue:[ 'yes' ]
			ifFalse:[ 'no' ]].

    Transcript
	show:('User confirmation requested (assuming %1): ' bindWith:retValText);
	showCR:text.
    ^ retVal

    "
      UserConfirmation raiseRequestErrorString:'Please click yes or no!!'
    "
! !

!UserConfirmation methodsFor:'queries'!

askingContext
    "return the context which did the confirm-request"

    |con|

    con := self suspendedContext.
    [
        (con selector startsWith:'confirm')
        and:[ con method mclass == Object ]
    ] whileTrue:[
        con := con sender.
    ].
    ^con
! !

!UserConfirmation class methodsFor:'documentation'!

version
    ^ '$Header$'
!

version_CVS
    ^ '$Header$'
! !