From b34d67907566663ab46b487b99817673ce4e32e5 Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Sun, 27 Apr 2014 09:35:07 -0400
Subject: [PATCH] Specify licenses in all javascript files and blocks to please LibreJS

---
 program/js/treelist.js |  128 ++++++++++++++++++++++++++++++++++--------
 1 files changed, 104 insertions(+), 24 deletions(-)

diff --git a/program/js/treelist.js b/program/js/treelist.js
index 5913f44..353eb6b 100644
--- a/program/js/treelist.js
+++ b/program/js/treelist.js
@@ -1,20 +1,33 @@
-/*
- +-----------------------------------------------------------------------+
- | Roundcube Treelist widget                                             |
- |                                                                       |
- | This file is part of the Roundcube Webmail client                     |
- | Copyright (C) 2013, The Roundcube Dev Team                            |
- |                                                                       |
- | Licensed under the GNU General Public License version 3 or            |
- | any later version with exceptions for skins & plugins.                |
- | See the README file for a full license statement.                     |
- |                                                                       |
- +-----------------------------------------------------------------------+
- | Authors: Thomas Bruederli <roundcube@gmail.com>                       |
- +-----------------------------------------------------------------------+
- | Requires: common.js                                                   |
- +-----------------------------------------------------------------------+
-*/
+/**
+ * Roundcube Treelist Widget
+ *
+ * This file is part of the Roundcube Webmail client
+ *
+ * @licstart  The following is the entire license notice for the
+ * JavaScript code in this file.
+ *
+ * Copyright (c) 2013-2014, The Roundcube Dev Team
+ *
+ * The JavaScript code in this page is free software: you can
+ * redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GNU GPL) as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option)
+ * any later version.  The code is distributed WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE.  See the GNU GPL for more details.
+ *
+ * As additional permission under GNU GPL version 3 section 7, you
+ * may distribute non-source (e.g., minimized or compacted) forms of
+ * that code without the copy of the GNU GPL normally required by
+ * section 4, provided you include this license notice and a URL
+ * through which recipients can access the Corresponding Source.
+ *
+ * @licend  The above is the entire license notice
+ * for the JavaScript code in this file.
+ *
+ * @author Thomas Bruederli <roundcube@gmail.com>
+ * @requires jquery.js, common.js
+ */
 
 
 /**
@@ -28,6 +41,9 @@
     id_prefix: '',
     autoexpand: 1000,
     selectable: false,
+    scroll_delay: 500,
+    scroll_step: 5,
+    scroll_speed: 20,
     check_droptarget: function(node){ return !node.virtual }
   }, p || {});
 
@@ -42,6 +58,7 @@
     autoexpand_item,
     body_scroll_top = 0,
     list_scroll_top = 0,
+    scroll_timer,
     me = this;
 
 
@@ -52,6 +69,7 @@
   this.collapse = collapse;
   this.select = select;
   this.render = render;
+  this.reset = reset;
   this.drag_start = drag_start;
   this.drag_end = drag_end;
   this.intersects = intersects;
@@ -76,6 +94,7 @@
   // register click handlers on list
   container.on('click', 'div.treetoggle', function(e){
     toggle(dom2id($(this).parent()));
+    e.stopPropagation();
   });
 
   container.on('click', 'li', function(e){
@@ -99,11 +118,6 @@
     if (node = indexbyid[id]) {
       node.collapsed = typeof set == 'undefined' || set;
       update_dom(node);
-
-      // Work around a bug in IE6 and IE7, see #1485309
-      if (window.bw && (bw.ie6 || bw.ie7) && node.collapsed) {
-        id2dom(node.id).next().children('ul:visible').hide().show();
-      }
 
       if (recursive && node.children) {
         for (var i=0; i < node.children.length; i++) {
@@ -310,6 +324,20 @@
   }
 
   /**
+   *
+   */
+  function reset()
+  {
+    select('');
+
+    data = [];
+    indexbyid = {};
+    drag_active = false;
+
+    container.html('');
+  }
+
+  /**
    * Render the tree list from the internal data structure
    */
   function render()
@@ -461,6 +489,7 @@
 
     body_scroll_top = bw.ie ? 0 : window.pageYOffset;
     list_scroll_top = container.parent().scrollTop();
+    pos.top += list_scroll_top;
 
     drag_active = true;
     box_coords = {
@@ -476,6 +505,7 @@
       item = li.children().first().get(0);
       if (height = item.offsetHeight) {
         pos = $(item).offset();
+        pos.top += list_scroll_top;
         item_coords[id] = {
           x1: pos.left,
           y1: pos.top,
@@ -485,6 +515,38 @@
         };
       }
     }
+
+    // enable auto-scrolling of list container
+    if (container.height() > container.parent().height()) {
+      container.parent()
+        .mousemove(function(e) {
+          var scroll = 0,
+            mouse = rcube_event.get_mouse_pos(e);
+          mouse.y -= container.parent().offset().top;
+
+          if (mouse.y < 25 && list_scroll_top > 0) {
+            scroll = -1; // up
+          }
+          else if (mouse.y > container.parent().height() - 25) {
+            scroll = 1; // down
+          }
+
+          if (drag_active && scroll != 0) {
+            if (!scroll_timer)
+              scroll_timer = window.setTimeout(function(){ drag_scroll(scroll); }, p.scroll_delay);
+          }
+          else if (scroll_timer) {
+            window.clearTimeout(scroll_timer);
+            scroll_timer = null;
+          }
+        })
+        .mouseleave(function() {
+          if (scroll_timer) {
+            window.clearTimeout(scroll_timer);
+            scroll_timer = null;
+          }
+        });
+    }
   }
 
   /**
@@ -493,6 +555,7 @@
   function drag_end()
   {
     drag_active = false;
+    scroll_timer = null;
 
     if (autoexpand_timer) {
       clearTimeout(autoexpand_timer);
@@ -504,16 +567,33 @@
   }
 
   /**
+   * Scroll list container in the given direction
+   */
+  function drag_scroll(dir)
+  {
+    if (!drag_active)
+      return;
+
+    var old_top = list_scroll_top;
+    container.parent().get(0).scrollTop += p.scroll_step * dir;
+    list_scroll_top = container.parent().scrollTop();
+    scroll_timer = null;
+
+    if (list_scroll_top != old_top)
+      scroll_timer = window.setTimeout(function(){ drag_scroll(dir); }, p.scroll_speed);
+  }
+
+  /**
    * Determine if the given mouse coords intersect the list and one if its items
    */
   function intersects(mouse, highlight)
   {
     // offsets to compensate for scrolling while dragging a message
     var boffset = bw.ie ? -document.documentElement.scrollTop : body_scroll_top,
-      moffset = list_scroll_top - container.parent().scrollTop(),
+      moffset = container.parent().scrollTop(),
       result = null;
 
-    mouse.top = mouse.y + -moffset - boffset;
+    mouse.top = mouse.y + moffset - boffset;
 
     // no intersection with list bounding box
     if (mouse.x < box_coords.x1 || mouse.x >= box_coords.x2 || mouse.top < box_coords.y1 || mouse.top >= box_coords.y2) {

--
Gitblit v1.9.1