module Redwood
 
+module CanSpawnForwardMode
+  def spawn_forward_mode m, 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]
+    
+    mode = ForwardMode.new m, :to => to, :cc => cc, :bcc => bcc
+    BufferManager.spawn "Forwarding #{m.subj}", mode
+    mode.edit_message
+  end
+end
+
 class ForwardMode < EditMessageMode
-  def initialize m
-    super :header => {
+
+  ## todo: share some of this with reply-mode
+  def initialize m, opts={}
+    header = {
       "From" => AccountManager.default_account.full_address,
       "Subject" => "Fwd: #{m.subj}",
-    },
-         :body => forward_body_lines(m)
+    }
+
+    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]
+
+    super :header => header, :body => forward_body_lines(m)
   end
 
 protected
 
 ## - is_relevant?
 
 class ThreadIndexMode < LineCursorMode
+  include CanSpawnForwardMode
+
   DATE_WIDTH = Time::TO_NICE_S_MAX_LEN
   MIN_FROM_WIDTH = 15
   LOAD_MORE_THREAD_NUM = 20
     m = t.latest_message
     return if m.nil? # probably won't happen
     m.load_from_source!
-    mode = ForwardMode.new m
-    BufferManager.spawn "Forward of #{m.subj}", mode
-    mode.edit_message
+    spawn_forward_mode m
   end
 
   def load_n_threads_background n=LOAD_MORE_THREAD_NUM, opts={}
 
 
 class ThreadViewMode < LineCursorMode
   include CanSpawnComposeMode
+  include CanSpawnForwardMode
 
   ## this holds all info we need to lay out a message
   class MessageLayout
 
   def forward
     m = @message_lines[curpos] or return
-    mode = ForwardMode.new m
-    BufferManager.spawn "Forward of #{m.subj}", mode
-    mode.edit_message
+    spawn_forward_mode m
   end
 
   include CanAliasContacts