/**
* Copyright (c) 2014-2017 by the respective copyright holders.
* 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.smarthome.designer.ui.internal.views;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.smarthome.designer.core.config.ConfigurationFolderProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* The content provider class is responsible for
* providing objects to the view. It can wrap
* existing objects in adapters or simply return
* objects as-is. These objects may be sensitive
* to the current input of the view, or ignore
* it and always show the same content
*
* @author Kai Kreuzer - Initial contribution and API
*
*/
public class ViewContentProvider implements IStructuredContentProvider, ITreeContentProvider {
private final Logger logger = LoggerFactory.getLogger(ViewContentProvider.class);
private IFolder configRootFolder;
@Override
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
if (newInput instanceof IFolder) {
configRootFolder = (IFolder) newInput;
}
}
@Override
public void dispose() {
configRootFolder = null;
}
@Override
public Object[] getElements(Object parent) {
if (parent instanceof IProject) {
try {
configRootFolder = ConfigurationFolderProvider.getRootConfigurationFolder();
if (configRootFolder != null) {
return getChildren(configRootFolder);
} else {
return new String[] { "<select a configuration folder>" };
}
} catch (CoreException e) {
logger.error("Cannot initialize configuration project in workspace", e);
return new Object[0];
}
}
return getChildren(parent);
}
@Override
public Object getParent(Object child) {
if (child.equals(configRootFolder))
return null;
if (child instanceof IResource) {
IResource res = (IResource) child;
return res.getParent();
}
return null;
}
@Override
public Object[] getChildren(Object parent) {
if (parent instanceof IFolder) {
IFolder folder = (IFolder) parent;
try {
IResource[] resources = folder.members();
List<IResource> children = new ArrayList<IResource>(resources.length);
for (IResource child : resources) {
// filter out hidden files
if (!child.getName().startsWith(".")) {
children.add(child);
}
}
return children.toArray(new IResource[children.size()]);
} catch (CoreException e) {
logger.warn("Error getting children for folder '{}'", folder.getName(), e);
}
}
return new Object[0];
}
@Override
public boolean hasChildren(Object parent) {
return getChildren(parent).length > 0;
}
}