ListBox.js
3.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/**
* ListBox.js
*
* Released under LGPL License.
* Copyright (c) 1999-2015 Ephox Corp. All rights reserved
*
* License: http://www.tinymce.com/license
* Contributing: http://www.tinymce.com/contributing
*/
/**
* Creates a new list box control.
*
* @-x-less ListBox.less
* @class tinymce.ui.ListBox
* @extends tinymce.ui.MenuButton
*/
define("tinymce/ui/ListBox", [
"tinymce/ui/MenuButton",
"tinymce/ui/Menu"
], function(MenuButton, Menu) {
"use strict";
return MenuButton.extend({
/**
* Constructs a instance with the specified settings.
*
* @constructor
* @param {Object} settings Name/value object with settings.
* @setting {Array} values Array with values to add to list box.
*/
init: function(settings) {
var self = this, values, selected, selectedText, lastItemCtrl;
function setSelected(menuValues) {
// Try to find a selected value
for (var i = 0; i < menuValues.length; i++) {
selected = menuValues[i].selected || settings.value === menuValues[i].value;
if (selected) {
selectedText = selectedText || menuValues[i].text;
self.state.set('value', menuValues[i].value);
return true;
}
// If the value has a submenu, try to find the selected values in that menu
if (menuValues[i].menu) {
if (setSelected(menuValues[i].menu)) {
return true;
}
}
}
}
self._super(settings);
settings = self.settings;
self._values = values = settings.values;
if (values) {
if (typeof settings.value != "undefined") {
setSelected(values);
}
// Default with first item
if (!selected && values.length > 0) {
selectedText = values[0].text;
self.state.set('value', values[0].value);
}
self.state.set('menu', values);
}
self.state.set('text', settings.text || selectedText);
self.classes.add('listbox');
self.on('select', function(e) {
var ctrl = e.control;
if (lastItemCtrl) {
e.lastControl = lastItemCtrl;
}
if (settings.multiple) {
ctrl.active(!ctrl.active());
} else {
self.value(e.control.value());
}
lastItemCtrl = ctrl;
});
},
/**
* Getter/setter function for the control value.
*
* @method value
* @param {String} [value] Value to be set.
* @return {Boolean/tinymce.ui.ListBox} Value or self if it's a set operation.
*/
bindStates: function() {
var self = this;
function activateMenuItemsByValue(menu, value) {
if (menu instanceof Menu) {
menu.items().each(function(ctrl) {
if (!ctrl.hasMenus()) {
ctrl.active(ctrl.value() === value);
}
});
}
}
function getSelectedItem(menuValues, value) {
var selectedItem;
if (!menuValues) {
return;
}
for (var i = 0; i < menuValues.length; i++) {
if (menuValues[i].value === value) {
return menuValues[i];
}
if (menuValues[i].menu) {
selectedItem = getSelectedItem(menuValues[i].menu, value);
if (selectedItem) {
return selectedItem;
}
}
}
}
self.on('show', function(e) {
activateMenuItemsByValue(e.control, self.value());
});
self.state.on('change:value', function(e) {
var selectedItem = getSelectedItem(self.state.get('menu'), e.value);
if (selectedItem) {
self.text(selectedItem.text);
} else {
self.text(self.settings.text);
}
});
return self._super();
}
});
});