/******************************************************************************* * Copyright (c) 2017 Red Hat, Inc. * 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: * Red Hat Inc. - initial API and implementation and/or initial documentation *******************************************************************************/ package org.eclipse.thym.ui.platforms.navigator.internal; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.thym.core.HybridProject; import org.eclipse.thym.core.engine.HybridMobileEngine; import org.eclipse.thym.core.platform.PlatformConstants; import org.eclipse.thym.ui.HybridUI; public class PlatformContentProvider implements ITreeContentProvider, IResourceChangeListener { private Viewer viewer; public PlatformContentProvider() { ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE); } @Override public void dispose() { ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { this.viewer = viewer; } @Override public Object[] getElements(Object inputElement) { return null; } @Override public Object[] getChildren(Object parentElement) { if (!(parentElement instanceof IFolder)) { return new Object[0]; } IFolder folder = (IFolder) parentElement; if (folder.getProjectRelativePath().segmentCount() > 1) {// only platforms folder at the root of the project return new Object[0]; } List<HybridPlatformFolder> platformFolders = new ArrayList<>(); try { HybridProject project = HybridProject.getHybridProject(folder.getProject()); for (IResource member : folder.members()) { if (member instanceof IFolder) { IFolder platformFolder = (IFolder) member; platformFolders.add( new HybridPlatformFolder((IFolder) member, getPlatform(project, platformFolder.getName()))); } } } catch (CoreException e) { HybridUI.log(IStatus.ERROR, "Error reading cordova platforms", e); } return platformFolders.toArray(); } private HybridMobileEngine getPlatform(HybridProject project, String name) { HybridMobileEngine[] engines = project.getEngineManager().getEngines(); for (HybridMobileEngine engine : engines) { if (engine.getName().equals(name)) { return engine; } } return null; } @Override public Object getParent(Object element) { return null; } @Override public boolean hasChildren(Object element) { if (!(element instanceof IFolder)) { return false; } IFolder folder = (IFolder) element; if (folder.getProjectRelativePath().segmentCount() > 1) {// folder at the root of the project? return false; } try { return folder.members().length > 0; } catch (CoreException e) { HybridUI.log(IStatus.ERROR, "Error reading cordova platforms", e); } return false; } @Override public void resourceChanged(IResourceChangeEvent event) { IResourceDelta delta = event.getDelta(); if (viewer == null || delta == null) return; IResourceDelta[] deltas = delta.getAffectedChildren(); for (int i = 0; i < deltas.length; i++) { if (deltas[i].findMember(new Path(PlatformConstants.DIR_PLATFORMS)) != null) { viewer.getControl().getDisplay().asyncExec(new Runnable() { @Override public void run() { viewer.refresh(); } }); return; } } } }