use tabulated-list-mode functions to render list
authorRicardo Wurmus <ricardo.wurmus@mdc-berlin.de>
Mon, 27 Oct 2014 10:36:29 +0000 (11:36 +0100)
committerRicardo Wurmus <ricardo.wurmus@mdc-berlin.de>
Mon, 27 Oct 2014 10:36:29 +0000 (11:36 +0100)
grid-engine-mode.el

index a023f30..6de65c1 100644 (file)
@@ -21,8 +21,6 @@
   "The grid engine user.  Defaults to the logged in user's name.")
 
 (defun grid-engine-setup ()
-  (if grid-engine-map
-      nil
     (setq grid-engine-map (make-keymap))
     ;; disable all key bindings
     (suppress-keymap grid-engine-map)
             (error "[Grid Engine] point is not on a field of a job record"))
           (grid-engine-job-details field job arg))))
     (define-key grid-engine-map (kbd "g")
-      (lambda () (interactive) (grid-engine-list-jobs)))))
+      (lambda () (interactive) (grid-engine-list-jobs)))
+
+  (grid-engine-update-list-format)
+  (tabulated-list-init-header))
+
+
+(setq column-order '(job-id time priority owner state))
+(defun grid-engine-update-list-format ()
+  (setq columns '((job-id   . ("Job-ID"   10 nil))
+                  (priority . ("Priority" 10 nil))
+                  (name     . ("Job name" 10 nil))
+                  (owner    . ("User"     15 nil))
+                  (state    . ("State"    15 nil))
+                  (time     . ("Time"     25 nil))
+                  (queue    . ("Queue"    25 nil))
+                  (slots    . ("Slots"    10 nil))))
+  (setq tabulated-list-format
+        (vconcat (mapcar (lambda (key)
+                           (cdr (assoc key columns)))
+                         column-order))))
 
 (defun grid-engine--raise-buffer (&optional buffer)
   (when buffer
     (grid-engine--cmd-to-buffer cmd)
     (libxml-parse-xml-region 1 (buffer-size))))
 
-
 (defun grid-engine-list-jobs ()
   "List all jobs for the specified user in a new buffer."
-  (setq columns '((job-id   . ("Job-ID"   "%-10s"))
-                  (priority . ("Priority" "%-10s"))
-                  (name     . ("Job name" "%-10s"))
-                  (owner    . ("User"     "%-15s"))
-                  (state    . ("State"    "%-15s"))
-                  (time     . ("Time"     "%-25s"))
-                  (queue    . ("Queue"    "%-25s"))
-                  (slots    . ("Slots"    "%-10s"))))
-  (setq column-order '(job-id time priority owner state))
-  (setq row-fmt (concat (mapconcat (lambda (key)
-                                     (caddr (assoc key columns)))
-                                   column-order " ")
-                        "\n"))
-
   (defun field-as-text (field obj &optional format-string)
     (let* ((value (cdr (assoc field obj)))
            (format-string (if format-string format-string
            (text  (format format-string value)))
       (propertize text 'field value)))
 
-  (defun format-job-record (job)
-    (let* ((args (cons row-fmt (mapcar (lambda (key)
-                                         (field-as-text key job))
-                                       column-order)))
-           (text (apply 'format args)))
-      (propertize text 'grid-engine-job job)))
+  (defun job-to-row (job)
+    (let ((contents (vconcat (mapcar (lambda (key)
+                                        (field-as-text key job))
+                                      column-order))))
+      (list job contents)))
 
   (defun mkjob-alist (subtree)
     "Convert a parsed XML subtree for a job entry to an alist."
     (let* ((tree (grid-engine--cmd-to-xmltree cmd))
            (jobs (mapcar 'mkjob-alist (cddr (caddr tree)))))
       (set-buffer (get-buffer-create title))
-      (erase-buffer)
-      ;; insert header
-      (insert (apply 'format
-                     (cons row-fmt
-                           (mapcar (lambda (key)
-                                     (cadr (assoc key columns)))
-                                   column-order))))
-      ;; insert separator
-      (insert "\f\n")
-      ;; insert each row
-      (mapcar (lambda (job)
-                (insert (format-job-record job)))
-              jobs))
+      (setq tabulated-list-entries
+            (mapcar (lambda (job)
+                      (job-to-row job))
+                    jobs)))
     (grid-engine--raise-buffer)
+    ;; update list
+    (tabulated-list-print)
     (message nil)))
 
 (defun grid-engine-job-details (field job &optional new-buffer)