Fixes #694, Problems with zotero://select

- Custom protocol handler extensions like zotero://select can now not return a channel and the request will be automatically cancelled without throwing an error
- Switched Timeline code to use the stringbundle methods to access timeline.properties
- Even though zotero://select now works properly, switched Timeline to access ZoteroPane directly and call selectItem() (calling toggleDisplay() first to open the Zotero pane if necessary)
- Now getting some localized strings from Zotero ("Date Added" and the short month names)
This commit is contained in:
Dan Stillman 2007-08-15 08:06:33 +00:00
parent dca8b3a572
commit 7feb7995d7
5 changed files with 81 additions and 64 deletions

View File

@ -18,18 +18,4 @@ interval.century = Century
interval.millennium = Millennium
dateType.published = Date Published
dateType.added = Date Added
dateType.modified = Date Modified
shortName.january = Jan
shortName.february = Feb
shortName.march = Mar
shortName.april = Apr
shortName.may = May
shortName.june = Jun
shortName.july = Jul
shortName.august = Aug
shortName.september = Sep
shortName.october = Oct
shortName.november = Nov
shortName.december = Dec
dateType.modified = Date Modified

View File

@ -232,9 +232,11 @@ Timeline.GregorianDateLabeller=function(locale,timeZone){this._locale=locale;thi
/*
Modified by Ben for Zotero
*/
Timeline.GregorianDateLabeller.monthNames = [localeHash["shortName.january"], localeHash["shortName.february"], localeHash["shortName.march"], localeHash["shortName.april"], localeHash["shortName.may"],
localeHash["shortName.june"], localeHash["shortName.july"], localeHash["shortName.august"], localeHash["shortName.september"], localeHash["shortName.october"], localeHash["shortName.november"], localeHash["shortName.december"]];
Timeline.GregorianDateLabeller.getMonthName=function(month,locale){return Timeline.GregorianDateLabeller.monthNames[month];};
Timeline.GregorianDateLabeller.monthNames = Zotero.CSL.Global.getMonthStrings("short");
Timeline.GregorianDateLabeller.getMonthName=function(month,locale) {
return Timeline.GregorianDateLabeller.monthNames[month];
};

View File

@ -15,6 +15,7 @@
}
</style>
<script src="chrome://zotero/content/include.js"></script>
<script src="chrome://zotero/skin/timeline/timelineControls.js" type="text/javascript"></script>
<script src="chrome://zotero/skin/timeline/timeline-api.js" type="text/javascript"></script>
<script type="text/javascript">
@ -77,7 +78,15 @@
}
Timeline.DurationEventPainter.prototype._showBubble = function(x, y, evt) {
window.location='zotero://select/item/' + evt.getDescription();
// Get ChromeWindow so we have access to ZoteroPane (overlay.js)
var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator);
var win = wm.getMostRecentWindow('navigator:browser');
var zp = win.ZoteroPane;
if (!zp.isShowing()) {
zp.toggleDisplay();
}
zp.selectItem(evt.getDescription());
}
document.write("<title>"+localeHash["general.title"]+"</title>");

View File

@ -1,27 +1,42 @@
var localeHash = getLocaleHash();
var localeBundle = initLocaleBundle();
var jumpToYearTimer;
var lastJumpToYearValue;
function getLocaleHash() {
var localeHash = new Object();
var content = getContentsFromURL("chrome://zotero/locale/timeline.properties");
var m;
while(true) {
m = /^[\S]+(?=\s*=)/gm.exec(content);
if(!m) {
break;
}
localeHash[m] = /=[^\n]+/g.exec(content).toString().replace(/=\s*/,'');;
}
return localeHash;
/*
* Set up the localization string bundle from timeline.properties
*/
function initLocaleBundle() {
var src = 'chrome://zotero/locale/timeline.properties';
var localeService = Components.classes['@mozilla.org/intl/nslocaleservice;1']
.getService(Components.interfaces.nsILocaleService);
var appLocale = localeService.getApplicationLocale();
var stringBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"]
.getService(Components.interfaces.nsIStringBundleService);
return stringBundleService.createBundle(src, appLocale);
}
function getContentsFromURL(url) {
var xmlhttp = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
.createInstance();
xmlhttp.open('GET', url, false);
xmlhttp.send(null);
return xmlhttp.responseText;
/*
* Get a localized string from the string bundle
*
* This is copied from zotero.js
*/
function getString(name, params){
try {
if (params != undefined){
if (typeof params != 'object'){
params = [params];
}
var l10n = localeBundle.formatStringFromName(name, params, params.length);
}
else {
var l10n = localeBundle.GetStringFromName(name);
}
}
catch (e){
throw ('Localized string not available for ' + name);
}
return l10n;
}
@ -158,17 +173,17 @@ function createOption(t, selected) {
function getFull(a) {
switch (a) {
case 'd':
return localeHash["interval.day"];
return getString("interval.day");
case 'm':
return localeHash["interval.month"];
return getString("interval.month");
case 'y':
return localeHash["interval.year"];
return getString("interval.year");
case 'e':
return localeHash["interval.decade"];
return getString("interval.decade");
case 'c':
return localeHash["interval.century"];
return getString("interval.century");
case 'i':
return localeHash["interval.millennium"];
return getString("interval.millennium");
default:
return false;
}
@ -236,17 +251,17 @@ function setupOtherControls(div, timeline, url) {
var tr = table.insertRow(0);
var td = tr.insertCell(0);
td.innerHTML = localeHash["general.jumpToYear"];
td.innerHTML = getString("general.jumpToYear");
td = tr.insertCell(tr.cells.length);
td.innerHTML = localeHash["general.firstBand"];
td.innerHTML = getString("general.firstBand");
td = tr.insertCell(tr.cells.length);
td.innerHTML = localeHash["general.secondBand"];;
td.innerHTML = getString("general.secondBand");;
td = tr.insertCell(tr.cells.length);
td.innerHTML = localeHash["general.thirdBand"];;
td.innerHTML = getString("general.thirdBand");;
td = tr.insertCell(tr.cells.length);
td.innerHTML = localeHash["general.dateType"];;
td.innerHTML = getString("general.dateType");;
td = tr.insertCell(tr.cells.length);
td.innerHTML = localeHash["general.timelineHeight"];;
td.innerHTML = getString("general.timelineHeight");;
tr = table.insertRow(1);
tr.style.verticalAlign = "top";
@ -259,8 +274,8 @@ function setupOtherControls(div, timeline, url) {
input.onkeypress=doKeyPress;
td.appendChild(input);
var options = new Array(localeHash["interval.day"], localeHash["interval.month"], localeHash["interval.year"],
localeHash["interval.decade"], localeHash["interval.century"], localeHash["interval.millennium"]);
var options = new Array(getString("interval.day"), getString("interval.month"), getString("interval.year"),
getString("interval.decade"), getString("interval.century"), getString("interval.millennium"));
var selected = '';
var theSelects = new Array();
@ -302,7 +317,7 @@ function setupOtherControls(div, timeline, url) {
td = tr.insertCell(tr.cells.length);
options = new Array(localeHash["dateType.published"], localeHash["dateType.added"], localeHash["dateType.modified"]);
options = new Array(getString("dateType.published"), Zotero.getString("itemFields.dateAdded"), getString("dateType.modified"));
var values = new Array('d', 'da', 'dm');
var select4 = document.createElement("select");
@ -316,7 +331,7 @@ function setupOtherControls(div, timeline, url) {
td = tr.insertCell(tr.cells.length);
var fitToScreen = document.createElement("button");
fitToScreen.innerHTML = localeHash["general.fitToScreen"];
fitToScreen.innerHTML = getString("general.fitToScreen");
Timeline.DOM.registerEvent(fitToScreen, "click", function () {
window.location = path + createQueryString(theQueryValue, false, timeline);
});
@ -338,10 +353,10 @@ function setupFilterHighlightControls(div, timeline, bandIndices, theme) {
var tr = table.insertRow(0);
var td = tr.insertCell(0);
td.innerHTML = localeHash["general.filter"];
td.innerHTML = getString("general.filter");
td = tr.insertCell(1);
td.innerHTML = localeHash["general.highlight"];
td.innerHTML = getString("general.highlight");
var handler = function(elmt, evt, target) {
onKeyPress(timeline, bandIndices, table);
@ -374,7 +389,7 @@ function setupFilterHighlightControls(div, timeline, bandIndices, theme) {
td = tr.insertCell(tr.cells.length);
var button = document.createElement("button");
button.innerHTML = localeHash["general.clearAll"];
button.innerHTML = getString("general.clearAll");
Timeline.DOM.registerEvent(button, "click", function() {
clearAll(timeline, bandIndices, table);
});

View File

@ -510,6 +510,9 @@ ChromeExtensionHandler.prototype = {
},
newChannel : function(uri) {
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService);
var chromeService = Components.classes["@mozilla.org/network/protocol;1?name=chrome"]
.getService(Components.interfaces.nsIProtocolHandler);
@ -522,14 +525,12 @@ ChromeExtensionHandler.prototype = {
var ext = this._extensions[extSpec];
if (uriString.indexOf(extSpec) == 0) {
if (this._systemPrincipal == null) {
var ioService = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService);
var chromeURI = chromeService.newURI(DUMMY_CHROME_URL, null, null);
var chromeChannel = chromeService.newChannel(chromeURI);
// Cache System Principal from chrome request
// so proxied pages load with chrome privileges
this._systemPrincipal = chromeChannel.owner;
var chromeRequest = chromeChannel.QueryInterface(Components.interfaces.nsIRequest);
@ -537,14 +538,18 @@ ChromeExtensionHandler.prototype = {
}
var extChannel = ext.newChannel(uri);
// Extension returned null, so cancel request
if (!extChannel) {
var chromeURI = chromeService.newURI(DUMMY_CHROME_URL, null, null);
var extChannel = chromeService.newChannel(chromeURI);
var chromeRequest = extChannel.QueryInterface(Components.interfaces.nsIRequest);
chromeRequest.cancel(0x804b0002); // BINDING_ABORTED
}
if (this._systemPrincipal != null) {
// applying cached system principal to extension channel
extChannel.owner = this._systemPrincipal;
}
else {
// no cached system principal to apply to extension channel
}
extChannel.originalURI = uri;