summaryrefslogtreecommitdiffstats
path: root/comm/suite/browser/linkToolbarItem.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/suite/browser/linkToolbarItem.js')
-rw-r--r--comm/suite/browser/linkToolbarItem.js215
1 files changed, 215 insertions, 0 deletions
diff --git a/comm/suite/browser/linkToolbarItem.js b/comm/suite/browser/linkToolbarItem.js
new file mode 100644
index 0000000000..1ae956a64d
--- /dev/null
+++ b/comm/suite/browser/linkToolbarItem.js
@@ -0,0 +1,215 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * LinkToolbarItem and its subclasses represent the buttons, menuitems,
+ * and menus that handle the various link types.
+ */
+function LinkToolbarItem (linkType) {
+ this.linkType = linkType;
+ this.xulElementId = "link-" + linkType;
+ this.xulPopupId = this.xulElementId + "-popup";
+ this.parentMenuButton = null;
+
+ this.getXULElement = function() {
+ return document.getElementById(this.xulElementId);
+ }
+
+ this.clear = function() {
+ this.disableParentMenuButton();
+ this.getXULElement().setAttribute("disabled", "true");
+ this.getXULElement().removeAttribute("href");
+ }
+
+ this.displayLink = function(linkElement) {
+ if (this.getXULElement().hasAttribute("href")) return false;
+
+ this.setItem(linkElement);
+ this.enableParentMenuButton();
+ return true;
+ }
+
+ this.setItem = function(linkElement) {
+ this.getXULElement().setAttribute("href", linkElement.href);
+ this.getXULElement().removeAttribute("disabled");
+ }
+
+ this.enableParentMenuButton = function() {
+ if(this.getParentMenuButton())
+ this.getParentMenuButton().removeAttribute("disabled");
+ }
+
+ this.disableParentMenuButton = function() {
+ if (!this.parentMenuButton) return;
+
+ this.parentMenuButton.setAttribute("disabled", "true");
+ this.parentMenuButton = null;
+ }
+
+ this.getParentMenuButton = function() {
+ if (!this.parentMenuButton)
+ this.parentMenuButton = getParentMenuButtonRecursive(
+ this.getXULElement());
+
+ return this.parentMenuButton;
+ }
+
+ function getParentMenuButtonRecursive(xulElement) {
+ if (!xulElement) return null;
+
+ if (xulElement.tagName == "toolbarbutton")
+ return xulElement;
+
+ return getParentMenuButtonRecursive(xulElement.parentNode)
+ }
+}
+
+
+function LinkToolbarButton (linkType) {
+ this.constructor(linkType);
+
+ this.clear = function() {
+ this.__proto__.clear.apply(this);
+
+ this.getXULElement().removeAttribute("tooltiptext");
+ }
+
+ this.setItem = function(linkElement) {
+ this.__proto__.setItem.apply(this, [linkElement]);
+
+ this.getXULElement().setAttribute("tooltiptext", linkElement.getTooltip());
+ }
+
+ this.enableParentMenuButton = function() { /* do nothing */ }
+ this.disableParentMenuButton = function() { /* do nothing */ }
+}
+LinkToolbarButton.prototype = new LinkToolbarItem;
+
+
+function LinkToolbarMenu (linkType) {
+ this.constructor(linkType);
+
+ this.clear = function() {
+ this.disableParentMenuButton();
+ this.getXULElement().setAttribute("disabled", "true");
+ clearPopup(this.getPopup());
+ }
+
+ function clearPopup(popup) {
+ while (popup.hasChildNodes())
+ popup.lastChild.remove();
+ }
+
+ this.getPopup = function() {
+ return document.getElementById(this.xulPopupId);
+ }
+
+ this.displayLink = function(linkElement) {
+ this.addMenuItem(linkElement);
+ this.getXULElement().removeAttribute("disabled");
+ this.enableParentMenuButton();
+ return true;
+ }
+
+ function match(first, second) {
+ if (!first && !second) return true;
+ if (!first || !second) return false;
+
+ return first == second;
+ }
+
+ this.addMenuItem = function(linkElement) {
+ this.getPopup().appendChild(this.createMenuItem(linkElement));
+ }
+
+ this.createMenuItem = function(linkElement) {
+ // XXX: clone a prototypical XUL element instead of hardcoding these
+ // attributes
+ var menuitem = document.createElement("menuitem");
+ menuitem.setAttribute("label", linkElement.getLabel());
+ menuitem.setAttribute("href", linkElement.href);
+ menuitem.setAttribute("class", "menuitem-iconic bookmark-item");
+
+ return menuitem;
+ }
+}
+LinkToolbarMenu.prototype = new LinkToolbarItem;
+
+
+function LinkToolbarTransientMenu (linkType) {
+ this.constructor(linkType);
+
+ this.getXULElement = function() {
+ if (this.__proto__.getXULElement.apply(this))
+ return this.__proto__.getXULElement.apply(this);
+ else
+ return this.createXULElement();
+ }
+
+ this.createXULElement = function() {
+ // XXX: clone a prototypical XUL element instead of hardcoding these
+ // attributes
+ var menu = document.createElement("menu");
+ menu.setAttribute("id", this.xulElementId);
+ menu.setAttribute("label", this.linkType);
+ menu.setAttribute("disabled", "true");
+ menu.setAttribute("class", "menu-iconic bookmark-item");
+ menu.setAttribute("container", "true");
+
+ document.getElementById("more-menu-popup").appendChild(menu);
+
+ return menu;
+ }
+
+ this.getPopup = function() {
+ if (!this.__proto__.getPopup.apply(this))
+ this.getXULElement().appendChild(this.createPopup());
+
+ return this.__proto__.getPopup.apply(this)
+ }
+
+ this.createPopup = function() {
+ var popup = document.createElement("menupopup");
+ popup.setAttribute("id", this.xulPopupId);
+
+ return popup;
+ }
+
+ this.clear = function() {
+ this.__proto__.clear.apply(this);
+
+ // XXX: we really want to use this instead of removeXULElement
+ //this.hideXULElement();
+ this.removeXULElement();
+ }
+
+ this.hideXULElement = function() {
+ /*
+ * XXX: using "hidden" or "collapsed" leads to a crash when you
+ * open the More menu under certain circumstances. Maybe
+ * related to bug 83906. As of 0.9.2 I it doesn't seem
+ * to crash anymore.
+ */
+ this.getXULElement().setAttribute("collapsed", "true");
+ }
+
+ this.removeXULElement = function() {
+ // XXX: stop using this method once it's safe to use hideXULElement
+ if (this.__proto__.getXULElement.apply(this))
+ this.__proto__.getXULElement.apply(this).remove();
+ }
+
+ this.displayLink = function(linkElement) {
+ if(!this.__proto__.displayLink.apply(this, [linkElement])) return false;
+
+ this.getXULElement().removeAttribute("collapsed");
+
+ // Show the 'miscellaneous' separator
+ document.getElementById("misc-separator").removeAttribute("collapsed");
+ return true;
+ }
+}
+
+LinkToolbarTransientMenu.prototype = new LinkToolbarMenu;
+