From a7f2d159bb3aa3c515b6f858d3e592618f62cbdf Mon Sep 17 00:00:00 2001 From: Einar Egilsson Date: Fri, 9 Oct 2009 15:09:25 +0000 Subject: Change to settings.xul.js git-svn-id: http://einaregilsson.googlecode.com/svn/mozilla/redirector/trunk@262 119bf307-c92d-0410-89bd-8f53e6181181 --- chrome/content/code/settings.xul.js | 229 ++++++++++++++++++++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 chrome/content/code/settings.xul.js (limited to 'chrome/content/code/settings.xul.js') diff --git a/chrome/content/code/settings.xul.js b/chrome/content/code/settings.xul.js new file mode 100644 index 0000000..6fdcca3 --- /dev/null +++ b/chrome/content/code/settings.xul.js @@ -0,0 +1,229 @@ +// $Id$ + +var Redirector = Components.classes["@einaregilsson.com/redirector;1"].getService(Components.interfaces.nsISupports).wrappedJSObject; +const Cc = Components.classes; +const Ci = Components.interfaces; + +var RedirectList = { + + lstRedirects: null, + btnDelete : null, + btnEdit : null, + btnUp : null, + btnDown : null, + chkEnableRedirector : null, + chkShowStatusBarIcon : null, + chkShowContextMenu : null, + chkEnableDebugOutput : null, + + onLoad : function() { + try { + //Get references to controls + this.lstRedirects = document.getElementById('lstRedirects'); + this.btnDelete = document.getElementById('btnDelete'); + this.btnEdit = document.getElementById('btnEdit'); + this.btnUp = document.getElementById('btnUp'); + this.btnDown = document.getElementById('btnDown'); + this.chkEnableRedirector = document.getElementById('chkEnableRedirector'); + this.chkShowStatusBarIcon = document.getElementById('chkShowStatusBarIcon'); + this.chkShowContextMenu = document.getElementById('chkShowContextMenu'); + this.chkEnableDebugOutput = document.getElementById('chkEnableDebugOutput'); + + //Preferences + this.setPrefs(Redirector.prefs); + Redirector.prefs.addListener(this); + + //Redirect list + this.lstRedirects.selType = 'single'; + this.template = document.getElementsByTagName('richlistitem')[0]; + this.lstRedirects.removeChild(this.template); + this.addItemsToListBox(Redirector.list); + + this.strings = document.getElementById('redirector-strings'); + } catch(e) { + alert(e); + } + }, + + onUnload : function() { + Redirector.prefs.removeListener(this); + }, + + changedPrefs : function(prefs) { + this.setPrefs(prefs); + }, + + setPrefs : function(prefs) { + this.chkEnableRedirector.setAttribute('checked', prefs.enabled); + this.chkShowStatusBarIcon.setAttribute('checked', prefs.showStatusBarIcon); + this.chkShowContextMenu.setAttribute('checked', prefs.showContextMenu); + this.chkEnableDebugOutput.setAttribute('checked', prefs.debugEnabled); + }, + + addItemsToListBox : function(items) { + + var item, row, value, newItem; + + for each (item in items) { + newItem = this.template.cloneNode(true); + + newItem.getElementsByAttribute('name', 'dscrIncludePattern')[0].setAttribute('value', item.includePattern); + newItem.getElementsByAttribute('name', 'dscrExcludePattern')[0].setAttribute('value', item.excludePattern); + newItem.getElementsByAttribute('name', 'dscrRedirectTo')[0].setAttribute('value', item.redirectUrl); + var checkEnabled = newItem.getElementsByAttribute('name', 'chkEnabled')[0]; + checkEnabled.setAttribute('checked', !item.disabled); + newItem.setAttribute('class', item.disabled ? 'disabledRedirect' : ''); + newItem.item = item; + this.lstRedirects.appendChild(newItem); + newItem.setAttribute('selected', false) + } + + //Enable, disable functionality + this.lstRedirects.addEventListener('click', function(ev) { + if (ev.originalTarget && ev.originalTarget.tagName == 'checkbox') { + var parent = ev.originalTarget.parentNode; + while (!parent.item) { + parent = parent.parentNode; + } + parent.item.disabled = !ev.originalTarget.hasAttribute('checked'); + parent.setAttribute('class', parent.item.disabled ? 'disabledRedirect' : ''); + Redirector.save(); + } + },false); + }, + + moveUp : function(){ + if (this.lstRedirects.selectedIndex <= 0) { + return; + } + this.switchItems(this.lstRedirects.selectedIndex-1); + }, + + moveDown : function() { + if (this.lstRedirects.selectedIndex == Redirector.list.length-1) { + return; + } + this.switchItems(this.lstRedirects.selectedIndex); + }, + + switchItems : function(firstIndex) { + var firstRedirect = Redirector.list[firstIndex]; + var secondRedirect = Redirector.list[firstIndex+1]; + Redirector.list[firstIndex] = secondRedirect; + Redirector.list[firstIndex+1] = firstRedirect; + var firstItem = this.lstRedirects.children[firstIndex]; + var secondItem = this.lstRedirects.children[firstIndex+1]; + this.lstRedirects.removeChild(secondItem); + this.lstRedirects.insertBefore(secondItem, firstItem); + Redirector.save(); + this.selectionChange(); + }, + + setListItemValues : function(listItem, item){ + listItem.getElementsByAttribute('name', 'dscrIncludePattern')[0].setAttribute('value', item.includePattern); + listItem.getElementsByAttribute('name', 'dscrExcludePattern')[0].setAttribute('value', item.excludePattern); + listItem.getElementsByAttribute('name', 'dscrRedirectTo')[0].setAttribute('value', item.redirectUrl); + }, + + preferenceChange : function(event) { + Redirector.prefs[event.originalTarget.getAttribute('preference')] = event.originalTarget.hasAttribute('checked'); + }, + + addRedirect : function() { + var args = { saved : false, redirect : new Redirect() }; + window.openDialog("chrome://redirector/content/ui/editRedirect.xul", "redirect", "chrome,dialog,modal,centerscreen", args); + if (args.saved) { + this.addItemsToListBox([args.redirect]); + Redirector.addRedirect(args.redirect); + } + }, + + editRedirect : function() { + + if (this.lstRedirects.selectedIndex == -1) { + return; + } + //.selectedItem is still there after it has been removed, that's why we have the .selectedIndex check above as well + var listItem = this.lstRedirects.selectedItem; + if (!listItem) { + return; + } + var redirect = listItem.item; + var args = { saved: false, "redirect":redirect.clone()}; + window.openDialog("chrome://redirector/content/ui/editRedirect.xul", "redirect", "chrome,dialog,modal,centerscreen", args); + + if (args.saved) { + redirect.copyValues(args.redirect); + this.setListItemValues(listItem, redirect); + Redirector.save(); + } + }, + + deleteRedirect : function() { + var index = this.lstRedirects.selectedIndex; + + if (index == -1) { + return; + } + + var text = this.strings.getString("deleteConfirmationText"); + var title = this.strings.getString("deleteConfirmationTitle"); + var reallyDelete = Cc["@mozilla.org/embedcomp/prompt-service;1"].getService(Ci.nsIPromptService).confirm(null, title, text); + if (!reallyDelete) { + return; + } + + try { + this.lstRedirects.removeChild(this.lstRedirects.children[index]); + Redirector.deleteAt(index); + this.selectionChange(); + } catch(e) { + alert(e); + } + }, + + selectionChange : function() { + if (!this.lstRedirects) { + return; + } + var index = this.lstRedirects.selectedIndex; + + this.btnEdit.disabled = (index == -1); + this.btnDelete.disabled = (index == -1); + this.btnUp.disabled = (index <= 0); + this.btnDown.disabled = (index == -1 || index >= Redirector.list.length-1); + }, + + importExport : function(mode, captionKey, func) { + //Mostly borrowed from Adblock Plus + var picker = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker); + picker.init(window, Redirector.getString(captionKey), mode); + picker.defaultExtension = ".rdx"; + var dir = Redirector.getDefaultDir(); + if (dir) { + picker.displayDirectory = dir; + } + picker.appendFilter(Redirector.getString('redirectorFiles'), '*.rdx'); + + if (picker.show() == picker.returnCancel) { + return; + } + try { + func(picker.file); + } catch (e) { + alert(e); + } + }, + + export : function() { + this.importExport(Ci.nsIFilePicker.modeSave, 'exportCaption', function(file) { + Redirector.exportRedirects(file); + }); + }, + + import : function() { + this.importExport(Ci.nsIFilePicker.modeOpen, 'importCaption', function(file) { + Redirector.importRedirects(file); + }); + } +}; -- cgit v1.2.3-70-g09d2