basicprimitives
Version:
Basic Primitives Diagrams for JavaScript - data visualization components library that implements organizational chart and multi-parent dependency diagrams, contains implementations of JavaScript Controls and PDF rendering plugins.
240 lines (213 loc) • 7.98 kB
JavaScript
import Size from '../../graphics/structs/Size';
import Rect from '../../graphics/structs/Rect';
import Point from '../../graphics/structs/Point';
import TreeItemPosition from '../../models/TreeItemPosition';
import { OrientationType, Visibility, HorizontalAlignmentType, PageFitMode } from '../../enums';
import SpatialIndex from '../../algorithms/SpatialIndex';
import KeyboardNavigationManager from '../../managers/KeyboardNavigationManager';
export default function AlignDiagramTask(orientationOptionTask, itemsSizesOptionTask, visualTreeOptionTask, scaleOptionTask,
currentControlSizeTask, activeItemsTask, itemsPositionsTask) {
var _data = {
treeItemsPositions: {}, // TreeItemPosition();
panelSize: null // Rect();
},
_activeItems,
_treeItemsPositions,
_spatialIndex,
_keyboardNavigationManager;
function process() {
var placeholderSize = new Size(itemsPositionsTask.getContentSize()),
{ optimalPanelSize } = currentControlSizeTask.getOptions(),
{ pageFitMode } = itemsSizesOptionTask.getOptions(),
{ orientationType } = orientationOptionTask.getOptions(),
{ horizontalAlignment } = visualTreeOptionTask.getOptions(),
{ scale } = scaleOptionTask.getOptions();
_spatialIndex = null;
_keyboardNavigationManager = null;
_activeItems = activeItemsTask != null ? activeItemsTask.getActiveItems() : {};
_treeItemsPositions = itemsPositionsTask.getItemsPositions();
var panelSize = new Size(optimalPanelSize);
switch (orientationType) {
case OrientationType.Left:
case OrientationType.Right:
panelSize.invert();
break;
}
panelSize.scale(1.0 / scale);
// By default we translate everything forward
_data.panelSize = panelSize;
_data.treeItemsPositions = _treeItemsPositions;
switch (pageFitMode) {
case PageFitMode.AutoSize:
_data.panelSize = new Size(placeholderSize);
break;
default:
_data.panelSize = new Size(placeholderSize);
if (placeholderSize.width < panelSize.width) {
_data.treeItemsPositions = {};
stretchToWidth(_data.treeItemsPositions, placeholderSize.width, panelSize.width, horizontalAlignment);
_data.panelSize.width = panelSize.width;
}
if (placeholderSize.height < panelSize.height) {
_data.panelSize.height = panelSize.height;
}
break;
}
switch (orientationType) {
case OrientationType.Left:
case OrientationType.Right:
_data.panelSize.invert();
break;
}
return true;
}
function stretchToWidth(treeItemsPositions, treeWidth, panelWidth, horizontalAlignment) {
var offset;
switch (horizontalAlignment) {
case HorizontalAlignmentType.Left:
offset = 0;
break;
case HorizontalAlignmentType.Right:
offset = panelWidth - treeWidth;
break;
case HorizontalAlignmentType.Center:
offset = (panelWidth - treeWidth) / 2.0;
break;
}
translateItemPositions(treeItemsPositions, offset, 0);
}
function translateItemPositions(treeItemsPositions, offsetX, offsetY) {
var treeItemId, treeItemPosition;
for (treeItemId in _treeItemsPositions) {
if (_treeItemsPositions.hasOwnProperty(treeItemId)) {
treeItemPosition = new TreeItemPosition(_treeItemsPositions[treeItemId]);
treeItemPosition.actualPosition.translate(offsetX, offsetY);
treeItemsPositions[treeItemId] = treeItemPosition;
}
}
}
function getSizes() {
var result = [];
var hash = {};
for (var itemid in _data.treeItemsPositions) {
if (_data.treeItemsPositions.hasOwnProperty(itemid)) {
var treeItemPosition = _data.treeItemsPositions[itemid];
switch (treeItemPosition.actualVisibility) {
case Visibility.Normal:
case Visibility.Dot://ignore jslint
case Visibility.Line:
var item = treeItemPosition.actualPosition;
var size = Math.max(item.width, item.height);
if (!hash.hasOwnProperty(size)) {
hash[size] = true;
result.push(size);
}
}
}
}
return result;
}
function getSpatialIndex() {
if (_spatialIndex == null) {
_spatialIndex = SpatialIndex(getSizes());
for (var itemid in _data.treeItemsPositions) {
if (_data.treeItemsPositions.hasOwnProperty(itemid)) {
var treeItemPosition = _data.treeItemsPositions[itemid];
if (_activeItems.hasOwnProperty(itemid)) {
switch (treeItemPosition.actualVisibility) {
case Visibility.Normal:
case Visibility.Dot://ignore jslint
case Visibility.Line:
var rect = new Rect(treeItemPosition.actualPosition);
rect.context = itemid;
_spatialIndex.addRect(rect);
}
}
}
}
}
return _spatialIndex;
}
function getTreeItemForMousePosition(x, y, gravityRadius) {
var result = null,
bestDistance = null,
spatialIndex = getSpatialIndex(),
selection,
center;
selection = new Rect(x, y, 0, 0);
center = new Point(x, y);
selection.offset(gravityRadius, gravityRadius, gravityRadius, gravityRadius);
spatialIndex.loopArea(this, selection, function (rect) {
var itemid = rect.context;
if (rect.contains(x, y)) {
result = itemid;
return true;
}
var treeItemPosition = _data.treeItemsPositions[itemid];
switch (treeItemPosition.actualVisibility) {
case Visibility.Dot://ignore jslint
case Visibility.Line:
var distance = center.distanceTo(rect.horizontalCenter(), rect.verticalCenter());
if (bestDistance == null || distance < bestDistance) {
bestDistance = distance;
result = itemid;
}
}
});
return result;
}
function getKeyboardNavigationManager() {
if (_keyboardNavigationManager == null) {
_keyboardNavigationManager = KeyboardNavigationManager();
for (var itemid in _data.treeItemsPositions) {
if (_data.treeItemsPositions.hasOwnProperty(itemid)) {
var treeItemPosition = _data.treeItemsPositions[itemid];
if (_activeItems.hasOwnProperty(itemid)) {
switch (treeItemPosition.actualVisibility) {
case Visibility.Normal:
var rect = new Rect(treeItemPosition.actualPosition);
_keyboardNavigationManager.addRect(rect, itemid);
}
}
}
}
}
return _keyboardNavigationManager;
}
function getNextItem(cursorItem, direction) {
var manager = getKeyboardNavigationManager(),
result;
switch (direction) {
case OrientationType.Top:
result = manager.getItemAbove(cursorItem);
break;
case OrientationType.Bottom:
result = manager.getItemBelow(cursorItem);
break;
case OrientationType.Left:
result = manager.getItemOnLeft(cursorItem);
break;
case OrientationType.Right:
result = manager.getItemOnRight(cursorItem);
break;
}
return result;
}
function getItemPosition(itemid) {
return _data.treeItemsPositions[itemid];
}
function getItemsPositions() {
return _data.treeItemsPositions;
}
function getContentSize() {
return _data.panelSize;
}
return {
process: process,
getItemPosition: getItemPosition,
getItemsPositions: getItemsPositions,
getContentSize: getContentSize,
getTreeItemForMousePosition: getTreeItemForMousePosition,
getNextItem: getNextItem
};
};