package edu.ualberta.med.biobank.widgets.infotables;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import edu.ualberta.med.biobank.common.formatters.DateFormatter;
import edu.ualberta.med.biobank.common.wrappers.CommentWrapper;
import edu.ualberta.med.biobank.common.wrappers.UserWrapper;
import edu.ualberta.med.biobank.gui.common.widgets.BgcLabelProvider;
import gov.nih.nci.system.applicationservice.ApplicationException;
/**
* TODO: it would be nice to set the cells that contain the comment message to
* automatically wrap the text.
*
*/
public class CommentsInfoTable extends InfoTableWidget<CommentWrapper> {
final int TEXT_MARGIN = 3;
protected static class TableRowData {
public CommentWrapper comment;
public UserWrapper user;
public Date date;
public String message;
@Override
public String toString() {
return StringUtils.join(new String[] { user.toString(),
date.toString(), message.toString()
});
}
}
private static final String[] HEADINGS = new String[] {
Messages.CommentCollectionInfoTable_0,
Messages.CommentCollectionInfoTable_1,
Messages.CommentCollectionInfoTable_2 };
public CommentsInfoTable(Composite parent,
List<CommentWrapper> collection) {
super(parent, collection, HEADINGS, CommentWrapper.class);
Table table = getTableViewer().getTable();
/*
* NOTE: MeasureItem, PaintItem and EraseItem are called repeatedly.
* Therefore, it is critical for performance that these methods be as
* efficient as possible.
*/
table.addListener(SWT.MeasureItem, new Listener() {
@Override
public void handleEvent(Event event) {
TableItem item = (TableItem) event.item;
String text = item.getText(event.index);
Point size = event.gc.textExtent(text);
event.width = size.x + 2 * TEXT_MARGIN;
event.height = Math.max(event.height, size.y + TEXT_MARGIN);
}
});
table.addListener(SWT.EraseItem, new Listener() {
@Override
public void handleEvent(Event event) {
event.detail &= ~SWT.FOREGROUND;
}
});
table.addListener(SWT.PaintItem, new Listener() {
@Override
public void handleEvent(Event event) {
TableItem item = (TableItem) event.item;
String text = item.getText(event.index);
/* center column 1 vertically */
int yOffset = 0;
if (event.index == 1) {
Point size = event.gc.textExtent(text);
yOffset = Math.max(0, (event.height - size.y) / 2);
}
event.gc.drawText(text, event.x + TEXT_MARGIN, event.y
+ yOffset, true);
}
});
}
@Override
protected BgcLabelProvider getLabelProvider() {
return new BgcLabelProvider() {
@Override
public String getColumnText(Object element, int columnIndex) {
TableRowData item =
(TableRowData) ((BiobankCollectionModel) element).o;
if (item == null) {
if (columnIndex == 0) {
return Messages.infotable_loading_msg;
}
return ""; //$NON-NLS-1$
}
switch (columnIndex) {
case 0:
return StringUtils.join(wrapText(item.user.getLogin(), 10),
"\n");
case 1:
return DateFormatter.formatAsDateTime(item.date);
case 2:
return StringUtils.join(wrapText(item.message, 80), "\n");
default:
return ""; //$NON-NLS-1$
}
}
};
}
@Override
public Object getCollectionModelObject(Object o) throws Exception {
TableRowData info = new TableRowData();
CommentWrapper comm = (CommentWrapper) o;
info.comment = comm;
info.message = comm.getMessage();
info.user = comm.getUser();
info.date = comm.getCreatedAt();
return info;
}
@Override
protected String getCollectionModelObjectToString(Object o) {
if (o == null) return null;
return ((TableRowData) o).toString();
}
@Override
protected BiobankTableSorter getComparator() {
return new BiobankTableSorter() {
private static final long serialVersionUID = 1L;
@Override
public int compare(Object o, Object o2) {
if (o == null || o2 == null)
return 0;
CommentWrapper comment1 = (CommentWrapper) o;
CommentWrapper comment2 = (CommentWrapper) o2;
return comment1.getCreatedAt().compareTo(
comment2.getCreatedAt());
}
};
}
@Override
public CommentWrapper getSelection() {
// TODO Auto-generated method stub
return null;
}
@Override
protected Boolean canEdit(CommentWrapper target)
throws ApplicationException {
return false;
}
@Override
protected Boolean canDelete(CommentWrapper target)
throws ApplicationException {
return false;
}
@Override
protected Boolean canView(CommentWrapper target)
throws ApplicationException {
return false;
}
}