diff --git a/apps/susimail/src/src/i2p/susi/webmail/Mail.java b/apps/susimail/src/src/i2p/susi/webmail/Mail.java index 05ee120c7..47e7c33e7 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/Mail.java +++ b/apps/susimail/src/src/i2p/susi/webmail/Mail.java @@ -89,6 +89,7 @@ class Mail { public Date date; private Buffer header, body; private MailPart part; + /** May be null. Non-empty if non-null. Not HTML escaped. */ String[] to, cc; // addresses only, enclosed by <> private boolean isNew, isSpam; public String contentType; diff --git a/apps/susimail/src/src/i2p/susi/webmail/MailCache.java b/apps/susimail/src/src/i2p/susi/webmail/MailCache.java index 8eac1146d..d052921aa 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/MailCache.java +++ b/apps/susimail/src/src/i2p/susi/webmail/MailCache.java @@ -93,7 +93,10 @@ class MailCache { Folder folder = new Folder(); // setElements() sorts, so configure the sorting first //sessionObject.folder.addSorter( SORT_ID, new IDSorter( sessionObject.mailCache ) ); - folder.addSorter(WebMail.SORT_SENDER, new SenderSorter(this)); + if (folderName.equals(WebMail.DIR_DRAFTS) || folderName.equals(WebMail.DIR_SENT)) + folder.addSorter(WebMail.SORT_SENDER, new ToSorter(this)); + else + folder.addSorter(WebMail.SORT_SENDER, new SenderSorter(this)); folder.addSorter(WebMail.SORT_SUBJECT, new SubjectSorter(this)); folder.addSorter(WebMail.SORT_DATE, new DateSorter(this)); folder.addSorter(WebMail.SORT_SIZE, new SizeSorter(this)); diff --git a/apps/susimail/src/src/i2p/susi/webmail/Sorters.java b/apps/susimail/src/src/i2p/susi/webmail/Sorters.java index 6ea4e3032..827ce83d4 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/Sorters.java +++ b/apps/susimail/src/src/i2p/susi/webmail/Sorters.java @@ -81,6 +81,40 @@ class Sorters { } } + /** + * sorts Mail objects by to: fields + * + * @since 0.9.43 + */ + public static class ToSorter extends SorterBase { + + private final Comparator collator = Collator.getInstance(); + + public ToSorter(MailCache mailCache) { + super(mailCache); + } + + protected int compare(Mail a, Mail b) { + if (a.to == null) + return b.to == null ? 0 : -1; + if (b.to == null) + return 1; + int minsz = Math.min(a.to.length, b.to.length); + for (int i = 0; i < minsz; i++) { + String as = a.to[i].replace("\"", "").replace("<", "").replace(">", ""); + String bs = b.to[i].replace("\"", "").replace("<", "").replace(">", ""); + int rv = collator.compare(as, bs); + if (rv != 0) + return rv; + } + if (a.to.length > minsz) + return 1; + if (b.to.length > minsz) + return -1; + return 0; + } + } + /** * sorts Mail objects by subject field * @author susi diff --git a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java index ea4a617e1..a2e1565a8 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java +++ b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java @@ -212,7 +212,7 @@ public class WebMail extends HttpServlet static final String DIR_FOLDER = "cur"; // MailDir-like public static final String DIR_DRAFTS = _x("Drafts"); // MailDir-like - private static final String DIR_SENT = _x("Sent"); // MailDir-like + public static final String DIR_SENT = _x("Sent"); // MailDir-like private static final String DIR_TRASH = _x("Trash"); // MailDir-like private static final String DIR_SPAM = _x("Bulk Mail"); // MailDir-like // internal/on-disk names @@ -426,7 +426,8 @@ public class WebMail extends HttpServlet * @return the string */ private static String sortHeader(String name, String label, String imgPath, - String currentName, SortOrder currentOrder, int page) + String currentName, SortOrder currentOrder, int page, + String folder) { StringBuilder buf = new StringBuilder(128); buf.append(label).append("  "); @@ -434,14 +435,16 @@ public class WebMail extends HttpServlet if (name.equals(currentName) && currentOrder == SortOrder.UP) { buf.append("\"^\"\n"); } else { - buf.append(""); + buf.append(""); buf.append("\"^\""); buf.append("\n"); } if (name.equals(currentName) && currentOrder == SortOrder.DOWN) { buf.append("\"v\""); } else { - buf.append(""); + buf.append(""); buf.append("\"v\""); buf.append(""); } @@ -3154,6 +3157,7 @@ public class WebMail extends HttpServlet floc = '&' + CURRENT_FOLDER + '=' + folderName; } boolean isSpamFolder = folderName.equals(DIR_SPAM); + boolean showToColumn = folderName.equals(DIR_DRAFTS) || folderName.equals(DIR_SENT); //if (Config.hasConfigFile()) // out.println(button( RELOAD, _t("Reload Config") ) + spacer); out.println(button( LOGOUT, _t("Logout") )); @@ -3175,12 +3179,11 @@ public class WebMail extends HttpServlet SortOrder curOrder = folder.getCurrentSortingDirection(); out.println("\n" + "\n" + - thSpacer + "" + - thSpacer + "" + - thSpacer + "" + + thSpacer + "" + + thSpacer + "" + - thSpacer + "" ); + thSpacer + "" ); int bg = 0; int i = 0; for (Iterator it = folder.currentPageIterator(); it != null && it.hasNext(); ) { @@ -3228,9 +3231,33 @@ public class WebMail extends HttpServlet "

 " + sortHeader(SORT_SENDER, _t("From"), sessionObject.imgPath, curSort, curOrder, page) + "" + sortHeader(SORT_SUBJECT, _t("Subject"), sessionObject.imgPath, curSort, curOrder, page) + "" + sortHeader(SORT_DATE, _t("Date"), sessionObject.imgPath, curSort, curOrder, page) + - //sortHeader( SORT_ID, "", sessionObject.imgPath ) + + thSpacer + "" + sortHeader(SORT_SENDER, showToColumn ? _t("To") : _t("From"), sessionObject.imgPath, curSort, curOrder, page, folderName) + "" + sortHeader(SORT_SUBJECT, _t("Subject"), sessionObject.imgPath, curSort, curOrder, page, folderName) + "" + sortHeader(SORT_DATE, _t("Date"), sessionObject.imgPath, curSort, curOrder, page, folderName) + "" + sortHeader(SORT_SIZE, _t("Size"), sessionObject.imgPath, curSort, curOrder, page) + "
" + sortHeader(SORT_SIZE, _t("Size"), sessionObject.imgPath, curSort, curOrder, page, folderName) + "
" + "" + - (mail.isNew() ? "\"\"" : " ") + "" + - // mail.shortSender and mail.shortSubject already html encoded - link + mail.shortSender + "" + + (mail.isNew() ? "\"\"" : " ") + ""); + // mail.shortSender and mail.shortSubject already html encoded + if (showToColumn) { + if (mail.to != null) { + StringBuilder buf = new StringBuilder(mail.to.length * 16); + for (int j = 0; j < mail.to.length; j++) { + buf.append(mail.to[j]); + if (j < mail.to.length - 1) + buf.append(", "); + if (buf.length() > 45) + break; + } + String to = buf.toString(); + boolean trim = to.length() > 45; + if (trim) + to = ServletUtil.truncate(to, 42).trim(); + to = quoteHTML(to); + out.print(link); + out.print(to); + if (trim) + out.print("…"); // must be after html encode + out.println(""); + } + } else { + out.println(link + mail.shortSender + ""); + } + out.println("" + (mail.hasAttachment() ? "\"\"" : " ") + "" + link + subj + "" + (mail.isSpam() ? "\"\"" : " ") + "" +