/**
* <p>Copyright: Copyright (c) 2013</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.jres.metadata.ui.viewer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.command.AddCommand;
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.IARESElement;
import com.hundsun.ares.studio.core.IARESModule;
import com.hundsun.ares.studio.core.model.CorePackage;
import com.hundsun.ares.studio.core.model.util.PutCommand;
import com.hundsun.ares.studio.core.registry.ModuleRootType2ResTypeMap;
import com.hundsun.ares.studio.jres.model.metadata.IDRangeItem;
import com.hundsun.ares.studio.jres.model.metadata.IDRangeList;
import com.hundsun.ares.studio.jres.model.metadata.MetadataFactory;
import com.hundsun.ares.studio.jres.model.metadata.MetadataPackage;
import com.hundsun.ares.studio.ui.editor.editingsupport.EMFEditingSupport;
import com.hundsun.ares.studio.ui.editor.extend.IExtensibleModelEditingSupport;
import com.hundsun.ares.studio.ui.editor.extend.IExtensibleModelPropertyDescriptor;
/**
* @author wangxh
*
*/
public class IDExtentEditingSupport extends EMFEditingSupport {
IExtensibleModelEditingSupport editingSupport;
IExtensibleModelPropertyDescriptor descriptor;
IDRangeList info;
/**
* @param viewer
* @param editingSupport
* @param descriptor
*/
public IDExtentEditingSupport(ColumnViewer viewer,
IExtensibleModelEditingSupport editingSupport,
IExtensibleModelPropertyDescriptor descriptor,
IDRangeList info) {
super(viewer, descriptor.getStructuralFeature());
this.editingSupport = editingSupport;
this.descriptor = descriptor;
this.info = info;
}
@Override
protected EObject getOwner(Object element) {
IDRangeItem item = getIDRangeItem(element);
if(item != null){
return item.getData2().get(editingSupport.getKey());
}
return null;
}
private IDRangeItem getIDRangeItem(Object element){
if(element instanceof IARESElement){
String path = ((IARESElement)element).getResource().getProjectRelativePath().toPortableString();
for(IDRangeItem item : info.getItems()){
if(StringUtils.equals(item.getName(), path)){
return item;
}
}
}
return null;
}
@Override
protected boolean doCanEdit(Object element) {
EditingDomain editingDomain = AdapterFactoryEditingDomain.getEditingDomainFor(info);
if(editingDomain != null && editingDomain.isReadOnly(info.eResource())){
return false;
}
//������һ��Ĭ��Լ����nameΪ��Դ��������ɣ�����Զ��Ÿ���
String[] types = StringUtils.split(editingSupport.getName(), ",");
if(element instanceof IARESModule){
String type = ((IARESModule)element).getRoot().getType();
for(String resType : types){
String[] rootTypes = ModuleRootType2ResTypeMap.getInstance().getAllowedRootTypes(resType);
for(String rootType : rootTypes){
if(StringUtils.equals(type, rootType)){
return true;
}
}
}
}
return false;
}
@Override
protected Object getValue(Object element) {
Object value = ObjectUtils.defaultIfNull(super.getValue(element), descriptor.getStructuralFeature().getDefaultValue());
return ObjectUtils.defaultIfNull(value, StringUtils.EMPTY);
}
@Override
protected CellEditor createCellEditor() {
return descriptor.createPropertyEditor((Composite) getViewer().getControl());
}
private String getRealRange(String value){
if(StringUtils.isBlank(value)){
return descriptor.getStructuralFeature().getDefaultValueLiteral();
}
String range = "";
Pattern pattern = Pattern.compile("^[0-9]+-[0-9]+$");
String[] tmps = StringUtils.split(value, ",");
for(int index=0; index<tmps.length; index++){
try {
String tmp = tmps[index];
Matcher matcher = pattern.matcher(tmp);
if(matcher.matches()){
if(index > 0){
range += ",";
}
String[] ranges = StringUtils.split(tmp, "-");
int min = Integer.parseInt(ranges[0]);
int max = Integer.parseInt(ranges[1]);
range +=(min + "-" + max);
}else{
return null;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return range;
}
@Override
protected void setValue(Object element, Object val) {
String value = getRealRange(val.toString());
if(value == null){
return;
}
// ���û���ĵı�Ҫ��ֱ�ӷ���
Object oldValue = getValue(element);
if (ObjectUtils.equals(oldValue, value)) {
return;
}
IDRangeItem model = getIDRangeItem(element);
EStructuralFeature feature = descriptor.getStructuralFeature();
String key = editingSupport.getKey();
CompoundCommand command = new CompoundCommand();
EditingDomain editingDomain = AdapterFactoryEditingDomain.getEditingDomainFor(info);
if(model == null){
model = MetadataFactory.eINSTANCE.createIDRangeItem();
model.setName(((IARESElement)element).getResource().getProjectRelativePath().toPortableString());
EObject data2 = editingSupport.createMapValueObject();
data2.eSet(feature, value);
model.getData2().put(key, data2);
if (editingDomain != null) {
command.append(new AddCommand(editingDomain, info, MetadataPackage.Literals.METADATA_RESOURCE_DATA__ITEMS, model));
}else{
info.getItems().add(model);
}
}else{
EObject data2 = model.getData2().get(key);
if(data2 == null){
data2 = editingSupport.createMapValueObject();
data2.eSet(feature, value);
if(editingDomain != null){
command.append(new PutCommand(model, CorePackage.Literals.EXTENSIBLE_MODEL__DATA2, key, data2));
}else{
model.getData2().put(key, data2);
}
}else{
if(editingDomain != null){
command.append(new SetCommand(editingDomain, data2, feature, value));
}else{
data2.eSet(feature, value);
}
}
}
if(editingDomain != null){
editingDomain.getCommandStack().execute(command.unwrap());
}
// ���ʹ��RefreshViewerJob���ӳ���ʾ��ȷ����
getViewer().update(element, null);
}
}