EDITOR_C.LSP



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;						;;
;;	EDITOR VISUAL DEL LENGUAJE C		;;
;;	Modulo: editor_c.lsp			;;
;;						;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;						;;
;;	Autor: J. Rafael R. Ochoa		;;
;;	e-mail: rochoa@zeus.umich.mx    	;;
;;	Universidad Michoacana de 		;;
;;	Morelia, Mich. MEXICO			;;
;;						;;
;;	Marzo 1998				;;
;;						;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;;-------------------------------
;; posicion-renglon
;;-------------------------------
;; Variable global utilizada
;; para marcar el inicio del
;; despliegue del programa
;;;;;;;;;;;;
(setq posicion-renglon 80)


;;-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
;; ventanas					
;;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
;; Funcion encargada de la creacion de las 
;; ventanas donde se desplegaran las operaciones
;; hechas por el usuario. Son variables globales
;; La ventana donde se muestra el programa y el 
;; menu principal es ==> *ventana-principal*
;; Donde se muestran las opciones es en
;; ==> *ventana-secundaria*
;;;;;;;;;;
(defun ventanas ()
  (defvar *ventana-secundaria*
    	(ghw:make-window :x 20   :y 20
		:width 250   :height 400
		:title "Editor visual de C - Opciones"
		:status :active))
  (defvar *ventana-principal*
  	(ghw:make-window :x 280   :y 20
		:width 600   :height 600
		:title "Editor visual de C"
		:status :active))
  (ghw:add-to-object-method *ventana-principal* :repaint 
		'(:after (redibuja-ventana-principal))))



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;	COLORES PARA CONTORNOS Y RELLENOS DE FIGURAS     ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defvar *lapiz-azul*
  (ghw:make-pen :color ghw:*blue* :width 3 :style :solid))

(defvar *relleno-azul*
  (ghw:make-brush :pattern :solid :color ghw:*blue*))

(defvar *lapiz-rojo*
  (ghw:make-pen :color ghw:*red* :width 3 :style :solid))

(defvar *relleno-rojo*
  (ghw:make-brush :pattern :solid :color ghw:*red*))

(defvar *lapiz-verde*
  (ghw:make-pen :color ghw:*green* :width 3 :style :solid))

(defvar *relleno-verde*
  (ghw:make-brush :pattern :solid :color ghw:*green*))

(defvar *lapiz-amarillo*
  (ghw:make-pen :color ghw:*yellow* :width 3 :style :solid))

(defvar *relleno-amarillo*
  (ghw:make-brush :pattern :solid :color ghw:*yellow*))

(defvar *lapiz-blanco*
  (ghw:make-pen :color ghw:*white* :width 3 :style :solid))

(defvar *relleno-blanco*
  (ghw:make-brush :pattern :solid :color ghw:*white*))



;;---------------------------------------------------------
;; redibuja-ventana-principal
;;---------------------------------------------------------
;; Funcion llamada cada que hay que redibujar la ventana 
;; principal
;;;;;;;;;;;;;;
(defun redibuja-ventana-principal (window x y width height)
  	(opcion-header)
	(opcion-global)
	(opcion-principal)
	(separador))

;;-----------------------------------
;; separador
;;-----------------------------------
;; Dibuja un rectangulo azul que
;; divide *ventana-principal*
;;;;;;;;;;;;;;;
(defun separador ()
	(ghw:draw-rectangle *ventana-principal* 20 60 530 20 
		:brush *relleno-azul*))



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;	M E N U   D E   L O S   H E A D E R S    ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;--------------------------------
;; muestra-encabezados
;;--------------------------------
;; Crea los hotspots para la
;; seleccion de los headers
;;;;;;;;
(defun muestra-encabezados ()
  (elimina-todo-hotspot (obten-lista-de-hotspots *ventana-secundaria*))
  	(opcion-header)
	  (let ((hotspot
		(ghw:make-hotspot *ventana-principal* :x 40 :y 10
			:width 110 :height 40
			:status :active)))
	    (ghw:add-to-object-method hotspot :mouse-left-down
			'(:after (headers)))))

;;----------------------------------
;; opcion-header
;;----------------------------------
;; Dibuja en la *ventana-principal*
;; un cuadro con la leyenda "ENCABEZADOS"
;;;;;;;;
(defun opcion-header( )
	(ghw:draw-rectangle *ventana-principal* 40 10 110 40
        	:pen *lapiz-azul* :brush *relleno-amarillo*)
	  (ghw:draw-text *ventana-principal* 50 20 
		"ENCABEZADOS"))

;;----------------------------------
;; headers
;;----------------------------------
;; Funcion llamada por muestra-encabezados
;; para desplegar los headers disponibles
;; en la *ventana-secundaria*
;;;;;;;;;
(defun headers (hotspot &rest ignore)
  	(limpia-ventana *ventana-secundaria*)
	(header-stdio)
	(header-string)
	(header-stdlib))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;	M E N U  D E  L A S  V A R I A B L E S  G L O B A L E S    ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;------------------------------------
;; muestra-variables-globales
;;------------------------------------
;; Crea un hotspot para el recuadro de
;; "Variables globales"
;;;;;;;;;;;
(defun muestra-variables-globales ()
  	(elimina-todo-hotspot (obten-lista-de-hotspots *ventana-secundaria*))
	(opcion-global)
	  (let ((hotspot
		(ghw:make-hotspot *ventana-principal* :x 160 :y 10
			:width 165 :height 40
			:status :active)))
	    (ghw:add-to-object-method hotspot :mouse-left-down
			'(:after (globales)))))	

;;-------------------------------------
;; opcion-global
;;-------------------------------------
;; Dibuja en la *ventana-principal*
;; un cuadro con la leyenda "VARIABLES
;; GLOBALES"
;;;;;;;; 
(defun opcion-global ()
  	(ghw:draw-rectangle *ventana-principal* 160 10 165 40
        	:pen *lapiz-azul* :brush *relleno-verde*)
	  (ghw:draw-text *ventana-principal* 170 20 
		"VARIABLES GLOBALES"))

;;------------------------------------
;; globales
;;------------------------------------
;; Funcion encargada de desplegar en
;; la *ventana-secundaria* el las
;; variables globales permitidas
;; en este programa
;;;;;;;;;;
(defun globales (hotspot &rest ignore)
  	(limpia-ventana *ventana-secundaria*)
	(elimina-todo-hotspot (obten-lista-de-hotspots *ventana-secundaria*))
	(global-int)
	(global-float)
	(global-double)
	(global-char)
	(global-arreglo-de-caracteres)
	(global-apuntador-a-caracter))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;	M E N U   D E L   P R O G R A M A   P R I N C I P A L    ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;------------------------------------
;; muestra-cuerpo-del-programa
;;------------------------------------
;; Crea un hotspot para el recuadro de
;; "Programa principal"
;;;;;;;;;;;
(defun muestra-cuerpo-del-programa ()
	(opcion-principal)
	  (let ((hotspot
		(ghw:make-hotspot *ventana-principal* :x 335 :y 10
			:width 200 :height 40
			:status :active)))
	    (ghw:add-to-object-method hotspot :mouse-left-down
			'(:after (main)))))	

;;-------------------------------------
;; opcion-principal
;;-------------------------------------
;; Dibuja en la *ventana-principal*
;; un cuadro con la leyenda "PROGRAMA
;; PRINCIPAL"
;;;;;;;; 
(defun opcion-principal ()
 	(ghw:draw-rectangle *ventana-principal* 335 10 200 40
        	:pen *lapiz-amarillo* :brush *relleno-azul*)
	  (ghw:draw-text *ventana-principal* 360 20 
		"PROGRAMA PRINCIPAL"))


;;----------------------------------------------
;; programa-principal
;;----------------------------------------------
;; Funcion que manda llamar a la funcion
;; programa principal, la cual se encuentra en
;; el archivo main.lsp
;;;;;;;;
(defun programa-principal (hotspot &rest ignore)
  	(declare (ignore hotspot))
	(setq posicion-renglon (+ posicion-renglon 15))
	(ghw:draw-text *ventana-principal* 10 posicion-renglon
			"/* Comienza el programa principal */")
	(setq posicion-renglon (+ posicion-renglon 30))) 


;;--------------------------------------
;; inicia-programa
;;--------------------------------------
;; Funcion que pone en funcionamiento el
;; editor visual
;;;;;;;;;;;
(defun inicia-programa ()
  	;(setq posicion-renglon 80)
  	(ventanas)
	(limpia-ventana *ventana-principal*)
	(limpia-ventana *ventana-secundaria*)
	(muestra-encabezados)
	(muestra-variables-globales)
	(muestra-cuerpo-del-programa)
	(separador))


;(inicia-programa)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;	F U N C I O N E S   A U X I L I A R E S	   ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;-----------------------------------------
;; aumenta-renglon
;;-----------------------------------------
;; Realiza el salto de linea
;;;;;;;;;
(defun aumenta-renglon (cuanto)
  (setq posicion-renglon (+ posicion-renglon cuanto)))


;;-----------------------------------------
;; borra-hotspot
;;-----------------------------------------
;; Elimina por completo un hotspot
;;;;;;;;;
(defun borra-hotspot (hotspot &rest ignore)
  (ghw:flush-hotspot hotspot))

;;----------------------------
;; terminar-aplicacion
;;----------------------------
;; Destruye las ventanas que 
;; integran al editor
;;;;;;;;;
(defun terminar-aplicacion ()
  	(ghw:flush-window *ventana-principal*)
	(ghw:flush-window *ventana-secundaria*))

;;-------------------------------------
;; limpia-ventana
;;-------------------------------------
;; Pone en blanco una ventana. No borra
;; los hotspots
;;;;;;;;;;;
(defun limpia-ventana (nombre-ventana)
       (ghw:clear nombre-ventana))


;;--------------------------------------
;; borra-hacia-abajo
;;--------------------------------------
(defun borra-hacia-abajo (a-partir-de-aqui ventana)
  (ghw:clear ventana 0 a-partir-de-aqui 580 500))


;;----------------------------------------
;; obten-lista-de-hotspots
;;----------------------------------------
;; Funcion que regresa la lista de
;; hotspots de una ventana
;;;;;;;;;;
(defun obten-lista-de-hotspots (ventana)
  (let ((lista
	(ghw:window-hotspot-list ventana)))
    lista))

;;----------------------------------------
;; elimina-todo-hotspot
;;----------------------------------------
;; Funcion que elimina todos los hotspots
;; de una ventana en particular
;;;;;;;;;;;
(defun elimina-todo-hotspot (hotspot-list)
  (cond ((null hotspot-list) nil)
	(T (progn
		(ghw:flush-hotspot (car hotspot-list))
		(elimina-todo-hotspot (cdr hotspot-list))))))



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 	Variable: *menu-principal*
;; 	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;(defvar *menu-principal*
;  (ghw:make-command-menu
;	(ghw:make-command-menu-item
;		:text "Archivo"
;		:action
;		(ghw:make-command-menu-item
;			:text "Nuevo"
;		(ghw:make-command-menu-item
;		 	:text "Guardar"		    
;		(ghw:make-command-menu-item
;		 	:text "Salir"
;			))))))