/**
* Դ�������ƣ�MetadataViewerUtil.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.ecore.EObject;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import com.hundsun.ares.studio.jres.model.metadata.MetadataCategory;
import com.hundsun.ares.studio.jres.model.metadata.MetadataResourceData;
/**
* @author gongyf
*
*/
public class MetadataViewerUtil {
/**
* Ԫ������ͼ�еı���Ƿ�ʹ�÷�����ʾ
* @param viewer
* @return
*/
static public boolean isShowCategory(ColumnViewer viewer) {
IContentProvider provider = viewer.getContentProvider();
if (provider instanceof MetadataTreeContentProvider ) {
return ((MetadataTreeContentProvider) provider).isShowCategory();
}
return false;
}
/**
* ��ȡδ����ķ���ģ��
* @param viewer
* @return
*/
static public MetadataCategory getUncategorizedCategory(ColumnViewer viewer) {
IContentProvider provider = viewer.getContentProvider();
if (provider instanceof MetadataTreeContentProvider ) {
return ((MetadataTreeContentProvider) provider).getUncategorizedCategory();
}
return null;
}
/**
* Ԫ���ݱ���е�ǰѡ�еķ��飬�����Ƿ��鱻ֱ��ѡ���ˣ�Ҳ�����Ƿ����µ���Ŀ��ѡ����<BR>
* ����ѡ�е�����£�ֻ����һ����ѡ�е���
* @param viewer
* @param excludeSelf ��ѡ��һ������ʱ���Ƿ��ų��Լ�������������������ڵķ���
* @return
*/
static public MetadataCategory getSelectedCategory(ColumnViewer viewer, boolean excludeSelf) {
ITreeSelection selection = (ITreeSelection) viewer.getSelection();
if (selection != null && !selection.isEmpty()) {
TreePath path = selection.getPaths()[0];
if (!excludeSelf && path.getLastSegment() instanceof MetadataCategory) {
return (MetadataCategory) path.getLastSegment();
} else {
if (path.getSegmentCount() >= 2) {
for(int i = path.getSegmentCount()-1; i >0 ; i--){
Object obj = path.getSegment(i-1);
if(obj instanceof MetadataCategory){
return (MetadataCategory)obj;
}
}
}
}
}
if (viewer.getInput() == null) {
return null;
}
return ((MetadataResourceData<?>) viewer.getInput()).getRoot();
}
// static public EClass getEClassForFirstSelectedObject(ColumnViewer viewer) {
// IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
// if (selection != null && !selection.isEmpty()) {
// return ((EObject)selection.getFirstElement()).eClass();
// }
// return null;
// }
static public MetadataResourceData<?> getMetadataModel(ColumnViewer viewer) {
return (MetadataResourceData<?>) viewer.getInput();
}
static int getItemIndex(Object parent, TreeItem item) {
if (parent instanceof Tree) {
return ((Tree) parent).indexOf(item);
} else {
return ((TreeItem) parent).indexOf(item);
}
}
static int getItemCount(Object parent) {
if (parent instanceof Tree) {
return ((Tree) parent).getItemCount();
} else {
return ((TreeItem) parent).getItemCount();
}
}
static TreeItem getItem(Object parent, int index) {
if (parent instanceof Tree) {
return ((Tree) parent).getItem(index);
} else {
return ((TreeItem) parent).getItem(index);
}
}
static Object getParentItem(TreeItem item) {
Object parentItem = item.getParentItem();
if (parentItem == null) {
parentItem = item.getParent();
}
return parentItem;
}
static public EObject[] getVisualItems(final ColumnViewer viewer) {
final Object[] result = new Object[1];
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
try {
if (viewer instanceof TreeViewer) {
List<TreeItem> itemList = new ArrayList<TreeItem>();
Tree tree = ((TreeViewer) viewer).getTree();
TreeItem topItem = tree.getTopItem();
// ��������ʾ����Ŀ����
int itemCount = (int) ((tree.getClientArea().height / tree.getItemHeight()) * 1.2);
int curIndex = 0;
Object parentItem = getParentItem(topItem);
curIndex = getItemIndex(parentItem, topItem);
while (itemCount > 0) {
if (curIndex >= getItemCount(parentItem)) {
if (parentItem instanceof TreeItem) {
// �������������,����һ��
curIndex = getItemIndex( getParentItem((TreeItem) parentItem), (TreeItem) parentItem) + 1;
parentItem = getParentItem((TreeItem) parentItem);
} else {
break;
}
} else {
TreeItem curItem = getItem(parentItem, curIndex);
itemList.add(curItem);
itemCount--;
if (curItem.getExpanded()) {
parentItem = curItem;
curIndex = 0;
} else {
curIndex++;
}
}
}
EObject[] objects = new EObject[itemList.size()];
for (int i = 0; i < objects.length; i++) {
objects[i] = (EObject) itemList.get(i).getData();
}
result[0] = objects;
}
} catch (Exception e) {
result[0] = new EObject[0];
}
}
});
return (EObject[]) result[0];
}
}