Throw an error if add-on is not insinuated when enabling/disabling.
[riece] / lisp / riece-addon.el
index 68a99b9..c1cdb78 100644 (file)
@@ -28,6 +28,7 @@
 (require 'riece-options)
 (require 'riece-compat)
 (require 'riece-misc)
+(require 'riece-addon-modules)
 
 (defgroup riece-addon-list nil
   "Add-on listing."
   :group 'riece-addon-list-faces)
 (defvar riece-addon-list-unsupported-face 'riece-addon-list-unsupported-face)
 
-(defface riece-addon-list-unknown-face
+(defface riece-addon-list-uninstalled-face
   '((t
      (:foreground "red")))
-  "Face used for displaying the unknown addon."
+  "Face used for displaying the uninstalled addon."
   :group 'riece-addon-list-faces)
-(defvar riece-addon-list-unknown-face 'riece-addon-list-unknown-face)
+(defvar riece-addon-list-uninstalled-face 'riece-addon-list-uninstalled-face)
 
 (defface riece-addon-list-description-face
   '((((class color)
   '((?+ . riece-addon-list-enabled-face)
     (?- . riece-addon-list-disabled-face)
     (?! . riece-addon-list-unsupported-face)
-    (?? . riece-addon-list-unknown-face))
+    (?  . riece-addon-list-uninstalled-face))
   "An alist mapping marks on riece-addon-list-buffer to faces."
   :type 'list
   :group 'riece-addon-list)
 
 (defcustom riece-addon-list-font-lock-keywords
-  '(("^\\([-+!?] [^:]+\\): \\(.*\\)"
+  '(("^\\([-+! ] [^:]+\\): \\(.*\\)"
      (1 (cdr (assq (aref (match-string 1) 0)
                   riece-addon-list-mark-face-alist)))
      (2 riece-addon-list-description-face)))
   (let ((keymap (make-sparse-keymap)))
     (define-key keymap "+" 'riece-command-enable-addon)
     (define-key keymap "-" 'riece-command-disable-addon)
+    (define-key keymap "I" 'riece-command-insinuate-addon)
+    (define-key keymap "D" 'riece-command-uninstall-addon)
     (define-key keymap "n" 'next-line)
     (define-key keymap "p" 'previous-line)
     (define-key keymap " " 'scroll-up)
    (riece-load-and-build-addon-dependencies addons)))
 
 (defun riece-insinuate-addon (addon &optional verbose)
+  (unless (assq addon riece-addon-dependencies)
+    (setq riece-addons (cons addon riece-addons)
+         riece-addon-dependencies (riece-resolve-addons riece-addons)))
   (if (get addon 'riece-addon-insinuated)
       (if verbose
          (message "Add-on %S is already insinuated" addon))
                         #'ignore))
            (setq riece-addon-dependencies
                  (delq entry riece-addon-dependencies))
-           (put addon 'riece-addon-insinuated nil)))
+           (put addon 'riece-addon-insinuated nil)
+           (setq riece-addons (delq addon riece-addons))))
       (if verbose
          (message "Add-on %S is uninstalled" addon)))))
 
 (defun riece-enable-addon (addon &optional verbose)
+  (unless (get addon 'riece-addon-insinuated)
+    (error "Add-on %S is not insinuated" addon))
   (let ((enabled (intern-soft (concat (symbol-name addon) "-enabled"))))
     (if (null enabled)
        (if verbose
            (message "Add-on %S enabled" addon))))))
 
 (defun riece-disable-addon (addon &optional verbose)
+  (unless (get addon 'riece-addon-insinuated)
+    (error "Add-on %S is not insinuated" addon))
   (let ((enabled (intern-soft (concat (symbol-name addon) "-enabled"))))
     (if (null enabled)
        (if verbose
@@ -279,31 +290,48 @@ All normal editing commands are turned off."
   (riece-addon-list-mode)
   (let ((inhibit-read-only t)
        buffer-read-only
-       (pointer (sort (copy-sequence riece-addon-dependencies)
-                      (lambda (dependency1 dependency2)
-                        (string-lessp (symbol-name (car dependency1))
-                                      (symbol-name (car dependency2))))))
-       enabled description point)
+       (pointer riece-addon-dependencies)
+       module-description-alist
+       description enabled point)
+    (while pointer
+      
+      (setq description (intern-soft (concat (symbol-name (car (car pointer)))
+                                            "-description"))
+           module-description-alist
+           (cons (cons (car (car pointer))
+                       (if description
+                           (symbol-value description)
+                         "(no description)"))
+                 module-description-alist)
+           pointer (cdr pointer)))
+    (setq pointer riece-addon-modules)
+    (while pointer
+      (unless (assq (car (car pointer))
+                   module-description-alist)
+       (setq module-description-alist
+             (cons (car pointer) module-description-alist)))
+      (setq pointer (cdr pointer)))
     (erase-buffer)
     (riece-kill-all-overlays)
+    (setq pointer (sort module-description-alist
+                       (lambda (entry1 entry2)
+                         (string-lessp (symbol-name (car entry1))
+                                       (symbol-name (car entry2))))))
     (while pointer
       (setq enabled (intern-soft (concat (symbol-name (car (car pointer)))
-                                        "-enabled"))
-           description (intern-soft (concat (symbol-name (car (car pointer)))
-                                            "-description")))
+                                        "-enabled")))
       (setq point (point))
       (insert (format "%c %S: %s\n"
-                     (if (not (featurep (car (car pointer))))
-                         ??
+                     (if (not (get (car (car pointer))
+                                   'riece-addon-insinuated))
+                         ? 
                        (if (null enabled)
                            ?!
                          (if (symbol-value enabled)
                              ?+
                            ?-)))
                      (car (car pointer))
-                     (if description
-                         (symbol-value description)
-                       "(no description)")))
+                     (cdr (car pointer))))
       (put-text-property point (point) 'riece-addon (car (car pointer)))
       (setq pointer (cdr pointer)))
     (insert "
@@ -312,7 +340,7 @@ Symbols in the leftmost column:
   +     The add-on is enabled.
   -     The add-on is disabled.
   !    The add-on doesn't support enable/disable operation.
-  ?    The add-on status is unknown.
+       The add-on is not insinuated.
 ")
     (insert (substitute-command-keys "
 Useful keys:
@@ -378,6 +406,50 @@ Useful keys:
       (if point
          (goto-char point)))))
 
+(defun riece-command-insinuate-addon (addon)
+  (interactive
+   (list
+    (or (if (eq major-mode 'riece-addon-list-mode)
+           (get-text-property (point) 'riece-addon))
+       (intern-soft
+        (completing-read "Add-on: "
+                         (mapcar (lambda (dependency)
+                                   (list (symbol-name (car dependency))))
+                                 riece-addon-modules)
+                         (lambda (pointer)
+                           (get (car pointer) 'riece-addon-insinuated))
+                         t)))))
+  (riece-insinuate-addon addon t)
+  (when (eq major-mode 'riece-addon-list-mode)
+    (riece-command-list-addons)
+    (let ((point (point-min)))
+      (while (and (not (eq (get-text-property point 'riece-addon) addon))
+                 (setq point (next-single-property-change point
+                                                          'riece-addon))))
+      (if point
+         (goto-char point)))))
+
+(defun riece-command-uninstall-addon (addon)
+  (interactive
+   (list
+    (or (if (eq major-mode 'riece-addon-list-mode)
+           (get-text-property (point) 'riece-addon))
+       (intern-soft
+        (completing-read "Add-on: "
+                         (mapcar (lambda (dependency)
+                                   (list (symbol-name (car dependency))))
+                                 riece-addon-dependencies)
+                         nil t)))))
+  (riece-uninstall-addon addon t)
+  (when (eq major-mode 'riece-addon-list-mode)
+    (riece-command-list-addons)
+    (let ((point (point-min)))
+      (while (and (not (eq (get-text-property point 'riece-addon) addon))
+                 (setq point (next-single-property-change point
+                                                          'riece-addon))))
+      (if point
+         (goto-char point)))))
+
 (provide 'riece-addon)
 
 ;;; riece-addon.el ends here