blob: 8b602c19b874855e0218fbdf364943674341f630 [file] [log] [blame]
/*
* Copyright (c) 2014-2018 BSI Business Systems Integration AG.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* BSI Business Systems Integration AG - initial API and implementation
*/
import {arrays, defaultValues, ModelAdapter, objects, Tree} from '../index';
export default class TreeAdapter extends ModelAdapter {
constructor() {
super();
this._addRemoteProperties(['displayStyle']);
}
_sendNodesSelected(nodeIds, debounceSend) {
var eventData = {
nodeIds: nodeIds
};
// send delayed to avoid a lot of requests while selecting
// coalesce: only send the latest selection changed event for a field
this._send('nodesSelected', eventData, {
delay: (debounceSend ? 250 : 0),
coalesce: function(previous) {
return this.target === previous.target && this.type === previous.type;
}
});
}
_onWidgetNodeClick(event) {
this._send('nodeClick', {
nodeId: event.node.id
});
}
_onWidgetNodeAction(event) {
this._send('nodeAction', {
nodeId: event.node.id
});
}
_onWidgetNodesSelected(event) {
var nodeIds = this.widget._nodesToIds(this.widget.selectedNodes);
this._sendNodesSelected(nodeIds, event.debounce);
}
_onWidgetNodeExpanded(event) {
this._send('nodeExpanded', {
nodeId: event.node.id,
expanded: event.expanded,
expandedLazy: event.expandedLazy
});
}
_onWidgetNodesChecked(event) {
this._sendNodesChecked(event.nodes);
}
_sendNodesChecked(nodes) {
var data = {
nodes: []
};
for (var i = 0; i < nodes.length; i++) {
data.nodes.push({
nodeId: nodes[i].id,
checked: nodes[i].checked
});
}
this._send('nodesChecked', data);
}
_onWidgetEvent(event) {
if (event.type === 'nodesSelected') {
this._onWidgetNodesSelected(event);
} else if (event.type === 'nodeClick') {
this._onWidgetNodeClick(event);
} else if (event.type === 'nodeAction') {
this._onWidgetNodeAction(event);
} else if (event.type === 'nodeExpanded') {
this._onWidgetNodeExpanded(event);
} else if (event.type === 'nodesChecked') {
this._onWidgetNodesChecked(event);
} else {
super._onWidgetEvent(event);
}
}
onModelAction(event) {
if (event.type === 'nodesInserted') {
this._onNodesInserted(event.nodes, event.commonParentNodeId);
} else if (event.type === 'nodesUpdated') {
this._onNodesUpdated(event.nodes);
} else if (event.type === 'nodesDeleted') {
this._onNodesDeleted(event.nodeIds, event.commonParentNodeId);
} else if (event.type === 'allChildNodesDeleted') {
this._onAllChildNodesDeleted(event.commonParentNodeId);
} else if (event.type === 'nodesSelected') {
this._onNodesSelected(event.nodeIds);
} else if (event.type === 'nodeExpanded') {
this._onNodeExpanded(event.nodeId, event);
} else if (event.type === 'nodeChanged') {
this._onNodeChanged(event.nodeId, event);
} else if (event.type === 'nodesChecked') {
this._onNodesChecked(event.nodes);
} else if (event.type === 'childNodeOrderChanged') {
this._onChildNodeOrderChanged(event.childNodeIds, event.parentNodeId);
} else if (event.type === 'requestFocus') {
this._onRequestFocus();
} else if (event.type === 'scrollToSelection') {
this._onScrollToSelection();
} else {
super.onModelAction(event);
}
}
_onNodesInserted(nodes, parentNodeId) {
var parentNode;
if (parentNodeId !== null && parentNodeId !== undefined) {
parentNode = this.widget.nodesMap[parentNodeId];
if (!parentNode) {
throw new Error('Parent node could not be found. Id: ' + parentNodeId);
}
}
this.widget.insertNodes(nodes, parentNode);
}
_onNodesUpdated(nodes) {
this.widget.updateNodes(nodes);
}
_onNodesDeleted(nodeIds, parentNodeId) {
var parentNode;
if (parentNodeId !== null && parentNodeId !== undefined) {
parentNode = this.widget.nodesMap[parentNodeId];
if (!parentNode) {
throw new Error('Parent node could not be found. Id: ' + parentNodeId);
}
}
this.addFilterForWidgetEventType('nodesSelected');
this.addFilterForWidgetEventType('nodesChecked');
var nodes = this.widget._nodesByIds(nodeIds);
this.widget.deleteNodes(nodes, parentNode);
}
_onAllChildNodesDeleted(parentNodeId) {
var parentNode;
if (parentNodeId !== null && parentNodeId !== undefined) {
parentNode = this.widget.nodesMap[parentNodeId];
if (!parentNode) {
throw new Error('Parent node could not be found. Id: ' + parentNodeId);
}
}
this.addFilterForWidgetEventType('nodesSelected');
this.addFilterForWidgetEventType('nodesChecked');
this.widget.deleteAllChildNodes(parentNode);
}
_onNodesSelected(nodeIds) {
this.addFilterForWidgetEvent(function(widgetEvent) {
return widgetEvent.type === 'nodesSelected' &&
arrays.equals(nodeIds, this.widget._nodesToIds(this.widget.selectedNodes));
}.bind(this));
var nodes = this.widget._nodesByIds(nodeIds);
this.widget.selectNodes(nodes);
}
/**
* @parem event.expanded true, to expand the node
* @param event.expandedLazy true, to expand the nodes lazily
* @param event.recursive true, to expand the descendant nodes as well
*/
_onNodeExpanded(nodeId, event) {
var node = this.widget.nodesMap[nodeId],
options = {
lazy: event.expandedLazy
};
var affectedNodesMap = objects.createMap();
affectedNodesMap[nodeId] = true;
if (event.recursive) {
Tree.visitNodes(function(n) {
affectedNodesMap[n.id] = true;
}, node.childNodes);
}
this.addFilterForWidgetEvent(function(widgetEvent) {
return widgetEvent.type === 'nodeExpanded' &&
affectedNodesMap[widgetEvent.node.id] &&
event.expanded === widgetEvent.expanded &&
event.expandedLazy === widgetEvent.expandedLazy;
});
this.widget.setNodeExpanded(node, event.expanded, options);
if (event.recursive) {
this.widget.setNodeExpandedRecursive(node.childNodes, event.expanded, options);
}
}
// noinspection DuplicatedCode
_onNodeChanged(nodeId, cell) {
var node = this.widget.nodesMap[nodeId];
defaultValues.applyTo(cell, 'TreeNode');
node.text = cell.text;
node.cssClass = cell.cssClass;
node.iconId = cell.iconId;
node.tooltipText = cell.tooltipText;
node.foregroundColor = cell.foregroundColor;
node.backgroundColor = cell.backgroundColor;
node.font = cell.font;
node.htmlEnabled = cell.htmlEnabled;
this.widget.changeNode(node);
}
_onNodesChecked(nodes) {
var checkedNodes = [],
uncheckedNodes = [];
nodes.forEach(function(nodeData) {
var node = this.widget._nodeById(nodeData.id);
if (nodeData.checked) {
checkedNodes.push(node);
} else {
uncheckedNodes.push(node);
}
}, this);
this.addFilterForWidgetEventType('nodesChecked');
this.widget.checkNodes(checkedNodes, {
checked: true,
checkChildren: false,
checkOnlyEnabled: false
});
this.widget.uncheckNodes(uncheckedNodes, {
checkChildren: false,
checkOnlyEnabled: false
});
}
_onChildNodeOrderChanged(childNodeIds, parentNodeId) {
var parentNode = this.widget._nodeById([parentNodeId]);
var nodes = this.widget._nodesByIds(childNodeIds);
this.widget.updateNodeOrder(nodes, parentNode);
}
_onRequestFocus() {
this.widget.focus();
}
_onScrollToSelection() {
this.widget.revealSelection();
}
}