;;; -*- Mode: LISP; Syntax: COMMON-LISP; Package: CL-USER; Base: 10 -*- ;;; $Header: src/frontend/components/translator-threestate.lisp $ ;;; Copyright (c) 2008, Andrea Chiumenti. All rights reserved. ;;; Redistribution and use in source and binary forms, with or without ;;; modification, are permitted provided that the following conditions ;;; are met: ;;; * Redistributions of source code must retain the above copyright ;;; notice, this list of conditions and the following disclaimer. ;;; * Redistributions in binary form must reproduce the above ;;; copyright notice, this list of conditions and the following ;;; disclaimer in the documentation and/or other materials ;;; provided with the distribution. ;;; THIS SOFTWARE IS PROVIDED BY THE AUTHOR 'AS IS' AND ANY EXPRESSED ;;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ;;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ;;; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY ;;; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ;;; GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ;;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ;;; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ;;; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. (in-package :claw-demo-frontend) (defclass translator-threestate (translator) ((yes :initarg :yes :reader translator-threestate-yes) (no :initarg :no :reader translator-threestate-no) (any :initarg :any :reader translator-threestate-any) (yes-to-string :initarg :yes-to-string :reader translator-threestate-yes-to-string) (no-to-string :initarg :no-to-string :reader translator-threestate-no-to-string) (any-to-string :initarg :any-to-string :reader translator-threestate-any-to-string) (test :initarg :test :reader translator-threestate-test)) (:default-initargs :yes-to-string "yes" :no-to-string "no" :any-to-string "any" :yes t :no nil :any :any :test #'equal)) (defmethod translator-value-encode ((translator translator-threestate) value) (let ((test (translator-threestate-test translator))) (cond ((funcall test value (translator-threestate-yes translator)) (translator-threestate-yes-to-string translator)) ((funcall test value (translator-threestate-no translator)) (translator-threestate-no-to-string translator)) ((funcall test value (translator-threestate-any translator)) (translator-threestate-any-to-string translator)) (t (error "Unrecognized value for threestate translator: ~a (Test: ~a on ~a ~a)" value test value (translator-threestate-any translator)))))) (defmethod translator-value-decode ((translator translator-threestate) value &optional client-id label) (cond ((string-equal value (translator-threestate-yes-to-string translator)) (translator-threestate-yes translator)) ((string-equal value (translator-threestate-no-to-string translator)) (translator-threestate-no translator)) ((string-equal value (translator-threestate-any-to-string translator)) (translator-threestate-any translator)) (t (when label (add-validation-error client-id (format nil (or (validation-error-control-string translator) "Field ~a: invalid value '~a'.") label value)))))) (defvar *threestate-translator* (make-instance 'translator-threestate))