/**
* Դ�������ƣ�OpenResourceBlock.java
* �������Ȩ���������ӹɷ�����˾ ��Ȩ����
* ϵͳ���ƣ�JRES Studio
* ģ�����ƣ�com.hundsun.ares.studio.jres.database.ui
* ����˵����$desc
* ����ĵ���
* ���ߣ�
*/
package com.hundsun.ares.studio.ui.editor.blocks;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.eclipse.core.resources.IFile;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import com.hundsun.ares.studio.core.ARESModelException;
import com.hundsun.ares.studio.core.IARESElement;
import com.hundsun.ares.studio.core.IARESModule;
import com.hundsun.ares.studio.core.IARESModuleRoot;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.core.model.CorePackage;
import com.hundsun.ares.studio.ui.editor.actions.OpenResourceExportAction;
import com.hundsun.ares.studio.ui.editor.viewers.BaseEObjectColumnLabelProvider;
/**
* @author yanwj06282
*
*/
public class OpenResourceBlock extends TableViewerBlock {
protected IARESElement element;
public String[] titiles;
public EStructuralFeature[] features;
//��չ��
public Map<String,String> exTitles = new LinkedHashMap<String ,String>();
private boolean compStat = false;
public OpenResourceBlock(IARESElement element ,String[] titiles ,EStructuralFeature[] features) {
this.element = element;
this.titiles = titiles;
this.features = features;
}
@Override
protected String getID() {
return getClass().getName();
}
@Override
protected IContentProvider getColumnViewerContentProvider() {
return new ArrayContentProvider();
}
@Override
protected void createMenus(IMenuManager menuManager) {
}
@Override
protected void createToolbarItems(ToolBarManager manager) {
List<OpenResourceInfo> databaseList = new ArrayList<OpenResourceInfo>();
IARESResource[] resources = null;
try {
if(element instanceof IARESModuleRoot) {
resources = ((IARESModuleRoot) element).getResources();
}else if (element instanceof IARESModule) {
resources = ((IARESModule) element).getARESResources(true);
}
for (IARESResource resource : resources) {
EObject dbinfo = resource.getInfo(EObject.class);
if (dbinfo != null) {
OpenResourceInfo info = new OpenResourceInfo(resource, dbinfo);
databaseList.add(info);
}
}
} catch (ARESModelException e) {
e.printStackTrace();
}
OpenResourceExportAction action = new OpenResourceExportAction(databaseList ,this);
manager.add(action);
}
@Override
protected void createColumns(final TableViewer viewer) {
final TableViewer tableViewer = (TableViewer) viewer;
final TableViewerColumn tvColumn = new TableViewerColumn(tableViewer, SWT.LEFT);
tvColumn.getColumn().setWidth(80);
tvColumn.getColumn().setText("����");
tvColumn.setLabelProvider(new ColumnLabelProvider(){
@Override
public String getText(Object element) {
return OpenResourceHelper.getType(element);
}
});
tvColumn.getColumn().setMoveable(true);
tvColumn.getColumn().addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
Object input = getColumnViewer().getInput();
if (input instanceof List) {
compartorResList((List<Object>) input, CorePackage.Literals.BASIC_RESOURCE_INFO__OBJECT_ID);
compStat = !compStat;
}
getColumnViewer().setInput(input);
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
});
final TableViewerColumn pathColumn = new TableViewerColumn(tableViewer, SWT.LEFT);
pathColumn.getColumn().setWidth(80);
pathColumn.getColumn().setText("·��");
pathColumn.setLabelProvider(new ColumnLabelProvider(){
@Override
public String getText(Object element) {
if (element instanceof OpenResourceInfo) {
return OpenResourceHelper.getChineseFileName("/" ,((OpenResourceInfo) element).getResource().getModule());
}else {
return StringUtils.EMPTY;
}
}
});
pathColumn.getColumn().setMoveable(true);
pathColumn.getColumn().addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
Object input = getColumnViewer().getInput();
if (input instanceof List) {
Collections.sort((List)input, new StringList());
compStat = !compStat;
}
getColumnViewer().setInput(input);
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
});
for (int i = 0; i < titiles.length; i++) {
String title = titiles[i];
final EStructuralFeature feature = features[i];
BaseEObjectColumnLabelProvider labelProvider = new BaseEObjectColumnLabelProvider(feature){
@Override
protected EObject getOwner(Object element) {
if (element instanceof OpenResourceInfo) {
return ((OpenResourceInfo) element).getObj();
}
return null;
}
};
final TableViewerColumn exColumn = new TableViewerColumn(tableViewer, SWT.LEFT);
exColumn.getColumn().setWidth(80);
exColumn.getColumn().setText(title);
exColumn.setLabelProvider(labelProvider);
exColumn.getColumn().setMoveable(true);
exColumn.getColumn().addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
Object input = getColumnViewer().getInput();
if (input instanceof List) {
compartorResList((List<Object>) input, feature);
compStat = !compStat;
}
getColumnViewer().setInput(input);
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
});
}
try {
List<IARESResource> resList = new ArrayList<IARESResource>();
if (element instanceof IARESModuleRoot) {
resList.addAll(Arrays.asList(((IARESModuleRoot) element).getResources()));
}else if (element instanceof IARESModule) {
resList.addAll(Arrays.asList(((IARESModule) element).getARESResources(true)));
}
//���ģ�����ģ�������������Դ����չ��Ϣ(������Ϣ)
//ÿ������ֻ��Ҫ����һ����չ��Ϣ
Set<String> typeSet = new HashSet<String>();
Set<String> exDupTitle = new HashSet<String>();
for(IARESResource res : resList){
if (typeSet.contains(res.getType())) {
continue;
}else {
typeSet.add(res.getType());
}
//������չ
exTitles.putAll(OpenResourceHelper.createExtensibleModelTableViewerColumns(getColumnViewer(), res , null ,exDupTitle));
}
} catch (ARESModelException e) {
e.printStackTrace();
}
//���������˫������
viewer.addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
IStructuredSelection ss = (IStructuredSelection) viewer.getSelection();
OpenResourceInfo element = (OpenResourceInfo) ss.getFirstElement();
if (element == null)
return;
try {
IDE.openEditor(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(), (IFile) element.getResource().getResource());
} catch (PartInitException e) {
e.printStackTrace();
}
}
});
}
@Override
public void setInput(Object input) {
super.setInput(input);
for (TableColumn column : getColumnViewer().getTable().getColumns()) {
column.pack();
}
}
private void compartorResList(List<Object> databaseList , EStructuralFeature attribute){
Collections.sort(databaseList, new ResList(attribute));
}
class ResList implements Comparator<Object>{
private EStructuralFeature attribute;
public ResList(EStructuralFeature attribute){
this.attribute = attribute;
}
@Override
public int compare(Object obj1, Object obj2) {
if ((obj1 instanceof OpenResourceInfo) && (obj2 instanceof OpenResourceInfo)) {
OpenResourceInfo o1 = (OpenResourceInfo) obj1;
OpenResourceInfo o2 = (OpenResourceInfo) obj2;
Object v1 = o1.getObj().eGet(attribute);
Object v2 = o2.getObj().eGet(attribute);
if(v1 instanceof String && v2 instanceof String) {
if (compStat) {
return (((String)v2).toLowerCase()).compareTo(((String)v1).toLowerCase());
}
return (((String)v1).toLowerCase()).compareTo(((String)v2).toLowerCase());
}
}
return 0;
}
}
class StringList implements Comparator<OpenResourceInfo>{
@Override
public int compare(OpenResourceInfo o1, OpenResourceInfo o2) {
String v1 = OpenResourceHelper.getChineseFileName("/" ,o1.getResource().getModule());
String v2 = OpenResourceHelper.getChineseFileName("/" ,o2.getResource().getModule());
if (compStat) {
return (((String)v2).toLowerCase()).compareTo(((String)v1).toLowerCase());
}
return (((String)v1).toLowerCase()).compareTo(((String)v2).toLowerCase());
}
}
}