From ae6d2de17f740915e47c64d210680eb5e9850335 Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Wed, 06 Jun 2012 11:35:21 -0400
Subject: [PATCH] New feature to add mail attachments using drag & drop on HTML5 enabled browsers

---
 program/steps/mail/compose.inc |   65 +++++++++++++++++++++++++-------
 1 files changed, 50 insertions(+), 15 deletions(-)

diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index 4734227..70f657d 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -17,9 +17,6 @@
  +-----------------------------------------------------------------------+
  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
  +-----------------------------------------------------------------------+
-
- $Id$
-
 */
 
 // define constants for message compose mode
@@ -29,7 +26,6 @@
 define('RCUBE_COMPOSE_EDIT', 0x0109);
 
 $MESSAGE_FORM = null;
-$MESSAGE      = null;
 $COMPOSE_ID   = get_input_value('_id', RCUBE_INPUT_GET);
 $COMPOSE      = null;
 
@@ -119,7 +115,11 @@
   }
 
   // redirect to a unique URL with all parameters stored in session
-  $OUTPUT->redirect(array('_action' => 'compose', '_id' => $COMPOSE['id']));
+  $OUTPUT->redirect(array(
+    '_action' => 'compose',
+    '_id'     => $COMPOSE['id'],
+    '_search' => $_REQUEST['_search'],
+  ));
 }
 
 
@@ -181,7 +181,7 @@
   $MESSAGE = new rcube_message($msg_uid);
 
   // make sure message is marked as read
-  if ($MESSAGE && $MESSAGE->headers && empty($MESSAGE->headers->flags['SEEN']))
+  if ($MESSAGE->headers && empty($MESSAGE->headers->flags['SEEN']))
     $RCMAIL->storage->set_flag($msg_uid, 'SEEN');
 
   if (!empty($MESSAGE->headers->charset))
@@ -240,6 +240,9 @@
     if (!empty($COMPOSE['param']['attachment']))
       $MESSAGE->forward_attachment = true;
   }
+}
+else {
+  $MESSAGE = new stdClass();
 }
 
 $MESSAGE->compose = array();
@@ -764,7 +767,9 @@
 
   // If desired, set this textarea to be editable by TinyMCE
   if ($isHtml) {
+    $MESSAGE_BODY = htmlentities($MESSAGE_BODY, ENT_NOQUOTES, RCMAIL_CHARSET);
     $attrib['class'] = 'mce_editor';
+    $attrib['is_escaped'] = true;
     $textarea = new html_textarea($attrib);
     $out .= $textarea->show($MESSAGE_BODY);
   }
@@ -784,14 +789,14 @@
   // include HTML editor
   rcube_html_editor();
 
-  // include GoogieSpell
+  // Set language list
   if (!empty($CONFIG['enable_spellcheck'])) {
     $engine           = $RCMAIL->config->get('spellcheck_engine','googie');
     $dictionary       = (bool) $RCMAIL->config->get('spellcheck_dictionary');
     $spellcheck_langs = (array) $RCMAIL->config->get('spellcheck_languages',
       array('da'=>'Dansk', 'de'=>'Deutsch', 'en' => 'English', 'es'=>'Español',
             'fr'=>'Français', 'it'=>'Italiano', 'nl'=>'Nederlands', 'pl'=>'Polski',
-            'pt'=>'Português', 'fi'=>'Suomi', 'sv'=>'Svenska'));
+            'pt'=>'Português', 'ru'=>'Русский', 'fi'=>'Suomi', 'sv'=>'Svenska'));
 
     // googie works only with two-letter codes
     if ($engine == 'googie') {
@@ -813,11 +818,15 @@
     if (!$spellcheck_langs[$lang])
       $lang = 'en';
 
+    $OUTPUT->set_env('spell_langs', $spellcheck_langs);
+    $OUTPUT->set_env('spell_lang', $lang);
+
     $editor_lang_set = array();
     foreach ($spellcheck_langs as $key => $name) {
       $editor_lang_set[] = ($key == $lang ? '+' : '') . JQ($name).'='.JQ($key);
     }
 
+    // include GoogieSpell
     $OUTPUT->include_script('googiespell.js');
     $OUTPUT->add_script(sprintf(
       "var googie = new GoogieSpell('%s/images/googiespell/','%s&lang=', %s);\n".
@@ -829,7 +838,7 @@
       "googie.lang_learn_word = \"%s\";\n".
       "googie.setLanguages(%s);\n".
       "googie.setCurrentLanguage('%s');\n".
-      "googie.setSpellContainer('spellcheck-control');\n".
+      "googie.setDecoration(false);\n".
       "googie.decorateTextarea('%s');\n".
       "%s.set_env('spellcheck', googie);",
       $RCMAIL->output->get_skin_path(),
@@ -1152,10 +1161,22 @@
     $data = $message->get_part_content($pid);
   }
 
+  $mimetype = $part->ctype_primary . '/' . $part->ctype_secondary;
+  $filename = $part->filename;
+  if (!strlen($filename)) {
+    if ($mimetype == 'text/html') {
+      $filename = rcube_label('htmlmessage');
+    }
+    else {
+      $filename = 'Part_'.$pid;
+    }
+    $filename .= '.' . $part->ctype_secondary;
+  }
+
   $attachment = array(
     'group' => $COMPOSE['id'],
-    'name' => $part->filename ? $part->filename : 'Part_'.$pid.'.'.$part->ctype_secondary,
-    'mimetype' => $part->ctype_primary . '/' . $part->ctype_secondary,
+    'name' => $filename,
+    'mimetype' => $mimetype,
     'content_id' => $part->content_id,
     'data' => $data,
     'path' => $path,
@@ -1392,7 +1413,7 @@
   $attrib['value'] = '1';
   $checkbox = new html_checkbox($attrib);
 
-  if ($MESSAGE && in_array($compose_mode, array(RCUBE_COMPOSE_DRAFT, RCUBE_COMPOSE_EDIT)))
+  if (in_array($compose_mode, array(RCUBE_COMPOSE_DRAFT, RCUBE_COMPOSE_EDIT)))
     $mdn_default = (bool) $MESSAGE->headers->mdn_to;
   else
     $mdn_default = $RCMAIL->config->get('mdn_default');
@@ -1518,7 +1539,7 @@
 }
 
 
-function rcmail_adressbook_list($attrib = array())
+function rcmail_addressbook_list($attrib = array())
 {
     global $RCMAIL, $OUTPUT;
 
@@ -1547,7 +1568,7 @@
             $js_id, (!empty($source['name']) ? Q($source['name']) : Q($id)));
     }
 
-    $OUTPUT->add_gui_object('adressbookslist', $attrib['id']);
+    $OUTPUT->add_gui_object('addressbookslist', $attrib['id']);
 
     return html::tag('ul', $attrib, $out, html::$common_attrib);
 }
@@ -1569,6 +1590,19 @@
 }
 
 
+/**
+ * Register a certain container as active area to drop files onto
+ */
+function compose_file_drop_area($attrib)
+{
+    global $OUTPUT;
+
+    if ($attrib['id']) {
+        $OUTPUT->add_gui_object('filedrop', $attrib['id']);
+        $OUTPUT->set_env('filedrop', array('action' => 'upload', 'fieldname' => '_attachments'));
+    }
+}
+
 
 // register UI objects
 $OUTPUT->add_handlers(array(
@@ -1578,12 +1612,13 @@
   'composeattachmentlist' => 'rcmail_compose_attachment_list',
   'composeattachmentform' => 'rcmail_compose_attachment_form',
   'composeattachment' => 'rcmail_compose_attachment_field',
+  'filedroparea'    => 'compose_file_drop_area',
   'priorityselector' => 'rcmail_priority_selector',
   'editorselector' => 'rcmail_editor_selector',
   'receiptcheckbox' => 'rcmail_receipt_checkbox',
   'dsncheckbox' => 'rcmail_dsn_checkbox',
   'storetarget' => 'rcmail_store_target_selection',
-  'adressbooks' => 'rcmail_adressbook_list',
+  'addressbooks' => 'rcmail_addressbook_list',
   'addresslist' => 'rcmail_contacts_list',
 ));
 

--
Gitblit v1.9.1