class Mournmail::SummaryMode

Constants

SUMMARY_MODE_MAP

Public Class Methods

new(buffer) click to toggle source
Calls superclass method
# File lib/mournmail/summary_mode.rb, line 48
def initialize(buffer)
  super(buffer)
  buffer.keymap = SUMMARY_MODE_MAP
end

Private Instance Methods

current_message() click to toggle source
# File lib/mournmail/summary_mode.rb, line 658
def current_message
  uid = selected_uid
  item = Mournmail.current_summary[uid]
  message = Groonga["Messages"][item.cache_id]
  if message.nil?
    raise EditorError, "No message found"
  end
  message
end
delete_from_summary(summary, uids, msg) click to toggle source
# File lib/mournmail/summary_mode.rb, line 668
def delete_from_summary(summary, uids, msg)
  summary.delete_item_if do |item|
    uids.include?(item.uid)
  end
  summary_text = summary.to_s
  summary.save
  foreground do
    @buffer.read_only_edit do
      @buffer.clear
      @buffer.insert(summary_text)
    end
    message(msg)
  end
end
gsub_buffer(re, s) click to toggle source
# File lib/mournmail/summary_mode.rb, line 587
def gsub_buffer(re, s)
  @buffer.read_only_edit do
    s = @buffer.to_s.gsub(re, s)
    @buffer.replace(s)
  end
end
ljust(s, n) click to toggle source
# File lib/mournmail/summary_mode.rb, line 615
def ljust(s, n)
  width = 0
  str = +""
  s.gsub(/\t/, " ").each_char do |c|
    w = Buffer.display_width(c)
    width += w
    if width > n
      width -= w
      break
    end
    str.concat(c)
    break if width == n
  end
  str + " " * (n - width)
end
mark_as_seen(uid, update_server) click to toggle source
# File lib/mournmail/summary_mode.rb, line 540
def mark_as_seen(uid, update_server)
  summary_item = Mournmail.current_summary[uid]
  if summary_item && !summary_item.flags.include?(:Seen)
    summary_item.set_flag(:Seen, update_server: update_server)
    Mournmail.current_summary.save
    update_flags(summary_item)
  end
end
marked_uids() click to toggle source
# File lib/mournmail/summary_mode.rb, line 493
def marked_uids
  @buffer.to_s.scan(/^ *\d+(?=\*)/).map(&:to_i)
end
next_message() click to toggle source
# File lib/mournmail/summary_mode.rb, line 575
def next_message
  @buffer.end_of_line
  if @buffer.end_of_buffer?
    raise EditorError, "No more mail"
  end
  begin
    @buffer.re_search_forward(/^ *\d+ u/)
  rescue SearchError
    @buffer.forward_line
  end
end
read_current_mail() click to toggle source
# File lib/mournmail/summary_mode.rb, line 497
def read_current_mail
  summary = Mournmail.current_summary
  uid = selected_uid
  summary.read_mail(uid)
end
refile_mails(imap, src_mailbox, uids, dst_mailbox) click to toggle source
# File lib/mournmail/summary_mode.rb, line 631
def refile_mails(imap, src_mailbox, uids, dst_mailbox)
  count = 0
  uids.each_slice(100) do |uid_set|
    if dst_mailbox
      imap.uid_copy(uid_set, dst_mailbox) 
    end
    imap.uid_store(uid_set, "+FLAGS", [:Deleted])
    count += uid_set.size
    progress = (count.to_f * 100 / uids.size).round
    foreground do
      if dst_mailbox
        message("Refiling mails to #{dst_mailbox}... #{progress}%",
                log: false)
      else
        message("Deleting mails... #{progress}%", log: false)
      end 
    end
  end
  foreground do
    if dst_mailbox
      message("Refiled mails to #{dst_mailbox}")
    else
      message("Deleted mails")
    end
  end
end
scroll_up_or_next_uid() click to toggle source
# File lib/mournmail/summary_mode.rb, line 503
def scroll_up_or_next_uid
  begin
    uid = selected_uid
    if uid == Mournmail.current_uid
      window = Mournmail.message_window
      if window.buffer.name == "*message*"
        old_window = Window.current
        begin
          Window.current = window
          scroll_up
          return nil
        ensure
          Window.current = old_window
        end
      end
    end
    uid
  rescue RangeError # may be raised by scroll_up
    next_message
    retry
  end
end
selected_uid() click to toggle source
# File lib/mournmail/summary_mode.rb, line 481
def selected_uid
  uid = @buffer.save_excursion {
    @buffer.beginning_of_line
    if !@buffer.looking_at?(/ *\d+/)
      Mournmail.current_mail = nil
      Mournmail.current_uid = nil
      raise EditorError, "No message found"
    end
    @buffer.match_string(0).to_i
  }
end
show_message(mail) click to toggle source
# File lib/mournmail/summary_mode.rb, line 526
def show_message(mail)
  message_buffer = Buffer.find_or_new("*message*",
                                      undo_limit: 0, read_only: true)
  message_buffer.apply_mode(Mournmail::MessageMode)
  message_buffer.read_only_edit do
    message_buffer.clear
    message_buffer.insert(mail.render)
    message_buffer.beginning_of_buffer
  end
  message_buffer[:mournmail_mail] = mail
  window = Mournmail.message_window
  window.buffer = message_buffer
end
show_search_result(messages, query: nil, buffer_name: "*search result*") click to toggle source
# File lib/mournmail/summary_mode.rb, line 594
def show_search_result(messages,
                       query: nil, buffer_name: "*search result*")
  summary_text = messages.map { |m|
    format("%s [ %s ] %s\n",
           m.date.strftime("%m/%d %H:%M"),
           ljust(m.from.to_s, 16),
           ljust(m.subject.to_s, 45))
  }.join
  buffer = Buffer.find_or_new(buffer_name, undo_limit: 0,
                              read_only: true)
  buffer.apply_mode(Mournmail::SearchResultMode)
  buffer.read_only_edit do
    buffer.clear
    buffer.insert(summary_text)
    buffer.beginning_of_buffer
  end
  buffer[:messages] = messages
  buffer[:query] = query
  switch_to_buffer(buffer)
end
toggle_flag(uid, flag) click to toggle source
# File lib/mournmail/summary_mode.rb, line 549
def toggle_flag(uid, flag)
  summary_item = Mournmail.current_summary[uid]
  if summary_item
    Mournmail.background do
      summary_item.toggle_flag(flag)
      Mournmail.current_summary.save
      foreground do
        update_flags(summary_item)
      end
    end
  end
end
update_flags(summary_item) click to toggle source
# File lib/mournmail/summary_mode.rb, line 562
def update_flags(summary_item)
  @buffer.read_only_edit do
    @buffer.save_excursion do
      @buffer.beginning_of_buffer
      uid = summary_item.uid
      flags_char = summary_item.flags_char
      if @buffer.re_search_forward(/^( *#{uid}) ./)
        @buffer.replace_match(@buffer.match_string(1) + " " + flags_char)
      end
    end
  end
end