// ============================================================================
//
// 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.views.properties;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections.BidiMap;
import org.eclipse.emf.common.ui.celleditor.ExtendedComboBoxCellEditor;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CommandStack;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
import org.talend.commons.ui.swt.advanced.dataeditor.AbstractDataTableEditorView;
import org.talend.commons.ui.swt.advanced.dataeditor.ExtendedToolbarView;
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.CopyPushButton;
import org.talend.commons.ui.swt.advanced.dataeditor.button.MoveDownPushButton;
import org.talend.commons.ui.swt.advanced.dataeditor.button.MoveUpPushButton;
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.ExtendedTableModel;
import org.talend.commons.ui.swt.proposal.TextCellEditorWithProposal;
import org.talend.commons.ui.swt.tableviewer.TableViewerCreator;
import org.talend.commons.ui.swt.tableviewer.TableViewerCreatorColumn;
import org.talend.commons.ui.swt.tableviewer.behavior.ColumnCellModifier;
import org.talend.commons.utils.data.bean.IBeanPropertyAccessors;
import org.talend.core.model.process.EComponentCategory;
import org.talend.core.model.process.EParameterFieldType;
import org.talend.core.model.process.Element;
import org.talend.core.model.process.IElementParameter;
import org.talend.core.model.process.IProcess2;
import org.talend.core.model.properties.ConnectionItem;
import org.talend.core.properties.tab.IDynamicProperty;
import org.talend.core.ui.proposal.TalendProposalProvider;
import org.talend.designer.core.i18n.Messages;
import org.talend.designer.core.ui.AbstractMultiPageTalendEditor;
import org.talend.designer.core.ui.editor.cmd.PropertyChangeCommand;
import org.talend.designer.core.ui.editor.nodes.Node;
/**
* yzhang class global comment. Detailled comment
*/
public class AdvancedContextComposite extends ScrolledComposite implements IDynamicProperty {
private static final String CODE_PROPERTY = "codeProperty"; //$NON-NLS-1$
private static final String NAME_PROPERTY = "nameProperty"; //$NON-NLS-1$
private Node node;
private List<IElementParameter> comboContent = new ArrayList<IElementParameter>();
private final List<IElementParameter> legalParameters = new ArrayList<IElementParameter>();
/**
* yzhang AdvancedContextComposite constructor comment.
*
* @param parent
* @param style
*/
public AdvancedContextComposite(Composite parent, int style, final Element element) {
super(parent, style);
node = (Node) element;
setExpandHorizontal(true);
setExpandVertical(true);
FormData layouData = new FormData();
layouData.left = new FormAttachment(0, 0);
layouData.right = new FormAttachment(100, 0);
layouData.top = new FormAttachment(0, 0);
layouData.bottom = new FormAttachment(100, 0);
setLayoutData(layouData);
final Composite panel = new Composite(this, SWT.NONE);
setContent(panel);
panel.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
FormLayout layout = new FormLayout();
layout.marginWidth = ITabbedPropertyConstants.HSPACE + 2;
layout.marginHeight = ITabbedPropertyConstants.VSPACE;
layout.spacing = ITabbedPropertyConstants.VMARGIN + 1;
panel.setLayout(layout);
ExtendedTableModel<IElementParameter> model = new ExtendedTableModel<IElementParameter>();
AdvancedContextTableView tableViewer = new AdvancedContextTableView(panel, model, SWT.BORDER | SWT.FULL_SELECTION
| SWT.MULTI, node);
if (node.getProcess() instanceof IProcess2) {
IProcess2 process = (IProcess2) node.getProcess();
tableViewer.getExtendedTableViewer().setCommandStack(process.getCommandStack());
if (node.getJobletNode() != null) {
tableViewer.setReadOnly(node.isReadOnly());
} else {
tableViewer.setReadOnly(process.isReadOnly());
}
}
FormData tableLayoutData = new FormData();
tableLayoutData.left = new FormAttachment(10, 0);
tableLayoutData.right = new FormAttachment(90, 0);
tableLayoutData.top = new FormAttachment(5, 0);
tableLayoutData.bottom = new FormAttachment(90, 0);
tableViewer.getMainComposite().setLayoutData(tableLayoutData);
final Table table = tableViewer.getTable();
GridData layoutData = new GridData(GridData.FILL_BOTH);
layoutData.minimumHeight = 80;
layoutData.minimumWidth = 300;
table.setLayoutData(layoutData);
setMinSize(panel.computeSize(SWT.DEFAULT, SWT.DEFAULT));
needContextModeParameters();
//
List<IElementParameter> tableContent = new ArrayList<IElementParameter>();
for (IElementParameter parameter : element.getElementParameters()) {
if (parameter.isContextMode()) {
tableContent.add(parameter);
}
}
tableViewer.getTableViewerCreator().setInputList(tableContent);
comboContent.addAll(calculateComboContent(tableViewer, legalParameters));
tableViewer.getTableViewerCreator().refresh();
tableViewer.getExtendedToolbar().updateEnabledStateOfButtons();
}
private void needContextModeParameters() {
legalParameters.clear();
for (IElementParameter parameter : node.getElementParameters()) {
if (parameter.isDynamicSettings()
&& parameter.isShow(node.getElementParameters())
&& parameter.getCategory() != EComponentCategory.TECHNICAL
&& (parameter.getFieldType() == EParameterFieldType.CHECK
|| parameter.getFieldType() == EParameterFieldType.CLOSED_LIST
|| parameter.getFieldType() == EParameterFieldType.MODULE_LIST
|| parameter.getFieldType() == EParameterFieldType.RADIO || parameter.getFieldType() == EParameterFieldType.COMPONENT_LIST)) {
legalParameters.add(parameter);
}
}
}
/**
* yzhang Comment method "calculateComboContent".
*
* @param tableViewer
* @param legalParameters
* @return
*/
private List<IElementParameter> calculateComboContent(AdvancedContextTableView tableViewer,
List<IElementParameter> legalParameters) {
List<IElementParameter> tableInput = tableViewer.getTableViewerCreator().getInputList();
List<IElementParameter> content = new ArrayList<IElementParameter>(legalParameters);
content.removeAll(tableInput);
return content;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.ui.editor.properties.controllers.generator.IDynamicProperty#getComposite()
*/
public Composite getComposite() {
return null;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.ui.editor.properties.controllers.generator.IDynamicProperty#getCurRowSize()
*/
public int getCurRowSize() {
return 0;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.ui.editor.properties.controllers.generator.IDynamicProperty#getElement()
*/
public Element getElement() {
return null;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.ui.editor.properties.controllers.generator.IDynamicProperty#getHashCurControls()
*/
public BidiMap getHashCurControls() {
return null;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.ui.editor.properties.controllers.generator.IDynamicProperty#getPart()
*/
public AbstractMultiPageTalendEditor getPart() {
return null;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.ui.editor.properties.controllers.generator.IDynamicProperty#getQueriesMap()
*/
public Map<String, List<String>> getQueriesMap() {
return null;
}
/*
* (non-Javadoc)
*
* @see
* org.talend.designer.core.ui.editor.properties.controllers.generator.IDynamicProperty#getRepositoryAliasName(org
* .talend.core.model.properties.ConnectionItem)
*/
public String getRepositoryAliasName(ConnectionItem connectionItem) {
return null;
}
/* 16969 */
// /*
// * (non-Javadoc)
// *
// * @see
// *
// org.talend.designer.core.ui.editor.properties.controllers.generator.IDynamicProperty#getRepositoryConnectionItemMap
// * ()
// */
// public Map<String, ConnectionItem> getRepositoryConnectionItemMap() {
// return null;
// }
// /*
// * (non-Javadoc)
// *
// * @see
// *
// org.talend.designer.core.ui.editor.properties.controllers.generator.IDynamicProperty#getRepositoryQueryStoreMap()
// */
// public Map<String, Query> getRepositoryQueryStoreMap() {
// return null;
// }
// /*
// * (non-Javadoc)
// *
// * @see
// org.talend.designer.core.ui.editor.properties.controllers.generator.IDynamicProperty#getRepositoryTableMap()
// */
// public Map<String, IMetadataTable> getRepositoryTableMap() {
// return null;
// }
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.ui.editor.properties.controllers.generator.IDynamicProperty#getSection()
*/
public EComponentCategory getSection() {
return null;
}
/*
* (non-Javadoc)
*
* @see
* org.talend.designer.core.ui.editor.properties.controllers.generator.IDynamicProperty#getTableIdAndDbSchemaMap()
*/
public Map<String, String> getTableIdAndDbSchemaMap() {
return null;
}
/*
* (non-Javadoc)
*
* @see
* org.talend.designer.core.ui.editor.properties.controllers.generator.IDynamicProperty#getTableIdAndDbTypeMap()
*/
public Map<String, String> getTableIdAndDbTypeMap() {
return null;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.ui.editor.properties.controllers.generator.IDynamicProperty#getTablesMap()
*/
public Map<String, List<String>> getTablesMap() {
return null;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.ui.editor.properties.controllers.generator.IDynamicProperty#refresh()
*/
public void refresh() {
if (!isDisposed()) {
getParent().layout();
}
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.ui.editor.properties.controllers.generator.IDynamicProperty#setCurRowSize(int)
*/
public void setCurRowSize(int i) {
}
/**
*
* ggu AdvancedContextTableView class global comment. Detailled comment
*/
class AdvancedContextTableView extends AbstractDataTableEditorView<IElementParameter> {
private Node node;
private TextCellEditorWithProposal codeCellEditor;
private DynamicComboBoxCellEditor nameCellEditor;
public AdvancedContextTableView(Composite parentComposite, ExtendedTableModel<IElementParameter> model,
int mainCompositeStyle, Node node) {
super(parentComposite, mainCompositeStyle, model, false, true, true, false);
this.node = node;
initGraphicComponents();
}
/*
* (non-Javadoc)
*
* @see
* org.talend.commons.ui.swt.advanced.dataeditor.AbstractDataTableEditorView#createColumns(org.talend.commons
* .ui.swt.tableviewer.TableViewerCreator, org.eclipse.swt.widgets.Table)
*/
@SuppressWarnings("unchecked")
@Override
protected void createColumns(TableViewerCreator<IElementParameter> tableViewerCreator, Table table) {
TableViewerCreatorColumn column;
// name
column = new TableViewerCreatorColumn(tableViewerCreator);
column.setTitle(Messages.getString("AdvancedContextComposite.Name")); //$NON-NLS-1$
column.setId(NAME_PROPERTY);
column.setWidth(250);
column.setModifiable(true);
nameCellEditor = new DynamicComboBoxCellEditor(table, comboContent, comboboxCellEditorLabelProvider);
column.setCellEditor(nameCellEditor);
column.setBeanPropertyAccessors(new IBeanPropertyAccessors<IElementParameter, Object>() {
public String get(IElementParameter bean) {
return bean.getDisplayName();
}
public void set(IElementParameter bean, Object value) {
if (value != null && value instanceof IElementParameter) {
List<IElementParameter> tableInput = getTableViewerCreator().getInputList();
int i = tableInput.indexOf(bean);
tableInput.remove(i);
bean.setContextMode(false);
IElementParameter newBean = (IElementParameter) value;
tableInput.add(i, newBean);
newBean.setContextMode(true);
// add related
List<IElementParameter> associateParams = findRadioParamInSameGroup(comboContent, newBean);
for (IElementParameter param : associateParams) {
param.setContextMode(true);
tableInput.add(param);
}
// set dirty
executeCommand(new Command() {
});
refreshComboContent(AdvancedContextTableView.this, legalParameters);
getExtendedToolbar().updateEnabledStateOfButtons();
getTableViewerCreator().refresh();
}
}
});
column.setColumnCellModifier(new ColumnCellModifier(column) {
@Override
public boolean canModify(Object bean) {
if (super.canModify(bean) && !comboContent.isEmpty()) {
List<IElementParameter> associateParams = findRadioParamInSameGroup(getTableViewerCreator()
.getInputList(), (IElementParameter) bean);
return associateParams.isEmpty();
}
return false;
}
@Override
public Object getValue(Object bean) {
refreshComboContent(AdvancedContextTableView.this, legalParameters);
comboContent.add(0, (IElementParameter) bean);
nameCellEditor.refresh();
return bean;
}
});
// code
column = new TableViewerCreatorColumn(tableViewerCreator);
column.setTitle(Messages.getString("AdvancedContextComposite.Code")); //$NON-NLS-1$
column.setId(CODE_PROPERTY);
column.setWidth(200);
column.setModifiable(true);
codeCellEditor = new TextCellEditorWithProposal(tableViewerCreator.getTable(), SWT.BORDER, column);
codeCellEditor.setContentProposalProvider(new TalendProposalProvider(node.getProcess(), node));
column.setCellEditor(codeCellEditor);
column.setBeanPropertyAccessors(new IBeanPropertyAccessors<IElementParameter, Object>() {
public Object get(IElementParameter bean) {
final Object value = bean.getValue();
return value == null ? "" : String.valueOf(value); //$NON-NLS-1$
}
public void set(IElementParameter bean, Object value) {
if (value != null && !value.equals(bean.getValue())) {
executeCommand(new PropertyChangeCommand((Element) node, bean.getName(), value));
getTableViewerCreator().refresh();
}
}
});
}
private void executeCommand(Command cmd) {
CommandStack cmdStack = getTableViewerCreator().getCommandStack();
if (cmdStack != null) {
cmdStack.execute(cmd);
} else {
cmd.execute();
}
}
/**
* yzhang Comment method "refreshComboContent".
*
* @param tableViewer
* @param legalParameters
*/
private void refreshComboContent(AdvancedContextTableView tableViewer, List<IElementParameter> legalParameters) {
comboContent.clear();
comboContent.addAll(calculateComboContent(tableViewer, legalParameters));
}
@Override
protected ExtendedToolbarView initToolBar() {
return new ExtendedToolbarView(getMainComposite(), SWT.NONE, getExtendedTableViewer()) {
@Override
protected AddPushButton createAddPushButton() {
return new AddPushButtonForExtendedTable(toolbar, extendedTableViewer) {
@Override
protected Object getObjectToAdd() {
return null; // un-used
}
@Override
protected Command getCommandToExecute() {
return new Command() {
@Override
public void execute() {
if (comboContent.size() > 0) {
List<IElementParameter> tableInput = getTableViewerCreator().getInputList();
IElementParameter parameter = comboContent.get(0);
tableInput.add(parameter);
((IElementParameter) parameter).setContextMode(true);
List<IElementParameter> associateParams = findRadioParamInSameGroup(comboContent,
parameter);
for (IElementParameter param : associateParams) {
param.setContextMode(true);
tableInput.add(param);
}
refreshComboContent(AdvancedContextTableView.this, legalParameters);
getExtendedToolbar().updateEnabledStateOfButtons();
getTableViewerCreator().refresh();
}
}
};
}
@Override
public boolean getEnabledState() {
if (super.getEnabledState()) {
List<IElementParameter> inputList = getTableViewerCreator().getInputList();
return inputList != null && inputList.size() < legalParameters.size();
}
return false;
}
};
}
@Override
protected RemovePushButton createRemovePushButton() {
return new RemovePushButtonForExtendedTable(toolbar, extendedTableViewer) {
@Override
protected Command getCommandToExecute() {
return new Command() {
@Override
public void execute() {
ISelection selection = getTableViewerCreator().getTableViewer().getSelection();
List<IElementParameter> tableViewerInput = getTableViewerCreator().getInputList();
boolean needRefresh = false;
if (!selection.isEmpty() && selection instanceof StructuredSelection) {
Object[] elements = ((StructuredSelection) selection).toArray();
for (Object element : elements) {
tableViewerInput.remove(element);
removeAssociateParams(tableViewerInput, element);
((IElementParameter) element).setContextMode(false);
}
needRefresh = true;
} else if (!tableViewerInput.isEmpty()) {
int index = tableViewerInput.size() - 1;
final IElementParameter elementParameter = (IElementParameter) tableViewerInput
.get(index);
elementParameter.setContextMode(false);
tableViewerInput.remove(index);
removeAssociateParams(tableViewerInput, elementParameter);
needRefresh = true;
}
if (needRefresh) {
refreshComboContent(AdvancedContextTableView.this, legalParameters);
getTableViewerCreator().refresh();
getExtendedToolbar().updateEnabledStateOfButtons();
}
}
};
}
@Override
public boolean getEnabledState() {
return !getExtendedControlViewer().isReadOnly() && !getTableViewerCreator().getInputList().isEmpty();
}
};
}
@Override
protected MoveDownPushButton createMoveDownPushButton() {
return null;
}
@Override
protected MoveUpPushButton createMoveUpPushButton() {
return null;
}
@Override
protected CopyPushButton createCopyPushButton() {
return null;
}
private void removeAssociateParams(List<IElementParameter> tableViewerInput, Object element) {
List<IElementParameter> associateParams = findRadioParamInSameGroup(tableViewerInput,
(IElementParameter) element);
for (IElementParameter param : associateParams) {
param.setContextMode(false);
tableViewerInput.remove(param);
}
}
};
}
/**
*
* YeXiaowei Comment method "findRadioParamInSameGroup".
*
* @param param
* @return
*/
private List<IElementParameter> findRadioParamInSameGroup(final List<IElementParameter> list,
final IElementParameter param) {
List<IElementParameter> associateParams = new ArrayList<IElementParameter>();
for (IElementParameter p : list) {
if (p.equals(param)) {
continue;
}
if (p.getFieldType() == EParameterFieldType.RADIO) {
String group = param.getGroup();
if (group == null) {
if (p.getGroup() == null) {
associateParams.add(p);
}
} else {
if (p.getGroup() != null && p.getGroup().equals(group)) {
associateParams.add(p);
}
}
}
}
return associateParams;
}
/**
* yzhang AdvancedContextComposite class global comment. Detailled comment
*/
private class DynamicComboBoxCellEditor extends ExtendedComboBoxCellEditor {
/**
* yzhang ComboBoxCellEditor constructor comment.
*
* @param composite
* @param list
* @param labelProvider
*/
public DynamicComboBoxCellEditor(Composite composite, List<?> list, ILabelProvider labelProvider) {
super(composite, list, labelProvider);
}
public void refresh() {
refreshItems(""); //$NON-NLS-1$
}
}
private ILabelProvider comboboxCellEditorLabelProvider = new ILabelProvider() {
public Image getImage(Object element) {
return null;
}
public String getText(Object element) {
return ((IElementParameter) element).getDisplayName();
}
public void addListener(ILabelProviderListener listener) {
}
public void dispose() {
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
}
};
}
}