// ============================================================================ // // 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.routine; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; import org.talend.commons.exception.PersistenceException; import org.talend.commons.ui.runtime.exception.ExceptionHandler; import org.talend.commons.ui.runtime.image.EImage; import org.talend.commons.ui.runtime.image.ImageProvider; import org.talend.core.CorePlugin; import org.talend.core.model.general.Project; import org.talend.core.model.properties.Property; import org.talend.core.model.properties.RoutineItem; import org.talend.core.model.repository.ERepositoryObjectType; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.core.model.routines.RoutinesUtil; import org.talend.designer.core.i18n.Messages; import org.talend.designer.core.model.utils.emf.talendfile.ProcessType; import org.talend.designer.core.model.utils.emf.talendfile.RoutinesParameterType; import org.talend.repository.ProjectManager; /** * ggu class global comment. Detailled comment */ public class SetupProcessDependenciesRoutinesDialog extends Dialog { private boolean readonly; private final List<RoutineItemRecord> userRoutines = new ArrayList<RoutineItemRecord>(); private final List<RoutineItemRecord> systemRoutines = new ArrayList<RoutineItemRecord>(); private CTabFolder folder; private CTabItem userTabItem, systemTabItem; private Button addBtn, delBtn, upBtn, downBtn; private ListViewer userViewer, systemViewer; private final Map<Project, List<Property>> allRoutineItems = new HashMap<Project, List<Property>>(); public SetupProcessDependenciesRoutinesDialog(Shell parentShell, ProcessType process, boolean readonly) { super(parentShell); setShellStyle(getShellStyle() | SWT.MAX | SWT.RESIZE | SWT.APPLICATION_MODAL); this.readonly = readonly; init(process); } @SuppressWarnings("unchecked") private void init(ProcessType process) { allRoutineItems.clear(); ProjectManager projectManager = ProjectManager.getInstance(); Project currentProject = projectManager.getCurrentProject(); initModels(currentProject); initRefProjects(currentProject); List<RoutinesParameterType> routinesDependencies = (List<RoutinesParameterType>) process.getParameters() .getRoutinesParameter(); for (RoutinesParameterType type : routinesDependencies) { RoutineItemRecord record = new RoutineItemRecord(); record.setName(type.getName()); Property property = findObject(type.getId(), type.getName()); if (property != null) { record.setId(property.getId()); // if system, id is not used record.setLabel(property.getLabel()); } else { record.setHasProblem(true); record.setLabel(type.getName()); // use the record } if (!record.hasProblem()) { // if lost, willn't display if (((RoutineItem) property.getItem()).isBuiltIn()) { systemRoutines.add(record); } else { userRoutines.add(record); } } } } private void initRefProjects(Project currentProject) { for (Project p : ProjectManager.getInstance().getReferencedProjects(currentProject)) { initModels(p); initRefProjects(p); } } private void initModels(Project project) { try { List<IRepositoryViewObject> allRoutineItemObjects = CorePlugin.getDefault().getRepositoryService() .getProxyRepositoryFactory().getAll(project, ERepositoryObjectType.ROUTINES, RoutinesUtil.allowDeletedRoutine()); for (IRepositoryViewObject obj : allRoutineItemObjects) { Property property = obj.getProperty(); if (project.equals(ProjectManager.getInstance().getCurrentProject())) { addItems(project, property); } else { // don't add system routines in ref-project if (property.getItem() instanceof RoutineItem && !((RoutineItem) property.getItem()).isBuiltIn()) { addItems(project, property); } } } } catch (PersistenceException e) { ExceptionHandler.process(e); } } private void addItems(Project project, Property property) { List<Property> list = allRoutineItems.get(project); if (list == null) { list = new ArrayList<Property>(); allRoutineItems.put(project, list); } list.add(property); } private Property findObject(String idOrName, String name) { for (Project p : allRoutineItems.keySet()) { List<Property> list = allRoutineItems.get(p); if (list != null) { for (Property property : list) { String objIdOrName = property.getId(); String objName = property.getLabel(); // objIdOrName = property.getLabel(); if (objIdOrName.equals(idOrName) && property.getItem() instanceof RoutineItem) { return property; } else if (name.equals(objName) && property.getItem() instanceof RoutineItem) { return property; } } } } return null; } @Override protected void configureShell(Shell shell) { super.configureShell(shell); shell.setText(Messages.getString("SetupProcessDependenciesRoutinesAction.title")); //$NON-NLS-1$ } protected Control createContents(Composite parent) { Control contents = super.createContents(parent); updateButtons(); return contents; } @Override protected Control createDialogArea(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(new GridLayout(2, false)); GridData layoutData = new GridData(GridData.FILL_BOTH); layoutData.heightHint = 200; layoutData.widthHint = 350; composite.setLayoutData(layoutData); applyDialogFont(composite); createTabFolderField(composite); createButtonField(composite); return composite; } private void createTabFolderField(Composite parent) { // tab folder = new CTabFolder(parent, SWT.NONE); folder.setLayoutData(new GridData(GridData.FILL_BOTH)); folder.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { updateButtons(); } }); userTabItem = new CTabItem(folder, SWT.NONE); userTabItem.setText(Messages.getString("SetupProcessDependenciesRoutinesDialog.userRoutineLabel")); //$NON-NLS-1$ systemTabItem = new CTabItem(folder, SWT.NONE); systemTabItem.setText(Messages.getString("SetupProcessDependenciesRoutinesDialog.systemRoutineLabel")); //$NON-NLS-1$ folder.setSelection(userTabItem); folder.setSimple(false); ISelectionChangedListener listListener = new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { updateButtons(); } }; // user Composite userComposite = new Composite(folder, SWT.NONE); userComposite.setLayout(new GridLayout()); userComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); userViewer = new ListViewer(userComposite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); userViewer.setLabelProvider(new RoutineRecordLabelProvider()); userViewer.setContentProvider(ArrayContentProvider.getInstance()); userViewer.setInput(userRoutines); userViewer.getList().setLayoutData(new GridData(GridData.FILL_BOTH)); userViewer.addSelectionChangedListener(listListener); userTabItem.setControl(userComposite); // system Composite systemComposite = new Composite(folder, SWT.NONE); systemComposite.setLayout(new GridLayout()); systemComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); systemViewer = new ListViewer(systemComposite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); systemViewer.setLabelProvider(new RoutineRecordLabelProvider()); systemViewer.setContentProvider(ArrayContentProvider.getInstance()); systemViewer.setInput(systemRoutines); systemViewer.getList().setLayoutData(new GridData(GridData.FILL_BOTH)); systemViewer.addSelectionChangedListener(listListener); systemTabItem.setControl(systemComposite); } private void createButtonField(Composite parent) { Composite btnComposite = new Composite(parent, SWT.NONE); btnComposite.setLayout(new GridLayout()); GridData layoutData = new GridData(GridData.FILL_VERTICAL); layoutData.verticalAlignment = SWT.CENTER; btnComposite.setLayoutData(layoutData); addBtn = new Button(btnComposite, SWT.PUSH); addBtn.setImage(ImageProvider.getImage(EImage.ADD_ICON)); addBtn.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { ListViewer currentViewer = getCurrentViewer(); if (currentViewer == null) { return; } boolean system = (currentViewer == systemViewer); List<RoutineItemRecord> currentRecords = getCurrentRecords(); ShowRoutineItemsDialog dialog = new ShowRoutineItemsDialog(getShell(), allRoutineItems, currentRecords, system); if (dialog.open() == Window.OK) { Property[] selectedItems = dialog.getSelectedItems(); List<Property> needAddedItems = new ArrayList<Property>(); // filter for (Property p : selectedItems) { boolean found = false; for (RoutineItemRecord record : currentRecords) { if (system) { found = p.getLabel().equals(record.getLabel()); } else { found = p.getId().equals(record.getId()); } } if (!found) { needAddedItems.add(p); } } // create for (Property p : needAddedItems) { RoutineItemRecord newOne = new RoutineItemRecord(); newOne.setId(p.getId()); newOne.setLabel(p.getLabel()); newOne.setName(p.getLabel()); newOne.setVersion(p.getVersion()); currentRecords.add(newOne); } // currentViewer.setInput(currentRecords); currentViewer.refresh(); updateButtons(); } } }); delBtn = new Button(btnComposite, SWT.PUSH); delBtn.setImage(ImageProvider.getImage(EImage.DELETE_ICON)); delBtn.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { ListViewer currentViewer = getCurrentViewer(); List<RoutineItemRecord> currentRecords = getCurrentRecords(); if (currentViewer != null && !((IStructuredSelection) currentViewer.getSelection()).isEmpty()) { Iterator iterator = ((IStructuredSelection) currentViewer.getSelection()).iterator(); int index = 0; while (iterator.hasNext()) { Object selectedRecord = iterator.next(); if (currentRecords != null && selectedRecord != null) { index = currentRecords.indexOf(selectedRecord); currentRecords.remove(selectedRecord); if (index > currentRecords.size() - 1) { index = currentRecords.size() - 1; } else if (index < 0) { index = 0; } } } currentViewer.setInput(currentRecords); currentViewer.getList().select(index); currentViewer.refresh(); } updateButtons(); } }); upBtn = new Button(btnComposite, SWT.PUSH); upBtn.setImage(ImageProvider.getImage(EImage.UP_ICON)); upBtn.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { moveDatas(true); } }); downBtn = new Button(btnComposite, SWT.PUSH); downBtn.setImage(ImageProvider.getImage(EImage.DOWN_ICON)); downBtn.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { moveDatas(false); } }); } private void moveDatas(boolean up) { ListViewer viewer = getCurrentViewer(); List<RoutineItemRecord> records = getCurrentRecords(); if (viewer != null && records != null && records.size() > 1) { int selectionIndex = viewer.getList().getSelectionIndex(); final int size = records.size(); if (selectionIndex > -1 && selectionIndex < size) { int newIndex = selectionIndex; RoutineItemRecord movedRecord = records.remove(selectionIndex); if (movedRecord != null) { if (up) { if (selectionIndex == 0) { newIndex = size - 1; } else { newIndex = selectionIndex - 1; } } else { if (selectionIndex == size - 1) { newIndex = 0; } else { newIndex = selectionIndex + 1; } } records.add(newIndex, movedRecord); viewer.setInput(records); viewer.refresh(); viewer.getList().setSelection(newIndex); } } } updateButtons(); } private void updateButtons() { updateButtons(getCurrentViewer()); } private ListViewer getCurrentViewer() { if (folder.getSelection() == userTabItem) { return userViewer; } else if (folder.getSelection() == systemTabItem) { return systemViewer; } return null; } private List<RoutineItemRecord> getCurrentRecords() { if (folder.getSelection() == userTabItem) { return userRoutines; } else if (folder.getSelection() == systemTabItem) { return systemRoutines; } return null; } private RoutineItemRecord getCurrentSelectedRecord() { ListViewer currentViewer = getCurrentViewer(); if (currentViewer != null) { Object firstElement = ((IStructuredSelection) currentViewer.getSelection()).getFirstElement(); if (firstElement != null && firstElement instanceof RoutineItemRecord) { return (RoutineItemRecord) firstElement; } } return null; } private void updateButtons(ListViewer viewer) { addBtn.setEnabled(false); delBtn.setEnabled(false); upBtn.setEnabled(false); downBtn.setEnabled(false); if (viewer != null && !readonly) { addBtn.setEnabled(true); if (!((IStructuredSelection) viewer.getSelection()).isEmpty()) { delBtn.setEnabled(true); // more than one in list, and only one select if (viewer.getList().getItemCount() > 1 && ((IStructuredSelection) viewer.getSelection()).size() == 1) { upBtn.setEnabled(true); downBtn.setEnabled(true); } } } if (readonly) { Button button = getButton(IDialogConstants.OK_ID); if (button != null && !button.isDisposed()) { button.setEnabled(false); } } } public List<RoutineItemRecord> getUserRoutines() { return this.userRoutines; } public List<RoutineItemRecord> getSystemRoutines() { return this.systemRoutines; } @Override protected void okPressed() { super.okPressed(); } }