/******************************************************************************* * Copyright (c) 2004, 2005 IBM Corporation and others. 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: IBM Corporation - Initial API and * implementation Jens Lukowski/Innoopract - initial renaming/restructuring *******************************************************************************/ package org.eclipse.wst.common.ui.internal.viewers; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDeltaVisitor; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.jface.resource.ImageDescriptor; 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.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; 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.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.eclipse.ui.wizards.datatransfer.FileSystemImportWizard; import org.eclipse.wst.common.ui.internal.Messages; import org.eclipse.wst.common.ui.internal.UIPlugin; import java.util.Collection; import java.util.Iterator; import java.util.Vector; public class SelectSingleFileView { protected Composite composite; protected IStructuredSelection selection; protected boolean isFileMandatory; protected TreeViewer sourceFileViewer; protected Button importButton; protected Vector fFilters; protected IFile selectedFile; protected ISelection defaultSelection; protected Listener listener; public static interface Listener { public void setControlComplete(boolean isComplete); } public SelectSingleFileView(IStructuredSelection selection, boolean isFileMandatory) { this.selection = selection; this.isFileMandatory = isFileMandatory; this.selectedFile = null; this.defaultSelection = null; } public Composite createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(new GridLayout()); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); Composite smallComposite = new Composite(composite, SWT.NONE); smallComposite.setLayoutData(new GridData(GridData.FILL, GridData.HORIZONTAL_ALIGN_FILL, true, false)); GridLayout gridLayout = new GridLayout(2, false); gridLayout.marginHeight = 0; smallComposite.setLayout(gridLayout); Label label = new Label(smallComposite, SWT.NONE); label.setText(Messages._UI_LABEL_SOURCE_FILES); label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING, GridData.END, false, false)); //Collapse and Expand all buttons ToolBar toolBar = new ToolBar(smallComposite, SWT.FLAT); toolBar.setLayoutData(new GridData(GridData.END, GridData.END, true, false)); ToolItem toolItem = new ToolItem(toolBar, SWT.NONE); ImageDescriptor imageDescriptor = UIPlugin.getDefault().getImageDescriptor( "icons/expandAll.gif"); Image image = imageDescriptor.createImage(); toolItem.setImage(image); toolItem.setToolTipText(Messages._UI_POPUP_EXPAND_ALL); toolItem.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { sourceFileViewer.expandAll(); } }); toolItem = new ToolItem(toolBar, SWT.NONE); imageDescriptor = UIPlugin.getDefault().getImageDescriptor("icons/collapseAll.gif"); image = imageDescriptor.createImage(); toolItem.setImage(image); toolItem.setToolTipText(Messages._UI_POPUP_COLLAPSE_ALL); toolItem.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { sourceFileViewer.collapseAll(); } }); createSourceViewer(composite); createFilterControl(composite); createImportButton(composite); sourceFileViewer.getTree().setFocus(); return composite; } protected void createFilterControl(Composite composite) { } public void setListener(Listener listener) { this.listener = listener; } protected void createSourceViewer(Composite parent) { sourceFileViewer = new TreeViewer(new Tree(parent, SWT.SINGLE | SWT.BORDER)); sourceFileViewer.setContentProvider(new WorkbenchContentProvider()); sourceFileViewer.setLabelProvider(new WorkbenchLabelProvider()); sourceFileViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { boolean isComplete = true; java.util.List list; ISelection selection = event.getSelection(); if (selection instanceof IStructuredSelection) { list = ((IStructuredSelection) selection).toList(); for (Iterator i = list.iterator(); i.hasNext();) { IResource resource = (IResource) i.next(); if (resource instanceof IFile) { selectedFile = (IFile) resource; if (isFileMandatory) { isComplete = true; break; } } else { selectedFile = null; if (isFileMandatory) { isComplete = false; } } } if (listener != null) { listener.setControlComplete(isComplete); } } } }); Control treeWidget = sourceFileViewer.getTree(); GridData gd = new GridData(GridData.FILL_BOTH); treeWidget.setLayoutData(gd); } protected void createImportButton(Composite parent) { importButton = new Button(parent, SWT.NONE); importButton.setText(Messages._UI_IMPORT_BUTTON); GridData gridData = new GridData(); gridData.horizontalAlignment = GridData.CENTER; importButton.setLayoutData(gridData); importButton.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { // This listener is if the Import Wizard adds a new few, we want // it to be selected when we come back from it ImportAddResourceListener importAddResourceListener = new ImportAddResourceListener(); ResourcesPlugin.getWorkspace().addResourceChangeListener(importAddResourceListener); FileSystemImportWizard importWizard = new FileSystemImportWizard(); IWorkbench workbench = UIPlugin.getDefault().getWorkbench(); selection = (IStructuredSelection) sourceFileViewer.getSelection(); importWizard.init(workbench, selection != null ? selection : new StructuredSelection()); Shell shell = Display.getCurrent().getActiveShell(); WizardDialog wizardDialog = new WizardDialog(shell, importWizard); wizardDialog.create(); wizardDialog.open(); sourceFileViewer.refresh(); ResourcesPlugin.getWorkspace().removeResourceChangeListener(importAddResourceListener); IFile importedFile = importAddResourceListener.getImportedFile(); if (importedFile != null) { StructuredSelection structuredSelection = new StructuredSelection(importedFile); sourceFileViewer.setSelection(structuredSelection); } } }); importButton.setToolTipText(Messages._UI_IMPORT_BUTTON_TOOL_TIP); } public IFile getFile() { return selectedFile; } public void setDefaultSelection(ISelection selection) { this.defaultSelection = selection; } public void resetFilters() { fFilters = null; } public void addFilter(ViewerFilter filter) { if (fFilters == null) { fFilters = new Vector(); } fFilters.add(filter); } // This is a convenience method that allows filtering of the given file // exensions. It internally creates a ResourceFilter so that users of this // class don't have to construct one. // If the extensions provided don't have '.', one will be added. public void addFilterExtensions(String[] filterExtensions) { // First add the '.' to the filterExtensions if they don't already have one String[] correctedFilterExtensions = new String[filterExtensions.length]; for (int i = 0; i < filterExtensions.length; i++) { // If the extension doesn't start with a '.', then add one. if (filterExtensions[i].startsWith(".")) { correctedFilterExtensions[i] = filterExtensions[i]; } else { correctedFilterExtensions[i] = "." + filterExtensions[i]; } } ViewerFilter filter = new ResourceFilter(correctedFilterExtensions, null); addFilter(filter); } // This is a convenience method that allows filtering of the given file // exensions. It internally creates a ResourceFilter so that users of this // class don't have to construct one. // If the extensions provided don't have '.', one will be added. public void addFilterExtensions(String[] filterExtensions, IFile[] excludedFiles) { // First add the '.' to the filterExtensions if they don't already have one String[] correctedFilterExtensions = new String[filterExtensions.length]; for (int i = 0; i < filterExtensions.length; i++) { // If the extension doesn't start with a '.', then add one. if (filterExtensions[i].startsWith(".")) { correctedFilterExtensions[i] = filterExtensions[i]; } else { correctedFilterExtensions[i] = "." + filterExtensions[i]; } } ViewerFilter filter; if (excludedFiles != null) { filter = new ResourceFilter(correctedFilterExtensions, excludedFiles, null); } else { filter = new ResourceFilter(correctedFilterExtensions, null); } addFilter(filter); } // This is a convenience method that allows filtering of the given file // exensions. It internally creates a ResourceFilter so that users of this // class don't have to construct one. // If the extensions provided don't have '.', one will be added. public void setFilterExtensions(String[] filterExtensions) { // First add the '.' to the filterExtensions if they don't already have one String[] correctedFilterExtensions = new String[filterExtensions.length]; for (int i = 0; i < filterExtensions.length; i++) { // If the extension doesn't start with a '.', then add one. if (filterExtensions[i].startsWith(".")) { correctedFilterExtensions[i] = filterExtensions[i]; } else { correctedFilterExtensions[i] = "." + filterExtensions[i]; } } ViewerFilter filter = new ResourceFilter(correctedFilterExtensions, null); fFilters = new Vector(); fFilters.add(filter); if (sourceFileViewer != null) { sourceFileViewer.getTree().setRedraw(false); sourceFileViewer.resetFilters(); for (Iterator i = fFilters.iterator(); i.hasNext();) { sourceFileViewer.addFilter((ViewerFilter) i.next()); } sourceFileViewer.getTree().setRedraw(true); sourceFileViewer.getTree().redraw(); } } // this method should be called by a Wizard page or Dialog when it becomes visible public void setVisibleHelper(boolean visible) { if (visible == true) { if (fFilters != null) { sourceFileViewer.resetFilters(); for (Iterator i = fFilters.iterator(); i.hasNext();) sourceFileViewer.addFilter((ViewerFilter) i.next()); } sourceFileViewer.setInput(ResourcesPlugin.getWorkspace().getRoot()); sourceFileViewer.expandToLevel(1); if (defaultSelection != null) { sourceFileViewer.setSelection(defaultSelection, true); } else if (!sourceFileViewer.getSelection().isEmpty()) { sourceFileViewer.setSelection(sourceFileViewer.getSelection()); } else { if (isFileMandatory && listener != null) { listener.setControlComplete(false); } } } } class ImportAddResourceListener implements IResourceChangeListener, IResourceDeltaVisitor { Vector importedFiles; ImportAddResourceListener() { importedFiles = new Vector(); } public void resourceChanged(IResourceChangeEvent event) { IResourceDelta resourceDelta = event.getDelta(); try { if (resourceDelta != null) { resourceDelta.accept(this); } } catch (Exception e) { //TODO... log exception //UIPlugin.getMsgLogger().write("Exception caught during resource change" + e); //UIPlugin.getMsgLogger().writeCurrentThread(); } } public boolean visit(IResourceDelta delta) { if (delta.getKind() == IResourceDelta.ADDED) { if (delta.getResource() instanceof IFile) importedFiles.add(delta.getResource()); } return true; } public Collection getImportedFiles() { return importedFiles; } // This returns the first imported file in the list of imported files public IFile getImportedFile() { if (importedFiles.isEmpty() == false) return (IFile) importedFiles.firstElement(); return null; } } public void addSelectionChangedTreeListener(ISelectionChangedListener treeListener) { sourceFileViewer.addSelectionChangedListener(treeListener); } }