+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; mouse wheel cyclic operation selection
+
+(defun artist-get-last-non-nil-op (op-list &optional last-non-nil)
+ "Find the last non-nil draw operation in OP-LIST.
+Optional LAST-NON-NIL will be returned if OP-LIST is nil."
+ (if op-list
+ (artist-get-last-non-nil-op (cdr op-list)
+ (or (car (car op-list)) last-non-nil))
+ last-non-nil))
+
+(defun artist-get-first-non-nil-op (op-list)
+ "Find the first non-nil draw operation in OP-LIST."
+ (or (car (car op-list)) (artist-get-first-non-nil-op (cdr op-list))))
+
+(defun artist-is-in-op-list-p (op op-list)
+ "Check whether OP is in OP-LIST."
+ (and op-list
+ (or (and (car (car op-list)) (string= op (car (car op-list))))
+ (artist-is-in-op-list-p op (cdr op-list)))))
+
+(defun artist-make-prev-next-op-alist (op-list
+ &optional
+ last-non-nil-arg first-non-nil-arg
+ prev-entry prev-op-arg)
+ "Build an assoc-list of OP-LIST.
+The arguments LAST-NON-NIL-ARG, FIRST-NON-NIL-ARG, PREV-ENTRY and
+PREV-OP-ARG are used when invoked recursively during the build-up."
+ (let* ((last-non-nil (or last-non-nil-arg
+ (artist-get-last-non-nil-op
+ artist-key-compl-table)))
+ (first-non-nil (or first-non-nil-arg
+ (artist-get-first-non-nil-op
+ artist-key-compl-table)))
+ (prev-op (or prev-op-arg last-non-nil))
+ (op (car (car op-list)))
+ (opsym (artist-mt-get-symbol-from-keyword op))
+ (entry (cons opsym (cons prev-op nil))))
+ (if (or (and op-list (not op))
+ (artist-is-in-op-list-p op (cdr op-list)))
+ (artist-make-prev-next-op-alist (cdr op-list)
+ last-non-nil first-non-nil
+ prev-entry prev-op)
+ (if prev-entry (setcdr (cdr prev-entry) op))
+ (if op-list
+ (cons entry (artist-make-prev-next-op-alist
+ (cdr op-list)
+ last-non-nil first-non-nil
+ entry op))
+ (progn (setcdr (cdr prev-entry) first-non-nil) nil)))))
+
+(defun artist-select-next-op-in-list ()
+ "Cyclically select next drawing mode operation."
+ (interactive)
+ (let ((next-op (cdr (cdr (assoc artist-curr-go artist-prev-next-op-alist)))))
+ (artist-select-operation next-op)
+ (message next-op)))
+
+(defun artist-select-prev-op-in-list ()
+ "Cyclically select previous drawing mode operation."
+ (interactive)
+ (let ((prev-op (car (cdr (assoc artist-curr-go artist-prev-next-op-alist)))))
+ (artist-select-operation prev-op)
+ (message prev-op)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+