components.js
来自「在线编辑器」· JavaScript 代码 · 共 1,006 行 · 第 1/3 页
JS
1,006 行
getItemForPosition: function(pos) { pos.y += this.scrollTop; var y = this.getInsets().top; for (var i = 0; i < this.items.length; i++) { var h = this.heights[i]; if (pos.y >= y && pos.y <= y + h) return this.items[i]; y += h; } }, getRenderer: function(rctx) { this.renderer.attributes.text = rctx.item.toString(); this.renderer.style.font = this.style.font; this.renderer.style.color = this.style.color; this.renderer.selected = rctx.selected; this.renderer.item = rctx.item; return this.renderer; }, getRenderContext: function(item, row) { return { item: item, even: row % 2 == 0, selected: this.selected == item }; }, getRowHeight: function() { if (!this.rowHeight) { var d = this.d(); var firstItem = (this.items.length > 0) ? this.items[0] : undefined; if (firstItem) { var renderer = this.getRenderer(this.getRenderContext(firstItem, 0)); this.add(renderer); this.rowHeight = renderer.getPreferredHeight(d.b.w - d.i.w); this.remove(renderer); } } return this.rowHeight || 0; }, getScrollInfo: function() { return { scrollTop: this.scrollTop, scrollHeight: this.getRowHeight() * this.items.length } }, paint: function(ctx) { var d = this.d(); var paintHeight = Math.max(this.getScrollInfo().scrollHeight, d.b.h); var scrollInfo = this.getScrollInfo(); ctx.save(); ctx.translate(0, -this.scrollTop); try { if (this.style.backgroundColor) { ctx.fillStyle = this.style.backgroundColor; ctx.fillRect(0, 0, d.b.w, paintHeight); } if (this.style.backgroundColorOdd) { var rowHeight = this.rowHeight; if (!rowHeight) { var firstItem = (this.items.length > 0) ? this.items[0] : undefined; if (firstItem) { var renderer = this.getRenderer(this.getRenderContext(firstItem, 0)); this.add(renderer); rowHeight = renderer.getPreferredHeight(d.b.w - d.i.w); this.remove(renderer); } } if (rowHeight) { var y = d.i.t + rowHeight; ctx.fillStyle = this.style.backgroundColorOdd; while (y < paintHeight) { ctx.fillRect(d.i.l, y, d.b.w - d.i.w, rowHeight); y += rowHeight * 2; } } } if (this.items.length == 0) return; if (!this.renderer) { console.log("No renderer for List of type " + this.declaredClass + " with id " + this.id + "; cannot paint contents"); return; } this.heights = []; var y = d.i.t; for (var i = 0; i < this.items.length; i++) { var stamp = this.getRenderer(this.getRenderContext(this.items[i], i)); if (!stamp) break; this.add(stamp); var w = d.b.w - d.i.w; var h = (this.rowHeight) ? this.rowHeight : stamp.getPreferredHeight(w); this.heights.push(h); stamp.bounds = { x: 0, y: 0, height: h, width: w }; ctx.save(); ctx.translate(d.i.l, y); ctx.beginPath(); ctx.rect(0, 0, w, h); ctx.closePath(); ctx.clip(); stamp.paint(ctx); ctx.restore(); this.remove(stamp); y+= h; } } finally { ctx.restore(); } }});dojo.declare("th.components.HorizontalTree", th.Container, { constructor: function(parms) { if (!parms) parms = {}; if (!this.style.defaultSize) this.style.defaultSize = 150; this.attributes.orientation = th.HORIZONTAL; this.lists = []; this.splitters = []; }, setData: function(data) { for (var i = 0; i < this.lists.length; i++) { this.remove(this.lists[i]); this.remove(this.splitters[i]); this.bus.unbind(this.lists[i]); this.bus.unbind(this.splitters[i]); } this.lists = []; this.splitters = []; this.data = data; this.showChildren(null, data); }, ondragstart: function(e) { var splitterIndex = this.splitters.indexOf(e.thComponent); this.startSize = this.listWidths[splitterIndex]; }, ondrag: function(e) { var splitterIndex = this.splitters.indexOf(e.thComponent); var delta = (this.attributes.orientation == th.HORIZONTAL) ? e.currentPos.x - e.startPos.x : e.currentPos.y - e.startPos.y; this.listWidths[splitterIndex] = this.startSize + delta; this.render(); }, ondragstop: function(e) { delete this.startSize; }, updateData: function(parent, contents) { parent.contents = contents; if (this.getSelectedItem() == parent) { this.showChildren(parent, parent.contents); } }, showChildren: function(newItem, children) { if (this.details) { this.remove(this.details); delete this.details; } if (!dojo.isArray(children)) { // if it's not an array, assume it's a function that will load the children children(this.getSelectedPath(), this); this.render(); return; } if (!children || children.length == 0) return; var list = this.createList(children); list.id = "list " + (this.lists.length + 1); this.bus.bind("click", list, this.itemSelected, this); var tree = this; this.bus.bind("dblclick", list, function(e) { tree.bus.fire("dblclick", e, tree); }); this.lists.push(list); this.add(list); var splitter = new th.components.Splitter({ attributes: { orientation: th.HORIZONTAL }, scrollbar: new th.components.Scrollbar() }); splitter.scrollbar.style = this.style; splitter.scrollbar.scrollable = list; splitter.scrollbar.opaque = false; this.bus.bind("dragstart", splitter, this.ondragstart, this); this.bus.bind("drag", splitter, this.ondrag, this); this.bus.bind("dragstop", splitter, this.ondragstop, this); this.splitters.push(splitter); this.add(splitter); if (this.parent) this.render(); }, showDetails: function(item) { if (this.details) this.remove(this.details);// var panel = new Panel({ style: { backgroundColor: "white" } });// var label = new Label({ text: "Some details, please!" });// panel.add(label);// this.details = panel;// this.add(this.details); if (this.parent) this.repaint(); }, createList: function(items) { var list = new th.components.List({ items: items, style: this.style }); if (this.renderer) list.renderer = this.renderer; list.oldGetRenderer = list.getRenderer; list.getRenderer = function(rctx) { var label = list.oldGetRenderer(rctx); label.attributes.text = rctx.item.name; return label; } return list; }, getSelectedItem: function() { var selected = this.getSelectedPath(); if (selected.length > 0) return selected[selected.length - 1]; }, getSelectedPath: function() { var path = []; for (var i = 0; i < this.lists.length; i++) { if (this.lists[i].selected) { path.push(this.lists[i].selected); } else { break; } } return path; }, itemSelected: function(e) { var list = e.thComponent; // add check to ensure that list has an item selected; otherwise, bail if (!list.selected) return; var path = []; for (var i = 0; i < this.lists.length; i++) { path.push(this.lists[i].selected); if (this.lists[i] == list) break; } if (path.length < this.lists.length) { // user selected an item in a previous list; must ditch the subsequent lists var newlists = this.lists.slice(0, path.length); var newsplitters = this.splitters.slice(0, path.length); for (var z = path.length; z < this.lists.length; z++) { this.bus.unbind(this.lists[z]); this.bus.unbind(this.splitters[z]); this.remove(this.lists[z]); this.remove(this.splitters[z]); } this.lists = newlists; this.splitters = newsplitters; } // determine whether to display new list of children or details of selection var newItem = this.getItem(path); if (newItem && newItem.contents) { this.showChildren(newItem, newItem.contents); } else { this.showDetails(newItem); } }, getItem: function(pathToItem) { var items = this.data; var item; for (var i = 0; i < pathToItem.length; i++) { for (var z = 0; z < items.length; z++) { if (items[z] == pathToItem[i]) { item = items[z]; items = item.contents; break; } } } return item; }, layout: function() { var d = this.d(); var x = d.i.l; for (var i = 0; i < this.lists.length; i++) { var list = this.lists[i]; if (!this.listWidths) this.listWidths = []; if (!this.listWidths[i]) this.listWidths[i] = this.style.defaultSize; var w = this.listWidths[i]; list.bounds = { x: x, y: d.i.t, width: w, height: d.b.h - d.i.h }; x += w; var splitter = this.splitters[i]; w = splitter.getPreferredWidth(-1); splitter.bounds = { x: x, y: d.i.t, width: w, height: d.b.h - d.i.h }; x += w; } if (this.details) { this.details.bounds = { x: x, y: d.i.t, width: 150, height: d.b.h - d.i.h }; } }, paintSelf: function(ctx) { var d = this.d(); if (this.style.backgroundColor) { ctx.fillStyle = this.style.backgroundColor; ctx.fillRect(0, 0, d.b.w, d.b.h); } }});
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?