/** * <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.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.util.StringUtil; import com.hundsun.ares.studio.ui.editor.ARESEditorPlugin; import com.hundsun.ares.studio.ui.extendpoint.manager.AresExtendPointFieldDetail; import com.hundsun.ares.studio.ui.extendpoint.manager.AresExtendPointModelDetail; import com.hundsun.ares.studio.ui.extendpoint.manager.ExtendFieldDetailManager; import com.hundsun.ares.studio.ui.util.KeyValue; public class AresExtendPointOutline extends ContentOutlinePage implements PropertyChangeListener{ AresExtendPointOutlineProvider provider = new AresExtendPointOutlineProvider(); 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(){ getTreeViewer().refresh(); } public void propertyChange(PropertyChangeEvent evt) { refresh(); } } class AresExtendPointOutlineProvider implements ITreeContentProvider, ILabelProvider{ public Object[] getChildren(Object parentElement) { try { if(parentElement instanceof KeyValue){ Object obj = ((KeyValue)parentElement).getKey(); if(((KeyValue)parentElement).getValue() instanceof AresExtendPointFieldDetail){ AresExtendPointFieldDetail field = (AresExtendPointFieldDetail)((KeyValue)parentElement).getValue(); Object value = getFieldValue(obj,field.getFieldName()); if(value instanceof Object[]){ Object[] array = (Object[])value; List<KeyValue> infos = new ArrayList<KeyValue>(); for(Object o:array){ AresExtendPointModelDetail modelInfo = ExtendFieldDetailManager.getDefault().getMap().get(o.getClass()); if(modelInfo != null){ infos.add(new KeyValue(o,modelInfo)); } } return infos.toArray(); }else if(value instanceof Collection){ Collection collection = (Collection)value; List<KeyValue> infos = new ArrayList<KeyValue>(); for(Object o:collection){ AresExtendPointModelDetail modelInfo = ExtendFieldDetailManager.getDefault().getMap().get(o.getClass()); if(modelInfo != null){ infos.add(new KeyValue(o,modelInfo)); } } return infos.toArray(); } } if(((KeyValue)parentElement).getValue() instanceof AresExtendPointModelDetail){ AresExtendPointModelDetail model = (AresExtendPointModelDetail)((KeyValue)parentElement).getValue(); List<KeyValue> result = new ArrayList<KeyValue>(); for(AresExtendPointFieldDetail field:model.getFields()){ result.add(new KeyValue(obj,field)); } return result.toArray(); } return new Object[]{}; } } 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) { Class type = inputElement.getClass(); AresExtendPointModelDetail info = ExtendFieldDetailManager.getDefault().getMap().get(type); if(info != null){ List<KeyValue> result = new ArrayList<KeyValue>(); for(AresExtendPointFieldDetail field:info.getFields()){ result.add(new KeyValue(inputElement,field)); } return result.toArray(); } return new Object[]{}; } public void dispose() { // TODO Auto-generated method stub } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // TODO Auto-generated method stub } public Image getImage(Object element) { if(element instanceof KeyValue){ } return null; } public String getText(Object element) { if(element instanceof KeyValue){ Object obj = ((KeyValue)element).getKey(); if(((KeyValue)element).getValue() instanceof AresExtendPointFieldDetail){ AresExtendPointFieldDetail field = (AresExtendPointFieldDetail)((KeyValue)element).getValue(); Object value = getFieldValue(obj,field.getFieldName()); if(value instanceof Object[]){ return field.getShowName(); }else if(value instanceof Collection){ return field.getShowName(); }else{ return field.getShowName() + ":" + value.toString(); } }else if(((KeyValue)element).getValue() instanceof AresExtendPointModelDetail){ AresExtendPointModelDetail model = (AresExtendPointModelDetail)((KeyValue)element).getValue(); if(StringUtil.isEmpty(model.getMainGetMethod())){ return model.getShowName(); } try { Method method = obj.getClass().getMethod(model.getMainGetMethod()); if(method != null){ Object value = method.invoke(obj); return model.getShowName() + ":" + value.toString(); } } catch (Exception e) { } return model.getShowName(); } } return null; } public void addListener(ILabelProviderListener listener) { // TODO Auto-generated method stub } public boolean isLabelProperty(Object element, String property) { // TODO Auto-generated method stub return false; } public void removeListener(ILabelProviderListener listener) { // TODO Auto-generated method stub } Object getFieldValue(Object obj,String fieldName){ Field m = getField(obj.getClass(),fieldName); 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; } Field getField(Class cls,String fieldName){ for(Field m:cls.getDeclaredFields()){ if(m.getName().equals(fieldName)){ return m; } } if(cls.getSuperclass() != null){ return getField(cls.getSuperclass(),fieldName); } return null; } }