Initial Commit
[packages] / xemacs-packages / ede / ede-dired.el
1 ;;; ede-dired.el --- EDE extensions to dired.
2
3 ;;;  Copyright (C) 1998, 99, 00, 03  Eric M. Ludlam
4
5 ;; Author: Eric M. Ludlam <zappo@gnu.org>
6 ;; Version: 0.4
7 ;; Keywords: project, make
8 ;; RCS: $Id: ede-dired.el,v 1.1 2007-11-26 15:22:06 michaels Exp $
9
10 ;; This software is free software; you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation; either version 2, or (at your option)
13 ;; any later version.
14
15 ;; This software is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 ;; GNU General Public License for more details.
19
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
22 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
23 ;; Boston, MA 02110-1301, USA.
24
25 ;;; Commentary:
26 ;; 
27 ;; This provides a dired interface to dired, allowing users to modify
28 ;; their project file by adding files (or whatever) directly from a
29 ;; dired buffer.
30
31 (require 'easymenu)
32 (require 'dired)
33 (require 'ede)
34
35 ;;; Code:
36 (defvar ede-dired-minor-mode nil
37   "Non-nil when in ede dired minor mode.")
38 (make-variable-buffer-local 'ede-dired-minor-mode)
39
40 (defvar ede-dired-keymap nil
41   "Keymap used for ede dired minor mode.")
42
43 (if ede-dired-keymap
44     nil
45   (setq ede-dired-keymap (make-sparse-keymap))
46   (define-key ede-dired-keymap ".a" 'ede-dired-add-to-target)
47   (define-key ede-dired-keymap ".t" 'ede-new-target)
48   (define-key ede-dired-keymap ".s" 'ede-speedbar)
49   (define-key ede-dired-keymap ".C" 'ede-compile-project)
50   (define-key ede-dired-keymap ".d" 'ede-make-dist)
51   
52   (easy-menu-define
53    ede-dired-menu ede-dired-keymap "EDE Dired Minor Mode Menu"
54    '("Project"
55      [ "Add files to target" ede-dired-add-to-target (ede-current-project) ]
56      ( "Build" :filter ede-build-forms-menu)
57      "-"
58      [ "Create Project" ede-new (not (ede-current-project)) ]
59      [ "Create Target" ede-new-target (ede-current-project) ]
60      "-"
61      ( "Customize Project" :filter ede-customize-forms-menu )
62      [ "View Project Tree" ede-speedbar (ede-current-project) ]
63      ))
64   )
65
66 (defun ede-dired-minor-mode (&optional arg)
67   "A minor mode that should only be activated in DIRED buffers.
68 If ARG is nil, toggle, if it is a positive number, force on, if
69 negative, force off."
70   (interactive "P")
71   (if (not (or (eq major-mode 'dired-mode)
72                (eq major-mode 'vc-dired-mode)))
73       (error "Not in DIRED mode"))
74   (setq ede-dired-minor-mode
75         (not (or (and (null arg) ede-dired-minor-mode)
76                  (<= (prefix-numeric-value arg) 0))))
77   (if (and (not (ede-directory-project-p default-directory))
78            (not (interactive-p)))
79       (setq ede-dired-minor-mode nil))
80   )
81
82 (defun ede-dired-add-to-target (target)
83   "Add a file, or all marked files into a TARGET."
84   (interactive (list
85                 (let ((ede-object (ede-current-project)))
86                   (ede-invoke-method 'project-interactive-select-target
87                                      "Add files to Target: "))))
88   (let ((files (dired-get-marked-files t)))
89     (while files
90       (project-add-file target (car files))
91       ;; Find the buffer for this files, and set it's ede-object
92       (if (get-file-buffer (car files))
93           (save-excursion
94             (set-buffer (get-file-buffer (car files)))
95             (setq ede-object nil)
96             (setq ede-object (ede-buffer-object (current-buffer)))))
97       ;; Increment.
98       (setq files (cdr files)))))
99
100 ;; Minor mode management.
101 (add-to-list 'minor-mode-alist '(ede-dired-minor-mode " EDE"))
102 (let ((a (assoc 'ede-dired-minor-mode minor-mode-map-alist)))
103   (if a
104       (setcdr a ede-dired-keymap)
105     (add-to-list 'minor-mode-map-alist (cons 'ede-dired-minor-mode
106                                              ede-dired-keymap))))
107
108 (provide 'ede-dired)
109
110 ;;; ede-dired.el ends here