/******************************************************************************* * Copyright (c) 2004, 2010 BREDEX GmbH. * 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: * BREDEX GmbH - initial API and implementation and/or initial documentation *******************************************************************************/ package org.eclipse.jubula.client.ui.rcp.sourceprovider; import java.util.HashMap; import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jubula.client.core.events.DataChangedEvent; import org.eclipse.jubula.client.core.events.DataEventDispatcher; import org.eclipse.jubula.client.core.events.DataEventDispatcher.DataState; import org.eclipse.jubula.client.core.events.DataEventDispatcher.IDataChangedListener; import org.eclipse.jubula.client.core.events.DataEventDispatcher.IProjectLoadedListener; import org.eclipse.jubula.client.core.events.DataEventDispatcher.IProjectStateListener; import org.eclipse.jubula.client.core.events.DataEventDispatcher.IServerConnectionListener; import org.eclipse.jubula.client.core.events.DataEventDispatcher.ProjectState; import org.eclipse.jubula.client.core.events.DataEventDispatcher.ServerState; import org.eclipse.jubula.client.core.model.IPersistentObject; import org.eclipse.jubula.client.core.model.IProjectPO; import org.eclipse.jubula.client.ui.rcp.businessprocess.StartAutBP; import org.eclipse.jubula.client.ui.rcp.i18n.Messages; import org.eclipse.jubula.client.ui.utils.JobUtils; import org.eclipse.ui.ISources; /** * Provides variables related to the availability/startability of AUTs. * 1. available AUTs and AUT Configurations within the active project. * 2. available AUTs for the current working language. * 3. available AUT Configurations for the current (most recently connected) * AutStarter. * * @author BREDEX GmbH * @created Apr 29, 2009 */ public class AvailableAutSourceProvider extends AbstractJBSourceProvider implements IServerConnectionListener, IProjectStateListener, IProjectLoadedListener, IDataChangedListener { /** * ID of variable that indicates whether at least one AUT is * currently available/startable */ public static final String IS_AUT_AVAILABLE = "org.eclipse.jubula.client.ui.rcp.variable.isAutAvailable"; //$NON-NLS-1$ /** * Constructor. */ public AvailableAutSourceProvider() { DataEventDispatcher ded = DataEventDispatcher.getInstance(); ded.addAutAgentConnectionListener(this, true); ded.addProjectStateListener(this); ded.addProjectLoadedListener(this, true); ded.addDataChangedListener(this, true); } /** * * {@inheritDoc} */ public void dispose() { DataEventDispatcher ded = DataEventDispatcher.getInstance(); ded.removeAutAgentConnectionListener(this); ded.removeProjectStateListener(this); ded.removeProjectLoadedListener(this); ded.removeDataChangedListener(this); } /** * * {@inheritDoc} */ public Map<String, Object> getCurrentState() { Map<String, Object> values = new HashMap<String, Object>(); values.put(IS_AUT_AVAILABLE, isAutAvailable()); return values; } /** * * {@inheritDoc} */ public String[] getProvidedSourceNames() { return new String [] {IS_AUT_AVAILABLE}; } /** * {@inheritDoc} */ public void handleServerConnStateChanged(ServerState state) { fireSourceChanged(); } /** * Fires a source changed event for <code>IS_AUT_AVAILABLE</code>. */ private void fireSourceChanged() { final String jobName = Messages.UIJobResolvingStartableAuts; Job resolveStartableAUTs = new Job(jobName) { protected IStatus run(IProgressMonitor monitor) { monitor.beginTask(jobName, IProgressMonitor.UNKNOWN); gdFireSourceChanged(ISources.WORKBENCH, IS_AUT_AVAILABLE, isAutAvailable()); monitor.done(); return Status.OK_STATUS; } }; JobUtils.executeJob(resolveStartableAUTs, null); } /** * * @return <code>true</code> if at least one AUT is currently * available/startable. Otherwise <code>false</code>. */ private boolean isAutAvailable() { return !StartAutBP.getInstance().getAllAUTs().isEmpty(); } /** {@inheritDoc} */ public void handleProjectLoaded() { fireSourceChanged(); } /** {@inheritDoc} */ public void handleProjectStateChanged(ProjectState state) { if (ProjectState.prop_modified.equals(state)) { fireSourceChanged(); } } /** {@inheritDoc} */ public void handleDataChanged(DataChangedEvent... events) { for (DataChangedEvent e : events) { handleDataChanged(e.getPo(), e.getDataState()); } } /** * {@inheritDoc} */ public void handleDataChanged(IPersistentObject po, DataState dataState) { if (po instanceof IProjectPO && dataState == DataState.Deleted) { fireSourceChanged(); } } }