/* * Copyright PMEase (c) 2005 - 2010, * Date: Jun 13, 2010 3:38:16 AM * All rights reserved. * * Revision: $Id$ */ package com.pmease.quickbuild.monitor.gui; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.time.DurationFormatUtils; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.custom.TableEditor; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.ShellAdapter; import org.eclipse.swt.events.ShellEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.program.Program; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import com.pmease.quickbuild.monitor.cache.ColorCache; import com.pmease.quickbuild.monitor.notifier.BuildFragment; import com.pmease.quickbuild.monitor.notifier.BuildFragment.Status; import com.pmease.quickbuild.monitor.utils.SWTUtils; public class HistoryDialog extends AbstractDialog { private Table table; private TableColumn[] columns; public HistoryDialog(TrayMonitor monitor) { super(monitor); setShellStyle(SWT.DIALOG_TRIM | SWT.RESIZE | SWT.NONE); } @Override public boolean close() { for (int i = 0; i < columns.length; i++) { monitor.settings.setProperty(getColumnId(i), String.valueOf(columns[i].getWidth())); } return super.close(); } static int CLEAR_ID = 9999; @Override protected void createButtonsForButtonBar(Composite parent) { createButton(parent, IDialogConstants.OK_ID, "Close", true); createButton(parent, CLEAR_ID, "Clear", false); } @Override protected void buttonPressed(int buttonId) { if (buttonId == CLEAR_ID) { clearHistory(); } else { super.buttonPressed(buttonId); } } private void clearHistory() { monitor.history.clear(); table.removeAll(); this.updateTable(); } private String getColumnId(int index) { return getPreferenceName() + ".column-" + index; } private TableColumn createColumn(String title, final int index) { final TableColumn column = new TableColumn(table, SWT.NONE); column.setText(title); column.addControlListener(new ControlAdapter() { @Override public void controlResized(ControlEvent e) { monitor.settings.setProperty(getColumnId(index), String.valueOf(column.getWidth())); } }); return column; } private static int[] WIDTH = new int[] { 90, 100, 230, 100, 150, 90 }; @Override protected Control createDialogArea(Composite container) { final Composite parent = (Composite) super.createDialogArea(container); GridLayout layout = new GridLayout(); layout.verticalSpacing = 5; layout.marginWidth = 0; parent.setLayout(layout); parent.setLayoutData(new GridData(GridData.FILL_BOTH)); CLabel noteLabel = new CLabel(parent, SWT.WRAP); StringBuffer sb = new StringBuffer("To reset your tray monitor status, just clear all messages below."); // if (monitor.notificationHandler.isConnectionLost()) { // sb.append("\nCan't connect to QuickBuild server: " + monitor.settings.getHost() + " now !"); // } // if (monitor.notificationHandler.isPaused()) { // sb.append("\nChecking new notifications is paused!"); // } noteLabel.setText(sb.toString()); GridDataFactory.fillDefaults().indent(10, 10).align(SWT.LEFT, SWT.CENTER).applyTo(noteLabel); table = new Table(parent, SWT.V_SCROLL|SWT.BORDER); table.setHeaderVisible(true); table.setLinesVisible(true); GridData data = new GridData(GridData.FILL_BOTH); data.grabExcessHorizontalSpace = true; data.grabExcessVerticalSpace = true; table.setLayoutData(data); columns = createColumns(); for (int i = 0; i < columns.length; i++) { String str = monitor.settings.getProperty(getColumnId(i)); if (!StringUtils.isEmpty(str)) { columns[i].setWidth(Integer.valueOf(str)); } else { columns[i].setWidth(WIDTH[i]); } } fillTable(); return parent; } static final Color RED = ColorCache.getColor(255, 26, 0); static final Color GREEN = ColorCache.getColor(0, 140, 0); static final Color LIGHT_RED = ColorCache.getColor(255, 238, 238); static final Color LIGHT_GREEN = ColorCache.getColor(238, 255, 238); private TableColumn[] createColumns() { return new TableColumn[] { createColumn("St.", 0), createColumn("Version", 1), createColumn("Configuration", 2), createColumn("By", 3), createColumn("Finished At", 4), createColumn("Duration", 5) }; } private void fillItem(TableItem item, final BuildFragment build) { if (build.getStatus() == Status.SUCCESSFUL || build.getStatus() == Status.RECOMMENDED) { item.setBackground(LIGHT_GREEN); item.setForeground(0, GREEN); } else { item.setBackground(LIGHT_RED); item.setForeground(0, RED); } item.setText(0, build.getStatus().name()); final TableEditor versionEditor = new TableEditor(table); versionEditor.grabHorizontal = true; versionEditor.grabVertical = true; final Link link = new Link(table, SWT.NONE); final String buildUrl = monitor.settings.getHost() + build.getUrl(); link.setText("<a>" + build.getVersion() + "</a>"); if (build.getStatus() == Status.SUCCESSFUL || build.getStatus() == Status.RECOMMENDED) { link.setBackground(LIGHT_GREEN); } else { link.setBackground(LIGHT_RED); } link.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { Program.launch(buildUrl); } }); versionEditor.setEditor(link, item, 1); // item.setText(1, build.getVersion()); item.setText(2, build.getConfigurationPath()); item.setText(3, build.getTriggeredBy()); item.setText(4, SWTUtils.getDateFormat().format(build.getEndDate())); long duration = build.getDuration(); if (duration < 1000) { item.setText(5, duration + " ms"); } else { item.setText(5, DurationFormatUtils.formatDuration(duration, "HH:mm:ss")); } item.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { link.dispose(); } }); } public void updateTable() { Display display = getShell().getDisplay(); if (display == null || display.isDisposed()) { return; } display.asyncExec(new Runnable() { public void run() { fillTable(); } }); } private void fillTable() { table.setRedraw(false); table.removeAll(); List<BuildFragment> builds = new ArrayList<BuildFragment>(monitor.history.getBuilds()); Collections.reverse(builds); for (BuildFragment build : builds) { TableItem item = new TableItem(table, SWT.BORDER); fillItem(item, build); } table.setRedraw(true); } @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.addShellListener(new ShellAdapter() { @Override public void shellActivated(ShellEvent e) { updateTable(); } }); newShell.setText("History Notifications"); } @Override protected String getDefaultSize() { return "780,400"; } @Override protected String getPreferenceName() { return "History"; } }