Annotation of kupuMPIWG/common/kupuinspector.js, revision 1.1
1.1 ! dwinter 1: /*****************************************************************************
! 2: *
! 3: * Copyright (c) 2003-2005 Kupu Contributors. All rights reserved.
! 4: *
! 5: * This software is distributed under the terms of the Kupu
! 6: * License. See LICENSE.txt for license text. For a list of Kupu
! 7: * Contributors see CREDITS.txt.
! 8: *
! 9: *****************************************************************************/
! 10:
! 11: // $Id: kupuinspector.js 9879 2005-03-18 12:04:00Z yuppie $
! 12:
! 13: /* The Kupu Inspector tool
! 14:
! 15: An Kupu Tool (plugin) that will can be used to show and set attributes
! 16: on elements. It will show a list of the current element and all of its
! 17: parents (starting with the body element and working to the current one)
! 18: with input fields for a default set of attributes and, if defined, a
! 19: set for that particular element type.
! 20: */
! 21:
! 22: //----------------------------------------------------------------------------
! 23: // Helper classes
! 24: //----------------------------------------------------------------------------
! 25:
! 26: function Panel() {
! 27: /* the container (user interface element) of the elements */
! 28: this.elements = new Array();
! 29:
! 30: this.element = document.createElement('table');
! 31: this.element.style.width = '100%';
! 32: this.tbody = document.createElement('tbody');
! 33: this.element.appendChild(this.tbody);
! 34:
! 35: this.addElement = function(element) {
! 36: this.elements.push(element);
! 37: for (var i=0; i < element.nodes.length; i++) {
! 38: this.tbody.appendChild(element.nodes[i]);
! 39: };
! 40: };
! 41: };
! 42:
! 43: function Element(node, panel, visibility) {
! 44: /* an element in the panel (reflecting an element in the document) */
! 45: this.panel = panel;
! 46: this.node = node;
! 47: this.nodes = new Array();
! 48: this.default_visibility = visibility;
! 49:
! 50: // create a header
! 51: var labelrow = document.createElement('tr');
! 52: var labelcell = document.createElement('th');
! 53: labelcell.style.textDecoration = 'underline';
! 54: labelcell.style.cursor = 'default';
! 55: labelcell.setAttribute('colSpan', '2');
! 56: labelrow.appendChild(labelcell);
! 57: var nodename = node.nodeName.toLowerCase();
! 58: var labeltext = document.createTextNode(nodename);
! 59: labelcell.appendChild(labeltext);
! 60:
! 61: this.nodes.push(labelrow);
! 62:
! 63: this._displayvar = _SARISSA_IS_IE ? 'block' : 'table-row';
! 64:
! 65: this.addAttribute = function(attr) {
! 66: /* add an attribute */
! 67:
! 68: function changeHandler() {
! 69: var name = this.getAttribute('name');
! 70: var value = this.value;
! 71: if (name == 'className') {
! 72: this.element.className = value;
! 73: } else {
! 74: this.element.setAttribute(name, value);
! 75: };
! 76: };
! 77:
! 78: var row = document.createElement('tr');
! 79: var style = this.default_visibility ? this._displayvar : 'none';
! 80: row.style.display = style;
! 81: var labelcell = document.createElement('td');
! 82: labelcell.style.fontSize = '10px';
! 83: row.appendChild(labelcell);
! 84: var text = document.createTextNode(attr + ': ');
! 85: labelcell.appendChild(text);
! 86: labelcell.style.color = 'blue';
! 87: var inputcell = document.createElement('td');
! 88: inputcell.setAttribute('width', '100%');
! 89: row.appendChild(inputcell);
! 90: var input = document.createElement('input');
! 91: input.setAttribute('type', 'text');
! 92: input.setAttribute('value', attr == 'className' ? node.className : node.getAttribute(attr));
! 93: input.setAttribute('name', attr);
! 94: input.style.width = "100%";
! 95: input.element = this.node;
! 96: addEventHandler(input, 'change', changeHandler, input);
! 97: inputcell.appendChild(input);
! 98: this.nodes.push(row);
! 99: };
! 100:
! 101: this.addStyle = function(stylename) {
! 102: var row = document.createElement('tr');
! 103: var style = this.default_visibility ? this._displayvar : 'none';
! 104: row.style.display = style;
! 105: var labelcell = document.createElement('td');
! 106: labelcell.style.fontSize = '10px';
! 107: row.appendChild(labelcell);
! 108: var text = document.createTextNode(stylename + ': ');
! 109: labelcell.appendChild(text);
! 110: labelcell.style.color = 'red';
! 111: var inputcell = document.createElement('td');
! 112: //inputcell.setAttribute('width', '100%');
! 113: row.appendChild(inputcell);
! 114: var input = document.createElement('input');
! 115: input.setAttribute('type', 'text');
! 116: input.setAttribute('value', node.style[stylename]);
! 117: input.setAttribute('name', stylename);
! 118: input.style.width = "100%";
! 119: input.element = this.node;
! 120: addEventHandler(input, 'change', function() {this.element.style[this.getAttribute('name')] = this.value}, input);
! 121: inputcell.appendChild(input);
! 122: this.nodes.push(row);
! 123: };
! 124:
! 125: this.setVisibility = function(visibility) {
! 126: for (var i=1; i < this.nodes.length; i++) {
! 127: this.nodes[i].style.display = visibility ? this._displayvar : 'none';
! 128: };
! 129: };
! 130:
! 131: this.setVisible = function() {
! 132: for (var i=0; i < this.panel.elements.length; i++) {
! 133: var el = this.panel.elements[i];
! 134: if (el != this) {
! 135: el.setVisibility(false);
! 136: };
! 137: this.setVisibility(true);
! 138: };
! 139: };
! 140:
! 141: addEventHandler(labelrow, 'click', this.setVisible, this);
! 142: };
! 143:
! 144: //----------------------------------------------------------------------------
! 145: // The inspector
! 146: //----------------------------------------------------------------------------
! 147:
! 148: function KupuInspector(inspectorelement) {
! 149: /* the Inspector tool, a tool to set attributes on elements */
! 150:
! 151: this.element = getFromSelector(inspectorelement);
! 152: this._lastnode = null;
! 153:
! 154: this.default_attrs = new Array('id', 'className');
! 155: this.special_attrs = {'a': new Array('href', 'name', 'target'),
! 156: 'img': new Array('url', 'width', 'height'),
! 157: 'ul': new Array('type'),
! 158: 'ol': new Array('type'),
! 159: 'table': new Array('border', 'cellPadding', 'cellSpacing'),
! 160: 'td': new Array('align')
! 161: };
! 162: this.styles = new Array('background', 'borderWidth', 'borderColor',
! 163: 'borderStyle', 'color', 'fontSize',
! 164: 'fontFamily', 'float', 'height',
! 165: 'lineHeight', 'margin', 'padding',
! 166: 'textAlign', 'verticalAlign', 'whiteApace',
! 167: 'width');
! 168:
! 169: this.updateState = function(selNode, event) {
! 170: /* repopulate the inspector (if required) */
! 171: if (selNode != this._lastnode) {
! 172: // we need to repopulate
! 173: this._lastnode = selNode
! 174: this._clear();
! 175: var panel = new Panel();
! 176: var currnode = selNode;
! 177: // walk up to the body, add the elements in an array so we can
! 178: // walk through it backwards later on
! 179: var els = new Array();
! 180: while (currnode.nodeName.toLowerCase() != 'html') {
! 181: // only use element nodes
! 182: if (currnode.nodeType == 1) {
! 183: els.push(currnode);
! 184: };
! 185: currnode = currnode.parentNode;
! 186: };
! 187:
! 188: for (var i=0; i < els.length; i++) {
! 189: // now build an element
! 190: var node = els[els.length - i - 1];
! 191: var nodename = node.nodeName.toLowerCase();
! 192: var visibility = (i == els.length - 1);
! 193: var element = new Element(node, panel, visibility);
! 194:
! 195: // walk through the default attrs
! 196: for (var j=0; j < this.default_attrs.length; j++) {
! 197: var attr = this.default_attrs[j];
! 198: element.addAttribute(attr);
! 199: };
! 200: // check if there are any special attrs for this type of element
! 201: if (nodename in this.special_attrs) {
! 202: var sattrs = this.special_attrs[nodename];
! 203: // add the attrs
! 204: for (var j=0; j < sattrs.length; j++) {
! 205: var attr = sattrs[j];
! 206: element.addAttribute(attr);
! 207: };
! 208: };
! 209: // and add all applicable styles
! 210: for (var j=0; j < this.styles.length; j++) {
! 211: var style = this.styles[j];
! 212: if (style in node.style) {
! 213: element.addStyle(style);
! 214: };
! 215: };
! 216: panel.addElement(element);
! 217: };
! 218: this.element.appendChild(panel.element);
! 219: };
! 220: };
! 221:
! 222: this._clear = function() {
! 223: while (this.element.childNodes.length) {
! 224: this.element.removeChild(this.element.childNodes[0]);
! 225: };
! 226: };
! 227: };
! 228:
! 229: KupuInspector.prototype = new KupuTool;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>