/** * Դ�������ƣ�MetadataTreeContentProvider.java * �������Ȩ���������ӹɷ����޹�˾ ��Ȩ���� * ϵͳ���ƣ�JRES Studio * ģ�����ƣ�com.hundsun.ares.studio.jres.metadata.ui * ����˵����Ԫ�����û��༭��UIչ����ع��� * ����ĵ��� * ���ߣ� */ package com.hundsun.ares.studio.jres.metadata.ui.viewer; import java.util.ArrayList; import java.util.List; import org.eclipse.emf.common.util.EList; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; 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.MetadataResourceData; /** * ��Ϊ��������ͬ��������ڲ�ͬλ�ã����Ա����õ�{@link TreeViewer}��������<code>setUseHashlookup(false)</code> * @author gongyf * */ public class MetadataTreeContentProvider implements ITreeContentProvider { private List<CategoryListener> categoryListeners = new ArrayList<MetadataTreeContentProvider.CategoryListener>(); public interface CategoryListener { void showCategoryStateChanged(); } private boolean showCategory = false; /** * δ����ķ��� */ private UncategorizedItemsCategoryImpl other; /** * ��ȡδ������� * @return the other */ public UncategorizedItemsCategoryImpl getUncategorizedCategory() { return other; } /** * @param showCategory the showCategory to set */ public void setShowCategory(boolean showCategory) { this.showCategory = showCategory; fireStateChangeEvent(); } public void addShowCategoryStateChangeListener(CategoryListener listener) { categoryListeners.add(listener); } private void fireStateChangeEvent() { for (CategoryListener listener : categoryListeners) { listener.showCategoryStateChanged(); } } /** * @return the showCategory */ public boolean isShowCategory() { return showCategory; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ @Override public void dispose() { } /* (non-Javadoc) * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { other = new UncategorizedItemsCategoryImpl((MetadataResourceData<?>) newInput); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#getElements(java.lang.Object) */ @Override public Object[] getElements(Object inputElement) { if (inputElement instanceof MetadataResourceData) { MetadataResourceData<?> data = (MetadataResourceData<?>) inputElement; if (isShowCategory()) { // ��Ҫ��û�б�����Ķ���ŵ�δ����ķ�������ȥ List<MetadataCategory> categories = new ArrayList<MetadataCategory>(); categories.addAll(data.getRoot().getChildren()); categories.add(other); return categories.toArray(); } else { return ((MetadataResourceData) inputElement).getItems().toArray(); } } return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) */ @Override public Object[] getChildren(Object parentElement) { if (parentElement instanceof MetadataCategory) { List<Object> children = new ArrayList<Object>(); children.addAll(((MetadataCategory) parentElement).getChildren()); children.addAll(((MetadataCategory) parentElement).getItems()); return children.toArray(); } return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object) */ @Override public Object getParent(Object element) { if (element instanceof MetadataCategory) { return ((MetadataCategory) element).eContainer(); } else if (element instanceof MetadataItem) { if (isShowCategory()) { EList<MetadataCategory> categories = ((MetadataItem) element).getCategories(); if (categories.isEmpty()) { // Ӧ����δ������ return other; } else { return categories.get(0); } } } return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object) */ @Override public boolean hasChildren(Object element) { if (element instanceof MetadataCategory) { MetadataCategory category = (MetadataCategory) element; return !category.getChildren().isEmpty() || !category.getItems().isEmpty(); } return false; } }