Daniel@0: "use strict"; Daniel@0: Daniel@0: App.module("MainRegionModule", function (MainRegionModule, App, Backbone, Marionette, $, _, Logger) { Daniel@0: Daniel@0: MainRegionModule.ConfigGridCellsView = MainRegionModule.ConfigGridChildView.extend({ Daniel@0: Daniel@0: options: { Daniel@0: state: null, Daniel@0: configGrid: null, Daniel@0: parentConfigGridView: null, Daniel@0: scrollAnimationMinSpeed: 100, Daniel@0: scrollAnimationBaseSpeed: 400, Daniel@0: scrollAnimationBaseDistance: 500, Daniel@0: desiredPaddingAroundVisInstanceOnScroll: { Daniel@0: left: 35, Daniel@0: top: 20, Daniel@0: right: 35, Daniel@0: bottom: 33, Daniel@0: }, Daniel@0: enableFixedHeaders: true, // headers become fixed when scrolling Daniel@0: }, Daniel@0: Daniel@0: _logger: null, Daniel@0: Daniel@0: _$entityHeadersContainer: null, Daniel@0: _$entityHeadersBlind: null, Daniel@0: _$viewHeadersContainer: null, Daniel@0: _$viewHeadersBlind: null, Daniel@0: _$visInstancesContainer: null, Daniel@0: _$cornerBlind: null, Daniel@0: _$fixedContainer: null, Daniel@0: Daniel@0: _$entityAdder: null, Daniel@0: _$viewAdder: null, Daniel@0: Daniel@0: _distanceBetweenEntities: 10, Daniel@0: _distanceBetweenViews: 10, Daniel@0: _viewHeaderHeight: 0, Daniel@0: _entityAdderWidth: 0, Daniel@0: _viewAdderHeight: 0, Daniel@0: _cachedMinSpaceWidth: 0, Daniel@0: _cachedMinSpaceHeight: 0, Daniel@0: _spacePadding: null, // top, right, bottom, left, h = l + r, v = t + b Daniel@0: _scrollLeftBeforeLatestSelectionUpdate: 0, Daniel@0: _scrollTopBeforeLatestSelectionUpdate: 0, Daniel@0: Daniel@0: _ignoreXOnNextScroll: false, Daniel@0: _ignoreYOnNextScroll: false, Daniel@0: _latestChangeWasAReset: false, Daniel@0: Daniel@0: _cachedScrollPosGridHash: null, Daniel@0: _cachedScrollPosSelection: null, Daniel@0: _cachedScrollPosX: null, Daniel@0: _cachedScrollPosY: null, Daniel@0: Daniel@0: _cachedSelectedEntityConfigClientId: null, // string Daniel@0: _cachedSelectedViewConfigClientId: null, // string Daniel@0: Daniel@0: _cachedEntityHeaderViewsByClientId: {}, // string: Backbone view Daniel@0: _cachedViewHeaderViewsByClientId: {}, // string: Backbone view Daniel@0: _cachedVisInstanceViewsByClientIdPair: {}, // string: Backbone view Daniel@0: Daniel@0: _cachedEntityConfigClientIds: null, // [string] (keys of _cachedEntityHeaderViewsByClientId) Daniel@0: _cachedViewConfigClientIds: null, // [string] (keys of _cachedViewHeaderViewsByClientId) Daniel@0: Daniel@0: _cachedEntityWidth: null, Daniel@0: _cachedViewContentHeights: null, Daniel@0: Daniel@0: initialize: function(options) { Daniel@0: var _this = this; Daniel@0: Daniel@0: _this._logger = Logger.get("ConfigGridCellsView"); Daniel@0: //_this._logger.setLevel(Logger.DEBUG); Daniel@0: Daniel@0: _this.options = _.defaults(options || {}, this.options); Daniel@0: if (_this.options.enableFixedHeaders === null) { Daniel@0: _this.options.enableFixedHeaders = (navigator.userAgent.indexOf("afari") >= 0 && navigator.userAgent.indexOf("Chrom") == -1) || navigator.userAgent.indexOf("MSIE") >= 0 || navigator.userAgent.indexOf("MATM") >= 0 || navigator.userAgent.indexOf("Trident") >= 0; Daniel@0: } Daniel@0: Daniel@0: var configGridType = _this.options.configGrid.getType(); Daniel@0: Daniel@0: _this.$el.empty(); Daniel@0: Daniel@0: _this._$entityHeadersContainer = $.bem.generateElement("config-grid-cells", "entity-headers-container"); Daniel@0: _this._$entityHeadersBlind = $.bem.generateElement("config-grid-cells", "entity-headers-blind"); Daniel@0: _this._$entityHeadersContainer.append(_this._$entityHeadersBlind); Daniel@0: Daniel@0: _this._$viewHeadersContainer = $.bem.generateElement("config-grid-cells", "view-headers-container"); Daniel@0: _this._$viewHeadersBlind = $.bem.generateElement("config-grid-cells", "view-headers-blind"); Daniel@0: _this._$viewAdder = $.bem.generateElement("config-grid-cells", "view-header", ["kind_adder"]); Daniel@0: _this._$viewHeadersContainer.append(_this._$viewHeadersBlind, _this._$viewAdder); Daniel@0: Daniel@0: _this._$visInstancesContainer = $.bem.generateElement("config-grid-cells", "vis-instances-container"); Daniel@0: Daniel@0: _this._$cornerBlind = $.bem.generateElement("config-grid-cells", "corner-blind"); Daniel@0: Daniel@0: _this._$space = $.bem.generateElement("config-grid-cells", "space"); Daniel@0: Daniel@0: _this._$containerOfScrollable = $.bem.generateElement("config-grid-cells", "container", ["position_scrollable"]); Daniel@0: _this._$containerOfFixed = $.bem.generateElement("config-grid-cells", "container", ["position_fixed"]); Daniel@0: Daniel@0: // Entity and collection adders Daniel@0: if (configGridType == "collection") { Daniel@0: _this._$entityAdder = $.bem.generateElement("config-grid-cells", "entity-header", ["kind_adder"]); Daniel@0: var $entityAdderBackground = $.bem.generateElement("config-grid-cells", "entity-header-background"); Daniel@0: var $entityAdderLabel = $.bem.generateElement("config-grid-cells", "entity-header-label"); Daniel@0: $entityAdderLabel.html(Backbone.Marionette.TemplateCache.get("#config-grid_collection__entity-adder-label")); Daniel@0: _this._$entityAdder.append($entityAdderBackground, $entityAdderLabel); Daniel@0: _this._$entityHeadersContainer.append(_this._$entityAdder); Daniel@0: _this._$entityAdder.click(function() { Daniel@0: _this.options.configGrid.addEntityAndSelectIt(new App.ContextModule.Config()); Daniel@0: }); Daniel@0: } else { Daniel@0: _this._$entityAdder = $(); Daniel@0: } Daniel@0: _this._$viewAdder = $.bem.generateElement("config-grid-cells", "view-header", ["kind_adder"]); Daniel@0: var $viewAdderBackground = $.bem.generateElement("config-grid-cells", "view-header-background"); Daniel@0: var $viewAdderLabel = $.bem.generateElement("config-grid-cells", "view-header-label"); Daniel@0: $viewAdderLabel.html(Backbone.Marionette.TemplateCache.get("#config-grid__view-adder-label")); Daniel@0: _this._$viewAdder.append($viewAdderBackground, $viewAdderLabel); Daniel@0: _this._$viewHeadersContainer.append(_this._$viewAdder); Daniel@0: _this._$viewAdder.click(function() { Daniel@0: _this.options.configGrid.addViewAndSelectIt(new App.ContextModule.Config()); Daniel@0: }); Daniel@0: Daniel@0: _this._$entityHeadersContainer.append(); Daniel@0: _this._$viewHeadersContainer.append(); Daniel@0: _this._$space.append( Daniel@0: _this._$visInstancesContainer, Daniel@0: _this._$entityHeadersContainer, Daniel@0: _this._$viewHeadersContainer, Daniel@0: _this._$cornerBlind Daniel@0: ); Daniel@0: Daniel@0: _this._$containerOfScrollable.append(_this._$space); Daniel@0: _this.$el.append(_this._$containerOfScrollable, _this._$containerOfFixed); Daniel@0: Daniel@0: // extract some size- and position-related constants Daniel@0: _this._viewHeaderHeight = _this._$viewAdder.height(); Daniel@0: _this._entityAdderWidth = _this._$entityAdder.width(); Daniel@0: _this._viewAdderHeight = _this._viewHeaderHeight; Daniel@0: if (!_this._entityAdderWidth) { Daniel@0: _this._entityAdderWidth = -_this._distanceBetweenEntities; Daniel@0: } Daniel@0: Daniel@0: // When defining space padding, it is sometimes necessary to wait a bit Daniel@0: // A grid that is on the "back side of the card" may sometimes become blank when scrolling otherwise Daniel@0: _this._spacePadding = {}; Daniel@0: var interval; Daniel@0: var setSpaceInterval = function() { Daniel@0: if (_this._$space.css("padding-top")) { Daniel@0: _this._spacePadding.top = parseInt(_this._$space.css("padding-top"), 10); Daniel@0: _this._spacePadding.right = parseInt(_this._$space.css("padding-right"), 10); Daniel@0: _this._spacePadding.bottom = parseInt(_this._$space.css("padding-bottom"), 10); Daniel@0: _this._spacePadding.left = parseInt(_this._$space.css("padding-left"), 10); Daniel@0: _this._spacePadding.h = _this._spacePadding.left + _this._spacePadding.right; Daniel@0: _this._spacePadding.v = _this._spacePadding.top + _this._spacePadding.bottom; Daniel@0: //_this._toggleFixedHeadersIfNeeded(false); Daniel@0: _this._updateDemensionsForContainerOfFixed(); Daniel@0: clearInterval(interval); Daniel@0: } Daniel@0: }; Daniel@0: if (_this._$space.css("padding-top")) { Daniel@0: setSpaceInterval(); Daniel@0: } else { Daniel@0: interval = setInterval(setSpaceInterval, 50); Daniel@0: } Daniel@0: Daniel@0: // subscribe to events Daniel@0: _this.listenTo(_this.options.configGrid, "change", _this.renderIfParentConfigGridIsVisible); Daniel@0: Daniel@0: var isSafari = navigator.userAgent.indexOf("afari") >= 0; Daniel@0: var isChrome = navigator.userAgent.indexOf("rome") >= 0; Daniel@0: var isScrolling = false; Daniel@0: if (_this.options.enableFixedHeaders) { Daniel@0: _this._$containerOfScrollable.mousewheel(_.debounce(function(event) { Daniel@0: _this._toggleFixedHeadersIfNeeded(true); Daniel@0: Daniel@0: var visInstanceViews = _.values(_this._cachedVisInstanceViewsByClientIdPair); Daniel@0: for (var i = visInstanceViews.length - 1; i >= 0; --i) { Daniel@0: visInstanceViews[i].cancelPointerHighlights(); Daniel@0: } Daniel@0: Daniel@0: App.TooltipModule.update(); Daniel@0: if (isSafari || isChrome) { Daniel@0: _this._$containerOfScrollable.scrollLeft(_this._$containerOfScrollable.scrollLeft() + event.deltaX); Daniel@0: _this._$containerOfScrollable.scrollTop (_this._$containerOfScrollable.scrollTop() - event.deltaY); Daniel@0: event.preventDefault(); Daniel@0: } Daniel@0: }, 50, true)); Daniel@0: _this._$containerOfScrollable.mousewheel(_.debounce(function(event) { Daniel@0: if (!isScrolling) { Daniel@0: _this._toggleFixedHeadersIfNeeded(false); Daniel@0: } Daniel@0: }, 200)); Daniel@0: } Daniel@0: Daniel@0: _this._$containerOfScrollable.scroll(function(event) { Daniel@0: if (!isScrolling) { Daniel@0: isScrolling = true; Daniel@0: } Daniel@0: _this._toggleFixedHeadersIfNeeded(true); Daniel@0: }); Daniel@0: Daniel@0: _this._$containerOfScrollable.scroll(_.debounce(function(event) { Daniel@0: _this._toggleFixedHeadersIfNeeded(false); Daniel@0: _this._reviseSpaceSize(); Daniel@0: isScrolling = false; Daniel@0: _this._updateCachedScroll(); Daniel@0: }, 200)); Daniel@0: Daniel@0: $(window).resize(_.throttle(function() { Daniel@0: _this._reviseSpaceSize(); Daniel@0: _this._updateDemensionsForContainerOfFixed(); Daniel@0: }, 100)); Daniel@0: _this._toggleFixedHeadersIfNeeded(false); Daniel@0: _this._updateDemensionsForContainerOfFixed(); Daniel@0: Daniel@0: // Restore and save precise scroll position of the currently selected entity and view Daniel@0: _this._cachedScrollPosGridHash = App.DataModule.Storage.getStrCache(MainRegionModule, _.str.sprintf("scroll-pos-grid-hash_%s", configGridType)); Daniel@0: _this._cachedScrollPosSelection = App.DataModule.Storage.getStrCache(MainRegionModule, _.str.sprintf("scroll-pos-selection_%s", configGridType)); Daniel@0: _this._cachedScrollPosX = 1 * App.DataModule.Storage.getStrCache(MainRegionModule, _.str.sprintf("scroll-pos-x_%s", configGridType)); Daniel@0: _this._cachedScrollPosY = 1 * App.DataModule.Storage.getStrCache(MainRegionModule, _.str.sprintf("scroll-pos-y_%s", configGridType)); Daniel@0: Daniel@0: $(window).unload(function() { Daniel@0: App.DataModule.Storage.setStrCache(MainRegionModule, _.str.sprintf("scroll-pos-grid-hash_%s", configGridType), _this._cachedScrollPosGridHash); Daniel@0: App.DataModule.Storage.setStrCache(MainRegionModule, _.str.sprintf("scroll-pos-selection_%s", configGridType), _this._cachedScrollPosSelection); Daniel@0: App.DataModule.Storage.setStrCache(MainRegionModule, _.str.sprintf("scroll-pos-x_%s", configGridType), "" + _this._cachedScrollPosX); Daniel@0: App.DataModule.Storage.setStrCache(MainRegionModule, _.str.sprintf("scroll-pos-y_%s", configGridType), "" + _this._cachedScrollPosY); Daniel@0: }); Daniel@0: Daniel@0: }, Daniel@0: Daniel@0: render: function (deep, instant) { Daniel@0: var _this = this; Daniel@0: Daniel@0: _this._updateLayout(deep, instant); Daniel@0: _this._updateSelection(deep, instant); Daniel@0: if (deep) { Daniel@0: _this._reviseSpaceSize(); Daniel@0: _this._updateDemensionsForContainerOfFixed(); Daniel@0: } Daniel@0: _this._adjustToScrollPos(deep, instant); Daniel@0: _this.scrollAccordingToSelection(deep, instant); Daniel@0: Daniel@0: if (deep) { Daniel@0: var entityHeaderViews = _.values(_this._cachedEntityHeaderViewsByClientId); Daniel@0: for (var i = entityHeaderViews.length - 1; i >= 0; --i) { Daniel@0: entityHeaderViews[i].render(deep, instant); Daniel@0: } Daniel@0: Daniel@0: var viewHeaderViews = _.values(_this._cachedViewHeaderViewsByClientId); Daniel@0: for (var i = viewHeaderViews.length - 1; i >= 0; --i) { Daniel@0: viewHeaderViews[i].render(deep, instant); Daniel@0: } Daniel@0: Daniel@0: var visInstanceViews = _.values(_this._cachedVisInstanceViewsByClientIdPair); Daniel@0: for (var i = visInstanceViews.length - 1; i >= 0; --i) { Daniel@0: visInstanceViews[i].render(deep, instant); Daniel@0: } Daniel@0: }; Daniel@0: }, Daniel@0: Daniel@0: getEntityWidth: function() { Daniel@0: var _this = this; Daniel@0: return (_this.options.configGrid.get("entityWidth") || App.options.defaultEntityWidth) * 1; Daniel@0: }, Daniel@0: Daniel@0: _updateLayout: function(deep, instant) { Daniel@0: var _this = this; Daniel@0: Daniel@0: // Check if entities of views have changed Daniel@0: var entityListHasChanged = false; Daniel@0: var viewListHasChanged = false; Daniel@0: var newEntityConfigs = _this.options.configGrid.get("entityConfigs"); Daniel@0: var newViewConfigs = _this.options.configGrid.get("viewConfigs"); Daniel@0: var newEntityConfigClientIds = _.pluck(newEntityConfigs.models, "cid"); Daniel@0: var newViewConfigClientIds = _.pluck(newViewConfigs.models, "cid"); Daniel@0: Daniel@0: _this._scrollLeftBeforeLatestLayoutUpdate = _this.$el.scrollLeft(); Daniel@0: _this._scrollTopBeforeLatestLayoutUpdate = _this.$el.scrollTop(); Daniel@0: Daniel@0: if (_this._cachedEntityConfigClientIds === null) { Daniel@0: entityListHasChanged = true; Daniel@0: viewListHasChanged = true; Daniel@0: _this._cachedEntityConfigClientIds = []; Daniel@0: _this._cachedViewConfigClientIds = []; Daniel@0: } Daniel@0: Daniel@0: var createdEntityConfigClientIds = _.difference(newEntityConfigClientIds, _this._cachedEntityConfigClientIds); Daniel@0: var createdViewConfigClientIds = _.difference(newViewConfigClientIds, _this._cachedViewConfigClientIds); Daniel@0: var removedEntityConfigClientIds = _.difference(_this._cachedEntityConfigClientIds, newEntityConfigClientIds); Daniel@0: var removedViewConfigClientIds = _.difference(_this._cachedViewConfigClientIds, newViewConfigClientIds); Daniel@0: Daniel@0: _this._latestChangeWasAReset = false; Daniel@0: Daniel@0: if (createdEntityConfigClientIds.length + removedEntityConfigClientIds.length == 1) { Daniel@0: _this._ignoreYOnNextScroll = true; Daniel@0: } Daniel@0: if (createdViewConfigClientIds.length + removedViewConfigClientIds.length == 1) { Daniel@0: _this._ignoreXOnNextScroll = true; Daniel@0: } Daniel@0: Daniel@0: if (!_.isEqual(newEntityConfigClientIds, _this._cachedEntityConfigClientIds)) { Daniel@0: entityListHasChanged = true; Daniel@0: } Daniel@0: if (!_.isEqual(newViewConfigClientIds, _this._cachedViewConfigClientIds)) { Daniel@0: viewListHasChanged = true; Daniel@0: } Daniel@0: Daniel@0: if ((entityListHasChanged && createdEntityConfigClientIds.length + removedEntityConfigClientIds.length > 1) Daniel@0: || (viewListHasChanged && createdViewConfigClientIds.length + removedViewConfigClientIds.length > 1)) { Daniel@0: _this._latestChangeWasAReset = true; Daniel@0: _this._ignoreXOnNextScroll = false; Daniel@0: _this._ignoreYOnNextScroll = false; Daniel@0: } Daniel@0: Daniel@0: Daniel@0: var newEntityHeaderViewsByClientId = _this._cachedEntityHeaderViewsByClientId; Daniel@0: var newViewHeaderViewsByClientId = _this._cachedViewHeaderViewsByClientId; Daniel@0: var newVisInstanceViewsByClientIdPair = _this._cachedVisInstanceViewsByClientIdPair; Daniel@0: var viewHeaderViewsToRender = []; Daniel@0: var entityHeaderViewsToRender = []; Daniel@0: var visInstanceViewsToRender = []; Daniel@0: Daniel@0: // Replacement of entity headers if needed Daniel@0: if (entityListHasChanged) { Daniel@0: newEntityHeaderViewsByClientId = {}; Daniel@0: for (var i = 0; i < newEntityConfigClientIds.length; i++) { Daniel@0: var currentEntityClientId = newEntityConfigClientIds[i]; Daniel@0: Daniel@0: // Look for an existing entity header view Daniel@0: var entityHeaderView = _this._cachedEntityHeaderViewsByClientId[currentEntityClientId]; Daniel@0: Daniel@0: // Create a new entity header if it does not exist Daniel@0: if (!entityHeaderView) { Daniel@0: _this._logger.debug("generate entity header ", currentEntityClientId); Daniel@0: entityHeaderView = _this._generateEntityHeaderView(newEntityConfigs.get(currentEntityClientId)); Daniel@0: entityHeaderViewsToRender.push(entityHeaderView); Daniel@0: _this._$entityHeadersContainer.append(entityHeaderView.el); Daniel@0: } Daniel@0: newEntityHeaderViewsByClientId[currentEntityClientId] = entityHeaderView; Daniel@0: } Daniel@0: Daniel@0: // Remove entity header views that are no longer needed Daniel@0: // The order of the views does not matter as the right layout is achieved with absolute positioning Daniel@0: for (var i = removedEntityConfigClientIds.length - 1; i >= 0; --i) { Daniel@0: _this._cachedEntityHeaderViewsByClientId[removedEntityConfigClientIds[i]].remove(); Daniel@0: App.dynamicDerivedConfigDataProvider.retire(removedEntityConfigClientIds[i]); Daniel@0: } Daniel@0: } else { Daniel@0: newEntityHeaderViewsByClientId = _this._cachedEntityHeaderViewsByClientId; Daniel@0: } Daniel@0: Daniel@0: // Replacement of view headers if needed Daniel@0: if (viewListHasChanged) { Daniel@0: newViewHeaderViewsByClientId = {}; Daniel@0: for (var i = 0; i < newViewConfigClientIds.length; i++) { Daniel@0: var currentViewClientId = newViewConfigClientIds[i]; Daniel@0: Daniel@0: // Look for an existing entity header Daniel@0: var viewHeaderView = _this._cachedViewHeaderViewsByClientId[currentViewClientId]; Daniel@0: Daniel@0: // Create a new view header if it does not exist Daniel@0: if (!viewHeaderView) { Daniel@0: _this._logger.debug("generate view header ", currentViewClientId); Daniel@0: viewHeaderView = _this._generateViewHeaderView(newViewConfigs.get(currentViewClientId)); Daniel@0: viewHeaderViewsToRender.push(viewHeaderView); Daniel@0: _this._$viewHeadersContainer.append(viewHeaderView.el); Daniel@0: } Daniel@0: newViewHeaderViewsByClientId[currentViewClientId] = viewHeaderView; Daniel@0: } Daniel@0: Daniel@0: // Remove entity header views that are no longer needed Daniel@0: // The order of the views does not matter as the right layout is achieved with absolute positioning Daniel@0: for (var i = removedViewConfigClientIds.length - 1; i >= 0; --i) { Daniel@0: _this._cachedViewHeaderViewsByClientId[removedViewConfigClientIds[i]].remove(); Daniel@0: App.dynamicDerivedConfigDataProvider.retire(removedViewConfigClientIds[i]); Daniel@0: } Daniel@0: } else { Daniel@0: newViewHeaderViewsByClientId = _this._cachedViewHeaderViewsByClientId; Daniel@0: } Daniel@0: Daniel@0: // Replacement of vis instances Daniel@0: if (viewListHasChanged || entityListHasChanged) { Daniel@0: newVisInstanceViewsByClientIdPair = {}; Daniel@0: for (var i = 0; i < newEntityConfigClientIds.length; i++) { Daniel@0: var currentEntityClientId = newEntityConfigClientIds[i]; Daniel@0: Daniel@0: for (var j = 0; j < newViewConfigClientIds.length; j++) { Daniel@0: var currentViewClientId = newViewConfigClientIds[j]; Daniel@0: var currentClientIdPair = currentEntityClientId + currentViewClientId; Daniel@0: Daniel@0: // Look for an existing vis instance view Daniel@0: var visInstanceView = _this._cachedVisInstanceViewsByClientIdPair[currentClientIdPair]; Daniel@0: Daniel@0: // Create a new vis instance view if it does not exist Daniel@0: if (!visInstanceView) { Daniel@0: _this._logger.debug("generate vis instance", currentEntityClientId, currentViewClientId); Daniel@0: visInstanceView = _this._generateVisInstanceView(newEntityConfigs.get(currentEntityClientId), newViewConfigs.get(currentViewClientId)); Daniel@0: visInstanceViewsToRender.push(visInstanceView); Daniel@0: _this._$visInstancesContainer.append(visInstanceView.el); Daniel@0: } Daniel@0: newVisInstanceViewsByClientIdPair[currentClientIdPair] = visInstanceView; Daniel@0: } Daniel@0: } Daniel@0: Daniel@0: // Add new vis instances and remove those that are no longer needed Daniel@0: // The order does not matter as the right layout is achieved with absolute positioning Daniel@0: for (var i = this._cachedEntityConfigClientIds.length - 1; i >= 0; --i) { Daniel@0: for (var j = removedViewConfigClientIds.length - 1; j >= 0; --j) { Daniel@0: var visInstanceToRemove = _this._cachedVisInstanceViewsByClientIdPair[this._cachedEntityConfigClientIds[i] + removedViewConfigClientIds[j]]; Daniel@0: visInstanceToRemove.remove(); Daniel@0: } Daniel@0: } Daniel@0: for (var i = removedEntityConfigClientIds.length - 1; i >= 0; --i) { Daniel@0: for (var j = this._cachedViewConfigClientIds.length - 1; j >= 0; --j) { Daniel@0: var visInstanceToRemove = _this._cachedVisInstanceViewsByClientIdPair[removedEntityConfigClientIds[i] + this._cachedViewConfigClientIds[j]]; Daniel@0: if (visInstanceToRemove) { Daniel@0: visInstanceToRemove.remove(); Daniel@0: } Daniel@0: } Daniel@0: } Daniel@0: } Daniel@0: Daniel@0: // view heights Daniel@0: var viewHeightsHaveChanged = false; Daniel@0: var entityWidthHasChanged = false; Daniel@0: Daniel@0: var entityWidth = _this.getEntityWidth(); Daniel@0: var viewContentHeights = []; Daniel@0: for (var row = 0; row < newViewConfigClientIds.length; row++) { Daniel@0: var currentViewConfigClientId = newViewConfigClientIds[row]; Daniel@0: var viewConfig = newViewConfigs.get(currentViewConfigClientId); Daniel@0: var viewContentHeight = App.RepresentationModule.getMasterForConfig(viewConfig).calculateVisInstanceContentHeight(viewConfig, entityWidth); Daniel@0: viewContentHeights.push(viewContentHeight); Daniel@0: } Daniel@0: Daniel@0: if (entityWidth !== _this._cachedEntityWidth) { Daniel@0: entityWidthHasChanged = true; Daniel@0: _this._cachedEntityWidth = entityWidth; Daniel@0: } Daniel@0: if (!_.isEqual(viewContentHeights, _this._cachedViewContentHeights)) { Daniel@0: viewHeightsHaveChanged = true; Daniel@0: _this._cachedViewContentHeights = viewContentHeights; Daniel@0: } Daniel@0: Daniel@0: // Set up positions and sizes for entities and views Daniel@0: if (viewListHasChanged || entityListHasChanged || entityWidthHasChanged || viewHeightsHaveChanged) { Daniel@0: var newEntityDimensions = []; //entityId, x, width Daniel@0: var newViewDimensions = []; //viewId, y, height Daniel@0: var x = 0; Daniel@0: var configGridType = _this.options.configGrid.getType(); Daniel@0: for (var col = 0; col < newEntityConfigClientIds.length; col++) { Daniel@0: var currentEntityConfigClientId = newEntityConfigClientIds[col]; Daniel@0: newEntityDimensions.push([currentEntityConfigClientId, x, entityWidth]); Daniel@0: x += entityWidth + _this._distanceBetweenEntities; Daniel@0: } Daniel@0: var y = 0; Daniel@0: var viewHeaderHeight = _this._viewHeaderHeight; Daniel@0: for (var row = 0; row < newViewConfigClientIds.length; row++) { Daniel@0: var currentViewConfigClientId = newViewConfigClientIds[row]; Daniel@0: newViewDimensions.push([currentViewConfigClientId, y, _this._cachedViewContentHeights[row]]); Daniel@0: y += viewHeaderHeight + _this._cachedViewContentHeights[row] + _this._distanceBetweenViews; Daniel@0: } Daniel@0: Daniel@0: // Reposition and resize view headers Daniel@0: for (var row = newViewDimensions.length - 1; row >= 0; --row) { Daniel@0: var currentViewDimensions = newViewDimensions[row]; Daniel@0: var viewHeaderView = newViewHeaderViewsByClientId[currentViewDimensions[0]]; Daniel@0: viewHeaderView.$el.css("top", currentViewDimensions[1]) Daniel@0: .attr("data-top", currentViewDimensions[1]) Daniel@0: .attr("data-total-height", currentViewDimensions[2] + _this._viewHeaderHeight); Daniel@0: viewHeaderView.setSize(currentViewDimensions[2]); Daniel@0: } Daniel@0: for (var col = newEntityDimensions.length - 1; col >= 0; --col) { Daniel@0: var currentEntityDimensions = newEntityDimensions[col]; Daniel@0: Daniel@0: // Reposition and resize entity headers Daniel@0: var entityHeaderView = newEntityHeaderViewsByClientId[currentEntityDimensions[0]]; Daniel@0: entityHeaderView.$el.css("left", currentEntityDimensions[1]) Daniel@0: .attr("data-left", currentEntityDimensions[1]) Daniel@0: .attr("data-width", currentEntityDimensions[2]); Daniel@0: entityHeaderView.setSize(currentEntityDimensions[2]); Daniel@0: Daniel@0: for (var row = newViewDimensions.length - 1; row >= 0; --row) { Daniel@0: var currentViewDimensions = newViewDimensions[row]; Daniel@0: Daniel@0: // Reposition and resize vis instances Daniel@0: var visInstanceView = newVisInstanceViewsByClientIdPair[currentEntityDimensions[0] + currentViewDimensions[0]]; Daniel@0: visInstanceView.$el.css({ Daniel@0: "left": currentEntityDimensions[1], Daniel@0: "top": currentViewDimensions[1] + viewHeaderHeight Daniel@0: }); Daniel@0: visInstanceView.setSize(currentEntityDimensions[2], currentViewDimensions[2]); Daniel@0: } Daniel@0: } Daniel@0: Daniel@0: // Reposition entity and view adders Daniel@0: var needToResizeSpace = false; Daniel@0: if (x != _this._$entityAdder.css("left")) { Daniel@0: _this._$entityAdder.css("left", x); Daniel@0: needToResizeSpace = true; Daniel@0: } Daniel@0: if (y != _this._$viewAdder.css("top")) { Daniel@0: _this._$viewAdder.css("top", y); Daniel@0: needToResizeSpace = true; Daniel@0: } Daniel@0: Daniel@0: // Resize the space Daniel@0: if (needToResizeSpace) { Daniel@0: _this._cachedMinSpaceWidth = x + _this._entityAdderWidth; Daniel@0: _this._cachedMinSpaceHeight = y + _this._viewAdderHeight; Daniel@0: _this._reviseSpaceSize(!_this._latestChangeWasAReset); Daniel@0: } Daniel@0: } Daniel@0: Daniel@0: // Update cached view data Daniel@0: if (entityListHasChanged) { Daniel@0: _this._cachedEntityHeaderViewsByClientId = newEntityHeaderViewsByClientId; Daniel@0: _this._cachedEntityConfigClientIds = newEntityConfigClientIds; Daniel@0: } Daniel@0: if (viewListHasChanged) { Daniel@0: _this._cachedViewHeaderViewsByClientId = newViewHeaderViewsByClientId; Daniel@0: _this._cachedViewConfigClientIds = newViewConfigClientIds; Daniel@0: } Daniel@0: if (viewListHasChanged || entityListHasChanged) { Daniel@0: _this._cachedVisInstanceViewsByClientIdPair = newVisInstanceViewsByClientIdPair; Daniel@0: } Daniel@0: Daniel@0: // Render new vis instances and those that have changed their dimensions Daniel@0: // If deep rendering takes place, all view instances will be rendered later Daniel@0: Daniel@0: if (!deep && entityHeaderViewsToRender) { Daniel@0: for (var i = entityHeaderViewsToRender.length - 1; i >= 0; --i) { Daniel@0: entityHeaderViewsToRender[i].render(); Daniel@0: } Daniel@0: } Daniel@0: if (!deep && viewHeaderViewsToRender) { Daniel@0: for (var i = viewHeaderViewsToRender.length - 1; i >= 0; --i) { Daniel@0: viewHeaderViewsToRender[i].render(); Daniel@0: } Daniel@0: } Daniel@0: if (!deep && visInstanceViewsToRender) { Daniel@0: for (var i = visInstanceViewsToRender.length - 1; i >= 0; --i) { Daniel@0: visInstanceViewsToRender[i].render(); Daniel@0: } Daniel@0: } Daniel@0: Daniel@0: // Destroy detached vis instances Daniel@0: if (viewListHasChanged || entityListHasChanged) { Daniel@0: var destroyedVisInstanceViews = _.difference(_.values(this._cachedVisInstanceViewsByClientIdPair), _.values(newVisInstanceViewsByClientIdPair)); Daniel@0: for (var i = destroyedVisInstanceViews.length - 1; i >= 0; --i) { Daniel@0: destroyedVisInstanceViews[i].remove(); Daniel@0: } Daniel@0: } Daniel@0: }, Daniel@0: Daniel@0: _updateSelection: function(deep, instant) { Daniel@0: var _this = this; Daniel@0: Daniel@0: var selectedEntityConfig = _this.options.configGrid.getSelectedEntityConfig(); Daniel@0: var selectedViewConfig = _this.options.configGrid.getSelectedViewConfig(); Daniel@0: var selectedEntityConfigClientId = selectedEntityConfig ? selectedEntityConfig.getClientId() : null; Daniel@0: var selectedViewConfigClientId = selectedViewConfig ? selectedViewConfig.getClientId() : null; Daniel@0: Daniel@0: if (_this._cachedSelectedEntityConfigClientId !== selectedEntityConfigClientId) { Daniel@0: _this._cachedSelectedEntityConfigClientId = selectedEntityConfigClientId; Daniel@0: } Daniel@0: if (_this._cachedSelectedViewConfigClientId !== selectedViewConfigClientId) { Daniel@0: _this._cachedSelectedViewConfigClientId = selectedViewConfigClientId; Daniel@0: } Daniel@0: // Daniel@0: // // entity headers Daniel@0: // var selectionChanged = false; Daniel@0: // selectionChanged = true; Daniel@0: // if (_this._cachedSelectedEntityConfigClientId) { Daniel@0: // $(_this._cachedEntityHeaderViewsByClientId[_this._cachedSelectedEntityConfigClientId]) Daniel@0: // .toggleSelected(false); Daniel@0: // } Daniel@0: // if (newSelectedEntityConfigClientId) { Daniel@0: // $(_this._cachedEntityHeaderViewsByClientId[newSelectedEntityConfigClientId]) Daniel@0: // .toggleSelected(true); Daniel@0: // } Daniel@0: // _this._cachedSelectedEntityConfigClientId = newSelectedEntityConfigClientId; Daniel@0: // }; Daniel@0: // Daniel@0: // // view headers Daniel@0: // if (_this._cachedSelectedViewConfigClientId !== newSelectedViewConfigClientId) { Daniel@0: // selectionChanged = true; Daniel@0: // if (_this._cachedSelectedViewConfigClientId) { Daniel@0: // $(_this._cachedViewHeaderViewsByClientId[_this._cachedSelectedViewConfigClientId]) Daniel@0: // .toggleSelected(false); Daniel@0: // } Daniel@0: // if (newSelectedViewConfigClientId) { Daniel@0: // $(_this._cachedViewHeaderViewsByClientId[newSelectedViewConfigClientId]) Daniel@0: // .toggleSelected(true); Daniel@0: // } Daniel@0: // _this._cachedSelectedViewConfigClientId = newSelectedViewConfigClientId; Daniel@0: // }; Daniel@0: }, Daniel@0: Daniel@0: scrollAccordingToSelection: function(deep, instant) { Daniel@0: var _this = this; Daniel@0: Daniel@0: return; Daniel@0: var entityConfigClientId = _this._cachedSelectedEntityConfigClientId; Daniel@0: var viewConfigClientId = _this._cachedSelectedViewConfigClientId; Daniel@0: Daniel@0: var dimensions = { Daniel@0: left: 0, Daniel@0: top: 0, Daniel@0: width: 0, Daniel@0: height: 0 Daniel@0: }; Daniel@0: Daniel@0: if (entityConfigClientId) { Daniel@0: dimensions.left = parseInt(_this._cachedEntityHeaderViewsByClientId[entityConfigClientId].el.getAttribute("data-left"), 10); Daniel@0: dimensions.width = parseInt(_this._cachedEntityHeaderViewsByClientId[entityConfigClientId].el.getAttribute("data-width"), 10); Daniel@0: } Daniel@0: if (viewConfigClientId) { Daniel@0: dimensions.top = parseInt(_this._cachedViewHeaderViewsByClientId[viewConfigClientId].el.getAttribute("data-top"), 10); Daniel@0: dimensions.height = parseInt(_this._cachedViewHeaderViewsByClientId[viewConfigClientId].el.getAttribute("data-total-height"), 10); Daniel@0: } Daniel@0: var desiredPaddingAroundVisInstanceOnScroll = _this.options.desiredPaddingAroundVisInstanceOnScroll; Daniel@0: var spacePadding = _this._spacePadding; Daniel@0: Daniel@0: var targetScrollRange = { Daniel@0: leftMax: dimensions.left - desiredPaddingAroundVisInstanceOnScroll.left, Daniel@0: topMax: dimensions.top - desiredPaddingAroundVisInstanceOnScroll.top - _this._viewHeaderHeight, Daniel@0: leftMin: dimensions.left + desiredPaddingAroundVisInstanceOnScroll.right + dimensions.width - _this._$containerOfScrollable[0].clientWidth + spacePadding.left, Daniel@0: topMin: dimensions.top + desiredPaddingAroundVisInstanceOnScroll.bottom + dimensions.height - _this._$containerOfScrollable[0].clientHeight + spacePadding.top Daniel@0: }; Daniel@0: Daniel@0: var currentScroll = { Daniel@0: left: (_this._scrollLeftBeforeLatestLayoutUpdate == null ? _this._$containerOfScrollable.scrollLeft() : _this._scrollLeftBeforeLatestLayoutUpdate), Daniel@0: top: (_this._scrollTopBeforeLatestLayoutUpdate == null ? _this._$containerOfScrollable.scrollTop() : _this._scrollTopBeforeLatestLayoutUpdate) Daniel@0: }; Daniel@0: Daniel@0: var targetScrollLeft = currentScroll.left; Daniel@0: var targetScrollTop = currentScroll.top; Daniel@0: Daniel@0: if (_this._latestChangeWasAReset) { Daniel@0: _this._cachedScrollPosSelection = null; Daniel@0: targetScrollLeft = 0; Daniel@0: targetScrollTop = 0; Daniel@0: } Daniel@0: Daniel@0: var currentGridHash = _this.getEntityWidth() + "~" + _this._cachedEntityConfigClientIds.join("|") + "~" + _this._cachedViewConfigClientIds.join("|"); Daniel@0: //_this._logger.debug("scrollAccordingToSelection[1]:", _this._cachedScrollPosGridHash === currentGridHash, _this._cachedScrollPosGridHash, currentGridHash); Daniel@0: //_this._logger.debug("scrollAccordingToSelection[2]:", _this._cachedScrollPosSelection === "" + entityConfigClientId + viewConfigClientId, _this._cachedScrollPosSelection, "" + entityConfigClientId + viewConfigClientId); Daniel@0: if (_this._cachedScrollPosGridHash === currentGridHash Daniel@0: && _this._cachedScrollPosSelection === "" + entityConfigClientId + viewConfigClientId) { Daniel@0: targetScrollLeft = _this._cachedScrollPosX; Daniel@0: targetScrollTop = _this._cachedScrollPosY; Daniel@0: _this._cachedScrollPosSelection = ""; Daniel@0: } else { Daniel@0: if (!_this._ignoreXOnNextScroll) { Daniel@0: if (targetScrollLeft < targetScrollRange.leftMin) { Daniel@0: targetScrollLeft = targetScrollRange.leftMin; Daniel@0: } Daniel@0: if (targetScrollLeft > targetScrollRange.leftMax) { Daniel@0: targetScrollLeft = targetScrollRange.leftMax; Daniel@0: } Daniel@0: } Daniel@0: if (!_this._ignoreYOnNextScroll) { Daniel@0: if (targetScrollTop < targetScrollRange.topMin) { Daniel@0: targetScrollTop = targetScrollRange.topMin; Daniel@0: } Daniel@0: if (targetScrollTop > targetScrollRange.topMax) { Daniel@0: targetScrollTop = targetScrollRange.topMax; Daniel@0: } Daniel@0: } Daniel@0: if (targetScrollLeft < 0) { Daniel@0: targetScrollLeft = 0; Daniel@0: } Daniel@0: if (targetScrollTop < 0) { Daniel@0: targetScrollTop = 0; Daniel@0: } Daniel@0: } Daniel@0: Daniel@0: var scrollDiffX = targetScrollLeft - currentScroll.left; Daniel@0: var scrollDiffY = targetScrollTop - currentScroll.top; Daniel@0: Daniel@0: if (!entityConfigClientId && !viewConfigClientId && !_this._latestChangeWasAReset) { Daniel@0: _this._updateCachedScroll(); Daniel@0: } else if (instant || _this._latestChangeWasAReset) { Daniel@0: _this._$containerOfScrollable.stop(true, true); Daniel@0: _this._$containerOfScrollable.scrollLeft(targetScrollLeft); Daniel@0: _this._$containerOfScrollable.scrollTop (targetScrollTop); Daniel@0: _this._updateCachedScroll(); Daniel@0: _this._reviseSpaceSize(); Daniel@0: } else { Daniel@0: _this._$containerOfScrollable.stop(true, false); Daniel@0: if (_this._scrollLeftBeforeLatestLayoutUpdate !== null) { Daniel@0: _this._$containerOfScrollable.scrollLeft(_this._scrollLeftBeforeLatestLayoutUpdate); Daniel@0: _this._$containerOfScrollable.scrollTop (_this. _scrollTopBeforeLatestLayoutUpdate); Daniel@0: } Daniel@0: _this._$containerOfScrollable.animate( Daniel@0: {"scrollLeft": targetScrollLeft, "scrollTop": targetScrollTop}, Daniel@0: _this.options.scrollAnimationMinSpeed + Math.min(Math.max(Math.abs(scrollDiffX), Math.abs(scrollDiffY)), _this.options.scrollAnimationBaseDistance) / _this.options.scrollAnimationBaseDistance * _this.options.scrollAnimationBaseSpeed, Daniel@0: function() { Daniel@0: _this._reviseSpaceSize(); Daniel@0: }); Daniel@0: } Daniel@0: _this._ignoreXOnNextScroll = false; Daniel@0: _this._ignoreYOnNextScroll = false; Daniel@0: }, Daniel@0: Daniel@0: /** Daniel@0: * Returns the positions of the currently selected items Daniel@0: * relative to the top-left corner of the top-left view Daniel@0: */ Daniel@0: getPositionsOfSelectedHeaders: function() { Daniel@0: var _this = this; Daniel@0: Daniel@0: var result = []; Daniel@0: Daniel@0: var selectedEntityHeaderView = _this._cachedEntityHeaderViewsByClientId[_this._cachedSelectedEntityConfigClientId]; Daniel@0: var selectedViewHeaderView = _this._cachedViewHeaderViewsByClientId [_this._cachedSelectedViewConfigClientId]; Daniel@0: Daniel@0: if (selectedEntityHeaderView) { Daniel@0: var $selectedEntityHeader = selectedEntityHeaderView.$el; Daniel@0: result.push(parseInt($selectedEntityHeader.css("left"), 10) - _this._$containerOfScrollable.scrollLeft(), parseInt($selectedEntityHeader[0].style.width, 10)); Daniel@0: } else { Daniel@0: result.push(null, null); Daniel@0: } Daniel@0: Daniel@0: if (selectedViewHeaderView) { Daniel@0: var $selectedViewHeader = selectedViewHeaderView.$el; Daniel@0: result.push(parseInt($selectedViewHeader.css("top"), 10) - _this._$containerOfScrollable.scrollTop(), _this._viewHeaderHeight); Daniel@0: } else { Daniel@0: result.push(null, null); Daniel@0: } Daniel@0: Daniel@0: return result; Daniel@0: }, Daniel@0: Daniel@0: _updateCachedScroll: function() { Daniel@0: var _this = this; Daniel@0: Daniel@0: _this._cachedScrollPosGridHash = _this.getEntityWidth() + "~" + _this._cachedEntityConfigClientIds.join("|") + "~" + _this._cachedViewConfigClientIds.join("|"); Daniel@0: _this._cachedScrollPosSelection = "" + _this._cachedSelectedEntityConfigClientId + _this._cachedSelectedViewConfigClientId; Daniel@0: _this._cachedScrollPosX = _this._$containerOfScrollable.scrollLeft(); Daniel@0: _this._cachedScrollPosY = _this._$containerOfScrollable.scrollTop(); Daniel@0: Daniel@0: //_this._logger.debug(_.str.sprintf("ConfigGridCellsView[%s]._updateCachedScroll()", _this.options.configGrid.getType()), _this._cachedScrollPosGridHash, _this._cachedScrollPosSelection, _this._cachedScrollPosX, _this._cachedScrollPosY); Daniel@0: }, Daniel@0: Daniel@0: _toggleFixedHeadersIfNeeded: function(trueOrFalse) { Daniel@0: //trueOrFalse = true; Daniel@0: var _this = this; Daniel@0: if (_this.options.enableFixedHeaders && trueOrFalse == true) { Daniel@0: //_this._logger.debug("_toggleFixedHeadersIfNeeded(true)"); Daniel@0: if (!_this._$containerOfFixed[0].childNodes.length) { Daniel@0: _this._$containerOfFixed.append(_this._$visInstancesContainer, _this._$entityHeadersContainer, _this._$viewHeadersContainer, _this._$cornerBlind); Daniel@0: //_this._$containerOfFixed.append(_this._$entityHeadersContainer, _this._$viewHeadersContainer, _this._$cornerBlind); Daniel@0: _this._$cornerBlind.css({"transform": "translate(0px, 0px)"}); Daniel@0: _this._$containerOfFixed.show(); Daniel@0: } Daniel@0: } else { Daniel@0: //_this._logger.debug("_toggleFixedHeadersIfNeeded(false)"); Daniel@0: _this._$containerOfFixed.hide(); Daniel@0: _this._$space.append(_this._$visInstancesContainer, _this._$entityHeadersContainer, _this._$viewHeadersContainer, _this._$cornerBlind); Daniel@0: //_this._$space.append(_this._$entityHeadersContainer, _this._$viewHeadersContainer, _this._$cornerBlind); Daniel@0: _this._$entityHeadersBlind.css({"transform": "translate(0px, 0px)"}); Daniel@0: _this._$visInstancesContainer.css({"transform": "translate(0px, 0px)"}); Daniel@0: Daniel@0: } Daniel@0: _this._adjustToScrollPos(); Daniel@0: }, Daniel@0: Daniel@0: _adjustToScrollPos: function() { Daniel@0: var _this = this; Daniel@0: if (_this._scrollLeftBeforeLatestLayoutUpdate !== null) { Daniel@0: _this._scrollLeftBeforeLatestLayoutUpdate = null; Daniel@0: _this._scrollTopBeforeLatestLayoutUpdate = null; Daniel@0: } Daniel@0: Daniel@0: var scrollLeft = _this._$containerOfScrollable.scrollLeft(); Daniel@0: var scrollTop = _this._$containerOfScrollable.scrollTop(); Daniel@0: if (_this._$containerOfFixed[0].childNodes.length) { Daniel@0: _this._$entityHeadersContainer.css({"transform": "translate(" + (-scrollLeft) + "px, 0px)"}); Daniel@0: _this._$entityHeadersBlind.css({"transform": "translate(" + scrollLeft + "px, 0px)"}); Daniel@0: _this._$visInstancesContainer.css({"transform": "translate(" + (-scrollLeft) + "px, " + (-scrollTop) + "px)"}); Daniel@0: _this._$viewHeadersContainer.css({"transform": "translate(0px, " + (-scrollTop) + "px)"}); Daniel@0: } else { Daniel@0: _this._$entityHeadersContainer.css({"transform": "translate(0, " + scrollTop + "px)"}); Daniel@0: _this._$viewHeadersContainer.css({"transform": "translate(" + scrollLeft + "px, 0)"}); Daniel@0: _this._$cornerBlind.css({"transform": "translate(" + scrollLeft + "px, " + scrollTop + "px)"}); Daniel@0: } Daniel@0: Daniel@0: _this._reportPositionsOfSelectedHeaders(); Daniel@0: }, Daniel@0: Daniel@0: _reportPositionsOfSelectedHeaders: function() { Daniel@0: var _this = this; Daniel@0: Daniel@0: var positionsOfSelectedHeaders = _this.getPositionsOfSelectedHeaders(); Daniel@0: _this.trigger("change-positions-of-selected-headers", positionsOfSelectedHeaders[0], positionsOfSelectedHeaders[1], positionsOfSelectedHeaders[2], positionsOfSelectedHeaders[3]); Daniel@0: }, Daniel@0: Daniel@0: Daniel@0: _reviseSpaceSize: function(increaseOnly) { Daniel@0: var _this = this; Daniel@0: Daniel@0: var elInnerWidth = _this._$containerOfScrollable[0].clientWidth; Daniel@0: var elInnerHeight = _this._$containerOfScrollable[0].clientHeight; Daniel@0: var elScrollLeft = _this._$containerOfScrollable.scrollLeft(); Daniel@0: var elScrollTop = _this._$containerOfScrollable.scrollTop(); Daniel@0: var spaceWidth = _this._cachedMinSpaceWidth; Daniel@0: var spaceHeight = _this._cachedMinSpaceHeight; Daniel@0: Daniel@0: var missingWidth = elScrollLeft + elInnerWidth - _this._spacePadding.h - spaceWidth; Daniel@0: var missingHeight = elScrollTop + elInnerHeight - _this._spacePadding.v - spaceHeight; Daniel@0: Daniel@0: spaceWidth += Math.max(0, missingWidth); Daniel@0: spaceHeight += Math.max(0, missingHeight); Daniel@0: Daniel@0: if (!increaseOnly || (spaceWidth >= _this._$space.width() && spaceHeight >= _this._$space.height())) { Daniel@0: _this._$space.css({ Daniel@0: "width": spaceWidth, Daniel@0: "height": spaceHeight Daniel@0: }); Daniel@0: _this._$viewHeadersBlind.height(spaceHeight); Daniel@0: } Daniel@0: }, Daniel@0: Daniel@0: _updateDemensionsForContainerOfFixed: function() { Daniel@0: var _this = this; Daniel@0: _this._$containerOfFixed.width(_this._$containerOfScrollable[0].clientWidth); Daniel@0: _this._$containerOfFixed.height(_this._$containerOfScrollable[0].clientHeight); Daniel@0: }, Daniel@0: Daniel@0: _generateEntityHeaderView: function(entityConfig) { Daniel@0: var _this = this; Daniel@0: Daniel@0: var $el = $.bem.generateElement("config-grid-cells", "entity-header"); Daniel@0: Daniel@0: var result = new App.MainRegionModule.ConfigHeaderView({ Daniel@0: dimension: "entity", Daniel@0: el: $el, Daniel@0: state: _this.options.state, Daniel@0: configGrid: _this.options.configGrid, Daniel@0: config: entityConfig, Daniel@0: parentConfigGridView: _this.options.parentConfigGridView Daniel@0: }); Daniel@0: Daniel@0: result.$el.dblclick(function() { Daniel@0: if (entityConfig.getParameterValue("kind")) { Daniel@0: return; Daniel@0: } Daniel@0: if (_this.options.configGrid.getSelectedEntityConfig() == entityConfig) { Daniel@0: _this.options.configGrid.addEntityAndSelectIt(new App.ContextModule.Config({ Daniel@0: parameters: { Daniel@0: "kind": "pair", Daniel@0: "comparisonMode": "superposition" Daniel@0: } Daniel@0: }), _this.options.configGrid.getNextEntityNeighbour(entityConfig)) ; Daniel@0: } Daniel@0: }); Daniel@0: Daniel@0: return result; Daniel@0: }, Daniel@0: Daniel@0: _generateViewHeaderView: function(viewConfig) { Daniel@0: var _this = this; Daniel@0: Daniel@0: var $el = $.bem.generateElement("config-grid-cells", "view-header"); Daniel@0: Daniel@0: var result = new App.MainRegionModule.ConfigHeaderView({ Daniel@0: dimension: "view", Daniel@0: el: $el, Daniel@0: state: _this.options.state, Daniel@0: configGrid: _this.options.configGrid, Daniel@0: config: viewConfig, Daniel@0: parentConfigGridView: _this.options.parentConfigGridView Daniel@0: }); Daniel@0: Daniel@0: return result; Daniel@0: }, Daniel@0: Daniel@0: _generateVisInstanceView: function(entityConfig, viewConfig) { Daniel@0: var _this = this; Daniel@0: Daniel@0: var $el = $.bem.generateElement("config-grid-cells", "vis-instance").addClass("vis-instance"); Daniel@0: Daniel@0: var result = new App.MainRegionModule.VisInstanceView({ Daniel@0: el: $el, Daniel@0: state: _this.options.state, Daniel@0: configGrid: _this.options.configGrid, Daniel@0: entityConfig: entityConfig, Daniel@0: viewConfig: viewConfig, Daniel@0: parentConfigGridView: _this.options.parentConfigGridView Daniel@0: }); Daniel@0: Daniel@0: return result; Daniel@0: } Daniel@0: }); Daniel@0: }, Logger);