move from <tree>s to <outliner>s, leaning on recent venkman outliner work.
This commit is contained in:
rginda%netscape.com 2001-09-26 08:56:06 +00:00
Родитель 7a2227246a
Коммит c9ef96d2bc
5 изменённых файлов: 253 добавлений и 519 удалений

Просмотреть файл

@ -28,24 +28,12 @@
function onLoad()
{
/* see cview-rdf.js for the definition of RDFHelper */
cview.rdf = new RDFHelper();
cview.rdf.initTree ("component-list");
cview.rdf.initTree ("interface-list");
cview.rdf.setTreeRoot ("component-list", cview.rdf.resRoot);
cview.rdf.setTreeRoot ("interface-list", cview.rdf.resRoot);
onSortCol ("componentcol-contractid");
onSortCol ("interfacecol-iname");
refreshComponents();
refreshInterfaces();
initOutliners();
cview.totalComponents = cview.visibleComponents =
cview.componentView.rowCount;
cview.totalInterfaces = cview.visibleInterfaces =
cview.interfaceView.rowCount;
refreshLabels();
}
function onUnload()
@ -53,109 +41,100 @@ function onUnload()
/* nothing important to do onUnload yet */
}
function onSortCol(sortColName)
{
/* sort the <tree> widget on the column name |sortColName|. This code
* was basically ripped off some mozilla code that I can't recall at the
* moment.
*/
const nsIXULSortService = Components.interfaces.nsIXULSortService;
/* XXX remove the rdf version once 0.8 is a distant memory
* 2/22/2001
*/
const isupports_uri =
(Components.classes["@mozilla.org/xul/xul-sort-service;1"]) ?
"@mozilla.org/xul/xul-sort-service;1" :
"@mozilla.org/rdf/xul-sort-service;1";
var node = document.getElementById(sortColName);
// determine column resource to sort on
var sortResource =
node.getAttribute("resource");
if (!node)
return false;
var sortDirection = "ascending";
//node.setAttribute("sortActive", "true");
switch (sortColName)
{
case "componentcol-contractid":
document.getElementById("componentcol-clsid")
.setAttribute("sortDirection", "natural");
break;
case "componentcol-clsid":
document.getElementById("componentcol-contractid")
.setAttribute("sortDirection", "natural");
break;
case "interfacecol-iname":
document.getElementById("interfacecol-iid")
.setAttribute("sortDirection", "natural");
break;
case "interfacecol-iid":
document.getElementById("interfacecol-iname")
.setAttribute("sortDirection", "natural");
break;
}
var currentDirection = node.getAttribute('sortDirection');
if (currentDirection == "ascending")
sortDirection = "descending";
else if (currentDirection == "descending")
sortDirection = "natural";
else
sortDirection = "ascending";
node.setAttribute ("sortDirection", sortDirection);
var xulSortService =
Components.classes[isupports_uri].getService(nsIXULSortService);
if (!xulSortService)
return false;
try
{
xulSortService.Sort(node, sortResource, sortDirection);
}
catch(ex)
{
//dd("Exception calling xulSortService.Sort()");
}
}
function onComponentClick(e)
{
cview.lastContractID = e.target.parentNode.getAttribute("contractid");
if (cview.interfaceMode == "implemented-by")
if (e.originalTarget.localName == "outlinercol")
{
cview.interfaceFilter = cview.lastContractID;
filterInterfaces();
onOutlinerResort(e, cview.componentView);
}
else
{
/*
cview.lastContractID = e.target.parentNode.getAttribute("contractid");
if (cview.interfaceMode == "implemented-by")
{
cview.interfaceFilter = cview.lastContractID;
filterInterfaces();
}
*/
}
}
function onInterfaceClick(e)
{
cview.lastIID = e.target.parentNode.getAttribute("iid");
refreshLabels();
if (e.originalTarget.localName == "outlinercol")
{
onOutlinerResort(e, cview.interfaceView);
}
else
{
/*
cview.lastIID = e.target.parentNode.getAttribute("iid");
refreshLabels();
*/
}
}
function onOutlinerResort (e, view)
{
/* resort by column */
var rowIndex = new Object();
var colID = new Object();
var childElt = new Object();
var obo = view.outliner;
obo.getCellAt(e.clientX, e.clientY, rowIndex, colID, childElt);
var prop;
switch (colID.value.substr(4))
{
case "name":
prop = "sortName";
break;
case "number":
prop = "sortNumber";
break;
}
var root = view.childData;
var dir = (prop == root._share.sortColumn) ?
root._share.sortDirection * -1 : 1;
root.setSortColumn (prop, dir);
}
function onComponentSelect (e)
{
var index = cview.componentView.outliner.selection.currentIndex;
var row = cview.componentView.childData.locateChildByVisualRow (index);
if (!row)
return;
var text = document.getElementById ("output-text");
text.value = row.getText();
}
function onInterfaceSelect (e)
{
var index = cview.interfaceView.outliner.selection.currentIndex;
var row = cview.interfaceView.childData.locateChildByVisualRow (index);
if (!row)
return;
var text = document.getElementById ("output-text");
text.value = row.getText();
}
function onLXRIFCLookup (e, type)
{
var treerow = document.popupNode.parentNode;
var index = cview.interfaceView.outliner.selection.currentIndex;
var row = cview.interfaceView.childData.locateChildByVisualRow (index);
if (!row)
return;
var iname = treerow.getAttribute("iname");
if (!iname)
{
dd ("** NO INAME attribute in onLXRIFCLookup **");
return;
}
/* Specifing "_content" as the second parameter to window.open places
* the url in the most recently open browser window
*/
window.open ("http://lxr.mozilla.org/mozilla/" + type + iname,
window.open ("http://lxr.mozilla.org/mozilla/" + type + row.name,
"_content", "");
}

Просмотреть файл

@ -42,221 +42,73 @@ cview.REFRESH_CYCLE_DELAY = 200;
cview.componentMode = "all";
cview.interfaceMode = "all";
/*
* Refreshing components and interfaces is a time consuming process.
* We'll be asserting about 1300 (currently) new resources into the rdf graph,
* each with 4 arcs. In order to keep mozilla from becoming *totally*
* unresponsive during this refresh, we do the update in steps. The refresh
* cycle can be tweaked by adjusting the REFRESH_ITEMS_PER_CYCLE and
* REFRESH_CYCLE_DELAY properties on the cview object.
*
* Normally, components and interfaces will only need to be refreshed once
* per execution, at app start. After that, items are hidden/shown with the
* filter*() functions.
*/
/*
* One step in the components refresh process
*/
function refreshComponentsStep()
{
var i;
for (i = 0; i < cview.REFRESH_ITEMS_PER_CYCLE; i++)
{
var cls = cview.pendingComponents.pop();
if (!cls)
break;
var res = cview.rdf.GetResource ("component:" + (++cview.componentID));
cview.rdf.Assert (res, cview.rdf.resContractID,
cview.rdf.GetLiteral(cls.name));
cview.rdf.Assert (res, cview.rdf.resCLSID,
cview.rdf.GetLiteral(cls.number));
cview.rdf.Assert (res, cview.rdf.resShow,
cview.rdf.litTrue);
cview.rdf.Assert (cview.rdf.resRoot, cview.rdf.resCmp, res);
}
if (cls)
cview.componentRefreshTimeout =
window.setTimeout ("refreshComponentsStep();",
cview.REFRESH_CYCLE_DELAY);
else
{
cview.rdf.setTreeRoot ("component-list", cview.rdf.resRoot);
cview.componentMode = "all";
delete cview.componentRefreshTimeout;
delete cview.pendingComponents;
delete cview.componentID;
}
cview.visibleComponents += i;
refreshLabels();
}
/*
* Kick off a components refresh.
*/
function refreshComponents()
{
cview.rdf.setTreeRoot ("component-list", cview.rdf.resNullRoot);
cview.rdf.clearTargets (cview.rdf.resRoot, cview.rdf.resCmp, true);
if (cview.componentRefreshTimeout)
window.clearTimeout (cview.componentRefreshTimeout);
cview.pendingComponents = new Array();
for (var c in Components.classes)
cview.pendingComponents.push(Components.classes[c]);
cview.totalComponents = cview.pendingComponents.length;
cview.visibleComponents = 0;
cview.componentID = 0;
cview.componentMode = "refreshing";
refreshLabels();
cview.componentRefreshTimeout =
window.setTimeout ("refreshComponentsStep();",
cview.REFRESH_CYCLE_DELAY);
}
/*
* One step in the interface refresh process
*/
function refreshInterfacesStep()
{
var i;
for (i = 0; i < cview.REFRESH_ITEMS_PER_CYCLE; i++)
{
var ifc = cview.pendingInterfaces.pop();
if (!ifc)
break;
var res = cview.rdf.GetResource ("interface:" + (++cview.interfaceID));
cview.rdf.Assert (res, cview.rdf.resIName,
cview.rdf.GetLiteral(ifc.name));
cview.rdf.Assert (res, cview.rdf.resIID,
cview.rdf.GetLiteral(ifc.number));
cview.rdf.Assert (res, cview.rdf.resShow,
cview.rdf.litTrue);
cview.rdf.Assert (cview.rdf.resRoot, cview.rdf.resIfc, res);
}
if (ifc)
cview.interfaceRefreshTimeout =
window.setTimeout ("refreshInterfacesStep();",
cview.REFRESH_CYCLE_DELAY);
else
{
cview.rdf.setTreeRoot ("interface-list", cview.rdf.resRoot);
cview.interfaceMode = "all";
delete cview.interfaceID;
delete cview.interfaceRefreshTimeout;
delete cview.pendingInterfaces;
}
cview.visibleInterfaces += i;
refreshLabels();
}
/*
* Kick off the interface refresh process
*/
function refreshInterfaces()
{
cview.rdf.setTreeRoot ("interface-list", cview.rdf.resNullRoot);
cview.rdf.clearTargets (cview.rdf.resRoot, cview.rdf.resIfc, true);
if (cview.interfaceRefreshTimeout)
window.clearTimeout (cview.interfaceRefreshTimeout);
cview.pendingInterfaces = new Array();
for (var i in Components.interfaces)
cview.pendingInterfaces.push(Components.interfaces[i]);
cview.totalInterfaces = cview.pendingInterfaces.length;
cview.visibleInterfaces = 0;
cview.interfaceID = 0;
cview.interfaceMode = "refreshing";
refreshLabels();
cview.interfaceRefreshTimeout =
window.setTimeout ("refreshInterfacesStep();",
cview.REFRESH_CYCLE_DELAY);
}
/*
* hide/show entries in the components list based on the componentMode and
* componentFilter properties of the cview object.
*/
function filterComponents()
{
cview.rdf.setTreeRoot ("component-list", cview.rdf.resNullRoot);
cview.visibleComponents = 0;
var cmps = cview.rdf.GetTargets (cview.rdf.resRoot, cview.rdf.resCmp);
while (cmps.hasMoreElements())
function filterAll (rec)
{
var cmpNode = cmps.getNext().QueryInterface(nsIRDFResource);
var cmpName = cview.rdf.GetTarget(cmpNode, cview.rdf.resContractID);
if (cmpName)
if (rec.isHidden)
rec.unHide();
cview.visibleComponents++;
}
function filterContains (rec)
{
if (rec.name.search(cview.componentFilter) != -1)
{
cmpName = cmpName.QueryInterface(nsIRDFLiteral);
cmpName = cmpName.Value;
}
if (rec.isHidden)
rec.unHide();
cview.visibleComponents++;
}
else
{
dd ("** NODE WITHOUT NAME ARC in filterComponents **");
continue;
if (!rec.isHidden)
rec.hide();
}
switch (cview.componentMode)
{
case "all":
cview.rdf.Change (cmpNode, cview.rdf.resShow,
cview.rdf.litTrue);
cview.visibleComponents++;
break;
case "contains":
if (cmpName.search(cview.componentFilter) != -1)
{
cview.rdf.Change (cmpNode, cview.rdf.resShow,
cview.rdf.litTrue);
cview.visibleComponents++;
}
else
cview.rdf.Change (cmpNode, cview.rdf.resShow,
cview.rdf.litFalse);
break;
case "starts-with":
if (cmpName.search(cview.componentFilter) == 0)
{
cview.rdf.Change (cmpNode, cview.rdf.resShow,
cview.rdf.litTrue);
cview.visibleComponents++;
}
else
cview.rdf.Change (cmpNode, cview.rdf.resShow,
cview.rdf.litFalse);
break;
}
}
function filterStarts (rec)
{
if (rec.name.search(cview.componentFilter) == 0)
{
if (rec.isHidden)
rec.unHide();
cview.visibleComponents++;
}
else
{
if (!rec.isHidden)
rec.hide();
}
}
var cmps = cview.componentView.childData.childData;
var count = cmps.length;
cview.visibleComponents = 0;
switch (cview.componentMode)
{
case "all":
filterFunction = filterAll;
break;
case "contains":
filterFunction = filterContains;
break;
case "starts-with":
filterFunction = filterStarts;
break;
}
for (var i = 0; i < count; ++i)
filterFunction (cmps[i]);
cview.rdf.setTreeRoot ("component-list", cview.rdf.resRoot);
refreshLabels();
}
@ -266,93 +118,68 @@ function filterComponents()
*/
function filterInterfaces()
{
var e;
var cls;
cview.rdf.setTreeRoot ("interface-list", cview.rdf.resNullRoot);
var ifcs = cview.rdf.GetTargets (cview.rdf.resRoot, cview.rdf.resIfc);
function filterAll (rec)
{
if (rec.isHidden)
rec.show();
cview.visibleInterfaces++;
}
function filterContains (rec)
{
if (rec.name.search(cview.interfaceFilter) != -1)
{
if (rec.isHidden)
rec.show();
cview.visibleInterfaces++;
}
else
{
if (!rec.isHidden)
rec.hide();
}
}
function filterStarts (rec)
{
if (rec.name.search(cview.interfaceFilter) == 0)
{
if (rec.isHidden)
rec.show();
cview.visibleInterfaces++;
}
else
{
if (!rec.isHidden)
rec.hide();
}
}
var ifcs = cview.interfaceView.childData.childData;
var count = ifcs.length;
cview.visibleInterfaces = 0;
if (cview.interfaceMode == "implemented-by")
switch (cview.interfaceMode)
{
cls = Components.classes[cview.interfaceFilter];
if (cls)
cls = cls.createInstance();
case "all":
filterFunction = filterAll;
break;
case "contains":
filterFunction = filterContains;
break;
case "starts-with":
filterFunction = filterStarts;
break;
}
while (ifcs.hasMoreElements())
{
var ifcNode = ifcs.getNext().QueryInterface(nsIRDFResource);
var ifcName = cview.rdf.GetTarget(ifcNode, cview.rdf.resIName);
if (ifcName)
{
ifcName = ifcName.QueryInterface (nsIRDFLiteral);
ifcName = ifcName.Value;
}
else
{
dd ("** NODE WITHOUT NAME ARC in filterInterfaces **");
continue;
}
switch (cview.interfaceMode)
{
case "all":
cview.rdf.Change (ifcNode, cview.rdf.resShow,
cview.rdf.litTrue);
cview.visibleInterfaces++;
break;
case "contains":
if (ifcName.search(cview.interfaceFilter) != -1)
{
cview.rdf.Change (ifcNode, cview.rdf.resShow,
cview.rdf.litTrue);
cview.visibleInterfaces++;
}
else
cview.rdf.Change (ifcNode, cview.rdf.resShow,
cview.rdf.litFalse);
break;
case "starts-with":
if (ifcName.search(cview.interfaceFilter) == 0)
{
cview.rdf.Change (ifcNode, cview.rdf.resShow,
cview.rdf.litTrue);
cview.visibleInterfaces++;
}
else
cview.rdf.Change (ifcNode, cview.rdf.resShow,
cview.rdf.litFalse);
break;
case "implemented-by":
if (cls)
try
{
cls.QueryInterface(Components.interfaces[ifcName]);
cview.rdf.Change (ifcNode, cview.rdf.resShow,
cview.rdf.litTrue);
cview.visibleInterfaces++;
}
catch (e)
{
cview.rdf.Change (ifcNode, cview.rdf.resShow,
cview.rdf.litFalse);
}
else
cview.rdf.Change (ifcNode, cview.rdf.resShow,
cview.rdf.litFalse);
break;
}
}
for (var i = 0; i < count; ++i)
filterFunction (ifcs[i]);
cview.rdf.setTreeRoot ("interface-list", cview.rdf.resRoot);
refreshLabels();
refreshLabels();
}
@ -379,17 +206,12 @@ function refreshLabels()
value = "Components starting with '" + cview.componentFilter + "'";
break;
case "refreshing":
value = "Refreshing Components list...";
break;
default:
value = "Components?";
break;
}
value += " (" + cview.visibleComponents + "/" +
cview.totalComponents + ")";
value += " (" + cview.visibleComponents + "/" + cview.totalComponents + ")";
document.getElementById("component-label").setAttribute ("value", value);
switch (cview.interfaceMode)
@ -414,16 +236,11 @@ function refreshLabels()
Components.classes[cview.interfaceFilter] + "'";
break;
case "refreshing":
value = "Refreshing Interfaces list...";
break;
default:
value = "Interfaces?";
break;
}
value += " (" + cview.visibleInterfaces + "/" +
cview.totalInterfaces + ")";
value += " (" + cview.visibleInterfaces + "/" + cview.totalInterfaces + ")";
document.getElementById("interface-label").setAttribute ("value", value);
}

Просмотреть файл

@ -326,10 +326,10 @@ function getPriv (priv)
function keys (o)
{
var rv = "";
var rv = new Array();
for (var p in o)
rv += rv ? ", " + p : p;
rv.push(p);
return rv;

Просмотреть файл

@ -24,8 +24,7 @@
<!DOCTYPE window>
<!-- ?xml-stylesheet href="chrome://cview/skin" type="text/css"? -->
<?xml-stylesheet href="chrome://communicator/skin/" type="text/css"?>
<?xml-stylesheet href="chrome://cview/skin" type="text/css"?>
<?xul-overlay href="chrome://global/content/globalOverlay.xul"?>
<?xul-overlay href="chrome://communicator/content/utilityOverlay.xul"?>
@ -36,15 +35,10 @@
-->
<window id="main-window"
xmlns:html="http://www.w3.org/1999/xhtml"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:xpcom="http://www.mozilla.org/NC-xpcom#"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
orient="vertical" onload="onLoad();" onunload="onUnload();"
persist="width height" title="XPCOM Component Viewer">
<!--
note the xmlns:xpcom in the <window> tag, it's used in the <rule>s
below.
The persist attribute contains attributes that should be saved to
localstore.rdf when the window closes. The next time this window is
opened, persisted properties will be automatically restored.
@ -55,18 +49,23 @@
it to take effect.
files loaded are:
outliner-utils.js General purpose outliner classes
cview-utils.js generic utility functions.
cview-rdf.js RDF utility class (RDFHelper).
cview-static.js Non event-handler functions core to cview.
cview-handlers.js Event-handlers core to cview.
cview-outliners.js CView specific outliners
-->
<script>
var DEBUG = true;
</script>
<script type="application/x-javascript" src="chrome://cview/content/cview-utils.js"/>
<script type="application/x-javascript" src="chrome://cview/content/cview-rdf.js"/>
<script type="application/x-javascript" src="chrome://cview/content/cview-static.js"/>
<script type="application/x-javascript" src="chrome://cview/content/cview-handlers.js"/>
<script src="chrome://cview/content/outliner-utils.js"/>
<script src="chrome://cview/content/cview-utils.js"/>
<script src="chrome://cview/content/cview-rdf.js"/>
<script src="chrome://cview/content/cview-static.js"/>
<script src="chrome://cview/content/cview-handlers.js"/>
<script src="chrome://cview/content/cview-outliners.js"/>
<!--
This popup is the context menu for elements in the interfaces list.
@ -120,132 +119,51 @@
</menubar>
</toolbox>
<hbox id="outer-box" flex="1">
<vbox id="outer-box" flex="1">
<hbox id="inner-box" flex="9">
<vbox id="component-box" flex="1" width="50%">
<text id="component-label" value="Components..." crop="right"
autostretch="never"/>
<!--
datasources="rdf:null" makes the tree able to get it's contents from an
rdf datasource, but delays saying which one until runtime.
-->
containment="http://www.mozilla.org/NC-xpcom#component" says that
<tree id="component-list" container="true" datasources="rdf:null" flex="1"
containment="http://www.mozilla.org/NC-xpcom#component">
<text id="component-label" value="Components..." crop="right"
autostretch="never"/>
<template>
<!--
xpcom: here refers to the namespace declared in the <window> tag. If the
resource has a http://www.mozilla.org/NC-xpcom#show arc pointing the
literal value "false", no content will be created for that resource
-->
<rule xpcom:show="false"/>
<!--
If, on the otherhand, the resource has a
http://www.mozilla.org/NC-xpcom#show arc pointing the literal value
"true", the following content will be created.
-->
<rule xpcom:show="true">
<treechildren flex="1">
<treeitem uri="..." flex="1">
<treerow onclick="onComponentClick(event);" flex="1" crop="right"
contractid="rdf:http://www.mozilla.org/NC-xpcom#contractid">
<!--
Even though we specified the onClick handler as an attribute of the
<treerow> tag, the event's target will be the <treecell>. We compensate
by looking at the target's parentNode. See
cview-handlers.js:onComponentClick().
-->
<treecell>
<text value="rdf:http://www.mozilla.org/NC-xpcom#contractid"
crop="right" flex="1" autostretch="never"/>
</treecell>
<treecell>
<text value="rdf:http://www.mozilla.org/NC-xpcom#clsid"
crop="right" flex="1" autostretch="never"/>
</treecell>
</treerow>
</treeitem>
</treechildren>
</rule>
</template>
<outliner flex="1" id="component-outliner" persist="height"
primary="true" onselect="onComponentSelect(event);"
onclick="onComponentClick(event);">
<treecolgroup>
<treecol flex="1" width="75%"
resource="http://www.mozilla.org/NC-xpcom#contractid"/>
<outlinercol id="cmp-name" label="Name" primary="true" flex="1"
persist="hidden width"/>
<splitter class="tree-splitter"/>
<treecol flex="1" width="25%"
resource="http://www.mozilla.org/NC-xpcom#clsid"/>
</treecolgroup>
<outlinercol id="cmp-number" flex="1" label="Number"
persist="hidden width"/>
<outlinerbody id="project-body" flex="1"/>
</outliner>
<treehead>
<treerow>
<treecell id="componentcol-contractid" flex="1"
resource="http://www.mozilla.org/NC-xpcom#contractid"
class="treecell-header sortDirectionIndicator" label="ContractID"
onclick="return onSortCol('componentcol-contractid');"/>
<treecell id="componentcol-clsid" flex="1"
resource="http://www.mozilla.org/NC-xpcom#clsid"
class="treecell-header sortDirectionIndicator" label="CLSID"
onclick="return onSortCol('componentcol-clsid');"/>
</treerow>
</treehead>
</tree>
</vbox>
<splitter id="main-splitter" orient="vertical" collapse="before">
<splitter id="main-splitter" orient="vertical" collapse="after">
<grippy/>
</splitter>
<vbox id="interface-box" flex="1" width="50%">
<text id="interface-label" value="Interfaces..." crop="right"
autostretch="never"/>
<tree id="interface-list" container="true" datasources="rdf:null" flex="1"
containment="http://www.mozilla.org/NC-xpcom#interface">
<template>
<rule xpcom:show="false"/>
<rule xpcom:show="true">
<treechildren flex="1">
<treeitem uri="...">
<treerow onclick="onInterfaceClick(event);" crop="right"
iname="rdf:http://www.mozilla.org/NC-xpcom#iname"
context="interfacePopup">
<treecell>
<text value="rdf:http://www.mozilla.org/NC-xpcom#iname"
crop="right" flex="1" autostretch="never"/>
</treecell>
<treecell>
<text value="rdf:http://www.mozilla.org/NC-xpcom#iid"
crop="right" flex="1" autostretch="never"/>
</treecell>
</treerow>
</treeitem>
</treechildren>
</rule>
</template>
<outliner flex="1" id="interface-outliner" persist="height"
onclick="onInterfaceClick(event);" context="interfacePopup"
onselect="onInterfaceSelect(event);">
<treecolgroup>
<treecol flex="1" width="75%"
resource="http://www.mozilla.org/NC-xpcom#iname"/>
<outlinercol id="ifc-name" label="Name" primary="true" flex="1"
persist="hidden width"/>
<splitter class="tree-splitter"/>
<treecol flex="1" width="25%"
resource="http://www.mozilla.org/NC-xpcom#iid"/>
</treecolgroup>
<outlinercol id="ifc-number" flex="1" label="Number"
persist="hidden width"/>
<outlinerbody id="project-body" flex="1"/>
</outliner>
<treehead>
<treerow>
<treecell id="interfacecol-iname"
resource="http://www.mozilla.org/NC-xpcom#iname"
class="treecell-header sortDirectionIndicator" label="Interface"
onclick="return onSortCol('interfacecol-iname');"/>
<treecell id="interfacecol-iid"
resource="http://www.mozilla.org/NC-xpcom#iid"
class="treecell-header sortDirectionIndicator" label="IID"
onclick="return onSortCol('interfacecol-iid');"/>
</treerow>
</treehead>
</tree>
</vbox>
</hbox>
</hbox> <!-- inner-box -->
<textbox multiline="true" readonly="true" id="output-text" flex="1"/>
</vbox> <!-- outer-box -->
</window>

Просмотреть файл

@ -22,3 +22,23 @@
*/
@import url(chrome://communicator/skin/);
#output-text {
font-family: monospace;
}
outlinerbody:-moz-outliner-image(cmp-name,component) {
list-style-image: url("chrome://cview/skin/images/component.gif");
}
outlinerbody:-moz-outliner-image(cmp-name,interface) {
list-style-image: url("chrome://cview/skin/images/interface.gif");
}
outlinerbody:-moz-outliner-image(cmp-name,method) {
list-style-image: url("chrome://cview/skin/images/method.gif");
}
outlinerbody:-moz-outliner-image(ifc-name) {
list-style-image: url("chrome://cview/skin/images/interface.gif");
}