;; -*- 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)))
