package com.aptana.rdt.internal.ui.rspec; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.graphics.Image; import org.jruby.ast.RootNode; import org.rubypeople.rdt.core.IImportContainer; import org.rubypeople.rdt.core.IParent; import org.rubypeople.rdt.core.IRubyElement; import org.rubypeople.rdt.core.IRubyScript; import org.rubypeople.rdt.core.RubyModelException; import org.rubypeople.rdt.internal.ui.RubyPlugin; import org.rubypeople.rdt.internal.ui.rubyeditor.ASTProvider; import org.rubypeople.rdt.internal.ui.rubyeditor.RubyOutlinePage; import org.rubypeople.rdt.internal.ui.viewsupport.RubyElementImageProvider; import org.rubypeople.rdt.ui.RubyElementLabels; import org.rubypeople.rdt.ui.rubyeditor.ICustomRubyOutlinePage; import org.rubypeople.rdt.ui.viewsupport.ImageDescriptorRegistry; import com.aptana.rdt.core.rspec.Behavior; import com.aptana.rdt.core.rspec.Example; import com.aptana.rdt.core.rspec.RSpecStructureCreator; import com.aptana.rdt.ui.AptanaRDTUIPlugin; public class RSpecOutlinePage extends RubyOutlinePage implements ICustomRubyOutlinePage { private static final String SPEC_FILENAME_SUFFIX = "_spec.rb"; protected ITreeContentProvider getContentProvider() { return new RSpecChildrenProvider(); } @Override protected IBaseLabelProvider getLabelProvider() { return new LabelProvider() { public String getText(Object element) { if (element instanceof Example) { return ((Example) element).getDescription(); } if (element instanceof Behavior) { return ((Behavior) element).getClassName(); } if (element instanceof IRubyElement) { return RubyElementLabels.getTextLabel(element, 0); } return super.getText(element); } public Image getImage(Object element) { ImageDescriptorRegistry registry = RubyPlugin.getImageDescriptorRegistry(); ImageDescriptor descriptor = null; if (element instanceof Example) { descriptor = RubyElementImageProvider.getMethodImageDescriptor(0); } else if (element instanceof Behavior) { descriptor = RubyElementImageProvider.getTypeImageDescriptor(false, false, false); } else if (element instanceof IRubyElement) { descriptor = new RubyElementImageProvider().getRubyImageDescriptor((IRubyElement) element, 0); } if (descriptor != null) { return registry.get(descriptor); } return super.getImage(element); } }; } class RSpecChildrenProvider extends ChildrenProvider { public Object[] getElements(Object inputElement) { IRubyScript script = (IRubyScript) inputElement; RootNode root = ASTProvider.getASTProvider() .getAST(script, ASTProvider.WAIT_YES, new NullProgressMonitor()); RSpecStructureCreator rspecCreator = new RSpecStructureCreator(); rspecCreator.acceptNode(root); Object[] behaviors = rspecCreator.getBehaviors(); Object[] all = new Object[behaviors.length + 1]; all[0] = script.getImportContainer(); System.arraycopy(behaviors, 0, all, 1, behaviors.length); return all; } public boolean hasChildren(Object element) { if (element instanceof IRubyScript) return true; if (element instanceof Behavior) return true; if (element instanceof Example) return false; if (element instanceof IImportContainer) return true; return false; } public Object getParent(Object element) { if (element instanceof IRubyScript) return null; if (element instanceof Example) return ((Example) element).getBehavior(); return null; } public Object[] getChildren(Object parentElement) { if (parentElement instanceof Behavior) return ((Behavior) parentElement).getExamples(); try { if (parentElement instanceof IParent) return ((IParent) parentElement).getChildren(); } catch (RubyModelException e) { AptanaRDTUIPlugin.log(e); } return new Object[0]; } } public boolean isEnabled(IRubyElement inputElement) { if (inputElement == null) return false; IPath path = inputElement.getPath(); if (path == null) return false; String name = path.lastSegment(); return name.endsWith(SPEC_FILENAME_SUFFIX); } }