/* * Copyright [2015] [wisemapping] * * Licensed under WiseMapping Public License, Version 1.0 (the "License"). * It is basically the Apache License, Version 2.0 (the "License") plus the * "powered by wisemapping" text requirement on every single page; * you may not use this file except in compliance with the License. * You may obtain a copy of the license at * * http://www.wisemapping.org/license * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ const Node = new Class(/** @lends Node */{ /** * @constructs * @param id * @param size * @param position * @param sorter * @throws will throw an error if id is not a finite number or is null or undefined * @throws will throw an error if size is null or undefined * @throws will throw an error if position is null or undefined * @throws will throw an error if sorter is null or undefined */ initialize:function (id, size, position, sorter) { $assert(typeof id === 'number' && isFinite(id), "id can not be null"); $assert(size, "size can not be null"); $assert(position, "position can not be null"); $assert(sorter, "sorter can not be null"); this._id = id; this._sorter = sorter; this._properties = {}; this.setSize(size); this.setPosition(position); this.setShrunken(false); }, /** */ getId:function () { return this._id; }, /** */ setFree:function (value) { this._setProperty('free', value); }, /** */ isFree:function () { return this._getProperty('free'); }, /** */ hasFreeChanged:function () { return this._isPropertyChanged('free'); }, /** */ hasFreeDisplacementChanged:function () { return this._isPropertyChanged('freeDisplacement'); }, /** */ setShrunken:function (value) { this._setProperty('shrink', value); }, /** */ areChildrenShrunken:function () { return this._getProperty('shrink'); }, /** */ setOrder:function (order) { $assert(typeof order === 'number' && isFinite(order), "Order can not be null. Value:" + order); this._setProperty('order', order); }, /** */ resetPositionState:function () { var prop = this._properties['position']; if (prop) { prop.hasChanged = false; } }, /** */ resetOrderState:function () { var prop = this._properties['order']; if (prop) { prop.hasChanged = false; } }, /** */ resetFreeState:function () { var prop = this._properties['freeDisplacement']; if (prop) { prop.hasChanged = false; } }, /** */ getOrder:function () { return this._getProperty('order'); }, /** */ hasOrderChanged:function () { return this._isPropertyChanged('order'); }, /** */ hasPositionChanged:function () { return this._isPropertyChanged('position'); }, /** */ hasSizeChanged:function () { return this._isPropertyChanged('size'); }, /** */ getPosition:function () { return this._getProperty('position'); }, /** */ setSize:function (size) { $assert($defined(size), "Size can not be null"); this._setProperty('size', Object.clone(size)); }, /** */ getSize:function () { return this._getProperty('size'); }, /** */ setFreeDisplacement:function (displacement) { $assert($defined(displacement), "Position can not be null"); $assert($defined(displacement.x), "x can not be null"); $assert($defined(displacement.y), "y can not be null"); var oldDisplacement = this.getFreeDisplacement(); var newDisplacement = {x:oldDisplacement.x + displacement.x, y:oldDisplacement.y + displacement.y}; this._setProperty('freeDisplacement', Object.clone(newDisplacement)); }, /** */ resetFreeDisplacement:function () { this._setProperty('freeDisplacement', {x:0, y:0}); }, /** */ getFreeDisplacement:function () { var freeDisplacement = this._getProperty('freeDisplacement'); return (freeDisplacement || {x:0, y:0}); }, /** */ setPosition:function (position) { $assert($defined(position), "Position can not be null"); $assert($defined(position.x), "x can not be null"); $assert($defined(position.y), "y can not be null"); // This is a performance improvement to avoid movements that really could be avoided. var currentPos = this.getPosition(); if (currentPos == null || Math.abs(currentPos.x - position.x) > 2 || Math.abs(currentPos.y - position.y) > 2) this._setProperty('position', position); }, _setProperty:function (key, value) { var prop = this._properties[key]; if (!prop) { prop = { hasChanged:false, value:null, oldValue:null }; } // Only update if the property has changed ... if (JSON.stringify(prop.value) != JSON.stringify(value)) { prop.oldValue = prop.value; prop.value = value; prop.hasChanged = true; } this._properties[key] = prop; }, _getProperty:function (key) { var prop = this._properties[key]; return $defined(prop) ? prop.value : null; }, _isPropertyChanged:function (key) { var prop = this._properties[key]; return prop ? prop.hasChanged : false; }, /** */ getSorter:function () { return this._sorter; }, /** @return {String} returns id, order, position, size and shrink information*/ toString:function () { return "[id:" + this.getId() + ", order:" + this.getOrder() + ", position: {" + this.getPosition().x + "," + this.getPosition().y + "}, size: {" + this.getSize().width + "," + this.getSize().height + "}, shrink:" + this.areChildrenShrunken() + "]"; } }); export default Node;