Hi all,
This time I have a little menus experiment. Again all you should have to do is change the path to RDNZL itself.
Have fun!
Regards,
Matthew
;; ========================================================================
;; Menus Experiment.
;;
;; Matthew O'Connor
;;
;; In this experiment I create some menus. I link the menus back to
;; callbacks when they are pressed and even control the state of the 'Save'
;; menu item by pressing the 'Save' or 'Save As' menu items.
;;
;; As usual there is no warranty. Use at your own peril. I am relatively
;; new to Lisp so you are warned.
;; NOTE: You need to modify this to point to the location of RDNZL on your system.
(load "../RDNZL/rdnzl-0.12.0/load.lisp")
(rdnzl:enable-rdnzl-syntax)
(rdnzl:import-types "System.Windows.Forms"
"Application" "Form" "MenuStrip" "ToolStripMenuItem"
"ToolStripSeparator" "MessageBox" "MessageBoxButtons"
"MessageBoxIcon")
(rdnzl:use-namespace "System.Windows.Forms")
;; Display a message in a message box.
(defun message(text &optional (caption "Message"))
[MessageBox.Show text caption
;; we want the message box to have just the "OK" button
[$MessageBoxButtons.OK]
;; We want an exclamation mark as the icon.
[$MessageBoxIcon.Information]]
nil)
;; Create a menu item and add it to the supplied menu strip.
(defun create-menu (menu-strip-item x)
(let ((menu (rdnzl:new "ToolStripMenuItem" (second x))))
;; Bind the menu to the sybmol.
(setf (symbol-value (first x)) menu)
;; Add the callback if one is supplied.
(if (cddr x)
[+Click menu (rdnzl:new "System.EventHandler" (car (cddr x)))])
(if (cdddr x)
(setf [%Image menu] (rdnzl:property "Resources" (car (cdddr x)))))
;; Add the menu item to the parent.
[Add [%DropDownItems menu-strip-item] menu]))
;; Create a menu splitter and add it to the supplied menu strip.
(defun create-splitter (menu-strip-item)
[Add [%DropDownItems menu-strip-item] (rdnzl:new "ToolStripSeparator")])
;; Add either a menu item or a splitter to the supplied menu strip.
(defun add-menus (menu-strip-item menus)
(mapcar #'(lambda (x) (if (= (length x) 1)
(create-splitter menu-strip-item)
(create-menu menu-strip-item x)))
menus))
;; Build the menus.
(defun build-menus (menu-strip menus)
(mapcar #'(lambda (x) (let ((menu (rdnzl:new "ToolStripMenuItem" (second x))))
;; Bind the menu to the symbol
(setf (symbol-value (first x)) menu)
;; Take care of the children.
(add-menus menu (third x))
;; Add the menu to the MenuStrip.
[Add [%Items menu-strip] menu])) menus))
;; Callbacks.
(defun file-new-clicked (object event)
(message "file-new-clicked!!"))
(defun file-open-clicked (object event)
(message "file-open-clicked!!"))
;; Disable the Save menu item.
(defun file-save-clicked (object event)
(message "Disabling Save!")
(setf [%Enabled menu-file-save] nil))
;; Enable the Save menu item.
(defun file-save-as-clicked (object event)
(message "Enabling Save!")
(setf [%Enabled menu-file-save] t))
;; Exit the application
(defun file-exit-clicked (object event)
[Application.Exit])
(defun edit-undo-clicked (object event)
(message "edit-undo-clicked!!"))
(defun edit-redo-clicked (object event)
(message "edit-redo-clicked!!"))
;; Create my experimental menu system.
(defun create-menus (menu-strip)
(setf menus '((menu-file "File"
((menu-file-new "New" file-new-clicked)
(menu-file-open "Open" file-open-clicked)
(menu-file-save "Save" file-save-clicked)
(menu-file-save-as "Save As" file-save-as-clicked)
(menu-file-splitter)
(menu-file-exit "Exit" file-exit-clicked)))
(menu-edit "Edit"
((menu-edit-undo "Undo" edit-undo-clicked)
(menu-edit-redo "Redo" edit-redo-clicked)))
(menu-help "Help")))
(build-menus menu-strip menus))
(defun run-menus-experiment ()
(let ((menu-strip (rdnzl:new "MenuStrip"))
(form (rdnzl:new "Form")))
(setf [%Text form] "Menus Experiment")
[Add [%Controls form] menu-strip]
(create-menus menu-strip)
[Application.Run form]))
(run-menus-experiment)
(rdnzl:disable-rdnzl-syntax)