/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.motorola.studio.android.emulator.core.emulationui;
import static com.motorola.studio.android.common.log.StudioLogger.warn;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.IViewSite;
import com.motorola.studio.android.emulator.core.devfrm.DeviceFrameworkManager;
/**
* DESCRIPTION:
* This class is the abstract parent of all emulation views content providers
*
* RESPONSIBILITY:
* Provide common method implementation for the several emulation views
* content providers
*
* COLABORATORS:
* None.
*
* USAGE:
* The class is used when a emulation view content provider is instantiated
*/
public abstract class AbstractEmuCtProvider implements ITreeContentProvider
{
/**
* The id to be used when constructing a "sent to" node
*/
public static final String SENT_TO_EMULATOR_ID = "sent_to";
/**
* The id to be used when constructing a "receive from" node
*/
public static final String RECEIVE_FROM_EMULATOR_ID = "received_from";
/**
* The parent of the entire tree
*/
private static IViewSite treeParent;
/**
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(Object)
*/
public Object getParent(Object element)
{
Object parent = null;
if (element instanceof EmuViewerNode)
{
EmuViewerNode nodeElement = (EmuViewerNode) element;
if (nodeElement instanceof EmuViewerRootNode)
{
// The IViewSite object is the parent of the whole tree
parent = treeParent;
}
else
{
parent = nodeElement.getParent();
}
}
else
{
warn("Tried to get parent of an object that is not an emulation tree node");
}
return parent;
}
/**
* @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(Object)
*/
public boolean hasChildren(Object object)
{
boolean hasChildren = false;
if (object instanceof EmuViewerNode)
{
EmuViewerNode nodeObject = (EmuViewerNode) object;
// The node has children if its children collection is bigger than 0 in size
hasChildren = (nodeObject.getChildren().size() > 0);
}
else
{
warn("Tried to test if an object that is not an emulation tree node has children");
}
return hasChildren;
}
/**
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(Object)
*/
public Object[] getElements(Object parent)
{
Object[] elements;
if (parent instanceof IViewSite)
{
if (treeParent == null)
{
// Sets the treeParent attribute to store which view site is the parent of the
// whole tree. This is done only once for each content provider instance.
// Each provider instance is supposed to be used with a single view
treeParent = (IViewSite) parent;
}
Collection<EmuViewerRootNode> emuNodeCollection = new HashSet<EmuViewerRootNode>();
Set<String> hostSet =
DeviceFrameworkManager.getInstance().getAllStartedInstancesHosts();
// A root node will be added per active emulator at the tree viewer
for (String host : hostSet)
{
EmuViewerRootNode node = new EmuViewerRootNode(host);
emuNodeCollection.add(node);
addChildrenToRootNode(node);
}
// Creating the array of elements (in this case, emulator root nodes) to be
// returned, when the parent is the view site itself
Object[] emuNodeArray = emuNodeCollection.toArray(new Object[emuNodeCollection.size()]);
elements = emuNodeArray;
}
else
{
// When elements different from the view site are provided, the elements will be
// their children
elements = getChildren(parent);
}
return elements;
}
/**
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(Object)
*/
public Object[] getChildren(Object parent)
{
Set<EmuViewerNode> childrenCollection;
Object[] returnArray;
if (parent instanceof EmuViewerNode)
{
// Firstly, try to retrieve the parent's children by means of the appropriate method
EmuViewerNode parentNode = (EmuViewerNode) parent;
childrenCollection = parentNode.getChildren();
// If the provided element is an emulator root node, it is needed to test if the
// intermediate nodes were already created (they are not created in the first request).
// If they were not created, assure that when the content framework requests, the
// intermediate nodes will be found.
//
// This procedure guarantees that once an emulator is started, it has the intermediate
// nodes constructed even if no emulation is being performed.
if (parentNode instanceof EmuViewerRootNode)
{
String host = ((EmuViewerRootNode) parentNode).getEmulatorIdentifier();
for (EmuViewerNode child : childrenCollection)
{
if (child.getChildren().size() == 0)
{
addChildrenToLeafParentNode(child, host);
}
}
}
// Creating the array of elements to be returned
returnArray = childrenCollection.toArray(new EmuViewerNode[childrenCollection.size()]);
}
else
{
warn("Tried to get children of an object that is not an emulation tree node");
returnArray = new Object[0];
}
return returnArray;
}
/**
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
public void dispose()
{
// Do nothing
}
/**
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(Viewer, Object, Object)
*/
public void inputChanged(Viewer v, Object oldInput, Object newInput)
{
// Do nothing
}
/**
* Given a root node, adds children nodes to it
*
* @param root The root node that will receive the children nodes
*/
protected void addChildrenToRootNode(EmuViewerRootNode root)
{
root.addChild(new EmuViewerNode(root, RECEIVE_FROM_EMULATOR_ID));
root.addChild(new EmuViewerNode(root, SENT_TO_EMULATOR_ID));
}
/**
* Given a node, adds children leaf nodes to it
*
* @param leafParentNode The node that will receive the children leaf nodes
* @param host The identifier of the emulator that owns this sub-tree
*/
protected abstract void addChildrenToLeafParentNode(EmuViewerNode leafParentNode, String host);
}