diff -r 000000000000 -r 1450b09d0cfd ginebra/chrome/bedrockchrome/urlsearch.snippet/urlsearch.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ginebra/chrome/bedrockchrome/urlsearch.snippet/urlsearch.js Tue May 04 12:39:35 2010 +0300 @@ -0,0 +1,567 @@ +/*! + \file urlsearch.js This module contains the UrlSearch class. +*/ + +var enumObj = new Object(); +enumObj.state = {Loading:0, Editing:1, Reloadable:2} + +/* The following "classes" are psudo classes since javascript doesn't have + true classes. The prototype object is a property of all JavaScript + objects and can be used to impart properties to each instance of a + class - these properties become public and can't access private class + members. Another way to create a public method is to add code like the + following inside of the class constructor. + + // create a public method named clearPBar + this.clearPBar = function() + { + } + + Methods created this way can access private members. Syntax-wise, + private member variables and methods are created in the usual fasion but + within the class constructor. Semantically they are simulated in JavaScript + using closures. +*/ + +/*! + Class to handle displaying and updating the URL search bar. Only 1 search + bar should be created for the browser. This class is not designed to be code + space efficient for creating multiple URL search bar objects. +*/ +function UrlSearch(lastUrl) +{ + /*! + Class to handle displaying and updating the URL text box. + */ + function UrlTextBox() + { + } + + //! UrlTextBox Public Methods + + UrlTextBox.prototype.getTextBoxValue = function() + { + return document.gotoUrlForm.textBox.value; + } + + UrlTextBox.prototype.setTextBoxValue = function(text) + { + //window.chrome.alert("setTextBoxValue" + text); + document.gotoUrlForm.textBox.value = text; + } + + // Unused Method + UrlTextBox.prototype.textBoxFocus = function() + { + document.gotoUrlForm.textBox.focus(); + } + + UrlTextBox.prototype.hasFocus = function() + { + return document.getElementById("urlBox").hasFocus; + } + + UrlTextBox.prototype.setFocus = function(hasFocus) + { + document.getElementById("urlBox").hasFocus = hasFocus; + } + + /*! + Class to handle displaying and updating the URL tri-state button. + */ + function UrlTriStateButton() + { + } + + //! UrlTriStateButton Public Methods + UrlTriStateButton.prototype.setButton = function() + { + //window.chrome.alert("setButton " + window.pageController.loadState); + btnDom = document.getElementById("tristateBtn").button; + switch (window.pageController.loadState) { + case enumObj.state.Loading: + btnDom.updateImages("urlsearch.snippet/icons/stop.png", + "urlsearch.snippet/icons/stop_pushed.png", + "urlsearch.snippet/icons/stop.png"); + break; + case enumObj.state.Editing: + btnDom.updateImages("urlsearch.snippet/icons/goto.png", + "urlsearch.snippet/icons/goto_pushed.png", + "urlsearch.snippet/icons/goto.png"); + break; + case enumObj.state.Reloadable: + btnDom.updateImages("urlsearch.snippet/icons/reload.png", + "urlsearch.snippet/icons/reload_pushed.png", + "urlsearch.snippet/icons/reload.png"); + break; + default: + window.chrome.alert("Incorrect state"); + break; + } + + document.getElementById("tristateBtn").button.updateButton(); + } + + // Unused Method + UrlTriStateButton.prototype.changeTriState = function(a) + { + if (this.getValue() != a) { + this.setValue(a); + /* Shouln't have to do this check. This function should be + * called only after chrome has completed loading which + * means that all snippets have also been created. + */ + if (window.snippets.UrlSearchChromeId) { + window.snippets.UrlSearchChromeId.repaint(); + } + } + } + + /*! + Class to handle displaying and updating the URL progress bar. + */ + function UrlProgressBar() + { + this.oldpercent = 0; + } + + //! UrlProgressBar Public Methods + + UrlProgressBar.prototype.setProgress = function(widthStr) + { + document.getElementById("PBar").style.width = widthStr; + } + + UrlProgressBar.prototype.handlePageLoadProgress = function(percent) + { + //window.chrome.alert("Load prog "+percent); + if ((window.viewManager.currentView.type == "webView") && + (this.oldpercent != percent)) { + this.oldpercent = percent; + //window.chrome.alert("Load prog "+percent); + var parentWidth = document.getElementById("PWrap").offsetWidth; + this.setProgress((parentWidth * percent)/100 + "px"); + } + } + + UrlProgressBar.prototype.updateProgress = function(percent) + { + if (percent != 100) { + //window.chrome.alert("Load prog "+percent); + var parentWidth = document.getElementById("PWrap").offsetWidth; + this.setProgress((parentWidth * percent)/100 + "px"); + } else { + //clearProgressBar(); + this.setProgress("0%"); + oldpercent = 0; + } + } + + // UrlSearch Private Member Variables + var animator; + var animating = false; + var defaultPos; + var defaultHeight; + var animateDuration = 500; + var __blockDeselect = false; + var urlBarTextBox = new UrlTextBox(); + var urlBarButton = new UrlTriStateButton(); + var urlBarProgressBar = new UrlProgressBar(); + var searchSuggestEngine = new SearchSuggest(); + // UrlSearch Private Methods + + function _urlsearch_write(lastUrl) { + var html = ''+ + '
' + + '' + + '' + + ''+ + '' + + '' + + '' + + '
' + + '
' + + '' + + '
' + + '
' + + '
' + + '
' + + '
'; + + document.write(html); + } + + function loadToMainWindow(gotourl){ + // use a single call to guess url and goto url + // (could do as separate calls, but we try to eliminate lag with a single call) + + //var correctedUrl = window.chrome.guessAndGotoUrl(gotourl); + //urlBarTextBox.setTextBoxValue(correctedUrl); + + var gotourl = window.chrome.guessUrlFromString(gotourl); + window.pageController.currentLoad(gotourl); + urlBarTextBox.setTextBoxValue(gotourl); + window.pageController.urlTextChanged(gotourl); + } + + function loadSearchUrl(gotourl){ + var gotourl = window.chrome.searchUrl(gotourl); + window.pageController.currentLoad(gotourl); + urlBarTextBox.setTextBoxValue(gotourl); + window.pageController.urlTextChanged(gotourl); + } + + function chromeAlert(){ + window.chrome.alert("chrome Alert!"); + } + + function canSeeUrl() + { + return (!window.snippets.UrlSearchChromeId.isHiding && window.snippets.UrlSearchChromeId.isVisible()); + } + + function showUrlBar() + { + if (!canSeeUrl()) { + //window.chrome.alert("showUrlbar"); + window.snippets.UrlSearchChromeId.zValue = window.snippets.StatusBarChromeId.zValue - 1; + window.snippets.UrlSearchChromeId.setPosition(0,defaultPos); + window.snippets.UrlSearchChromeId.show(false); + window.chrome.updateViewPort(); + } + } + + function hideUrlBar() + { + //window.chrome.alert("hideUrlbar"); + if (canSeeUrl()) { + window.snippets.UrlSearchChromeId.hide(false); + } + } + + function slideUrlOut() { + //window.chrome.alert("slideUrlOut"); + if (canSeeUrl()) { + window.snippets.UrlSearchChromeId.zValue = window.snippets.StatusBarChromeId.zValue - 1; + animating = true; + //window.snippets.UrlSearchChromeId.isHiding = true; + animator = window.snippets.UrlSearchChromeId.animate(animateDuration).translateBy(0, -1 * defaultHeight).start(); + animator.updated.connect(animationUpdated); + animator.finished.connect(hideAnimationFinished); + } + } + + function slideUrlIn() + { + /* show it at right position and zorder first */ + window.snippets.UrlSearchChromeId.zValue = window.snippets.StatusBarChromeId.zValue - 1; + window.snippets.UrlSearchChromeId.setPosition(0, defaultPos-defaultHeight); + window.snippets.UrlSearchChromeId.show(false); + //window.snippets.UrlSearchChromeId.isHiding = false; + + animating = true; + animator = window.snippets.UrlSearchChromeId.animate(animateDuration).translateBy(0, defaultHeight).start(); + animator.updated.connect(animationUpdated); + animator.finished.connect(showAnimationFinished); + } + + function setUrlSearchValues() + { + //window.chrome.alert("setUrlSearchValues " + window.pageController.loadText); + urlBarTextBox.setTextBoxValue(window.pageController.loadText); + urlBarButton.setButton(); + + //window.chrome.alert("setProgress " + "New: " + window.pageController.loadProgressValue + " Old Value: " + oldpercent ); + var percent = window.pageController.loadProgressValue; + + urlBarProgressBar.updateProgress(percent); + if (percent == 100) { + __blockDeselect = false; + urlBarTextBox.setFocus(false); + } + window.snippets.UrlSearchChromeId.repaint(); + } + + function animationUpdated(value) + { + window.chrome.updateViewPort(); + } + + function hideAnimationFinished() + { + //window.chrome.alert("hideAnimationFinished"); + animating = false; + window.snippets.UrlSearchChromeId.isHiding = true; + } + + function showAnimationFinished() + { + //window.chrome.alert("showAnimationFinished"); + animating = false; + window.snippets.UrlSearchChromeId.isHiding = false; + } + + // Public Methods + this.focusElement = function(el, event) + { + el.select(); + __blockDeselect = true; + document.getElementById("urlBox").scrollLeft = 1000; + urlBarTextBox.setFocus(true); + } + + this.mouseDownElement = function(el, event) + { + // Clear __justSelected in case the element gained focus through some non-mouse event + // and still has focus. + __blockDeselect = false; + } + + this.mouseUpElement = function(el, event) + { + // Return false to prevent Qt from deselecting the text if we've just selected it + // in focusElement(), return true otherwise. + + var result = !__blockDeselect; + __blockDeselect = false; + return result; + } + + this.clearPBar = function() + { + urlBarProgressBar.setProgress("0%"); + } + + this.pushTriState = function() + { + //window.chrome.alert("pushTriState " + window.pageController.loadState); + switch (window.pageController.loadState) { + case enumObj.state.Loading: + //window.chrome.alert("In loading state, stop loading"); + window.pageController.currentStop(); + setTimeout("urlsearch.clearPBar()", 50); + break; + case enumObj.state.Editing: + //window.chrome.alert("In editing state, start loading"); + loadToMainWindow(urlBarTextBox.getTextBoxValue()); + break; + case enumObj.state.Reloadable: + //window.chrome.alert("In reloadable state, start reloading"); + window.pageController.currentReload(); + break; + default: + window.chrome.alert("Incorrect state"); + break; + } + urlBarButton.setButton(); + + } + + this.resetTriState = function() + { + if(window.pageController.loadState == enumObj.state.Reloadable) { + urlBarTextBox.setFocus(true); + //window.chrome.alert("Change to editing"); + window.pageController.setLoadState(enumObj.state.Editing); + urlBarButton.setButton(); + } + } + + this.querySuggests = function() + { + /* Disable suggests + var text = urlBarTextBox.getTextBoxValue(); + //window.chrome.alert("call searchSuggest " + text); + searchSuggests.removeAllItems(); + searchSuggests.hideSuggests(); + searchSuggestEngine.searchSuggest(text, this.updateSuggests); + */ + } + + this.updateSuggests = function(result) + { + var curText = urlBarTextBox.getTextBoxValue(); + searchSuggests.removeAllItems(); + if (result.length > 1 && curText == result[0]){ + for(var i = 1; i < result.length; i++) { + //window.chrome.alert(result[i]); + searchSuggests.addItem(result[i]); + } + searchSuggests.showSuggests(); + } + + + + } + + // UrlSearch Constructor + + // do setup + _urlsearch_write(lastUrl); + + + // Init the button + new SimpleButton("tristateBtn", + "urlsearch.snippet/icons/goto.png", + "urlsearch.snippet/icons/goto_pushed.png", + "urlsearch.snippet/icons/goto.png", + this.pushTriState); + urlBarButton.setButton(); + + // Note that in the slots below the "this" object is never used directly. + // This is because they don't have access to "this" as they are called + // externaly. + + // Connect Chrome load complete signal to slot. + window.chrome.loadComplete.connect( + function () { + defaultPos = window.snippets.UrlSearchChromeId.anchorOffset; + defaultHeight = UrlSearchChromeId.offsetHeight; + } + ); + + // Connect various Page Controller signals to slots. + window.pageController.pageUrlChanged.connect( + function(url) { + //window.chrome.alert(url); + //url is coming from loadContoller. So need not set it back + urlBarTextBox.setTextBoxValue(url); + } + ); + + window.pageController.pageLoadStarted.connect( + function() { + //window.chrome.alert("Load start"); + urlBarProgressBar.setProgress("5%"); + urlBarButton.setButton(); + + /* show url bar if it's hiding in contentView */ + if (window.viewManager.currentView.type == "webView") { + if (window.snippets.UrlSearchChromeId) { + showUrlBar(); + } + } + } + ); + + window.pageController.pageLoadProgress.connect( + function(percent) { + urlBarProgressBar.handlePageLoadProgress(percent); + } + ); + + window.pageController.pageLoadFinished.connect( + function(ok) { + //window.chrome.alert("pageLoadFinished: "); + // If the load was finished normally and not due to user stopping it, + // simulate progress completion + if(!window.pageController.loadCanceled) { + urlBarProgressBar.setProgress("99%"); + } + setTimeout("urlsearch.clearPBar()", 500); + __blockDeselect = false; + urlBarTextBox.setFocus(false); + urlBarButton.setButton(); + + /* start hide animation if contentYpos is not zero */ + if (window.viewManager.currentView.type == "webView") { + if (window.snippets.UrlSearchChromeId && window.pageController.contentsYPos > 0) { + slideUrlOut(); + } + } + } + ); + + window.pageController.pageIconChanged.connect( + function() { + window.chrome.alert("FAVICON changed"); + } + ); + + window.pageController.pageCreated.connect( + function() { + //window.chrome.alert("add new window"); + showUrlBar(); + } + ); + + window.pageController.pageChanged.connect( + function() { + + //window.chrome.alert("Page changed"); + // Set the values of the new page + setUrlSearchValues(); + } + ); + + window.pageController.pageScrollPositionZero.connect( + function() { + var contentYPos = window.pageController.contentsYPos; + //window.chrome.alert("pageScrollRequested contentYPos = " + contentYPos); + if (contentYPos > 0) { + if(canSeeUrl() && !animating && !pageController.isPageLoading) { + slideUrlOut(); + //window.chrome.updateViewPort(); + } + } + else { + if(!canSeeUrl() && !animating) { + slideUrlIn(); + } + } + } + ); + + // Connect snippets CR signal to slot. + window.snippets.symbianCarriageReturn.connect( + function() { + if (urlBarTextBox.hasFocus()) { + // When we get load started, the button will be changed + loadToMainWindow(urlBarTextBox.getTextBoxValue()); + } + } + ); + + // Connect View Manager current view changed signal to slot. + window.viewManager.currentViewChanged.connect( + function() { + if (window.viewManager.currentView.type == "webView") { + /*window.chrome.alert("currentViewChanged window.viewManager.currentView.type =" + window.viewManager.currentView.type + "Pos " + window.pageController.contentsYPos == 0 + "Loading still: " + pageController.isPageLoading);*/ + // When we change back to content view, show the urlsearch bar if either we are + // at the top or we are still loading the page (in this case, we will hide the urlsearch bar + // if needed on getting loadFinished + if (window.pageController.contentsYPos == 0 || pageController.isPageLoading) { + // show url bar with no animation + showUrlBar(); + } + //set the correct values based on the window + //window.chrome.alert("currentViewChanged " + window.pageController.loadText); + setUrlSearchValues(); + + // place focus in urlsearch bar when returning from adding a new window in windows view + if (window.pageController.loadText == "") { + __blockDeselect = false; + document.getElementById("urlBox").focus(); + return; + } + } else { + //Save url text box value + window.pageController.urlTextChanged(urlBarTextBox.getTextBoxValue()); + + // Remove progress bar and url text field value so that + // incorrect values are not seen before we can update when we come back + urlBarTextBox.setTextBoxValue(""); + urlBarProgressBar.setProgress("0%"); + hideUrlBar(); + } + + } + ); +} +