| /******************************************************************************* |
| * 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 instanceof IBuildElement) { |
| 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); |
| } |
| |
| } |