Java tutorial
/******************************************************************************* * Copyright (c) 2010 Tasktop Technologies and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Tasktop Technologies - initial API and implementation * Itema AS - bug 33148 server tooltip show a summary of build plans *******************************************************************************/ package org.eclipse.mylyn.internal.builds.ui; import java.util.Date; import java.util.List; import org.eclipse.jface.action.LegacyActionTools; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.StyledString; import org.eclipse.jface.viewers.StyledString.Styler; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.mylyn.builds.core.BuildState; import org.eclipse.mylyn.builds.core.IBuild; import org.eclipse.mylyn.builds.core.IBuildElement; import org.eclipse.mylyn.builds.core.IBuildPlan; import org.eclipse.mylyn.builds.core.IBuildServer; import org.eclipse.mylyn.builds.core.IHealthReport; import org.eclipse.mylyn.builds.internal.core.BuildServer; import org.eclipse.mylyn.builds.ui.BuildsUi; import org.eclipse.mylyn.builds.ui.spi.BuildConnectorUi; import org.eclipse.mylyn.commons.core.DateUtil; import org.eclipse.mylyn.commons.ui.CommonImages; import org.eclipse.mylyn.commons.ui.compatibility.CommonFonts; import org.eclipse.mylyn.commons.workbench.forms.RichToolTip; import org.eclipse.mylyn.internal.builds.ui.view.BuildSummaryLabelProvider; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.TextStyle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; /** * @author Steffen Pingel * @author Torkild U. Resheim */ public class BuildToolTip extends RichToolTip { private final static int MAX_WIDTH = 600; public BuildToolTip(Control control) { super(control); } // @Override // protected Object computeData(Widget hoverWidget) { // Object data = super.computeData(hoverWidget); // if (data instanceof IBuildPlan || data instanceof IBuildServer) { // return data; // } // return null; // } @Override public ViewerCell getData() { Object data = super.getData(); return (ViewerCell) data; } @Override protected Composite createToolTipArea(Event event, Composite parent) { ViewerCell cell = getData(); IBuildElement data = (IBuildElement) cell.getItem().getData(); parent.setLayout(new GridLayout(2, false)); BuildConnectorUi connectorUi = BuildsUi.getConnectorUi(data.getServer()); if (data instanceof IBuildPlan) { StyledString ss = new StyledString(); ss.append(data.getLabel(), new Styler() { public void applyStyles(TextStyle textStyle) { textStyle.font = CommonFonts.BOLD; textStyle.foreground = getTitleColor(); } }); IBuildPlan plan = (IBuildPlan) data; if (plan.getStatus() != null) { StringBuilder sb = new StringBuilder(" ["); //$NON-NLS-1$ if (plan.getState() == BuildState.RUNNING) { sb.append(NLS.bind("running, ", null)); } if (plan.getFlags().contains(BuildState.QUEUED)) { sb.append(NLS.bind("queued, ", null)); } switch (plan.getStatus()) { case SUCCESS: sb.append(NLS.bind("success", null)); break; case FAILED: sb.append(NLS.bind("failed", null)); break; case UNSTABLE: sb.append(NLS.bind("unstable", null)); break; case ABORTED: sb.append(NLS.bind("aborted", null)); break; case DISABLED: sb.append(NLS.bind("disabled", null)); break; default: break; } sb.append(']'); ss.append(sb.toString(), StyledString.DECORATIONS_STYLER); } addIconAndLabel(parent, CommonImages.getImage(connectorUi.getImageDescriptor()), ss); } else { addIconAndLabel(parent, CommonImages.getImage(connectorUi.getImageDescriptor()), data.getLabel(), true); } Date refreshDate = data.getRefreshDate(); if (refreshDate != null) { String refreshString = DateUtil.getRelative(refreshDate.getTime()); addIconAndLabel(parent, null, NLS.bind("Refreshed {0}", refreshString), false); } if (data instanceof IBuildPlan) { IBuildPlan plan = (IBuildPlan) data; if (plan.getLastBuild() != null) { addBuild(parent, plan.getLastBuild()); } addPlan(parent, plan); } if (data.getElementStatus() != null) { addIconAndLabel(parent, CommonImages.getImage(CommonImages.WARNING), data.getElementStatus().getMessage()); } if (data instanceof IBuildServer) { int passed = 0; int failed = 0; int unstable = 0; int disabled = 0; List<IBuildPlan> plans = BuildsUiInternal.getModel().getPlans((BuildServer) data); for (IBuildPlan iBuildPlan : plans) { if (iBuildPlan.isSelected() && iBuildPlan.getStatus() != null) { switch (iBuildPlan.getStatus()) { case SUCCESS: passed++; break; case FAILED: failed++; break; case UNSTABLE: unstable++; break; case ABORTED: break; case DISABLED: disabled++; break; default: break; } } } if (passed > 0) { addIconAndLabel(parent, CommonImages.getImage(BuildImages.STATUS_PASSED), NLS.bind("{0} passed builds of a total of {1}", new Object[] { passed, plans.size() })); } if (failed > 0) { addIconAndLabel(parent, CommonImages.getImage(BuildImages.STATUS_FAILED), NLS.bind("{0} failed builds", new Object[] { failed })); } if (unstable > 0) { addIconAndLabel(parent, CommonImages.getImage(BuildImages.STATUS_UNSTABLE), NLS.bind("{0} unstable builds", new Object[] { unstable })); } if (disabled > 0) { addIconAndLabel(parent, CommonImages.getImage(BuildImages.STATUS_DISABLED), NLS.bind("{0} disabled builds", new Object[] { disabled })); } if (unstable > 0) { addIconAndLabel(parent, CommonImages.getImage(BuildImages.STATUS_DISABLED), NLS.bind("{0} aborted builds", new Object[] { unstable })); } } return parent; } private void addBuild(Composite parent, IBuild build) { String text = ""; String time = DateUtil.getRelative(build.getTimestamp()); if (time.length() > 0) { text = NLS.bind("Last built {0}, ", time); } addLabel(parent, text + NLS.bind("took {0}", DateUtil.getFormattedDurationShort(build.getDuration()))); addLabel(parent, NLS.bind("Build {0} [{1}]", build.getLabel(), build.getServer().getLabel())); } private void addPlan(Composite parent, IBuildPlan plan) { for (IHealthReport healthReport : plan.getHealthReports()) { addIconAndLabel(parent, BuildSummaryLabelProvider.getHealthImageDescriptor(healthReport.getHealth()), healthReport.getDescription()); } } protected void addLabel(Composite parent, String text) { addIconAndLabel(parent, (Image) null, text, false); } protected void addIconAndLabel(Composite parent, ImageDescriptor descriptor, String text) { addIconAndLabel(parent, CommonImages.getImage(descriptor), text, false); } protected void addIconAndLabel(Composite parent, Image image, String text) { addIconAndLabel(parent, image, text, false); } protected void addIconAndLabel(Composite parent, Image image, String text, boolean bold) { Label imageLabel = new Label(parent, SWT.NONE); imageLabel.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND)); imageLabel.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND)); imageLabel.setLayoutData( new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING)); imageLabel.setImage(image); Label textLabel = new Label(parent, SWT.WRAP); if (bold) { textLabel.setFont(CommonFonts.BOLD); } textLabel.setForeground(getTitleColor()); textLabel.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND)); textLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER)); textLabel.setText(LegacyActionTools.escapeMnemonics(text)); int width = Math.min(textLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT).x, MAX_WIDTH); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BEGINNING).hint(width, SWT.DEFAULT).applyTo(textLabel); } protected void addIconAndLabel(Composite parent, Image image, StyledString text) { Label imageLabel = new Label(parent, SWT.NONE); imageLabel.setForeground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND)); imageLabel.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND)); imageLabel.setLayoutData( new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING)); imageLabel.setImage(image); StyledText textLabel = new StyledText(parent, 0); textLabel.setText(text.getString()); textLabel.setStyleRanges(text.getStyleRanges()); // textLabel.setForeground(getTitleColor()); textLabel.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND)); textLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER)); //textLabel.setText(""); int width = Math.min(textLabel.computeSize(SWT.DEFAULT, SWT.DEFAULT).x, MAX_WIDTH); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BEGINNING).hint(width, SWT.DEFAULT).applyTo(textLabel); } }