// ============================================================================
//
// 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.macrowidgets.tableeditor;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.eclipse.gef.commands.Command;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.talend.commons.ui.swt.advanced.dataeditor.ExtendedToolbarView;
import org.talend.commons.ui.swt.advanced.dataeditor.button.AddAllPushButton;
import org.talend.commons.ui.swt.advanced.dataeditor.button.AddAllPushButtonForExtendedTable;
import org.talend.commons.ui.swt.advanced.dataeditor.button.AddPushButton;
import org.talend.commons.ui.swt.advanced.dataeditor.button.AddPushButtonForExtendedTable;
import org.talend.commons.ui.swt.advanced.dataeditor.button.ExportPushButton;
import org.talend.commons.ui.swt.advanced.dataeditor.button.ImportPushButton;
import org.talend.commons.ui.swt.advanced.dataeditor.button.PastePushButton;
import org.talend.commons.ui.swt.advanced.dataeditor.button.PastePushButtonForExtendedTable;
import org.talend.commons.ui.swt.advanced.dataeditor.button.RemovePushButton;
import org.talend.commons.ui.swt.advanced.dataeditor.button.RemovePushButtonForExtendedTable;
import org.talend.commons.ui.swt.extended.table.AbstractExtendedTableViewer;
import org.talend.commons.ui.swt.extended.table.ExtendedTableModel;
import org.talend.core.model.metadata.IMetadataColumn;
import org.talend.core.model.metadata.IMetadataTable;
import org.talend.core.model.process.EParameterFieldType;
import org.talend.core.model.process.IElement;
import org.talend.core.model.process.IElementParameter;
import org.talend.core.model.process.INode;
import org.talend.designer.core.ui.editor.cmd.PropertyTablePasteCommand;
import org.talend.designer.core.ui.editor.nodes.Node;
import org.talend.designer.core.ui.editor.properties.controllers.TableController;
import org.talend.designer.core.ui.editor.properties.macrowidgets.tableeditor.PromptDefaultValueDialog.ColumnInfo;
/**
* $Id$
*
*/
public class PropertiesTableToolbarEditorView extends ExtendedToolbarView {
private PropertiesTableEditorModel model;
/**
* DOC amaumont MetadataToolbarEditorView constructor comment.
*
* @param parent
* @param style
* @param extendedTableViewer
*/
public PropertiesTableToolbarEditorView(Composite parent, int style, AbstractExtendedTableViewer extendedTableViewer,
PropertiesTableEditorModel model) {
super(parent, style, extendedTableViewer);
this.model = model;
}
/*
* (non-Javadoc)
*
* @see org.talend.core.ui.extended.ExtendedToolbarView#createComponents(org.eclipse.swt.widgets.Composite)
*/
@Override
protected void createComponents(Composite parent) {
super.createComponents(parent);
}
/*
* (non-Javadoc)
*
* @see org.talend.core.ui.extended.ExtendedToolbarView#createAddPushButton()
*/
@Override
protected AddPushButton createAddPushButton() {
return new AddPushButtonForExtendedTable(this.toolbar, getExtendedTableViewer()) {
@Override
public boolean getEnabledState() {
return super.getEnabledState() && (model == null || !model.getElemParameter().isBasedOnSubjobStarts());
}
@Override
protected Object getObjectToAdd() {
PropertiesTableEditorModel tableEditorModel = (PropertiesTableEditorModel) getExtendedTableViewer()
.getExtendedControlModel();
if (!tableEditorModel.isButtonEnabled()) {
MessageDialog.openInformation(tableEditorModel.getTableViewer().getControl().getShell(), "Information",
"All output columns have been added already");
return null;
}
Object newEntry = tableEditorModel.createNewEntry();
if (tableEditorModel.isAggregateRow() && newEntry instanceof Map) {
List<ColumnInfo> tableInputs = new ArrayList<ColumnInfo>();
String[] displayNames = tableEditorModel.getElemParameter().getListItemsDisplayName();
Object[] itemsValue = tableEditorModel.getElemParameter().getListItemsValue();
String paramColumnsName = "COLUMN";// default name //$NON-NLS-1$
for (int i = 0; i < itemsValue.length; i++) {
if (itemsValue[i] instanceof IElementParameter) {
IElementParameter tableParameter = (IElementParameter) itemsValue[i];
if (tableParameter.getFieldType().equals(EParameterFieldType.COLUMN_LIST)) {
paramColumnsName = tableParameter.getName();
} else {
ColumnInfo row = new ColumnInfo();
row.name = displayNames[i];
row.parameter = tableParameter;
row.defaultValue = "";
tableInputs.add(row);
}
}
}
Node node = (Node) tableEditorModel.getElement();
String outputTableName = null;
if (node.getMetadataList() != null && !node.getMetadataList().isEmpty()) {
IMetadataTable metadata = node.getMetadataList().get(0);
if (metadata.getListColumns() != null) {
for (IMetadataColumn column : metadata.getListColumns()) {
if (!tableEditorModel.exist(column.getLabel())) {
outputTableName = column.getLabel();
break;
}
}
}
}
if (outputTableName != null) {
Map mapObject = (Map) newEntry;
if (mapObject.containsKey(paramColumnsName)) {
mapObject.put(paramColumnsName, outputTableName);
}
for (ColumnInfo col : tableInputs) {
Object defaultValue = col.defaultValue;
Object found = findDefaultName(outputTableName, col);
if (found != null && !"".equals(found)) {
defaultValue = found;
}
if (defaultValue != null && !"".equals(defaultValue)) {
mapObject.put(col.parameter.getName(), defaultValue);
}
}
}
}
return newEntry;
}
};
}
/*
* (non-Javadoc)
*
* @see org.talend.commons.ui.swt.advanced.dataeditor.ExtendedToolbarView#createAddAllPushButton()
*/
@Override
protected AddAllPushButton createAddAllPushButton() {
final PropertiesTableEditorModel tableEditorModel = (PropertiesTableEditorModel) getExtendedTableViewer()
.getExtendedControlModel();
if (!TableController.isNeedAddAllButton(tableEditorModel.getElemParameter())) {
return null;
}
return new AddAllPushButtonForExtendedTable(this.toolbar, getExtendedTableViewer()) {
@Override
public boolean getEnabledState() {
return super.getEnabledState() && (model == null || !model.getElemParameter().isBasedOnSubjobStarts());
}
@Override
protected List<Object> getObjectToAdd() {
if (!tableEditorModel.isButtonEnabled()) {
MessageDialog.openInformation(tableEditorModel.getTableViewer().getControl().getShell(), "Information",
"All output columns have been added already");
return new ArrayList<Object>();
}
IElement element = tableEditorModel.getElement();
if (element != null && element instanceof INode) {
IElementParameter param = tableEditorModel.getElemParameter();
// diplay a dialog for setting default values. see 0005416: When click Add All in a table, add the
// possibility to setup the default parameters value.
List<ColumnInfo> tableInputs = promptForDefaultValue(tableEditorModel.getTableViewer().getControl()
.getShell(), param);
if (tableInputs == null) {
return new ArrayList<Object>();
}
String paramColumnsName = "COLUMN";// default name //$NON-NLS-1$
String paramSizeName = "SIZE"; // default name //$NON-NLS-1$
for (Object object : param.getListItemsValue()) {
if (object instanceof IElementParameter) {
IElementParameter tableParameter = (IElementParameter) object;
if (tableParameter.getFieldType().equals(EParameterFieldType.COLUMN_LIST)) {
paramColumnsName = tableParameter.getName();
}
if (tableParameter.getContext() != null && tableParameter.getContext().equals("LENGTH")) { //$NON-NLS-1$
paramSizeName = tableParameter.getName();
}
}
}
INode node = (INode) element;
if (node.getMetadataList() != null && !node.getMetadataList().isEmpty()) {
IMetadataTable metadata = node.getMetadataList().get(0);
if (metadata.getListColumns() != null && !metadata.getListColumns().isEmpty()) {
List<Object> objects = new ArrayList<Object>();
for (IMetadataColumn column : metadata.getListColumns()) {
if (tableEditorModel.exist(column.getLabel())) {
continue;
}
Object entry = tableEditorModel.createNewEntry();
if (!(entry instanceof Map)) {
continue;
}
Map mapObject = (Map) entry;
if (mapObject.containsKey(paramColumnsName)) {
mapObject.put(paramColumnsName, column.getLabel());
}
if (mapObject.containsKey(paramSizeName)) {
if (column.getLength() != null) {
mapObject.put(paramSizeName, Integer.toString(column.getLength()));
}
}
// set default values
for (ColumnInfo col : tableInputs) {
Object defaultValue = col.defaultValue;
Object found = findDefaultName(column.getLabel(), col);
if (found != null && !"".equals(found)) {
defaultValue = found;
}
mapObject.put(col.parameter.getName(), defaultValue);
}
objects.add(entry);
}
return objects;
}
}
}
return Collections.EMPTY_LIST;
}
private List<ColumnInfo> promptForDefaultValue(Shell shell, IElementParameter param) {
List<ColumnInfo> tableInputs = new ArrayList<ColumnInfo>();
Object[] listItemsValue = param.getListItemsValue();
String[] displayNames = param.getListItemsDisplayName();
for (int i = 0; i < listItemsValue.length; i++) {
if (listItemsValue[i] instanceof IElementParameter) {
IElementParameter colParam = (IElementParameter) listItemsValue[i];
if (colParam.getFieldType().equals(EParameterFieldType.COLUMN_LIST)) {
continue;
}
ColumnInfo row = new ColumnInfo();
row.name = displayNames[i];
row.parameter = colParam;
tableInputs.add(row);
}
}
PromptDefaultValueDialog dialog = new PromptDefaultValueDialog(shell, tableInputs);
if (dialog.open() == Window.OK) {
return tableInputs;
} else {
return null;
}
}
};
}
/*
* (non-Javadoc)
*
* @see org.talend.core.ui.extended.ExtendedToolbarView#createPastButton()
*/
@Override
public PastePushButton createPastePushButton() {
return new PastePushButtonForExtendedTable(toolbar, extendedTableViewer) {
@Override
public boolean getEnabledState() {
return super.getEnabledState() && (model == null || !model.getElemParameter().isBasedOnSubjobStarts());
}
@Override
protected Command getCommandToExecute(ExtendedTableModel extendedTableModel, Integer indexWhereInsert) {
return new PropertyTablePasteCommand<Map<String, Object>>(extendedTableModel, indexWhereInsert);
}
};
}
/*
* (non-Javadoc)
*
* @see org.talend.core.ui.extended.ExtendedToolbarView#createExportPushButton()
*/
@Override
protected ExportPushButton createExportPushButton() {
return null;
}
/*
* (non-Javadoc)
*
* @see org.talend.core.ui.extended.ExtendedToolbarView#createPastButton()
*/
@Override
public ImportPushButton createImportPushButton() {
return null;
}
@Override
protected RemovePushButton createRemovePushButton() {
return new RemovePushButtonForExtendedTable(this.toolbar, getExtendedTableViewer()) {
@Override
public boolean getEnabledState() {
return super.getEnabledState() && (model == null || !model.getElemParameter().isBasedOnSubjobStarts());
}
};
}
private Object findDefaultName(String outputName, ColumnInfo col) {
if (col.parameter != null && outputName != null) {
Object[] values = col.parameter.getListItemsValue();
if (values != null) {
for (Object o : values) {
if (outputName.equals(o)) {
return o;
}
}
}
}
return null;
}
}