UserConfirmation.st
author Claus Gittinger <cg@exept.de>
Tue, 09 Jul 2019 20:55:17 +0200
changeset 24417 03b083548da2
parent 19929 b6b3207ad764
child 19948 be658f466bca
permissions -rw-r--r--
#REFACTORING by exept class: Smalltalk class changed: #recursiveInstallAutoloadedClassesFrom:rememberIn:maxLevels:noAutoload:packageTop:showSplashInLevels: Transcript showCR:(... bindWith:...) -> Transcript showCR:... with:...

"
 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$'
! !