/**
* �������Ȩ���������ӹɷ�����˾ ��Ȩ����
* ϵͳ���ƣ�JRES Studio
*/
package com.hundsun.ares.studio.jres.basicdata.ui.editor.blocks;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.core.service.DataServiceManager;
import com.hundsun.ares.studio.jres.basicdata.constant.IBasicDataEpacakgeConstant;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.BasicDataEAttribute;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.BasicDataField;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.validate.util.IKeyTableLocator;
import com.hundsun.ares.studio.jres.basicdata.logic.util.BasicDataEpackageUtil;
import com.hundsun.ares.studio.jres.basicdata.logic.util.JRESResProviderUtil;
import com.hundsun.ares.studio.jres.basicdata.ui.editor.actions.BaiscDataCopyAction;
import com.hundsun.ares.studio.jres.basicdata.ui.editor.actions.BaiscDataDeleteAction;
import com.hundsun.ares.studio.jres.basicdata.ui.editor.actions.BasicDataPasteAction;
import com.hundsun.ares.studio.jres.basicdata.ui.editor.blocks.action.AddLinkAction;
import com.hundsun.ares.studio.jres.basicdata.ui.extend.BasicdataExtensibleModelUtil;
import com.hundsun.ares.studio.jres.basicdata.ui.proposal.BasicDataContentProposalProvider;
import com.hundsun.ares.studio.jres.basicdata.ui.proposal.BasicDataContentProposalProviderHelper;
import com.hundsun.ares.studio.jres.metadata.constant.IMetadataRefType;
import com.hundsun.ares.studio.jres.metadata.service.IBusinessDataType;
import com.hundsun.ares.studio.jres.metadata.service.IMetadataService;
import com.hundsun.ares.studio.jres.metadata.service.IStandardDataType;
import com.hundsun.ares.studio.jres.metadata.service.IStandardField;
import com.hundsun.ares.studio.jres.model.metadata.StandardField;
import com.hundsun.ares.studio.jres.model.metadata.decrypt.DeDictionaryType;
import com.hundsun.ares.studio.jres.model.metadata.util.MetadataUtil;
import com.hundsun.ares.studio.ui.editor.actions.ColumnViewerInsertAction;
import com.hundsun.ares.studio.ui.editor.actions.ColumnViewerMoveDownAction;
import com.hundsun.ares.studio.ui.editor.actions.ColumnViewerMoveUpAction;
import com.hundsun.ares.studio.ui.editor.actions.CopyCellAction;
import com.hundsun.ares.studio.ui.editor.actions.CopyColumnAction;
import com.hundsun.ares.studio.ui.editor.actions.IActionIDConstant;
import com.hundsun.ares.studio.ui.editor.blocks.TableViewerBlock;
import com.hundsun.ares.studio.ui.editor.editable.ActionEditableUnit;
import com.hundsun.ares.studio.ui.editor.editingsupport.EMFEditingSupport;
import com.hundsun.ares.studio.ui.editor.extend.ExtensibleModelUtils;
import com.hundsun.ares.studio.ui.editor.viewers.EObjectColumnLabelProvider;
import com.hundsun.ares.studio.ui.editor.viewers.EObjectColumnViewerProblemView;
import com.hundsun.ares.studio.ui.editor.viewers.IEStructuralFeatureProvider;
import com.hundsun.ares.studio.ui.editor.viewers.ReferenceContentProvider;
import com.hundsun.ares.studio.ui.validate.IProblemPool;
public class LinkDetailViewerBlock extends TableViewerBlock {
private EditingDomain editingDomain;
private IARESResource resource;
private IProblemPool problemPool;
private AddLinkAction itemAddAction;
private ColumnViewerInsertAction insertAction;
private BaiscDataDeleteAction itemDeleteAction;
private ColumnViewerMoveUpAction itemMoveUpAction;
private ColumnViewerMoveDownAction itemMoveDownAction;
// private ColumnViewerPasteAction pasteAction;
private EPackage ePackage;
private EObject resoruceInfo;
private IKeyTableLocator locator;
private EStructuralFeature infoReference;
IMetadataService manager;
private String[] keys; //����
/**
* @param editingDomain
* @param resource
* @param problemPool
*/
public LinkDetailViewerBlock(
EditingDomain editingDomain,
IARESResource resource,
EObject resoruceInfo,
IProblemPool problemPool,
EPackage ePackage,
IKeyTableLocator locator) {
super();
this.editingDomain = editingDomain;
this.resource = resource;
this.problemPool = problemPool;
this.ePackage = ePackage;
this.resoruceInfo = resoruceInfo;
this.locator = locator;
manager = DataServiceManager.getInstance().getService(getARESResource().getARESProject(), IMetadataService.class);
}
/**
* @return the editingDomain
*/
public EditingDomain getEditingDomain() {
return editingDomain;
}
/**
* @return the resource
*/
public IARESResource getARESResource() {
return resource;
}
/**
* @return the problemPool
*/
public IProblemPool getProblemPool() {
return problemPool;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.ui.pages.ColumnViewerBlock#getID()
*/
@Override
protected String getID() {
return getClass().getName();
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.ui.pages.ColumnViewerBlock#getColumnViewerContentProvider()
*/
@Override
protected IContentProvider getColumnViewerContentProvider() {
return new ReferenceContentProvider(BasicDataEpackageUtil.getSlaveItemReference(ePackage));
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.ui.pages.ColumnViewerBlock#createActions()
*/
@Override
protected void createActions() {
super.createActions();
IAction action = itemAddAction = new AddLinkAction(editingDomain, getARESResource(),resoruceInfo, null);
getActionRegistry().registerAction(action);
getSelectionActions().add(action.getId());
insertAction = new ColumnViewerInsertAction(
getColumnViewer(),
getEditingDomain(),
null,
BasicDataEpackageUtil.getSlaveItemReference(ePackage),
(EClass)ePackage.getEClassifier(IBasicDataEpacakgeConstant.SlaveItem));
getActionRegistry().registerAction(insertAction);
getSelectionActions().add(insertAction.getId());
action = itemDeleteAction = new BaiscDataDeleteAction(getColumnViewer(),
getEditingDomain(),
null,
BasicDataEpackageUtil.getSlaveItemReference(ePackage));
getActionRegistry().registerAction(action);
getSelectionActions().add(action.getId());
action = itemMoveUpAction = new ColumnViewerMoveUpAction(
getColumnViewer(),
getEditingDomain(),
null,
BasicDataEpackageUtil.getSlaveItemReference(ePackage));
getActionRegistry().registerAction(action);
getSelectionActions().add(action.getId());
getStackActions().add(action.getId());
action = itemMoveDownAction = new ColumnViewerMoveDownAction(
getColumnViewer(),
getEditingDomain(),
null,
BasicDataEpackageUtil.getSlaveItemReference(ePackage));
getActionRegistry().registerAction(action);
getSelectionActions().add(action.getId());
getStackActions().add(action.getId());
IAction copyAction = new BaiscDataCopyAction(getColumnViewer(),getEditingDomain());
getActionRegistry().registerAction(copyAction);
getSelectionActions().add(copyAction.getId());
IAction copyCellAction = new CopyCellAction(getColumnViewer());
getActionRegistry().registerAction(copyCellAction);
IAction copyColumnAction = new CopyColumnAction(getColumnViewer());
getActionRegistry().registerAction(copyColumnAction);
IAction pasteAction = new BasicDataPasteAction(getColumnViewer(),
getEditingDomain(),
BasicDataEpackageUtil.getSlaveItemReference(ePackage),
(EClass)ePackage.getEClassifier(IBasicDataEpacakgeConstant.SlaveItem));
getActionRegistry().registerAction(pasteAction);
getSelectionActions().add(pasteAction.getId());
getEditableControl().addEditableUnit(new ActionEditableUnit(itemAddAction));
getEditableControl().addEditableUnit(new ActionEditableUnit(itemDeleteAction));
getEditableControl().addEditableUnit(new ActionEditableUnit(itemMoveUpAction));
getEditableControl().addEditableUnit(new ActionEditableUnit(itemMoveDownAction));
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.ui.pages.ColumnViewerBlock#setInput(java.lang.Object)
*/
@Override
public void setInput(Object input) {
insertAction.setOwner((EObject) input);
itemAddAction.setOwner((EObject) input);
itemMoveUpAction.setOwner((EObject) input);
itemMoveDownAction.setOwner((EObject) input);
itemDeleteAction.setOwner((EObject) input);
// pasteAction.setOwner((EObject) input);
// pasteAction.setReference(MetadataPackage.Literals.DICTIONARY_TYPE__ITEMS);
//��ʼ������
EReference reference = BasicDataEpackageUtil.getSlaveItemReference(ePackage);
List<?> tlist = (List<?>)((EObject)input).eGet(reference);
for(Object item:tlist){
EObject eItem = (EObject)item;
try {
EObject refer = locator.getLinkObject(eItem);
eItem.eSet(infoReference, refer);
} catch (Exception e) {
}
}
super.setInput(input);
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.ui.pages.ColumnViewerBlock#createMenus(org.eclipse.jface.action.IMenuManager)
*/
@Override
protected void createMenus(IMenuManager menuManager) {
IAction action = getActionRegistry().getAction(IActionIDConstant.CV_ADD);
menuManager.add(action);
action = getActionRegistry().getAction(IActionIDConstant.CV_DELETE);
menuManager.add(action);
menuManager.add(new Separator());
action = getActionRegistry().getAction(IActionIDConstant.CV_COPY);
menuManager.add(action);
action = getActionRegistry().getAction(CopyCellAction.ID);
menuManager.add(action);
action = getActionRegistry().getAction(CopyColumnAction.ID);
menuManager.add(action);
action = getActionRegistry().getAction(IActionIDConstant.CV_PASTE);
menuManager.add(action);
menuManager.add(new Separator());
action = getActionRegistry().getAction(IActionIDConstant.CV_MOVE_UP);
menuManager.add(action);
action = getActionRegistry().getAction(IActionIDConstant.CV_MOVE_DOWN);
menuManager.add(action);
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.ui.pages.ColumnViewerBlock#createColumns(org.eclipse.jface.viewers.ColumnViewer)
*/
@Override
protected void createColumns(TableViewer columnViewer) {
final TableViewer treeViewer = (TableViewer) columnViewer;
EObjectColumnViewerProblemView problemView = new EObjectColumnViewerProblemView(treeViewer);
EClass slaveEclass = (EClass)ePackage.getEClassifier(IBasicDataEpacakgeConstant.SlaveItem);
infoReference = slaveEclass.getEStructuralFeature(IBasicDataEpacakgeConstant.Attr_Info_Content_Reference);
EAttribute[] attrArray = BasicDataEpackageUtil.filterAttr(slaveEclass);//slaveEclass.getEAllAttributes().toArray(new EAttribute[0]);
//�����Ϣ����Ϣչʾ
EClass infoEclass = (EClass)ePackage.getEClassifier(IBasicDataEpacakgeConstant.InfoItem);
EAttribute[] infoAttrArray = BasicDataEpackageUtil.filterAttr(infoEclass);//infoEclass.getEAllAttributes().toArray(new EAttribute[0]);
keys = BasicDataEpackageUtil.getMasterKeyAnnotation(infoEclass); //����
//�ó�û����������������
List<String> keyList = new ArrayList<String>();
for(String item:keys){
keyList.add(item);
}
for(int i = 0;i < attrArray.length; i++){
// ����������
EAttribute attribute = attrArray[i];
// ���������
TableViewerColumn column = new TableViewerColumn(treeViewer, SWT.LEFT);
column.getColumn().setText(BasicDataEpackageUtil.getAttrColumnName(getARESResource(),attribute));
column.getColumn().setWidth(120);
column.getColumn().setMoveable(true);
// ���ñ�ǩ�ṩ��
EObjectColumnLabelProvider provider = new BasicDataColumnLabelProvider(attribute,resource);
provider.setDiagnosticProvider(problemView);
column.setLabelProvider(provider);
// ���ñ༭֧��
EMFEditingSupport es = null;
if(keyList.contains(attribute.getName())){
//��������
es = new BasicDataTextEditingSupportEX(treeViewer, new IEStructuralFeatureProvider.Impl(attribute),locator,infoReference);
}else{
//����������
BasicDataContentProposalProviderHelper helper = new BasicDataContentProposalProviderHelper();
BasicDataContentProposalProvider proposalProvider = new BasicDataContentProposalProvider(helper, attribute, resource);
es = getEditingSupport(treeViewer, new IEStructuralFeatureProvider.Impl(attribute), proposalProvider, attribute);
//new BasicDataTextEditingSupport(treeViewer, new IEStructuralFeatureProvider.Impl(attribute),proposalProvider);
}
es.setDecorator(new BaiscDataEditingSupportDecorator(attribute,getARESResource()));
column.setEditingSupport(es);
}
//��չ����
ExtensibleModelUtils.createExtensibleModelTableViewerColumns(columnViewer, resource, slaveEclass, problemView);
//���˵���������
List<EAttribute> infoAttrList = new ArrayList<EAttribute>();
for(EAttribute item:infoAttrArray){
if(!keyList.contains(item.getName())){
infoAttrList.add(item);
}
}
//��ӱ����
for(int i = 0;i < infoAttrList.size(); i++){
// ����������
EAttribute attribute = infoAttrList.get(i);
// ���������
TableViewerColumn column = new TableViewerColumn(treeViewer, SWT.LEFT);
column.getColumn().setText(BasicDataEpackageUtil.getAttrColumnName(getARESResource(),attribute));
column.getColumn().setWidth(120);
column.getColumn().setMoveable(true);
// ���ñ�ǩ�ṩ��
BaiscDataReferInfoColumnLabelProvider provider = new BaiscDataReferInfoColumnLabelProvider(infoReference,attribute);
column.setLabelProvider(provider);
}
//������Ϣ�����չ��
BasicdataExtensibleModelUtil.createRefExtensibleModelTableViewerColumns(columnViewer, resource, infoEclass, problemView, infoReference);
// getEditableControl().addEditableUnit(new JresDefaultEditableUnit(columnViewer.getControl()));
getProblemPool().addView(problemView);
}
private EMFEditingSupport getEditingSupport(ColumnViewer treeViewer ,IEStructuralFeatureProvider featureProvider,BasicDataContentProposalProvider proposalProvider ,EAttribute attrArray){
EMFEditingSupport es = null;
if(isDictCellEditor(proposalProvider)){
es = new BasicDataDictTextEditingSupport(treeViewer, featureProvider,proposalProvider);
}else if (isLongTextCellEditor(getColType(getARESResource(), attrArray))) {
es = new LongBasicDataTextEditingSupport(treeViewer, featureProvider,proposalProvider);
}else {
es = new BasicDataTextEditingSupport(treeViewer, featureProvider,proposalProvider);
}
return es;
}
/**
* �ж��Ƿ��ô��ı���
*
* @param type
* @return
*/
private boolean isLongTextCellEditor(String type){
if (StringUtils.indexOfIgnoreCase(type, "str") > 0) {
return true;
}else if (StringUtils.indexOfIgnoreCase(type, "String") > 0){
return true;
}else if (StringUtils.indexOfIgnoreCase(type, "clob") > 0){
return true;
}
return false;
}
/**
* ����ֶ���
* @param resoruce
* @param attribute
* @return
*/
private String getColType(IARESResource resoruce,EAttribute attribute){
String type = StringUtils.EMPTY;
if (attribute == null) {
return type;
}
if(attribute instanceof BasicDataEAttribute ){
BasicDataEAttribute basicDataEAttribute = (BasicDataEAttribute) attribute;
if(basicDataEAttribute.getData() !=null){
if(basicDataEAttribute.getData() instanceof BasicDataField){
BasicDataField basicDataField = (BasicDataField) basicDataEAttribute.getData();
if(basicDataField.getColumnType() == 0){//���ֶ�ʱ
IStandardField stdField = manager.getStandardField(attribute.getName());
if (stdField != null) {
IBusinessDataType bizType = stdField.getDataType();
if (bizType != null) {
IStandardDataType stdType = bizType.getStdType();
if (stdType != null) {
type = stdType.getName();
}
}
}
}else{//�DZ��ֶ�ʱ
IBusinessDataType bizType = manager.getBusinessDataType(basicDataField.getDataType());
if (bizType != null) {
IStandardDataType stdType = bizType.getStdType();
if (stdType != null) {
type = stdType.getName();
}
}
}
}
}
}
return type;
}
/**
* �Ƿ������ֵ�༭
* @param proposalProvider
* @return
*/
private boolean isDictCellEditor(BasicDataContentProposalProvider proposalProvider){
if(proposalProvider.getAttribute() != null && proposalProvider.getResource() != null){
if(BasicDataEpackageUtil.isStandardField(proposalProvider.getAttribute())){
StandardField stdField = JRESResProviderUtil.getMetadataModel(proposalProvider.getResource().getARESProject(), proposalProvider.getAttribute().getName(),IMetadataRefType.StdField , StandardField.class);
if(null != stdField && StringUtils.isNotBlank(stdField.getDictionaryType())){
DeDictionaryType dicType = MetadataUtil.decrypt(stdField, proposalProvider.getResource()).getDictionaryType();
proposalProvider.setInput(dicType.getItems().toArray());
return true;
}
}
}
return false;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.ui.pages.ColumnViewerBlock#createButtons(com.hundsun.ares.studio.jres.ui.actions.ButtonGroupManager)
*/
@Override
protected void createToolbarItems(ToolBarManager manager) {
//������ϸ��IJ����б�
IAction action = getActionRegistry().getAction(IActionIDConstant.CV_ADD);
manager.add(action);
action = getActionRegistry().getAction(IActionIDConstant.CV_DELETE);
manager.add(action);
action = getActionRegistry().getAction(IActionIDConstant.CV_MOVE_UP);
manager.add(action);
action = getActionRegistry().getAction(IActionIDConstant.CV_MOVE_DOWN);
manager.add(action);
}
}