/**
* <p>Copyright: Copyright 2010</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.ui.grid.tree;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.nebula.jface.gridviewer.GridTreeViewer;
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.core.util.StringUtil;
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 GridTreeViewerBasicComponent<T> extends GridViewerExComponent<T> {
protected GridTreeViewer viewer = null;
/** ��������������ͼ */
protected GridFilteredTree filteredTree;
/** ��һ��ĸ��ӱ༭�� */
protected T lastLine = (T)createBlankData(null);
/** ���ڵ�����еĹ���map */
protected HashMap<Object, Object> childrenLastLine = new HashMap<Object, Object>();
/** ���ڵ�ͺ��ӽڵ�Ĺ���map */
protected HashMap<Object, List<Object>> childrenMap = new HashMap<Object, List<Object>>();
/**
* �ж�ָ����Ԫ���Ƿ��ܱ༭
*
* @param data ����ģ��
* @param property ����
* @return
*/
protected abstract boolean canEdit(Object data, String property);
/**
* �½�һ���հ�����
*
* @param parent ���ڵĸ��ڵ㣬null��ʱ�����Ϊ�����
* @return
*/
protected abstract Object createBlankData(Object parent);
/**
* ȡ������ı���ɫ,��������ĺ�ɫ����������趨
*
* @param element
* @param property
* @return
*/
protected Color getBackground(Object element, String property) {
return null;
}
/**
* ȡ�ú��ӽڵ��б�<BR>
*
* <B>ע�⣺��ͼ�ϵIJ�����ֱ�ӷ�Ӧ�����List�ϵģ����Ա������ݵ�ʱ���������ListΪ</B><BR>
*
* @param parentElement
* @return null ��ʾ�ýڵ㲻���к��ӽڵ�
*/
protected abstract List getChildren(Object parentElement);
public HashMap<Object, Object> getChildrenLastLine() {
return childrenLastLine;
}
public HashMap<Object, List<Object>> getChildrenMap() {
return childrenMap;
}
@Override
protected Grid getGrid() {
return viewer.getGrid();
}
/**
* ��õ�Ԫ���ض���ͼ��
*
* @param data
* @param property
* @return
*/
protected Image getImage(Object data, String property) {
return null;
}
/**
* ��ø����еĸ��ڵ�
*
* @param element
* @return
*/
final protected Object getLastLineParent(Object element) {
if (element == lastLine) {
return null;
}
for (Object parent : childrenLastLine.keySet()) {
if (childrenLastLine.get(parent) == element) {
return parent;
}
}
return null;
}
/**
* ��ó��˸�����������еĸ��ڵ㣬�����Ļ�����null
* @param element
* @return
*/
protected Object getParent(Object element) {
// ֱ����map�в�ѯ
for (Object parent : childrenMap.keySet()) {
if (childrenMap.get(parent).indexOf(element) != -1) {
return parent;
}
}
return null;
}
/**
* ���ڹ�����
*
* @return
*/
protected PatternFilter getPatternFilter() {
return new TreePatternFilter();
}
/**
* ��õ�Ԫ�����ʾ�ı���Ĭ��ʵ����GetValue��toString
*
* @param data
* @param property
* @return
*/
protected String getText(Object data, String property) {
Object value = getValue(data, property);
if (value != null) {
return value.toString();
}
return "";
}
/**
* �õ��õ�Ԫ��toolTip����,���Է���null
*
* @param element
* @param property
* @return
*/
public String getToolTipText(Object element, String property) {
return null;
}
public GridTreeViewer getTreeViewer() {
return viewer;
}
/**
* ���ָ����Ԫ���ֵ������CellEditor
*
* @param data ����ģ��
* @param property ����
* @return
*/
public abstract Object getValue(Object data, String property);
public GridTreeViewer getViewer() {
return viewer;
}
protected void initComposite(Composite client) {
filteredTree = new GridFilteredTree(client, getStyle(), getPatternFilter(),this);
filteredTree.setLayoutData(getCompositeLayoutData());
viewer = filteredTree.getViewer();
initViewer(viewer);
viewer.setContentProvider(new TreeViewerContentProvider());
viewer.setInput(input);
}
/**
* �ж��Ƿ��Ǹ�����
* @param obj
* @return
*/
final protected boolean isLastLine(Object obj) {
return obj == lastLine || childrenLastLine.containsValue(obj);
}
/**
* ������֤<BR>
* ���ش�����Ϣ������null��������
*
* @param data
* @param property
* @return
*/
protected String isValid(Object data, String property) {
return null;
}
// public String isRequired(Object element, String property) {
// return null;
// }
/**
* ��CellEditor��ֵ���ûص�Ԫ���Ƿ�Ӧ�ñ����ˢ�»��ڻ�������ɣ�������������ж�
*
* @param data ����ģ��
* @param property ����
* @param value ���õ�ֵ
*/
public abstract void setValue(Object data, String property, Object value);
protected class DelegateCellLabelProvider extends ColumnLabelProvider {
protected String property;
/** �����Ӧ�еĴ�����Ϣ */
private Map<Object, String> errMsgMap = new HashMap<Object, String>();
public DelegateCellLabelProvider(String property) {
super();
this.property = property;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getBackground(java.lang.Object)
*/
@Override
public Color getBackground(Object element) {
if (!isLastLine(element)) {
String errMessage = GridTreeViewerBasicComponent.this.isValid(element, property);
errMsgMap.put(element, errMessage);
if (errMessage != null) {
return colorManager.getColor(HSColorManager.RED);
}
// String requiredMessage = GridTreeViewerBasicComponent.this.isRequired(element, property);
// if(requiredMessage!=null)
// {
// errMsgMap.put(element, requiredMessage);
// return colorManager.getColor(HSColorManager.GREEN);
// }
}
return GridTreeViewerBasicComponent.this.getBackground(element, property);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getForeground(java.lang.Object)
*/
@Override
public Color getForeground(Object element) {
if (!isLastLine(element)) {
String errMessage = GridTreeViewerBasicComponent.this.isValidForeground(element, property);
errMsgMap.put(element, errMessage);
if (errMessage != null) {
return colorManager.getColor(HSColorManager.RED);
}
// String requiredMessage = GridTreeViewerBasicComponent.this.isRequired(element, property);
// if(requiredMessage!=null)
// {
// errMsgMap.put(element, requiredMessage);
// return colorManager.getColor(HSColorManager.GREEN);
// }
}
return GridTreeViewerBasicComponent.this.getForeground(element, property);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getImage(java.lang.Object)
*/
@Override
public Image getImage(Object element) {
if(GridTreeViewerBasicComponent.this.getCellEditor(element, property) instanceof ISprecialCellEditor){
ISprecialCellEditor cellEditor = (ISprecialCellEditor)GridTreeViewerBasicComponent.this.getCellEditor(element, property);
return cellEditor.getImage(GridTreeViewerBasicComponent.this.getValue(element,property));
}
return GridTreeViewerBasicComponent.this.getImage(element, property);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ColumnLabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(Object element) {
if(GridTreeViewerBasicComponent.this.getCellEditor(element, property) instanceof ISprecialCellEditor){
ISprecialCellEditor cellEditor = (ISprecialCellEditor)GridTreeViewerBasicComponent.this.getCellEditor(element, property);
return cellEditor.getText(GridTreeViewerBasicComponent.this.getValue(element,property));
}
return GridTreeViewerBasicComponent.this.getText(element, property);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.CellLabelProvider#getToolTipDisplayDelayTime(java.lang.Object)
*/
@Override
public int getToolTipDisplayDelayTime(Object object) {
return 300;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.CellLabelProvider#getToolTipShift(java.lang.Object)
*/
@Override
public Point getToolTipShift(Object object) {
return new Point(5, 5);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.CellLabelProvider#getToolTipText(java.lang.Object)
*/
@Override
public String getToolTipText(Object element) {
if(errMsgMap.get(element) != null && !StringUtil.isEmpty(errMsgMap.get(element))){
return errMsgMap.get(element);
}
return GridTreeViewerBasicComponent.this.getToolTipText(element,property);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.CellLabelProvider#getToolTipTimeDisplayed(java.lang.Object)
*/
@Override
public int getToolTipTimeDisplayed(Object object) {
return -1;
}
}
private class TreePatternFilter extends PatternFilter {
/* (non-Javadoc)
* @see org.eclipse.ui.dialogs.PatternFilter#isElementVisible(org.eclipse.jface.viewers.Viewer, java.lang.Object)
*/
@Override
public boolean isElementVisible(Viewer viewer, Object element) {
// ��������ɸѡ״̬�²���ʾ
if (isLastLine(element)) {
return false;
}
return super.isElementVisible(viewer, element);
}
protected boolean isLeafMatch(Viewer viewer, Object element) {
for (String property : columnMap.keySet()) {
String label = GridTreeViewerBasicComponent.this.getText(element, property);
if (label != null && wordMatches(label)) {
return true;
}
}
return false;
}
}
/**
* �����ṩ��
* <br>ע�� jdk6��jdk5��@override���岻һ��
* @author gongyf
*
*/
public class TreeViewerContentProvider implements ITreeContentProvider {
public void dispose() {
}
public Object[] getChildren(Object parentElement) {
List<Object> children = GridTreeViewerBasicComponent.this.getChildren(parentElement);
// ɸѡ״̬�¿��ܻ���null
if (children == null) {
return new Object[0];
}
childrenMap.put(parentElement, children);
if (useAutoGrow && !readOnly) {
List<Object> lstShowChildren = new ArrayList<Object>();
lstShowChildren.addAll(children);
Object thisLastLine = childrenLastLine.get(parentElement);
if (thisLastLine == null) {
// ��һ����Ҫ����һ��
thisLastLine = createBlankData(parentElement);
childrenLastLine.put(parentElement, thisLastLine);
}
lstShowChildren.add(thisLastLine);
return lstShowChildren.toArray();
}
return children.toArray();
}
public Object[] getElements(Object inputElement) {
// ��ĩ�м�¼���
//lastLines.clear();
List<Object> objs = new ArrayList<Object>();
// �ȼ�������
objs.addAll((List)inputElement);
// ������ĩ��
if (useAutoGrow && !readOnly && lastLine != null) {
objs.add(lastLine);
}
return objs.toArray();
}
public Object getParent(Object element) {
return GridTreeViewerBasicComponent.this.getParent(element);
}
public boolean hasChildren(Object element) {
// ���ӱ༭��û�к��ӽڵ�
if (isLastLine(element)) {
return false;
}
return GridTreeViewerBasicComponent.this.getChildren(element) != null;
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
public void refresh() {
if(viewer != null && !viewer.getControl().isDisposed()){
viewer.refresh();
}
}
/**
* ȡ�������ǰ��ɫ,��������ĺ�ɫ����������趨
*
* @param element
* @param property
* @return
*/
public Color getForeground(Object element, String property) {
return null;
}
/**
* @param element
* @param property
* @return
*/
public String isValidForeground(Object element, String property) {
return null;
}
}