// ============================================================================
//
// Copyright (C) 2006-2016 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.dataprofiler.core.ui.editor.composite;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.talend.core.model.context.JobContextManager;
import org.talend.core.model.process.IContext;
import org.talend.core.model.process.IContextListener;
import org.talend.core.model.process.IContextManager;
import org.talend.core.model.process.IContextParameter;
import org.talend.core.model.utils.ContextParameterUtils;
import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl;
import org.talend.dataprofiler.core.ui.editor.SupportContextEditor;
/**
* created by xqliu on Aug 19, 2013 Detailled comment
*
*/
public class ContextComposite extends Composite {
private static final int COLUMN_WIDTH = 200;
private static final int HINT_HEIGHT = 220;
private ComboViewer contextComboViewer;
/**
* Getter for contextComboViewer.
*
* @return the contextComboViewer
*/
public ComboViewer getContextComboViewer() {
return this.contextComboViewer;
}
private TableViewer contextTableViewer;
private SupportContextEditor currentEditor;
private IContextListener contextListener;
/**
* DOC xqliu ReportContextComposite constructor comment.
*
* @param parent
* @param style
*/
public ContextComposite(SupportContextEditor currentEditor, Composite parent, int style) {
super(parent, style);
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
setLayout(layout);
Composite contextGroup = this;
// layout = new GridLayout();
// contextGroup.setLayout(layout);
// contextGroup.setLayoutData(new GridData(GridData.FILL_BOTH));
contextComboViewer = new ComboViewer(contextGroup, SWT.BORDER | SWT.READ_ONLY);
contextComboViewer.setContentProvider(new ArrayContentProvider());
contextComboViewer.setLabelProvider(new ContextNameLabelProvider());
contextComboViewer.getControl().setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Table contextTable = new Table(contextGroup, SWT.BORDER);
contextTable.setLinesVisible(true);
contextTable.setHeaderVisible(true);
TableColumn colName = new TableColumn(contextTable, SWT.NONE);
colName.setText(DefaultMessagesImpl.getString("ContextComposite.nameCol")); //$NON-NLS-1$
colName.setWidth(COLUMN_WIDTH);
TableColumn colValue = new TableColumn(contextTable, SWT.NONE);
colValue.setText(DefaultMessagesImpl.getString("ContextComposite.valueCol")); //$NON-NLS-1$
colValue.setWidth(COLUMN_WIDTH);
contextTableViewer = new TableViewer(contextTable);
contextTableViewer.setContentProvider(new ArrayContentProvider());
contextTableViewer.setLabelProvider(new ContextParameterLabelProvider());
GridData data = new GridData(GridData.FILL_BOTH);
data.heightHint = HINT_HEIGHT;
contextTableViewer.getControl().setLayoutData(data);
setCurrentEditror(currentEditor);
}
private void setCurrentEditror(final SupportContextEditor currentEditor) {
this.currentEditor = currentEditor;
getInformationsFromContextManager(currentEditor.getContextManager());
contextListener = new IContextListener() {
public void contextsChanged() {
if (!ContextComposite.this.isDisposed()) {
IContextManager contextManager = currentEditor.getContextManager();
getInformationsFromContextManager(contextManager);
// if the ContextManager is modified, set the report editor dirty
if (contextManager instanceof JobContextManager) {
JobContextManager jobContextManager = (JobContextManager) contextManager;
if (jobContextManager.isModified() && currentEditor.getMasterPage() != null) {
currentEditor.getMasterPage().setDirty(true);
}
}
}
}
};
if (this.currentEditor.getContextManager() != null) {
this.currentEditor.getContextManager().addContextListener(contextListener);
}
contextComboViewer.addSelectionChangedListener(contextComboListener);
}
protected void getInformationsFromContextManager(IContextManager contextManager) {
if (contextManager == null) {
return;
}
List<IContext> internalContextList = new ArrayList<IContext>();
IContext newSelectedCopiedContext = null;
if (this.currentEditor != null && !StringUtils.isEmpty(this.currentEditor.getLastRunContextGroupName())) {
for (IContext context : contextManager.getListContext()) {
IContext copiedContext = context.clone();
internalContextList.add(copiedContext);
if (this.currentEditor.getLastRunContextGroupName().equals(context.getName())) {
newSelectedCopiedContext = copiedContext;
}
}
} else {
for (IContext context : contextManager.getListContext()) {
IContext copiedContext = context.clone();
internalContextList.add(copiedContext);
if (contextManager.getDefaultContext().equals(context)) {
newSelectedCopiedContext = copiedContext;
}
}
}
Collections.sort(internalContextList, new ContextCompare());
contextComboViewer.setInput(internalContextList);
if (newSelectedCopiedContext != null) {
setContextComboSelection(new StructuredSelection(newSelectedCopiedContext));
contextTableViewer.setInput(newSelectedCopiedContext.getContextParameterList());
} else {
IContext element = internalContextList.get(0);
setContextComboSelection(new StructuredSelection(element));
contextTableViewer.setInput(element.getContextParameterList());
// should update the report editor's last run context group name here
this.currentEditor.setLastRunContextGroupName(element.getName());
}
}
public void setContextComboSelection(StructuredSelection selection) {
contextComboViewer.removeSelectionChangedListener(contextComboListener);
contextComboViewer.setSelection(selection);
contextComboViewer.addSelectionChangedListener(contextComboListener);
}
ISelectionChangedListener contextComboListener = new ISelectionChangedListener() {
public void selectionChanged(final SelectionChangedEvent event) {
Object input = null;
if (!event.getSelection().isEmpty()) {
IContext selectedContext = (IContext) ((IStructuredSelection) event.getSelection()).getFirstElement();
input = selectedContext.getContextParameterList();
ContextComposite.this.currentEditor.setLastRunContextGroupName(selectedContext.getName());
ContextComposite.this.currentEditor.getMasterPage().setDirty(true);
}
contextTableViewer.setInput(input);
}
};
/**
* the compare for the IContext.
*/
private class ContextCompare implements java.util.Comparator<IContext> {
/*
* (non-Javadoc)
*
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
public int compare(IContext o1, IContext o2) {
String name1 = o1.getName().toUpperCase();
String name2 = o2.getName().toUpperCase();
return name1.compareTo(name2);
}
}
/**
* LabelProvider for a context combo.
*/
private static class ContextNameLabelProvider extends LabelProvider {
/**
* @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object)
*/
@Override
public String getText(final Object element) {
if (element instanceof IContext) {
return ((IContext) element).getName();
}
return super.getText(element);
}
}
/**
* LabelProvider for a context table.
*/
private static class ContextParameterLabelProvider extends LabelProvider implements ITableLabelProvider {
/**
* @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
*/
public String getColumnText(final Object element, final int columnIndex) {
String text;
IContextParameter parameter = (IContextParameter) element;
switch (columnIndex) {
case 0:
text = parameter.getName();
break;
case 1:
if (ContextParameterUtils.isPasswordType(parameter)) {
String temp = parameter.getValue();
text = ""; //$NON-NLS-1$
for (int i = 0; i < temp.length(); ++i) {
text += "*"; //$NON-NLS-1$
}
} else {
text = parameter.getValue();
}
break;
default:
text = super.getText(element);
}
return text;
}
/**
* @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
*/
public Image getColumnImage(final Object element, final int columnIndex) {
return null;
}
}
}