aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bookmarks.js50
-rw-r--r--completionDialog.js119
2 files changed, 80 insertions, 89 deletions
diff --git a/bookmarks.js b/bookmarks.js
index 6708067e..1ec0c3d1 100644
--- a/bookmarks.js
+++ b/bookmarks.js
@@ -29,7 +29,6 @@ function activateBookmarkFindMode() {
},
enable: function() {
this.enabled = true;
- this.query = [];
if(!this.initialized) {
initialize.call(this)
@@ -46,12 +45,6 @@ function activateBookmarkFindMode() {
this.completionDialog.hide()
HUD.hide();
},
- getQueryString: function() {
- return this.query.join("")
- },
- find: function(query) {
- this.finder.find(query)
- },
renderHUD: function() {
if (this.newTab)
HUD.show("Open bookmark in new tab");
@@ -64,18 +57,10 @@ function activateBookmarkFindMode() {
// private method
var initialize = function() {
var self = this;
- this.initialized = true;
- this.finder = new BookmarkFinder({
- onResultsFound: function(bookmarks) {
- self.bookmarksFound = bookmarks;
- if(bookmarks.length>10) {
- bookmarks=bookmarks.slice(0, 10)
- }
- self.completionDialog.showCompletions(self.getQueryString(), bookmarks)
- }
- });
+ self.initialized = true;
- this.completionDialog = new CompletionDialog({
+ self.completionDialog = new CompletionDialog({
+ source: findBookmarks,
onSelect: function(selection) {
var url = selection.url
var isABookmarklet = function(url) {
@@ -121,18 +106,6 @@ function activateBookmarkFindMode() {
if (isEscape(event)) {
self.disable();
}
- else if (event.keyCode == keyCodes.backspace || event.keyCode == keyCodes.deleteKey) {
- if (self.query.length == 0) {
- self.disable();
- } else {
- self.query.pop();
- self.finder.find(self.getQueryString())
- }
- }
- else if(keyChar!=="up" && keyChar!=="down" && keyChar!=="left" && keyChar!="right") {
- self.query.push(keyChar);
- self.finder.find(self.getQueryString())
- }
event.stopPropagation();
event.preventDefault();
@@ -149,17 +122,14 @@ function activateBookmarkFindMode() {
})
}
- var BookmarkFinder = function(config) {
- this.port = chrome.extension.connect({ name: "getBookmarks" })
- this.port.onMessage.addListener(function(msg) {
- (config.onResultsFound && config.onResultsFound(msg.bookmarks))
+ var findBookmarks = function(searchString, callback) {
+ var port = chrome.extension.connect({ name: "getBookmarks" })
+ port.onMessage.addListener(function(msg) {
+ callback(msg.bookmarks)
+ port = null
})
- }
- BookmarkFinder.prototype = {
- find: function(query) {
- this.port.postMessage({query:query})
- }
- }
+ port.postMessage({query:searchString})
+ };
//export global
window.BookmarkMode = BookmarkMode;
diff --git a/completionDialog.js b/completionDialog.js
index 377f9b90..c5c6722b 100644
--- a/completionDialog.js
+++ b/completionDialog.js
@@ -6,53 +6,17 @@
CompletionDialog.prototype = {
show: function() {
- this.showCompletions()
- },
- showCompletions: function(searchString, completions) {
- this.searchString = searchString;
- this.completions = completions;
- if(!this.initialized) {
- initialize.call(this);
- this.initialized=true;
- }
- var container = this.getDisplayElement()
- clearChildren(container);
-
- if(searchString===undefined) {
- this.container.className = "dialog";
- createDivInside(container).innerHTML=this.options.initialSearchText || "Begin typing"
- }
- else {
- this.container.className = "dialog completions";
- var searchBar = createDivInside(container)
- searchBar.innerHTML=searchString
- searchBar.className="searchBar"
-
- searchResults = createDivInside(container)
- searchResults.className="searchResults"
- if(completions.length<=0) {
- var resultDiv = createDivInside(searchResults)
- resultDiv.className="noResults"
- resultDiv.innerHTML="No results found"
- }
- else {
- for(var i=0;i<completions.length;i++) {
- var resultDiv = createDivInside(searchResults)
- if(i===this.currentSelection) {
- resultDiv.className="selected"
- }
- resultDiv.innerHTML=this.options.renderOption(searchString, completions[i])
- }
- }
- }
-
- container.style.top=(window.innerHeight/2-container.clientHeight/2) + "px";
- container.style.left=(window.innerWidth/2-container.clientWidth/2) + "px";
if(!this.isShown) {
+ this.isShown=true;
+ this.query = [];
+ if(!this.initialized) {
+ initialize.call(this);
+ this.initialized=true;
+ }
this.keyPressListener.enable();
+ render.call(this)
clearInterval(this._tweenId);
- this._tweenId = Tween.fade(container, 1.0, 150);
- this.isShown=true;
+ this._tweenId = Tween.fade(this.container, 1.0, 150);
}
},
hide: function() {
@@ -69,32 +33,50 @@
this.container = createDivInside(document.body)
}
return this.container
+ },
+ getQueryString: function() {
+ return this.query.join("")
}
}
var initialize = function() {
+ var self = this
addCssToPage(completionCSS)
- this.currentSelection=0;
- var self = this;
- this.keyPressListener = new KeyPressListener({
+ self.currentSelection=0;
+
+ self.keyPressListener = new KeyPressListener({
keyDown: function(event) {
var keyChar = getKeyChar(event);
if(keyChar==="up") {
if(self.currentSelection>0) {
self.currentSelection-=1;
}
- self.showCompletions(self.searchString, self.completions)
+ render.call(self,self.getQueryString(), self.completions)
}
else if(keyChar==="down") {
if(self.currentSelection<self.completions.length-1) {
self.currentSelection+=1;
}
- self.showCompletions(self.searchString, self.completions)
+ render.call(self,self.getQueryString(), self.completions)
}
else if(event.keyCode == keyCodes.enter) {
self.options.onSelect(self.completions[self.currentSelection])
}
+ else if (event.keyCode == keyCodes.backspace || event.keyCode == keyCodes.deleteKey) {
+ if (self.query.length > 0) {
+ self.query.pop();
+ self.options.source(self.getQueryString(), function(completions) {
+ render.call(self, self.getQueryString(), completions)
+ })
+ }
+ }
+ else if(keyChar!=="left" && keyChar!="right") {
+ self.query.push(keyChar);
+ self.options.source(self.getQueryString(), function(completions) {
+ render.call(self, self.getQueryString(), completions)
+ })
+ }
event.stopPropagation();
event.preventDefault();
@@ -102,6 +84,45 @@
})
}
+ var render = function(searchString, completions) {
+ if(this.isShown) {
+ this.searchString = searchString;
+ this.completions = completions;
+ var container = this.getDisplayElement()
+ clearChildren(container);
+
+ if(searchString===undefined) {
+ this.container.className = "dialog";
+ createDivInside(container).innerHTML=this.options.initialSearchText || "Begin typing"
+ }
+ else {
+ this.container.className = "dialog completions";
+ var searchBar = createDivInside(container)
+ searchBar.innerHTML=searchString
+ searchBar.className="searchBar"
+
+ searchResults = createDivInside(container)
+ searchResults.className="searchResults"
+ if(completions.length<=0) {
+ var resultDiv = createDivInside(searchResults)
+ resultDiv.className="noResults"
+ resultDiv.innerHTML="No results found"
+ }
+ else {
+ for(var i=0;i<completions.length;i++) {
+ var resultDiv = createDivInside(searchResults)
+ if(i===this.currentSelection) {
+ resultDiv.className="selected"
+ }
+ resultDiv.innerHTML=this.options.renderOption(searchString, completions[i])
+ }
+ }
+ }
+
+ container.style.top=(window.innerHeight/2-container.clientHeight/2) + "px";
+ container.style.left=(window.innerWidth/2-container.clientWidth/2) + "px";
+ }
+ };
var createDivInside = function(parent) {
var element = document.createElement("div");
parent.appendChild(element);