// ============================================================================ // // 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.repository.ui.dialog; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.ArrayUtils; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.viewers.CheckboxTreeViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.window.IShellProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.internal.wizards.datatransfer.DataTransferMessages; import org.talend.commons.ui.swt.advanced.composite.FilteredCheckboxTree; import org.talend.core.model.repository.ERepositoryObjectType; import org.talend.repository.i18n.Messages; import org.talend.repository.model.IRepositoryNode.ENodeType; import org.talend.repository.model.RepositoryNode; import org.talend.repository.viewer.ui.provider.RepositoryViewerProvider; /** * DOC yhch class global comment. Detailled comment <br/> * * $Id: talend.epf 1 2006-09-29 17:06:40 +0000 (星期五, 29 九月 2006) nrousseau $ * */ public class UseDynamicJobSelectionDialog extends Dialog { private FilteredCheckboxTree filteredCheckboxTree; List<RepositoryNode> repositoryNodes = new ArrayList<RepositoryNode>(); // ERepositoryObjectType type; String repositoryType; public UseDynamicJobSelectionDialog(IShellProvider parentShell) { super(parentShell); } public UseDynamicJobSelectionDialog(Shell parentShell, ERepositoryObjectType type, String repositoryType, boolean isSelectUseDynamic) { super(parentShell); setShellStyle(SWT.SHELL_TRIM | SWT.APPLICATION_MODAL | getDefaultOrientation()); // this.type = type; /* * avoid select self repository node for Process Type. * * borrow the repositoryType to set the current process id here. */ this.repositoryType = repositoryType; } /** * Configures the shell * * @param shell the shell */ @Override protected void configureShell(Shell shell) { super.configureShell(shell); shell.setText(Messages.getString("UseDynamicJobSelectionDialog.selectJobShellText")); } private CheckboxTreeViewer getItemsTreeViewer() { return filteredCheckboxTree.getViewer(); } /* * (non-Javadoc) * * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) */ @Override protected Control createDialogArea(Composite parent) { Composite container = (Composite) super.createDialogArea(parent); GridLayoutFactory.swtDefaults().numColumns(2).applyTo(container); GridDataFactory.swtDefaults().align(SWT.FILL, SWT.FILL).grab(true, true).hint(500, 400).applyTo(container); Label label = new Label(container, SWT.NONE); label.setText(Messages.getString("UseDynamicJobSelectionDialog.selectJob")); //$NON-NLS-1$ GridDataFactory.swtDefaults().span(2, 1).applyTo(label); createTreeViewer(container); createSelectionButton(container); CheckboxTreeViewer exportItemsTreeViewer = getItemsTreeViewer(); exportItemsTreeViewer.refresh(); // force loading all nodes exportItemsTreeViewer.expandAll(); exportItemsTreeViewer.collapseAll(); // expand to level of metadata connection exportItemsTreeViewer.expandToLevel(4); setCheckedNodes(); return container; } /* * (non-Javadoc) * * @see org.eclipse.jface.dialogs.Dialog#okPressed() */ @Override protected void okPressed() { RepositoryNode[] repositoryObjects = getCheckNodes(); repositoryNodes.clear(); for (RepositoryNode repositoryObject : repositoryObjects) { repositoryNodes.add(repositoryObject); } filteredCheckboxTree.dispose(); super.okPressed(); } public List<RepositoryNode> getRepositoryNodes() { return this.repositoryNodes; } public void setRepositoryNodes(List<RepositoryNode> repositoryNodes) { this.repositoryNodes = repositoryNodes; } public RepositoryNode[] getCheckNodes() { CheckboxTreeViewer exportItemsTreeViewer = getItemsTreeViewer(); List<RepositoryNode> ret = new ArrayList<RepositoryNode>(); for (int i = 0; i < exportItemsTreeViewer.getCheckedElements().length; i++) { RepositoryNode node = (RepositoryNode) exportItemsTreeViewer.getCheckedElements()[i]; if (node.getType() == ENodeType.REPOSITORY_ELEMENT) { ret.add(node); } } return (RepositoryNode[]) ret.toArray(new RepositoryNode[0]); } public void setCheckedNodes() { CheckboxTreeViewer exportItemsTreeViewer = getItemsTreeViewer(); if (repositoryNodes != null || repositoryNodes.size() != 0) { exportItemsTreeViewer.setCheckedElements(repositoryNodes.toArray()); } exportItemsTreeViewer.collapseAll(); } private void createTreeViewer(Composite itemComposite) { filteredCheckboxTree = new FilteredCheckboxTree(itemComposite, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI) { @Override protected CheckboxTreeViewer doCreateTreeViewer(Composite parent, int style) { RepositoryViewerProvider provider = new RepositoryViewerProvider() { @Override protected ERepositoryObjectType getCheckingType() { return ERepositoryObjectType.PROCESS; } }; return (CheckboxTreeViewer) provider.createViewer(parent); } @Override protected void refreshCompleted() { getViewer().expandToLevel(3); restoreCheckedElements(); } @Override protected boolean isNodeCollectable(TreeItem item) { Object obj = item.getData(); if (obj instanceof RepositoryNode) { RepositoryNode node = (RepositoryNode) obj; if (node.getObjectType() == ERepositoryObjectType.METADATA_CONNECTIONS) { return true; } } return false; } }; CheckboxTreeViewer exportItemsTreeViewer = getItemsTreeViewer(); exportItemsTreeViewer.addFilter(new ViewerFilter() { @Override public boolean select(Viewer viewer, Object parentElement, Object element) { RepositoryNode node = (RepositoryNode) element; return filterRepositoryNode(node); } }); } public void addCheckStateListener(ICheckStateListener listener) { CheckboxTreeViewer exportItemsTreeViewer = getItemsTreeViewer(); exportItemsTreeViewer.addCheckStateListener(listener); } public void removeCheckStateListener(ICheckStateListener listener) { CheckboxTreeViewer exportItemsTreeViewer = getItemsTreeViewer(); exportItemsTreeViewer.removeCheckStateListener(listener); } private boolean filterRepositoryNode(RepositoryNode node) { if (node == null) { return false; } if (node.isBin()) { return false; } ERepositoryObjectType contentType = node.getContentType(); if (contentType != null) { if (contentType == ERepositoryObjectType.PROCESS) { String id = node.getId(); if (repositoryType != null && !repositoryType.equals("") && id != null && !id.equals("")) { if (id.equals(repositoryType)) { return false; } } return true; } else if (contentType == ERepositoryObjectType.SVN_ROOT) { return true; } else if (contentType == ERepositoryObjectType.REFERENCED_PROJECTS) { return true; } else { return false; } } else { if (node.getType() == ENodeType.REPOSITORY_ELEMENT) { return true; } } return false; } /** * DOC hcw Comment method "createSelectionButton". * * @param itemComposite */ private void createSelectionButton(Composite itemComposite) { Composite buttonComposite = new Composite(itemComposite, SWT.NONE); GridLayoutFactory.swtDefaults().margins(0, 25).applyTo(buttonComposite); GridDataFactory.swtDefaults().align(SWT.FILL, SWT.BEGINNING).applyTo(buttonComposite); Button selectAll = new Button(buttonComposite, SWT.PUSH); selectAll.setText(DataTransferMessages.DataTransfer_selectAll); selectAll.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { CheckboxTreeViewer exportItemsTreeViewer = getItemsTreeViewer(); exportItemsTreeViewer.setAllChecked(true); } }); setButtonLayoutData(selectAll); Button deselectAll = new Button(buttonComposite, SWT.PUSH); deselectAll.setText(DataTransferMessages.DataTransfer_deselectAll); deselectAll.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { CheckboxTreeViewer exportItemsTreeViewer = getItemsTreeViewer(); exportItemsTreeViewer.setAllChecked(false); } }); setButtonLayoutData(deselectAll); Button expandBtn = new Button(buttonComposite, SWT.PUSH); expandBtn.setText(Messages.getString("UseDynamicJobSelectionDialog.expandBtnText")); //$NON-NLS-1$ expandBtn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { CheckboxTreeViewer exportItemsTreeViewer = getItemsTreeViewer(); exportItemsTreeViewer.expandAll(); } }); setButtonLayoutData(expandBtn); Button collapseBtn = new Button(buttonComposite, SWT.PUSH); collapseBtn.setText(Messages.getString("UseDynamicJobSelectionDialog.collapseBtnText")); //$NON-NLS-1$ collapseBtn.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { CheckboxTreeViewer exportItemsTreeViewer = getItemsTreeViewer(); exportItemsTreeViewer.collapseAll(); } }); setButtonLayoutData(collapseBtn); } /** * DOC nrousseau Comment method "dispose". */ public void dispose() { CheckboxTreeViewer exportItemsTreeViewer = getItemsTreeViewer(); exportItemsTreeViewer.setCheckedElements(ArrayUtils.EMPTY_OBJECT_ARRAY); exportItemsTreeViewer = null; repositoryNodes.clear(); repositoryNodes = null; filteredCheckboxTree = null; } }