blob: 8447bc9ae599d37f3525619d2dab44c07f24d39f [file] [log] [blame]
// Copyright (c) 2000-2017 Ericsson Telecom AB //
// 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 //
///////////////////////////////////////////////////////////////////////////////////////////////////////
function CView_Aligner(p_viewmodels, p_mainId, p_parentId, p_data) {
"use strict";
/** constructor */
var v_mainId = p_mainId;
var v_parentId = p_parentId;
var v_viewmodel = ViewUtils.getViewmodelsFromExpectedInterface(p_viewmodels, CView_Aligner)[0];
var v_conditionViewmodel = ViewUtils.getViewmodelsFromExpectedInterface(p_viewmodels, CView_Aligner)[1];
var v_customData = p_data;
var v_subTotalSize;
var v_this = this;
/** public functions */
this.applicationCreated = function() {
var orientation = getOrientation();
if (!v_customData.existing) {
$("#" + v_parentId).append(getHtml(orientation));
}
setupCallbacks(orientation);
};
this.refresh = function() {
ViewUtils.checkVisibility(v_conditionViewmodel, v_mainId);
};
/** private functions */
function getOrientation() {
if (v_customData.orientation != undefined && v_customData.orientation.toLowerCase() == "vertical") {
return "Vertical";
} else {
return "Horizontal";
}
}
function getHtml(orientation) {
var html = '<div class="Aligner" id="' + v_mainId + '">';
var lengths = getLengths();
for (var i = 0; i < v_customData.idsCreating.length; ++i) {
html += getHtmlOfContent(i, orientation, lengths);
}
html += '</div>';
return html;
}
function getHtmlOfContent(contentIndex, orientation, lengths) {
var html = '';
html += '<div id="' + v_customData.idsCreating[contentIndex] + '" class="Aligner_' + orientation + '_Content"';
if (orientation == "Vertical" && lengths[contentIndex] != "") {
html += ' style="height: ' + lengths[contentIndex] + ';"';
} else if (lengths[contentIndex] != "") {
html += ' style="width: ' + lengths[contentIndex] + ';"';
}
html += '></div>';
return html;
}
/** protected functions */
this.getLenghtsFromViewmodel = function() {
if (v_viewmodel != undefined && v_viewmodel.getChildSizes != undefined) {
return v_viewmodel.getChildSizes(v_customData.idsCreating);;
} else {
return undefined;
}
};
/** private functions */
function getLengths() {
var lengths;
if (v_customData.flexCalculation == true || v_customData.resizable == true) {
lengths = v_this.getLenghtsFromViewmodel();
if (lengths == undefined) {
lengths = [];
var unitPercent = (100 / v_customData.idsCreating.length) + "%";
for (var i = 0; i < v_customData.idsCreating.length; ++i) {
lengths.push(unitPercent);
}
}
return lengths;
} else {
lengths = [];
for (var i = 0; i < v_customData.idsCreating.length; ++i) {
lengths.push("");
}
}
return lengths;
};
function setupCallbacks(orientation) {
if (v_customData.resizable == true) {
var resizables = $("#" + p_mainId + " > div");
var options;
var cssToSet;
if (orientation == "Vertical") {
cssToSet = "height";
options = {
handles: "s",
start: function(event, ui){
v_subTotalSize = ui.originalSize.height + ui.originalElement.next().outerHeight();
},
stop: function(event, ui){
var cellPercentHeight = 100 * ui.originalElement.outerHeight(true) / $("#" + v_mainId).height();
ui.originalElement.height(cellPercentHeight + '%');
var nextCell = ui.originalElement.next();
var nextPercentHeight = 100 * ($("#" + v_mainId).outerHeight() - getHeight(ui)) / $("#" + v_mainId).height();
nextCell.height(nextPercentHeight + '%');
ui.originalElement.trigger("resize");
ui.originalElement.next().trigger("resize");
},
resize: function(event, ui){
if (v_subTotalSize - ui.size.height < 10) {
ui.size.height = v_subTotalSize - 10;
}
ui.originalElement.next().height($("#" + v_mainId).height() - getHeight(ui));
// the resize triggers a resize event automatically on the original element here, but not in the stop function
ui.originalElement.next().trigger("resize");
}
};
} else {
cssToSet = "width";
options = {
handles: "e",
start: function(event, ui){
v_subTotalSize = ui.originalSize.width + ui.originalElement.next().outerWidth();
},
stop: function(event, ui){
var cellPercentWidth = 100 * ui.originalElement.outerWidth(true) / $("#" + v_mainId).width();
ui.originalElement.width(cellPercentWidth + '%');
var nextCell = ui.originalElement.next();
var nextPercentWidth = 100 * ($("#" + v_mainId).width() - getWidth(ui)) / $("#" + v_mainId).width();
nextCell.width(nextPercentWidth + '%');
ui.originalElement.trigger("resize");
ui.originalElement.next().trigger("resize");
},
resize: function(event, ui){
if (v_subTotalSize - ui.size.width < 10) {
ui.size.width = v_subTotalSize - 10;
}
ui.originalElement.next().width($("#" + v_mainId).width() - getWidth(ui));
ui.originalElement.next().trigger("resize");
}
};
}
for (var i = 0; i < resizables.length - 1; ++i) {
$(resizables[i]).resizable(options);
}
}
};
function getWidth(ui) {
var width = 0;
$("#" + v_mainId + " > div").each(function() {
if ($(this)[0] == ui.originalElement[0]) {
width += ui.size.width;
}
else if ($(this)[0] != ui.originalElement.next()[0]) {
width += $(this).outerWidth(true);
}
});
return width;
}
function getHeight(ui) {
var height = 0;
$("#" + v_mainId + " > div").each(function() {
if ($(this)[0] == ui.originalElement[0]) {
height += ui.size.height;
}
else if ($(this)[0] != ui.originalElement.next()[0]) {
height += $(this).outerHeight(true);
}
});
return height;
}
}
CView_Aligner.getHelp = function() {
return "An aligner that aligns connected views either horizontally or vertically.\n" +
"It can calculate the width or height of its child views from flex if a flexAligner viewmodel is connected.\n";
};
CView_Aligner.expectsInterface = function() {
return [
{
"optional": ["getChildSizes"]
},
{
"optional": ["getState"]
}
];
};
CView_Aligner.getCustomDataSchema = function() {
var schema = {
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "Custom data for CView_Aligner",
"type": "object",
"properties": {
"orientation": {
"description": "The orientation of the aligner (default horizontal)",
"type": "string",
"enum": ["horizontal", "vertical"],
"default": "vertical"
},
"flexCalculation": {
"description": "Whether the aligner uses the subviews' flex to calculate the width / height of them",
"type": "boolean",
"format": "checkbox",
"default": true
},
"resizable": {
"description": "Whether the subviews can be resized",
"type": "boolean",
"format": "checkbox",
"default": true
},
"existing": {
"description": "Whether the html for the aligner already exists and does not need to be created",
"type": "boolean",
"format": "checkbox",
"default": true
}
},
"additionalProperties": false
};
$.extend(true, schema, ViewUtils.commonViewSchema);
return schema;
};
//# sourceURL=WebApplicationFramework\Views\View_Aligner.js