зеркало из https://github.com/mozilla/pjs.git
376 строки
12 KiB
JavaScript
376 строки
12 KiB
JavaScript
// -*- Mode: Java -*-
|
|
|
|
// the rdf service
|
|
var RDF;
|
|
var NC = "http://home.netscape.com/NC-rdf#";
|
|
|
|
var sidebar;
|
|
|
|
function Init()
|
|
{
|
|
RDF=Components.classes['component://netscape/rdf/rdf-service'].getService();
|
|
RDF=RDF.QueryInterface(Components.interfaces.nsIRDFService);
|
|
|
|
sidebar = new Object;
|
|
sidebar.db = window.arguments[0];
|
|
sidebar.resource = window.arguments[1];
|
|
|
|
var registry;
|
|
try {
|
|
// First try to construct a new one and load it
|
|
// synchronously. nsIRDFService::GetDataSource() loads RDF/XML
|
|
// asynchronously by default.
|
|
registry = Components.classes['component://netscape/rdf/datasource?name=xml-datasource'].createInstance();
|
|
registry = registry.QueryInterface(Components.interfaces.nsIRDFDataSource);
|
|
|
|
var remote = registry.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
|
|
remote.Init(sidebar.db); // this will throw if it's already been opened and registered.
|
|
|
|
// read it in synchronously.
|
|
remote.Refresh(true);
|
|
}
|
|
catch (ex) {
|
|
// if we get here, then the RDF/XML has been opened and read
|
|
// once. We just need to grab the datasource.
|
|
registry = RDF.GetDataSource(sidebar.db);
|
|
}
|
|
|
|
// Create a 'container' wrapper around the sidebar.resources
|
|
// resource so we can use some utility routines that make access a
|
|
// bit easier.
|
|
var sb_datasource = Components.classes['component://netscape/rdf/container'].createInstance();
|
|
sb_datasource = sb_datasource.QueryInterface(Components.interfaces.nsIRDFContainer);
|
|
sb_datasource.Init(registry, RDF.GetResource(sidebar.resource));
|
|
|
|
// Now enumerate all of the flash datasources.
|
|
var enumerator = sb_datasource.GetElements();
|
|
var count = 0;
|
|
while (enumerator.HasMoreElements()) {
|
|
count = ++count;
|
|
var service = enumerator.GetNext();
|
|
service = service.QueryInterface(Components.interfaces.nsIRDFResource);
|
|
|
|
addOption(registry, service, false);
|
|
}
|
|
enableButtons();
|
|
}
|
|
|
|
function addOption(registry, service, selectIt) {
|
|
|
|
var option_title = getAttr(registry, service, 'title');
|
|
var option_customize = getAttr(registry, service, 'customize');
|
|
var option_content = getAttr(registry, service, 'content');
|
|
|
|
// Check to see if the panel already exists
|
|
var list = document.getElementById('selectList');
|
|
var list_length = list.childNodes.length;
|
|
|
|
for (var ii=0; ii < list_length; ii++) {
|
|
//dump(list.childNodes.item(ii).getAttribute('title') + '\n');
|
|
|
|
var content = list.childNodes.item(ii).getAttribute('content');
|
|
|
|
if (content == option_content) {
|
|
if (selectIt) {
|
|
list.selectedIndex = ii;
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
|
|
var optionSelect = createOptionTitle(option_title);
|
|
var option = document.createElement('html:option');
|
|
|
|
option.setAttribute('title', option_title);
|
|
option.setAttribute('customize', option_customize);
|
|
option.setAttribute('content', option_content);
|
|
|
|
option.appendChild(optionSelect);
|
|
|
|
list.appendChild(option);
|
|
if (selectIt) {
|
|
list.selectedIndex = list_length;
|
|
}
|
|
}
|
|
|
|
function createOptionTitle(titletext)
|
|
{
|
|
var title = document.createElement('html:option');
|
|
var textOption = document.createTextNode(titletext);
|
|
title.appendChild(textOption);
|
|
|
|
return textOption;
|
|
}
|
|
|
|
function getAttr(registry,service,attr_name) {
|
|
var attr = registry.GetTarget(service,
|
|
RDF.GetResource(NC + attr_name),
|
|
true);
|
|
if (attr)
|
|
attr = attr.QueryInterface(Components.interfaces.nsIRDFLiteral);
|
|
if (attr)
|
|
attr = attr.Value;
|
|
return attr;
|
|
}
|
|
|
|
function selectChange() {
|
|
enableButtons();
|
|
}
|
|
|
|
function moveUp() {
|
|
var list = document.getElementById('selectList');
|
|
var index = list.selectedIndex;
|
|
if (index > 0) {
|
|
var optionBefore = list.childNodes.item(index-1);
|
|
var selectedOption = list.childNodes.item(index);
|
|
list.remove(index);
|
|
list.insertBefore(selectedOption, optionBefore);
|
|
list.selectedIndex = index - 1;
|
|
enableButtons();
|
|
enableSave();
|
|
}
|
|
}
|
|
|
|
function moveDown() {
|
|
var list = document.getElementById('selectList');
|
|
var index = list.selectedIndex;
|
|
if (index != -1 &&
|
|
index != list.options.length - 1) {
|
|
var selectedOption = list.childNodes.item(index);
|
|
var optionAfter = list.childNodes.item(index+1);
|
|
list.remove(index+1);
|
|
list.insertBefore(optionAfter, selectedOption);
|
|
list.selectedIndex = index + 1;
|
|
enableButtons();
|
|
enableSave();
|
|
}
|
|
}
|
|
|
|
function enableButtons() {
|
|
var up = document.getElementById('up');
|
|
var down = document.getElementById('down');
|
|
var list = document.getElementById('selectList');
|
|
var customize = document.getElementById('customize-button');
|
|
var index = list.selectedIndex;
|
|
var noneSelected = (index == -1);
|
|
var isFirst = (index == 0);
|
|
var isLast = (index == list.options.length - 1);
|
|
|
|
// up /\ button
|
|
if (noneSelected || isFirst) {
|
|
up.setAttribute('disabled', 'true');
|
|
} else {
|
|
up.setAttribute('disabled', '');
|
|
}
|
|
// down \/ button
|
|
if (noneSelected || isLast) {
|
|
down.setAttribute('disabled', 'true');
|
|
} else {
|
|
down.setAttribute('disabled', '');
|
|
}
|
|
// "Customize..." button
|
|
var customizeURL = null;
|
|
if (!noneSelected) {
|
|
var option = list.childNodes.item(index);
|
|
customizeURL = option.getAttribute('customize');
|
|
}
|
|
if (customizeURL == 'null') {
|
|
customize.setAttribute('disabled','true');
|
|
} else {
|
|
customize.setAttribute('disabled','');
|
|
}
|
|
}
|
|
|
|
function CustomizePanel()
|
|
{
|
|
var list = document.getElementById('selectList');
|
|
var index = list.selectedIndex;
|
|
|
|
if (index != -1) {
|
|
var title = list.childNodes.item(index).getAttribute('title');
|
|
var customize_URL = list.childNodes.item(index).getAttribute('customize');
|
|
|
|
if (!title || !customize_URL) return;
|
|
|
|
var customize = window.open("chrome://sidebar/content/customize-panel.xul",
|
|
"PanelPreview", "chrome");
|
|
|
|
customize.panel_name = title;
|
|
customize.panel_customize_URL = customize_URL;
|
|
}
|
|
enableSave();
|
|
}
|
|
|
|
function RemovePanel()
|
|
{
|
|
var list = document.getElementById('selectList');
|
|
var index = list.selectedIndex;
|
|
|
|
if (index != -1) {
|
|
// XXX prompt user
|
|
list.options[index] = null;
|
|
|
|
// Clean up the selection
|
|
if (index == list.length) {
|
|
list.selectedIndex = index - 1;
|
|
} else {
|
|
list.selectedIndex = index;
|
|
}
|
|
}
|
|
enableSave();
|
|
}
|
|
|
|
// Note that there is a bug with resource: URLs right now.
|
|
var FileURL = "file:////u/slamm/tt/sidebar-browser.rdf";
|
|
|
|
// var the "NC" namespace. Used to construct resources
|
|
function Save()
|
|
{
|
|
// Open the RDF file synchronously. This is tricky, because
|
|
// GetDataSource() will do it asynchronously. So, what we do is
|
|
// this. First try to manually construct the RDF/XML datasource
|
|
// and read it in. This might throw an exception if the datasource
|
|
// has already been read in once. In which case, we'll just get
|
|
// the existing datasource from the RDF service.
|
|
var datasource;
|
|
|
|
try {
|
|
datasource = Components.classes["component://netscape/rdf/datasource?name=xml-datasource"].createInstance();
|
|
datasource = datasource.QueryInterface(Components.interfaces.nsIRDFXMLDataSource);
|
|
//datasource.Init(FileURL);
|
|
datasource.Init(sidebar.db);
|
|
datasource.Open(true);
|
|
//dump("datasource = " + datasource + ", opened for the first time.\n");
|
|
}
|
|
catch (ex) {
|
|
//datasource = RDF.GetDataSource(FileURL);
|
|
datasource = RDF.GetDataSource(sidebar.db);
|
|
//dump("datasource = " + datasource + ", using registered datasource.\n");
|
|
}
|
|
|
|
// Create a "container" wrapper around the "NC:BrowserSidebarRoot"
|
|
// object. This makes it easier to manipulate the RDF:Seq correctly.
|
|
var container = Components.classes["component://netscape/rdf/container"].createInstance();
|
|
container = container.QueryInterface(Components.interfaces.nsIRDFContainer);
|
|
|
|
container.Init(datasource, RDF.GetResource(sidebar.resource));
|
|
//dump("initialized container " + container + " on " + sidebar.resource+"\n");
|
|
|
|
// Remove all the current panels
|
|
//
|
|
var enumerator = container.GetElements();
|
|
|
|
while (enumerator.HasMoreElements()) {
|
|
var service = enumerator.GetNext();
|
|
service = service.QueryInterface(Components.interfaces.nsIRDFResource);
|
|
container.RemoveElement(service, true);
|
|
}
|
|
|
|
// Add the new panel list
|
|
//
|
|
var count = container.GetCount();
|
|
//dump("container has " + count + " elements\n");
|
|
|
|
var list = document.getElementById('selectList');
|
|
var list_length = list.childNodes.length;
|
|
|
|
for (var ii=0; ii < list_length; ii++, count++) {
|
|
//dump(list.childNodes.item(ii).getAttribute('title') + '\n');
|
|
|
|
var title = list.childNodes.item(ii).getAttribute('title');
|
|
var content = list.childNodes.item(ii).getAttribute('content');
|
|
var customize = list.childNodes.item(ii).getAttribute('customize');
|
|
|
|
var element = RDF.GetResource(FileURL + "#" + count);
|
|
//dump(FileURL + "#" + count + "\n");
|
|
|
|
container.AppendElement(element);
|
|
//dump("appended " + element + " to the container\n");
|
|
|
|
// Now make some sidebar-ish assertions about it...
|
|
datasource.Assert(element,
|
|
RDF.GetResource(NC + "title"),
|
|
RDF.GetLiteral(title + ' ' + count),
|
|
true);
|
|
datasource.Assert(element,
|
|
RDF.GetResource(NC + "content"),
|
|
RDF.GetLiteral(content),
|
|
true);
|
|
datasource.Assert(element,
|
|
RDF.GetResource(NC + "customize"),
|
|
RDF.GetLiteral(customize),
|
|
true);
|
|
|
|
//dump("added assertions about " + element + "\n");
|
|
}
|
|
|
|
// Now serialize it back to disk
|
|
datasource.Flush();
|
|
//dump("wrote " + FileURL + " back to disk.\n");
|
|
|
|
//window.close();
|
|
}
|
|
|
|
function selected()
|
|
{
|
|
var add_button = document.getElementById('add_button');
|
|
var preview_button = document.getElementById('preview_button');
|
|
var select_list = document.getElementsByAttribute("selected", "true");
|
|
if (select_list.length >= 1) {
|
|
add_button.setAttribute('disabled','');
|
|
preview_button.setAttribute('disabled','');
|
|
} else {
|
|
add_button.setAttribute('disabled','true');
|
|
preview_button.setAttribute('disabled','true');
|
|
}
|
|
}
|
|
|
|
function AddPanel()
|
|
{
|
|
var tree = document.getElementById('other-panels');
|
|
var database = tree.database;
|
|
var select_list = document.getElementsByAttribute("selected", "true");
|
|
var isFirstAddition = true;
|
|
for (var nodeIndex=0; nodeIndex<select_list.length; nodeIndex++) {
|
|
var node = select_list[nodeIndex];
|
|
if (!node) break;
|
|
var id = node.getAttribute("id");
|
|
if (!id) break;
|
|
var rdfNode = RDF.GetResource(id);
|
|
if (!rdfNode) break;
|
|
addOption(database, rdfNode, isFirstAddition);
|
|
isFirstAddition = false;
|
|
}
|
|
enableSave();
|
|
}
|
|
|
|
function PreviewPanel()
|
|
{
|
|
var tree = document.getElementById('other-panels');
|
|
var database = tree.database;
|
|
var select_list = document.getElementsByAttribute("selected", "true");
|
|
for (var nodeIndex=0; nodeIndex<select_list.length; nodeIndex++) {
|
|
var node = select_list[nodeIndex];
|
|
if (!node) break;
|
|
var id = node.getAttribute("id");
|
|
if (!id) break;
|
|
var rdfNode = RDF.GetResource(id);
|
|
if (!rdfNode) break;
|
|
|
|
var preview_name = getAttr(database, rdfNode, 'title');
|
|
var preview_URL = getAttr(database, rdfNode, 'content');
|
|
if (!preview_URL || !preview_name) break;
|
|
|
|
var preview = window.open("chrome://sidebar/content/preview.xul",
|
|
"PanelPreview", "chrome");
|
|
preview.panel_name = preview_name;
|
|
preview.panel_URL = preview_URL;
|
|
}
|
|
enableSave();
|
|
}
|
|
|
|
function enableSave() {
|
|
var save_button = document.getElementById('save_button');
|
|
save_button.setAttribute('disabled','');
|
|
}
|