From 0aa71851ef86ad31f5807f08a430c6471333fde2 Mon Sep 17 00:00:00 2001 From: abhin4v Date: Thu, 4 Dec 2008 15:49:57 +0000 Subject: [PATCH] Refactored JS to use observer-notifier system. git-svn-id: file:///tmp/snv/trunk@9 12951d8a-c33d-4b7c-b961-822215c816e1 --- chrome/content/TODO.txt | 6 +- chrome/content/diggsidebar.js | 175 ++++++++++++---- chrome/content/diggsidebar.xul | 4 +- chrome/content/jpath.js | 355 +++++++++++++++++++++++++++++++++ install.rdf | 2 +- 5 files changed, 501 insertions(+), 41 deletions(-) create mode 100644 chrome/content/jpath.js diff --git a/chrome/content/TODO.txt b/chrome/content/TODO.txt index 66e1ab2..e48aeee 100644 --- a/chrome/content/TODO.txt +++ b/chrome/content/TODO.txt @@ -1,7 +1,7 @@ move to JSON data format -- done XBL -- done format JS/refactor JS/Use FUEL -- done -put license -caching/db, threading, XUL templates -new UI +caching/db, threading +new UI, icons, thumbnails JQuery +put license diff --git a/chrome/content/diggsidebar.js b/chrome/content/diggsidebar.js index bf503fd..59ebd75 100644 --- a/chrome/content/diggsidebar.js +++ b/chrome/content/diggsidebar.js @@ -1,9 +1,38 @@ -var DiggSidebar = { +/* + Digg Sidebar - Shows Digg stories in the Firefox sidebar in real time. + Copyright (C) 2008 Abhinav Sarkar + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +*/ + +DiggSidebar = { prefs: Application.extensions.get("diggsidebar@abhinavsarkar.net").prefs, + storyListRefreshEventTopic: "extension-diggsidebar-abhinavsarkar-net-storylist-refresh", + endpoint: { + container: null, + topic: null, + category: "all" + }, + updateInterval: 10, + updateIntervalDecay: 0, + shownStoriesCount: 30, categories: ['All', 'Popular', 'Upcoming', 'Hot', 'Top'], - timerId : null, - currentStories : new Array(), - playing : true, + timerId: null, + storyIds: [], + playing: true, + stories: [], fetchData: function(url, handler) { DiggSidebar.diggIndicator.style.display = ''; @@ -95,31 +124,36 @@ var DiggSidebar = { DiggSidebar.diggIndicator.style.display = 'none'; }, - populateStoryList: function(e) { - var XHR = e.target; - //Application.console.log(XHR.responseText); - var data = DiggSidebar.Utils.decodeJson(XHR.responseText); - var stories = data.stories; - + populateStoryList: function() { while (DiggSidebar.storyList.firstChild) { DiggSidebar.storyList.removeChild(DiggSidebar.storyList.firstChild); } - var newStories = new Array(); - //Application.console.log(stories.length); + var newStoryIds = new Array(); + Application.console.log(DiggSidebar.stories.length); - stories.forEach(function (story) { - newStories.push(story.id); - //Application.console.log(i + " " + story.title + " " + story.id); + var jp = new JPath(DiggSidebar.stories); + var filtedStories = DiggSidebar.stories; + if (DiggSidebar.endpoint.topic) + filtedStories = jp.$(function(story){ + return story.$("topic/short_name").json == DiggSidebar.endpoint.topic; + }).json; + if (DiggSidebar.endpoint.container) + filtedStories = jp.$(function(story){ + return story.$("container/short_name").json == DiggSidebar.endpoint.container; + }).json; - var listitem = DiggSidebar.storyList.appendChild(document.createElement('richlistitem')); - listitem.id = "story_" + story.id; - listitem.setAttribute('title', story.title); - - if (DiggSidebar.currentStories.indexOf(story.id) != -1) listitem.new = false; + filtedStories.forEach(function (story, index) { + if (index < DiggSidebar.shownStoriesCount) { + var listitem = DiggSidebar.storyList.appendChild(document.createElement('richlistitem')); + listitem.id = "story_" + story.id; + listitem.setAttribute('title', story.title); + if (DiggSidebar.storyIds.indexOf(story.id) != -1) listitem.new = false; + } + if (DiggSidebar.storyIds.indexOf(story.id) == -1) newStoryIds.push(story.id); }); - DiggSidebar.currentStories = newStories; - DiggSidebar.setUpdateInterval(stories); + DiggSidebar.storyIds = DiggSidebar.storyIds.concat(newStoryIds); + DiggSidebar.setUpdateInterval(DiggSidebar.stories.slice(-5)); DiggSidebar.diggIndicator.style.display = 'none'; }, @@ -178,7 +212,20 @@ var DiggSidebar = { DiggSidebar.fetchData("http://services.digg.com/stories" + ep.replace(/\/all/g, '') + "?count=30" + "&type=json" + "&appkey=" + encodeURIComponent("http://diggsidebar.googlepages.com"), - DiggSidebar.populateStoryList); + function(e) { + var newStories = DiggSidebar.Utils.decodeJson(e.target.responseText).stories.filter( + function(story) { + return !(DiggSidebar.storyIds.indexOf(story.id) != -1); + }); + newStories.forEach(function(story) { + story.category = DiggSidebar.endpoint.category; + story.read = false; + }); + DiggSidebar.stories = newStories.concat(DiggSidebar.stories); + var observerService = Components.classes["@mozilla.org/observer-service;1"] + .getService(Components.interfaces.nsIObserverService); + observerService.notifyObservers(null, DiggSidebar.storyListRefreshEventTopic, null); + }); }, getDescription: function(storyId) { @@ -196,6 +243,12 @@ var DiggSidebar = { setUpdateInterval: function(stories) { //Adaptive update interval code START + if (stories.length == 0) { + window.clearTimeout(DiggSidebar.timerId); + var timeout = Math.round(DiggSidebar.updateInterval*(Math.pow(1.5, DiggSidebar.updateIntervalDecay))); + DiggSidebar.timerId = window.setTimeout(DiggSidebar.getStories, timeout); + return; + } var sum = 0; var weights = [4, 3, 2, 1] var date = (stories[0].promote_date != null) ? 'promote_date' : 'submit_date'; @@ -216,32 +269,46 @@ var DiggSidebar = { //Application.console.log(updateInterval); if (updateInterval > 0) { - var previousUpdateInterval = DiggSidebar.prefs.get("updateinterval").value; - DiggSidebar.prefs.get("updateinterval").value = updateInterval; + var previousUpdateInterval = DiggSidebar.updateInterval; + DiggSidebar.updateInterval = updateInterval; - var updateIntervalDecay = DiggSidebar.prefs.get("updateintervaldecay").value; + var updateIntervalDecay = DiggSidebar.updateIntervalDecay; if (previousUpdateInterval == updateInterval) - DiggSidebar.prefs.get("updateintervaldecay").value = updateIntervalDecay + 1; + DiggSidebar.updateIntervalDecay = updateIntervalDecay + 1; else - DiggSidebar.prefs.get("updateintervaldecay").value = 0; + DiggSidebar.updateIntervalDecay = 0; } window.clearTimeout(DiggSidebar.timerId); - var updateInterval = DiggSidebar.prefs.get("updateinterval").value; - var updateIntervalDecay = DiggSidebar.prefs.get("updateintervaldecay").value; - - var timeout = Math.round(updateInterval*(Math.pow(1.5, updateIntervalDecay))); + var timeout = Math.round(DiggSidebar.updateInterval*(Math.pow(1.5, DiggSidebar.updateIntervalDecay))); DiggSidebar.timerId = window.setTimeout(DiggSidebar.getStories, timeout); //Adaptive update interval code END }, setEndPoint: function(ep) { DiggSidebar.prefs.get("endpoint").value = ep; + DiggSidebar.endpoint = DiggSidebar.getEndpointParts(ep); window.clearTimeout(DiggSidebar.timerId); DiggSidebar.getStories(); }, + getEndpointParts: function(ep) { + var tmp = { + topic: null, + container: null, + category: "all" + }; + parts = ep.split("/"); + if (parts.length == 2) + tmp.category = parts[1]; + else if (parts.length == 4) { + tmp[parts[1]] = parts[2]; + tmp.category = parts[3]; + } + return tmp; + }, + togglePlayPause: function() { if (DiggSidebar.playing) { window.clearTimeout(DiggSidebar.timerId); @@ -249,10 +316,7 @@ var DiggSidebar = { DiggSidebar.diggPlayPause.setAttribute("tooltiptext", "Click to Start autoupdate"); DiggSidebar.playing = false; } else { - var updateInterval = DiggSidebar.prefs.get("updateinterval").value; - var updateIntervalDecay = DiggSidebar.prefs.get("updateintervaldecay").value; - - var timeout = Math.round(updateInterval*(Math.pow(1.5, updateIntervalDecay))); + var timeout = Math.round(DiggSidebar.updateInterval*(Math.pow(1.5, DiggSidebar.updateIntervalDecay))); DiggSidebar.timerId = window.setTimeout(DiggSidebar.getStories, timeout); DiggSidebar.diggPlayPause.image = "chrome://diggsidebar/content/image/Pause.png"; DiggSidebar.diggPlayPause.setAttribute("tooltiptext", "Click to Pause autoupdate"); @@ -261,6 +325,7 @@ var DiggSidebar = { }, initialize: function(){ + DiggSidebar.endpoint = DiggSidebar.getEndpointParts(DiggSidebar.prefs.get("endpoint").value); var $ = function(id) {return document.getElementById(id)}; DiggSidebar.diggIndicator = $('diggIndicator'); DiggSidebar.topicPopup = $('topicPopup'); @@ -268,8 +333,14 @@ var DiggSidebar = { DiggSidebar.storyList = $('storyList'); DiggSidebar.diggEndPoint = $('diggEndPoint'); DiggSidebar.diggPlayPause = $('diggPlayPause'); + + DiggSidebar.storyListObserver = new StoryListObserver(); DiggSidebar.createMenu(); DiggSidebar.getStories(); + }, + + destroy: function(){ + DiggSidebar.storyListObserver.unregister(); } }; @@ -290,6 +361,38 @@ DiggSidebar.Utils = { return json.decode(string); } } + +var StoryListObserver = function() { + this.registered = false; + this.register(); +} + +StoryListObserver.prototype = { + observe: function(subject, topic, data) { + if (topic == window.DiggSidebar.storyListRefreshEventTopic) { + window.DiggSidebar.populateStoryList(); + } + }, + + register: function() { + if (this.registered == false) { + var observerService = Components.classes["@mozilla.org/observer-service;1"] + .getService(Components.interfaces.nsIObserverService); + observerService.addObserver(this, DiggSidebar.storyListRefreshEventTopic, false); + this.registered = true; + } + }, + + unregister: function() { + if (this.registered == true) { + var observerService = Components.classes["@mozilla.org/observer-service;1"] + .getService(Components.interfaces.nsIObserverService); + observerService.removeObserver(this, DiggSidebar.storyListRefreshEventTopic); + this.registered = false; + } + } +} + /*TODO preferences toolbar button diff --git a/chrome/content/diggsidebar.xul b/chrome/content/diggsidebar.xul index ac9bf08..b02c3d2 100644 --- a/chrome/content/diggsidebar.xul +++ b/chrome/content/diggsidebar.xul @@ -6,8 +6,10 @@ + onload="DiggSidebar.initialize()" + onunload="DiggSidebar.destroy()">