/******************************************************************************* * Copyright Technophobia Ltd 2012 * * This file is part of the Substeps Eclipse Plugin. * * The Substeps Eclipse Plugin is free software: you can redistribute it and/or modify * it under the terms of the Eclipse Public License v1.0. * * The Substeps Eclipse Plugin is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * Eclipse Public License for more details. * * You should have received a copy of the Eclipse Public License * along with the Substeps Eclipse Plugin. If not, see <http://www.eclipse.org/legal/epl-v10.html>. ******************************************************************************/ package com.technophobia.substeps.junit.ui; import org.eclipse.swt.graphics.Image; import org.eclipse.ui.IPropertyListener; import org.eclipse.ui.IWorkbenchPart; import com.technophobia.eclipse.ui.Resettable; import com.technophobia.eclipse.ui.UiUpdater; import com.technophobia.eclipse.ui.part.PartMonitor; import com.technophobia.substeps.junit.ui.image.ProgressImages; import com.technophobia.substeps.supplier.Supplier; public class ViewTitleUiUpdater implements UiUpdater, Resettable { private final PartMonitor partMonitor; private final Supplier<SubstepsRunSession> substepsRunSession; private final Supplier<TestRunStats> testRunStats; private final Image originalViewImage; private Image viewImage; private final SubstepsIconProvider iconProvider; private final ProgressImages progressImages; private final IPropertyListener propertyListener; public ViewTitleUiUpdater(final PartMonitor partMonitor, final Supplier<SubstepsRunSession> substepsRunSession, final Supplier<TestRunStats> testRunStats, final SubstepsIconProvider iconProvider, final Image originalViewImage, final ProgressImages progressImages, final IPropertyListener propertyListener) { this.partMonitor = partMonitor; this.substepsRunSession = substepsRunSession; this.testRunStats = testRunStats; this.iconProvider = iconProvider; this.originalViewImage = originalViewImage; this.viewImage = originalViewImage; this.progressImages = progressImages; this.propertyListener = propertyListener; } @Override public void doUpdate() { if (!partMonitor.isPartVisible()) updateViewTitleProgress(); else { updateViewIcon(); } } @Override public void reset() { resetViewIcon(); } private void updateViewIcon() { final SubstepsRunSession session = substepsRunSession.get(); if (substepsRunSession == null || session.isStopped() || session.isRunning() || session.getStartedCount() == 0) viewImage = originalViewImage; else if (testRunStats.get().hasErrorsOrFailures()) viewImage = iconProvider.imageFor(SubstepsTestIcon.TestRunFail); else viewImage = iconProvider.imageFor(SubstepsTestIcon.TestRunOK); firePropertyChange(IWorkbenchPart.PROP_TITLE); } private void updateViewTitleProgress() { if (substepsRunSession != null) { if (substepsRunSession.get().isRunning()) { final TestRunStats stats = testRunStats.get(); final Image progress = progressImages.getImage(stats.getStartedCount(), stats.getTotalCount(), stats.getErrorCount(), stats.getFailureCount()); if (progress != viewImage) { viewImage = progress; firePropertyChange(IWorkbenchPart.PROP_TITLE); } } else { updateViewIcon(); } } else { resetViewIcon(); } } private void resetViewIcon() { viewImage = originalViewImage; firePropertyChange(IWorkbenchPart.PROP_TITLE); } private void firePropertyChange(final int propId) { propertyListener.propertyChanged(this, propId); } }