/**
* <p>Copyright: Copyright (c) 2009</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.ui.editor.extend.user;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.eclipse.emf.common.command.AbstractCommand;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.common.util.EMap;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.change.util.ChangeRecorder;
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.ArrayContentProvider;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.jface.viewers.ComboBoxViewerCellEditor;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import com.hundsun.ares.studio.core.IARESProject;
import com.hundsun.ares.studio.core.excel.handler.EMFPropertyHandler;
import com.hundsun.ares.studio.core.excel.handler.IPropertyHandler;
import com.hundsun.ares.studio.core.model.Constants;
import com.hundsun.ares.studio.core.model.CoreFactory;
import com.hundsun.ares.studio.core.model.CorePackage;
import com.hundsun.ares.studio.core.model.ExtensibleModel;
import com.hundsun.ares.studio.core.model.extend.UserExtendedPropertyUtils;
import com.hundsun.ares.studio.core.model.extendable.ExtensibleModelUtil;
import com.hundsun.ares.studio.core.model.util.PutCommand;
import com.hundsun.ares.studio.model.reference.ReferenceInfo;
import com.hundsun.ares.studio.reference.ReferenceManager;
import com.hundsun.ares.studio.ui.editor.extend.AbstractMapEMPropertyDescriptor;
/**
* �������͵��û���չ����
* @author sundl
*/
public class ReferenceUserExtendedPropertyDescriptor extends AbstractMapEMPropertyDescriptor implements IUserExtendedPropertyDescriptor{
private static final Logger LOGGER = Logger.getLogger(ReferenceUserExtendedPropertyDescriptor.class);
private IARESProject project;
private String refIdFeature;
private String targetRefType;
private String targetFeature;
private String targetDisplayPattern;
/**
* @param project
* @param key �û����Ե�KEY
* @param refIdFeature �����Ϊ�գ���ʾ��ǰԪ���е�ij������ֵ��ΪIDȥ�������ã�Ϊ�յ�����±�ʾ���Dz��Ҷ�������ѡ��
* @param targetRefType Ҫ���õ�refType����
* @param targetFeature Ҫ���õ�Ŀ�������ĸ�����
* @param targetDisplayPattern refIdFeatureΪ�յ�����£�����Ŀ�������ĸ�����(��ʱֻ֧�ֵ������ԣ��������Կ���֧�ֶ����ģʽ)
*/
public ReferenceUserExtendedPropertyDescriptor(IARESProject project, String key, String refIdFeature, String targetRefType, String targetFeature, String targetDisplayPattern) {
super(CorePackage.Literals.USER_EXTENSIBLE_PROPERTY__MAP, key, Constants.USER_DATA2_KEY);
this.project = project;
this.refIdFeature = refIdFeature;
this.targetRefType = targetRefType;
this.targetFeature = targetFeature;
this.targetDisplayPattern = targetDisplayPattern;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.ui.editor.extend.IExtensibleModelPropertyDescriptor#getLabelProvider()
*/
@Override
public ILabelProvider getLabelProvider() {
return new LabelProvider() {
@Override
public String getText(Object element) {
if (element instanceof ExtensibleModel) {
ExtensibleModel model = (ExtensibleModel) element;
String value = getValue(model);
if (StringUtils.isEmpty(value))
return StringUtils.EMPTY;
ReferenceManager manager = ReferenceManager.getInstance();
List<ReferenceInfo> refrences = manager.getReferenceInfos(project, targetRefType, true);
for (ReferenceInfo ref : refrences) {
Object obj = ref.getObject();
if (obj instanceof ExtensibleModel) {
ExtensibleModel targetModel = (ExtensibleModel) obj;
String v = getProperty(targetModel, targetFeature);
if (StringUtils.equals(v, value)) {
return getProperty(targetModel, targetDisplayPattern);
}
}
}
}
return super.getText(element);
}
};
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.ui.editor.extend.IExtensibleModelPropertyDescriptor#createPropertyEditor(org.eclipse.swt.widgets.Composite)
*/
@Override
public CellEditor createPropertyEditor(Composite parent) {
if (refIdFeature == null) {
ReferenceManager manager = ReferenceManager.getInstance();
List<ReferenceInfo> refrences = manager.getReferenceInfos(project, targetRefType, true);
List<Object> input = new ArrayList<Object>();
input.add(StringUtils.EMPTY);
for (ReferenceInfo ref : refrences) {
Object obj = ref.getObject();
if (obj instanceof ExtensibleModel) {
ExtensibleModel model = (ExtensibleModel) obj;
input.add(model);
}
}
UserExtendedPropertyComboCellEditor editor = new UserExtendedPropertyComboCellEditor(parent, SWT.READ_ONLY);
editor.setContenProvider(new ArrayContentProvider());
editor.setLabelProvider(new ReferenceUserCellEditorLabelProvider());
editor.setInput(input.toArray());
return editor;
}
return null;
}
private class UserExtendedPropertyComboCellEditor extends ComboBoxViewerCellEditor{
public UserExtendedPropertyComboCellEditor(Composite parent, int style) {
super(parent, style);
}
@Override
protected Object doGetValue() {
Object value = super.doGetValue();
if (value instanceof ExtensibleModel) {
ExtensibleModel model = (ExtensibleModel) value;
IPropertyHandler handler = EMFPropertyHandler.getPropertyHandler(model.eClass(), targetFeature, project);
if (handler != null) {
value = handler.getValue(model);
}
}
return value == null ? StringUtils.EMPTY : value;
}
@Override
protected void doSetValue(Object value) {
if (value == null || StringUtils.isEmpty(String.valueOf(value))) {
super.doSetValue(value);
return;
}
Object[] items = (Object[]) getViewer().getInput();
for (Object object : items) {
if (object instanceof ExtensibleModel) {
ExtensibleModel model = (ExtensibleModel) object;
IPropertyHandler handler = EMFPropertyHandler.getPropertyHandler(model.eClass(), targetFeature, project);
if (handler != null) {
String v = handler.getValue(model);
if (StringUtils.equals(v, String.valueOf(value))) {
super.doSetValue(object);
return;
}
}
}
}
super.doSetValue(value);
}
}
private class ReferenceUserCellEditorLabelProvider extends LabelProvider {
@Override
public String getText(Object element) {
if (element instanceof ExtensibleModel) {
return getProperty(element, targetDisplayPattern);
}
return super.getText(element);
}
}
private String getProperty(Object object, String property) {
if (object instanceof ExtensibleModel) {
ExtensibleModel model = (ExtensibleModel) object;
IPropertyHandler handler = EMFPropertyHandler.getPropertyHandler(model.eClass(), property, project);
if (handler != null) {
return handler.getValue(model);
}
}
return null;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.core.model.extend.IBasicExtendPropertyDescriptor#getValue(com.hundsun.ares.studio.core.model.ExtensibleModel)
*/
@Override
public String getValue(ExtensibleModel model) {
if (refIdFeature == null) {
return UserExtendedPropertyUtils.getUserExtendedProperty(model, (String) getKey());
} else {
ReferenceManager manager = ReferenceManager.getInstance();
EClass srcEClass = model.eClass();
// TODO�� �˴�����PropertyHandler�������ַ����ķ�ʽͳһָ��ij�����ԣ����ڴ˿��ǣ�����PropertyHandler���ƿ��Խ�һ�����ϲ���ȡ����Ϊ����ͨ�õĹ���
IPropertyHandler handler = EMFPropertyHandler.getPropertyHandler(srcEClass, refIdFeature, project);
if (handler != null) {
String id = handler.getValue(model);
if (StringUtils.isNotEmpty(id)) {
ReferenceInfo refTarget = manager.getFirstReferenceInfo(project, targetRefType, id, true);
if (refTarget == null) {
return StringUtils.EMPTY;
}
Object target = refTarget.getObject();
if (target instanceof ExtensibleModel) {
ExtensibleModel targetModel = (ExtensibleModel) target;
EClass targetEClass = targetModel.eClass();
IPropertyHandler targetHandler = EMFPropertyHandler.getPropertyHandler(targetEClass, targetFeature, project);
if (targetHandler != null) {
return targetHandler.getValue(targetModel);
}
}
}
}
}
return StringUtils.EMPTY;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.core.model.extend.IBasicExtendPropertyDescriptor#setValue(com.hundsun.ares.studio.core.model.ExtensibleModel, java.lang.String)
*/
@Override
public void setValue(ExtensibleModel model, String value) {
EditingDomain editingDomain = AdapterFactoryEditingDomain.getEditingDomainFor(model);
// refIdFeature��Ϊ�մ������ֻ������
if (refIdFeature == null) {
if (editingDomain == null) { // editingDomainһ������²���Ϊ��
ExtensibleModelUtil.setUserExtendedProperty(model, (String) getKey(), value);
} else {
UserPropertyEditSetCommand command = new UserPropertyEditSetCommand(model, (String) getKey(), value);
editingDomain.getCommandStack().execute(command);
}
}
}
private static class UserPropertyEditSetCommand extends ChangeCommand {
private ExtensibleModel model;
private String key;
private String value;
/**
* @param changeRecorder
* @param model
* @param key
* @param value
*/
public UserPropertyEditSetCommand(ExtensibleModel model, String key, String value) {
super(model);
this.model = model;
this.key = key;
this.value = value;
}
/* (non-Javadoc)
* @see org.eclipse.emf.edit.command.ChangeCommand#doExecute()
*/
@Override
protected void doExecute() {
ExtensibleModelUtil.setUserExtendedProperty(model, key, value);
}
@Override
public Collection<?> getAffectedObjects() {
Collection<Object> result = new ArrayList<Object>();
result.add(model);
return result;
}
}
}