rginda%netscape.com ef1256d8c3 -- NOT PART OF THE BUILD --
clean out some bitrot in cview, add an install.js file.
xpi will be located at www.hacksrus.com/~ginda/cview shortly.


git-svn-id: svn://10.0.0.236/trunk@87278 18797224-902f-48f8-a5cc-f745e15eee43
2001-02-17 05:55:01 +00:00

430 lines
13 KiB
JavaScript

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Robert Ginda, rginda@nestcape.com, original author
*/
/*
* This file contains "static" functions for cview. In this case static just
* means not-an-event-handler. If you can come up with a better name, let
* me know. The main code of cview is divided between this file and
* cview-handlers.js
*/
var cview = new Object();
/*
* instead of creating a slew of global variables, all app-wide values are
* stored on this cview object.
*/
/* number of items to process per refresh step */
cview.REFRESH_ITEMS_PER_CYCLE = 30;
/* number of milliseconds to wait between refresh steps */
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())
{
var cmpNode = cmps.getNext().QueryInterface(nsIRDFResource);
var cmpName = cview.rdf.GetTarget(cmpNode, cview.rdf.resContractID);
if (cmpName)
{
cmpName = cmpName.QueryInterface(nsIRDFLiteral);
cmpName = cmpName.Value;
}
else
{
dd ("** NODE WITHOUT NAME ARC in filterComponents **");
continue;
}
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;
}
}
cview.rdf.setTreeRoot ("component-list", cview.rdf.resRoot);
refreshLabels();
}
/*
* Same as filterComponents() except it works on the interface list
*/
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);
cview.visibleInterfaces = 0;
if (cview.interfaceMode == "implemented-by")
{
cls = Components.classes[cview.interfaceFilter];
if (cls)
cls = cls.createInstance();
}
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;
}
}
cview.rdf.setTreeRoot ("interface-list", cview.rdf.resRoot);
refreshLabels();
}
/*
* Update the list headings based on the componentMode and
* componentFilter properties of the cview object.
*/
function refreshLabels()
{
var value = "";
switch (cview.componentMode)
{
case "all":
value = "All components";
break;
case "contains":
value = "Components containing '" + cview.componentFilter + "'";
break;
case "starts-with":
value = "Components starting with '" + cview.componentFilter + "'";
break;
case "refreshing":
value = "Refreshing Components list...";
break;
default:
value = "Components?";
break;
}
value += " (" + cview.visibleComponents + "/" +
cview.totalComponents + ")";
document.getElementById("component-label").setAttribute ("value", value);
switch (cview.interfaceMode)
{
case "all":
value = "All interfaces";
break;
case "contains":
value = "Interfaces containing '" + cview.interfaceFilter + "'";
break;
case "starts-with":
value = "Interfaces starting with '" + cview.interfaceFilter + "'";
break;
case "implemented-by":
if (!cview.interfaceFilter)
value = "Please select a component";
else
value = "Interfaces implemented by '" +
Components.classes[cview.interfaceFilter] + "'";
break;
case "refreshing":
value = "Refreshing Interfaces list...";
break;
default:
value = "Interfaces?";
break;
}
value += " (" + cview.visibleInterfaces + "/" +
cview.totalInterfaces + ")";
document.getElementById("interface-label").setAttribute ("value", value);
}