/******************************************************************************* * Copyright (c) 2016 QNX Software Systems 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 *******************************************************************************/ package org.eclipse.cdt.make.internal.ui; import java.util.HashSet; import java.util.Set; import org.eclipse.cdt.core.model.ICContainer; import org.eclipse.cdt.make.core.IMakeTarget; import org.eclipse.cdt.make.core.IMakeTargetListener; import org.eclipse.cdt.make.core.MakeCorePlugin; import org.eclipse.cdt.make.core.MakeTargetEvent; import org.eclipse.core.resources.IContainer; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.Viewer; public class MakeNavContentProvider implements ITreeContentProvider, IMakeTargetListener { private StructuredViewer viewer; public MakeNavContentProvider() { MakeCorePlugin.getDefault().getTargetManager().addListener(this); } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { this.viewer = (StructuredViewer) viewer; } @Override public Object[] getElements(Object inputElement) { // We're not a root provider so this won't get called return null; } @Override public Object[] getChildren(Object parentElement) { if (parentElement instanceof IContainer) { IContainer container = (IContainer) parentElement; return getContainer(container); } else if (parentElement instanceof ICContainer) { IContainer container = ((ICContainer) parentElement).getResource(); return getContainer(container); } else if (parentElement instanceof MakeTargetsContainer) { return ((MakeTargetsContainer) parentElement).getTargets(); } return new Object[0]; } private MakeTargetsContainer[] getContainer(IContainer container) { try { IMakeTarget[] targets = MakeCorePlugin.getDefault().getTargetManager().getTargets(container); if (targets != null && targets.length > 0) { return new MakeTargetsContainer[] { new MakeTargetsContainer(container, targets) }; } } catch (CoreException e) { MakeUIPlugin.log(e.getStatus()); } return new MakeTargetsContainer[0]; } @Override public Object getParent(Object element) { if (element instanceof IMakeTarget || element instanceof MakeTargetsContainer) { // TODO need this? return null; } else { return null; } } @Override public boolean hasChildren(Object element) { if (element instanceof IContainer || element instanceof ICContainer || element instanceof MakeTargetsContainer) { return true; } else { return false; } } @Override public void targetChanged(MakeTargetEvent event) { if (viewer == null || viewer.getControl().isDisposed()) { return; } switch (event.getType()) { case MakeTargetEvent.TARGET_ADD: case MakeTargetEvent.TARGET_REMOVED: Set<Object> elements = new HashSet<>(); for (IMakeTarget target : event.getTargets()) { IContainer container = target.getContainer(); elements.add(container); } if (!elements.isEmpty()) { viewer.getControl().getDisplay().asyncExec(() -> { for (Object element : elements) { viewer.refresh(element); } }); } } } }