Changeset 729

Show
Ignore:
Timestamp:
04/14/08 12:55:30 (8 months ago)
Author:
ma..@jesperkristensen.dk
Message:

New preference exceptions like UI for included and excluded pages.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/manage-ui2/src/chrome/chromeFiles/content/manage.js

    r703 r729  
    6464  btnEdit = document.getElementById("btnEdit"); 
    6565  btnUninstall = document.getElementById("btnUninstall"); 
    66   pagesControl = new PagesControl(document.getElementById("pages-control"))
     66  pagesControl = gPagesControl
    6767  chkEnabled = document.getElementById("chkEnabled"); 
    6868 
  • branches/manage-ui2/src/chrome/chromeFiles/content/pages-overlay.js

    r727 r729  
    1 function PagesControl(ctlPages) { 
    2   var includesBox = new PagesBox(document.getElementById("grpIncluded")); 
    3   var excludesBox = new PagesBox(document.getElementById("grpExcluded")); 
     1var gPagesControl = { 
     2  notifyEvent: function(script, event, data) { 
     3    switch (event) { 
     4    case "edit-include-add": 
     5      this.includes.push(data); 
     6      this.treeView.treebox.rowCountChanged(this.excludes.length + this.includes.length - 1, 1); 
     7      break; 
     8    case "edit-include-remove": 
     9      this.includes.splice(data, 1); 
     10      this.treeView.treebox.rowCountChanged(this.excludes.length + data, -1); 
     11      break; 
     12    case "edit-exclude-add": 
     13      this.excludes.push(data); 
     14      this.treeView.treebox.rowCountChanged(this.excludes.length - 1, 1); 
     15      break; 
     16    case "edit-exclude-remove": 
     17      this.excludes.splice(data, 1); 
     18      this.treeView.treebox.rowCountChanged(data, -1); 
     19      break; 
     20    } 
     21  }, 
    422 
    5   this.notifyEvent = function(script, event, data) { 
    6     switch (event) { 
    7     case "edit-include-add": includesBox.pageAdded(data); break; 
    8     case "edit-include-remove": includesBox.pageRemoved(data); break; 
    9     case "edit-exclude-add": excludesBox.pageAdded(data); break; 
    10     case "edit-exclude-remove": excludesBox.pageRemoved(data); break; 
    11     } 
    12   }; 
     23  script: null, 
    1324 
    14   this.script = null; 
    15   this.populate = function(script) { 
     25  populate: function(script) { 
    1626    this.clear(); 
    17     includesBox.populate(script, "includes", script.includes)
    18     excludesBox.populate(script, "excludes", script.excludes)
     27    this.includes = script.includes
     28    this.excludes = script.excludes
    1929    this.script = script; 
    2030    this.script.addObserver(this); 
    21   }
     31    document.getElementById("pagesTree").view = this.treeView
    2232 
    23   this.clear = function() { 
     33    var gmManageBundle = document.getElementById("gm-manage-bundle"); 
     34    var wmi = Components.classes["@mozilla.org/appshell/window-mediator;1"] 
     35                        .getService(Components.interfaces.nsIWindowMediator); 
     36    var win = wmi.getMostRecentWindow("navigator:browser"); 
     37    var currentSite = GM_isGreasemonkeyable(win.content.location.href) 
     38                      ? win.content.location.protocol + "//" + 
     39                        win.content.location.hostname + "/*" 
     40                      : gmManageBundle.getString("promptForNewPage.defVal"); 
     41    document.getElementById("locationBox").value = currentSite; 
     42 
     43    this.onLocationInput(); 
     44    this.onTreeSelect(); 
     45  }, 
     46 
     47  clear: function() { 
    2448    if (this.script == null) return; 
    2549    this.script.removeObserver(this); 
    26     includesBox.clear(); 
    27     excludesBox.clear(); 
    2850    this.script = null; 
    29   }; 
     51  }, 
    3052 
    31   function PagesBox(grpBox) { 
    32     var buttons = grpBox.getElementsByTagName("button"); 
    33     var self = this; 
    34     var selectedPage = null; 
     53  onLocationInput: function() { 
     54    document.getElementById("btnExclude").disabled = 
     55    document.getElementById("btnInclude").disabled = 
     56    !GM_isGreasemonkeyable(document.getElementById("locationBox").value); 
     57  }, 
    3558 
    36     this.script = null; 
    37     this.type = null; 
    38     this.groupbox = grpBox; 
    39     this.listbox = grpBox.getElementsByTagName("listbox")[0]; 
    40     this.btnAdd = buttons[0]; 
    41     this.btnEdit = buttons[1];  
    42     this.btnRemove = buttons[2]; 
     59  onTreeSelect: function() { 
     60    document.getElementById("btnRemove").disabled = 
     61    !this.treeView.selection.getRangeCount(); 
     62  }, 
    4363 
    44     this.listbox.addEventListener("select", updatePagesBox, true); 
    45     this.btnAdd.addEventListener("command", promptForNewPage, true); 
    46     this.btnEdit.addEventListener("command", promptForEdit, true); 
    47     this.btnRemove.addEventListener("command", remove, true); 
     64  addPage: function(type) { 
     65    var val = document.getElementById("locationBox").value; 
     66    if(type == "include") 
     67      this.script.addInclude(val); 
     68    else 
     69      this.script.addExclude(val); 
     70  }, 
    4871 
    49     this.populate = function(script, type, pages) { 
    50       this.clear()
    51       this.script = script
    52       this.type = type
     72  removeSelectedPages: function() { 
     73    var start = {}
     74    var end = {}
     75    var numRanges = this.treeView.selection.getRangeCount()
    5376 
    54       for (var i = 0, page = null; (page = pages[i]); i++) { 
    55         addPage(page); 
    56       } 
    57     }; 
    58  
    59     this.clear = function() { 
    60       this.script = null; 
    61       this.type = null; 
    62  
    63       while (this.listbox.hasChildNodes()) { 
    64         this.listbox.removeChild(this.listbox.childNodes[0]); 
    65       } 
    66     }; 
    67  
    68     function updatePagesBox(ev) { 
    69       selectedPage = self.listbox.getSelectedItem(0); 
    70       self.btnEdit.disabled = selectedPage == null; 
    71       self.btnRemove.disabled = selectedPage == null; 
    72     } 
    73  
    74     function promptForNewPage(ev) { 
    75       var gmManageBundle = document.getElementById("gm-manage-bundle"); 
    76       var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] 
    77                   .getService(); 
    78       var wmi = wm.QueryInterface(Components.interfaces.nsIWindowMediator); 
    79       var win = wmi.getMostRecentWindow("navigator:browser"); 
    80       var currentSite = GM_isGreasemonkeyable(win.content.location.href) 
    81                         ? win.content.location.protocol + "//" + 
    82                           win.content.location.hostname + "/*" 
    83                         : gmManageBundle.getString("promptForNewPage.defVal"); 
    84       var val = gmPrompt( 
    85         gmManageBundle.getString("promptForNewPage.msg"), 
    86         currentSite, 
    87         gmManageBundle.getString("promptForNewPage.title")); 
    88  
    89       if (val && val != "") { 
    90         self.type == "includes" ? 
    91           self.script.addInclude(val): 
    92           self.script.addExclude(val); 
    93         dirty = true; 
     77    // Loop backwards to not mess up indexes while removing 
     78    for (var t = numRanges - 1; t >= 0; t--) { 
     79      this.treeView.selection.getRangeAt(t, start, end); 
     80      for (var v = end.value; v >= start.value; v--) { 
     81        // remove the page 
     82        var page = this.getPageFromRow(v); 
     83        switch (page.type) { 
     84        case "include": this.script.removeIncludeAt(page.index); break; 
     85        case "exclude": this.script.removeExcludeAt(page.index); break; 
     86        } 
     87        // allow user to edit the page and then re-add 
     88        document.getElementById("locationBox").value = page.value; 
    9489      } 
    9590    } 
     91  }, 
    9692 
    97     function promptForEdit(ev) {  
    98       var gmManageBundle = document.getElementById("gm-manage-bundle");  
    99       var val = gmPrompt( 
    100         gmManageBundle.getString("promptForEdit.msg"), 
    101         self.listbox.selectedItem.label, 
    102         gmManageBundle.getString("promptForEdit.title")); 
    103   
    104       if (val && val != "") { 
    105         self.type == "includes" ? 
    106           self.script.removeIncludeAt(self.listbox.selectedIndex): 
    107           self.script.removeExcludeAt(self.listbox.selectedIndex); 
    108         self.type == "includes" ? 
    109           self.script.addInclude(val): 
    110           self.script.addExclude(val); 
    111   
    112         dirty = true;  
    113       } 
    114     }; 
     93  getPageFromRow: function(row) { 
     94    if (row < this.excludes.length) 
     95      return {type: "exclude", index: row, value: this.excludes[row]}; 
     96    else 
     97      return {type: "include", index: row - this.excludes.length, 
     98              value: this.includes[row - this.excludes.length]}; 
     99  }, 
    115100 
    116     this.pageAdded = function(val) { 
    117       addPage(val); 
    118     }; 
     101  treeView: { 
     102    get rowCount() { 
     103      return gPagesControl.includes.length + gPagesControl.excludes.length; 
     104    }, 
    119105 
    120     function remove(ev) { 
    121       self.type == "includes" ? 
    122         self.script.removeIncludeAt(self.listbox.selectedIndex): 
    123         self.script.removeExcludeAt(self.listbox.selectedIndex); 
     106    getCellText: function(row, column) { 
     107      if (column.id == "colStatus") 
     108        return gPagesControl.getPageFromRow(row).type; 
     109      else 
     110        return gPagesControl.getPageFromRow(row).value; 
     111    }, 
    124112 
    125       // it's sorta wierd that the button stays focused when it is disabled because nothing is selected 
    126       if (self.listbox.length == 0) { 
    127         self.listbox.focus(); 
    128         dirty = true; 
    129       } 
    130     } 
    131  
    132     this.pageRemoved= function(index) { 
    133       self.listbox.removeChild(self.listbox.childNodes[index]); 
    134     }; 
    135  
    136     function addPage(pageSpec) { 
    137       var listitem = document.createElement("listitem"); 
    138       listitem.setAttribute("label", pageSpec); 
    139       self.listbox.appendChild(listitem); 
    140     } 
     113    setTree: function(treebox){ this.treebox = treebox; }, 
     114    isContainer: function(row){ return false; }, 
     115    isSeparator: function(row){ return false; }, 
     116    isSorted: function(){ return false; }, 
     117    getLevel: function(row){ return 0; }, 
     118    getImageSrc: function(row,col){ return null; }, 
     119    getRowProperties: function(row,props){}, 
     120    getCellProperties: function(row,col,props){}, 
     121    getColumnProperties: function(colid,col,props){} 
    141122  } 
    142123} 
  • branches/manage-ui2/src/chrome/chromeFiles/content/pages-overlay.xul

    r727 r729  
    1111 
    1212  <vbox id="pages-control"> 
    13     <groupbox id="grpIncluded" 
    14       orient="vertical" 
    15       flex="1" 
    16     > 
    17       <caption label="&manage.label.grpIncluded;" /> 
    18       <hbox 
    19         style="margin-bottom:.5em" 
    20         flex="1" 
    21       > 
    22         <listbox flex="1" /> 
    23         <vbox> 
    24           <button 
    25             label="&manage.button.add;" /> 
    26           <button 
    27             label="&manage.button.edit;"  
    28             disabled="true" />  
    29           <button  
    30             label="&manage.button.remove;" 
    31             disabled="true" /> 
    32           <spacer flex="1" /> 
    33         </vbox> 
     13    <groupbox orient="vertical" flex="1"> 
     14      <caption label="&manage.label.grpPages;"/> 
     15      <description>&pages.description;</description> 
     16      <label value="&pages.location.label;" accesskey="&pages.location.accesskey;" 
     17             control="locationBox"/> 
     18      <textbox id="locationBox" oninput="gPagesControl.onLocationInput();"/> 
     19      <hbox> 
     20        <spacer flex="1"/> 
     21        <button id="btnExclude" label="&pages.button.exclude.label;" 
     22                accesskey="&pages.button.exclude.accesskey;" 
     23                oncommand="gPagesControl.addPage('exclude');"/> 
     24        <button id="btnInclude" label="&pages.button.include.label;" 
     25                accesskey="&pages.button.include.accesskey;" 
     26                oncommand="gPagesControl.addPage('include');" default="true"/> 
    3427      </hbox> 
    35     </groupbox> 
    36  
    37     <groupbox id="grpExcluded" 
    38       orient="vertical" 
    39       flex="1" 
    40     > 
    41       <caption label="&manage.label.grpExcluded;" /> 
    42       <hbox 
    43         style="margin-bottom:.5em" 
    44         flex="1" 
    45       > 
    46         <listbox flex="1" /> 
    47         <vbox> 
    48           <button 
    49             label="&manage.button.add;" /> 
    50           <button  
    51             label="&manage.button.edit;"  
    52             disabled="true" />  
    53           <button label="&manage.button.remove;" 
    54             disabled="true" /> 
    55           <spacer flex="1" /> 
    56         </vbox> 
     28      <tree id="pagesTree" flex="1" style="min-height: 5em" onselect="gPagesControl.onTreeSelect();"> 
     29        <treecols> 
     30          <treecol id="colStatus" label="&pages.column.status.label;"/> 
     31          <treecol id="colPage" label="&pages.column.page.label;" flex="1"/> 
     32        </treecols> 
     33        <treechildren/> 
     34      </tree> 
     35      <hbox> 
     36        <button id="btnRemove" label="&pages.button.remove.label;" 
     37                accesskey="&pages.button.remove.accesskey;" oncommand="gPagesControl.removeSelectedPages();"/> 
     38        <spacer flex="1"/> 
    5739      </hbox> 
    5840    </groupbox> 
  • branches/manage-ui2/src/chrome/chromeFiles/content/utils.js

    r727 r729  
    354354 
    355355function GM_isGreasemonkeyable(url) { 
    356   var scheme = Components.classes["@mozilla.org/network/io-service;1"] 
    357                .getService(Components.interfaces.nsIIOService) 
    358                .extractScheme(url); 
     356  try { 
     357    var scheme = Components.classes["@mozilla.org/network/io-service;1"] 
     358                 .getService(Components.interfaces.nsIIOService) 
     359                 .extractScheme(url); 
     360  } catch (e) { 
     361    return false; 
     362  } 
    359363 
    360364  return (scheme == "http" || scheme == "https" || scheme == "file" || 
  • branches/manage-ui2/src/chrome/chromeFiles/locale/en-US/greasemonkey.dtd

    r727 r729  
    11<!ENTITY manage.title "Manage User Scripts"> 
    22<!ENTITY manage.button.close "Close"> 
    3 <!ENTITY manage.button.add "Add..."> 
    4 <!ENTITY manage.button.edit "Edit..."> 
    5 <!ENTITY manage.button.remove "Remove"> 
    6 <!ENTITY manage.label.grpIncluded "Included Pages"> 
    7 <!ENTITY manage.label.grpExcluded "Excluded Pages"> 
     3<!ENTITY manage.label.grpPages "Included and Excluded Pages"> 
    84<!ENTITY manage.label.btnEdit "Edit"> 
    95<!ENTITY manage.label.chkEnabled "Enabled"> 
    106<!ENTITY manage.label.btnUninstall "Uninstall"> 
    117<!ENTITY manage.reorderHelp "Drag-and-drop with the mouse or press Alt-Up/Alt-Down to reorder scripts in this list."> 
     8<!ENTITY pages.description "You can specify on which web pages this user script will be used. Type the exact location of the web page you want to manage and then click Include or Exclude. You can use * as a wild card."> 
     9<!ENTITY pages.location.label "Location of page:"> 
     10<!ENTITY pages.location.accesskey "L"> 
     11<!ENTITY pages.button.include.label "Include"> 
     12<!ENTITY pages.button.include.accesskey "I"> 
     13<!ENTITY pages.button.exclude.label "Exclude"> 
     14<!ENTITY pages.button.exclude.accesskey "E"> 
     15<!ENTITY pages.button.remove.label "Remove Page"> 
     16<!ENTITY pages.button.remove.accesskey "R"> 
     17<!ENTITY pages.column.status.label "Status"> 
     18<!ENTITY pages.column.page.label "Page"> 
    1219<!ENTITY menu.install "Install User Script..."> 
    1320<!ENTITY menu.install.accesskey "I">