/** * Copyright (c) 2005-2008 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 - Initial API and implementation */ package org.eclipse.emf.common.ui.dialogs; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; 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.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import org.eclipse.ui.dialogs.ISelectionStatusValidator; import org.eclipse.ui.dialogs.NewFolderDialog; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.eclipse.ui.views.navigator.ResourceComparator; import org.eclipse.emf.common.ui.CommonUIPlugin; /** * @since 2.2.0 */ public class WorkspaceResourceDialog extends ElementTreeSelectionDialog implements ISelectionStatusValidator { public static IContainer[] openFolderSelection( Shell parent, String title, String message, boolean allowMultipleSelection, Object[] initialSelection, List<ViewerFilter> viewerFilters) { WorkspaceResourceDialog dialog = new WorkspaceResourceDialog(parent, new WorkbenchLabelProvider(), new WorkbenchContentProvider()); dialog.setAllowMultiple(allowMultipleSelection); dialog.setTitle(title != null ? title : CommonUIPlugin.INSTANCE.getString("_UI_FolderSelection_title")); dialog.setMessage(message); dialog.setShowNewFolderControl(true); dialog.addFilter(dialog.createDefaultViewerFilter(false)); if (viewerFilters != null) { for (ViewerFilter viewerFilter : viewerFilters) { dialog.addFilter(viewerFilter); } } if (initialSelection != null) { dialog.setInitialSelections(initialSelection); } dialog.loadContents(); return dialog.open() == Window.OK ? dialog.getSelectedContainers() : new IContainer [0]; } public static IFile[] openFileSelection( Shell parent, String title, String message, boolean allowMultipleSelection, Object[] initialSelection, List<ViewerFilter> viewerFilters) { WorkspaceResourceDialog dialog = new WorkspaceResourceDialog(parent, new WorkbenchLabelProvider(), new WorkbenchContentProvider()); dialog.setAllowMultiple(allowMultipleSelection); dialog.setTitle(title != null ? title : CommonUIPlugin.INSTANCE.getString("_UI_FileSelection_title")); dialog.setMessage(message); dialog.addFilter(dialog.createDefaultViewerFilter(true)); if (viewerFilters != null) { for (ViewerFilter viewerFilter : viewerFilters) { dialog.addFilter(viewerFilter); } } if (initialSelection != null) { dialog.setInitialSelections(initialSelection); } dialog.loadContents(); return dialog.open() == Window.OK ? dialog.getSelectedFiles() : new IFile [0]; } public static IFile openNewFile( Shell parent, String title, String message, IPath suggestedPath, List<ViewerFilter> viewerFilters) { WorkspaceResourceDialog dialog = new WorkspaceResourceDialog(parent, new WorkbenchLabelProvider(), new WorkbenchContentProvider()); dialog.setAllowMultiple(false); dialog.setTitle(title != null ? title : CommonUIPlugin.INSTANCE.getString("_UI_NewFile_title")); dialog.setMessage(message); dialog.setShowNewFolderControl(true); dialog.setShowFileControl(true); dialog.addFilter(dialog.createDefaultViewerFilter(false)); if (viewerFilters != null) { for (ViewerFilter viewerFilter : viewerFilters) { dialog.addFilter(viewerFilter); } } if (suggestedPath != null) { IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IResource resource = root.findMember(suggestedPath); if (resource != null && resource.isAccessible()) { if (resource instanceof IContainer) { dialog.setInitialSelection(resource); } else { dialog.setInitialSelection(resource.getParent()); dialog.setFileText(resource.getName()); } } else { if (suggestedPath.segmentCount() > 1) { if (resource == null) { resource = root.getFile(suggestedPath); } if (resource.getProject().isAccessible()) { IContainer container = resource.getParent(); for (; !container.isAccessible() && container != resource.getProject(); container = container.getParent()) { // Do nothing } dialog.setInitialSelection(container); suggestedPath = suggestedPath.removeFirstSegments(container.getFullPath().segmentCount()); dialog.setFileText(suggestedPath.toString()); suggestedPath = null; } } if (suggestedPath != null) { String fileText = suggestedPath.isAbsolute() ? suggestedPath.removeFirstSegments(1).toString() : suggestedPath.toString(); dialog.setFileText(fileText); } } } dialog.loadContents(); return dialog.open() == Window.OK ? dialog.getFile() : null; } protected boolean showNewFolderControl = false; protected boolean showFileControl = false; protected boolean showFiles = true; protected Button newFolderButton; protected Text fileText; protected String fileTextContent = ""; protected IContainer selectedContainer; public WorkspaceResourceDialog(Shell parent, ILabelProvider labelProvider, ITreeContentProvider contentProvider) { super(parent, labelProvider, contentProvider); setComparator(new ResourceComparator(ResourceComparator.NAME)); setValidator(this); } public void loadContents() { IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); setInput(root); } public ViewerFilter createDefaultViewerFilter(boolean showFiles) { this.showFiles = showFiles; return new ViewerFilter() { @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (element instanceof IResource) { IResource workspaceResource = (IResource)element; return workspaceResource.isAccessible() && (WorkspaceResourceDialog.this.showFiles || workspaceResource.getType() != IResource.FILE); } return false; } }; } @Override protected Control createDialogArea(Composite parent) { Composite composite = (Composite)super.createDialogArea(parent); if (isShowNewFolderControl()) { createNewFolderControl(composite); } if (isShowFileControl()) { createFileControl(composite); } applyDialogFont(composite); return composite; } protected void createNewFolderControl(Composite parent) { newFolderButton = new Button(parent, SWT.PUSH); newFolderButton.setText(CommonUIPlugin.INSTANCE.getString("_UI_NewFolder_label")); newFolderButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { newFolderButtonPressed(); } }); newFolderButton.setFont(parent.getFont()); updateNewFolderButtonState(); } protected void updateNewFolderButtonState() { IStructuredSelection selection = (IStructuredSelection)getTreeViewer().getSelection(); selectedContainer = null; if (selection.size() == 1) { Object first = selection.getFirstElement(); if (first instanceof IContainer) { selectedContainer = (IContainer)first; } } newFolderButton.setEnabled(selectedContainer != null); } protected void newFolderButtonPressed() { NewFolderDialog dialog = new NewFolderDialog(getShell(), selectedContainer); if (dialog.open() == Window.OK) { TreeViewer treeViewer = getTreeViewer(); treeViewer.refresh(selectedContainer); Object createdFolder = dialog.getResult()[0]; treeViewer.reveal(createdFolder); treeViewer.setSelection(new StructuredSelection(createdFolder)); } } protected void createFileControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); { GridLayout layout = new GridLayout(2, false); layout.marginLeft = -5; layout.marginRight = -5; layout.marginTop = -5; layout.marginBottom = -5; composite.setLayout(layout); } Label fileLabel = new Label(composite, SWT.NONE); fileLabel.setText(CommonUIPlugin.INSTANCE.getString("_UI_FileName_label")); fileText = new Text(composite, SWT.BORDER); fileText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); fileText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { fileTextModified(fileText.getText()); } }); if (fileTextContent != null) { fileText.setText(fileTextContent); } } protected void fileTextModified(String text) { fileTextContent = text; } public IStatus validate(Object[] selectedElements) { if (isShowNewFolderControl()) { updateNewFolderButtonState(); } boolean enableOK = false; for (int i = 0; i < selectedElements.length; i++) { if (selectedElements[i] instanceof IContainer) { enableOK = !showFiles || (isShowFileControl() && fileText.getText().trim().length() > 0); } else if (selectedElements[i] instanceof IFile) { if (isShowFileControl()) { fileText.setText(((IFile)selectedElements[i]).getName()); } enableOK = true; } if (enableOK) break; } return enableOK ? new Status(IStatus.OK, "org.eclipse.emf.common.ui", 0, "", null) : new Status(IStatus.ERROR, "org.eclipse.emf.common.ui", 0, "", null); } public IContainer[] getSelectedContainers() { List<IContainer> containers = new ArrayList<IContainer>(); Object[] result = getResult(); for (int i = 0; i < result.length; i++) { if (result[i] instanceof IContainer) { containers.add((IContainer)result[i]); } } return containers.toArray(new IContainer [containers.size()]); } public IFile[] getSelectedFiles() { List<IFile> files = new ArrayList<IFile>(); Object[] result = getResult(); for (int i = 0; i < result.length; i++) { if (result[i] instanceof IFile) { files.add((IFile)result[i]); } } return files.toArray(new IFile[files.size()]); } public IFile getFile() { String file = getFileText(); if (file.length() != 0) { Object[] result = getResult(); if (result.length == 1) { if (result[0] instanceof IFile) { return (IFile)result[0]; } else if (result[0] instanceof IContainer) { IContainer container = (IContainer)result[0]; return container.getFile(new Path(file)); } } } return null; } public void setFileText(String text) { if (text == null) { text = ""; } if (fileText != null && !fileText.isDisposed()) { fileText.setText(text); } else { fileTextContent = text; } } public String getFileText() { return fileText != null && !fileText.isDisposed() ? fileText.getText() : fileTextContent; } public boolean isShowNewFolderControl() { return showNewFolderControl; } public void setShowNewFolderControl(boolean showNewFolderControl) { this.showNewFolderControl = showNewFolderControl; } public boolean isShowFileControl() { return showFileControl; } public void setShowFileControl(boolean showFileControl) { this.showFileControl = showFileControl; } }