/**
* <p>Copyright: Copyright 2010</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.ui.editor.outline;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
import com.hundsun.ares.studio.core.model.FieldDetail;
import com.hundsun.ares.studio.core.util.StringUtil;
import com.hundsun.ares.studio.ui.editor.ARESEditorPlugin;
/**
* ARESĬ�ϵĴ��
* ����ģ�Ͱı�ע�����ɴ��
* @author maxh
*
*/
public class AresAnnotationOutline extends ContentOutlinePage implements PropertyChangeListener{
AresAnnotationOutlineProvider provider = new AresAnnotationOutlineProvider();
Object info;
@Override
public void createControl(Composite parent) {
super.createControl(parent);
getTreeViewer().setContentProvider(provider);
getTreeViewer().setLabelProvider(provider);
getTreeViewer().getTree().setBackground(ARESEditorPlugin.getDefault().getColorManager().getColor(new RGB(225,240,255)));
getTreeViewer().setInput(info);
}
public void setInput(Object info) {
this.info = info;
}
public void refresh(){
if(getTreeViewer() != null){
getTreeViewer().refresh();
}
}
public void propertyChange(PropertyChangeEvent evt) {
refresh();
}
}
class AresAnnotationOutlineProvider implements ITreeContentProvider, ILabelProvider{
public Object[] getChildren(Object parentElement) {
try {
if(parentElement instanceof AresAnnotationOutlineInfo){
AresAnnotationOutlineInfo info = (AresAnnotationOutlineInfo)parentElement;
if(info.m != null){
Object value = info.getFieldValue(info.obj);
if(value instanceof Object[]){
Object[] obj = (Object[])value;
List<AresAnnotationOutlineInfo> infos = new ArrayList<AresAnnotationOutlineInfo>();
for(Object o:obj){
infos.addAll(getOutlineObject(o));
}
return infos.toArray();
}else if(value instanceof Collection){
Collection obj = (Collection)value;
List<AresAnnotationOutlineInfo> infos = new ArrayList<AresAnnotationOutlineInfo>();
for(Object o:obj){
infos.addAll(getOutlineObject(o));
}
return infos.toArray();
}
return new Object[]{};
}else{
return getAllOutlineMethods(info.obj).toArray();
}
}
} catch (Exception e) {
}
return null;
}
public Object getParent(Object element) {
return null;
}
public boolean hasChildren(Object element) {
Object[] children = getChildren(element);
return (children != null)&&(children.length>0);
}
public Object[] getElements(Object inputElement) {
return getAllOutlineMethods(inputElement).toArray();
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
public Image getImage(Object element) {
try {
if(element instanceof AresAnnotationOutlineInfo){
AresAnnotationOutlineInfo info = (AresAnnotationOutlineInfo)element;
if(!StringUtil.isEmpty(info.annotation.showPic())){
String key = info.annotation.showPic();
URL keyUrl = info.obj.getClass().getClassLoader().getResource(key);
return ARESEditorPlugin.getImage(key, keyUrl);
}
}
} catch (Exception e) {
}
return null;
}
public String getText(Object element) {
try {
if(element instanceof AresAnnotationOutlineInfo){
AresAnnotationOutlineInfo info = (AresAnnotationOutlineInfo)element;
String text = info.annotation.showName();
if(info.m != null){
Object value = info.getFieldValue(info.obj);
if(value instanceof Object[] || value instanceof Collection){
return text;
}else{
return text + ":" + value.toString();
}
}else{
String add = "";
Method method = info.obj.getClass().getMethod(info.annotation.mainGetMethod());
if(method != null){
add = method.invoke(info.obj).toString();
}
return text+add;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void addListener(ILabelProviderListener listener) {
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
}
List<AresAnnotationOutlineInfo> getOutlineObject(Object obj){
List<AresAnnotationOutlineInfo> methods = new ArrayList<AresAnnotationOutlineInfo>();
FieldDetail annotation = obj.getClass().getAnnotation(FieldDetail.class);
if(annotation != null && annotation.showInOutline()){
methods.add(new AresAnnotationOutlineInfo(annotation,null,obj));
}
return methods;
}
List<AresAnnotationOutlineInfo> getAllOutlineMethods(Object obj){
List<AresAnnotationOutlineInfo> methods = new ArrayList<AresAnnotationOutlineInfo>();
getMethods(obj.getClass(),obj,methods);
return methods;
}
void getMethods(Class cls,Object obj,List<AresAnnotationOutlineInfo> set){
for(Field m:cls.getDeclaredFields()){
FieldDetail annotation = m.getAnnotation(FieldDetail.class);
if(annotation != null && annotation.showInOutline()){
set.add(new AresAnnotationOutlineInfo(annotation,m,obj));
}
}
if(cls.getSuperclass() != null){
getMethods(cls.getSuperclass(),obj,set);
}
}
}
class AresAnnotationOutlineInfo{
public FieldDetail annotation;
public Field m;
public Object obj;
public AresAnnotationOutlineInfo(FieldDetail annotation,Field m,Object obj){
this.annotation = annotation;
this.m = m;
this.obj = obj;
}
public Object getFieldValue(Object obj){
Object result = null;
if(m != null){
boolean flag = m.isAccessible();
try {
m.setAccessible(true);
result = m.get(obj);
} catch (Exception e) {
}finally{
m.setAccessible(flag);
}
}
return result;
}
}