diff --git a/chrome/content/zotero/bindings/tagselector.xml b/chrome/content/zotero/bindings/tagselector.xml index c494e5141..68d8f79b6 100644 --- a/chrome/content/zotero/bindings/tagselector.xml +++ b/chrome/content/zotero/bindings/tagselector.xml @@ -258,6 +258,7 @@ // Set attributes var labels = tagsToggleBox.getElementsByTagName('label'); + var tagColors = Zotero.Tags.getColors(); for (var i=0; i + + + + + + + + + + + + + + + + - - + + + + + + + + diff --git a/chrome/content/zotero/xpcom/data/tags.js b/chrome/content/zotero/xpcom/data/tags.js index 9b641910a..d700d881b 100644 --- a/chrome/content/zotero/xpcom/data/tags.js +++ b/chrome/content/zotero/xpcom/data/tags.js @@ -32,6 +32,7 @@ Zotero.Tags = new function() { this.constructor.prototype = new Zotero.DataObjects(); var _tags = {}; // indexed by tag text + var _colorsByItem = {}; this.get = get; this.getName = getName; @@ -385,6 +386,76 @@ Zotero.Tags = new function() { } + this.getColor = function (name) { + var tagColors = this.getColors(); + return tagColors[name] ? tagColors[name] : '#000000'; + } + + + this.getColors = function (name) { + var tagColors = Zotero.Prefs.get('tagColors'); + return tagColors ? JSON.parse(tagColors) : {}; + } + + + this.getItemColor = function (itemID) { + var item = Zotero.Items.get(itemID); + if (!item) { + return false; + } + + // Init library tag colors if not yet done + var libraryID = item.libraryID ? item.libraryID : 0; + if (!_colorsByItem[libraryID]) { + _colorsByItem[libraryID] = {}; + var tagColors = this.getColors(); + for (var name in tagColors) { + var color = tagColors[name]; + var tagIDs = Zotero.Tags.getIDs(name, libraryID); + if (!tagIDs) { + continue; + } + for each(var tagID in tagIDs) { + var tag = Zotero.Tags.get(tagID); + var itemIDs = tag.getLinkedItems(true); + if (!itemIDs) { + continue; + } + for each(var id in itemIDs) { + _colorsByItem[libraryID][id] = color; + } + } + } + } + + return _colorsByItem[libraryID][itemID] ? _colorsByItem[libraryID][itemID] : false; + } + + + this.setColor = function (name, color) { + var tagColors = this.getColors(); + + // Unset + if (!color || color == '#000000') { + delete tagColors[name]; + } + else { + tagColors[name] = color; + } + + tagColors = JSON.stringify(tagColors); + Zotero.Prefs.set('tagColors', tagColors); + + _reloadTagColors() + Zotero.Notifier.trigger('redraw', 'item', []); + } + + + function _reloadTagColors() { + _colorsByItem = {}; + } + + function erase(ids) { ids = Zotero.flattenArguments(ids); @@ -488,6 +559,7 @@ Zotero.Tags = new function() { */ this._reload = function (ids) { _tags = {}; + _reloadTagColors(); } diff --git a/chrome/content/zotero/xpcom/itemTreeView.js b/chrome/content/zotero/xpcom/itemTreeView.js index eff3e14bc..73f128007 100644 --- a/chrome/content/zotero/xpcom/itemTreeView.js +++ b/chrome/content/zotero/xpcom/itemTreeView.js @@ -277,6 +277,12 @@ Zotero.ItemTreeView.prototype.notify = function(action, type, ids, extraData) var savedSelection = this.saveSelection(); + // Redraw the tree (for tag color changes) + if (action == 'redraw') { + this._treebox.invalidate(); + return; + } + // If refreshing a single item, just unselect and reselect it if (action == 'refresh') { if (type == 'share-items') { @@ -2410,11 +2416,19 @@ Zotero.ItemTreeView.prototype.onDragExit = function (event) { Zotero.ItemTreeView.prototype.isSeparator = function(row) { return false; } Zotero.ItemTreeView.prototype.getRowProperties = function(row, prop) { } -Zotero.ItemTreeView.prototype.getColumnProperties = function(col, prop) { } - -/* Mark items not matching search as context rows, displayed in gray */ +Zotero.ItemTreeView.prototype.getColumnProperties = function(col, prop) { } Zotero.ItemTreeView.prototype.getCellProperties = function(row, col, prop) { - if (this._searchMode && !this._searchItemIDs[this._getItemAtRow(row).ref.id]) { + var itemID = this._getItemAtRow(row).ref.id; + + // Set tag colors + if (color = Zotero.Tags.getItemColor(itemID)) { + var aServ = Components.classes["@mozilla.org/atom-service;1"]. + getService(Components.interfaces.nsIAtomService); + prop.AppendElement(aServ.getAtom("color" + color.substr(1))); + } + + // Mark items not matching search as context rows, displayed in gray + if (this._searchMode && !this._searchItemIDs[itemID]) { var aServ = Components.classes["@mozilla.org/atom-service;1"]. getService(Components.interfaces.nsIAtomService); prop.AppendElement(aServ.getAtom("contextRow")); diff --git a/chrome/content/zotero/xpcom/notifier.js b/chrome/content/zotero/xpcom/notifier.js index 0a231d6b8..09fcdf0d2 100644 --- a/chrome/content/zotero/xpcom/notifier.js +++ b/chrome/content/zotero/xpcom/notifier.js @@ -89,7 +89,7 @@ Zotero.Notifier = new function(){ * Possible values: * * event: 'add', 'modify', 'delete', 'move' ('c', for changing parent), - * 'remove' (ci, it), 'refresh', 'trash' + * 'remove' (ci, it), 'refresh', 'redraw', 'trash' * type - 'collection', 'search', 'item', 'collection-item', 'item-tag', 'tag', 'group' * ids - single id or array of ids * diff --git a/chrome/skin/default/zotero/overlay.css b/chrome/skin/default/zotero/overlay.css index 62bfa96a8..714d88fb1 100644 --- a/chrome/skin/default/zotero/overlay.css +++ b/chrome/skin/default/zotero/overlay.css @@ -70,6 +70,78 @@ margin-right: 5px; } +/* Set tag colors */ +#zotero-items-tree treechildren::-moz-tree-cell-text(colorFFFFFF) { color:#FFFFFF } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorFFCCCC) { color:#FFCCCC } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorFFCC99) { color:#FFCC99 } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorFFFF99) { color:#FFFF99 } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorFFFFCC) { color:#FFFFCC } +#zotero-items-tree treechildren::-moz-tree-cell-text(color99FF99) { color:#99FF99 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color99FFFF) { color:#99FFFF } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorCCFFFF) { color:#CCFFFF } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorCCCCFF) { color:#CCCCFF } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorFFCCFF) { color:#FFCCFF } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorCCCCCC) { color:#CCCCCC } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorFF6666) { color:#FF6666 } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorFF9966) { color:#FF9966 } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorFFFF66) { color:#FFFF66 } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorFFFF33) { color:#FFFF33 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color66FF99) { color:#66FF99 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color33FFFF) { color:#33FFFF } +#zotero-items-tree treechildren::-moz-tree-cell-text(color66FFFF) { color:#66FFFF } +#zotero-items-tree treechildren::-moz-tree-cell-text(color9999FF) { color:#9999FF } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorFF99FF) { color:#FF99FF } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorC0C0C0) { color:#C0C0C0 } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorFF0000) { color:#FF0000 } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorFF9900) { color:#FF9900 } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorFFCC66) { color:#FFCC66 } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorFFFF00) { color:#FFFF00 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color33FF33) { color:#33FF33 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color66CCCC) { color:#66CCCC } +#zotero-items-tree treechildren::-moz-tree-cell-text(color33CCFF) { color:#33CCFF } +#zotero-items-tree treechildren::-moz-tree-cell-text(color6666CC) { color:#6666CC } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorCC66CC) { color:#CC66CC } +#zotero-items-tree treechildren::-moz-tree-cell-text(color999999) { color:#999999 } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorCC0000) { color:#CC0000 } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorFF6600) { color:#FF6600 } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorFFCC33) { color:#FFCC33 } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorFFCC00) { color:#FFCC00 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color33CC00) { color:#33CC00 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color00CCCC) { color:#00CCCC } +#zotero-items-tree treechildren::-moz-tree-cell-text(color3366FF) { color:#3366FF } +#zotero-items-tree treechildren::-moz-tree-cell-text(color6633FF) { color:#6633FF } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorCC33CC) { color:#CC33CC } +#zotero-items-tree treechildren::-moz-tree-cell-text(color666666) { color:#666666 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color990000) { color:#990000 } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorCC6600) { color:#CC6600 } +#zotero-items-tree treechildren::-moz-tree-cell-text(colorCC9933) { color:#CC9933 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color999900) { color:#999900 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color009900) { color:#009900 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color339999) { color:#339999 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color3333FF) { color:#3333FF } +#zotero-items-tree treechildren::-moz-tree-cell-text(color6600CC) { color:#6600CC } +#zotero-items-tree treechildren::-moz-tree-cell-text(color993399) { color:#993399 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color333333) { color:#333333 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color660000) { color:#660000 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color993300) { color:#993300 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color996633) { color:#996633 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color666600) { color:#666600 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color006600) { color:#006600 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color336666) { color:#336666 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color000099) { color:#000099 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color333399) { color:#333399 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color663366) { color:#663366 } +/*#zotero-items-tree treechildren::-moz-tree-cell-text(color000000) { color:#000000 }*/ +#zotero-items-tree treechildren::-moz-tree-cell-text(color330000) { color:#330000 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color663300) { color:#663300 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color663333) { color:#663333 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color333300) { color:#333300 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color003300) { color:#003300 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color003333) { color:#003333 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color000066) { color:#000066 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color330099) { color:#330099 } +#zotero-items-tree treechildren::-moz-tree-cell-text(color330033) { color:#330033 } + /* Style search results, display non-matches in gray */ #zotero-items-tree treechildren::-moz-tree-cell-text(contextRow) { color: gray;