summaryrefslogtreecommitdiffstats
path: root/emacs.d/lisp/rudel/rudel-speedbar.el
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--emacs.d/lisp/rudel/rudel-speedbar.el214
1 files changed, 214 insertions, 0 deletions
diff --git a/emacs.d/lisp/rudel/rudel-speedbar.el b/emacs.d/lisp/rudel/rudel-speedbar.el
new file mode 100644
index 0000000..8c2caa8
--- /dev/null
+++ b/emacs.d/lisp/rudel/rudel-speedbar.el
@@ -0,0 +1,214 @@
+;;; rudel-speedbar.el --- Speedbar rendering of Rudel objects
+;;
+;; Copyright (C) 2008, 2009 Jan Moringen
+;;
+;; Author: Jan Moringen <scymtym@users.sourceforge.net>
+;; Keywords: rudel, collaboration, speedbar
+;; X-RCS: $Id: rudel-speedbar.el,v 1.32 2008/10/10 21:47:28 zappo Exp $
+;;
+;; This file is part of Rudel.
+;;
+;; Rudel is free software: you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+;;
+;; Rudel is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with Rudel. If not, see <http://www.gnu.org/licenses>.
+
+;;; Commentary:
+;;
+;; This implements rendering of Rudel objects in speedbar.
+
+
+;;; History:
+;;
+;; 0.1 - Initial revision.
+
+
+;;; Code:
+;;
+
+(require 'speedbar)
+(require 'eieio-speedbar)
+
+
+;;; Class rudel-user methods
+;;
+
+(defmethod eieio-speedbar-description ((this rudel-user))
+ "Provide a speedbar description for OBJ."
+ (format "User %s" (object-name-string this)))
+
+(defmethod eieio-speedbar-object-buttonname ((this rudel-user))
+ "Return a string to use as a speedbar button for OBJECT."
+ (format "%s" (object-name-string this)))
+
+
+;;; Class rudel-document methods
+;;
+
+(defmethod eieio-speedbar-description ((this rudel-document))
+ "Construct a description for from the name of document object THIS."
+ (format "Document %s" (object-name-string this)))
+
+(defmethod eieio-speedbar-object-buttonname ((this rudel-document))
+ "Return a string to use as a speedbar button for OBJECT."
+ (rudel-unique-name this))
+
+;;; Speedbar support mode
+;;
+(defun rudel-speedbar-make-map ()
+ "Make the generic object based speedbar keymap."
+ (speedbar-make-specialized-keymap))
+
+(defvar rudel-speedbar-key-map
+ (rudel-speedbar-make-map)
+ "A Generic object based speedbar display keymap.")
+
+(defvar rudel-speedbar-menu
+ '([ "Compile" rudel-speedbar-compile-line t])
+ "Menu part in easymenu format used in speedbar while browsing objects.")
+
+(defun rudel-speedbar-toplevel-buttons (dir)
+ "Return a list of objects to display in speedbar.
+Argument DIR is the directory from which to derive the list of objects."
+ (when rudel-current-session
+ (with-slots (users documents) rudel-current-session
+ (append users documents))))
+
+(eieio-speedbar-create 'rudel-speedbar-make-map
+ 'rudel-speedbar-key-map
+ 'rudel-speedbar-menu
+ "Collaboration Session"
+ 'rudel-speedbar-toplevel-buttons)
+
+;;;###autoload
+(defun rudel-speedbar ()
+ "Show connected users and available documents of Rudel session in speedbar."
+ (interactive)
+ (speedbar-frame-mode 1)
+ (speedbar-change-initial-expansion-list "Collaboration Session")
+ (speedbar-get-focus))
+
+;;; Speedbar Project Methods
+;;
+;; (defun rudel-find-nearest-file-line ()
+;; "Go backwards until we find a file."
+;; (save-excursion
+;; (beginning-of-line)
+;; (looking-at "^\\([0-9]+\\):")
+;; (let ((depth (string-to-number (match-string 1))))
+;; (while (not (re-search-forward "[]] [^ ]"
+;; (save-excursion (end-of-line)
+;; (point))
+;; t))
+;; (re-search-backward (format "^%d:" (1- depth)))
+;; (setq depth (1- depth)))
+;; (speedbar-line-token))))
+;;
+;; (defmethod eieio-speedbar-derive-line-path ((obj rudel-session) &optional depth)
+;; "Return the path to OBJ.
+;; Optional DEPTH is the depth we start at."
+;; "session" ;(file-name-directory (oref obj file))
+;; )
+;;
+;; (defmethod eieio-speedbar-derive-line-path ((obj rudel-session) &optional depth)
+;; "Return the path to OBJ.
+;; Optional DEPTH is the depth we start at."
+;; (let ((proj (rudel-target-parent obj)))
+;; ;; Check the type of line we are currently on.
+;; ;; If we are on a child, we need a file name too.
+;; (save-excursion
+;; (let ((lt (speedbar-line-token)))
+;; (if (or (eieio-object-p lt) (stringp lt))
+;; (eieio-speedbar-derive-line-path proj)
+;; ;; a child element is a token. Do some work to get a filename too.
+;; (concat (eieio-speedbar-derive-line-path proj)
+;; (rudel-find-nearest-file-line)))))))
+;;
+;; (defmethod eieio-speedbar-description ((obj rudel-session))
+;; "Provide a speedbar description for OBJ."
+;; "bla") ;(rudel-description obj))
+;;
+;;
+;; (defmethod eieio-speedbar-object-buttonname ((object rudel-project))
+;; "Return a string to use as a speedbar button for OBJECT."
+;; (if (rudel-parent-project object)
+;; (rudel-name object)
+;; (concat (rudel-name object) " " (oref object version))))
+;;
+;;
+;; (defmethod eieio-speedbar-object-children ((this rudel-project))
+;; "Return the list of speedbar display children for THIS."
+;; (condition-case nil
+;; (with-slots (subproj targets) this
+;; (append subproj targets))
+;; (error nil)))
+;;
+;;
+;; ;;; Generic file management for TARGETS
+;; ;;
+;; (defun rudel-file-find (text token indent)
+;; "Find the file TEXT at path TOKEN.
+;; INDENT is the current indentation level."
+;; (speedbar-find-file-in-frame
+;; (expand-file-name token (speedbar-line-directory indent)))
+;; (speedbar-maybee-jump-to-attached-frame))
+;;
+;; (defun rudel-create-tag-buttons (filename indent)
+;; "Create the tag buttons associated with FILENAME at INDENT."
+;; (let* ((lst (speedbar-fetch-dynamic-tags filename)))
+;; ;; if no list, then remove expando button
+;; (if (not lst)
+;; (speedbar-change-expand-button-char ??)
+;; (speedbar-with-writable
+;; ;; We must do 1- because indent was already incremented.
+;; (speedbar-insert-generic-list (1- indent)
+;; lst
+;; 'rudel-tag-expand
+;; 'rudel-tag-find)))))
+;;
+;; (defun rudel-tag-expand (text token indent)
+;; "Expand a tag sublist. Imenu will return sub-lists of specialized tag types.
+;; Etags does not support this feature. TEXT will be the button
+;; string. TOKEN will be the list, and INDENT is the current indentation
+;; level."
+;; (cond ((string-match "+" text) ;we have to expand this file
+;; (speedbar-change-expand-button-char ?-)
+;; (speedbar-with-writable
+;; (save-excursion
+;; (end-of-line) (forward-char 1)
+;; (speedbar-insert-generic-list indent token
+;; 'rudel-tag-expand
+;; 'rudel-tag-find))))
+;; ((string-match "-" text) ;we have to contract this node
+;; (speedbar-change-expand-button-char ?+)
+;; (speedbar-delete-subblock indent))
+;; (t (error "Ooops... not sure what to do")))
+;; (speedbar-center-buffer-smartly))
+;;
+;; (defun rudel-tag-find (text token indent)
+;; "For the tag TEXT in a file TOKEN, goto that position.
+;; INDENT is the current indentation level."
+;; (let ((file (rudel-find-nearest-file-line)))
+;; (speedbar-find-file-in-frame file)
+;; (save-excursion (speedbar-stealthy-updates))
+;; ;; Reset the timer with a new timeout when cliking a file
+;; ;; in case the user was navigating directories, we can cancel
+;; ;; that other timer.
+;; ; (speedbar-set-timer speedbar-update-speed)
+;; (goto-char token)
+;; (run-hooks 'speedbar-visiting-tag-hook)
+;; ;;(recenter)
+;; (speedbar-maybee-jump-to-attached-frame)
+;; ))
+
+(provide 'rudel-speedbar)
+
+;;; rudel-speedbar.el ends here