kd-contextmenu
Version:
contextmenu module for kd
191 lines (141 loc) • 4.42 kB
text/coffeescript
KDView = require 'core/View'
JTreeViewController = require 'tree/JTreeViewController'
JContextMenuItem = require './JContextMenuItem'
JContextMenuTreeView = require './JContextMenuTreeView'
module.exports = class JContextMenuTreeViewController extends JTreeViewController
###
STATIC CONTEXT
###
uId = 0
getUId = -> ++uId
convertToArray = = (items, pId = null)->
results = []
for own title, options of items
id = null
if (title.indexOf "customView") is 0
newItem = { type : 'customView', parentId : pId, view : options }
results.push newItem
continue
if options.children
id = getUId()
options.title = title
options.id = id
options.parentId = pId
results.push options
childrenArr = convertToArray options.children, id
results = results.concat childrenArr
if options.separator
divider = { type : 'separator', parentId : pId }
results.push divider
continue
options.title = title
options.parentId = pId
results.push options
if options.separator
divider = { type : 'separator', parentId : pId }
results.push divider
return results
###
INSTANCE LEVEL
###
constructor:(options = {},data)->
o = options
o.view or= new KDView cssClass : "context-list-wrapper"
o.type or= "contextmenu"
o.treeItemClass or= JContextMenuItem
o.listViewClass or= JContextMenuTreeView
o.addListsCollapsed ?= yes
o.putDepthInfo ?= yes
super o, data
= []
loadView:->
super
unless .lazyLoad
initTree:(nodes)->
unless nodes.length
nodes = convertToArray nodes
super nodes
###
Helpers
###
repairIds:(nodeData)->
nodeData.type = "separator" if nodeData.type is "divider"
super
###
EXPAND / COLLAPSE
###
expand:(nodeView)->
super
"NodeExpanded", nodeView
.push nodeView if nodeView.expanded
###
NODE SELECTION
###
organizeSelectedNodes:(listController, nodes, event = {})->
nodeView = nodes[0]
if .length
depth1 = nodeView.getData().depth
.forEach (expandedNode)=>
depth2 = expandedNode.getData().depth
if depth1 <= depth2
expandedNode
super
###
re-HANDLING MOUSE EVENTS
###
dblClick:(nodeView, event)->
mouseEnter:(nodeView, event)->
if
clearTimeout
nodeData = nodeView.getData()
unless nodeData.type is "separator"
nodeView, event
= setTimeout =>
nodeView
, 150
click:(nodeView, event)->
nodeData = nodeView.getData()
return if nodeData.type is "separator" or nodeData.disabled
nodeView
contextMenu =
if nodeData.callback and "function" is typeof nodeData.callback
nodeData.callback.call contextMenu, nodeView, event
contextMenu.emit "ContextMenuItemReceivedClick", nodeView, event
event.stopPropagation()
no
###
re-HANDLING KEY EVENTS
###
performDownKey:(nodeView, event)->
nextNode = super nodeView, event
if nextNode
nodeData = nextNode.getData()
if nodeData.type is "separator"
nextNode, event
performUpKey:(nodeView, event)->
nextNode = super nodeView, event
if nextNode
nodeData = nextNode.getData()
if nodeData.type is "separator"
nextNode, event
return nextNode
performRightKey:(nodeView, event)->
super
nodeView, event
performLeftKey:(nodeView, event)->
parentNode = super nodeView, event
if parentNode
parentNode
return parentNode
return nextNode
performEscapeKey:(nodeView, event)->
KD.getSingleton("windowController").revertKeyView()
.destroy()
performEnterKey:(nodeView, event)->
KD.getSingleton("windowController").revertKeyView()
contextMenu =
contextMenu.emit "ContextMenuItemReceivedClick", nodeView
contextMenu.destroy()
event.stopPropagation()
event.preventDefault()
return no