# ***** BEGIN LICENSE BLOCK ***** # Version: MPL 1.1/GPL 2.0/LGPL 2.1 # # The contents of this file are subject to the Mozilla Public License Version # 1.1 (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" basis, # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License # for the specific language governing rights and limitations under the # License. # # The Original Code is the Places Toolbar View. # # The Initial Developer of the Original Code is Google Inc. # Portions created by the Initial Developer are Copyright (C) 2005-2006 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Annie Sullivan # Ben Goodger # Myk Melez # Marco Bonardo # Asaf Romano # # Alternatively, the contents of this file may be used under the terms of # either the GNU General Public License Version 2 or later (the "GPL"), or # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), # in which case the provisions of the GPL or the LGPL are applicable instead # of those above. If you wish to allow use of your version of this file only # under the terms of either the GPL or the LGPL, and not to allow others to # use your version of this file under the terms of the MPL, indicate your # decision by deleting the provisions above and replace them with the notice # and other provisions required by the GPL or the LGPL. If you do not delete # the provisions above, a recipient may use your version of this file under # the terms of any one of the MPL, the GPL or the LGPL. # # ***** END LICENSE BLOCK ***** %browserDTD; ]> document.getAnonymousElementByAttribute(this, "class", "bookmarks-toolbar-items") document.getAnonymousElementByAttribute(this, "class", "toolbar-drop-indicator") document.getAnonymousElementByAttribute(this, "class", "chevron") document.getAnonymousElementByAttribute(this, "anonid", "chevronPopup") null true document.defaultView.getComputedStyle(this.parentNode, "") .direction == "rtl" scrollRect.right); } child.style.visibility = childOverflowed ? "hidden" : "visible"; } // We rebuild the chevron on popupShowing, so if it is open // we must update it. if (this._chevron.open) this._updateChevronPopupNodesVisibility(); ]]> element for the container, // we need the . var popup = parentElt.firstChild; // Move the node. popup.removeChild(nodeElt); popup.insertBefore(nodeElt, popup.childNodes[aNewIndex]); } }, nodeTitleChanged: function TV_V_nodeTitleChanged(aNode, aNewTitle) { let nodeElt = aNode._DOMElement; NS_ASSERT(nodeElt, "node must have _DOMElement set"); // There's no UI representation for the root node, thus there's // nothing to be done when the title changes. if (nodeElt == this._self) return; if (nodeElt.parentNode == this._self) { // Node is on the toolbar nodeElt.label = aNewTitle; this._self.updateChevron(); } else { // Node is within a built menu. nodeElt.label = aNewTitle || PlacesUIUtils.getBestTitle(aNode); } }, nodeURIChanged: function TV_V_nodeURIChanged(aNode, aURIString) { let nodeElt = aNode._DOMElement; NS_ASSERT(nodeElt, "node must have _DOMElement set"); nodeElt.setAttribute("scheme", PlacesUIUtils.guessUrlSchemeForUI(aURIString)); }, nodeIconChanged: function TV_V_nodeIconChanged(aNode) { let nodeElt = aNode._DOMElement; NS_ASSERT(nodeElt, "node must have _DOMElement set"); // There's no UI representation for the root node, thus there's // nothing to be done when the icon changes. if (nodeElt == this._self) return; let icon = aNode.icon; if (icon) { if (nodeElt.getAttribute("image") != icon) nodeElt.setAttribute("image", icon); } else nodeElt.removeAttribute("image"); }, nodeAnnotationChanged: function TV_V_nodeAnnotationChanged(aNode, aAnno) { // Ensure the changed annotation is a livemark one. if (/^livemark\//.test(aAnno) && PlacesUtils.nodeIsLivemarkContainer(aNode)) { let nodeElt = aNode._DOMElement; NS_ASSERT(nodeElt, "node must have _DOMElement set"); if (!nodeElt.hasAttribute("livemark")) nodeElt.setAttribute("livemark", "true"); // Add or remove the livemark status menuitem. PlacesUIUtils.ensureLivemarkStatusMenuItem(nodeElt.firstChild); } }, nodeHistoryDetailsChanged: function() { }, nodeTagsChanged: function() { }, nodeDateAddedChanged: function() { }, nodeLastModifiedChanged: function() { }, nodeKeywordChanged: function() { }, nodeReplaced: function TV_V_nodeReplaced(aParentNode, aOldNode, aNewNode, aIndex) { let nodeElt = aOldNode._DOMElement; NS_ASSERT(nodeElt, "node must have _DOMElement set"); // No worries: If nodeElt is the last item (i.e. no nextSibling), // insertNewItem/insertNewItemToPopup will insert the new element as // the last item. let next = nodeElt.nextSibling; let parentElt = aParentNode._DOMElement; NS_ASSERT(parentElt, "parent node must have _DOMElement set"); if (parentElt == this._self) { // Node is on the toolbar. this._self.removeItem(nodeElt); this._self.insertNewItem(aNewNode, next); this._self.updateChevron(); } else if (parentElt._built) { // Node is within a built menu. let popup = parentElt.firstChild; popup.removeItem(nodeElt); this._self.insertNewItemToPopup(aNewNode, popup, next); } }, containerOpened: function TV_V_containerOpened(aContainer) { this.invalidateContainer(aContainer); }, containerClosed: function TV_V_containerClosed(aContainer) { this.invalidateContainer(aContainer); }, invalidateContainer: function TV_V_invalidateContainer(aContainer) { let containerNodeElt = aContainer._DOMElement; NS_ASSERT(containerNodeElt, "node must have _DOMElement set"); if (containerNodeElt == this._self) { // Container is the toolbar itself. this._self._rebuild(); } else if (containerNodeElt._built) { // Container is a built menu. containerNodeElt._built = false; // If the menupopup is open we should live-update it. if (containerNodeElt.open) this._self._rebuildPopup(containerNodeElt.firstChild); } }, sortingChanged: function TV_V_sortingChanged(aSortingMode) { } })]]> 0) { if (aPopup._emptyMenuItem) aPopup._emptyMenuItem.hidden = true; for (let i = 0; i < cc; ++i) { var child = resultNode.getChild(i); this.insertNewItemToPopup(child, aPopup, null); } } else { // This menu is empty. If there is no static content, add // an element to show it is empty. if (aPopup._startMarker == -1 && aPopup._endMarker == -1) this._showEmptyMenuItem(aPopup); } aPopup.parentNode._built = true; ]]> nodeRect.right - threshold) : (aEvent.clientX < nodeRect.left + threshold)) { // Drop before this folder. dropPoint.ip = new InsertionPoint(PlacesUtils.getConcreteItemId(this._resultNode), nodeIndex, Ci.nsITreeView.DROP_BEFORE); dropPoint.beforeIndex = nodeIndex; } else if (this._isRTL ? (aEvent.clientX > nodeRect.left + threshold) : (aEvent.clientX < nodeRect.right - threshold)) { // Drop inside this folder. dropPoint.ip = new InsertionPoint(PlacesUtils.getConcreteItemId(xulNode.node), -1, Ci.nsITreeView.DROP_ON, PlacesUtils.nodeIsTagQuery(xulNode.node)); dropPoint.beforeIndex = nodeIndex; dropPoint.folderNode = xulNode; } else { // Drop after this folder. let beforeIndex = (nodeIndex == this.childNodes.length - 1) ? -1 : nodeIndex + 1; dropPoint.ip = new InsertionPoint(PlacesUtils.getConcreteItemId(this._resultNode), beforeIndex, Ci.nsITreeView.DROP_BEFORE); dropPoint.beforeIndex = beforeIndex; } } else { // This is a non-folder node or a read-only folder. // Drop before it with regards to RTL mode. let threshold = nodeRect.width * 0.5; if (this._isRTL ? (aEvent.clientX > nodeRect.left + threshold) : (aEvent.clientX < nodeRect.left + threshold)) { // Drop before this bookmark. dropPoint.ip = new InsertionPoint(PlacesUtils.getConcreteItemId(this._resultNode), nodeIndex, Ci.nsITreeView.DROP_BEFORE); dropPoint.beforeIndex = nodeIndex; } else { // Drop after this bookmark. let beforeIndex = nodeIndex == this.childNodes.length - 1 ? -1 : nodeIndex + 1; dropPoint.ip = new InsertionPoint(PlacesUtils.getConcreteItemId(this._resultNode), beforeIndex, Ci.nsITreeView.DROP_BEFORE); dropPoint.beforeIndex = beforeIndex; } } } else { // We are most likely dragging on the empty area of the // toolbar, we should drop after the last node. dropPoint.ip = new InsertionPoint(PlacesUtils.getConcreteItemId(this._resultNode), -1, Ci.nsITreeView.DROP_BEFORE); dropPoint.beforeIndex = -1; } return dropPoint; ]]> = Math.abs(translateX/2)) { // Don't start the drag event.preventDefault(); // Open the menu draggedDOMNode.open = true; return; } // if the menu is open, close it if (draggedDOMNode.open) { draggedDOMNode.firstChild.hidePopup(); draggedDOMNode.open = false; } } // activate the view and cache the dragged node this._draggedNode = draggedDOMNode.node; this.focus(); this._controller.setDataTransfer(event); event.stopPropagation(); ]]> #ifdef XP_UNIX #ifndef XP_MACOSX #endif #endif