;; -*- emacs-lisp -*-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; $Id: templates.el,v 1.7 2005/08/02 19:34:55 ole Exp $
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; collection of code templates
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require 'jde-gen-extra)

;; ask for parameters
(setq tempo-interactive t)

(defconst jde-java-buffer-header
  (list "/*" 'n 
        " * " '(file-name-nondirectory buffer-file-name) 'n 
        " *" 'n
        " * Copyright (c) 2004 Ole Arndt, all rights reserved." 'n
        " *" 'n
        " * Author: " '(user-full-name) " <" '(user-mail-address) ">" 'n
        " * Created " '(current-time-string) 'n " */" 'n 'n
        )
)

(defun jde-gen-java-buffer-header ()
  (cons 'l jde-java-buffer-header))

(defalias 'jde-gen-buffer-header
  (tempo-define-template "java-buffer-header"jde-java-buffer-header
                         "buffer-header" "Generate a copyright header for java source buffers."))

(defconst jde-gen-enumeration-list
  (list "/**" 'n>
        " * A typesave enumeration class." 'n>
        " *" 'n>
        " * @author <a href=\"mailto:" '(user-mail-address) "\">" (user-full-name) "</a>" 'n>
        " * @version $Id: templates.el,v 1.7 2005/08/02 19:34:55 ole Exp $" 'n>
        " */" 'n>
        "public abstract class " '(jde-gen-get-class-buffer-name)
        " implements java.io.Serializable {" 'n>
        "private final transient String name;" 'n> 
        'n>
        "/**" 'n>
        " * Constructs a new <code>" '(jde-gen-get-class-buffer-name) "</code> with "'n>
        " * a name." 'n>
        " * @param name the name o the enumeration." 'n>
        " */" 'n>
        "protected " '(jde-gen-get-class-buffer-name) "(String name) {" 'n>
        "this.name = name;" 'n>
        "}" 'n>
        'n>
        "/**" 'n>
        " * Example abstract operation." 'n>
        " */" 'n>
        "public abstract void eval();" 'n>
        'n>
        "// Inner classes as instances" 'n>
        'n>
        "public static final ONE = new " '(jde-gen-get-class-buffer-name) "(\"one\") {" 'n>
        "public void eval() {" 'n>
        "}" 'n>
        "};" 'n>
        'n>
        "// Handle identity and serialisation" 'n>
        'n>
        "/**" 'n>
        " * Return the name." 'n>
        " */" 'n>
        "public final String toString() {" 'n>
        "return name;" 'n>
        "}" 'n>
        'n>
        "/**" 'n>
        " * Ensure the equals method of <code>java.lang.Object<code> is called." 'n>
        " */" 'n>
        "public final boolean equals(Object o) {" 'n>
        "    return super.equals(o);" 'n>
        "}" 'n>
        'n>
        "/**" 'n>
        " * Ensure the hashCode method of <code>java.lang.Object<code> is called." 'n>
        " */" 'n>
        "public final int hashCode() {" 'n>
        "   return super.hashCode();" 'n>
        "}" 'n>
        'n>
        "private static int nextId = 0;" 'n>
        "private final int id = nextId++;" 'n>
        "private static final " '(jde-gen-get-class-buffer-name) "[] instances = { ONE };" 'n>
        "Object readResolve() throws java.io.ObjectStreamException {" 'n>
        "    return instances[id];" 'n>
        "}" 'n>
        "} // " '(jde-gen-get-class-buffer-name) 'n>
        ))

(defalias 'jde-gen-enumeration
  (tempo-define-template "enumeration" jde-gen-enumeration-list
                         "enumeration" "Generate an enumeration skeleton."))

(defalias 'jde-gen-enumeration-buffer
  (tempo-define-template "enumeration-buffer" 
                         (list '(jde-gen-java-buffer-header) (cons 'l jde-gen-enumeration-list) '(jde-package-update))
                         "enumeration-buffer" "Generate an enumeration skeleton buffer."))

(defconst jde-gen-derived-enumeration-list
  (list "/**" 'n>
        " * A typesave enumeration class." 'n>
        " *" 'n>
        " * @author <a href=\"mailto:" '(user-mail-address) "\">" (user-full-name) "</a>" 'n>
        " * @version $Id: templates.el,v 1.7 2005/08/02 19:34:55 ole Exp $" 'n>
        " */" 'n>
        "public abstract class " '(jde-gen-get-class-buffer-name)
        " " '(jde-gen-get-extend-class) "{" 'n>
        'n>
        "/**" 'n>
        " * Constructs a new <code>" '(jde-gen-get-class-buffer-name) "</code> with "'n>
        " * a name." 'n>
        " * @param name The name of the enumeration." 'n>
        " */" 'n>
        "protected " '(jde-gen-get-class-buffer-name) "(String name) {" 'n>
        "super(name);" 'n>
        "}" 'n>
        'n>
        'n>
        "// Inner classes as instances" 'n>
        'n>
        "public static final ONE = new " '(jde-gen-get-class-buffer-name) "(\"one\") {" 'n>
        "};" 'n>
        'n>
        "private static int nextId = 0;" 'n>
        "private final int id = nextId++;" 'n>
        "private static final " '(jde-gen-get-class-buffer-name) "[] instances = { ONE };" 'n>
        "Object readResolve() throws java.io.ObjectStreamException {" 'n>
        "    return instances[id];" 'n>
        "}" 'n>
        "} // " '(jde-gen-get-class-buffer-name) 'n>
        ))

(defalias 'jde-gen-derived-enumeration
  (tempo-define-template "derived-enumeration" jde-gen-derived-enumeration-list
                         "derived-enumeration" "Generate an derived-enumeration skeleton."))

(defalias 'jde-gen-derived-enumeration-buffer
  (tempo-define-template "derived-enumeration-buffer" 
                         (list '(jde-gen-java-buffer-header) 
                               (cons 'l jde-gen-derived-enumeration-list) '(jde-package-update))
                         "derived-enumeration-buffer" "Generate an derived-enumeration skeleton buffer."))

(unless (fboundp 'jde-gen-class-name)
  (defun jde-gen-class-name ()
    (jde-gen-get-class-buffer-name)))