]> git.cworth.org Git - sup/commitdiff
clean up various edit-message-mode subclasses, and add an 'edit_signature' configurat...
authorwmorgan <wmorgan@5c8cc53c-5e98-4d25-b20a-d8db53a31250>
Tue, 3 Jul 2007 21:45:06 +0000 (21:45 +0000)
committerwmorgan <wmorgan@5c8cc53c-5e98-4d25-b20a-d8db53a31250>
Tue, 3 Jul 2007 21:45:06 +0000 (21:45 +0000)
git-svn-id: svn://rubyforge.org/var/svn/sup/trunk@468 5c8cc53c-5e98-4d25-b20a-d8db53a31250

lib/sup.rb
lib/sup/modes/compose-mode.rb
lib/sup/modes/contact-list-mode.rb
lib/sup/modes/edit-message-mode.rb
lib/sup/modes/forward-mode.rb
lib/sup/modes/line-cursor-mode.rb
lib/sup/modes/reply-mode.rb

index 3f305ce29a7e3bcf3d4f7e108dfd7cc0bfd8955d..6ca881f72e023a180724c9201da247beeb924f7d 100644 (file)
@@ -192,6 +192,7 @@ else
     },
     :editor => ENV["EDITOR"] || "/usr/bin/vim -f -c 'setlocal spell spelllang=en_us' -c 'set filetype=mail'",
     :thread_by_subject => false,
+    :edit_signature => false,
   }
   begin
     FileUtils.mkdir_p Redwood::BASE_DIR
index 65ea172013b6a25f05d8911afc52e605b6f6e61e..fe7127956918dfd4154d48c67f5370b8705f2750 100644 (file)
@@ -1,29 +1,17 @@
 module Redwood
 
 class ComposeMode < EditMessageMode
-  attr_reader :body, :header
-
   def initialize opts={}
-    super()
-    @header = {
+    header = {
       "From" => AccountManager.default_account.full_address,
-      "Message-Id" => gen_message_id,
     }
 
-    @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]
-    @header["Subject"] = opts[:subj] if opts[:subj]
-
-    @body = opts[:body] || []
-    regen_text
-  end
-
-protected
+    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]
+    header["Subject"] = opts[:subj] if opts[:subj]
 
-  def handle_new_text new_header, new_body
-    @header = new_header
-    @body = new_body
+    super :header => header, :body => (opts[:body] || [])
   end
 end
 
index 37ecc28aff9921203baad761800424977d80092b..6983aa0ced0b5e6a89b6d4aab41cbcdbfe1fd066 100644 (file)
@@ -23,7 +23,7 @@ class ContactListMode < LineCursorMode
     k.add :search, "Search for messages from particular people", 'S'
   end
 
-  def initialize mode = :regular
+  def initialize mode=:regular
     @mode = mode
     @tags = Tagger.new self
     @num = nil
index 1b2d72b340108fff9cd85a4491bcca412f4cae29..a608e0519f061fa75d452de128730b0967c4581a 100644 (file)
@@ -9,6 +9,7 @@ class EditMessageMode < LineCursorMode
   NON_EDITABLE_HEADERS = %w(Message-Id Date)
 
   attr_reader :status
+  attr_accessor :body, :header
   bool_reader :edited
 
   register_keymap do |k|
@@ -17,20 +18,27 @@ class EditMessageMode < LineCursorMode
     k.add :save_as_draft, "Save as draft", 'P'
   end
 
-  def initialize *a
-    super
+  def initialize opts={}
+    @header = opts.delete(:header) || {} 
+    @body = opts.delete(:body) || []
+    @body += sig_lines if $config[:edit_signature]
     @attachments = []
     @edited = false
+    super opts
+    update
   end
 
-  def lines; @text.length; end
-  def [] i; @text[i]; end
+  def lines; @text.length end
+  def [] i; @text[i] end
+
+  ## a hook
+  def handle_new_text header, body; end
 
   def edit
     @file = Tempfile.new "sup.#{self.class.name.gsub(/.*::/, '').camel_to_hyphy}"
-    @file.puts header_lines(header - NON_EDITABLE_HEADERS)
+    @file.puts header_lines(@header - NON_EDITABLE_HEADERS)
     @file.puts
-    @file.puts body
+    @file.puts @body
     @file.close
 
     editor = $config[:editor] || ENV['EDITOR'] || "/usr/bin/vi"
@@ -39,9 +47,9 @@ class EditMessageMode < LineCursorMode
     BufferManager.shell_out "#{editor} #{@file.path}"
     @edited = true if File.mtime(@file.path) > mtime
 
-    new_header, new_body = parse_file(@file.path)
-    NON_EDITABLE_HEADERS.each { |h| new_header[h] = header[h] if header[h] }
-    handle_new_text new_header, new_body
+    header, @body = parse_file @file.path
+    @header = header - NON_EDITABLE_HEADERS
+    handle_new_text @header, @body
     update
   end
 
@@ -57,11 +65,12 @@ protected
 
   def update
     regen_text
-    buffer.mark_dirty
+    buffer.mark_dirty if buffer
   end
 
   def regen_text
-    @text = header_lines(header - NON_EDITABLE_HEADERS) + [""] + body + sig_lines
+    @text = header_lines(@header - NON_EDITABLE_HEADERS) + [""] + @body 
+    @text += sig_lines unless $config[:edit_signature]
   end
 
   def parse_file fn
@@ -115,10 +124,9 @@ protected
   def send_message
     return unless edited? || BufferManager.ask_yes_or_no("Message unedited. Really send?")
 
-    raise "no message id!" unless header["Message-Id"]
     date = Time.now
     from_email = 
-      if header["From"] =~ /<?(\S+@(\S+?))>?$/
+      if @header["From"] =~ /<?(\S+@(\S+?))>?$/
         $1
       else
         AccountManager.default_account.email
@@ -147,10 +155,15 @@ protected
     BufferManager.flash "Saved for later editing."
   end
 
+  ## this is going to change soon: draft messages (currently written
+  ## with full=false) will be output as yaml.
   def write_message f, full=true, date=Time.now
-    raise ArgumentError, "no pre-defined date: header allowed" if header["Date"]
-    f.puts header_lines(header)
-    f.puts "Date: #{date.rfc2822}"
+    raise ArgumentError, "no pre-defined date: header allowed" if @header["Date"]
+    f.puts header_lines(@header)
+    f.puts <<EOS
+Date: #{date.rfc2822}
+Message-Id: #{gen_message_id}
+EOS
     if full
       f.puts <<EOS
 Mime-Version: 1.0
@@ -161,15 +174,14 @@ EOS
     end
 
     f.puts
-    f.puts body.map { |l| l =~ /^From / ? ">#{l}" : l }
-    f.puts sig_lines if full
+    f.puts @body.map { |l| l =~ /^From / ? ">#{l}" : l }
+    f.puts sig_lines if full unless $config[:edit_signature]
   end  
 
 private
 
-
   def sig_lines
-    p = PersonManager.person_for header["From"]
+    p = PersonManager.person_for @header["From"]
     sigfn = (AccountManager.account_for(p.email) || 
              AccountManager.default_account).signature
 
index 37beeba415da93d2efcff2fec4139be3d3ec8447..34551b34ce53ca921c01df74d96942c8db3f1823 100644 (file)
@@ -1,17 +1,12 @@
 module Redwood
 
 class ForwardMode < EditMessageMode
-  attr_reader :body, :header
-
   def initialize m
-    super()
-    @header = {
+    super :header => {
       "From" => AccountManager.default_account.full_address,
       "Subject" => "Fwd: #{m.subj}",
-      "Message-Id" => gen_message_id,
-    }
-    @body = forward_body_lines m
-    regen_text
+    },
+         :body => forward_body_lines(m)
   end
 
 protected
@@ -21,11 +16,6 @@ protected
       m.basic_header_lines + [""] + m.basic_body_lines +
       ["--- End forwarded message ---"]
   end
-
-  def handle_new_text new_header, new_body
-    @header = new_header
-    @body = new_body
-  end
 end
 
 end
index 0288474d81bfcb14f226f94e147136533c1b877f..a19fba192e818e0f29dc5566dd9459d39a9bb979 100644 (file)
@@ -12,9 +12,8 @@ class LineCursorMode < ScrollMode
 
   attr_reader :curpos
 
-  def initialize cursor_top=0, opts={}
-    @cursor_top = cursor_top
-    @curpos = cursor_top
+  def initialize opts={}
+    @cursor_top = @curpos = opts[:skip_top_rows] || 0
     @load_more_callbacks = []
     @load_more_callbacks_m = Mutex.new
     @load_more_callbacks_active = false
index 779bd860a2faba97a44f5d17d9340988935cf9ec..900076749983571cab17abe48a0b315be4a20e9a 100644 (file)
@@ -16,13 +16,12 @@ class ReplyMode < EditMessageMode
   end
 
   def initialize message
-    super 2, :twiddles => false
     @m = message
 
     ## it's important to put this early because it forces a read of
     ## the full headers (most importantly the list-post header, if
     ## any)
-    @body = reply_body_lines message
+    body = reply_body_lines message
 
     from =
       if @m.recipient_email
@@ -65,7 +64,6 @@ class ReplyMode < EditMessageMode
     } if @m.is_list_message?
 
     refs = gen_references
-    mid = gen_message_id
     @headers.each do |k, v|
       @headers[k] = {
                "To" => "",
@@ -73,7 +71,6 @@ class ReplyMode < EditMessageMode
                "Bcc" => "",
                "In-Reply-To" => "<#{@m.id}>",
                "Subject" => Message.reify_subj(@m.subj),
-               "Message-Id" => mid,
                "References" => refs,
              }.merge v
     end
@@ -88,32 +85,27 @@ class ReplyMode < EditMessageMode
         :recipient
       end
 
-    regen_text
+    super :header => @headers[@selected_type], :body => body,
+          :skip_top_rows => 2, :twiddles => false
   end
 
-  def lines; @text.length + 2; end
+  def lines; super + 2; end
   def [] i
     case i
     when 0
-      lame = []
-      @type_labels.each do |t|
-        lame << [(t == @selected_type ? :none_highlight : :none), 
-          "#{TYPE_DESCRIPTIONS[t]}"]
-        lame << [:none, "  "]
-      end
-      lame + [[:none, ""]]
+      @type_labels.inject([]) do |array, t|
+        array + [[(t == @selected_type ? :none_highlight : :none), 
+          "#{TYPE_DESCRIPTIONS[t]}"], [:none, "  "]]
+      end + [[:none, ""]]
     when 1
       ""
     else
-      @text[i - 2]
+      super(i - 2)
     end
   end
 
 protected
 
-  def body; @body; end
-  def header; @headers[@selected_type]; end
-
   def reply_body_lines m
     lines = ["Excerpts from #{@m.from.name}'s message of #{@m.date}:"] + 
       m.basic_body_lines.map { |l| "> #{l}" }
@@ -122,12 +114,11 @@ protected
   end
 
   def handle_new_text new_header, new_body
-    @body = new_body
-
-    if new_header.size != header.size ||
-        header.any? { |k, v| new_header[k] != v }
+    old_header = @headers[@selected_type]
+    if new_header.size != old_header.size || old_header.any? { |k, v| new_header[k] != v }
       @selected_type = :user
-      @headers[:user] = new_header
+      self.header = @headers[:user] = new_header
+      update
     end
   end
 
@@ -138,12 +129,14 @@ protected
   def move_cursor_left
     i = @type_labels.index @selected_type
     @selected_type = @type_labels[(i - 1) % @type_labels.length]
+    self.header = @headers[@selected_type]
     update
   end
 
   def move_cursor_right
     i = @type_labels.index @selected_type
     @selected_type = @type_labels[(i + 1) % @type_labels.length]
+    self.header = @headers[@selected_type]
     update
   end
 end