/****************************************************************************** * Copyright (C) 2013 Fabio Zadrozny * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Fabio Zadrozny <fabiofz@gmail.com> - initial API and implementation ******************************************************************************/ package org.python.pydev.ui.dialogs; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.dialogs.CheckedTreeSelectionDialog; import org.python.pydev.shared_core.structure.TreeNode; import org.python.pydev.shared_core.structure.TreeNodeContentProvider; import org.python.pydev.shared_ui.EditorUtils; import org.python.pydev.shared_ui.dialogs.SelectElementDialog; @SuppressWarnings("rawtypes") public class SelectNDialog { public static String[] selectMulti(List<String> items, LabelProvider labelProvider, String message) { return SelectElementDialog.selectMulti(items, labelProvider, message); } /** * @param labelProvider: usually a TreeNodeLabelProvider * @param title: message in shell * @param message: message above tree * @param checkElapsedBeforeClose: if true we'll only accept a click after some secs (to prevent an accidental click * in the case of an unrequested dialog). */ public static List<TreeNode> selectElements(TreeNode root, ILabelProvider labelProvider, String title, String message, final boolean checkElapsedBeforeClose, List initialSelection) { Shell shell = EditorUtils.getShell(); CheckedTreeSelectionDialog dialog = new CheckedTreeSelectionDialog(shell, labelProvider, new TreeNodeContentProvider()) { private final DialogButtonEnablementHelper helper = new DialogButtonEnablementHelper( !checkElapsedBeforeClose); @Override public boolean close() { if (!helper.areButtonsEnabled()) { return false; } return super.close(); } @Override protected void cancelPressed() { if (!helper.areButtonsEnabled()) { return; } super.cancelPressed(); } @Override protected void okPressed() { if (!helper.areButtonsEnabled()) { return; } super.okPressed(); } @Override protected void constrainShellSize() { helper.onConstrainShellSize(); super.constrainShellSize(); } @Override protected Button createButton(Composite parent, int id, String label, boolean defaultButton) { Button button = super.createButton(parent, id, label, defaultButton); helper.onCreateButton(button, id); return button; } @Override protected void createButtonsForButtonBar(Composite parent) { // create OK and Cancel buttons by default createButton(parent, IDialogConstants.OK_ID, "Apply selected changes (Ignore unselected)", true); createButton(parent, IDialogConstants.CANCEL_ID, "Don't ask again (Ignore all)", false); } }; dialog.setTitle(title); dialog.setMessage(message); dialog.setInput(root); dialog.setInitialElementSelections(initialSelection); dialog.setExpandedElements(initialSelection.toArray()); if (dialog.open() == CheckedTreeSelectionDialog.OK) { Object[] result = dialog.getResult(); if (result != null) { ArrayList<TreeNode> ret = new ArrayList<TreeNode>(result.length); for (Object o : result) { ret.add((TreeNode) o); } return ret; } } return null; } }