;;File: mwm-buttons.gwm -- 
;;Author: colas@mirsa.inria.fr (Colas NAHABOO) -- Bull Research FRANCE
;;Author: Frederic CHARTON
;;Revision: 1.0 -- Sep 12 19189
;;State: Exp
;;GWM Version: 1.4



; Drawing of the shadows :
; ----------------------
(de draw-shadow (theTile x1 y1 x2 y2 topSC bottomSC)
 (with (foreground topSC)
  (draw-line theTile x1 y1 x2 y1)
  (draw-line theTile x1 y1 x1 y2 )
 )
 (with (foreground bottomSC)
  (draw-line theTile x2 y2 x2 y1 )
  (draw-line theTile x1 y2 x2 y2 )
 )
 theTile
)


; The FSM of buttons :
; ------------------
(: button.fsm
 (fsm-make 
  ;-----------------------------------------------------------NORMAL
  (: normal (state-make 
	(on (user-event 'focus-in) (: wob-tile (# 'activepixmap wob)) )
	(on (user-event 'focus-out) (: wob-tile (# 'pixmap wob)) )
      (on (user-event 'find-button)
          (if (= button-to-find (# 'button-name wob))
              (: button wob)))
	(on (double-button 1 alone) 
		(if (and (# 'is-button-menu wob) wMenuButtonClick2) ()))
	(on (buttonpress any any)
	 (with (cerx (current-event-relative-x) 
		cery (current-event-relative-y))
	 (do-binding-button (current-event-code) 
		(current-event-modifier) 'press '(frame))
	 (if (= (current-event-code) (# 'button-to-press wob))
		(send-user-event 'press wob)
	 ))
	)
	(on (user-event 'press) 
	 (progn
	   (: wob-tile (draw-shadow 
		wob-pixmap
		0 0 (- wob-width 1) (- wob-height 1)
		clientActiveBottomShadowColor clientActiveTopShadowColor
	   ))
	   (send-user-event 'goto-pushed wob)
	   (if (and (> cerx 0)
		    (> cery 0)
		    (< cerx wob-width)
		    (< cery wob-height)
	       )
		(eval (# 'press-action wob))
		(eval (# 'bad-press-action wob))
	   )
	  )
	)
	(on (buttonrelease any any)
	 (with (cerx (current-event-relative-x) 
		cery (current-event-relative-y))
	 (do-binding-button (current-event-code) 
		(current-event-modifier) 'release '(frame))
	 (if  (= (current-event-code) (# 'button-to-press wob))
		(send-user-event 'release wob)
	 ))
	)
	(on (user-event 'release) 
	 (progn
	   (: wob-tile (draw-shadow 
		wob-pixmap
		0 0 (- wob-width 1) (- wob-height 1)
		clientActiveTopShadowColor clientActiveBottomShadowColor
	   ))
	   (send-user-event 'goto-normal wob)
	   (if (and (> cerx 0)
		    (> cery 0)
		    (< cerx wob-width)
		    (< cery wob-height)
	       )
		(eval (# 'release-action wob))
		(eval (# 'bad-release-action wob))
	   )
	  )
	)
	(on (user-event 'goto-pushed) () pushed)
	(on (user-event 'depop) 
	 (if (# 'menu-son wob) (send-user-event 'depop (# 'menu-son wob))))
   ))
   ;-----------------------------------------------------------PUSHED
   (: pushed (state-make
      (on (user-event 'find-button)
          (if (= button-to-find (# 'button-name wob))
              (: button wob)))
	(on (buttonrelease any any)
	 (with (cerx (current-event-relative-x) 
		cery (current-event-relative-y))
	 (do-binding-button (current-event-code) 
		(current-event-modifier) 'release '(frame))
	 (if  (= (current-event-code) (# 'button-to-press wob))
		(send-user-event 'release wob)
	 ))
	)
	(on (user-event 'release) 
	 (progn
	   (: wob-tile (draw-shadow 
		wob-pixmap
		0 0 (- wob-width 1) (- wob-height 1)
		clientActiveTopShadowColor clientActiveBottomShadowColor
	   ))
	   (send-user-event 'goto-normal wob)
	   (if (and (> cerx 0)
		    (> cery 0)
		    (< cerx wob-width)
		    (< cery wob-height)
	       )
		(eval (# 'release-action wob))
		(eval (# 'bad-release-action wob))
	   )
	  )
	)
	(on (user-event 'goto-normal) () normal)
	(on (user-event 'button-release)
	   (: wob-tile (draw-shadow 
		wob-pixmap
		0 0 (- wob-width 1) (- wob-height 1)
		clientActiveTopShadowColor clientActiveBottomShadowColor
	   ))	normal 
	)
	(on (user-event 'depop) 
	 (if (# 'menu-son wob) (send-user-event 'depop (# 'menu-son wob))))
	)
    )
 )
)

(de button.draw-pixmap (pixmap mode)
; mode : t = active / ()
(draw-shadow
 (:  button.pix
 (with (background (if mode clientActiveBackground clientBackground))
       (foreground (if mode clientActiveForeground clientForeground))
  (pixmap-make pixmap)
 ))
 0 0 (- (width button.pix) 1) (- (height button.pix) 1)
(if mode clientActiveTopShadowColor clientTopShadowColor)
(if mode clientActiveBottomShadowColor clientBottomShadowColor) )
)


; BUTTON.MAKE :
; ===========
; button.button-to-press : mouse button to use
; button.pixmap : button's pixmap
; button.press-action 
; button.release-action
(de button.make ()
 (with (
	fsm button.fsm
	borderwidth 0
	property (+ (list 
		       'button-to-press button.button-to-press 
		       'press-action    button.press-action
		       'bad-press-action button.bad-press-action
		       'release-action  button.release-action
		       'bad-release-action button.bad-release-action
		       'pixmap		button.pixmap
		       'activepixmap	button.activepixmap
		       'already-popped  ()
                     'button-name     button.name
		 ) property)
       )
  (plug-make button.pixmap)
 )
)


; Drawing of the buttons :
; ----------------------
(de button.draw (x1 y1 x2 y2 mode)
; mode : t = active / () 
(draw-shadow
	(draw-shadow 
	 (with (foreground (if mode clientActiveBackground clientBackground))
	 (pixmap-make button.size button.size)
 	 )
	x2 y2 x1 y1
	(if mode clientActiveBottomShadowColor clientBottomShadowColor)
	(if mode clientActiveTopShadowColor clientTopShadowColor) )
 0 0 (- button.size 1) (- button.size 1)
(if mode clientActiveTopShadowColor clientTopShadowColor)
(if mode clientActiveBottomShadowColor clientBottomShadowColor) )
)


(with (font clientFontList)
	(: button.size (+ 4 (height "A"))))



(: menu-activate-by-wob ())

;==================================================================
; THE MWM-LIKE BUTTONS
;==================================================================

; BUTTON-OF-MENU :
; ==============
(: button-of-menu
 (with (
	property '(is-button-menu t)
	button.button-to-press 1
        button.pixmap (button.draw
			(/ button.size 5) (- (/ button.size 2) 2)
			(/ (* 4 button.size) 5) (+ (/ button.size 2) 2)
			() )
        button.activepixmap (button.draw
			(/ button.size 5) (- (/ button.size 2) 2)
			(/ (* 4 button.size) 5) (+ (/ button.size 2) 2)
			t )
	button.press-action 
		'(with (theMenuWob (menu-wob (window-menu)))
			(if (# 'already-popped wob-property)
			(progn 
		    	 (send-user-event 'unselect-item 
				(# (current-valid-item  theMenuWob) 
					(valid-items  theMenuWob)))
                    	 (send-user-event 'activate-menu  theMenuWob)
			)
			(progn
			 (## 'already-popped wob t)
			 (with (x wob-x y (+ wob-y wob-height))
			  (if (> (+ y (height theMenuWob)) screen-height)
			    (: y (- wob-y (height theMenuWob))))
			  (if (> (+ x (width theMenuWob)) screen-width)
			    (: x (- screen-width (width theMenuWob))))
			  (move-window theMenuWob x y)
			  (menu.pop (window-menu) 1 'here)
			 )
			)
		 ))
	button.release-action
		(if wMenuButtonClick
		'(with (theMenuWob (menu-wob (window-menu)))
		    (with (wob  theMenuWob)
			(## 'current-valid-item wob 0))
		    (send-user-event 'goto-activable  theMenuWob)
		    (send-user-event 'select-item 
			(# 0 (valid-items  theMenuWob)) )
		 )
		'(with (theMenuWob (menu-wob (window-menu)))
                    (send-user-event 'goto-activable  theMenuWob)
		    (send-user-event 'unselect-item 
			(# (current-valid-item  theMenuWob) 
				(valid-items  theMenuWob)))
		    (send-user-event 'depop  wob)
		 )
		)
	button.bad-release-action
		'(with (theMenuWob (menu-wob (window-menu)))
                    (send-user-event 'goto-activable  theMenuWob)
		    (send-user-event 'unselect-item 
			(# (current-valid-item  theMenuWob) 
				(valid-items  theMenuWob)))
		    (send-user-event 'depop  theMenuWob)
		 )
	button.bad-press-action
		'(with (theMenuWob (menu-wob (window-menu)))
		    (send-user-event 'unselect-item 
			(# (current-valid-item  theMenuWob) 
				(valid-items  theMenuWob)))
                    (send-user-event 'activate-menu  theMenuWob)
		 )
      button.name 'menu
       )
 (button.make)
 )
)

; BUTTON-ICONIFY :
; ==============
(: button-iconify
 (with (
	property ()
	coord (/ (- button.size 4) 2)
	button.button-to-press 1
	button.pixmap (button.draw
			coord coord (+ coord 4) (+ coord 4)
			() )
        button.activepixmap (button.draw
			coord coord (+ coord 4) (+ coord 4)
			t )
	button.press-action ()
	button.bad-press-action ()
	button.release-action '(f.minimize)
	button.bad-release-action ()
      button.name 'iconify
       )
 (button.make)
 )
)

; BUTTON-ZOOM :
; ===========
(: button-zoom
 (with (
	property (list
		  'pushed-pixmap 
                        (button.draw
                        (- button.size 6) (- button.size 6)
                        5 5
                        () )
		  'activepushed-pixmap
                        (button.draw
                        (- button.size 6) (- button.size 6)
                        5 5
                        t )
		 )
	button.button-to-press 1
	button.pixmap (button.draw
			5 5
			(- button.size 6) (- button.size 6)
			() )
	button.activepixmap (button.draw
			5 5
			(- button.size 6) (- button.size 6)
			t )
	button.press-action ()
	button.bad-press-action ()
	button.release-action '(zoom)
	button.bad-release-action ()
      button.name 'zoom
       )
 (button.make)
 )
)