/**
* <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.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.nebula.jface.gridviewer.GridTableViewer;
import org.eclipse.nebula.widgets.grid.Grid;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import com.hundsun.ares.studio.ui.celleditor.ISprecialCellEditor;
import com.hundsun.ares.studio.ui.grid.GridViewerExComponent;
import com.hundsun.ares.studio.ui.util.HSColorManager;
/**
* �����ı��༭�� ��һ���ṩ��LabelProvider��ContentProvider ������һЩ��չ����صIJ���
*
* @author maxh
*
* @param <T>
*/
public abstract class GridTableViewerBasicComponent<T> extends GridViewerExComponent<T> {
/** ָ�������Ƿ���ҪΨһ�Լ�� */
protected HashMap<String, Boolean> checkStatus = new HashMap<String, Boolean>();
/** ָ���е��ظ���� */
protected HashMap<String, HashMap<Object, Integer>> checkCache = new HashMap<String, HashMap<Object, Integer>>();
/** ���������ı�� */
protected FilteredGridTable tbComposite = null;
/** Ԥ���༭�Ķ��� */
protected T lastLine = createBlankData();
/** ��ǰ�ؼ��ı����� */
protected GridTableViewer viewer = null;
private boolean addOnlyOne = false;
/**
* �ж�ָ����Ԫ���Ƿ��ܱ༭
*
* @param data
* @param property
* @return
*/
protected abstract boolean canEdit(T data, String property);
/**
* �½�һ���հ�����
*
* @return
*/
protected abstract T createBlankData();
public T createNewObject() {
return createBlankData();
}
protected FilteredGridTable createFilteredTable(Composite client, int style) {
FilteredGridTable table = new FilteredGridTable(client, style, new HSGridTableFilter(), this);
return table;
}
/**
* ȡ������ı���ɫ,��������ĺ�ɫ����������趨
*
* @param element
* @param property
* @return
*/
protected Color getBackground(Object data, String property) {
return null;
}
public HashMap<String, HashMap<Object, Integer>> getCheckCache() {
return checkCache;
}
protected Color getForeground(Object data) {
return null;
}
@Override
protected Grid getGrid() {
return viewer.getGrid();
}
/**
* ��õ�Ԫ���ض���ͼ��
*
* @param data
* @param property
* @return
*/
protected Image getImage(T data, String property) {
return null;
}
/**
* ��ȡ��ǰ��������в������Ϸ�������Ϣ�б�
*/
protected List<T> getInvalidRows() {
List<T> invalidRows = new ArrayList<T>();
Iterator<T> rows = input.iterator();
while (rows.hasNext()) {
T row = rows.next();
boolean isValid = GridTableViewerBasicComponent.this.isValidData(row);
if (!isValid) {
invalidRows.add(row);
}
}
return invalidRows;
}
/**
* @return the lastLine
*/
public T getLastLine() {
return lastLine;
}
public GridTableViewer getTableViewer() {
return viewer;
}
/**
* ��õ�Ԫ�����ʾ�ı���Ĭ��ʵ����GetValue��toString
*
* @param data
* @param property
* @return
*/
protected String getText(T data, String property) {
Object value = getValue(data, property);
if (value != null) {
return value.toString();
}
return "";
}
/**
* �õ�toolTip��Ԫ�����ɫ
*
* @return
*/
public Color getToolTipColor() {
return null;
}
/**
* �õ��õ�Ԫ��toolTip����,���Է���null
*
* @param element
* @param property
* @return
*/
public String getToolTipText(T element, String property) {
return null;
}
abstract public Object getValue(T data, String property);
// /**
// * �õ��õ�Ԫ��toolTip����(��������ɫ��Ϣ)
// * <br>ͬһ��Ԫ��,���getToolTipTextҲ������, �����ݿ��ܱ�����
// *
// * @param element
// * @param property
// * @return
// */
// public ErrorMessage getToolTipTextBackground(Object element, String
// property) {
// return null;
// }
//
// /**
// * �õ��õ�Ԫ��toolTip����(����ǰ��ɫ��Ϣ)
// * <br>
// * @param element
// * @param property
// * @param isBackGroundAble ��ʾ�Ƿ��ڵ�ǰ����Ϊ�յ�ʱ�� ��������ɫ(ֵΪ��ʱ, ǰ��ɫ������ʾ��)
// * @return
// */
// public ErrorMessage getToolTipTextForeground(Object element, String
// property) {
// // TODO Auto-generated method stub
// return null;
// }
public GridTableViewer getViewer() {
return this.viewer;
}
protected void initComposite(Composite client) {
tbComposite = createFilteredTable(client, getStyle());
tbComposite.setLayoutData(getCompositeLayoutData());
viewer = tbComposite.getViewer();
initViewer(viewer);
viewer.setContentProvider(new TableViewerContentProvider());
viewer.setRowHeaderLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell viewerCell) {
updateRowHeader(viewerCell);
}
});
viewer.setInput(input);
}
/**
* @return the addOnlyOne
*/
public boolean isAddOnlyOne() {
return addOnlyOne;
}
final protected boolean isLastLine(T data) {
return data == lastLine;
}
/**
* ������֤<BR>
* ���ش�����Ϣ������null��������
*
* @param data
* @param property
* @return
*/
protected String isValid(T data, String property) {
return null;
}
/**
* ������֤<BR>
* �����Ƿ�ͨ����֤������true�������ݺϷ�
*
* @param data
* @return
*/
protected boolean isValidData(T data) {
return true;
}
/**
* ֻ�����һ����¼�������Զ�����
*
* @param addOnlyOne
* the addOnlyOne to set
*/
public void setAddOnlyOne(boolean addOnlyOne) {
this.addOnlyOne = addOnlyOne;
this.useAutoGrow = false;
}
/**
* ���ñ�����Ƿ����Ψһ�Լ��<BR>
* Ψһ�Ե��ж�������GetValue�������ص�Object��equals���
*
* @param property
* @param docheck
*/
final protected void setUniqueCheck(String property, boolean docheck) {
boolean isCheck = checkStatus.get(property);
if (isCheck != docheck) {
checkStatus.put(property, docheck);
viewer.getGrid().setRedraw(false);
viewer.refresh();
viewer.getGrid().setRedraw(true);
}
}
protected void updateRowHeader(ViewerCell viewerCell) {
}
protected class DelegateCellLabelProvider extends ColumnLabelProvider {
protected String property;
private boolean isBackground = true;
/** �����Ӧ�еĴ�����Ϣ */
private Map<Object, String> errMsgMap = new HashMap<Object, String>();
public DelegateCellLabelProvider(String property) {
super();
this.property = property;
}
@Override
public Color getBackground(Object element) {
if (element != lastLine) {
// �ⲿ�ּ��ؼ����Ƿ����ظ�
String errMessage = GridTableViewerBasicComponent.this.isValid((T) element, property);
errMsgMap.put(element, errMessage);
if (checkStatus.get(property)) {
Integer times = checkCache.get(property).get(getValue((T) element, property));
if (times != null && times > 1) {
errMessage = "�������ظ�����";
errMsgMap.put(element, errMessage);
return colorManager.getColor(HSColorManager.RED);
}
}
if (errMessage != null) {
return colorManager.getColor(HSColorManager.RED);
}
// �ⲿ�ּ���Ƿ��д���
errMessage = GridTableViewerBasicComponent.this.isValid((T) element, property);
errMsgMap.put(element, errMessage);
if (errMessage != null) {
return colorManager.getColor(HSColorManager.RED);
}
}
return GridTableViewerBasicComponent.this.getBackground(element, property);
}
@Override
public Image getImage(Object element) {
if (GridTableViewerBasicComponent.this.getCellEditor(element, property) instanceof ISprecialCellEditor) {
ISprecialCellEditor cellEditor = (ISprecialCellEditor) GridTableViewerBasicComponent.this
.getCellEditor(element, property);
return cellEditor.getImage(GridTableViewerBasicComponent.this.getValue((T) element, property));
}
return GridTableViewerBasicComponent.this.getImage((T) element, property);
}
@Override
public String getText(Object element) {
if (GridTableViewerBasicComponent.this.getCellEditor(element, property) instanceof ISprecialCellEditor) {
ISprecialCellEditor cellEditor = (ISprecialCellEditor) GridTableViewerBasicComponent.this
.getCellEditor(element, property);
return cellEditor.getText(GridTableViewerBasicComponent.this.getValue((T) element, property));
}
return GridTableViewerBasicComponent.this.getText((T) element, property);
}
@Override
public int getToolTipDisplayDelayTime(Object object) {
return 300;
}
@Override
public Point getToolTipShift(Object object) {
return new Point(5, 5);
}
@Override
public String getToolTipText(Object element) {
if (errMsgMap.get(element) != null) {
return errMsgMap.get(element);
}
if (GridTableViewerBasicComponent.this.getToolTipText((T) element, property) != null) {
return GridTableViewerBasicComponent.this.getToolTipText((T) element, property);
}
if (getText(element) == null || getText(element).length() < 40) {
return null;
}
StringBuffer buffer = new StringBuffer(getText(element));
int lenght = buffer.length();
int i = 39;
while (i < lenght) {
buffer.insert(i, '\n');
i += 40;
}
return buffer.toString();
}
@Override
public int getToolTipTimeDisplayed(Object object) {
return -1;
}
/**
* @return the isBackground
*/
public boolean isBackground() {
return isBackground;
}
/**
* @param isBackground
* the isBackground to set
*/
public void setBackground(boolean isBackground) {
this.isBackground = isBackground;
}
}
/**
* �ṩ�ṩ��
*
* @author gongyf
*
*/
private class TableViewerContentProvider implements IStructuredContentProvider {
public void dispose() {
}
/**
* ��ʾһ���հ���
*/
public Object[] getElements(Object inputElement) {
// �����
for (String property : checkCache.keySet()) {
checkCache.put(property, new HashMap<Object, Integer>());
}
for (T obj : input) {
for (String property : checkCache.keySet()) {
Map<Object, Integer> objCount = checkCache.get(property);
Object value = getValue(obj, property);
if (objCount.containsKey(value)) {
objCount.put(value, objCount.get(value) + 1);
} else {
objCount.put(value, 1);
}
}
}
List<T> all = new ArrayList<T>();
all.addAll(input);
// �����Ĭ����
if (useAutoGrow && !readOnly) {
all.add(lastLine);
}
if (addOnlyOne && input.size() < 1) {
all.add(lastLine);
}
return all.toArray();// input.toArray();
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
public void refresh() {
if (viewer != null) {
viewer.refresh();
}
}
}