// ============================================================================
//
// 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.jobsettings;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.viewers.ISelection;
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.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import org.talend.commons.exception.PersistenceException;
import org.talend.commons.ui.runtime.exception.ExceptionHandler;
import org.talend.commons.ui.runtime.image.ECoreImage;
import org.talend.commons.ui.runtime.image.ImageProvider;
import org.talend.core.CorePlugin;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.PluginChecker;
import org.talend.core.model.business.BusinessType;
import org.talend.core.model.process.EComponentCategory;
import org.talend.core.model.process.Element;
import org.talend.core.model.process.IProcess;
import org.talend.core.model.process.IProcess2;
import org.talend.core.model.repository.ERepositoryObjectType;
import org.talend.core.model.repository.EmptyRepositoryObject;
import org.talend.core.model.repository.IRepositoryEditorInput;
import org.talend.core.model.repository.IRepositoryViewObject;
import org.talend.core.model.utils.RepositoryManagerHelper;
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.IHeaderFooterProviderService;
import org.talend.core.ui.ISVNProviderService;
import org.talend.core.ui.branding.IBrandingService;
import org.talend.designer.business.diagram.custom.IDiagramModelService;
import org.talend.designer.core.ICamelDesignerCoreService;
import org.talend.designer.core.i18n.Messages;
import org.talend.designer.core.model.process.AbstractProcessProvider;
import org.talend.designer.core.ui.AbstractMultiPageTalendEditor;
import org.talend.designer.core.ui.editor.AbstractTalendEditor;
import org.talend.designer.core.ui.editor.process.Process;
import org.talend.designer.core.ui.views.jobsettings.tabs.HeaderFooterComposite;
import org.talend.designer.core.ui.views.jobsettings.tabs.MainComposite;
import org.talend.designer.core.ui.views.jobsettings.tabs.ProcessVersionComposite;
import org.talend.designer.core.ui.views.properties.MultipleThreadDynamicComposite;
import org.talend.designer.core.ui.views.statsandlogs.StatsAndLogsComposite;
import org.talend.repository.model.IRepositoryNode.EProperties;
import org.talend.repository.model.RepositoryNode;
import org.talend.repository.ui.views.IJobSettingsView;
import org.talend.repository.ui.views.IRepositoryView;
/**
* DOC ggu class global comment. Detailled comment
*/
public class JobSettingsView extends ViewPart implements IJobSettingsView, ISelectionChangedListener {
/**
*
*/
private static final String SEPARATOR = "->"; //$NON-NLS-1$
public static final String VIEW_NAME_JOBLET = "Joblet"; //$NON-NLS-1$
public static final String MODEL = "Model"; //$NON-NLS-1$
private HorizontalTabFactory tabFactory = null;
private TalendPropertyTabDescriptor currentSelectedTab;
private Element element;
private boolean cleaned;
private boolean selectedPrimary;
private boolean allowVerchange = true;
private Process process;
private Composite parent;
private ISelection selectedModel;
public JobSettingsView() {
tabFactory = new HorizontalTabFactory();
CorePlugin.getDefault().getRepositoryService().addRepositoryTreeViewListener(this);
IBrandingService brandingService = (IBrandingService) GlobalServiceRegister.getDefault().getService(
IBrandingService.class);
allowVerchange = brandingService.getBrandingConfiguration().isAllowChengeVersion();
}
public static String getViewNameLable() {
return Messages.getString("JobSettingsView.JobSettings"); //$NON-NLS-1$
}
@Override
public void createPartControl(Composite parent) {
// tabFactory = new HorizontalTabFactory();
this.parent = parent;
tabFactory.initComposite(parent, false);
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) {
if ((!currentSelectedTab.getData().equals(descriptor.getData())
|| currentSelectedTab.getData() != 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) {
Object data = descriptor.getData();
if (data instanceof Element) {
element = (Element) data;
currentSelectedTab = descriptor;
IDynamicProperty propertyComposite = createTabComposite(tabFactory.getTabComposite(), element,
descriptor.getCategory());
} else if (data instanceof IRepositoryViewObject) {
currentSelectedTab = descriptor;
IDynamicProperty propertyComposite = createTabComposite(tabFactory.getTabComposite(), data,
descriptor.getCategory());
} else if (data instanceof IEditorPart) {
currentSelectedTab = descriptor;
IRepositoryViewObject repObj = retrieveBusiness((IEditorPart) data);
if (repObj != null) {
IDynamicProperty propertyComposite = createTabComposite(tabFactory.getTabComposite(), repObj,
descriptor.getCategory());
}
} else {
currentSelectedTab = descriptor;
IDynamicProperty propertyComposite = createTabComposite(tabFactory.getTabComposite(), null,
descriptor.getCategory());
}
selectedPrimary = false;
}
}
});
}
private IRepositoryViewObject retrieveBusiness(IEditorPart businessPart) {
if (CorePlugin.getDefault().getDiagramModelService().isBusinessDiagramEditor(businessPart)) {
IRepositoryViewObject lastVersion = null;
selectedModel = CorePlugin
.getDefault()
.getDiagramModelService()
.getBusinessEditorSelection(
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor());
try {
IRepositoryEditorInput input = CorePlugin.getDefault().getDiagramModelService()
.getBusinessDiagramEditorInput(businessPart);
if (input != null) {
RepositoryNode node = input.getRepositoryNode();
if (node != null) {
lastVersion = node.getObject();
} else {
lastVersion = CorePlugin.getDefault().getProxyRepositoryFactory()
.getLastVersion(input.getItem().getProperty().getId());
}
}
return lastVersion;
} catch (PersistenceException e) {
ExceptionHandler.process(e);
}
}
return null;
}
private IDynamicProperty createTabComposite(Composite parent, Object data, EComponentCategory category) {
final int style = SWT.H_SCROLL | SWT.V_SCROLL | SWT.NO_FOCUS;
IDynamicProperty dynamicComposite = null;
ISVNProviderService service = null;
if (PluginChecker.isSVNProviderPluginLoaded()) {
service = (ISVNProviderService) GlobalServiceRegister.getDefault().getService(ISVNProviderService.class);
}
if (EComponentCategory.EXTRA.equals(category)) {
// achen modify to fix bug 0006241
Process process = getElement();
boolean isJoblet = AbstractProcessProvider.isExtensionProcessForJoblet(process);
if (isJoblet) {
dynamicComposite = new MultipleThreadDynamicComposite(parent, style, category, (Element) data, true);
} else {
dynamicComposite = new ExtraComposite(parent, style, category, (Element) data, true);
}
} else if (EComponentCategory.STATSANDLOGS.equals(category)) {
dynamicComposite = new StatsAndLogsComposite(parent, style, category, (Element) data);
} else if (EComponentCategory.CONTEXT.equals(category)) {
// TODO
// dynamicComposite = new ContextDynamicComposite(parent, style, category, element);
} else if (EComponentCategory.MAIN.equals(category)) {
dynamicComposite = new MainComposite(parent, SWT.NONE, tabFactory.getWidgetFactory(), (IRepositoryViewObject) data);
} else if (EComponentCategory.VERSIONS.equals(category)) {
if (allowVerchange) {
dynamicComposite = new ProcessVersionComposite(parent, SWT.NONE, tabFactory.getWidgetFactory(),
(IRepositoryViewObject) data);
}
} else if (EComponentCategory.HEADERFOOTER.equals(category)) {
if (GlobalServiceRegister.getDefault().isServiceRegistered(IHeaderFooterProviderService.class)) {
IHeaderFooterProviderService headerFooterService = (IHeaderFooterProviderService) GlobalServiceRegister
.getDefault().getService(IHeaderFooterProviderService.class);
if (headerFooterService.isVisible()) {
dynamicComposite = new HeaderFooterComposite(parent, SWT.NONE, tabFactory.getWidgetFactory(),
(IRepositoryViewObject) data);
}
}
} else if (EComponentCategory.SVNHISTORY.equals(category) && service != null) {
dynamicComposite = service.createProcessSVNHistoryComposite(parent, tabFactory.getWidgetFactory(),
(IRepositoryViewObject) data);
} else if (EComponentCategory.APPEARANCE.equals(category)) {
dynamicComposite = (IDynamicProperty) CorePlugin.getDefault().getDiagramModelService()
.getBusinessAppearanceComposite(parent, SWT.NONE, tabFactory.getWidgetFactory(), selectedModel);
} else if (EComponentCategory.RULERS_AND_GRID.equals(category)) {
dynamicComposite = (IDynamicProperty) CorePlugin.getDefault().getDiagramModelService()
.getBusinessRulersAndGridComposite(parent, SWT.NONE, tabFactory.getWidgetFactory(), null);
} else if (EComponentCategory.ASSIGNMENT.equals(category)) {
dynamicComposite = (IDynamicProperty) CorePlugin.getDefault().getDiagramModelService()
.getBusinessAssignmentComposite(parent, SWT.NONE, tabFactory.getWidgetFactory(), selectedModel);
}
if (dynamicComposite != null) {
dynamicComposite.refresh();
}
currentSelectedTab.setPropertyComposite(dynamicComposite);
return dynamicComposite;
}
/**
*
* DOC ggu Comment method "setElement".
*
* @param obj
*/
private void setElement(Object obj, final String title, Image image) {
EComponentCategory[] categories = null;
if (obj != null && obj instanceof Process) {
process = (Process) obj;
if (currentSelectedTab != null && currentSelectedTab.getData().equals(process) && !cleaned) {
return;
}
categories = getCategories(process);
} else if (obj != null && obj instanceof IRepositoryViewObject) {
categories = getCategories(obj);
} else if (obj instanceof IEditorPart) {
if (CorePlugin.getDefault().getDiagramModelService().isBusinessDiagramEditor((IEditorPart) obj)) {
categories = getCategories(obj);
}
} else {
BusinessType type = CorePlugin.getDefault().getDiagramModelService().getBusinessModelType(obj);
if (BusinessType.NOTE.equals(type) || BusinessType.SHAP.equals(type) || BusinessType.CONNECTION.equals(type)) {
categories = getCategories(obj);
} else {
cleanDisplay();
return;
}
}
final List<TalendPropertyTabDescriptor> descriptors = new ArrayList<TalendPropertyTabDescriptor>();
for (EComponentCategory category : categories) {
TalendPropertyTabDescriptor d = new TalendPropertyTabDescriptor(category);
d.setData(obj);
descriptors.add(d);
}
tabFactory.setInput(descriptors);
setPartName(title, image);
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;
}
});
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.ViewPart#setPartName(java.lang.String)
*/
@Override
protected void setPartName(String partName) {
setPartName(partName, null);
}
/**
*
* DOC ggu Comment method "setPartName".
*
* set title
*/
public void setPartName(String typeTitle, Image icon) {
String title = null;
String type = null;
if (typeTitle != null && typeTitle.contains(SEPARATOR)) {
String[] tt = typeTitle.split(SEPARATOR);
type = tt[0];
title = tt[1];
} else {
title = typeTitle;
}
String viewName = getViewNameLable();
if (element instanceof IProcess && AbstractProcessProvider.isExtensionProcessForJoblet((IProcess) element)) {
viewName = VIEW_NAME_JOBLET;
}
if (type != null) {
viewName = type;
}
if (title == null) {
title = ""; //$NON-NLS-1$
}
if (!title.equals("")) { //$NON-NLS-1$
viewName = viewName + "(" + title + ")"; //$NON-NLS-1$ //$NON-NLS-2$
super.setTitleToolTip(title);
}
if (tabFactory != null && icon == null) {
Image image = ImageProvider.getImage(ECoreImage.PROCESS_ICON);
if (this.element != null && this.element instanceof IProcess) {
if (((IProcess2) this.element).disableRunJobView()) { // ?? joblet
image = ImageProvider.getImage(ECoreImage.JOBLET_ICON);
}
}
tabFactory.setTitle(title, image);
} else {
tabFactory.setTitle(title, icon);
}
super.setPartName(viewName);
}
/**
* set the category.
*/
private EComponentCategory[] getCategories(Object obj) {
List<EComponentCategory> category = new ArrayList<EComponentCategory>();
ISVNProviderService service = null;
if (PluginChecker.isSVNProviderPluginLoaded()) {
service = (ISVNProviderService) GlobalServiceRegister.getDefault().getService(ISVNProviderService.class);
}
if (obj instanceof Process) {
Process process = (Process) obj;
boolean route = false;
if (GlobalServiceRegister.getDefault().isServiceRegistered(ICamelDesignerCoreService.class)) {
ICamelDesignerCoreService camelService = (ICamelDesignerCoreService) GlobalServiceRegister.getDefault()
.getService(ICamelDesignerCoreService.class);
if (camelService.isInstanceofCamelRoutes(process.getProperty().getItem())) {
route = true;
}
}
category.add(EComponentCategory.MAIN);
if (!route) {
category.add(EComponentCategory.EXTRA);
}
boolean isJoblet = AbstractProcessProvider.isExtensionProcessForJoblet(process);
if (!isJoblet && !route) {
category.add(EComponentCategory.STATSANDLOGS);
}
if (allowVerchange) {
category.add(EComponentCategory.VERSIONS);
}
if (GlobalServiceRegister.getDefault().isServiceRegistered(IHeaderFooterProviderService.class)) {
IHeaderFooterProviderService headerFooterService = (IHeaderFooterProviderService) GlobalServiceRegister
.getDefault().getService(IHeaderFooterProviderService.class);
if (headerFooterService.isVisible()) {
category.add(EComponentCategory.HEADERFOOTER);
}
}
// if svn remote connection, added by nma
if (service != null && service.isProjectInSvnMode()) {
category.add(EComponentCategory.SVNHISTORY);
}
// category.add(EComponentCategory.CONTEXT);
} else if (obj instanceof IRepositoryViewObject) {
category.add(EComponentCategory.MAIN);
if (allowVerchange) {
category.add(EComponentCategory.VERSIONS);
}
if (service != null
&& service.isProjectInSvnMode()
&& (((IRepositoryViewObject) obj).getRepositoryObjectType() == ERepositoryObjectType.PROCESS || ((IRepositoryViewObject) obj)
.getRepositoryObjectType() == ERepositoryObjectType.JOBLET))
category.add(EComponentCategory.SVNHISTORY);
} else if (obj instanceof IEditorPart) {
if (CorePlugin.getDefault().getDiagramModelService().isBusinessDiagramEditor((IEditorPart) obj)) {
category.add(EComponentCategory.MAIN);
category.add(EComponentCategory.APPEARANCE);
category.add(EComponentCategory.RULERS_AND_GRID);
if (allowVerchange) {
category.add(EComponentCategory.VERSIONS);
}
}
} else {
BusinessType type = CorePlugin.getDefault().getDiagramModelService().getBusinessModelType(obj);
if (BusinessType.SHAP.equals(type) || BusinessType.CONNECTION.equals(type)) {
category.add(EComponentCategory.APPEARANCE);
category.add(EComponentCategory.ASSIGNMENT);
} else if (BusinessType.NOTE.equals(type)) {
category.add(EComponentCategory.APPEARANCE);
}
}
return category.toArray(new EComponentCategory[0]);
}
public Process getElement() {
return (Process) element;
}
public boolean isCleaned() {
return this.cleaned;
}
public void cleanDisplay() {
setPartName(null);
tabFactory.setInput(null);
tabFactory.setTitle(null, null);
if (tabFactory.getTabComposite() != null) {
for (Control curControl : tabFactory.getTabComposite().getChildren()) {
curControl.dispose();
}
}
this.currentSelectedTab = null;
this.element = null;
this.cleaned = true;
this.selectedPrimary = true;
process = null;
}
public void refresh() {
refresh(false, null);
}
public void refresh(boolean force, Object obj) {
if (force) {
cleanDisplay();
}
final IEditorPart activeEditor = getSite().getPage().getActiveEditor();
if (obj == null) {
if (activeEditor != null && activeEditor instanceof AbstractMultiPageTalendEditor) {
AbstractTalendEditor talendEditor = ((AbstractMultiPageTalendEditor) activeEditor).getTalendEditor();
IProcess process = talendEditor.getProcess();
if (process != null && process instanceof Element) {
this.selectedPrimary = true;
this.cleaned = force;
this.element = (Element) process;
// remove "Job" or "Joblet" from title
String title = activeEditor.getTitle();
if (title.startsWith(VIEW_NAME_JOBLET)) {
title = title.substring(VIEW_NAME_JOBLET.length() + 1);
} else if (title.startsWith(getViewNameLable())) {
title = title.substring(getViewNameLable().length() + 1);
}
setElement(element, title, null);
return;
}
} else {
IDiagramModelService diagramModelService = CorePlugin.getDefault().getDiagramModelService();
if (diagramModelService != null && diagramModelService.isBusinessDiagramEditor(activeEditor)) {
this.selectedPrimary = true;
this.cleaned = force;
IRepositoryViewObject object = retrieveBusiness(activeEditor);
if (object != null) {
String title = object.getLabel() + " " + object.getVersion(); //$NON-NLS-1$
Object type = object.getRepositoryObjectType();
setElement(activeEditor, type + SEPARATOR + title, null);
}
return;
}
}
} else {
this.selectedPrimary = true;
this.cleaned = force;
IRepositoryViewObject object = retrieveBusiness(activeEditor);
if (object != null) {
String title = object.getLabel() + " " + object.getVersion(); //$NON-NLS-1$
Object type = object.getRepositoryObjectType();
setElement(obj, type + SEPARATOR + title, null);
}
return;
}
cleanDisplay();
}
@Override
public void setFocus() {
this.parent.setFocus();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.WorkbenchPart#dispose()
*/
@Override
public void dispose() {
super.dispose();
CorePlugin.getDefault().getRepositoryService().removeRepositoryTreeViewListener(this);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent
* )
*/
public void selectionChanged(SelectionChangedEvent event) {
ISelection selection = event.getSelection();
if (selection instanceof StructuredSelection) {
Object input = ((IStructuredSelection) selection).getFirstElement();
if (!(input instanceof RepositoryNode)) {
if (input instanceof IAdaptable) {
// see ProcessPart.getAdapter()
IAdaptable adaptable = (IAdaptable) input;
input = adaptable.getAdapter(RepositoryNode.class);
}
}
if (input instanceof RepositoryNode) {
RepositoryNode repositoryNode = (RepositoryNode) input;
Object obj = repositoryNode.getProperties(EProperties.CONTENT_TYPE);
String type = null;
if (obj != null) {
type = obj.toString();
if (obj instanceof ERepositoryObjectType) {
ERepositoryObjectType objType = (ERepositoryObjectType) obj;
if (objType == ERepositoryObjectType.PROCESS) {
type = getViewNameLable();
} else if (objType == ERepositoryObjectType.JOBLET) {
type = VIEW_NAME_JOBLET;
}
}
} else {
return;
}
IRepositoryViewObject repositoryObject = repositoryNode.getObject();
if (repositoryObject == null) {
repositoryObject = new EmptyRepositoryObject();
return;
}
String title = repositoryObject.getLabel(); //$NON-NLS-1$
if (allowVerchange) {
title = repositoryObject.getLabel() + " " + repositoryObject.getVersion(); //$NON-NLS-1$
}
setElement(repositoryObject, type + SEPARATOR + title, ImageProvider.getImage(repositoryNode.getIcon()));
}
}
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.ui.views.properties.IJobSettingsView#getSelection()
*/
public ISelection getSelection() {
ISVNProviderService service = null;
if (PluginChecker.isSVNProviderPluginLoaded()) {
service = (ISVNProviderService) GlobalServiceRegister.getDefault().getService(ISVNProviderService.class);
}
IDynamicProperty dc = currentSelectedTab.getPropertyComposite();
if (dc instanceof ProcessVersionComposite) {
return ((ProcessVersionComposite) dc).getSelection();
} else if (service != null && service.isSVNHistoryComposite(dc)) {
return service.getSVNHistorySelection(dc);
} else if (CorePlugin.getDefault().getDiagramModelService().isInstanceOfBusinessAssignmentComposite(dc)) {
IRepositoryView repositoryView = RepositoryManagerHelper.findRepositoryView();
if (repositoryView != null) {
return repositoryView.getViewer().getSelection();
}
}
return null;
}
/*
* (non-Javadoc)
*
* @see org.talend.designer.core.ui.views.properties.IJobSettingsView#refreshCurrentViewTab()
*/
public void refreshCurrentViewTab() {
if (currentSelectedTab == null) {
return;
}
IDynamicProperty dc = currentSelectedTab.getPropertyComposite();
if (dc != null) {
dc.refresh();
}
}
public void setISelection(ISelection selection) {
this.selectedModel = selection;
}
}