///////////////////////////////////////////////////////////////////////////
|
// Copyright © 2014 - 2018 Esri. All Rights Reserved.
|
//
|
// Licensed under the Apache License Version 2.0 (the "License");
|
// you may not use this file except in compliance with the License.
|
// You may obtain a copy of the License at
|
//
|
// http://www.apache.org/licenses/LICENSE-2.0
|
//
|
// 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.
|
///////////////////////////////////////////////////////////////////////////
|
|
define([
|
'dojo/_base/declare',
|
'dojo/_base/lang',
|
'dojo/_base/html',
|
'dijit/_WidgetBase'
|
],
|
function (declare, lang, html, _WidgetBase) {
|
|
return declare([_WidgetBase], {
|
baseClass: 'jimu-tile-container',
|
declaredClass: 'jimu.dijit.TileLayoutContainer',
|
|
/**
|
* Layout the items depends the strategy: fixWidth, breakWidth, fixCols
|
* fixWidth:
|
* the item width/height is px, if the container is not width enough, the item will
|
* flow to the next line.
|
* breakWidth:
|
* the item width/height is an array, like this:
|
* [{screenWidth: 600, width: 100, height: 200}],
|
* the order is by screen width
|
* fixCols:
|
* set the max cols, and the container will resize the item's width to fit the container.
|
*
|
* options:
|
* stragety: fixWidth, breakWidth, fixCols
|
* itemSize: [] or {}
|
* each object is:
|
* screenWidth: 600
|
* width: 100
|
* height: 200 or 10%
|
* maxCols:
|
* items: [ResizableNode]
|
**/
|
constructor: function(){
|
this.items = [];
|
this.hmargin = 15;
|
this.vmargin = 15;
|
},
|
|
startup: function(){
|
this.inherited(arguments);
|
this.items.forEach(lang.hitch(this, function(item){
|
this._placeItem(item);
|
}));
|
this.resize();
|
},
|
|
_placeItem: function(item){
|
if(item.domNode){
|
html.place(item.domNode, this.domNode);
|
}else{
|
html.place(item, this.domNode);
|
}
|
},
|
|
addItem: function(item){
|
this.items.push(item);
|
this._placeItem(item);
|
this.resize();
|
},
|
|
addItems: function(items){
|
this.items = this.items.concat(items);
|
this.items.forEach(lang.hitch(this, function(item){
|
this._placeItem(item);
|
}));
|
this.resize();
|
},
|
|
removeItem: function(itemLabel){
|
var i;
|
for(i = 0; i < this.items.length; i++){
|
if(this.items[i].label === itemLabel){
|
if(this.items[i].domNode){
|
this.items[i].destroy();
|
}else{
|
html.destroy(this.items[i]);
|
}
|
this.items.splice(i, 1);
|
this.resize();
|
return;
|
}
|
}
|
},
|
|
empty: function(){
|
var i;
|
for(i = 0; i < this.items.length; i++){
|
if(this.items[i].domNode){
|
this.items[i].destroy();
|
}else{
|
html.destroy(this.items[i]);
|
}
|
}
|
this.items = [];
|
},
|
|
resize: function(){
|
var box, itemSize, cpr;
|
box = html.getMarginBox(this.domNode);
|
|
itemSize = this.getItemSize(box);
|
cpr = Math.floor((box.w + this.hmargin) / (itemSize.width + this.hmargin));
|
|
this.items.forEach(lang.hitch(this, function(item, i){
|
this.setItemPosition(item, i, itemSize, cpr);
|
}));
|
},
|
|
getItemSize: function(box){
|
var size = {}, i;
|
if(this.strategy === 'fixWidth'){
|
size.width = this.itemSize.width;
|
size.height = this.itemSize.height;
|
}else if(this.strategy === 'breakWidth'){
|
for(i = 0; i < this.itemSize.length; i++){
|
if(box.w <= this.itemSize[i].screenWidth){
|
size.width = this.itemSize[i].width;
|
size.height = this.itemSize[i].height;
|
break;
|
}
|
}
|
}else if(this.strategy === 'fixCols'){
|
size.width = (box.w - this.hmargin * (this.maxCols - 1)) / this.maxCols;
|
if(typeof this.itemSize.height === 'number'){
|
size.height = this.itemSize.height;
|
}else{
|
size.height = size.width *
|
parseFloat(this.itemSize.height.substring(0, this.itemSize.height.length - 1)) / 100;
|
}
|
}
|
return size;
|
},
|
|
setItemPosition: function(item, i, itemSize, cpr){
|
i++;
|
var col = i % cpr;
|
var row = Math.ceil(i / cpr);
|
|
if(col === 0){
|
col = cpr;
|
}
|
var itemStyle = {
|
position: 'absolute',
|
top: ((this.vmargin + itemSize.height) * (row - 1)) + 'px'
|
};
|
|
itemStyle[window.isRTL? 'right': 'left'] =
|
((this.hmargin + itemSize.width) * (col - 1)) + 'px';
|
|
if (itemSize.width >= 0){
|
itemStyle.width = itemSize.width + 'px';
|
}
|
if (itemSize.height >= 0){
|
itemStyle.height = itemSize.height + 'px';
|
}
|
html.setStyle(item.domNode? item.domNode: item, itemStyle);
|
}
|
|
});
|
});
|