))))
(def layered-method render-component-stub :in xhtml-layer :after ((-self- context-menu/widget))
(bind (((:read-only-slots id) -self-)
(parent-id (id-of (parent-component-of -self-))))
;; TODO due to the custom :js this hinders the optimization in render-action-js-event-handler
(render-action-js-event-handler "oncontextmenu" parent-id (make-action
(setf (lazily-rendered-component? -self-) #f))
:js (lambda (href)
`js(hdp.io.lazy-context-menu-handler event connection ,href ,id ,parent-id))
:one-shot #t :stop-event #t)
;; another alternative, but left clicking anything will force the context menu to download, and i think :xhr-sync true is also missing...
#+nil
(render-action-js-event-handler "onmousedown" parent-id (make-action
(setf (to-be-rendered-component? -self-) #t))
:subject-dom-node parent-id
:one-shot #t :sync #t)))
;;;;;;
;;; menu-item/widget
(def (component e) menu-item/widget (standard/widget content/component menu-items/mixin)
()
(:documentation "A MENU-ITEM/WIDGET is an intermediate or leaf COMPONENT in a MENU-HIERARCHY."))
(def (macro e) menu-item/widget ((&rest args &key &allow-other-keys) content &body menu-items)
`(make-instance 'menu-item/widget ,@args :content ,content :menu-items (flatten (list ,@menu-items))))
(def (function e) make-menu-item (content &rest menu-items)
(bind ((menu-items (flatten menu-items)))
(when (or menu-items
content)
(make-instance 'menu-item/widget
:content content
:menu-items (mapcar (lambda (menu-item)
(if (typep menu-item 'menu-item/widget)
menu-item
(make-menu-item menu-item)))
menu-items)))))
(def (function e) make-submenu-item (content &rest menu-items)
(bind ((menu-items (flatten menu-items)))
(when menu-items
(make-menu-item content menu-items))))
(def render-xhtml menu-item/widget
(bind (((:read-only-slots menu-items id style-class custom-style content) -self-))
(if menu-items
(render-dojo-widget ((if (typep (parent-component-of -self-) 'menu-bar/widget)
+dijit/popup-menu-bar-item+
+dijit/popup-menu-item+)
()
:id id)
(render-content-for -self-))
,(render-dojo-widget (+dijit/menu+)
)>)
(when (visible-component? content)
(render-dojo-widget ((if (typep (parent-component-of -self-) 'menu-bar/widget)
+dijit/menu-bar-item+
+dijit/menu-item+)
`(:iconClass ,(typecase content
(icon/widget
(icon-style-class content))
(content/mixin
(bind ((content-content (content-of content)))
(when (typep content-content 'icon/widget)
(icon-style-class content-content))))
(t
nil)))
:id id)
(when (typep content 'command/widget)
(render-command-onclick-handler content id)))))))
(def function render-show-context-menu-command-for (component)
(declare (ignore component))
;; TODO: add js to really show the menu
(render-component (icon/widget show-context-menu :label nil)))
(def method command-position ((self menu-item/widget))
(if (menu-items-of self)
most-positive-fixnum
(command-position (content-of self))))
;;;;;;
;;; menu-item-separator/widget
(def (component e) menu-item-separator/widget (standard/widget)
()
(:documentation "A MENU-ITEM-SEPARATOR/WIDGET is a leaf COMPONENT in the MENU-HIERARCHY separating other MENU-ITEM/WIDGETs."))
(def (macro e) menu-item-separator/widget (&rest args &key &allow-other-keys)
`(make-instance 'menu-item-separator/widget ,@args))
(def render-xhtml menu-item-separator/widget
(bind (((:read-only-slots id) -self-))
(render-dojo-widget (+dijit/menu-separator+ () :id id)
)))