/******************************************************************************* | |
* Copyright (c) 2005, 2007 ILOG and others. | |
* 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 | |
* | |
* Contributors: | |
* Joel Cheuoua - Initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.jet.internal.editor.outline; | |
import java.util.ArrayList; | |
import java.util.Arrays; | |
import java.util.Collection; | |
import java.util.Iterator; | |
import org.eclipse.jet.core.parser.ast.JETASTElement; | |
import org.eclipse.jet.core.parser.ast.JETCompilationUnit; | |
import org.eclipse.jet.core.parser.ast.TextElement; | |
import org.eclipse.jet.core.parser.ast.XMLBodyElement; | |
import org.eclipse.jet.internal.editor.JETTextEditor; | |
import org.eclipse.jface.viewers.ITreeContentProvider; | |
import org.eclipse.jface.viewers.Viewer; | |
public class JETOutlineContentProvider implements ITreeContentProvider { | |
private ImportsContainerInput importContainerInput; | |
private CompilationUnitContainerInput astContainerInput; | |
private OutputPackageInput outputPackageInput; | |
private JETCompilationUnit cu; | |
private OutputClassInput outputClassInput; | |
private JETTextEditor editor; | |
public class OutputClassInput { | |
private JETCompilationUnit compilationUnit; | |
public OutputClassInput(JETCompilationUnit cu) { | |
this.compilationUnit = cu; | |
} | |
public JETCompilationUnit getCompilationUnit() { | |
return compilationUnit; | |
} | |
} | |
public class OutputPackageInput { | |
private JETCompilationUnit compilationUnit; | |
public OutputPackageInput(JETCompilationUnit cu) { | |
this.compilationUnit = cu; | |
} | |
public JETCompilationUnit getCompilationUnit() { | |
return compilationUnit; | |
} | |
} | |
public class ImportInput { | |
private ImportsContainerInput container; | |
private String imp; | |
public ImportInput(ImportsContainerInput container, String imp) { | |
this.container = container; | |
this.imp = imp; | |
} | |
public ImportsContainerInput getImportsContainerInput() { | |
return container; | |
} | |
public String toString() { | |
return imp; | |
} | |
} | |
public class ImportsContainerInput { | |
private JETCompilationUnit compilationUnit; | |
private Collection importInputs; | |
public ImportsContainerInput(JETCompilationUnit cu) { | |
this.compilationUnit = cu; | |
importInputs = new ArrayList(); | |
for (Iterator iterator = cu.getImports().iterator(); iterator.hasNext();) { | |
String imp = (String) iterator.next(); | |
importInputs.add(new ImportInput(this, imp)); | |
} | |
} | |
public JETCompilationUnit getCompilationUnit() { | |
return compilationUnit; | |
} | |
public Collection getImportImputs() { | |
return importInputs; | |
} | |
} | |
public class CompilationUnitContainerInput { | |
private Collection bodyElements; | |
private JETCompilationUnit compilationUnit; | |
public CompilationUnitContainerInput(JETCompilationUnit cu) { | |
this.bodyElements = new ArrayList(); | |
this.compilationUnit = cu; | |
for (Iterator iterator = cu.getBodyElements().iterator(); iterator.hasNext();) { | |
JETASTElement elt = (JETASTElement) iterator.next(); | |
if (isFiltered(elt)) | |
continue; | |
bodyElements.add(elt); | |
} | |
} | |
public Collection getFilteredASTElements() { | |
return bodyElements; | |
} | |
public JETCompilationUnit getCompilationUnit() { | |
return compilationUnit; | |
} | |
private boolean isFiltered(JETASTElement elt) { | |
if (elt instanceof TextElement) { | |
String text = new String(((TextElement) elt).getText()); | |
text = text.replace('\r', ' '); | |
text = text.replace('\n', ' '); | |
text = text.replace('\t', ' '); | |
text = text.trim(); | |
return text.length() == 0; | |
} | |
return false; | |
} | |
} | |
public JETOutlineContentProvider(JETTextEditor editor) { | |
this.editor = editor; | |
} | |
public void dispose() { | |
// TODO Auto-generated method stub | |
} | |
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { | |
cu = (JETCompilationUnit) newInput; | |
} | |
public Object[] getElements(Object inputElement) { | |
Collection results = new ArrayList(); | |
if (inputElement instanceof JETCompilationUnit) { | |
JETCompilationUnit cu = (JETCompilationUnit) inputElement; | |
results.add(outputPackageInput = new OutputPackageInput(cu)); | |
results.add(importContainerInput = new ImportsContainerInput(cu)); | |
results.add(astContainerInput = new CompilationUnitContainerInput(cu)); | |
results.addAll(Arrays.asList(cu.getTagLibraryReferences())); | |
} | |
return results.toArray(); | |
} | |
public Object[] getChildren(Object parentElement) { | |
if (parentElement == outputPackageInput) { | |
return new Object[] { outputClassInput = new OutputClassInput(cu) }; | |
} | |
if (parentElement == importContainerInput) { | |
return importContainerInput.getImportImputs().toArray(); | |
} | |
if (parentElement == astContainerInput) { | |
return astContainerInput.bodyElements.toArray(); | |
} | |
if (parentElement instanceof XMLBodyElement) { | |
XMLBodyElement astElement = (XMLBodyElement) parentElement; | |
return astElement.getBodyElements().toArray(); | |
} | |
return null; | |
} | |
public Object getParent(Object element) { | |
if (element == outputPackageInput || element == importContainerInput || element == astContainerInput) | |
return cu; | |
if (element == outputClassInput) | |
return outputPackageInput; | |
if (element instanceof ImportInput) | |
return ((ImportInput) element).getImportsContainerInput(); | |
if (element instanceof JETASTElement) { | |
if (((JETASTElement) element).getParent() == cu) | |
return astContainerInput; | |
return ((JETASTElement) element).getParent(); | |
} | |
if (importContainerInput.getCompilationUnit().getImports().contains(element)) | |
return importContainerInput; | |
return null; | |
} | |
public boolean hasChildren(Object element) { | |
return (element instanceof XMLBodyElement) || (element == outputPackageInput) || (element == importContainerInput) | |
|| (element == astContainerInput); | |
} | |
} |