// ============================================================================
//
// 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.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.part.ViewPart;
import org.talend.commons.ui.runtime.image.EImage;
import org.talend.commons.ui.runtime.image.ImageProvider;
import org.talend.commons.ui.runtime.image.ImageUtils.ICON_SIZE;
import org.talend.core.PluginChecker;
import org.talend.core.model.process.EComponentCategory;
import org.talend.core.model.process.EConnectionType;
import org.talend.core.model.process.Element;
import org.talend.core.model.process.IConnectionCategory;
import org.talend.core.model.process.IElementParameter;
import org.talend.core.properties.tab.HorizontalTabFactory;
import org.talend.core.properties.tab.IDynamicProperty;
import org.talend.core.properties.tab.TalendPropertyTabDescriptor;
import org.talend.core.ui.images.CoreImageProvider;
import org.talend.designer.core.DesignerPlugin;
import org.talend.designer.core.i18n.Messages;
import org.talend.designer.core.model.components.EmfComponent;
import org.talend.designer.core.ui.editor.connections.Connection;
import org.talend.designer.core.ui.editor.nodes.Node;
import org.talend.designer.core.ui.editor.notes.Note;
import org.talend.designer.core.ui.editor.properties.connections.MainConnectionComposite;
import org.talend.designer.core.ui.editor.properties.notes.AbstractNotePropertyComposite;
import org.talend.designer.core.ui.editor.properties.notes.BasicNotePropertyComposite;
import org.talend.designer.core.ui.editor.subjobcontainer.SubjobContainer;
import org.talend.designer.core.ui.preferences.TalendDesignerPrefConstants;
import org.talend.designer.core.ui.views.subjob.SubjobBasicComposite;
/**
* nrousseau class global comment. Detailled comment <br/>
*
*/
public class ComponentSettingsView extends ViewPart implements IComponentSettingsView {
private static final String PARENT = "parent"; //$NON-NLS-1$
private static final String CATEGORY = "category"; //$NON-NLS-1$
private static final String DEFAULT = "default"; //$NON-NLS-1$
private static final String TABLEVIEW = "table view"; //$NON-NLS-1$
public static final String ID = "org.talend.designer.core.ui.views.properties.ComponentSettingsView"; //$NON-NLS-1$
private HorizontalTabFactory tabFactory = null;
private TalendPropertyTabDescriptor currentSelectedTab;
private Element element;
private IDynamicProperty dc = null;
private boolean cleaned;
private boolean selectedPrimary;
private Map<String, Composite> parentMap = null;
private Map<String, EComponentCategory> categoryMap = null;
private Composite parent;
/**
* Getter for parentMap.
*
* @return the parentMap
*/
public Map<String, Composite> getParentMap() {
return this.parentMap;
}
/**
* Getter for categoryMap.
*
* @return the categoryMap
*/
public Map<String, EComponentCategory> getCategoryMap() {
return this.categoryMap;
}
/**
* nrousseau ComponentSettings constructor comment.
*/
public ComponentSettingsView() {
tabFactory = new HorizontalTabFactory();
parentMap = new HashMap<String, Composite>();
categoryMap = new HashMap<String, EComponentCategory>();
}
/**
* DOC zwang Comment method "getPreference".
*
* @return
*/
private IPreferenceStore getPreference() {
// TODO Auto-generated method stub
return DesignerPlugin.getDefault().getPreferenceStore();
}
public Composite getParent() {
return parent;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createPartControl(Composite parent) {
this.parent = parent;
tabFactory.initComposite(parent, true);
tabFactory.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
TalendPropertyTabDescriptor descriptor = (TalendPropertyTabDescriptor) selection.getFirstElement();
if (descriptor == null) {
return;
}
if (currentSelectedTab != null
&& (!currentSelectedTab.getData().equals(descriptor.getData()) || currentSelectedTab.getCategory() != descriptor
.getCategory())) {
for (Control curControl : tabFactory.getTabComposite().getChildren()) {
curControl.dispose();
}
}
if (element == null || !element.equals(descriptor.getData()) || currentSelectedTab == null
|| currentSelectedTab.getCategory() != descriptor.getCategory() || selectedPrimary) {
element = (Element) descriptor.getData();
currentSelectedTab = descriptor;
createDynamicComposite(tabFactory.getTabComposite(), (Element) descriptor.getData(), descriptor.getCategory());
selectedPrimary = false;
}
}
});
}
/**
* yzhang Comment method "createDynamicComposite".
*
* @param parent
* @param element
* @param category
*/
private void createDynamicComposite(Composite parent, Element element, EComponentCategory category) {
// DynamicComposite dc = null;
if (element instanceof Node) {
tabFactory.getTabbedPropertyComposite().getCompactButton().setVisible(false);
tabFactory.getTabbedPropertyComposite().getTableButton().setVisible(false);
// dc = new DynamicComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.NO_FOCUS, category, element);
if (category == EComponentCategory.BASIC) {
getParentMap().put(ComponentSettingsView.PARENT, parent);
getCategoryMap().put(ComponentSettingsView.CATEGORY, category);
// getElementMap().put(ComponentSettingsView.ELEMENT, element);
createButtonListener();
// tabFactory.getTabbedPropertyComposite().setVisible(true);
if (ComponentSettingsView.DEFAULT.equals(getPreference().getString(TalendDesignerPrefConstants.VIEW_OPTIONS))) {
tabFactory.getTabbedPropertyComposite().setCompactView(true);
tabFactory.getTabbedPropertyComposite().getCompactButton()
.setImage(ImageProvider.getImage(EImage.COMPACT_VIEW));
tabFactory.getTabbedPropertyComposite().getTableButton()
.setImage(ImageProvider.getImage(EImage.NO_TABLE_VIEW));
dc = new MultipleThreadDynamicComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.NO_FOCUS, category,
element, true);
} else if (ComponentSettingsView.TABLEVIEW.equals(getPreference().getString(
TalendDesignerPrefConstants.VIEW_OPTIONS))) {
tabFactory.getTabbedPropertyComposite().setCompactView(false);
tabFactory.getTabbedPropertyComposite().getCompactButton()
.setImage(ImageProvider.getImage(EImage.NO_COMPACT_VIEW));
tabFactory.getTabbedPropertyComposite().getTableButton().setImage(ImageProvider.getImage(EImage.TABLE_VIEW));
dc = new MultipleThreadDynamicComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.NO_FOCUS, category,
element, false);
}
} else if (category == EComponentCategory.DYNAMICS_SETTINGS) {
dc = new AdvancedContextComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.NO_FOCUS, element);
} else if (category == EComponentCategory.SQL_PATTERN) {
dc = new SQLPatternComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.NO_FOCUS, element);
} else {
dc = new MultipleThreadDynamicComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.NO_FOCUS, category, element,
true);
}
} else if (element instanceof Connection) {
dc = new MainConnectionComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.NO_FOCUS, category, element);
} else if (element instanceof Note) {
if (category == EComponentCategory.BASIC) {
if (parent.getLayout() instanceof FillLayout) {
FillLayout layout = (FillLayout) parent.getLayout();
layout.type = SWT.VERTICAL;
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.spacing = 0;
}
ScrolledComposite scrolled = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
scrolled.setExpandHorizontal(true);
scrolled.setExpandVertical(true);
scrolled.setMinWidth(600);
scrolled.setMinHeight(400);
Composite composite = tabFactory.getWidgetFactory().createComposite(scrolled);
scrolled.setContent(composite);
composite.setLayout(new FormLayout());
FormData d = new FormData();
d.left = new FormAttachment(0, 0);
d.right = new FormAttachment(100, 0);
d.top = new FormAttachment(0, 0);
d.bottom = new FormAttachment(100, 0);
composite.setLayoutData(d);
AbstractNotePropertyComposite c1 = new BasicNotePropertyComposite(composite, (Note) element, tabFactory);
// AbstractNotePropertyComposite c2 = new TextNotePropertyComposite(composite, (Note) element,
// tabFactory);
// FormData data = new FormData();
// data.top = new FormAttachment(c1.getComposite(), 20, SWT.DOWN);
// data.left = new FormAttachment(0, 0);
// data.right = new FormAttachment(100, 0);
// c2.getComposite().setLayoutData(data);
parent.layout();
}
} else if (element instanceof SubjobContainer) {
if (category == EComponentCategory.BASIC) {
dc = new SubjobBasicComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.NO_FOCUS, element);
}
} else {
tabFactory.getTabbedPropertyComposite().getCompactButton().setVisible(false);
tabFactory.getTabbedPropertyComposite().getTableButton().setVisible(false);
dc = new MultipleThreadDynamicComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.NO_FOCUS, category, element, true);
}
if (parent.getChildren().length == 0) {
if (parent.getLayout() instanceof FillLayout) {
FillLayout layout = (FillLayout) parent.getLayout();
layout.type = SWT.VERTICAL;
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.spacing = 0;
}
Composite composite = tabFactory.getWidgetFactory().createComposite(parent);
composite.setLayout(new FormLayout());
FormData d = new FormData();
d.left = new FormAttachment(2, 0);
d.right = new FormAttachment(100, 0);
d.top = new FormAttachment(5, 0);
d.bottom = new FormAttachment(100, 0);
composite.setLayoutData(d);
Label alertText = new Label(composite, SWT.NONE);
alertText.setText(Messages.getString("ComponentSettingsView.noAdvancedSetting")); //$NON-NLS-1$
alertText.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
parent.layout();
}
if (dc != null) {
dc.refresh();
}
}
/**
* DOC zwang Comment method "createButtons".
*/
private void createButtonListener() {
// TODO Auto-generated method stub
// tabFactory.getTabbedPropertyComposite().getComposite().setBackground(
// ImageProvider.getImage(EImage.COMPOSITE_BACKGROUND).getBackground());
tabFactory.getTabbedPropertyComposite().getCompactButton().setVisible(true);
tabFactory.getTabbedPropertyComposite().getTableButton().setVisible(true);
tabFactory.getTabbedPropertyComposite().getCompactButton().addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
// TODO Auto-generated method stub
}
public void widgetSelected(SelectionEvent e) {
// TODO Auto-generated method stub
tabFactory.getTabbedPropertyComposite().setCompactView(true);
getPreference().setValue(TalendDesignerPrefConstants.VIEW_OPTIONS, ComponentSettingsView.DEFAULT);
tabFactory.getTabbedPropertyComposite().getCompactButton().setImage(ImageProvider.getImage(EImage.COMPACT_VIEW));
tabFactory.getTabbedPropertyComposite().getTableButton().setImage(ImageProvider.getImage(EImage.NO_TABLE_VIEW));
if (getDc() != null) {
// getDc().setCompactView(false);
getDc().dispose();
if (getParentMap().get(ComponentSettingsView.PARENT) != null
&& getCategoryMap().get(ComponentSettingsView.CATEGORY) != null) {
dc = new MultipleThreadDynamicComposite(getParentMap().get(ComponentSettingsView.PARENT), SWT.H_SCROLL
| SWT.V_SCROLL | SWT.NO_FOCUS, getCategoryMap().get(ComponentSettingsView.CATEGORY), element,
true);
dc.refresh();
}
}
}
});
tabFactory.getTabbedPropertyComposite().getTableButton().addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
// TODO Auto-generated method stub
tabFactory.getTabbedPropertyComposite().setCompactView(false);
getPreference().setValue(TalendDesignerPrefConstants.VIEW_OPTIONS, ComponentSettingsView.TABLEVIEW);
tabFactory.getTabbedPropertyComposite().getCompactButton()
.setImage(ImageProvider.getImage(EImage.NO_COMPACT_VIEW));
tabFactory.getTabbedPropertyComposite().getTableButton().setImage(ImageProvider.getImage(EImage.TABLE_VIEW));
if (getDc() != null) {
// getDc().setCompactView(false);
getDc().dispose();
if (getParentMap().get(ComponentSettingsView.PARENT) != null
&& getCategoryMap().get(ComponentSettingsView.CATEGORY) != null) {
dc = new MultipleThreadDynamicComposite(getParentMap().get(ComponentSettingsView.PARENT), SWT.H_SCROLL
| SWT.V_SCROLL | SWT.NO_FOCUS, getCategoryMap().get(ComponentSettingsView.CATEGORY), element,
false);
dc.refresh();
}
}
}
});
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.WorkbenchPart#setFocus()
*/
@Override
public void setFocus() {
this.parent.setFocus();
}
public boolean isCleaned() {
return this.cleaned;
}
public void cleanDisplay() {
tabFactory.setInput(null);
tabFactory.setTitle(null, null);
tabFactory.getTabbedPropertyComposite().getComposite()
.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
tabFactory.getTabbedPropertyComposite().getCompactButton().setVisible(false);
tabFactory.getTabbedPropertyComposite().getTableButton().setVisible(false);
if (tabFactory.getTabComposite() != null) {
for (Control curControl : tabFactory.getTabComposite().getChildren()) {
curControl.dispose();
}
}
this.element = null;
cleaned = true;
selectedPrimary = true;
}
public void setElement(Element elem) {
if (currentSelectedTab != null && currentSelectedTab.getData().equals(elem) && !cleaned) {
return;
}
EComponentCategory[] categories = getCategories(elem);
final List<TalendPropertyTabDescriptor> descriptors = new ArrayList<TalendPropertyTabDescriptor>();
for (EComponentCategory category : categories) {
TalendPropertyTabDescriptor d = new TalendPropertyTabDescriptor(category);
d.setData(elem);
descriptors.add(d);
// if (category.hadSubCategories()) {
// for (EComponentCategory subCategory : category.getSubCategories()) {
// TalendPropertyTabDescriptor subc = new TalendPropertyTabDescriptor(subCategory);
// subc.setElement(elem);
// d.addSubItem(subc);
// }
// }
}
tabFactory.setInput(descriptors);
setPropertiesViewerTitle(elem);
cleaned = false;
tabFactory.setSelection(new IStructuredSelection() {
public Object getFirstElement() {
return null;
}
public Iterator iterator() {
return null;
}
public int size() {
return 0;
}
public Object[] toArray() {
return null;
}
public List toList() {
List<TalendPropertyTabDescriptor> d = new ArrayList<TalendPropertyTabDescriptor>();
if (descriptors.size() > 0) {
if (currentSelectedTab != null) {
for (TalendPropertyTabDescriptor ds : descriptors) {
if (ds.getCategory() == currentSelectedTab.getCategory()) {
d.add(ds);
return d;
}
}
}
d.add(descriptors.get(0));
}
return d;
}
public boolean isEmpty() {
return false;
}
});
}
public void selectTab(final EComponentCategory category) {
if (tabFactory.getSelection().getCategory().equals(category)) {
return;
}
List<TalendPropertyTabDescriptor> allTabs = tabFactory.getInput();
final List<TalendPropertyTabDescriptor> selection = new ArrayList<TalendPropertyTabDescriptor>();
for (TalendPropertyTabDescriptor talendPropertyTabDescriptor : allTabs) {
if (talendPropertyTabDescriptor.getCategory().equals(category)) {
selection.add(talendPropertyTabDescriptor);
}
}
tabFactory.setSelection(new StructuredSelection() {
public List toList() {
return selection;
}
});
}
public void updatePropertiesViewerTitle() {
if (this.element != null) {
setPropertiesViewerTitle(this.element);
}
}
/**
* yzhang Comment method "setPropertiesViewerTitle".
*
* @param elem
*/
private void setPropertiesViewerTitle(Element elem) {
String label = null;
Image image = null;
if (elem instanceof Node) {
label = ((Node) elem).getLabel();
String uniqueName = ((Node) elem).getUniqueName();
if (!label.equals(uniqueName)) {
label = label + "(" + uniqueName + ")"; //$NON-NLS-1$ //$NON-NLS-2$
}
image = CoreImageProvider.getComponentIcon(((Node) elem).getComponent(), ICON_SIZE.ICON_24);
} else if (elem instanceof Connection) {
label = ((Connection) elem).getElementName();
image = ImageProvider.getImage(EImage.RIGHT_ICON);
} else if (elem instanceof Note) {
label = Messages.getString("ComponentSettingsView.note"); //$NON-NLS-1$
image = ImageProvider.getImage(EImage.PASTE_ICON);
} else if (elem instanceof SubjobContainer) {
label = Messages.getString("ComponentSettingsView.subjob"); //$NON-NLS-1$
image = ImageProvider.getImage(EImage.PASTE_ICON);
}
tabFactory.setTitle(label, image);
super.setTitleToolTip(label);
}
/**
* yzhang Comment method "getCategories".
*
* @param elem
* @return
*/
private EComponentCategory[] getCategories(Element elem) {
if (elem instanceof Connection) {
EComponentCategory[] categories = EElementType.CONNECTION.getCategories();
if (PluginChecker.isTeamEdition()) {
Object propertyValue = elem.getPropertyValue(Connection.LINESTYLE_PROP);
if (propertyValue instanceof EConnectionType
&& ((EConnectionType) propertyValue).hasConnectionCategory(IConnectionCategory.FLOW)) {
// if (((Connection) elem).checkTraceShowEnable()) {
final List<EComponentCategory> list = new ArrayList<EComponentCategory>(Arrays.asList(categories));
list.add(EComponentCategory.BREAKPOINT);
return list.toArray(new EComponentCategory[0]);
// }
} else if (propertyValue.equals(EConnectionType.ON_COMPONENT_OK)
|| propertyValue.equals(EConnectionType.ON_COMPONENT_ERROR)
|| propertyValue.equals(EConnectionType.RUN_IF) || propertyValue.equals(EConnectionType.ON_SUBJOB_OK)
|| propertyValue.equals(EConnectionType.ON_SUBJOB_ERROR)
|| propertyValue.equals(EConnectionType.ROUTE_WHEN) || propertyValue.equals(EConnectionType.ROUTE_CATCH)) {
int length = categories.length;
EComponentCategory[] newCategories;
// rusuming checkBox only for ON_SUBJOB_OK , modified by nma, order 8663
if (propertyValue.equals(EConnectionType.ON_SUBJOB_OK)) {
newCategories = new EComponentCategory[length + 1];
for (int i = 0; i < length; i++) {
newCategories[i] = categories[i];
}
EComponentCategory resuming = EComponentCategory.RESUMING;
newCategories[length] = resuming;
} else {
newCategories = new EComponentCategory[length];
for (int i = 0; i < length; i++) {
newCategories[i] = categories[i];
}
}
return newCategories;
}
}
return categories;
} else if (elem instanceof Node) {
// if (isAdvancedType(elem)) {
if (((Node) elem).isELTComponent()) {
if (!((Node) elem).getComponent().getName().endsWith("Output") //$NON-NLS-1$
&& !((Node) elem).getComponent().getName().endsWith("Input") //$NON-NLS-1$
&& !((Node) elem).getComponent().getName().endsWith("Map") //$NON-NLS-1$
&& !((Node) elem).getComponent().getName().endsWith("TableList") //$NON-NLS-1$
&& !((Node) elem).getComponent().getName().endsWith("ColumnList")) { //$NON-NLS-1$
return EElementType.ELT_NODE.getCategories();
}
}
EComponentCategory[] categories = EElementType.ADVANCED_NODE.getCategories();
if (PluginChecker.isValidationrulesPluginLoaded() && isSupportValidationRuleNode((Node) elem)) { // show
EComponentCategory[] newCategories = new EComponentCategory[categories.length + 1];
System.arraycopy(categories, 0, newCategories, 0, categories.length);
newCategories[categories.length] = EComponentCategory.VALIDATION_RULES;
return newCategories;
}
return categories;
} else if (elem instanceof Note) {
return EElementType.NOTE.getCategories();
} else if (elem instanceof SubjobContainer) {
return EElementType.SUBJOB.getCategories();
}
return null;
}
/**
* DOC ycbai Comment method "isSupportValidationRuleNode".
*
* @param node
* @return
*/
private boolean isSupportValidationRuleNode(Node node) {
boolean hasFlow = false;
if (node.getComponent() != null && node.getComponent() instanceof EmfComponent) {
EmfComponent component = (EmfComponent) node.getComponent();
if (component.useLookup() || component.useMerge() || !component.useSchema()) {
return false;
}
if (component.useFlow()) {
hasFlow = true;
}
}
return hasFlow;
}
public Element getElement() {
return element;
}
/**
* yzhang Comment method "isAdvancedType".
*
* @param elem
* @return
*/
private boolean isAdvancedType(Element elem) {
for (IElementParameter param : elem.getElementParameters()) {
if (param.getCategory().equals(EComponentCategory.ADVANCED)) {
return true;
}
}
return false;
}
/**
* Getter for dc.
*
* @return the dc
*/
public Composite getDc() {
return (Composite) this.dc;
}
// /**
// * Getter for elementMap.
// *
// * @return the elementMap
// */
// public Map<String, Element> getElementMap() {
// return this.elementMap;
// }
}