Annotation of kupu/common/kupuinspector.js, revision 1.1.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>