/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.ui.dialog; import java.text.MessageFormat; import java.util.*; import java.util.List; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.*; import org.jboss.tools.common.model.ui.ModelUIPlugin; import org.jboss.tools.common.model.ui.wizards.one.ServiceDialogImpl; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.widgets.*; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import org.eclipse.ui.dialogs.ISelectionStatusValidator; import org.eclipse.ui.model.*; import org.eclipse.ui.views.navigator.ResourceSorter; import org.jboss.tools.common.meta.action.SpecialWizard; public class SelectEclipseFileWizard implements SpecialWizard { Properties p; public void setObject(Object object) { p = (Properties)object; } public int execute() { String[] extensions = getExtensions(p.getProperty("extension")); //$NON-NLS-1$ FSDialog d = new FSDialog( ServiceDialogImpl.getShell(), (IResource)p.get("root"), //$NON-NLS-1$ new ArrayList(), "Select File", p.getProperty("message"), //$NON-NLS-1$ extensions, getFilterName(extensions), p.getProperty("selection")); //$NON-NLS-1$ if(d.open() != FSDialog.OK) return 1; Object result = d.getFirstResult(); if(result != null) p.put("result", result); //$NON-NLS-1$ return 0; } String[] getExtensions(String extension) { if(extension == null || extension.length() == 0 || extension.equals("*")) return null; //$NON-NLS-1$ StringTokenizer st = new StringTokenizer(extension, ",;"); //$NON-NLS-1$ String[] r = new String[st.countTokens()]; for (int i = 0; i < r.length; i++) { r[i] = st.nextToken().trim(); } return r; } String getFilterName(String[] extensions) { if(extensions == null) return null; StringBuffer sb = new StringBuffer(); for (int i = 0; i < extensions.length; i++) { if(sb.length() > 0) sb.append(", "); //$NON-NLS-1$ sb.append("*.").append(extensions[i]); //$NON-NLS-1$ } return MessageFormat.format("Show only {0} files", sb.toString()); } } class FSDialog extends ElementTreeSelectionDialog { private String m; private String seed; FileFilter z; boolean everything = true; public FSDialog(Shell parent, IResource root, List files, String title, String message, String[] extensions, String mess, String seed) { super(parent, new WorkbenchLabelProvider(), new WorkbenchContentProvider()); this.seed = seed; setTitle(title); setMessage(message); z = new FileFilter(files, extensions); m = mess; everything = true; setInput(root != null ? root : ResourcesPlugin.getWorkspace().getRoot()); setSorter(new ResourceSorter(ResourceSorter.NAME)); setValidator(createValidator()); } private ISelectionStatusValidator createValidator() { return new ISelectionStatusValidator() { public IStatus validate(Object[] os) { if (os.length == 0) { return new Status(IStatus.ERROR, "org.jboss.tools.common.model.ui", 0, "", null); //$NON-NLS-1$ //$NON-NLS-2$ } for (int i = 0; i < os.length; i++) { if (os[i] instanceof IFile) continue; return new Status(IStatus.ERROR, "org.jboss.tools.common.model.ui", 0, "", null); //$NON-NLS-1$ //$NON-NLS-2$ } return new Status(IStatus.OK, "org.jboss.tools.common.model.ui", 0, "", null); //$NON-NLS-1$ //$NON-NLS-2$ } }; } protected Control createDialogArea(Composite parent) { Composite result = (Composite)super.createDialogArea(parent); if(m != null) { Button b = createButton(parent, result); setSeed(); z.considerExtension(everything); getTreeViewer().addFilter(z); if (!everything) b.setSelection(true); b.addSelectionListener(createListener(b)); } applyDialogFont(result); return result; } private Button createButton(Composite parent, Composite p2) { Button b = new Button(p2, SWT.CHECK); b.setText(m); b.setFont(parent.getFont()); return b; } private void setSeed() { if (seed == null) return; IPath path = Path.fromPortableString(seed); IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(path); setInitialSelection(resource); } private SelectionListener createListener(final Button b) { return new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { everything = !b.getSelection(); z.considerExtension(!everything); getTreeViewer().refresh(); } }; } } class FileFilter extends ViewerFilter { private List fFilter; private Set<IResource> fFiles; private Set<String> fExtensions = new HashSet<String>(); private boolean fConsiderExtension = true; public FileFilter(List objects, String[] extensions) { fFilter = objects; if(extensions == null || extensions.length == 0) { fConsiderExtension = false; fExtensions = null; } else { for (int i = 0; i < extensions.length; i++) fExtensions.add(extensions[i]); } } public boolean select(Viewer viewer, Object parentElement, Object element) { return fFiles.contains(element) && !fFilter.contains(element); } private void init() { BusyIndicator.showWhile(Display.getDefault(), new Runnable() { public void run() { fFiles = new HashSet<IResource>(); collect(ResourcesPlugin.getWorkspace().getRoot(), fFiles); } }); } private boolean collect(IContainer container, Set<IResource> set) { if(container == null || !container.isAccessible()) return false; boolean added = false; try { IResource[] resources = container.members(); for (int i = 0; i < resources.length; i++) { IResource resource = resources[i]; if (resource instanceof IFile) { IFile file = (IFile) resource; if (checkFile(file)) { set.add(file); added = true; } } else if (resource instanceof IContainer) { if (collect((IContainer) resource, set)) { set.add(resource); added = true; } } } } catch (CoreException e) { ModelUIPlugin.getPluginLog().logError(e); } return added; } private boolean checkFile(IFile file) { String ext = file.getFileExtension(); if(!fConsiderExtension || fExtensions == null || ext == null) return false; return (fExtensions.contains(ext)); } public void considerExtension(boolean considerExtension) { fConsiderExtension= considerExtension; init(); } }