/**
* Դ�������ƣ�ExtensibleModelEditingSupport.java
* �������Ȩ���������ӹɷ�����˾ ��Ȩ����
* ϵͳ���ƣ�JRES Studio
* ģ�����ƣ�com.hundsun.ares.studio.jres.ui
* ����˵����$desc
* ����ĵ���
* ���ߣ���Ҷ��
*/
package com.hundsun.ares.studio.ui.editor.extend;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.eclipse.core.runtime.Assert;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.common.util.EMap;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.command.SetCommand;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.swt.widgets.Composite;
import com.hundsun.ares.studio.core.model.CorePackage;
import com.hundsun.ares.studio.core.model.ExtensibleModel;
import com.hundsun.ares.studio.core.model.util.PutCommand;
import com.hundsun.ares.studio.ui.editor.editingsupport.EMFEditingSupport;
/**
* @author gongyf
*
*/
public class ExtensibleModelEditingSupport extends EMFEditingSupport {
IExtensibleModelEditingSupport editingSupport;
IExtensibleModelPropertyDescriptor descriptor;
/**
* @param viewer
* @param editingSupport
* @param descriptor
*/
public ExtensibleModelEditingSupport(ColumnViewer viewer,
IExtensibleModelEditingSupport editingSupport,
IExtensibleModelPropertyDescriptor descriptor) {
super(viewer, descriptor.getStructuralFeature());
this.editingSupport = editingSupport;
this.descriptor = descriptor;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.ui.editingsupports.EMFEditingSupport#getOwner(java.lang.Object)
*/
@Override
protected EObject getOwner(Object element) {
ExtensibleModel model = (ExtensibleModel) element;
return model.getData2().get(editingSupport.getKey());
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.ui.editingsupports.EMFEditingSupport#getValue(java.lang.Object)
*/
@Override
protected Object getValue(Object element) {
Object value = ObjectUtils.defaultIfNull(super.getValue(element), descriptor.getStructuralFeature().getDefaultValue());
// ֧��map���͵���չ
if (descriptor instanceof IMapExtensibleModelPropertyDescriptor) {
Assert.isTrue(value instanceof EMap<?, ?>);
value = ((EMap<?, ?>) value).get(((IMapExtensibleModelPropertyDescriptor) descriptor).getKey());
}
return ObjectUtils.defaultIfNull(value, StringUtils.EMPTY);
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.ui.editingsupports.BaseEditingSupport#createCellEditor()
*/
@Override
protected CellEditor createCellEditor() {
return descriptor.createPropertyEditor((Composite) getViewer().getControl());
}
@Override
protected CellEditor doGetCellEditor(Object element) {
CellEditor cellEditor = super.doGetCellEditor(element);
if (cellEditor instanceof IExtensibleModelCellEditor) {
((IExtensibleModelCellEditor) cellEditor).setModel((ExtensibleModel) element);
}
return cellEditor;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.jres.ui.editingsupports.EMFEditingSupport#setValue(java.lang.Object, java.lang.Object)
*/
@Override
protected void setValue(Object element, Object value) {
// ���û���ĵı�Ҫ��ֱ�ӷ���
Object oldValue = getValue(element);
if (ObjectUtils.equals(oldValue, value)) {
return;
}
ExtensibleModel model = (ExtensibleModel) element;
EStructuralFeature feature = descriptor.getStructuralFeature();
String key = editingSupport.getKey();
CompoundCommand command = new CompoundCommand();
EditingDomain editingDomain = AdapterFactoryEditingDomain.getEditingDomainFor(model);
EObject owner = model.getData2().get(key);
if (owner == null) {
// û�л����Ķ���,��Ҫ����
owner = editingSupport.createMapValueObject();
if (editingDomain == null) {
model.getData2().put(key, owner);
} else {
command.append(new PutCommand(model, CorePackage.Literals.EXTENSIBLE_MODEL__DATA2, key, owner));
}
}
if (editingDomain != null) {
if (descriptor instanceof IMapExtensibleModelPropertyDescriptor) {
Assert.isTrue(feature instanceof EReference);
command.append(new PutCommand(owner, (EReference)feature, ((IMapExtensibleModelPropertyDescriptor) descriptor).getKey(), value));
} else {
command.append(SetCommand.create(editingDomain, owner, feature, value));
}
editingDomain.getCommandStack().execute(command.unwrap());
} else {
if (descriptor instanceof IMapExtensibleModelPropertyDescriptor) {
Object map = owner.eGet(feature);
Assert.isTrue(map instanceof EMap<?, ?>);
((EMap<Object, Object>)map).put(((IMapExtensibleModelPropertyDescriptor) descriptor).getKey(), value);
} else {
owner.eSet(feature, value);
}
}
// ���ʹ��RefreshViewerJob���ӳ���ʾ��ȷ����
getViewer().update(element, null);
}
}