* riece.el (riece-addons-insinuated): Abolished.
[riece] / lisp / riece-addon.el
index fb3a987..53b6331 100644 (file)
 
 ;;; Code:
 
+(require 'font-lock)
+(require 'riece-options)
+(require 'riece-compat)
+(require 'riece-misc)
+
 (defgroup riece-addon-list nil
   "Add-on management"
   :tag "Addon"
 (defcustom riece-addon-list-mark-face-alist
   '((?+ . riece-addon-list-enabled-face)
     (?- . riece-addon-list-disabled-face)
-    (?= . riece-addon-list-unsupported-face)
+    (?! . riece-addon-list-unsupported-face)
     (?? . riece-addon-list-unknown-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)))
       (setq addons (cdr addons)))
     dependencies))
 
-(defun riece-resolve-addons (addons)
+(defun riece-resolve-addon-dependencies (addons)
   (let ((pointer addons)
        dependencies queue)
     ;; Uniquify, first.
        (error "Circular add-on dependency found"))
     (nreverse addons)))
 
+(defun riece-resolve-addons (addons)
+  (riece-resolve-addon-dependencies
+   (if (file-directory-p riece-addon-directory)
+       (append addons
+              (mapcar
+               (lambda (name)
+                 (unless (file-directory-p
+                          (expand-file-name name riece-addon-directory))
+                   (intern (file-name-sans-extension name))))
+               (directory-files riece-addon-directory nil "\\`[^.]" t)))
+     addons)))
+
 (defun riece-insinuate-addon (addon &optional verbose)
-  (require addon)              ;implicit dependency
-  (funcall (intern (concat (symbol-name addon) "-insinuate")))
-  (if verbose
-      (message "Add-on %S is insinuated" addon)))
+  (if (get addon 'riece-addon-insinuated)
+      (if verbose
+         (message "Add-on %S is alread insinuated" addon))
+    (funcall (intern (concat (symbol-name addon) "-insinuate")))
+    (put addon 'riece-addon-insinuated t)
+    (if verbose
+       (message "Add-on %S is insinuated" addon))))
 
 (defun riece-enable-addon (addon &optional verbose)
   (let ((enabled (intern-soft (concat (symbol-name addon) "-enabled"))))
            (message "Add-on %S doesn't support enable/disable" addon))
       (if (symbol-value enabled)
          (if verbose
-             (message "Can't enable add-on %S" addon))
+             (message "Add-on %S is already enabled" addon))
        (funcall (intern (concat (symbol-name addon) "-enable")))
        (if verbose
            (message "Add-on %S enabled" addon))))))
            (if verbose
                (message "Add-on %S disabled" addon)))
        (if verbose
-           (message "Can't disable add-on %S" addon))))))
+           (message "Add-on %S is already enabled" addon))))))
 
 (put 'riece-addon-list-mode 'font-lock-defaults
      '(riece-addon-list-font-lock-keywords t))
@@ -214,18 +234,17 @@ All normal editing commands are turned off."
   (kill-all-local-variables)
   (buffer-disable-undo)
   (setq major-mode 'riece-addon-list-mode
-        mode-name "AddOns"
+       mode-name "AddOns"
        mode-line-buffer-identification
        (riece-mode-line-buffer-identification '("Riece: %12b"))
        truncate-lines t
        buffer-read-only t)
   (use-local-map riece-addon-list-mode-map)
-  (if (featurep 'xemacs)
-      ;; In XEmacs, auto-initialization of font-lock is not affective
-      ;; when buffer-file-name is not set.
-      (font-lock-set-defaults)
-    (make-local-variable 'font-lock-defaults)
-    (setq font-lock-defaults '(riece-addon-list-font-lock-keywords t)))
+  (make-local-variable 'font-lock-defaults)
+  (setq font-lock-defaults '(riece-addon-list-font-lock-keywords t))
+  ;; In XEmacs, auto-initialization of font-lock is not affective
+  ;; when buffer-file-name is not set.
+  (font-lock-set-defaults)
   (run-hooks 'riece-addon-list-mode-hook))
 
 (defun riece-command-list-addons ()
@@ -234,7 +253,10 @@ All normal editing commands are turned off."
   (riece-addon-list-mode)
   (let ((inhibit-read-only t)
        buffer-read-only
-       (pointer riece-addons)
+       (pointer (sort (copy-sequence riece-addons)
+                      (lambda (symbol1 symbol2)
+                                 (string-lessp (symbol-name symbol1)
+                                               (symbol-name symbol2)))))
        enabled description point)
     (erase-buffer)
     (riece-kill-all-overlays)
@@ -248,7 +270,7 @@ All normal editing commands are turned off."
                      (if (not (featurep (car pointer)))
                          ??
                        (if (null enabled)
-                           ?=
+                           ?!
                          (if (symbol-value enabled)
                              ?+
                            ?-)))
@@ -263,7 +285,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 doesn't support enable/disable operation.
   ?    The add-on status is unknown.
 ")
     (insert (substitute-command-keys "
@@ -281,18 +303,18 @@ Useful keys:
    (list
     (or (if (eq major-mode 'riece-addon-list-mode)
            (get-text-property (point) 'riece-addon))
-       (completing-read "Add-on: "
-                        (mapcar (lambda (addon)
-                                  (list (symbol-name addon)))
-                                riece-addons)
-                        (lambda (pointer)
-                          (let ((enabled
-                                 (intern-soft (concat (symbol-name
-                                                       (car pointer))
-                                                      "-enabled"))))
-                            (and enabled
-                                 (null (symbol-value enabled)))))
-                        t))))
+       (intern-soft
+        (completing-read "Add-on: "
+                         (mapcar (lambda (addon)
+                                   (list (symbol-name addon)))
+                                 riece-addons)
+                         (lambda (pointer)
+                           (let ((enabled
+                                  (intern-soft (concat (car pointer)
+                                                       "-enabled"))))
+                             (and enabled
+                                  (null (symbol-value enabled)))))
+                         t)))))
   (riece-enable-addon addon t)
   (let ((enabled (intern-soft (concat (symbol-name addon) "-enabled"))))
     (if (and (eq major-mode 'riece-addon-list-mode)
@@ -312,18 +334,18 @@ Useful keys:
    (list
     (or (if (eq major-mode 'riece-addon-list-mode)
            (get-text-property (point) 'riece-addon))
-       (completing-read "Add-on: "
-                        (mapcar (lambda (addon)
-                                  (list (symbol-name addon)))
-                                riece-addons)
-                        (lambda (pointer)
-                          (let ((enabled
-                                 (intern-soft (concat (symbol-name
-                                                       (car pointer))
-                                                      "-enabled"))))
-                            (and enabled
-                                 (symbol-value enabled))))
-                        t))))
+       (intern-soft
+        (completing-read "Add-on: "
+                         (mapcar (lambda (addon)
+                                   (list (symbol-name addon)))
+                                 riece-addons)
+                         (lambda (pointer)
+                           (let ((enabled
+                                  (intern-soft (concat (car pointer)
+                                                       "-enabled"))))
+                             (and enabled
+                                  (symbol-value enabled))))
+                         t)))))
   (riece-disable-addon addon t)
   (let ((enabled (intern-soft (concat (symbol-name addon) "-enabled"))))
     (if (and (eq major-mode 'riece-addon-list-mode)
@@ -337,7 +359,7 @@ Useful keys:
            (delete-char 1)
            (insert "-")
            (put-text-property point (point) 'riece-addon addon))))))
-    
+
 (provide 'riece-addon)
 
 ;;; riece-addon.el ends here