/**
* Դ�������ƣ�EMFMapEditingSupport.java
* �������Ȩ���������ӹɷ�����˾ ��Ȩ����
* ϵͳ���ƣ�JRES Studio
* ģ�����ƣ�com.hundsun.ares.studio.jres.ui
* ����˵����JRES Studio�Ľ���չ�ֻ�����ܺͱ༭��ع���
* ����ĵ���
* ���ߣ�
*/
package com.hundsun.ares.studio.ui.editor.editingsupport;
import org.apache.commons.lang.ObjectUtils;
import org.eclipse.emf.common.util.EMap;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.edit.command.ChangeCommand;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.viewers.ColumnViewer;
public abstract class EMFMapEditingSupport extends BaseEditingSupport {
protected EReference reference;
protected Object key;
public EMFMapEditingSupport(ColumnViewer viewer, EReference reference,
Object key) {
super(viewer);
this.reference = reference;
this.key = key;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.EditingSupport#canEdit(java.lang.Object)
*/
@Override
protected boolean doCanEdit(Object element) {
return getMap(element) != null && super.doCanEdit(element);
}
/**
* ��ȡ��Ҫ������EObject
* @param element
* @return
*/
protected EObject getOwner(Object element) {
return (EObject) element;
}
protected EMap getMap(Object element) {
EObject owner = getOwner(element);
if (owner != null) {
if (owner.eClass().getEAllReferences().contains(reference)) {
Object obj = getOwner(element).eGet(reference);
if (obj instanceof EMap) {
return (EMap) obj;
}
}
}
return null;
}
@Override
protected Object getValue(Object element) {
EMap map = getMap(element);
if (map != null) {
return map.get(key);
}
return null;
}
@Override
protected void setValue(final Object element, final Object value) {
Object oldValue = getValue(element);
if (ObjectUtils.equals(oldValue, value)) {
return;
}
EditingDomain editingDomain = AdapterFactoryEditingDomain.getEditingDomainFor(element);
if (editingDomain != null) {
ChangeCommand command = new ChangeCommand(getOwner(element)) {
@Override
protected void doExecute() {
getMap(element).put(key, value);
}
};
editingDomain.getCommandStack().execute(command);
} else {
getMap(element).put(key, value);
}
// ���ʹ��RefreshViewerJob���ӳ���ʾ��ȷ����
getViewer().update(element, null);
}
}