From e97f0109eae8286c54ad6bc191b7231bce8a635c Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Thu, 08 Mar 2012 05:00:42 -0500
Subject: [PATCH] - Scroll long lists on drag&drop (#1485946)

---
 CHANGELOG                                |    1 
 skins/default/templates/folders.html     |    6 +-
 skins/default/templates/mail.html        |    4 +-
 skins/default/templates/addressbook.html |    4 +-
 skins/default/functions.js               |   57 ++++++++++++++++++++++++++--
 5 files changed, 60 insertions(+), 12 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 929c04b..94f5375 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG Roundcube Webmail
 ===========================
 
+- Scroll long lists on drag&drop (#1485946)
 - Fix handling of % character in IMAP protocol (#1488382)
 - Fix duplicate names handling in addressbook searches (#1488375)
 - Fix displaying HTML messages from Disqus (#1488372)
diff --git a/skins/default/functions.js b/skins/default/functions.js
index 539f6ff..aab386b 100644
--- a/skins/default/functions.js
+++ b/skins/default/functions.js
@@ -558,6 +558,44 @@
 
 };
 
+/**
+ * Scroller
+ */
+
+function rcmail_scroller(list, top, bottom)
+{
+  var ref = this;
+
+  this.list = $(list);
+  this.top = $(top);
+  this.bottom = $(bottom);
+  this.step_size = 6;
+  this.step_time = 20;
+  this.delay = 500;
+
+  this.top
+    .mouseenter(function() { ref.ts = window.setTimeout(function() { ref.scroll('down'); }, ref.delay); })
+    .mouseout(function() { if (ref.ts) window.clearTimeout(ref.ts); });
+
+  this.bottom
+    .mouseenter(function() { ref.ts = window.setTimeout(function() { ref.scroll('up'); }, ref.delay); })
+    .mouseout(function() { if (ref.ts) window.clearTimeout(ref.ts); });
+
+  this.scroll = function(dir)
+  {
+    var ref = this, size = this.step_size;
+
+    if (!rcmail.drag_active)
+      return;
+
+    if (dir == 'down')
+      size *= -1;
+
+    this.list.get(0).scrollTop += size;
+    this.ts = window.setTimeout(function() { ref.scroll(dir); }, this.step_time);
+  };
+};
+
 
 // Events handling in iframes (eg. preview pane)
 function iframe_events()
@@ -565,7 +603,7 @@
   // this==iframe
   var doc = this.contentDocument ? this.contentDocument : this.contentWindow ? this.contentWindow.document : null;
   rcube_event.add_listener({ element: doc, object:rcmail_ui, method:'body_mouseup', event:'mouseup' });
-}
+};
 
 // Abbreviate mailbox names to fit width of the container
 function rcube_render_mailboxlist()
@@ -592,7 +630,7 @@
       elem.attr('title', text);
     elem.contents().filter(function(){ return (this.nodeType == 3); }).get(0).data = abbrev;
   });
-}
+};
 
 // inspired by https://gist.github.com/24261/7fdb113f1e26111bd78c0c6fe515f6c0bf418af5
 function fit_string_to_size(str, elem, len)
@@ -636,12 +674,12 @@
   }
 
   return result;
-}
+};
 
 function update_quota(data)
 {
   percent_indicator(rcmail.gui_objects.quotadisplay, data);
-}
+};
 
 // percent (quota) indicator
 function percent_indicator(obj, data)
@@ -705,7 +743,7 @@
   $(obj).html('').append(bar1).append(bar2).append(main);
   // update #quotaimg title
   $('#quotaimg').attr('title', data.title);
-}
+};
 
 // Optional parameters used by TinyMCE
 var rcmail_editor_settings = {
@@ -740,6 +778,8 @@
       rcmail.addEventListener('responseaftergetunread', rcube_render_mailboxlist);
       rcmail.addEventListener('responseaftercheck-recent', rcube_render_mailboxlist);
       rcmail.addEventListener('aftercollapse-folder', rcube_render_mailboxlist);
+
+      new rcmail_scroller('#mailboxlist-content', '#mailboxlist-title', '#mailboxlist-footer');
     }
 
     if (rcmail.env.action == 'compose')
@@ -747,5 +787,12 @@
   }
   else if (rcmail.env.task == 'addressbook') {
     rcmail.addEventListener('afterupload-photo', function(){ rcmail_ui.show_popup('uploadform', false); });
+
+    if (rcmail.gui_objects.folderlist)
+      new rcmail_scroller('#directorylist-content', '#directorylist-title', '#directorylist-footer');
+  }
+  else if (rcmail.env.task == 'settings') {
+    if (rcmail.gui_objects.subscriptionlist)
+      new rcmail_scroller('#folderlist-content', '#folderlist-title', '#folderlist-footer');
   }
 }
diff --git a/skins/default/templates/addressbook.html b/skins/default/templates/addressbook.html
index 0174f4b..4cab511 100644
--- a/skins/default/templates/addressbook.html
+++ b/skins/default/templates/addressbook.html
@@ -52,11 +52,11 @@
 
 <div id="directorylistbox">
 <div id="directorylist-title" class="boxtitle"><roundcube:label name="groups" /></div>
-<div class="boxlistcontent">
+<div id="directorylist-content" class="boxlistcontent">
   <roundcube:object name="directorylist" id="directorylist" />
   <roundcube:object name="groupslist" id="contactgroupslist" />
 </div>
-<div class="boxfooter">
+<div id="directorylist-footer" class="boxfooter">
   <roundcube:button command="group-create" type="link" title="newcontactgroup" class="buttonPas addgroup" classAct="button addgroup" content=" " />
   <roundcube:button name="groupmenulink" id="groupmenulink" type="link" title="moreactions" class="button groupactions" onclick="rcmail_ui.show_popup('groupmenu');return false" content=" " />
 </div>
diff --git a/skins/default/templates/folders.html b/skins/default/templates/folders.html
index 8f3aa81..1ae8809 100644
--- a/skins/default/templates/folders.html
+++ b/skins/default/templates/folders.html
@@ -21,12 +21,12 @@
 <div id="mainscreen">
 
 <div id="folder-manager">
-<div id="folder-title" class="boxtitle"><span class="rightalign"><roundcube:label name="subscribed" /></span><roundcube:label name="folders" /></div>
-<div class="boxlistcontent">
+<div id="folderlist-title" class="boxtitle"><span class="rightalign"><roundcube:label name="subscribed" /></span><roundcube:label name="folders" /></div>
+<div id="folderlist-content" class="boxlistcontent">
     <roundcube:object name="foldersubscription" form="subscriptionform" id="subscription-table" noheader="true"
         cellpadding="1" cellspacing="0" summary="Folder subscription table" class="records-table" />
 </div>
-<div class="boxfooter">
+<div id="folderlist-footer" class="boxfooter">
     <roundcube:button command="create-folder" type="link" title="createfolder" class="buttonPas addgroup" classAct="button addgroup" content=" " />
     <roundcube:button name="mailboxmenulink" id="mailboxmenulink" type="link" title="folderactions" class="button groupactions" onclick="rcmail_ui.show_popup('mailboxmenu');return false" content=" " />
 
diff --git a/skins/default/templates/mail.html b/skins/default/templates/mail.html
index 12581d7..74e9847 100644
--- a/skins/default/templates/mail.html
+++ b/skins/default/templates/mail.html
@@ -27,10 +27,10 @@
 <div id="mailleftcontainer">
 <div id="mailboxlist-container">
 <div id="mailboxlist-title" class="boxtitle"><roundcube:label name="mailboxlist" /></div>
-<div class="boxlistcontent">
+<div id="mailboxlist-content"  class="boxlistcontent">
 <roundcube:object name="mailboxlist" id="mailboxlist" folder_filter="mail" />
 </div>
-<div class="boxfooter">
+<div id="mailboxlist-footer" class="boxfooter">
   <roundcube:button name="mailboxmenulink" id="mailboxmenulink" type="link" title="folderactions" class="button groupactions" onclick="rcmail_ui.show_popup('mailboxmenu');return false" content=" " />
 
 <roundcube:if condition="env:quota" />

--
Gitblit v1.9.1