/**
* <p>Copyright: Copyright 2010</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.ui.grid.table;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.operations.AbstractOperation;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.EditingSupport;
import org.eclipse.nebula.jface.gridviewer.GridViewerColumn;
import org.eclipse.nebula.widgets.grid.GridColumn;
import com.hundsun.ares.studio.core.model.extendable.IExtendFieldModel;
import com.hundsun.ares.studio.core.util.ArrayUtil;
import com.hundsun.ares.studio.ui.celleditor.ISprecialCellEditor;
import com.hundsun.ares.studio.ui.editor.AbstractHSFormEditor;
import com.hundsun.ares.studio.ui.util.ListOperation;
import com.hundsun.ares.studio.ui.util.ReflectInvokeHelper;
/**
* ��һ��Ϊ�ؼ��ṩ�༭���� setValue �� getValue��Ĭ��ʵ��
* @author maxh
*
* @param <T>
*/
public abstract class GridTableViewerEditorableComponent<T> extends GridTableViewerBasicComponent<T> {
public GridTableAddItemOperation add(List items,int startIndex){
if(items.size() > 0){
GridTableAddItemOperation add = new GridTableAddItemOperation("add",this,items,startIndex);
if(undoContext != null){
add.addContext(undoContext);
}
try {
AbstractHSFormEditor.getOperationHistory().execute(add, null, null);
} catch (Exception e) {
e.printStackTrace();
}
return add;
}
return null;
}
public void commit(GridTableChangeValueOperation change) {
List list = new ArrayList();
list.add(lastLine);
GridTableAddItemOperation add = add(list,getInput().size());
if(change != null && add != null){
List<AbstractOperation> operations = new ArrayList<AbstractOperation>();
operations.add(change);
operations.add(add);
ListOperation operationList = new ListOperation("list",operations);
if(undoContext != null) {
operationList.addContext(undoContext);
}
operationList.replace();
}
lastLine = createBlankData();
dirty.setValue(true);
viewer.refresh();
}
/* (non-Javadoc)
* @see com.hundsun.ares.devtool.v2.ui.grid.GridViewerExComponent#createColumn(java.lang.String, org.eclipse.nebula.widgets.grid.GridColumn)
* ������
*/
@Override
protected GridViewerColumn createColumn(String property,GridColumn column) {
GridViewerColumn viewercolumn = new GridViewerColumn(viewer, column);
viewercolumn.setEditingSupport(new DelegateEditingSupport(property));
viewercolumn.setLabelProvider(new DelegateCellLabelProvider(property));
checkCache.put(property, new HashMap<Object, Integer>());
checkStatus.put(property, false);
return viewercolumn;
}
/**
* ���ָ����Ԫ���ֵ������CellEditor
*
* @param data
* @param property
* @return
*/
public Object getValue(T data, String property){
if(ArrayUtil.findInArray(viewerPropertys, property) != -1){
//���������չ�� Ĭ��ʹ�÷��䷽ʽ
ReflectInvokeHelper helper;
try {
helper = new ReflectInvokeHelper(data,property);
Object object = helper.invokeGetMothod();
return object == null?"":object.toString();
} catch (Exception e) {
e.printStackTrace();
}
}else{
//�û���չ��
if(data instanceof IExtendFieldModel){
Object result = ((IExtendFieldModel)data).getExtendStrings().get(property);
return result == null?"":result;
}
}
return null;
}
/**
* ��CellEditor��ֵ���ûص�Ԫ��
*
* @param data
* @param property
* @param value
*/
public void setValue(T data, String property, Object value, boolean shouldRefresh){
ReflectInvokeHelper helper;
if(!getValue(data,property).equals(value) ){
dirty.setValue(true);
}
if(ArrayUtil.findInArray(viewerPropertys, property) != -1){
//���������չ�� Ĭ��ʹ�÷��䷽ʽ
try {
helper = new ReflectInvokeHelper(data,property);
helper.invokeSetMothod(value);
} catch (Exception e) {
e.printStackTrace();
}
}else{
//�û���չ��
if(data instanceof IExtendFieldModel){
((IExtendFieldModel)data).getExtendStrings().put(property, value.toString());
}
}
if(shouldRefresh){
getViewer().refresh(data);
}
}
private class DelegateEditingSupport extends EditingSupport {
private String property;
public DelegateEditingSupport(String property) {
super(GridTableViewerEditorableComponent.this.viewer);
this.property = property;
}
@Override
protected boolean canEdit(Object element) {
return !readOnly && GridTableViewerEditorableComponent.this.canEdit((T) element, property);
}
@Override
protected CellEditor getCellEditor(Object element) {
return GridTableViewerEditorableComponent.this.getCellEditor(element, property);
}
@Override
protected Object getValue(Object element) {
Object value = GridTableViewerEditorableComponent.this.getValue((T) element, property);
if(getCellEditor(element) instanceof ISprecialCellEditor){
ISprecialCellEditor editor = (ISprecialCellEditor)getCellEditor(element);
value = editor.getRealGetValue(value);
}
return value;
}
@Override
protected void setValue(Object element, Object value) {
Object oldValue = getValue(element);
if(!oldValue.equals(value)){
if(getCellEditor(element) instanceof ISprecialCellEditor){
ISprecialCellEditor editor = (ISprecialCellEditor)getCellEditor(element);
value = editor.getRealSetValue(value);
}
GridTableChangeValueOperation operation = new GridTableChangeValueOperation("change",GridTableViewerEditorableComponent.this,element,property,value);
if(undoContext != null){
operation.addContext(undoContext);
}
try {
AbstractHSFormEditor.getOperationHistory().execute(operation, null, null);
} catch (ExecutionException e) {
e.printStackTrace();
}
// ���ڶ����һ�н��в���
if (element == lastLine) {
Object newValue = getValue(element);
if ((oldValue == null && value != null && !value.toString().equals("")) || (!oldValue.equals(value) && !newValue.equals(oldValue))) {
commit(operation);
} else {
return;
}
}
}
}
}
}