/**
* Դ�������ƣ�MetadataColumnViewerProblemView.java
* �������Ȩ���������ӹɷ�����˾ ��Ȩ����
* ϵͳ���ƣ�JRES Studio
* ģ�����ƣ�com.hundsun.ares.studio.jres.metadata.ui
* ����˵����Ԫ�����û��༭��UIչ����ع���
* ����ĵ���
* ���ߣ�
*/
package com.hundsun.ares.studio.jres.metadata.ui.viewer;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.Stack;
import org.apache.commons.lang.ArrayUtils;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.jface.viewers.ColumnViewer;
import com.hundsun.ares.studio.jres.model.metadata.MetadataCategory;
import com.hundsun.ares.studio.jres.model.metadata.MetadataItem;
import com.hundsun.ares.studio.jres.model.metadata.MetadataPackage;
import com.hundsun.ares.studio.jres.model.metadata.MetadataResourceData;
import com.hundsun.ares.studio.jres.model.metadata.util.MetadataUtil;
import com.hundsun.ares.studio.ui.editor.viewers.EObjectColumnViewerProblemView;
import com.hundsun.ares.studio.ui.editor.viewers.RefreshViewerJob;
import com.hundsun.ares.studio.ui.validate.KeyParameter;
import com.hundsun.ares.studio.ui.validate.ProblemPoolChangeEvent;
/**
* @author wangxh
*
*/
public class MetadataColumnViewerProblemView extends
EObjectColumnViewerProblemView {
public MetadataColumnViewerProblemView(ColumnViewer viewer) {
super(viewer);
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.ui.viewers.EObjectColumnViewerProblemView#doRefresh(com.hundsun.ares.studio.jres.ui.validate.ProblemPoolChangeEvent)
*/
@Override
protected void doRefresh(ProblemPoolChangeEvent event) {
// �������ӻ�ɾ��������BasicDiagnostic
Object[] problems = ArrayUtils.addAll(event.getAddProblems(), event.getRemoveedProblems());
Set<Object> objects = new HashSet<Object>();
for (Object problem : problems) {
EObject eObj = (EObject) ((Diagnostic)problem).getData().get(0);
objects.add( eObj );
}
objects = getAllCategoriesAndSelf(objects, getViewer());
RefreshViewerJob.refresh(getViewer(), objects.toArray(), true);
}
/**
* ��ȡ�Զ���������ڵ����з���
* @param objs
* @return
*/
protected Set<Object> getAllCategoriesAndSelf(Collection<Object> objs, ColumnViewer viewer) {
Set<Object> result = new HashSet<Object>();
Stack<Object> stack = new Stack<Object>();
stack.addAll(objs);
while (!stack.isEmpty()) {
Object top = stack.pop();
if (top instanceof MetadataItem) {
EList<MetadataCategory> categories = MetadataUtil.getCategories((MetadataItem) top);
if (categories.isEmpty()) {
result.add(MetadataViewerUtil.getUncategorizedCategory(viewer));
} else {
for (MetadataCategory category : categories) {
stack.push(category);
}
}
} else if (top instanceof MetadataCategory) {
MetadataCategory parent = ((MetadataCategory) top).getParent();
// �����null��Ҳ����Ӷ����ķ���
if (parent == null || parent.eContainer() instanceof MetadataResourceData<?>) {
// continue;
} else {
stack.push(parent);
}
} else if (top instanceof EObject) {
EObject container = ((EObject) top).eContainer();
if (container != null) {
stack.push(container);
}
}
result.add(top);
}
return result;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.ui.form.IDiagnosticProvider#getDiagnostic(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EStructuralFeature)
*/
@Override
public Diagnostic getDiagnostic(EObject object, EStructuralFeature feature, Object... objects ) {
if (getPool() != null) {
Object[] problems = getPool().getProblem(new KeyParameter(ArrayUtils.addAll(new Object[]{object, feature}, objects)));
if (problems != null && problems.length > 0) {
return (Diagnostic) problems[0];
}
if (object instanceof MetadataCategory) {
Set<EObject> allChildren = new HashSet<EObject>();
allChildren.addAll(((MetadataCategory) object).getItems()) ;
allChildren.addAll(((MetadataCategory) object).getChildren());
for (EObject child : allChildren) {
Diagnostic d = getDiagnostic(child, feature);
if (d != null) {
return d;
}
}
} else if (object instanceof MetadataItem && MetadataPackage.Literals.NAMED_ELEMENT__NAME.equals(feature)) {
// �¼��Ĵ���ֻ��ʾ��ID��һ��
for (Iterator<EObject> iterator = EcoreUtil.getAllContents(object, true); iterator.hasNext(); ) {
EObject child = iterator.next();
Object[] childProblems = getPool().getProblem(new KeyParameter(new Object[]{child}));
if (childProblems != null && childProblems.length > 0) {
return (Diagnostic) childProblems[0];
}
}
}
}
return null;
}
}