/** * Դ�������ƣ�PropertyValueEditingSupport.java * �������Ȩ���������ӹɷ����޹�˾ ��Ȩ���� * ϵͳ���ƣ�JRES Studio * ģ�����ƣ�com.hundsun.ares.studio.jres.ui * ����˵����$desc * ����ĵ��� * ���ߣ���Ҷ�� */ package com.hundsun.ares.studio.ui.editor.extend; import java.util.HashMap; import java.util.Map; 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.jface.viewers.EditingSupport; import org.eclipse.swt.widgets.Composite; import com.hundsun.ares.studio.core.model.CorePackage; import com.hundsun.ares.studio.core.model.util.Pair; import com.hundsun.ares.studio.core.model.util.PutCommand; import com.hundsun.ares.studio.ui.editor.extend.user.IUserExtendedPropertyDescriptor; /** * @author gongyf * */ public class PropertyValueEditingSupport extends EditingSupport { private Map<Object, CellEditor> cellEditorMap = new HashMap<Object, CellEditor>(); /** * @param viewer */ public PropertyValueEditingSupport(ColumnViewer viewer) { super(viewer); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.EditingSupport#getCellEditor(java.lang.Object) */ @Override protected CellEditor getCellEditor(Object element) { if (element instanceof ExtensibleModelEditingEntry) { ExtensibleModelEditingEntry entry = (ExtensibleModelEditingEntry) element; // ��Ҫ�ظ����� IExtensibleModelPropertyDescriptor descriptor = entry.getDescriptor(); String key = entry.getGroup().getEditingSupport().getKey(); // ����key��֪���᲻�������� Object cellEditorKey = new Pair<String, IExtensibleModelPropertyDescriptor>(key, descriptor); CellEditor cellEditor = cellEditorMap.get(cellEditorKey); if (cellEditor == null) { cellEditor = entry.getDescriptor().createPropertyEditor((Composite) getViewer().getControl()); if (cellEditor != null) { cellEditorMap.put(cellEditorKey, cellEditor); } } if (cellEditor instanceof IExtensibleModelCellEditor) { ((IExtensibleModelCellEditor) cellEditor).setModel(entry.getGroup().getRoot().getModel()); } return cellEditor; } return null; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.EditingSupport#canEdit(java.lang.Object) */ @Override protected boolean canEdit(Object element) { if (element instanceof ExtensibleModelEditingEntry) { return getViewer().getControl().isEnabled(); } return false; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.EditingSupport#getValue(java.lang.Object) */ @Override protected Object getValue(Object element) { Object value = null; ExtensibleModelEditingEntry entry = (ExtensibleModelEditingEntry) element; IExtensibleModelPropertyDescriptor descriptor = entry.getDescriptor(); if (descriptor instanceof IUserExtendedPropertyDescriptor) { value = ((IUserExtendedPropertyDescriptor) descriptor).getValue(entry.getGroup().getRoot().getModel()); } else { EStructuralFeature feature = descriptor.getStructuralFeature(); String key = entry.getGroup().getEditingSupport().getKey(); EObject owner = entry.getGroup().getRoot().getModel().getData2().get(key); if (owner != null) { value = owner.eGet(feature); // ֧��map���͵���չ if (descriptor instanceof IMapExtensibleModelPropertyDescriptor) { Assert.isTrue(value instanceof EMap<?, ?>); value = ((EMap<?, ?>) value).get(((IMapExtensibleModelPropertyDescriptor) descriptor).getKey()); } } } //feature.getDefaultValue() return ObjectUtils.defaultIfNull(value, StringUtils.EMPTY); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.EditingSupport#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; } ExtensibleModelEditingEntry entry = (ExtensibleModelEditingEntry) element; IExtensibleModelPropertyDescriptor descriptor = entry.getDescriptor(); if (descriptor instanceof IUserExtendedPropertyDescriptor) { ((IUserExtendedPropertyDescriptor) descriptor).setValue(entry.getGroup().getRoot().getModel(), String.valueOf(value)); } else { EStructuralFeature feature = descriptor.getStructuralFeature(); String key = entry.getGroup().getEditingSupport().getKey(); CompoundCommand command = new CompoundCommand(); EditingDomain editingDomain = AdapterFactoryEditingDomain.getEditingDomainFor(entry.getGroup().getRoot().getModel()); EObject owner = entry.getGroup().getRoot().getModel().getData2().get(key); if (owner == null) { // û�л����Ķ���,��Ҫ���� owner = entry.getGroup().getEditingSupport().createMapValueObject(); if (editingDomain == null) { entry.getGroup().getRoot().getModel().getData2().put(key, owner); } else { command.append(new PutCommand(entry.getGroup().getRoot().getModel(), CorePackage.Literals.EXTENSIBLE_MODEL__DATA2, key, owner)); } } // command.append(SetCommand.create(editingDomain, owner, feature, value)); 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); } }