]> git.cworth.org Git - sup/blobdiff - lib/sup/modes/forward-mode.rb
rejigger alignment of messages when using 'n' and 'p'
[sup] / lib / sup / modes / forward-mode.rb
index 0cbf1ec46d6a0033be0e42b929efd88911db1a68..b71be482d99cf29574d6bb12191acb959aa0e0cd 100644 (file)
@@ -1,38 +1,73 @@
 module Redwood
 
 class ForwardMode < EditMessageMode
-  attr_reader :body, :header
-
-  def initialize m
-    super()
-    @header = {
+  ## TODO: share some of this with reply-mode
+  def initialize opts={}
+    header = {
       "From" => AccountManager.default_account.full_address,
-      "Subject" => "Fwd: #{m.subj}",
-      "Message-Id" => gen_message_id,
     }
-    @body = forward_body_lines(m) + sig_lines
-    regen_text
+
+    header["Subject"] = 
+      if opts[:message]
+        "Fwd: " + opts[:message].subj
+      elsif opts[:attachments]
+        "Fwd: " + opts[:attachments].keys.join(", ")
+      end
+
+    header["To"] = opts[:to].map { |p| p.full_address }.join(", ") if opts[:to]
+    header["Cc"] = opts[:cc].map { |p| p.full_address }.join(", ") if opts[:cc]
+    header["Bcc"] = opts[:bcc].map { |p| p.full_address }.join(", ") if opts[:bcc]
+
+    body =
+      if opts[:message]
+        forward_body_lines(opts[:message]) 
+      elsif opts[:attachments]
+        ["Note: #{opts[:attachments].size.pluralize 'attachment'}."]
+      end
+
+    super :header => header, :body => body, :attachments => opts[:attachments]
   end
 
-  def lines; @text.length; end
-  def [] i; @text[i]; end
+  def self.spawn_nicely opts={}
+    to = opts[:to] || BufferManager.ask_for_contacts(:people, "To: ") or return
+    cc = opts[:cc] || BufferManager.ask_for_contacts(:people, "Cc: ") or return if $config[:ask_for_cc]
+    bcc = opts[:bcc] || BufferManager.ask_for_contacts(:people, "Bcc: ") or return if $config[:ask_for_bcc]
+    
+    attachment_hash = {}
+    attachments = opts[:attachments] || []
+
+    if(m = opts[:message])
+      m.load_from_source! # read the full message in. you know, maybe i should just make Message#chunks do this....
+      attachments += m.chunks.select { |c| c.is_a?(Chunk::Attachment) && !c.quotable? }
+    end
+
+    attachments.each do |c|
+      mime_type = MIME::Types[c.content_type].first || MIME::Types["application/octet-stream"].first
+      attachment_hash[c.filename] = RMail::Message.make_attachment c.raw_content, mime_type.content_type, mime_type.encoding, c.filename
+    end
+
+    mode = ForwardMode.new :message => opts[:message], :to => to, :cc => cc, :bcc => bcc, :attachments => attachment_hash
+
+    title = "Forwarding " +
+      if opts[:message]
+        opts[:message].subj
+      elsif attachments
+        attachment_hash.keys.join(", ")
+      else
+        "something"
+      end
+
+    BufferManager.spawn title, mode
+    mode.edit_message
+  end
 
 protected
 
   def forward_body_lines m
     ["--- Begin forwarded message from #{m.from.mediumname} ---"] + 
-      m.basic_header_lines + [""] + m.basic_body_lines +
+      m.quotable_header_lines + [""] + m.quotable_body_lines +
       ["--- End forwarded message ---"]
   end
-
-  def handle_new_text new_header, new_body
-    @header = new_header
-    @body = new_body
-  end
-
-  def regen_text
-    @text = header_lines(@header - NON_EDITABLE_HEADERS) + [""] + @body
-  end
 end
 
 end