# ***** 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 # # 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", "toolbar-drop-indicator-bar") document.getAnonymousElementByAttribute(this, "class", "chevron") null null xulNode.boxObject.x + (xulNode.boxObject.width * 0.75)) || (!isRTL && event.clientX < xulNode.boxObject.x + (xulNode.boxObject.width * 0.25))) { // Drop to the left of this folder. dropPoint.ip = new InsertionPoint(PlacesUtils.getConcreteItemId(result.root), i, -1); dropPoint.beforeIndex = i; return dropPoint; } else if ((isRTL && event.clientX > xulNode.boxObject.x + (xulNode.boxObject.width * 0.25)) || (!isRTL && event.clientX < xulNode.boxObject.x + (xulNode.boxObject.width * 0.75))) { // Drop inside this folder. dropPoint.ip = new InsertionPoint(PlacesUtils.getConcreteItemId(xulNode.node), -1, 1, PlacesUtils.nodeIsTagQuery(xulNode.node)); dropPoint.beforeIndex = i; dropPoint.folderNode = xulNode; return dropPoint; } } else { // This is a non-folder node. If the mouse is left (or right, in // RTL UI) of the middle, drop before the folder. Otehrwise, // we'll drop after if ((isRTL && event.clientX > xulNode.boxObject.x + (xulNode.boxObject.width / 2)) || (!isRTL && event.clientX < xulNode.boxObject.x + (xulNode.boxObject.width / 2))) { // Drop before this bookmark. dropPoint.ip = new InsertionPoint(PlacesUtils.getConcreteItemId(result.root), i, -1); dropPoint.beforeIndex = i; return dropPoint; } } } // Should drop after the last node. dropPoint.ip = new InsertionPoint(PlacesUtils.getConcreteItemId(result.root), -1, 1); dropPoint.beforeIndex = -1; return dropPoint; }, onDragStart: function TBV_DO_onDragStart(aEvent, aXferData, aDragAction) { var draggedXulNode = aEvent.target; // sub menus have their own d&d handlers if (draggedXulNode.parentNode != this._self) return false; if (draggedXulNode.localName == "toolbarbutton" && draggedXulNode.getAttribute("type") == "menu") { #ifdef XP_WIN // Support folder dragging on the personal toolbar when the user // holds the "alt" or "shift" key while dragging. // Ctrl+drag is Copy if (!aEvent.shiftKey && !aEvent.altKey && !aEvent.ctrlKey) return false; #else // Support folder dragging on the personal toolbar when the user // holds the "shift" key while dragging // Ctrl+drag is Copy if (!aEvent.shiftKey && !aEvent.ctrlKey) return false; #endif draggedXulNode.firstChild.hidePopup(); } // activate the view and cache the dragged node this._self._draggedNode = draggedXulNode.node; this._self.focus(); this._self._controller.setDataTransfer(aEvent); return true; }, canDrop: function TBV_DO_canDrop(aEvent, aDragSession) { // Cache the dataTransfer PlacesControllerDragHelper.currentDataTransfer = aEvent.dataTransfer; var ip = this._self.insertionPoint; return ip && PlacesControllerDragHelper.canDrop(ip); }, onDragOver: function TBV_DO_onDragOver(event, flavor, session) { PlacesControllerDragHelper.currentDropTarget = event.target; var dropPoint = this._getDropPoint(event); var ib = this._self._dropIndicatorBar; if (this._ibTimer) { this._ibTimer.cancel(); this._ibTimer = null; } if (dropPoint.folderNode || event.originalTarget == this._self._chevron) { // Dropping over a menubutton or chevron button // set styles and timer to open relative menupopup var overNode = dropPoint.folderNode || this._self._chevron; if (this._overFolder.node != overNode) { this._clearOverFolder(); this._overFolder.node = overNode; this._overFolder.openTimer = this._setTimer(this._overFolder.hoverTime); } if (!this._overFolder.node.hasAttribute("dragover")) this._overFolder.node.setAttribute("dragover", "true"); ib.removeAttribute("dragging"); } else { // Dragging over a normal toolbarbutton, // show indicator bar and move it to the appropriate drop point. if (!ib.hasAttribute("dragging")) ib.setAttribute("dragging", "true"); var ind = ib.firstChild; var halfInd = ind.boxObject.width / 2; var direction = document.defaultView.getComputedStyle(this._self.parentNode, "").direction; if (direction == "ltr") { halfInd = Math.ceil(halfInd); if (!this._self.childNodes.length) ind.style.marginLeft = 0 - this._self.boxObject.x - halfInd + 'px' else if (dropPoint.beforeIndex == -1) ind.style.marginLeft = this._self.lastChild.boxObject.x + this._self.lastChild.boxObject.width - this._self.boxObject.x - halfInd + 'px'; else ind.style.marginLeft = this._self.childNodes[dropPoint.beforeIndex].boxObject.x - this._self.boxObject.x - halfInd + 'px'; } else { halfInd = Math.floor(halfInd); if (this._self.childNodes.length == 0) ind.style.marginRight = this._self.boxObject.width + 'px'; else if (dropPoint.beforeIndex == -1) { ind.style.marginRight = this._self.boxObject.width - (this._self.childNodes[this._self.childNodes.length - 1].boxObject.x + halfInd) +'px'; } else { ind.style.marginRight = this._self.boxObject.width - (this._self.childNodes[dropPoint.beforeIndex].boxObject.x + this._self.childNodes[dropPoint.beforeIndex].boxObject.width - this._self.boxObject.x + halfInd) + 'px'; } } // Clear out old folder information this._clearOverFolder(); } }, onDrop: function TBV_DO_onDrop(event, dropData, session) { // Cache the dataTransfer PlacesControllerDragHelper.currentDataTransfer = event.dataTransfer; var dropPoint = this._getDropPoint(event); if (!dropPoint) return; PlacesControllerDragHelper.onDrop(dropPoint.ip); }, onDragExit: function TBV_DO_onDragExit(event, session) { PlacesControllerDragHelper.currentDropTarget = null; PlacesControllerDragHelper.currentDataTransfer = null; // Set timer to turn off indicator bar (if we turn it off // here, dragenter might be called immediately after, creating // flicker.) if (this._ibTimer) this._ibTimer.cancel(); this._ibTimer = this._setTimer(10); // Close any folder being hovered over if (this._overFolder.node) this._overFolder.closeTimer = this._setTimer(this._overFolder.hoverTime); this._self._draggedNode = null; }, getSupportedFlavours: function TBV_DO_getSupportedFlavours() { return PlacesControllerDragHelper.flavourSet; } })]]> 0) { if (aPopup._emptyMenuItem) aPopup._emptyMenuItem.hidden = true; for (var 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._built = true; ]]>