package org.eclipse.jst.jee.ui.internal.navigator.ejb;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IDecoration;
import org.eclipse.jface.viewers.ILightweightLabelDecorator;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
import org.eclipse.jst.jee.ui.plugin.JEEUIPlugin;
import org.eclipse.jst.jee.ui.plugin.JEEUIPluginIcons;

public class BeanDecorator extends LabelProvider implements ILightweightLabelDecorator {

	public void decorate(Object element, IDecoration decoration) {
		if (element instanceof BeanInterfaceNode){
			BeanInterfaceNode beanInteraceNode = (BeanInterfaceNode) element;
			switch (beanInteraceNode.getKind()) {
			case BeanInterfaceNode.KINDS.BUSSINESS_LOCAL:
				applyDecorator(JEEUIPluginIcons.BUSSINESS_LOCAL, decoration);
				break;
			case BeanInterfaceNode.KINDS.BUSSINESS_REMOTE:
				applyDecorator(JEEUIPluginIcons.BUSSINESS_REMOTE, decoration);
				break;
			case BeanInterfaceNode.KINDS.REMOTE:
				applyDecorator(JEEUIPluginIcons.REMOTE, decoration);
				break;
			case BeanInterfaceNode.KINDS.REMOTE_HOME:
				applyDecorator(JEEUIPluginIcons.REMOTE_HOME, decoration);
				break;
			case BeanInterfaceNode.KINDS.LOCAL:
				applyDecorator(JEEUIPluginIcons.LOCAL, decoration);
				break;
			case BeanInterfaceNode.KINDS.LOCAL_HOME:
				applyDecorator(JEEUIPluginIcons.LOCAL_HOME, decoration);
				break;
			}
		} else if (element instanceof BeanNode){
		  decoration.addOverlay(J2EEUIPlugin.getDefault().getImageDescriptor("ejb_module_ovr")); //$NON-NLS-1$
		}		
	}

	private void applyDecorator(String id, IDecoration decoration) {
		ImageDescriptor imageDescriptor = JEEUIPlugin.getDefault().getImageDescriptor(id);
		decoration.addOverlay(imageDescriptor);
		
	}

}
