// ============================================================================
//
// Copyright (C) 2006-2012 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.designer.core.ui.editor.properties.controllers;
import java.beans.PropertyChangeEvent;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
import org.talend.core.model.process.IElementParameter;
import org.talend.core.properties.tab.IDynamicProperty;
/**
* DOC hcyi class global comment. Detailled comment
*/
public class TreeTableController extends AbstractElementPropertySectionController {
/**
*
*/
private static final int MIN_NUMBER_ROWS = 10;
/**
* DOC hcyi TreeTableController constructor comment.
*
* @param dp
*/
public TreeTableController(IDynamicProperty dp) {
super(dp);
}
/*
* (non-Javadoc)
*
* @see
* org.talend.designer.core.ui.editor.properties.controllers.AbstractElementPropertySectionController#createControl
* (org.eclipse.swt.widgets.Composite, org.talend.core.model.process.IElementParameter, int, int, int,
* org.eclipse.swt.widgets.Control)
*/
@Override
public Control createControl(final Composite parentComposite, final IElementParameter param, final int numInRow,
final int nbInRow, int top, final Control lastControlPrm) {
this.curParameter = param;
this.paramFieldType = param.getFieldType();
final Composite container = parentComposite;
final TreeViewer viewer = new TreeViewer(container, SWT.FULL_SELECTION | SWT.BORDER);
viewer.getTree().setHeaderVisible(true);
// key column
TreeColumn column = new TreeColumn(viewer.getTree(), SWT.LEFT);
column.setText("Key");
column.setWidth(150);
// columns for values
if (param.getValue() != null) {
List<Map<String, Object>> values = (List<Map<String, Object>>) param.getValue();
for (int i = 0; i < values.size(); i++) {
column = new TreeColumn(viewer.getTree(), SWT.LEFT);
column.setText("Value" + i);
column.setWidth(100);
}
}
viewer.setContentProvider(new MyTreeContentProvider(param));
viewer.setLabelProvider(new MyTableLableProvider(param));
viewer.setInput(param);
CLabel labelLabel2 = getWidgetFactory().createCLabel(container, param.getDisplayName());
FormData formData = new FormData();
if (lastControlPrm != null) {
formData.left = new FormAttachment(lastControlPrm, 0);
} else {
formData.left = new FormAttachment((((numInRow - 1) * MAX_PERCENT) / nbInRow), 0);
}
formData.top = new FormAttachment(0, top);
labelLabel2.setLayoutData(formData);
if (numInRow != 1) {
labelLabel2.setAlignment(SWT.RIGHT);
}
// *********************
formData = new FormData();
int currentLabelWidth2 = STANDARD_LABEL_WIDTH;
GC gc2 = new GC(labelLabel2);
Point labelSize2 = gc2.stringExtent(param.getDisplayName());
gc2.dispose();
boolean needOffset = true;
if ((labelSize2.x + ITabbedPropertyConstants.HSPACE) > currentLabelWidth2) {
currentLabelWidth2 = labelSize2.x + ITabbedPropertyConstants.HSPACE;
needOffset = false;
}
int tableHorizontalOffset = -5;
if (numInRow == 1) {
if (lastControlPrm != null) {
if (needOffset) {
formData.left = new FormAttachment(lastControlPrm, currentLabelWidth2 + tableHorizontalOffset);
} else {
formData.left = new FormAttachment(lastControlPrm, currentLabelWidth2);
}
} else {
if (needOffset) {
formData.left = new FormAttachment(0, currentLabelWidth2 + tableHorizontalOffset);
} else {
formData.left = new FormAttachment(0, currentLabelWidth2);
}
}
} else {
formData.left = new FormAttachment(labelLabel2, 0 + tableHorizontalOffset, SWT.RIGHT);
}
formData.right = new FormAttachment((numInRow * MAX_PERCENT) / nbInRow, 0);
formData.top = new FormAttachment(0, top);
int toolbarSize = 0;
if (!param.isBasedOnSchema()) {
Point size = viewer.getTree().computeSize(SWT.DEFAULT, SWT.DEFAULT);
toolbarSize = size.y - 95;
}
int currentHeightEditor = viewer.getTree().getHeaderHeight() + param.getListItemsValue().length
* viewer.getTree().getItemHeight() + viewer.getTree().getItemHeight() + toolbarSize;
int minHeightEditor = viewer.getTree().getHeaderHeight() + getNumberLines(param) * viewer.getTree().getItemHeight()
+ viewer.getTree().getItemHeight() + toolbarSize;
int ySize2 = Math.max(currentHeightEditor, minHeightEditor);
formData.bottom = new FormAttachment(0, top + ySize2);
viewer.getTree().setLayoutData(formData);
this.dynamicProperty.setCurRowSize(ySize2 + ITabbedPropertyConstants.VSPACE);
top += this.dynamicProperty.getCurRowSize();
return null;
}
/*
* (non-Javadoc)
*
* @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent arg0) {
}
@Override
public void refresh(IElementParameter param, boolean check) {
}
/*
* (non-Javadoc)
*
* @see
* org.talend.designer.core.ui.editor.properties.controllers.AbstractElementPropertySectionController#estimateRowSize
* (org.eclipse.swt.widgets.Composite, org.talend.core.model.process.IElementParameter)
*/
@Override
public int estimateRowSize(Composite subComposite, IElementParameter param) {
return 0;
}
private int getNumberLines(IElementParameter param) {
int numlines = param.getNbLines();
return numlines < MIN_NUMBER_ROWS ? MIN_NUMBER_ROWS : numlines;
}
/**
*
* DOC hcyi TreeTableController class global comment. Detailled comment
*/
class MyTreeContentProvider implements ITreeContentProvider {
final IElementParameter param;
public MyTreeContentProvider(final IElementParameter param) {
this.param = param;
}
public Object[] getChildren(Object parentElement) {
final int length = param.getListItemsValue().length;
if (parentElement instanceof IElementParameter && length > 0) {
// from 1 to length
Object[] children = Arrays
.copyOfRange(param.getListItemsValue(), 1, length, param.getListItemsValue().getClass());
return children;
} else {
return null;
}
}
public Object getParent(Object element) {
return null;
}
public boolean hasChildren(Object element) {
return param.getListItemsValue().length > 0 && param.getListItemsValue()[0] == element;
}
public Object[] getElements(Object inputElement) {
// only the first parameter as root
return new Object[] { ((IElementParameter) param).getListItemsValue()[0] };
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
/**
*
* DOC hcyi TreeTableController class global comment. Detailled comment
*/
class MyTableLableProvider implements ITableLabelProvider {
final IElementParameter param;
public MyTableLableProvider(final IElementParameter param) {
this.param = param;
}
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
public String getColumnText(Object element, int columnIndex) {
if (element instanceof IElementParameter) {
IElementParameter testParam = (IElementParameter) element;
if (columnIndex == 0) {
return testParam.getValue().toString();
}
List<Map<String, Object>> values = (List<Map<String, Object>>) param.getValue();
Map<String, Object> line = null;
if (values.size() > columnIndex) {
line = values.get(columnIndex);
}
if (line != null) {
Object object = line.get(testParam.getName());
return object != null ? object.toString() : "";
}
}
return null;
}
public void addListener(ILabelProviderListener listener) {
}
public void dispose() {
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
}
}
}