| /******************************************************************************* |
| * Copyright (c) 2011 Tasktop Technologies. |
| * 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 |
| *******************************************************************************/ |
| package org.eclipse.mylyn.internal.context.ui; |
| |
| import java.util.List; |
| |
| import org.eclipse.core.runtime.IAdaptable; |
| 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.mylyn.context.core.AbstractContextStructureBridge; |
| import org.eclipse.mylyn.context.core.ContextComputationStrategy; |
| import org.eclipse.mylyn.context.core.ContextCore; |
| import org.eclipse.mylyn.context.core.IInteractionContext; |
| import org.eclipse.mylyn.context.ui.AbstractFocusViewAction; |
| import org.eclipse.mylyn.internal.context.core.StrategiesExtensionPointReader; |
| import org.eclipse.mylyn.monitor.core.InteractionEvent; |
| import org.eclipse.ui.IViewPart; |
| import org.eclipse.ui.IViewReference; |
| import org.eclipse.ui.IWorkbenchPage; |
| import org.eclipse.ui.IWorkbenchWindow; |
| import org.eclipse.ui.internal.Workbench; |
| import org.eclipse.ui.progress.UIJob; |
| |
| /** |
| * Populate a context from a task data |
| * |
| * @author David Green |
| * @see ContextComputationStrategy |
| */ |
| public class ContextPopulationStrategy { |
| |
| private static final String PART_ID = ContextPopulationStrategy.class.getName(); |
| |
| private ContextComputationStrategy contextComputationStrategy; |
| |
| private boolean disabled; |
| |
| public boolean isDisabled() { |
| return disabled; |
| } |
| |
| public void populateContext(final IInteractionContext context, final IAdaptable input) { |
| Job job = new Job(Messages.ContextPopulationStrategy_Populate_Context_Job_Label) { |
| @Override |
| protected IStatus run(IProgressMonitor monitor) { |
| // compute data model elements |
| ContextComputationStrategy strategy = getContextComputationStrategy(); |
| if (strategy == null) { |
| return Status.CANCEL_STATUS; |
| } |
| final List<Object> contextItems = strategy.computeContext(context, input, monitor); |
| |
| if (monitor.isCanceled()) { |
| return Status.CANCEL_STATUS; |
| } |
| |
| // add elements to context through simulating selection events |
| if (!contextItems.isEmpty()) { |
| UIJob uiJob = new UIJob(Messages.ContextPopulationStrategy_Populate_Context_Job_Label) { |
| @Override |
| public IStatus runInUIThread(IProgressMonitor monitor) { |
| IInteractionContext activeContext = ContextCore.getContextManager().getActiveContext(); |
| if (activeContext != null && activeContext.getHandleIdentifier() != null |
| && activeContext.getHandleIdentifier().equals(context.getHandleIdentifier())) { |
| monitor.beginTask(Messages.ContextPopulationStrategy_Populate_Context_Job_Label, |
| contextItems.size()); |
| try { |
| for (Object element : contextItems) { |
| |
| monitor.worked(1); |
| AbstractContextStructureBridge structureBridge = ContextCore.getStructureBridge(element); |
| if (structureBridge != null) { |
| String handleIdentifier = structureBridge.getHandleIdentifier(element); |
| if (handleIdentifier != null) { |
| try { |
| ContextCore.getContextManager().processInteractionEvent( |
| new InteractionEvent(InteractionEvent.Kind.SELECTION, |
| structureBridge.getContentType(), handleIdentifier, |
| PART_ID)); |
| } catch (Exception e) { |
| IStatus status = new Status(IStatus.ERROR, |
| ContextUiPlugin.ID_PLUGIN, |
| "Unexpected error manipulating context", e); //$NON-NLS-1$ |
| ContextUiPlugin.getDefault().getLog().log(status); |
| } |
| } |
| } |
| } |
| } finally { |
| monitor.done(); |
| } |
| if (!activeContext.getAllElements().isEmpty()) { |
| // activate structured view filters if needed |
| if (ContextUiPlugin.getDefault() |
| .getPreferenceStore() |
| .getBoolean(IContextUiPreferenceContstants.AUTO_FOCUS_NAVIGATORS)) { |
| for (IWorkbenchWindow window : Workbench.getInstance().getWorkbenchWindows()) { |
| for (IWorkbenchPage page : window.getPages()) { |
| for (IViewReference viewReference : page.getViewReferences()) { |
| IViewPart viewPart = (IViewPart) viewReference.getPart(false); |
| if (viewPart != null) { |
| AbstractFocusViewAction applyAction = AbstractFocusViewAction.getActionForPart(viewPart); |
| if (applyAction != null) { |
| applyAction.update(true); |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| return monitor.isCanceled() ? Status.CANCEL_STATUS : Status.OK_STATUS; |
| } |
| }; |
| uiJob.schedule(); |
| |
| } |
| return Status.OK_STATUS; |
| } |
| }; |
| job.schedule(); |
| } |
| |
| public synchronized ContextComputationStrategy getContextComputationStrategy() { |
| if (contextComputationStrategy == null) { |
| List<ContextComputationStrategy> strategies = StrategiesExtensionPointReader.readContextComputationStrategies(); |
| if (strategies.isEmpty()) { |
| disabled = true; |
| } else if (strategies.size() > 1) { |
| CompoundContextComputationStrategy compoundStrategy = new CompoundContextComputationStrategy(); |
| compoundStrategy.setDelegates(strategies); |
| contextComputationStrategy = compoundStrategy; |
| } else { |
| contextComputationStrategy = strategies.get(0); |
| } |
| } |
| return contextComputationStrategy; |
| } |
| |
| public void setContextComputationStrategy(ContextComputationStrategy contextComputationStrategy) { |
| this.contextComputationStrategy = contextComputationStrategy; |
| } |
| |
| } |