home *** CD-ROM | disk | FTP | other *** search
- (in-package :oou)
- (oou-provide :droppable-svm)
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; droppable-svm.Lisp
- ;;
- ;; Copyright ⌐ 1992 Northwestern University Institute for the Learning Sciences
- ;; All Rights Reserved
- ;;
- ;; author: Michael S. Engber
- ;; based on an idea originally implemented for MACL 1.32 by Rich Lynch
- ;;
- ;; mixin for dragging & dropping views
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (oou-dependencies
- :draggable-svm
- :simple-view-ce)
-
-
- (export '(droppable-svm pre-drop-hilite droppable-p))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (defclass droppable-svm (draggable-svm)
- ((drop-target-class :initarg :drop-target-class
- :accessor drop-target-class)
- (drop-targets :initarg :drop-targets
- :accessor drop-targets)
- (drop-action-fn :initarg :drop-action-fn
- :accessor drop-action-fn))
- (:default-initargs
- :drop-target-class 'dialog-item
- ))
-
- (defmethod call-drag-action :before ((sv droppable-svm))
- (declare (special *current-droppable-target*))
- (let* ((where (%stack-block ((p 4)) (#_GetMouse p) (#_LocalToGlobal p) (%get-point p)))
- (new-target (find-droppable-view-containing-point sv where)))
- (unless (eq new-target *current-droppable-target*)
- (when *current-droppable-target*
- (pre-drop-hilite *current-droppable-target* nil))
- (when new-target
- (pre-drop-hilite new-target t))
- (setf *current-droppable-target* new-target))))
-
- (defmethod drag-item ((sv droppable-svm) where)
- (let ((*current-droppable-target*))
- (declare (special *current-droppable-target*))
- (multiple-value-bind (drag-offset end-action-p) (call-next-method)
- (when *current-droppable-target*
- (pre-drop-hilite *current-droppable-target* nil)
- (when drag-offset
- (call-drop-action sv *current-droppable-target* drag-offset (add-points where drag-offset))
- (setf end-action-p nil)))
- (values drag-offset end-action-p))))
-
- (defmethod call-drop-action ((sv droppable-svm) (target simple-view) drag-offset dest-point)
- ;;exists primarily to be specialized by selectable-svm
- (drop-action sv target drag-offset dest-point))
-
- (defmethod drop-action ((sv droppable-svm) (target simple-view) drag-offset dest-point)
- (when (slot-boundp sv 'drop-action-fn)
- (funcall (drop-action-fn sv) sv target drag-offset dest-point)))
-
- (defmethod pre-drop-hilite ((sv simple-view) hilite-flag)
- (with-focused-view (focusing-view sv)
- (with-hilite-color *black-color*
- (hilite-view sv hilite-flag))))
-
- (defmethod droppable-p ((sv droppable-svm) (target simple-view))
- (unless (eq sv target)
- (when (typep target (drop-target-class sv))
- (if (slot-boundp sv 'drop-targets)
- (when (find (view-nick-name target) (drop-targets sv)) target)
- target))))
-
- (defmethod find-droppable-view-containing-point ((sv droppable-svm) where)
- (let ((v (root-drop-target-view sv where)))
- (when v
- (droppable-p sv (find-view-containing-point v (global-to-view v where))))))
-
- (defmethod root-drop-target-view ((sv droppable-svm) where)
- (ecase (drag-bounds sv)
- (:container (view-container sv))
- (:window (view-window sv))
- (:none (find-view-containing-point nil where nil t))))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-
- #|
-
- ;;; a modest example - adding drop AND select behavior to static text dialog items
- ;;; (use shift to select multiple items to drop)
-
- (oou-dependencies :selectable-svm)
-
- (defclass st-sel-drop (selectable-svm droppable-svm static-text-dialog-item) ())
- ;note that selectable-svm precedes droppable-svm
-
- (defun print-target (di target offset where)
- (format t "dropped ~s onto ~s at ~a (delta = ~a)~%"
- (dialog-item-text di)
- (dialog-item-text target)
- (point-string where)
- (point-string offset)))
-
- (setf *test-w*
- (make-instance 'dialog
- :window-type :document
- :view-position :centered
- :view-size #@(200 150)
- :window-title "droppable demo"
- :close-box-p t
- :view-subviews
- (list (make-instance 'st-sel-drop
- :view-position #@(20 20)
- :dialog-item-text "drop/select me"
- :view-nick-name :i1
- :selection-cluster 1
- :drop-targets '(:i4 :i5)
- :drag-bounds :window
- :drop-action-fn #'print-target
- )
- (make-instance 'st-sel-drop
- :view-position #@(20 40)
- :dialog-item-text "me too"
- :view-nick-name :i2
- :selection-cluster 1
- :drop-targets '(:i4 :i5)
- :drag-bounds :none
- :drop-action-fn #'print-target
- )
- (make-instance 'st-sel-drop
- :view-position #@(20 60)
- :dialog-item-text "me 3"
- :view-nick-name :i3
- :selection-cluster 1
- :drop-targets '(:i4 :i5)
- :drag-bounds :window
- :drop-action-fn #'print-target
- )
- (make-instance 'static-text-dialog-item
- :view-position #@(20 100)
- :dialog-item-text "hit me"
- :view-nick-name :i4
- )
- (make-instance 'static-text-dialog-item
- :view-position #@(20 120)
- :dialog-item-text "hit me too"
- :view-nick-name :i5
- )
- )))
-
- |#