/*
* #%~
* org.overture.ide.ui
* %%
* Copyright (C) 2008 - 2014 Overture
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #~%
*/
package org.overture.ide.ui.adapters;
import java.util.List;
import java.util.Vector;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.StyledString;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.model.IWorkbenchAdapter;
import org.eclipse.ui.model.IWorkbenchAdapter3;
import org.overture.ast.node.INode;
import org.overture.ide.core.resources.IVdmSourceUnit;
import org.overture.ide.ui.IVdmUiConstants;
import org.overture.ide.ui.VdmUIPlugin;
import org.overture.ide.ui.internal.viewsupport.DecorationgVdmLabelProvider;
import org.overture.ide.ui.internal.viewsupport.VdmColoringLabelProvider;
import org.overture.ide.ui.internal.viewsupport.VdmUILabelProvider;
import org.overture.ide.ui.outline.VdmOutlineTreeContentProvider;
public class AdapterFactoryWorkbenchAdapter implements IAdapterFactory
{
public static class VdmSourcenitWorkbenchAdapter implements
IWorkbenchAdapter, IWorkbenchAdapter3
{
private IVdmSourceUnit sourceUnit;
private IWorkbenchAdapter adapter;
public VdmSourcenitWorkbenchAdapter(IVdmSourceUnit sourceUnit)
{
this.sourceUnit = sourceUnit;
this.adapter = (IWorkbenchAdapter) Platform.getAdapterManager().getAdapter(sourceUnit.getFile(), IWorkbenchAdapter.class);
}
@Override
public Object[] getChildren(Object o)
{
return sourceUnit.getParseList().toArray();
}
@Override
public ImageDescriptor getImageDescriptor(Object object)
{
return this.adapter.getImageDescriptor(object);
}
@Override
public String getLabel(Object o)
{
if (o instanceof INode)
{
System.out.println(o);
}
return this.adapter.getLabel(o);
}
@Override
public Object getParent(Object o)
{
return this.adapter.getParent(o);
}
@Override
public StyledString getStyledText(Object element)
{
return new StyledString(getLabel(element));
}
}
public static class NodeWorkbenchAdapter implements IWorkbenchAdapter,
IWorkbenchAdapter3
{
INode node;
VdmColoringLabelProvider labelProvider;
VdmOutlineTreeContentProvider contentProvider = new VdmOutlineTreeContentProvider();
List<IOvertureWorkbenchAdapter> extensions = null;
public NodeWorkbenchAdapter(INode node)
{
this.node = node;
this.labelProvider = new DecorationgVdmLabelProvider(new VdmUILabelProvider());
this.extensions = getOvertureWorkbenchAdapterExtensions();
}
@Override
public Object[] getChildren(Object o)
{
Object[] children = this.contentProvider.getChildren(o);
if (children == null)
{
for (IOvertureWorkbenchAdapter ext : extensions)
{
children = ext.getChildren(o);
if (children != null)
{
break;
}
}
}
if(children == null)
{
children = new Object[0];
}
return children;
}
@Override
public ImageDescriptor getImageDescriptor(Object object)
{
Image img = labelProvider.getImage(object);
if (img != null)
{
return ImageDescriptor.createFromImage(img);
}
ImageDescriptor descriptor = null;
for (IOvertureWorkbenchAdapter ext : extensions)
{
descriptor = ext.getImageDescriptor(object);
if (descriptor != null)
{
break;
}
}
return descriptor;
}
@Override
public String getLabel(Object o)
{
String label = labelProvider.getText(o);
if (label == null)
{
for (IOvertureWorkbenchAdapter ext : extensions)
{
label = ext.getLabel(o);
if (label != null)
{
break;
}
}
}
if (label == null)
{
label = "Unsupported type reached: " + o;
}
return label;
}
@Override
public Object getParent(Object o)
{
// TODO Auto-generated method stub
return null;
}
@Override
public StyledString getStyledText(Object element)
{
StyledString text = labelProvider.getStyledStringProvider().getStyledText(element);
if (text == null)
{
for (IOvertureWorkbenchAdapter ext : extensions)
{
text = ext.getStyledText(element);
if (text != null)
{
break;
}
}
}
if (text == null)
{
text = new StyledString();
text.append("Unsupported type reached: " + element);
}
return text;
}
}
@SuppressWarnings("rawtypes")
@Override
public Object getAdapter(Object adaptableObject, Class adapterType)
{
if (adapterType == IWorkbenchAdapter.class
|| adapterType == IWorkbenchAdapter3.class)
{
if (adaptableObject instanceof IVdmSourceUnit)
{
return new VdmSourcenitWorkbenchAdapter((IVdmSourceUnit) adaptableObject);
}
}
if (adapterType == IWorkbenchAdapter.class
|| adapterType == IWorkbenchAdapter3.class)
{
if (adaptableObject instanceof INode)
{
return new NodeWorkbenchAdapter((INode) adaptableObject);
}
}
return null;
}
@SuppressWarnings("rawtypes")
@Override
public Class[] getAdapterList()
{
return new Class[] { IVdmSourceUnit.class, INode.class };
}
private static List<IOvertureWorkbenchAdapter> getOvertureWorkbenchAdapterExtensions()
{
List<IOvertureWorkbenchAdapter> extensions = new Vector<IOvertureWorkbenchAdapter>();
try
{
IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor(IVdmUiConstants.EXTENSION_WORKBENCH_DISPLAY);
for (IConfigurationElement e : config)
{
final Object o = e.createExecutableExtension("class");
if (o instanceof IOvertureWorkbenchAdapter)
{
IOvertureWorkbenchAdapter adaptor = (IOvertureWorkbenchAdapter) o;
extensions.add(adaptor);
}
}
} catch (Exception ex)
{
VdmUIPlugin.log(ex);
}
return extensions;
}
}