package name.abuchen.portfolio.ui.log; import java.text.DateFormat; import java.util.ArrayList; import java.util.List; import javax.annotation.PostConstruct; import javax.inject.Inject; import org.eclipse.core.runtime.IStatus; import org.eclipse.e4.core.di.annotations.Optional; import org.eclipse.e4.ui.di.Focus; import org.eclipse.e4.ui.di.UIEventTopic; import org.eclipse.e4.ui.di.UISynchronize; import org.eclipse.jface.layout.TreeColumnLayout; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnPixelData; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import name.abuchen.portfolio.ui.Images; import name.abuchen.portfolio.ui.Messages; import name.abuchen.portfolio.ui.UIConstants; import name.abuchen.portfolio.ui.dialogs.DisplayTextDialog; public class ErrorLogPart { public static class LogEntryContentProvider implements ITreeContentProvider { private List<?> entries; @Override public void dispose() {} @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { this.entries = (List<?>) newInput; } @Override public Object[] getElements(Object inputElement) { return entries.toArray(); } @Override public boolean hasChildren(Object element) { return ((LogEntry) element).getChildren() != null; } @Override public Object[] getChildren(Object parentElement) { return ((LogEntry) parentElement).getChildren().toArray(); } @Override public Object getParent(Object element) { return null; } } private List<LogEntry> entries = new ArrayList<LogEntry>(); private TreeViewer logViewer; @Inject UISynchronize sync; @PostConstruct public void createComposite(Composite parent, LogEntryCache cache) { this.entries = cache.getEntries(); Composite container = new Composite(parent, SWT.NONE); TreeColumnLayout layout = new TreeColumnLayout(); container.setLayout(layout); logViewer = new TreeViewer(container, SWT.FULL_SELECTION); TreeViewerColumn column = new TreeViewerColumn(logViewer, SWT.NONE); column.getColumn().setText(Messages.ColumnDate); layout.setColumnData(column.getColumn(), new ColumnPixelData(140)); column.setLabelProvider(new ColumnLabelProvider() { private DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); @Override public String getText(Object element) { return dateFormat.format(((LogEntry) element).getDate()); } }); column = new TreeViewerColumn(logViewer, SWT.NONE); column.getColumn().setText(Messages.ColumnMessage); layout.setColumnData(column.getColumn(), new ColumnPixelData(500)); column.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { return ((LogEntry) element).getMessage(); } @Override public Image getImage(Object element) { LogEntry entry = (LogEntry) element; switch (entry.getSeverity()) { case IStatus.ERROR: return Images.ERROR.image(); case IStatus.WARNING: return Images.WARNING.image(); default: return Images.INFO.image(); } } }); logViewer.getTree().setHeaderVisible(true); logViewer.getTree().setLinesVisible(true); logViewer.setContentProvider(new LogEntryContentProvider()); logViewer.setInput(entries); logViewer.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { LogEntry entry = (LogEntry) ((IStructuredSelection) event.getSelection()).getFirstElement(); DisplayTextDialog dialog = new DisplayTextDialog(Display.getCurrent().getActiveShell(), entry.getText()); dialog.open(); } }); } @Focus public void setFocus() { logViewer.getTree().setFocus(); } @Inject @Optional public void onLogEntryCreated(@UIEventTopic(UIConstants.Event.Log.CREATED) LogEntry entry) { entries.add(entry); logViewer.refresh(); } @Inject @Optional public void onLogEntriesDeleted(@UIEventTopic(UIConstants.Event.Log.CLEARED) LogEntry entry) { entries.clear(); logViewer.refresh(); } }