package com.dgex.offspring.ui.messaging; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.List; import nxt.Account; import nxt.Constants; import nxt.util.Convert; import org.apache.log4j.Logger; import org.eclipse.e4.ui.di.UISynchronize; import org.eclipse.e4.ui.services.IStylingEngine; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import com.dgex.offspring.config.CompareMe; import com.dgex.offspring.config.IContactsService; import com.dgex.offspring.config.Images; import com.dgex.offspring.nxtCore.service.INxtService; import com.dgex.offspring.swt.table.GenerericTreeViewer; import com.dgex.offspring.swt.table.GenericTableColumnBuilder; import com.dgex.offspring.swt.table.ICellDataProvider; import com.dgex.offspring.swt.table.IGenericTable; import com.dgex.offspring.swt.table.IGenericTableColumn; import com.dgex.offspring.user.service.IUser; import com.dgex.offspring.user.service.IUserService; public class MessagingTreeViewer extends GenerericTreeViewer { static Logger logger = Logger.getLogger(MessagingTreeViewer.class); static final SimpleDateFormat dateFormat = new SimpleDateFormat( "dd MMM yy H:mm:ss"); static final Image MESSAGE_RECEIVED = Images.getImage("bullet_go.png"); static final Image MESSAGE_SEND = Images.getImage("resultset_previous.png"); static final Image ENCRYPTED_OPENED = Images.getImage("lock_open.png"); static final Image ENCRYPTED_LOCKED = Images.getImage("lock_delete.png"); static final Image NO_ENCRYPTION = Images.getImage("information.png"); static final Image UNKNOWN_MESSAGE = Images.getImage("page_white_text.png"); static final String EMPTY_STRING = ""; /* Returns TRUE for messsage send and FALSE for message received */ final IGenericTableColumn columnMain = new GenericTableColumnBuilder(" ") .align(SWT.LEFT).textExtent("###############################") .provider(new ICellDataProvider() { @Override public Object getCellValue(Object element) { IMessageNode node = (IMessageNode) element; MessageWrapper message = node.getMessage(); Date date = new Date(((message.getTimestamp()) * 1000L) + (Constants.EPOCH_BEGINNING - 500L)); return date; } @Override public void getCellData(Object element, Object[] data) { IMessageNode node = (IMessageNode) element; MessageWrapper message = node.getMessage(); StringBuilder sb = new StringBuilder(); boolean received = message.getReceipientId().equals(accountId); boolean[] recent = new boolean[] { false }; sb.append(formatToYesterdayOrToday((Date) getCellValue(element), recent)); sb.append(" (") .append( Convert.toUnsignedLong(received ? message.getSenderId() : message.getReceipientId())).append(") "); sb.append(message.getMessage()); if (message.isMessage()) { if (message.isEncrypted()) { if (secretPhrase == null) { data[IMAGE] = ENCRYPTED_LOCKED; } else { data[IMAGE] = ENCRYPTED_OPENED; } } else { data[IMAGE] = NO_ENCRYPTION; } } else { data[IMAGE] = UNKNOWN_MESSAGE; } data[TEXT] = sb.toString().replaceAll("\\r\\n|\\r|\\n", " "); if (received) { data[FONT] = JFaceResources.getFontRegistry().getBold(""); } } @Override public int compare(Object v1, Object v2) { return CompareMe.compare(((Date) v1).getTime(), ((Date) v2).getTime()); } }).build(); final ITreeContentProvider contentProvider = new ITreeContentProvider() { @Override public void dispose() {} @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {} @Override public Object[] getElements(Object inputElement) { if (accountId == null) { return new Object[0]; } account = Account.getAccount(accountId); IUser user = userService.findUser(accountId); if (user != null) { secretPhrase = user.getAccount().getPrivateKey(); } if (account == null) { return new Object[0]; } MessageScanner scanner = new MessageScanner(account, secretPhrase, nxt); scanner.scan(); IMessageNode rootNode = scanner.getNode(); List<IMessageNode> elements = rootNode.getChildren(); return elements.toArray(new Object[elements.size()]); } @Override public Object[] getChildren(Object parentElement) { List<IMessageNode> elements = ((IMessageNode) parentElement) .getChildren(); return elements.toArray(new Object[elements.size()]); } @Override public Object getParent(Object element) { return ((IMessageNode) element).getParent(); } @Override public boolean hasChildren(Object element) { return ((IMessageNode) element).hasChildren(); } }; private IContactsService contactsService; private Long accountId; public INxtService nxt; private IStylingEngine engine; private IUserService userService; private UISynchronize sync; private Account account = null; private String secretPhrase = null; public MessagingTreeViewer(Composite parent, Long accountId, IContactsService contactsService, INxtService nxt, IStylingEngine engine, IUserService userService, UISynchronize sync) { super(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); this.contactsService = contactsService; this.nxt = nxt; this.accountId = accountId; this.engine = engine; this.userService = userService; this.sync = sync; setGenericTable(new IGenericTable() { @Override public int getDefaultSortDirection() { return 99; // Not used } @Override public IGenericTableColumn getDefaultSortColumn() { return null; // Not used } @Override public IStructuredContentProvider getContentProvider() { return contentProvider; } @Override public IGenericTableColumn[] getColumns() { return new IGenericTableColumn[] { columnMain }; } }); setInput(accountId); } public static String formatToYesterdayOrToday(Date date, boolean recent[]) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); Calendar today = Calendar.getInstance(); Calendar yesterday = Calendar.getInstance(); yesterday.add(Calendar.DATE, -1); DateFormat timeFormatter = new SimpleDateFormat("H:mm:ss"); if (calendar.get(Calendar.YEAR) == today.get(Calendar.YEAR) && calendar.get(Calendar.DAY_OF_YEAR) == today .get(Calendar.DAY_OF_YEAR)) { recent[0] = true; return "Today " + timeFormatter.format(date); } else if (calendar.get(Calendar.YEAR) == yesterday.get(Calendar.YEAR) && calendar.get(Calendar.DAY_OF_YEAR) == yesterday .get(Calendar.DAY_OF_YEAR)) { recent[0] = true; return "Yesterday " + timeFormatter.format(date); } recent[0] = false; return dateFormat.format(date); } }