/******************************************************************************* * Copyright (c) 2010, 2012 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 *******************************************************************************/ package org.eclipse.mylyn.internal.builds.ui.view; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.Assert; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.Notifier; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.mylyn.builds.core.IBuildModel; import org.eclipse.mylyn.builds.core.IBuildPlan; import org.eclipse.mylyn.builds.core.IBuildServer; import org.eclipse.mylyn.builds.internal.core.BuildModel; import org.eclipse.mylyn.internal.builds.ui.BuildsUiInternal; /** * @author Steffen Pingel */ public class BuildContentProvider implements ITreeContentProvider { public enum Presentation { BY_SERVER, BY_PLAN; @Override public String toString() { switch (this) { case BY_SERVER: return "Servers"; case BY_PLAN: return "Plans"; } throw new IllegalStateException(); }; }; private static final Object[] EMPTY_ARRAY = new Object[0]; private Object input; private BuildModel model; private final Adapter modelListener = new BuildModelContentAdapter() { @Override protected void doNotifyChanged(Notification msg) { refresh(); } protected boolean observing(Notifier notifier) { // reduce the number of refreshes by limiting the number of monitored objects: refresh jobs trigger notifications // on the server and model objects which is sufficient to monitor plan updates return notifier instanceof IBuildServer || notifier instanceof IBuildModel; } }; private boolean nestPlansEnabled; private Presentation presentation; private boolean selectedOnly; private Viewer viewer; public BuildContentProvider() { setNestPlansEnabled(true); setPresentation(Presentation.BY_SERVER); } public void dispose() { // ignore } public Object[] getChildren(Object parentElement) { if (parentElement instanceof IBuildServer) { return getPlans(parentElement, model.getPlans(((IBuildServer) parentElement))).toArray(); } else if (parentElement instanceof IBuildPlan) { return getPlans(parentElement, ((IBuildPlan) parentElement).getChildren()).toArray(); } return EMPTY_ARRAY; } public Object[] getElements(Object inputElement) { if (inputElement instanceof IBuildServer) { return getPlans(inputElement, model.getPlans(((IBuildServer) inputElement))).toArray(); } else if (inputElement instanceof List<?>) { return ((List<?>) inputElement).toArray(); } else { IBuildModel model = getModel(inputElement); if (model != null) { switch (presentation) { case BY_SERVER: return model.getServers().toArray(); case BY_PLAN: return model.getPlans().toArray(); } } } return EMPTY_ARRAY; } private IBuildModel getModel(Object inputElement) { if (inputElement instanceof IBuildModel) { return ((IBuildModel) inputElement); } else if (inputElement == input) { return model; } return null; } public Object getParent(Object element) { if (element instanceof IBuildServer) { return input; } else if (element instanceof IBuildPlan) { IBuildPlan plan = (IBuildPlan) element; if (plan.getParent() != null) { return plan.getParent(); } else { return plan.getServer(); } } return null; } private List<IBuildPlan> getPlans(Object parent, List<IBuildPlan> plans) { List<IBuildPlan> children = new ArrayList<IBuildPlan>(plans.size()); for (IBuildPlan plan : plans) { if (isSelectedOnly() && !plan.isSelected()) { continue; } if (isNestPlansEnabled() && plan.getParent() != null && plan.getParent() != parent) { continue; } children.add(plan); } return children; } public Presentation getPresentation() { return presentation; } public boolean hasChildren(Object element) { return getChildren(element).length > 0; } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { this.viewer = viewer; if (model != null) { model.eAdapters().remove(modelListener); } if (newInput instanceof BuildModel) { model = (BuildModel) newInput; } else { model = BuildsUiInternal.getModel(); } model.eAdapters().add(modelListener); this.input = newInput; } public final boolean isNestPlansEnabled() { return nestPlansEnabled; } public final boolean isSelectedOnly() { return selectedOnly; } public final void setNestPlansEnabled(boolean nestPlansEnabled) { this.nestPlansEnabled = nestPlansEnabled; } public void setPresentation(Presentation presentation) { Assert.isNotNull(presentation); this.presentation = presentation; refresh(); } public final void setSelectedOnly(boolean selectedOnly) { this.selectedOnly = selectedOnly; } protected void refresh() { if (viewer != null && !viewer.getControl().isDisposed()) { viewer.refresh(); } } }