/**
* Copyright (c) 2009-2012 MATSUFUJI Hideharu <matsufuji2008@gmail.com>,
* All rights reserved.
*
* This file is part of MakeGood.
*
* 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
*/
package com.piece_framework.makegood.ui;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.dltk.core.IMethod;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.IType;
import org.eclipse.dltk.core.ITypeHierarchy;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.internal.ui.editor.EditorUtility;
import org.eclipse.jface.text.ITextViewerExtension5;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.ui.IEditorPart;
import org.eclipse.wst.sse.ui.StructuredTextEditor;
public class EditorParser {
private IEditorPart editor;
/**
* @since 2.3.0
*/
public static EditorParser createActiveEditorParser() {
ActiveEditor activeEditor = MakeGoodContext.getInstance().getActiveEditor();
if (!activeEditor.isPHP()) return null;
return new EditorParser(activeEditor.get());
}
public EditorParser(IEditorPart editor) {
this.editor = editor;
}
public ISourceModule getSourceModule() {
return EditorUtility.getEditorInputModelElement(editor, false);
}
public IModelElement getModelElementOnSelection() {
Assert.isTrue(editor instanceof StructuredTextEditor);
ISourceViewer sourceViewer = ((StructuredTextEditor) editor).getTextViewer();
if (sourceViewer == null) return null;
StyledText styledText = sourceViewer.getTextWidget();
if (styledText == null) return null;
int caret = 0;
if (sourceViewer instanceof ITextViewerExtension5) {
ITextViewerExtension5 extension = (ITextViewerExtension5) sourceViewer;
caret = extension.widgetOffset2ModelOffset(styledText
.getCaretOffset());
} else {
int offset = sourceViewer.getVisibleRegion().getOffset();
caret = offset + styledText.getCaretOffset();
}
ISourceModule source = getSourceModule();
if (source == null) return null;
IModelElement element = null;
try {
element = source.getElementAt(caret);
while (element != null && !(element instanceof IType) && !(element instanceof IMethod)) {
element = element.getParent();
}
} catch (ModelException e) {
Activator.getDefault().getLog().log(
new Status(
Status.WARNING,
Activator.PLUGIN_ID,
e.getMessage(),
e
)
);
}
return element;
}
public List<IType> getTypes() {
ISourceModule source = getSourceModule();
if (source == null) {
return null;
}
List<IType> types = new ArrayList<IType>();
try {
for (IType type: source.getAllTypes()) {
types.add(type);
ITypeHierarchy hierarchy = type.newTypeHierarchy(new NullProgressMonitor());
if (hierarchy != null) {
for (IType subClass : hierarchy.getAllSubtypes(type)) {
types.add(subClass);
}
}
}
} catch (ModelException e) {
Activator.getDefault().getLog().log(
new Status(
Status.ERROR,
Activator.PLUGIN_ID,
e.getMessage(),
e
)
);
}
return types;
}
}