/*
This file contains proprietary software owned by Motorola Mobility, Inc.
No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.
(c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved.
*/
var Montage = require("montage/core/core").Montage,
Component = require("montage/ui/component").Component;
exports.RuleListContainer = Montage.create(Component, {
_instanceToAdd : { value: null },
_appendElement : { value: null },
_lastDisplayedList : { value: null },
ruleListDrawn : { value: null },
_displayedList : { value: null },
displayedList : {
get: function() {
return this._displayedList;
},
set: function(list) {
this._lastDisplayedList = this._displayedList;
this._displayedList = list;
this.needsDraw = true;
}
},
displayListForSelection : {
value: function(selection) {
var list = this._getListForSelection(selection);
if(!list) {
list = this.add(selection);
}
this.displayedList = list;
}
},
//// Get the element containing list based on selection
_getListForSelection : {
value: function(selection) {
var i, list, matchesAll;
for(i = 0; i 1) {
matchesAll = selection.every(function(element, index, array) {
return list.selection.indexOf(element) !== -1;
});
if(matchesAll) {
break;
}
} else {
///// Selection (single element or stylesheet) is the same,
///// Use the existing rule list
if(list.selection[0] === selection[0]) {
break;
}
}
list = null;
}
return list;
}
},
//// Creates a new rule list to be added to the container
add : {
value: function(selection) {
var stylesController = this.application.ninja.stylesController,
instance = Montage.create(this.ruleListComponent),
container = document.createElement('div'),
rules, ruleListLog;
rules = this.getRulesForSelection(selection);
instance.rules = rules;
ruleListLog = {
selection: selection,
component : instance
};
this.ruleLists.push(ruleListLog);
this.ruleListsToDraw.push({
element : container,
component : instance
});
this.needsDraw = true;
return ruleListLog;
}
},
ruleListsToDraw : {
value: []
},
getRulesForSelection : {
value: function(selection) {
var rules;
if(selection.length > 1) {
rules = this.stylesController.getCommonRules(selection);
} else if(selection.length === 1) {
rules = this.stylesController.getMatchingRules(selection[0]);
///// Add inline style to rule list
rules.splice(0, 0, {
type : 'inline',
selectorText : 'element.style',
parentStyleSheet : 'Inline Style',
style : selection[0].style
});
}
return rules;
}
},
update : {
value: function() {
this.displayedList.component.rules = this.getRulesForSelection(this.displayedList.selection);
}
},
//// Array of lists that have been added to the container
//// Lists include selection type (element/stylesheet), and
//// the selection itself
ruleLists : {
value: [],
distinct: true
},
templateDidLoad : {
value: function() {
if(this.focusDelegate) {
this.ruleListComponent.focusDelegate = this.focusDelegate;
}
this.stylesController = this.application.ninja.stylesController;
}
},
willDraw : {
value: function() {
//// hide all rule lists
this.ruleLists.forEach(function(ruleListDescriptor) {
ruleListDescriptor.component.hide = true;
});
if(this.displayedList) {
this.displayedList.component.hide = false;
}
}
},
draw : {
value: function() {
this.ruleListsToDraw.forEach(function(ruleListDescriptor) {
this.element.appendChild(ruleListDescriptor.element);
ruleListDescriptor.component.element = ruleListDescriptor.element;
ruleListDescriptor.component.needsDraw = true;
}, this);
this.ruleListsToDraw.length = 0;
}
},
didDraw: {
value: function() {
if(this.ruleListDrawn === true) {
var stylesView = this.parentComponent.parentComponent;
stylesView.needsDraw = stylesView.hasStyles = true;
}
}
}
});